2010-02-17 4 views

ответ

6

Нет, к сожалению, нет простого способа сделать это :-(Я пытался это сделать и работать сам, но в конце концов, что я сделал, в основном передал все ярлыки, которые я хочу отобразить на отчет от вызывающего приложения (приложение ASP.NET в моем случае).

Другим подходом может быть сохранение текстовых фрагментов в таблице SQL Server и добавление источника данных в ваш отчет, который извлекает эти текстовые метки, а затем привязать их к соответствующим элементам управления. Я пробовал что-то вроде этого, но не смог заставить его работать для себя.

Очень больно, что ASP.NET настолько интернационализирован ресурсами, но SSRS по-прежнему довольно грязный аф справедливо, когда вы пытаетесь сделать это на нескольких языках :-(

3

Вы можете открыть глобальный параметр (Пользователь! Язык), который отражает пользовательский язык.

Затем вы можете использовать google translateapi для преобразования слов на английском языке на ваш язык.

Вот отличная статья: http://mscrm4u.blogspot.com/2008/06/multi-lingual-ssrs-reports.html

+0

действительно не уверен, если я хочу, чтобы вызвать к автоматизированной службы Google для каждого и каждой метки на мой отчет ..... –

+0

@marc_s вам не обязательно, это пример. Если вы используете nvarchar и sproc, вы можете получить информацию о столбцах для заголовков на любом языке. – JonH

2

мне удалось получить многоязычную поддержку, с помощью файлов ресурсов .NET, применяя интересный хак. Существует неиспользуемое свойство для каждого отдельного элемента управления отчетами, называемого ValueLocId. Используя это свойство, вы можете указать имя ресурса для каждого элемента управления. Идея здесь в том, что вы будете перебирать определение своего отчета, ища элементы управления, которые имеют свойство ValueLocID. Если свойство установлено, замените текст этого элемента текстом ресурсов, указанным в ValueLocID. Таким образом, в принципе, идея заключается в следующем:

  1. Загрузите файл RDLC в памяти, как файл XML
  2. Траверс файла XML с помощью XPath, ищет свойства ValueLocID
  3. Заменить InnerText этого XML-узла с ресурс, указанный в ValueLocID
  4. Загрузите элемент управления ReportViewer с помощью копии памяти файла RDLC.

См. Нижеприведенную функцию, которая будет точно соответствовать указанным выше.

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

не работает только для серверных файлов .RDL (и это то, с чем я работаю) –

+0

Да, это правильно. Это решение будет работать только с локально размещенными отчетами. – jgallant

3

Вы должны попробовать следующую ссылку, это, пожалуй, лучший способ это сделать.

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

Вам нужно будет создать сборку с вашими ресурсами и методы, чтобы получить строки, основанные на культуре. Вы можете найти полный учебник здесь:

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

Вы можете добавить пользовательскую сборку, которая содержит ресурсы для ваших строк, которые вы хотите перевести, и доступ к ним в отчете.

0

Я согласен с Igoy в этом, недавно пропустив шаги, перечисленные в кодепроекте, но хотел бы добавить, что шаги, которые необходимо предпринять при добавлении новой CodeGroup, немного отстают в том, что если вы поместите новую CodeGroup в любом месте но после неназванной UnioncodeGroup (это тот, у кого есть Url = "$ CodeGen $/*") ваши попытки получить доступ к вашей пользовательской сборке не удастся.

После многократного поиска я смог найти подтверждение этого на одной из страниц msdn (см. Раздел «Размещение элементов групповой политики для расширений»). Их формулировка, что «рекомендуется», но из моего тестирования я бы сказал, что это необходимо, по крайней мере, при тестировании непосредственно на сервере отчетов: http://msdn.microsoft.com/en-us/library/ms152828.aspx

для этого XPath места в .config файлов как таковые (полезно в WiX): // PolicyLevel/CodeGroup/CodeGroup [[] @ класс = [] 'FirstMatchCodeGroup']/CodeGroup [[] @ PermissionSetName = 'ReportLocalization' []]

+0

Я не вижу, как мой ответ «не полезен». Следуя нескольким примерам сообщества о том, как локализовать SSRS, мне пришлось потратить дополнительные три дня на выяснение полезной информации, которую я здесь поделил. Пожалуйста, объясните, пожалуйста, избирателей. Вы могли бы помочь мне стать лучшим спонсором SO :) – idclaar

0

идущее SQL dsTranslations набор данных путь (мне не нравится в XML)

Это позволяет сделать простой интерфейс, чтобы ваши клиенты заполнили переводы, , например, быстрый Lightswitch GUI

enter image description here

Используя этот набор данных я сделать простой поиск, чтобы перевести

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

Этот второй метод является один я Personaly использование, в случае, если ключ не в dbTranslations он показывает ват-ключ, который они должны добавить в db. Я мог бы, вероятно, сделать эту вторую часть более элегантно, обратная связь приветствуется.

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

Простой способ сделать многоязычный отчет ssrs является жестким кодом или использованием sharedataset. однако мы столкнемся с проблемой производительности рендеринга, если мы используем набор данных share.

Вот эффективный подход для перевода этикеток в отчете с более высокой производительностью (особенно на оказание производительности)

Шаг 1: Реализация библиотеки для поддержки получения словаря для отчетов, ниже пример для справки, это должно быть изменен, чтобы вернуть правильный словарю

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 
 

 
     } 
 
    } 
 
}

Шаг 2: Компиляция библиотеки и скопируйте его в папку Bin в ReportServer в Reporting Service

Например: скопировать библиотеку C: \ \ MSRS10_50.R2 служб Reporting Services \ Program Files \ Microsoft SQL Server \ ReportServer \ бин

Шаг 3: Изменение файла rssrvpolicy.config файл в ReportServer (например: C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.R2 \ Службы Reporting Services \ rssrvpolicy.конфигурации), найти «$ Codegen $» и добавьте следующий код, чтобы позволить SSRS знать местоположение новой библиотеки

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

Шаг 4: остановка и запуск Служба отчетов В Диспетчер конфигурации служб отчетов

Шаг 5: Применить библиотеку в отчет SSRS Создать новый отчет или изменить новый отчет, этот отчет должен иметь параметр languageid Set ссылки на библиотеку для этого отчета правой кнопкой мыши на отчете, выберите Свойства отчета Нажмите на вкладке Ссылки Вставить ссылки из библиотеки в «Добавление или удаление узлов» области:

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

enter image description here

Step 6: Добавьте пользовательский код для поддержки перевода знака

public Shared Dim ListLabel as String() 

функция GetListLabel (LanguageID, как Integer) ListLabel = CmsReportLibrary.DictionaryLabel.GetDictionary (! Параметры LanguageId.Value) конец функции функция Перевести (вход в виде строки) в качестве строки

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 

Шаг 7: Добавление новой переменной отчет enter image description here

Выражение для ListLabel переменная

=Code.GetListLabel(Parameters!LanguageId.Value) 

Шаг 8: Перевести этикетки в докладе

Измените выражение метки, используйте метод Перевести в Таможенный кодекс, чтобы перевести

Например:

=Code.Translate("Client") 

=Code.Translate("Week") 
Смежные вопросы