我即将本地化以 webforms (asp.net) 编码的 web 应用程序,我想知道多部分可本地化内容的最佳方法。为了说明问题:当您翻译类似“我的名字是 Jonhy,我 12 岁”这样的句子时,如果您假设姓名和年龄是动态检索的,则可能需要更改姓名的位置和翻译中的年龄以使其在目标语言中的语法正确。我在想我们可以使用 string.Format 并将 {0} 和 {1} 放在资源文件中,让翻译器处理。但是,我想知道是否有更好的方法来实现这一目标?我敢肯定这经常出现。
2 回答
我很不幸地从事许多微软软件的本地化工作,我可以告诉你,这是司空见惯的。本地化人员习惯于查看带有占位符的字符串,在您的示例中(“我的名字是 {0},我 {1} 岁”),这并不难理解。您可能应该为单数添加一个变体,因为如果值为 0 或 1,则年份中的 s 将不正确(但我知道这只是一个示例)。
大公司甚至拥有专有软件来定义和验证单个字符串的规则,然后用于确保翻译人员不会引入错误,例如格式错误的占位符或使字符串的长度超出可接受的范围。
对于占位符字符串,最好使用注释功能(即在 Visual Studio 资源编辑器中的“注释”列中键入),这样您就可以告诉本地化人员有关占位符的信息并给他们一些示例。然后,他们有权在需要时重新排序占位符。但是请注意,即使您这样做,本地化人员也是容易犯错的(而且他们的时间报酬不高),因此在涉及占位符时,错误是司空见惯的。一个真实的例子是打印页面底部的“{0} of {1}”字符串(例如“1 of 3”,与页数有关)。最常见的法语翻译是直译“{0} de {1}”,在特定的页数上下文中是不正确的,在这种情况下应该是“{0} sur {1}”。但是大多数打印的应用程序在法语中的翻译是错误的。如果他们不知道如何使用字符串,你也不能责怪他们。
克拉福的好回答。它实际上变得更加复杂:
CN: 你赢了一辆汽车。=> 你赢得了 {0}
现在你认为你可以把任何东西放在那里,比如船、假期等。
不幸的是,在其他语言中,文章并不总是相同的。
DE:Sie haben ein Auto gewonnen。
但
Sie haben Ferien gewonnen(无文章)或Sie haben eine Gurke gewonnen。(不同的文章)。意大利语和其他语言也是如此。因此,您必须将文章包含到变量中。