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(问题的标签)支持开箱即用。

在某种程度上,您已经回答了您的问题。不应连接字符串。基本上,占位符可以用于数字、日期和动态文本。
我认为度量单位(本例中的时间)是而不是动态文本

如何解决这个问题

我会给你两个想法的基本蓝图。两者都需要使用完整的句子

  • 你可以重新安排句子,这样你就不会有复数的问题,即“这个地方在几年|月|日|小时|分钟前被访问过:{0}”。
    这有明显的缺点,听起来并不自然。虽然我不能给你们一个语言的例子,说明这个概念是行不通的,但这种语言存在的可能性不是零(斯拉夫语不在其中,这是肯定的)

  • 使用一些基于规则的选择方法从资源文件中选择有效的复数形式。要做到这一点,你只需要知道一点。基本上,您可以自己使用这些选项,也可以选择其他选项,例如包装类,并使用它来选择有效的复数形式。
    偶数列出了可以在C#应用程序中使用的现有包装器,即和


  • 就个人而言,我推荐后一种方法(使用ICU包装器)。您可能希望了解Java中解决方案的类似问题。我相信.Net也是基于同样的想法,只是你会使用
    string.Format()
    而不是
    MessageFormat
    ,你会用.Net的方式阅读资源(不管你喜欢什么风格)。

    在某种程度上你已经回答了你的问题。不应连接字符串。基本上,占位符可以用于数字、日期和动态文本。
    我认为度量单位(本例中的时间)是而不是动态文本

    如何解决这个问题

    我会给你两个想法的基本蓝图。两者都需要使用完整的句子

  • 你可以重新安排句子,这样你就不会有复数的问题,即“这个地方在几年|月|日|小时|分钟前被访问过:{0}”。
    这有明显的缺点,听起来并不自然。虽然我不能给你们一个语言的例子,说明这个概念是行不通的,但这种语言存在的可能性不是零(斯拉夫语不在其中,这是肯定的)

  • 使用一些基于规则的选择方法从资源文件中选择有效的复数形式。要做到这一点,你只需要知道一点。基本上,您可以自己使用这些选项,也可以选择其他选项,例如包装类,并使用它来选择有效的复数形式。
    偶数列出了可以在C#应用程序中使用的现有包装器,即和


  • 就个人而言,我推荐后一种方法(使用ICU包装器)。您可能希望了解Java中解决方案的类似问题。我相信.Net也会基于同样的想法,只是你会使用
    string.Format()
    而不是
    MessageFormat
    ,你会用.Net的方式阅读资源(不管你喜欢什么风格)。

    你的标题拼写错误,而且你没有说明你使用的是什么平台和语言,因此“资源中心”