本地化水晶报告

时间:2009-05-20 11:41:00

标签: crystal-reports localization

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

我们目前正在使用XI R2 SP4,但我们正在寻求迁移到2008年。看起来2008年提供了更好的本地化查看器用户界面。它是否有内容本地化故事?

5 个答案:

答案 0 :(得分:2)

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

我不确定2008年,但我们也在XI R2上。我们为每种语言提供了本地化报告,但仅仅因为我们*知道我们只需要三种不同的本地化版本。

答案 1 :(得分:2)

找到一种方法来定位Crystal Reports中的DateTimes等值 例如,如果日期是2009年8月,而文化是法国,那么将显示为août-2009 所有这些都没有将当前的Thread文化切换为法语。

相关代码段(示例):

            //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());

答案 2 :(得分:1)

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

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

第一阶段是将所有文本和输出刮到英文.resx文件。最棘手的部分是识别函数中的可翻译文本,并用标记“不要翻译”替换嵌入字段。

在resx的本地化版本回来之后,应用程序的第二阶段会将每个报告与每个resx一起保存,并保存新的报告,其中英语替换为翻译文本。这也允许我们仅在日语报告中将字体切换为MS Gothic,从而避免了许可“通用”字体的需要。 “通用”字体中的日文字符(例如Arial Unicode MS)往往看起来像垃圾。

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

答案 3 :(得分:0)

客户要我为他们制定本地化策略。我一直想写一篇关于它的文章。谢谢你,我已经做到了。 http://www.cogniza.com/blog/?p=55

编辑:

我能够使用引用了本地化值数据库的嵌入式子报表(在报表头部分中)。我会在我的帖子中添加它,但它非常复杂。

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

答案 4 :(得分:-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();