2010-02-17 36 views

Respuesta

6

No, desafortunadamente, no hay una manera fácil de hacer esto :-(He estado tratando de hacer funcionar esto, pero al final lo que hice fue básicamente pasar todas las etiquetas que quiero que se muestren en el informe de la aplicación de llamada (una aplicación ASP.NET, en mi caso).

Otro enfoque podría ser almacenar los fragmentos de texto en una tabla de SQL Server y agregar una fuente de datos a su informe que recupera esas etiquetas de texto, y luego atarlas a los controles apropiados. probé algo por el estilo, pero no han sido capaces de hacer que funcione para mí.

es un dolor que ASP.NET está tan bien internacionalizó con recursos, pero sigue siendo bastante SSRS un sucio justo al tratar de que sea multi-idioma consciente :-(

3

Puede exponer un parámetro global (User! Language) que refleja la lengua del usuario.

Luego puede usar google translateapi para convertir palabras en inglés a su idioma.

Aquí es un excelente artículo: http://mscrm4u.blogspot.com/2008/06/multi-lingual-ssrs-reports.html

+0

realmente no está seguro de si quiero llamar a un servicio de Google automatizado para todos y cada etiqueta única en mi informe ..... –

+0

@marc_s no es necesario, ese es un ejemplo. Si aprovecha nvarchar y una herramienta, también puede recuperar información de columna para los títulos en cualquier idioma. – JonH

2

logré soporte multilenguaje, a través de archivos de recursos .NET, mediante la aplicación de un truco interesante. Hay una propiedad no utilizada para cada control de informe, llamada ValueLocId. Usando esta propiedad, puede especificar el nombre del recurso para usar para cada control. La idea aquí es que recorra su definición de informe, buscando controles que tengan la propiedad ValueLocID establecida. Si la propiedad está configurada, reemplace el texto de ese control con el texto del recurso especificado en el ValueLocID. Así que, básicamente, la idea es la siguiente:

  1. carga el archivo RDLC en la memoria, como un archivo XML
  2. Traverse el archivo XML usando XPath, en busca de propiedades ValueLocID
  3. Sustituir el innerText de ese nodo XML con Recurso especificado en ValueLocID
  4. Cargue el control ReportViewer utilizando la copia de la memoria del archivo RDLC.

Consulte la siguiente función, que hará exactamente lo que mencioné anteriormente.

Private Sub LocalizeReport() 

    Dim xmlDoc As XmlDocument = New XmlDocument 
    Dim asm As Reflection.Assembly = Reflection.Assembly.GetExecutingAssembly() 
    'create in memory, a XML file from a embedded resource 
    Dim xmlStream As Stream = asm.GetManifestResourceStream(ReportViewer1.LocalReport.ReportEmbeddedResource) 

    Try 
     'Load the RDLC file into a XML doc 
     xmlDoc.Load(xmlStream) 
    Catch e As Exception 
     'HANDLE YOUR ERROR HERE 
    End Try 

    'Create an XmlNamespaceManager to resolve the default namespace 
    Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(xmlDoc.NameTable) 
    nsmgr.AddNamespace("nm", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition") 
    nsmgr.AddNamespace("rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner") 

    'IMPORTANT LINE BELOW 
    'YOU WILL NEED TO SET THIS TO YOUR RESOURCE MANAGER, OTHERWISE NOTHING WILL WORK 
    Dim rm As ResourceManager = New ResourceManager("Insurance.Subs.WinUI.Controls.Resources", asm) 

    'Loop through each node in the XML file, that has the ValueLOCId property set. 
    'Using this property as a workaround for localization support. The value specified in this 
    'property will determine what resource to use for translation. 
    Dim node As XmlNode 
    For Each node In xmlDoc.DocumentElement.SelectNodes(String.Format("//nm:{0}[@rd:LocID]", "Value"), nsmgr) 'XPath to LocID 
     Dim nodeValue As String = node.InnerText 
     If (String.IsNullOrEmpty(nodeValue) Or Not nodeValue.StartsWith("=")) Then 
      Try 
       Dim localizedValue As String = node.Attributes("rd:LocID").Value 

       'Get the resource via string 
       localizedValue = rm.GetString(localizedValue) 
       If Not String.IsNullOrEmpty(localizedValue) Then 
        'Set the text value - via the retrieved information from resource file 
        node.InnerText = localizedValue 
       End If 

      Catch ex As Exception 
       'handle error 
      End Try 
     End If 
    Next 

    ReportViewer1.LocalReport.ReportPath = String.Empty 
    ReportViewer1.LocalReport.ReportEmbeddedResource = Nothing 
    'Load the updated RDLC document into LocalReport object. 
    Dim rdlcOutputStream As StringReader = New StringReader(xmlDoc.DocumentElement.OuterXml) 
    Using rdlcOutputStream 
     ReportViewer1.LocalReport.LoadReportDefinition(rdlcOutputStream) 
    End Using 

End Sub 
+1

no funciona para archivos .RDL basados ​​en servidor, sin embargo (y eso es con lo que estoy trabajando) –

+0

Sí, eso es correcto. Esta solución solo funcionará con informes alojados localmente. – jgallant

3

Debe intentar el siguiente enlace, esta parece ser la mejor manera de hacerlo.

http://support.microsoft.com/kb/920769

Usted tendrá que crear un conjunto con sus recursos y métodos para obtener cuerdas en base a la cultura. Usted puede encontrar el tutorial completo aquí:

http://www.codeproject.com/Articles/294636/Localizing-SQL-Server-Reporting-Services-Reports

Puede agregar un ensamblado personalizado que contiene los recursos para sus cadenas quiere traducir, y acceder a ellos en su informe.

0

Estoy de acuerdo con Igoy en esto después de haber ejecutado recientemente los pasos enumerados en el proyecto de código, pero me gustaría añadir que los pasos a seguir cuando agregue el nuevo CodeGroup carecen un poco en que si coloca el nuevo CodeGroup en cualquier lugar pero después del UnioncodeGroup sin nombre (es el que tiene Url = "$ CodeGen $/*") fallarán sus intentos de acceder a su ensamblado personalizado.

Después de buscar mucho, pude encontrar la confirmación de esto en una de las páginas msdn (consulte la sección "Ubicación de los elementos del grupo de códigos para las extensiones"). Su redacción fue que "se recomienda", pero desde mi prueba me diría que es necesario, al menos cuando se prueba directamente en el servidor de informes: http://msdn.microsoft.com/en-us/library/ms152828.aspx

El XPath para esta ubicación en los archivos .config es, como tal, (útil en wix): // PolicyLevel/CodeGroup/CodeGroup [[] @ class = [] 'FirstMatchCodeGroup']/CodeGroup [[] @ PermissionSetName = 'ReportLocalization' []]

+0

No veo cómo mi respuesta es "no útil". Siguiendo varios de los ejemplos de la comunidad sobre cómo localizar SSRS, tuve que pasar tres días extra para encontrar la información útil que he compartido aquí. ¿Podrían los votantes abajo explicar por favor? Podrías ayudarme a ser un mejor colaborador de SO :) – idclaar

0

Going la dsTranslations SQL manera el conjunto de datos (No me gusta meterme en el XML)

Esto le permite hacer una interfaz simple para que sus clientes completen las traducciones, por ejemplo, una rápida Lightswitch GUI

enter image description here

El uso de este conjunto de datos i hacer una búsqueda sencillo traducir

=Lookup("WORDTOBETRANSLATED", Fields!Key.Value, Fields!Value.Value, "dsTranslation") 

Este segundo método es el i personaly uso, en caso de que la clave no es en dbTranslations, muestra la clave wat que deben agregar al db. Probablemente podría hacer esta segunda parte de forma más elegante, los comentarios son bienvenidos.

=Microsoft.VisualBasic.Interaction.iif(Lookup("WORDTOBETRANSLATED", Fields!Key.Value, Fields!Value.Value, "dsTranslation") = "", "WORDTOBETRANSLATED", Lookup("WORDTOBETRANSLATED", Fields!Key.Value, Fields!Value.Value, "dsTranslation")) 
0

La manera más sencilla de hacer un informe de ssrs multilingüe es utilizar un código fijo o usar el conjunto de datos compartido. sin embargo, nos enfrentaremos al problema de rendimiento de representación si utilizamos el conjunto de datos compartido.

Éstos son un enfoque eficiente para traducir las etiquetas en el informe con un mejor rendimiento (especialmente en el Rendimiento de la representación)

Paso 1: Poner en práctica una biblioteca para apoyar conseguir Inglés para informes, el siguiente ejemplo es para referencia, esto debería ser modificado para volver diccionario correcta

using System; 
 
using System.Collections.Generic; 
 
using System.Configuration; 
 
using System.Data.SqlClient; 
 
using System.Linq; 
 
using System.Security.Permissions; 
 
using System.Text; 
 
using System.Data.SqlClient; 
 

 
namespace CmsReportLibrary 
 
{ 
 
    public class DictionaryLabel 
 
    { 
 
     DictionaryLabel() 
 
     { 
 
      
 
     } 
 
     
 
     public static string[] GetDictionary(int languageid) 
 
     { 
 
      System.Data.SqlClient.SqlClientPermission oPerm = new System.Data.SqlClient.SqlClientPermission(PermissionState.Unrestricted); 
 
      oPerm.Assert(); 
 
      SqlConnection oConn = new SqlConnection(); 
 
      oConn.ConnectionString = ConfigurationManager.ConnectionStrings["appconnectionstring"].ConnectionString; 
 

 
      //oConn.ConnectionString = "Data Source=(local);Initial Catalog=Northwind;User Id=<>;Password=<>"; 
 

 
      //oConn.Open(); 
 
      //SqlCommand oCmd = new SqlCommand(); 
 
      //oCmd.Connection = oConn; 
 
      //oCmd.CommandText = ".................."; 
 
      // .................... 
 

 
      //oConn.Close(); \t 
 
      return new string[] {...............}; 
 
\t \t \t //ex return new string[] { "Client||Klient", "Week||Woche", "Year||Jahr"}; \t \t \t 
 

 
     } 
 
    } 
 
}

Paso 2: Compilar la biblioteca y copiarlo a la carpeta Bin de servidor de informes del Servicio de informe

Por ejemplo: copiar la biblioteca en C: \ Server \ MSRS10_50.R2 \ Servicios de Información Archivos de programa \ Microsoft SQL \ ReportServer \ bin

Paso 3: Modificar archivo rssrvpolicy.config en ReportServer carpeta (por ejemplo: C: \ Archivos de programa \ Microsoft SQL Server \ MSRS10_50.R2 \ Reporting Services \ rssrvpolicy.config), encontrar el "$ CodeGen $" y añada el siguiente código para permitir que los SSRS conocen la ubicación de la nueva biblioteca

<CodeGroup 
 
     class="UnionCodeGroup" 
 
     version="1" 
 
     PermissionSetName="FullTrust" 
 
     Name="CoDeMagSample" 
 
     Description="CoDe Magazine Sample. "> 
 
     <IMembershipCondition 
 
      class="UrlMembershipCondition" 
 
      version="1" 
 
      Url="C:\Program Files\Microsoft SQL Server\MSRS10_50.R2\Reporting Services\ReportServer\bin\CmsReportLibrary.dll" 
 
    /> 
 
</CodeGroup>

Paso 4: Stop and Start Reporting Service En Administrador de configuración del servicio de informes

Paso 5: Aplicar la biblioteca en el Informe SSRS Crear un nuevo informe o modificar un nuevo informe, este informe debe tener un parámetro de idioma Establecer las referencias a la biblioteca para este informe por clic derecho en el informe, seleccione Propiedades del informe Haga clic en la pestaña Referencias Pegar las referencias de biblioteca en "Añadir o quitar asambleas" zona:

CmsReportLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 

enter image description here

Paso 6: Añadir un código personalizado para apoyar la traducción de etiquetas

public Shared Dim ListLabel as String() 

función GetListLabel (LanguageID como entero) ListLabel = CmsReportLibrary.DictionaryLabel.GetDictionary (!) Parámetros LanguageId.Value final Función Traducir (entrada como secuencia) como cadena

dim i as Integer 


For i=0 to UBound(ListLabel,1) 
    if Instr(ListLabel(i), input) > 0 then 
     Translate = Replace(ListLabel(i), input + "||","")  
     exit function 
    end if 

Next 

'Not found, return any string you want 
Translate = "not found" 
end function 

Paso 7: Añadir nueva variable de informe enter image description here

expresión para la ListLabel variables

=Code.GetListLabel(Parameters!LanguageId.Value) 

Paso 8: Traducir las etiquetas en el informe

modificar la expresión de etiqueta, utilice el método Traducir en código personalizado para traducir

Por ejemplo:

=Code.Translate("Client") 

=Code.Translate("Week")