2010-02-17 185 views

回答

6

不,不幸的是,有沒有簡單的方法來做到這一點:-(我一直試圖讓這個啓動和運行自己,但到底是什麼我所做的是基本上通過所有我希望顯示在標籤上來自調用應用程序的報告(在我的情況下爲ASP.NET應用程序)

另一種方法可能是將文本片段存儲在SQL Server表中,並將數據源添加到報告中,以檢索這些文本標籤,然後將它們綁定到適當的控件上,我嘗試了類似的方式,但一直未能使它爲我自己工作

ASP.NET的資源很好地國際化,但SSRS仍然很一個凌亂的AF公平試圖使其支持多語言:-(

3

可以公開全局參數(用戶!語言)反映了用戶的郎當。

然後你可以用谷歌translateapi英語單詞轉換成你的語言。

這裏是一個很好的文章:http://mscrm4u.blogspot.com/2008/06/multi-lingual-ssrs-reports.html

+0

真的不知道如果我想調出的自動化谷歌的服務,爲每對每一個標籤我的報告..... –

+0

@marc_s你不必,這是一個例子。如果您利用nvarchar和一個存儲過程,您還可以檢索任何語言的標題的列信息。 – JonH

2

我設法多語言支持,通過.NET資源文件,通過將一個有趣的黑客攻擊。每個報告控件都有一個未使用的屬性,稱爲ValueLocId。使用此屬性,您可以指定要用於每個控件的資源名稱。這裏的想法是,你將遍歷你的報表定義,尋找具有ValueLocID屬性的控件。如果該屬性已設置,請使用ValueLocID中指定的資源文本替換該控件的文本。所以基本上,這個想法是這樣的:

  1. 加載在內存中的RDLC文件,如使用XPath XML文件
  2. 遍歷XML文件,尋找ValueLocID性質
  3. 替換與XML節點的innerText在ValueLocID
  4. 裝載指定使用RDLC文件的存儲器複製ReportViewer控件資源。

見以下的功能,這將做什麼我上面提到的。

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

0

我最近在運行完codeproject中列出的步驟之後,同意Igoy的看法,但是想補充一點,如果您將新的CodeGroup放置在任何位置,添加新CodeGroup時遵循的步驟都會有所欠缺但在未命名的UnioncodeGroup(它是Url =「$ CodeGen $/*」的那個)之後,您嘗試訪問您的自定義程序集將失敗。

經過大量的挖掘,我能夠在其中一個msdn頁面上找到對此的確認(請參閱「用於擴展的CodeGroup元素的放置」一節)。其措辭是,「建議」,但是從我的測試中,我會說這是必需的,至少當直接在報表服務器上進行測試: http://msdn.microsoft.com/en-us/library/ms152828.aspx

在.config文件中這個位置的XPath是這樣(在威克斯有用): // PolicyLevel /代碼組/代碼組[[] @類= 'FirstMatchCodeGroup'[]] /代碼組[[] @ PermissionSetName = 'ReportLocalization'[]]

+0

我不明白我的答案是「沒用」。在介紹如何使SSRS本地化的幾個社區示例之後,我不得不花費額外三天的時間來查找我在此分享的有用信息。可以倒下選民請解釋一下?你可能會幫助我成爲一個更好的SO貢獻者:) – idclaar

0

去的SQL dsTranslations數據集方式(我不喜歡在XML中弄亂)

這可以讓你做一個簡單的界面,讓你的客戶填寫翻譯, 例如,一個快速的LightSwitch GUI

enter image description here

使用該數據集I做一個簡單的查找翻譯

=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

製作多語言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(); \t 
 
      return new string[] {...............}; 
 
\t \t \t //ex return new string[] { "Client||Klient", "Week||Woche", "Year||Jahr"}; \t \t \t 
 

 
     } 
 
    } 
 
}

第2步:編譯庫,並將其複製到的ReportServer Bin文件夾的報告服務

例如:庫複製到C:\ Program Files文件\ Microsoft SQL Server的\ MSRS10_50.R2 \ Reporting Services的\的ReportServer \ BIN

第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:停止和啓動Reporting服務報告服務配置管理器

步驟5:將庫應用到SSRS報告 創建新報告或修改新報告,此報告應具有語言ID參數 設置爲這個報告 庫引用右鍵單擊報告,選擇報表屬性 點擊引用選項卡 圖書館的文獻粘貼到「添加或刪除組件」區域:

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

enter image description here

步驟6:添加自定義代碼來支持標籤翻譯

public Shared Dim ListLabel as String() 

功能GetListLabel(languageid爲整數) 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")