如何在.net (c# /ASP.Net)开发中使用xliff或po - 10n文件格式

本文关键字:xliff po 格式 文件 10n 开发 net Net ASP | 更新日期: 2023-09-27 18:17:15

我一直在研究xliffpo i18n文件格式,似乎它们被广泛使用和支持。有很多免费工具可以管理xliff/po文件中的翻译。

然而,到目前为止,我还没有找到一个好的解决方案,如何在.net (c#/ASP.Net)项目中使用xliff或po文件。我希望有某种xliff/po => resx转换器,但到目前为止还没有找到。

然而,与此同时,许多工具确实支持将xliff/po文件转换为java 。属性格式。

如果你有在。net项目中通过xliff或po文件实现l10n的经验 -请提供建议并分享其工作原理的最佳实践。

PS:我更喜欢使用xliff格式,因为我发现它更干净,功能更广泛,但po也是一种选择。

如何在.net (c# /ASP.Net)开发中使用xliff或po - 10n文件格式

您也可以考虑Daniel crena的i18n包,可以从nuGet获得。它使用PO文件作为本地化文本的默认存储。

PO和XLIFF文件的工作方式通常不同:

  • PO文件是被编译成二进制格式的资源文件,然后使用gettext()库访问。有时PO被用作像XLIFF一样的提取格式,但这不是它的原始目的。

  • XLIFF是通过将资源文件(例如resx)提取到XLIFF中创建的提取文件,然后合并回原始格式。

所以对于XLIFF,你应该寻找一个做resx -> xliff -> resx而不是xlif -> resx的工具。

提取/合并XLIFF文件的工具通常称为过滤器。有相当多的商业翻译工具将接受XLIFF,有些也可以创建XLIFF (Swordfish, Trados Studio等)。

也有一些开源工具可以提取/合并XLIFF:例如File2XLIFF4j(但我认为它不支持resx)。

来自Okapi项目的Rainbow支持resx。"旧的"。net版本(Rainbow 5: Okapi on SourceForge)有一个专门针对resx文件的过滤器,可以很好地处理它们;即使是二进制数据。但它可能会遇到第三方控件的问题(详见http://okapi.sourceforge.net/Release/Filters/Help/netres.htm)。

新的java版本(Rainbow 6: http://code.google.com/p/okapi/)通过其XML过滤器支持resx,并且可以很好地使用简单的resx,但如果其中包含二进制数据,则这些条目中的文本将无法提取。

y

在.resx文件开始失控后,我使用PO来管理一个。net项目。我使用它作为"像XLIFF一样的提取格式"(参见Yves的评论)。我们现有的。resx文件被导出/合并为每个语言一个。po文件,然后成为我们的权威语言文件,所有的resx文件将自动生成。

我所在的项目不是ASP,所以我不知道mcw0933提到的包,但Mono的resgen.exe实现有一些简单的po <=> resx转换能力。但是,为了保留现有的注释并自动添加原始文本作为额外的注释,我扩展了mono的转换工具,以至于我使用的转换工具基本上是重写的。

我把扩展的。po <=> .resx转换器放在github上。

至于选择。po来管理c#项目的翻译,.po是简单和友好的,但是在使用它的方式上有一些不便,与它在gettext中的原始用途略有不同,我没有经验说它是否比xliff更好,但是能够管理翻译和自动执行任务比处理resx文件要好得多,就像我们过去那样。

使用PO的一些不方便之处:

  • 因为gettext使用msgstr作为存储原始未翻译字符串的字段,我不得不让resgenEx将原始翻译字符串存档到附加的注释中,而不是为此目的设计的字段。
  • 一些工具假设msgstr包含原始的英文翻译(而不仅仅是ID字符串),这可能意味着该工具的自动错误检查选项不是很有用,或者它可能意味着让您选择不同的工具,等等。但是大多数工具都不做假设。
  • 一些。po工具像'n而不是'r'n

我最初为每个支持的语言编写resgenEx的项目有两个.resx文件和一个.isl文件,但很快我就需要管理一个。net项目的所有翻译,该项目的代码中每个类都有多个resx文件。当这种情况发生时,我将决定是继续使用。po还是使用xliff或其他东西。如果我继续使用。po,那么我将清理resgenEx,可能需要添加更多的功能,比如自动向msgid添加程序集名称和类名称前缀的能力。

查看xlift -tasks。该工具从resx生成xliff,从xliff生成卫星组件。