Czy istnieje sposób wyświetlania/eksportu angielskiego raportu SSRS w niektórych innych językach?Wielojęzyczność w SSRS
Odpowiedz
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 :-(
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
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:
- Załaduj plik RDLC w pamięci, jako plik XML
- Traverse pliku XML przy użyciu XPath, szukając właściwości ValueLocID
- Wymień innerText tego węzła XML z Zasób określony w ValueLocID
- 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
nie działa dla plików .RDL na serwerze, jednak (i właśnie z tym pracuję) –
Tak, to prawda. To rozwiązanie działa tylko z raportami hostowanymi lokalnie. – jgallant
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.
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' []]
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
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
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"))
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
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
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")
naprawdę nie wiem, czy chcę wołać do zautomatyzowanej usługi Google dla każdej pojedynczej etykiecie mój raport ..... –
@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