在 .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 使用 msgid 作为存储原始未翻译字符串的字段,所以我不得不让 resgenEx 将原始翻译字符串存档到附加的注释中,而不是为此目的设计的字段。
- 一些工具假定 msgid 将包含原始的英文翻译(而不仅仅是一个 ID 字符串),这可能意味着该工具的自动错误检查选项不是很有用,或者它可能意味着让您选择不同的工具,等等。不过,大多数工具都没有做出任何假设。
- 一些 .po 工具,例如 \n 而不是 \r\n
我最初为其编写 resgenEx 的项目有两个 .resx 文件和一个 .isl 文件,用于每种支持的语言,但很快我将需要管理一个 .Net 项目的所有翻译,该项目对代码中的每个类都有多个 resx 文件。发生这种情况时,我将决定是否应该继续使用 .po 或是否应该使用 xliff 或其他东西。如果我继续使用 .po,那么我将清理 resgenEx 并且可能需要添加更多功能,例如自动将程序集名称和类名前缀添加到 msgid 的能力。