2010-02-17 19 views

Odpowiedz

6

Nie, niestety, nie ma prostego sposobu, aby to zrobić :-(Próbowałem to zrobić i uruchomić, ale w końcu to, co zrobiłem, to w zasadzie przekazanie wszystkich etykiet, które chcę wyświetlać raport z aplikacji wywołującej (aplikacja ASP.NET, w moim przypadku):

Innym podejściem może być przechowywanie fragmentów tekstu w tabeli programu SQL Server i dodawanie źródła danych do raportu, który pobiera te etykiety tekstowe, a następnie powiązać je z odpowiednimi formantami.Próbowałem coś takiego, ale nie były w stanie sprawić, że działa dla mnie.

To jest ból, że ASP.NET jest tak dobrze internacjonalizowane z zasobów, ale SSRS jest nadal dość niechlujny af uczciwe, gdy próbujemy uświadomić je w wielu językach :-(

3

Możesz odsłonić globalny parametr (User! Language), który odzwierciedla język użytkownika.

Następnie można użyć google translateapi do konwersji słów w języku angielskim na swój język.

Oto doskonały artykuł: http://mscrm4u.blogspot.com/2008/06/multi-lingual-ssrs-reports.html

+0

naprawdę nie wiem, czy chcę wołać do zautomatyzowanej usługi Google dla każdej pojedynczej etykiecie mój raport ..... –

+0

@marc_s nie musisz, to jest przykład. Jeśli skorzystasz z nvarchar i sproc, możesz pobrać informacje o kolumnach dla nagłówków w dowolnym języku. – JonH

2

udało mi się dostać wielojęzyczne wsparcie, za pośrednictwem plików .NET zasobu, stosując ciekawą siekać. Istnieje nieużywana właściwość dla każdego pojedynczego elementu sterującego raportem o nazwie ValueLocId. Korzystając z tej właściwości, można określić nazwę zasobu, która ma być używana dla każdego elementu sterującego. Pomysł polega na tym, że przeglądasz definicję raportu, szukając formantów, które mają ustawioną właściwość ValueLocID. Jeśli właściwość jest ustawiona, zastąp tekst tej formantu tekstem zasobu podanym w identyfikatorze ValueLocID. Więc w zasadzie, idea jest taka:

  1. Załaduj plik RDLC w pamięci, jako plik XML
  2. Traverse pliku XML przy użyciu XPath, szukając właściwości ValueLocID
  3. Wymień innerText tego węzła XML z Zasób określony w ValueLocID
  4. Załaduj formant ReportViewer, używając kopii pamięci pliku RDLC.

Zobacz poniższą funkcję, która zrobi dokładnie to, o czym wspomniałem powyżej.

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

nie działa dla plików .RDL na serwerze, jednak (i ​​właśnie z tym pracuję) –

+0

Tak, to prawda. To rozwiązanie działa tylko z raportami hostowanymi lokalnie. – jgallant

3

Powinieneś spróbować poniższy link, to wydaje się najlepszym sposobem to zrobić.

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

Trzeba będzie stworzyć zespół ze swoich zasobów i metod, aby uzyskać ciągi w oparciu o kulturę. Można znaleźć pełną samouczek tutaj:

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

Możesz dodać zespół niestandardowy, który zawiera zasoby dla ciągów, które chcesz przetłumaczyć, a dostęp do nich w swoim raporcie.

0

Zgadzam się z Igoy na ten temat, po tym, jak ostatnio przejrzałem kroki wymienione w codeproject, ale chciałbym dodać, że kroki, które należy wykonać przy dodawaniu nowej CodeGroup, są trochę niejasne, jeśli umieścisz nową CodeGroup w dowolnym miejscu ale po nienazwanej UnioncodeGroup (to ta z Url = "$ CodeGen $/*") twoje próby uzyskania dostępu do twojego niestandardowego zestawu zakończą się niepowodzeniem.

Po wielu kopaniu udało mi się znaleźć potwierdzenie tego na jednej ze stron msdn (patrz sekcja "Umieszczenie elementów CodeGroup Elements for Extensions"). Ich sformułowanie było "zalecane", ale z moich testów powiedziałbym, że jest to wymagane, przynajmniej podczas testowania bezpośrednio na serwerze raportów: http://msdn.microsoft.com/en-us/library/ms152828.aspx

Ścieżka dla tej lokalizacji w plikach .config jest jako taka (użyteczne w wix) // PolicyLevel/CodeGroup/CodeGroup [[] + klasa = [] 'FirstMatchCodeGroup']/CodeGroup [[] + PermissionSetName = 'ReportLocalization' []]

+0

Nie widzę, jak moja odpowiedź brzmi "nie jest użyteczna". Po kilku przykładach społeczności, jak uzyskać lokalizację SSRS, musiałem poświęcić dodatkowe trzy dni na znalezienie użytecznych informacji, które tu udostępniłem. Czy mogą ci wyjaśnić głosujący w dół? Możesz mi pomóc stać się lepszym współtwórcą SO :) – idclaar

0

przechodząc dsTranslations SQL zestawu danych sposobem (nie lubię bawić się w XML)

Umożliwia to prosty interfejs, dzięki któremu klienci mogą wypełniać tłumaczenia, na przykład szybkie Lightswitch GUI

enter image description here

Stosując ten zestaw danych robię prosty odnośnika do przetłumaczenia

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

Ta druga metoda jest jeden ja osobiście wykorzystania w przypadku, gdy klucz nie jest w dbTranslations pokazuje klucz wat, który muszą dodać do bazy danych. Prawdopodobnie mógłbym zrobić tę drugą część bardziej elegancko, opinie są bardzo mile widziane.

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

Prosty sposób, aby wielojęzyczny SSRS raport trudno kodu lub z użyciem sharedataset. jednak będziemy musieli zmierzyć się z problemem wydajności renderowania, jeśli używamy zestawu danych akcji.

Oto skuteczne podejście do tłumaczenia etykiet w raporcie z lepszej wydajności (zwłaszcza na wydajność renderowania)

Krok 1: Wdrożenie bibliotekę do obsługi coraz słownika raportów, poniższy przykład dla odniesienia, to powinno być zmodyfikowane powrotu prawidłowych słownika korzystał

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 
 

 
     } 
 
    } 
 
}

