C# 语言相关部分子串的国际化(i18n)
用这样一句话来说:C# 语言相关部分子串的国际化(i18n),c#,.net,internationalization,gettext,C#,.net,Internationalization,Gettext,用这样一句话来说: "I visited this place {0} {1} ago." 虽然{0}代表整数,{1}分别是“年”或“年”。 现在,在俄语中,“年”一词不仅仅是单数或复数,而是取决于确切的数字(Γа-Γа-Γа)。因此,任何仅仅区分“年”或“年”的规则对俄罗斯人来说都是不够的 现在,我需要的信息是:有没有办法在资源包或源代码中添加规则,保留整个字符串,或者必须将字符串拆分为 "I visited this place {0} " + "{1} " + "ago." 。。。在源
"I visited this place {0} {1} ago."
虽然{0}
代表整数,{1}
分别是“年”或“年”。
现在,在俄语中,“年”一词不仅仅是单数或复数,而是取决于确切的数字(Γа-Γа-Γа)。因此,任何仅仅区分“年”或“年”的规则对俄罗斯人来说都是不够的
现在,我需要的信息是:有没有办法在资源包或源代码中添加规则,保留整个字符串,或者必须将字符串拆分为
"I visited this place {0} " + "{1} " + "ago."
。。。在源代码中扩展规则?你如何处理这样的问题?有什么最佳实践吗?i18n的黄金法则
不要通过连接本地化字符串来生成本地化输出。曾经因为任何原因。
在这里,您违反了此规则,在较大的文本中间插入了本地化形式的“年/年”。对于您的特定示例,这很容易解决—只需将“N年(s)”作为一个整体进行本地化,然后插入该年—但这并不能真正解决问题。有些语言的结构更加依赖于上下文,这种方法在某个时候会致命地崩溃 为了获得最佳效果,您应该将字符串作为一个整体进行本地化。对于俄语语言环境,根据“years”参数的值,字符串应该有3种不同的形式(我不懂俄语,所以不知道哪种形式将用于什么值) 我不确定您使用的是什么i18n技术,但gettext(问题的标签)支持开箱即用。i18n的黄金法则 不要通过连接本地化字符串来生成本地化输出。曾经因为任何原因。
在这里,您违反了此规则,在较大的文本中间插入了本地化形式的“年/年”。对于您的特定示例,这很容易解决—只需将“N年(s)”作为一个整体进行本地化,然后插入该年—但这并不能真正解决问题。有些语言的结构更加依赖于上下文,这种方法在某个时候会致命地崩溃 为了获得最佳效果,您应该将字符串作为一个整体进行本地化。对于俄语语言环境,根据“years”参数的值,字符串应该有3种不同的形式(我不懂俄语,所以不知道哪种形式将用于什么值)
我不确定您使用的是什么i18n技术,但是gettext(问题的标签)支持开箱即用。在某种程度上,您已经回答了您的问题。不应连接字符串。基本上,占位符可以用于数字、日期和动态文本。
我认为度量单位(本例中的时间)是而不是动态文本 如何解决这个问题 我会给你两个想法的基本蓝图。两者都需要使用完整的句子
这有明显的缺点,听起来并不自然。虽然我不能给你们一个语言的例子,说明这个概念是行不通的,但这种语言存在的可能性不是零(斯拉夫语不在其中,这是肯定的)
偶数列出了可以在C#应用程序中使用的现有包装器,即和
就个人而言,我推荐后一种方法(使用ICU包装器)。您可能希望了解Java中解决方案的类似问题。我相信.Net也是基于同样的想法,只是你会使用
string.Format()
而不是MessageFormat
,你会用.Net的方式阅读资源(不管你喜欢什么风格)。在某种程度上你已经回答了你的问题。不应连接字符串。基本上,占位符可以用于数字、日期和动态文本。我认为度量单位(本例中的时间)是而不是动态文本 如何解决这个问题 我会给你两个想法的基本蓝图。两者都需要使用完整的句子
这有明显的缺点,听起来并不自然。虽然我不能给你们一个语言的例子,说明这个概念是行不通的,但这种语言存在的可能性不是零(斯拉夫语不在其中,这是肯定的)
偶数列出了可以在C#应用程序中使用的现有包装器,即和
就个人而言,我推荐后一种方法(使用ICU包装器)。您可能希望了解Java中解决方案的类似问题。我相信.Net也会基于同样的想法,只是你会使用
string.Format()
而不是MessageFormat
,你会用.Net的方式阅读资源(不管你喜欢什么风格)。你的标题拼写错误,而且你没有说明你使用的是什么平台和语言,因此“资源中心”