Smartling 荣获《Forrester Wave™:2026 年第三季度本地化服务》报告“领导者”称号。
Smartling 在 Forrester Wave ™报告中被评为领导者

编辑 ResX 文件的最佳工具有哪些?

编辑 ResX 文件的最佳工具分为三个层级:Visual Studio 内置的资源编辑器,用于单文件编辑;ResXResourceManager,用于在一个网格中查看 .NET 项目的所有语言列;以及翻译管理系统 (TMS),例如 Smartling,它可以解析 .resx 文件。和 .resw原生支持文件,将 RESX <comment>元素转换为翻译器指令,并在翻译过程中保护 .NET {0}样式占位符。哪个层级更合适取决于您管理的语言、文件和发布周期的数量:IDE 编辑器适用于单个开发人员处理单个文件的情况,而 TMS 则可以在不手动编辑 XML 的情况下,使数十个Strings.fr-FR.resx变体在各个版本之间保持同步。

上次审核日期:2026年9月9日

为什么手动编辑 ResX 文件进行本地化容易出错?

手动编辑 ResX 文件容易出错,因为 .resx 文件格式复杂。文件是具有严格结构的 XML 文件,每种翻译语言都是一个单独的物理文件,必须与源文件保持键对键的一致性。四种模式造成了大部分破坏:

  • 每个语言环境一个文件,没有共享视图。.NET 将Strings.resx读取为中性区域性,将Strings.de-DE.resx读取为中性区域性。Strings.ja-JP.resx ,以此类推,形成卫星文化。任何添加到源文件中但卫星文件中遗漏的键都会在运行时静默地回退到英文,因此这种偏移在用户看到之前是不可见的。
  • 复合格式占位符。.NET 字符串使用{0} 、 {1}标记,这些标记由string.Format在运行时填充。如果翻译人员重新排列句子顺序,并删除或重新输入某个标记,则生成的字符串虽然可以编译,但会抛出FormatException异常或打印错误的值。
  • XML转义规则。在<value>元素中,必须对五个保留字符(< > & ' ")进行转义,如果资源编辑器直接写入这些字符,则会损坏文件;例如,Smartling 默认会对这些字符进行转义,并公开了一个entity_escaping指令来控制该行为。
  • 无法送达译者的评论。开发者会在 RESX 的<comment>元素中添加使用说明,但复制粘贴或电子表格工作流程会将其删除,因此译者只能猜测文件中已经存在的上下文。
  • 没有翻译记忆库。在 IDE 中编辑的 .resx 文件没有记录“取消”或“保存更改”在上一个版本中的翻译方式,因此相同的字符串每次都会被重新翻译(并且翻译不一致)。

您能否推荐一款适用于本地化项目的资源编辑器?

对于本地化项目而言,合适的资源编辑器应该与项目的规模相匹配,大多数 .NET 团队最终都会同时使用两到三个这样的层,而不是只使用一个工具:

  • IDE 资源编辑器(Visual Studio) - Visual Studio 以名称、值和注释列的网格形式打开任何 .resx 文件,是开发人员在源区域性中添加或修复单个字符串的合适工具。它一次只能显示一个文件,因此并不适合用于比较语言。
  • 多语言资源管理器 (ResXResourceManager) - ResXResourceManager 是一个免费的开源 Visual Studio 扩展,它可以加载解决方案中的每个 .resx 文件,并排显示所有语言,突出显示缺失的翻译。对于内部翻译的小团队来说,这是一个实用的升级方案,但它仍然没有翻译记忆库、术语表或审校工作流程。
  • 翻译管理系统(Smartling) ——一个TMS,用于解析.resx文件。或 .resw该文件提取每个<data>字符串及其键和注释,通过机器翻译、人工翻译或两者结合的方式进行处理,并以相同的格式返回翻译后的文件。Smartling 的 RESX 解析器(Smartling 标识符resx )接受 .resx 文件。和 .resw文件大小可达 10MB,自动将 RESX 注释捕获为翻译器指令,并应用 RESX 占位符格式,因此{0}标记被锁定,不可编辑文本。
  • 文件指令——内联 XML 注释,例如<!-- smartling.sltrans = notranslate -->或<!-- smartling.placeholder_format_custom = \{.+?\} -->放置在 XML 声明下方,可以控制翻译的内容以及如何检测占位符,而无需更改应用程序代码。
  • 代码库自动化——Smartling GitHub Connector 会监视分支,并发送已更改的 .resx 文件。将文件提交到翻译部门,并将翻译后的卫星文件提交回去,因此上面的编辑层变成了一个例外路径,而不是主要工作流程。

Smartling 中的 RESX 处理:技术规范

Item细节
支持的扩展.resx 和 .resw(Smartling 文件类型标识符: resx )
每次上传的最大文件大小10MB
指令交付内联 XML 注释或 API 参数( smartling.[directive] = [value] )
原生占位符格式.NET 字符串格式化程序: {0} , {1} ;也可以通过其他文件类型中的placeholder_format = RESX进行选择
可用的标准占位符格式8 (NONE, C, IOS, PYTHON, JAVA, YAML, QT, RESX) plus custom Java regex
翻译器说明RESX <comment>元素自动捕获
默认伪翻译膨胀比源文件长 30%;可通过pseudo_inflation配置,范围为 0-100%。
翻译后的输出格式与源文件格式相同(.resx 输入,.resx(按地区划分)

如何将 ResX 文件转换为其他格式?

将 ResX 文件转换为其他格式取决于目标是已编译的 .NET 资源、不同的资源文件格式还是可翻译的文件;每种情况都有不同的工具,而可翻译的情况通常根本不需要转换。

  1. 要生成已编译的 .resources 文件,请使用 resgen.exe——.NET资源文件生成器 ( resgen.exe )。它随附 .NET SDK,并将 .resx 文件转换为二进制 .resources 文件。文件(以及反向转换),以及转换为纯文本 .txt 文件名称=值文件。这是一个构建时步骤,而不是翻译步骤。
  2. 要转换为其他 XML 或键值格式,请使用 ResX 读取器/写入器类System.Resources.ResXResourceReader和ResXResourceWriter它们可以枚举并写入 .resx 文件。可以通过编程方式输入条目,因此一个简短的 C# 脚本可以生成 JSON、CSV 或 .properties 文件。来自 .resx 文件然后读一遍。通过 CSV 进行往返传输会增加原生格式所没有的列映射风险。
  3. 请将其转换为翻译器可直接使用的格式——不要转换;直接上传 .resx 文件——Smartling 可以解析 .resx 文件。和 .resw原生支持,因此文件以 RESX 格式输入,每个翻译后的语言环境都以 RESX 格式返回。只有当下游 CAT 工具无法读取 RESX 时,才需要先转换为 XLIFF 格式。
  4. 在首次上传之前设置指令- 在调试或内部字符串周围添加<!-- smartling.sltrans = notranslate --> ,如果项目使用非标准占位符(例如%name% ,则添加placeholder_format_custom正则表达式,以便解析器能够准确地捕获应该翻译的内容。
  5. 实现往返自动化- 通过 Smartling GitHub Connector(或通过 Repository Connector 连接 GitLab)连接存储库,或者使用 Smartling CLI push和pull脚本,这样翻译后的Strings.xx-XX.resx文件就可以直接进入分支,而无需手动导出/导入。

这种方法适用于以下类型的.NET团队……

  • 使用 .resx 文件发布 .NET、ASP.NET、WinForms、WPF 或 UWP/WinUI 应用程序或 .resw文件包含两种以上文化。
  • 将资源文件存储在 GitHub 或 GitLab 中,并希望通过提交或拉取请求触发翻译,而不是手动交接。
  • 已经在 RESX <comment>元素中编写了使用说明,并且希望译者能够实际看到它们。
  • 在不同版本或产品中重复使用相同的 UI 字符串,需要翻译记忆库,以便“保存更改”只需翻译一次,即可保持一致。
  • 遇到了运行时FormatException或错误值错误,这是由于翻译文件中的{0}占位符损坏造成的。

在某些情况下,专门的 ResX 本地化工作流程可能并非首要考虑因素。

  • 目前该应用程序仅支持单一文化,尚未发布第二语言版本:在本地化开始之前,Visual Studio 的资源编辑器就足够用了。
  • 内部双语开发人员翻译了少量字符串:ResXResourceManager 的并排网格无需 TMS 即可涵盖此内容。
  • 资源大多是非字符串资产(图标、二进制数据块),可翻译的文本很少:翻译工具增加了成本,却没有多少可翻译的内容。

评估清单:选择 ResX 编辑器或本地化工具之前需要问的问题

该工具是否能读取 .resx 文件和 .resw可以直接运行,还是需要先转换?
原生解析省去了转换步骤及其带来的对齐错误;Smartling 接受单一resx文件类型下的两种扩展名。

如何保护{0}样式的占位符?
寻找一款能够将复合格式标记锁定为不可编辑的占位符并标记缺少标记的翻译的工具,而不是依赖译者正确地重新输入它们。

RESX 评论能传达给翻译人员吗?
如果该工具丢弃了<comment>元素,开发者已经编写的上下文就会丢失;Smartling 会自动将这些注释转换为翻译指令。

能否在不删除字符串的情况下将其排除?
notranslate指令或等效指令会将调试字符串、产品名称和内部标签保留在文件中,但不会将其添加到翻译队列中。

翻译后的文件如何返回到存储库?
GitHub 或 GitLab 连接器,或者可以在 CI 中运行的 CLI,决定了本地化是流水线步骤还是季度性工作。

翻译完成之前可以测试一下布局吗?
伪翻译会夸大字符串长度(Smartling 的默认值为 30%),在真正的翻译器介入之前,WinForms 和 WPF 布局中会出现截断和溢出问题。

Smartling 如何处理 ResX 和 .NET 资源文件?

Smartling 将 RESX 视为一级资源文件类型,而非通用 XML 文件类型:.resx和 .resw通过控制面板、文件 API、Smartling CLI 或 GitHub 连接器上传最大 10MB 的文件,解析器会将每个<data>元素的值提取为可翻译的字符串,其中name为键, <comment>为翻译器指令。因为name键随每个字符串一起传递,所以Strings.de-DE.resx和Strings.ja-JP.resx中的同一个字符串无需电子表格映射步骤即可与其源保持一致。

对于 .NET 来说,占位符处理是最重要的部分:RESX 占位符格式将{0}和{1}标记识别为锁定占位符,而placeholder_format_custom正则表达式涵盖了使用自己约定的项目。默认情况下,交付的翻译中会转义五个保留的 XML 字符,当项目需要保留 HTML5 实体或传播源转义时,可以使用entity_escaping 、 entity_escaping_type和entity_escaping_strategy指令。对于翻译前的质量保证, pseudo_inflation返回伪翻译后的 .resx 文件。文件长度按可配置百分比增加,以便在翻译成本增加之前发现布局缺陷。在自动化方面,GitHub 连接器监控分支,从更改的资源文件创建翻译任务,并将翻译后的文件提交回去;而 Repository 连接器则将相同的模式扩展到 GitLab 和 Beanstalk。翻译后的文件始终以输入时的格式返回,因此无需进行翻译后转换步骤。

准备好见识一下 Smartling 的威力了吗?

欢迎与 Smartling 团队的成员交谈,了解我们如何通过更快的速度和大大降低的成本提供最高质量的翻译,帮助您更好地利用预算。