Etap 2: Kompilacja biblioteki i skopiować go do katalogu Bin reportserver od Usługa raportowania

Na przykład skopiować bibliotekę do katalogu C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.R2 \ Reporting Services \ ReportServer \ bin

Krok 3: Modyfikowanie rssrvpolicy.config plik w reportserver folder (np .: C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.R2 \ Reporting Services \ rssrvpolicy.config), znaleźć "$ Codegen $" i dodaj następujący kod do niech SSRS znać lokalizację nowej biblioteki

<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>

Krok 4: Stop i Start Reporting Serwis W Menedżer konfiguracji raportowania usługi

Krok 5: Zastosuj bibliotekę do raportu SSRS Utwórz nowy raport lub zmodyfikuj nowy raport, ten raport powinien zawierać parametr languageid Zestaw odniesień do biblioteki dla tego raportu prawym przyciskiem myszy na raporcie, wybierz Właściwości Zgłoś Kliknij na odniesieniach karcie Wklej odniesienia biblioteki w „Dodaj lub usuń zespoły” obszarze:

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

enter image description here

Kroku 6: Dodawanie niestandardowego kodu do obsługi tłumaczenie wzór etykiety

public Shared Dim ListLabel as String() 

funkcji GetListLabel (ID_języka As Integer) ListLabel = CmsReportLibrary.DictionaryLabel.GetDictionary (!) Parametry LanguageId.Value koniec funkcja funkcja translate (wejście As String) As String

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 

Krok 7: Dodaj nową zmienną raport enter image description here

wyrażenie na ListLabel zmienna

=Code.GetListLabel(Parameters!LanguageId.Value) 

Krok 8: Tłumaczenie etykiet w raporcie

Modyfikacja ekspresji etykiety, należy użyć metody Tłumacz w niestandardowy kod tłumaczyć

na przykład:

=Code.Translate("Client") 

=Code.Translate("Week")