在Crystal Reports上本地化标签(列标题,字段标签,页眉/页脚等)的好方法是什么?
我们目前正在使用XI R2 SP4,但我们正在寻求迁移到2008年。看起来2008年提供了更好的本地化查看器用户界面。它是否有内容本地化故事?
答案 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();