Crystal reports 本地化水晶报告

Crystal reports 本地化水晶报告,crystal-reports,localization,Crystal Reports,Localization,在Crystal Reports上本地化标签(列标题、字段标签、页眉/页脚等)的好方法是什么 我们目前在XIR2 SP4上,但希望迁移到2008席。看起来2008提供了更好的查看器UI本地化。它有一个内容本地化的故事吗?我能想到的两个选项是:1)为每个本地化版本提供一个单独的报告(这会很快变得难看,我不推荐这么做),或者2)从应用程序生成报告(比如一个c#windows/web应用程序)然后可以使用.net的本地化标准进行本地化,并在代码中设置所有本地化文本(从资源文件读入)。 我不确定大约

在Crystal Reports上本地化标签(列标题、字段标签、页眉/页脚等)的好方法是什么


我们目前在XIR2 SP4上,但希望迁移到2008席。看起来2008提供了更好的查看器UI本地化。它有一个内容本地化的故事吗?

我能想到的两个选项是:1)为每个本地化版本提供一个单独的报告(这会很快变得难看,我不推荐这么做),或者2)从应用程序生成报告(比如一个c#windows/web应用程序)然后可以使用.net的本地化标准进行本地化,并在代码中设置所有本地化文本(从资源文件读入)。


我不确定大约2008,但我们也在席R2。我们有每种语言的本地化报告,但这只是因为我们*知道*我们只需要三种不同的本地化版本。

一位客户要求我为他们制定本地化策略。我一直想写一篇关于它的文章。多亏了你,我才做到了这一点

编辑:

我能够使用一个嵌入式子报表(在报表标题部分),它引用了本地化值数据库。我本想在我的帖子里加上这个,但它相当复杂


另一个选项是创建处理此任务的用户函数库(UFL)。将数据存储在数据库或XML文件中。但是,很可能会丢失ContentLocale功能

找到了一种在Crystal报表中本地化日期时间等值的方法。
例如,如果日期为2009年8月,文化为法语,则显示为aoāt-2009。
所有这些都不需要将当前的线程文化转换为法语

相关代码段(示例):


我们终于开始实施报告本地化。在我们的应用程序中,Crystal Reports的加载已经是用户体验中最落后/最差的部分,因此我们希望避免任何性能影响。另一个影响我们决定的想法是,在发布的版本中,翻译不会改变

我们开发了一个应用程序,它使用Crystal Reports API(2008-因此没有RDC),分两个阶段工作

第一阶段是删除所有文本并输出到英语.resx文件。其中最困难的部分是识别函数中的可翻译文本,并用表示“不翻译”的标记替换嵌入字段

在resx的本地化版本返回后,应用程序的第二阶段会将每个报告与每个resx一起保存,并用翻译文本替换英语保存新报告。这也使我们能够将仅在提交给哥特女士的日文报告中使用的字体切换出去,从而避免了需要许可使用“通用”字体。“通用”字体中的日语字符(例如Arial Unicode MS)看起来像垃圾


Crystal API是拜占庭式的,在检测函数和嵌入字段中的可翻译字符串时,需要注意边缘情况。注意PageNofM之类的内置字段,它们不是用大括号括起来的(更不用说你应该用{field}的第{field}页替换它,这样“Page”和“of”就可以翻译了)。一个指针,使用控制器将现有项替换为克隆/修改的副本,您不能只原地修改项的文本内容。如果你走这条路,祝你好运,但最终我们认为这是最好的选择。

单晶报告用于多种语言

if(CultureInfo.CurrentCulture.Name==“en-US”)
{
(obj.ReportDefinition.ReportObjects[“lbleverest”]作为TextObject)。Text=resBundle.GetString(“本地化”、“珠穆朗玛峰”);
(obj.ReportDefinition.ReportObjects[“lblmandlicode”]作为TextObject)。Text=resBundle.GetString(“本地化”、“社会代码”);
(obj.ReportDefinition.ReportObjects[“MandliName1”]作为FieldObject”).ApplyFont(新字体(resBundle.GetString(“本地化”、“字体”)、Convert.ToInt32(resBundle.GetString(“本地化”、“字体大小”)、FontStyle.Regular);
(obj.ReportDefinition.ReportObjects[“shortName1”]作为FieldObject).ApplyFont(新字体(resBundle.GetString(“本地化”、“字体”)、Convert.ToInt32(resBundle.GetString(“本地化”、“字体大小”)、FontStyle.Regular);
}    
其他的
{    
(obj.ReportDefinition.ReportObjects[“lbleverest”]作为TextObject)。Text=resBundle.GetString(“本地化”、“珠穆朗玛峰”);
(obj.ReportDefinition.ReportObjects[“lblmandlicode”]作为TextObject)。Text=resBundle.GetString(“本地化”、“社会代码”);
(obj.ReportDefinition.ReportObjects[“MandliName1”]作为FieldObject”).ApplyFont(新字体(resBundle.GetString(“本地化”、“字体”)、Convert.ToInt32(resBundle.GetString(“本地化”、“字体大小”)、FontStyle.Regular);
(obj.ReportDefinition.ReportObjects[“shortName1”]作为FieldObject).ApplyFont(新字体(resBundle.GetString(“本地化”、“字体”)、Convert.ToInt32(resBundle.GetString(“本地化”、“字体大小”)、FontStyle.Regular);
}
obj.DataDefinition.FormulaFields[“lang”].Text=“””+CultureInfo.CurrentCulture.Name+“”;
cv.crystalReportViewer1.ReportSource=obj;
cv.Show();

#2将使用RDC扫描每个文本字段并替换为本地化文本?是的-我从未这样做过,因此我不确定涉及到什么样的头痛问题。对于返回本地化字符串的UFL,您怎么看?从每个标签字段调用它会是一个性能问题吗?请看我的答案,我们确实成功地使用了#2。我们在构建时自动定位并分发每个HeRead的本地化版本。在RooDROW的情况下总结这个想法:创建一个自定义函数,通过检查席XI CurrTristALE变量返回一个本地化字符串。这将在外包翻译时造成麻烦。什么是
resBundle
?为什么if/else块中的代码相同?
            //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());