我的英文短语看起来像这样:“我有{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)。
现在我正在捕获格式异常,感觉不对。我正在寻找更好解决方案的想法。
答案 0 :(得分:4)
在保存到数据库之前,为什么不看看String.Format是否抛出?如果是这样 - 请不要让用户保存。
只是一个可以解决问题的简单想法......
答案 1 :(得分:1)
好吧,我认为您的用户不应该更改您的翻译字符串,除非他们知道他们在做什么。通常,应该告诉译员{0},{1}表示可替换的参数,不应该更改。除了翻译之外的所有其他人都不应该访问这些字符串,恕我直言。
答案 2 :(得分:1)
你可以做两件事:
答案 3 :(得分:1)
我会将翻译的短语与存储的原始短语进行比较,以检查占位符的数量和类型是否相等。
解析原始英文短语,并检查占位符,例如使用正则表达式:/\{\d+\}/
(如果您只使用占位符而没有格式化)。检查匹配项,并在编辑时将它们与已翻译的字符串进行比较。这可以确保应用程序在用户仍然可以纠正它时失败。
答案 4 :(得分:1)
你肯定需要一个验证函数,可以用某种方式检查编辑过的字符串。即使在不使用数字位置指标的不同方案中,仍然存在拼写错误的机会。
就UI而言,在完成编辑后,您可以向他们展示实际填充参数化值的示例翻译。这将有助于验证其格式化字符串的双重目的,并让他们可以仔细检查它在上下文中的外观。
答案 5 :(得分:0)
夜间单元测试可以解决这个问题。
另一个想法:
为此用户提供一个用户可以在进行更改后运行的检查工具。