替代Resx文件的本地化方案

4

为什么我不想使用Resx文件:

我正在寻找替代Resx文件以为我的项目提供多语言支持,原因如下:

  • 我不喜欢在编写消息时指定“messageId”,这需要更多的工作量,并且会干扰代码流程,因为我不知道日志消息实际上会说些什么,我需要打开另一个选项卡来编辑消息
  • 有时我会内联使用代码,因为我不想为简单的步骤创建新的变量(例如Log.Info("Iterated {i+1} times");)。有时,使用变量或者在内联中进行简单的计算比创建额外的代码行更清晰。

我可以想象的替代方案:

一种外部应用程序,它可以爬取编译后的exe文件中的所有字符串,使您有机会忽略/添加应该翻译的字符串。它可以为所有语言创建XML或Json文件,然后将所有字符串替换为哈希/ID,以便仍然可以查找所有语言的字符串。

我是唯一一个对常用的Resx /集中式字符串数据库解决方案不满意的人吗?我是否忽略了这个方案不好的点?


你在这里描述gettext。而且似乎也支持C#(https://www.gnu.org/software/gettext/manual/html_node/C_0023.html)。资源方法适用于不仅仅是字符串的更多内容。 - Joey
准确地说,您需要编辑项目中的代码,而我的建议不需要更改我的项目代码。 - kentor
1
没有什么魔法。如果你不想使用微软内置的方法,你必须编辑代码来使用另一个方法。 - Lex Li
@LexLi 建议的方法不需要进行任何代码更改,请再次阅读/重新评估它。 - kentor
@kentor,要将您的想象付诸实践,那么代码从何而来? - Lex Li
1个回答

2
依赖已有的方法而不是实现自己的格式的一个原因是翻译。这主要取决于你的资源是如何翻译的:如果是由技术背景、乐意在纯文本编辑器中工作的志愿者进行翻译,那么你可以自由地设计自己的资源格式。但如果你将资源交给不太懂技术、喜欢使用集成术语管理、翻译记忆、拼写和质量检查等功能的专业翻译人员进行翻译,那么很可能这种环境无法处理你自己制定的资源格式。
既然我已经提到了专业翻译环境,其中一些工具依赖于ID来确定哪些字符串是旧的,哪些是新的。如果你采用文本作为ID的方法,每次源语言中的固定错别字都意味着你创建了一个需要翻译并支付费用的新字符串。如果翻译人员看到某个字符串的源文本已经发生了改变,他可以查看更改内容,注意到修正了错别字,决定翻译仍然正确,并签署该字符串,无需额外的翻译费用。
顺便提一下,如果您想要好的本地化字符串,例如Log.Info("Iterated {i+1} times");,您必须找到一种正确处理复数形式的方法。一些语言对不同的数字有不同的语法规则(请参见Unicode Language Plural Rules以获得概述)。恐怕,仅仅因为在代码中很容易做到这一点,并不意味着它很容易本地化。
总之,如果您想创建自己的资源格式,请与翻译人员交谈。询问他们可以处理哪些格式。考虑与您的格式相关的翻译限制,例如是否有任何字符,翻译人员不应使用它们,因为它们会破坏您的字符串?撇号和引号是主要的候选项,因为它们经常用作资源文件中的字符串定界符,或者如果您决定采用XML方式,则是<和&。考虑转换为XLIFF和转回:大多数翻译环境都可以处理XLIFF。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接