2009-05-20 88 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();