Мультиязычность в SSRS - PullRequest
       16

Мультиязычность в SSRS

9 голосов
/ 17 февраля 2010

Можно ли отобразить / экспортировать отчет по английскому SSRS на некоторых других языках?

Ответы [ 7 ]

6 голосов
/ 17 февраля 2010

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

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

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

5 голосов
/ 17 февраля 2010

Мне удалось получить многоязыковую поддержку через файлы ресурсов .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
3 голосов
/ 11 июля 2011

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

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

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

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

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

3 голосов
/ 17 февраля 2010

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

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

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

1 голос
/ 13 января 2015

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

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

enter image description here

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

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

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

=Microsoft.VisualBasic.Interaction.iif(Lookup("WORDTOBETRANSLATED", Fields!Key.Value, Fields!Value.Value, "dsTranslation") = "", "WORDTOBETRANSLATED", Lookup("WORDTOBETRANSLATED", Fields!Key.Value, Fields!Value.Value, "dsTranslation"))
0 голосов
/ 25 сентября 2015

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

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

Шаг 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();	
            return new string[] {...............}; 
			//ex return new string[] { "Client||Klient", "Week||Woche", "Year||Jahr"}; 			

        }
    }
}

Шаг 2. Скомпилируйте библиотеку и скопируйте ее в папку Bin на ReportServer службы отчетов

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

Шаг 3: Изменить файл rssrvpolicy.config в папке ReportServer (например: C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.R2 \ Службы отчетов \ rssrvpolicy.config ) найдите "$ 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 Установить ссылки на библиотеку для этого отчета Щелкните правой кнопкой мыши отчет, выберите Свойства отчета. Нажмите на вкладку Ссылки Вставьте ссылки библиотеки в область «Добавить или удалить сборки»:

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

enter image description here

Шаг 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: Перевести метки в отчете

Измените выражение метки, используйте метод Translate в пользовательском коде для перевода

Например:

=Code.Translate("Client")

=Code.Translate("Week")
0 голосов
/ 19 апреля 2013

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

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

xpath для этого расположения в файлах .config как таковой (полезно в wix): // PolicyLevel / CodeGroup / CodeGroup [[] @ класс = 'FirstMatchCodeGroup' []] / CodeGroup [[] @ PermissionSetName = 'ReportLocalization' []]

...