Pra*_*are 25 c# wpf resources localization
我在资源文件中添加了一个字符串.我的应用程序将被本地化.
但是,将带有占位符({0})的字符串添加到资源中是一个好主意吗?
如果一些非技术人员进行本地化怎么办?有没有办法让他在不知不觉中搞砸了?
如果这不是一个好主意,我该怎么办?
这是一个简单的例子.我将使用WPF资源字典.
例:
// Resource1.resx
// Name | Value
//---------------------------------------------------------------
// RELATIONSHIP_STATUS_MSG | {0} is in relationship with {1}.
//
class Program
{
static void Main(string[] args)
{
string msg = string.Format(Resource1.RELATIONSHIP_STATUS_MSG,
"Romeo", "Juliot");
Console.WriteLine(msg);
}
}
Run Code Online (Sandbox Code Playgroud)
Mat*_*zer 15
嗯,我相信这是一个好主意,因为这是一种简单快捷的呈现参数化和本地化字符串的方法.
顺便说一句,正如你在问题中所说的那样,非技术人员可能会破坏你的本地化字符串,因为他们不理解什么是"{0}".我有两种"方法"来解决这个问题
只需注意非技术人员维护本地化字符串,他们就不必关注括号中的文本.
使用命名占位符:"{some-identifier}"并使用someTextResource.Replace("{some-identifier}", someTextVar).
关于第二个,你可以实现一些接受IDictionary<TKey, TValue>替换关系实例的方法,其中key是要替换的标识符,并且值为替换标识符的文本.
这取决于.
有时您别无选择,只能使用占位符,例如动态数据.在这种情况下使用占位符,特别是编号的({0},{1},...)不仅是好主意,而且是国际化视角中最可接受的想法.它允许在翻译期间重新排序句子,这绝对是你想要支持的.
至于非技术人员...好吧,如果你使用专业的软件翻译供应商,他们不会有任何问题,他们只是用来翻译这样的字符串.如果你想指定通用翻译器的服务,它可能会造成问题.但在这种情况下,我必须警告您技术翻译是特定的:翻译人员至少应遵守通用软件术语词汇表.
好的,现在为什么它取决于.基本上,使用string.Format()格式化字符串实际上是连接.正如我所说,如果你有动态数据,你别无选择.但是,如果您的数据是静态的,并且您只有很少的组合,那么在任何情况下都不应该使用占位符(也不应该使用串联(+)运算符的简单字符串连接,也不要使用StringBuilder更复杂).对于静态数据,您只需创建所需的字符串即可.
它的真正原因是,许多语言需要根据上下文的不同形式的翻译.例如,在我母亲的舌头(波兰语)中,我们使用不同形式的女性和男性名词.
这不仅仅是理论问题:4年前,当我在本地化工作时,我们不得不本地化新的主要反病毒软件.问题是,一些程序员优化了资源,因此我们有一条类似于那条的消息:
The {0} is inactive. To activate {0} click...
Run Code Online (Sandbox Code Playgroud)
什么代替了占位符,是功能或程序名称.在波兰语中功能是女性化的,通过程序是男性化的.更糟糕的是,我们的语言学家想要添加单词"program"和"funkcja",具体取决于实际上不活跃的内容.
显然,我们(本地化软件工程师)无法在不触及代码的情况下解决问题(我们不允许这样做,但这是一个不同的故事......).
总结一下:
如果你真的需要,请使用占位符.磁盘空间很便宜.避免连接(因为这不允许重新排序翻译的句子).
不要太担心翻译,但请记住给他们上下文(可能还有说明).让他们知道这是很重要的地方你的字符串将被显示,什么是可能的值.
| 归档时间: |
|
| 查看次数: |
13452 次 |
| 最近记录: |