2009-05-20 78 views
5

在Crystal Reports上本地化標籤(列標題,字段標籤,頁眉/頁腳等)的好方法是什麼?本地化水晶報表

我們目前正在使用XI R2 SP4,但希望遷移到2008年。它看起來像2008提供了更好的查看器UI本地化。它是否有內容本地化故事?

回答

2

我能想到的兩個選項是:1)爲每個本地化版本(這會變得很難快速,我不推薦它非常高)有一個單獨的報告或2)從應用程序生成報告說ac#windows/web應用程序),然後您可以使用.net的本地化標準進行本地化,並在代碼中設置所有本地化文本(從資源文件讀入)。

我不確定2008年,但我們也在XI R2。我們爲每種語言提供了本地化報告,但僅僅是因爲我們知道*我們只需要三種不同的本地化版本。

+0

#2將使用RDC通過每個文本字段來掃描和本地化的文本替換單晶報告使用? – 2009-05-20 11:50:04

+0

是的 - 我從來沒有這樣做過,所以我不確定涉及到什麼樣的頭痛。 – 2009-05-20 11:52:16

+0

你如何看待返回本地化字符串的UFL?從每個標籤字段調用這個是性能問題? – 2009-05-20 12:45:55

0

一位客戶要求我爲他們制定本地化戰略。我一直想寫一篇文章。感謝你,我已經做到了。 http://www.cogniza.com/blog/?p=55

編輯:

我能夠使用嵌入式子報表(在報告報頭部分),該引用的本地化值的數據庫。我會在我的帖子中加上這個,但這非常複雜。

另一種選擇是創建一個用戶函數庫(UFL)來處理這些任務。將數據存儲在數據庫或XML文件中。然而,最有可能的是,你將失去ContentLocale功能。

2

找到了一種在Crystal Reports中對諸如DateTimes之類的值進行本地化的方法。
例如,如果日期是2009年8月,文化是法語,則會顯示爲août-2009。
所有這些都不會將當前線程文化切換到法語。

相關代碼段(例如):

  //Locale must be set BEFORE report is opened 
      if (this.IsEnglish) 
      { 
       ReportDoc.ReportClientDocument.PreferredViewingLocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleEnglishCanada; 
       ReportDoc.ReportClientDocument.LocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleEnglishCanada; 
       ReportDoc.ReportClientDocument.ProductLocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleEnglishCanada; 
      } 
      else 
      { 
       ReportDoc.ReportClientDocument.PreferredViewingLocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleFrenchCanada; 
       ReportDoc.ReportClientDocument.LocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleFrenchCanada; 
       ReportDoc.ReportClientDocument.ProductLocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleFrenchCanada; 
      } 

      //Load the report from file path 
      ReportDoc.Load(reportPath.ToString()); 
1

我們終於可以實現國產化的報告。加載Crystal Reports已經是我們應用程序中用戶體驗中最遲鈍/最差的部分,因此我們希望避免任何性能影響。告知我們的決定的另一個想法是翻譯版本在發佈的版本中不會改變。

我們開發了一個使用Crystal Reports API(2008--所以沒有RDC)的應用程序,它分兩個階段工作。

第一階段是將所有文本和輸出轉換爲英文.resx文件。其中最難的部分是識別功能內的可翻譯文本,並用指示「不翻譯」的標記替換嵌入的字段。

在resx的本地化版本回來之後,應用程序的第二階段會將每個報告與每個resx一起進行處理,並保存用翻譯後的文本替換英文的新報告。這也使我們只能在日語報告中將字體轉換爲MS哥特式,從而避免了需要許可「通用」字體。 「通用」字體中的日文字符(例如Arial Unicode MS)往往看起來像廢話。

Crystal API是拜占庭式的,你需要小心邊緣情況,檢測函數和嵌入字段中的可翻譯字符串。請小心像PageNofM這樣的內建字段,它們不會被大括號括起來(更不用說您應該用{field}的Page {field}替換它,以便可以翻譯「page」和「of」)。一個指針,使用控制器來替換克隆/修改副本的現有項目,您不能只修改項目的文本內容。祝你好運,如果你走這條路,但最終我們認爲這是最好的選擇。

-1

多語言

if (CultureInfo.CurrentCulture.Name == "en-US") 
{ 
    (obj.ReportDefinition.ReportObjects["lbleverest"] as TextObject).Text = resBundle.GetString("Localization", "everest"); 
    (obj.ReportDefinition.ReportObjects["lblmandlicode"] as TextObject).Text = resBundle.GetString("Localization", "SocietyCode"); 
    (obj.ReportDefinition.ReportObjects["MandliName1"] as FieldObject).ApplyFont(new Font(resBundle.GetString("Localization", "Font"), Convert.ToInt32(resBundle.GetString("Localization", "FontSize")), FontStyle.Regular)); 
    (obj.ReportDefinition.ReportObjects["shortName1"] as FieldObject).ApplyFont(new Font(resBundle.GetString("Localization", "Font"), Convert.ToInt32(resBundle.GetString("Localization", "FontSize")), FontStyle.Regular));   
}  
else  
{  
    (obj.ReportDefinition.ReportObjects["lbleverest"] as TextObject).Text = resBundle.GetString("Localization", "everest");  
    (obj.ReportDefinition.ReportObjects["lblmandlicode"] as TextObject).Text = resBundle.GetString("Localization", "SocietyCode");  
    (obj.ReportDefinition.ReportObjects["MandliName1"] as FieldObject).ApplyFont(new Font(resBundle.GetString("Localization", "Font"), Convert.ToInt32(resBundle.GetString("Localization", "FontSize")), FontStyle.Regular));  
    (obj.ReportDefinition.ReportObjects["shortName1"] as FieldObject).ApplyFont(new Font(resBundle.GetString("Localization", "Font"), Convert.ToInt32(resBundle.GetString("Localization", "FontSize")), FontStyle.Regular));  
} 

obj.DataDefinition.FormulaFields["lang"].Text = "'" + CultureInfo.CurrentCulture.Name + "'";  
cv.crystalReportViewer1.ReportSource = obj;  
cv.Show();