将短语翻译与String.Format集成

时间:2010-01-15 15:17:44

标签: c# string localization translation

我的英文短语看起来像这样:“我有{0}只狗和{1}只猫”。在代码中,我使用String.Format:

提供数据
String.Format("I have {0} dogs and {1} cats", 1, 2)

所以输出是这样的:“我有一只狗和两只猫”。

我试图解决的问题是“我有{0}只狗和{1}猫”这句话需要翻译成其他语言。

在这个西班牙语翻译示例中,英语短语“我有{0}只狗和{1}猫”以及翻译短语“Tengo {0} perros y gatos {1}”存储在数据库中。

如果用户要将“Tengo {0} perros y gatos {1}”更改为“Tengo {0} perros y gatos {3}”,则在调用String.Format时会抛出System.FormatException(“ Tengo {0} perros y gatos {3}“,1,2)。

现在我正在捕获格式异常,感觉不对。我正在寻找更好解决方案的想法。

6 个答案:

答案 0 :(得分:4)

在保存到数据库之前,为什么不看看String.Format是否抛出?如果是这样 - 请不要让用户保存。

只是一个可以解决问题的简单想法......

答案 1 :(得分:1)

好吧,我认为您的用户不应该更改您的翻译字符串,除非他们知道他们在做什么。通常,应该告诉译员{0},{1}表示可替换的参数,不应该更改。除了翻译之外的所有其他人都不应该访问这些字符串,恕我直言。

答案 2 :(得分:1)

你可以做两件事:

  1. 检查翻译人员保存新翻译时是否发生这种情况,即您可以搜索{XX}并查看最大数字是否与原始翻译不同。如果是这样,请不要保存新的。
  2. 显示时,如果出现类似错误,请抓住异常并退回到您知道正确的默认语言。

答案 3 :(得分:1)

我会将翻译的短语与存储的原始短语进行比较,以检查占位符的数量和类型是否相等。

解析原始英文短语,并检查占位符,例如使用正则表达式:/\{\d+\}/(如果您只使用占位符而没有格式化)。检查匹配项,并在编辑时将它们与已翻译的字符串进行比较。这可以确保应用程序在用户仍然可以纠正它时失败。

答案 4 :(得分:1)

你肯定需要一个验证函数,可以用某种方式检查编辑过的字符串。即使在不使用数字位置指标的不同方案中,仍然存在拼写错误的机会。

就UI而言,在完成编辑后,您可以向他们展示实际填充参数化值的示例翻译。这将有助于验证其格式化字符串的双重目的,并让他们可以仔细检查它在上下文中的外观。

答案 5 :(得分:0)

夜间单元测试可以解决这个问题。

另一个想法:

为此用户提供一个用户可以在进行更改后运行的检查工具。