【问题标题】:How do you handle internationalization for "Your input 'xyz' is excellent!"您如何处理“您的输入'xyz'很棒!”的国际化
【发布时间】:2011-03-19 01:28:41
【问题描述】:

我想知道为添加了运行时数据的语句处理国际化的正确方法是什么。例如 1)您的输入“xyz”非常好! 2) 当您从“Barney and Freinds”切换到“Spongebob”节目时,您已经“4 岁”了。

双引号值是在运行时获得或计算的用户数据。我的平台主要是 Java/Android。西方语言的正确解决方案优于较弱的通用解决方案。

【问题讨论】:

    标签: java android internationalization


    【解决方案1】:

    Java

    要检索本地化文本(消息),请使用java.util.ResourceBundle API。要格式化消息,请使用java.text.MessageFormat API。

    基本上,首先像这样创建一个properties file

    key1 = 您的输入 {0} 非常好!
    key2 = 当您从 {1} 切换到 {2} 节目时,您已经 {0} 岁了。

    {n} 是参数的占位符,您可以通过 MessageFormat#format() 传入。

    然后像这样加载它:

    ResourceBundle bundle = ResourceBundle.getBundle("filename", Locale.ENGLISH);
    

    然后要按键获取消息,请执行以下操作:

    String key1 = bundle.getString("key1");
    String key2 = bundle.getString("key2");
    

    然后格式化它,做:

    String formattedKey1 = MessageFormat.format(key1, "xyz");
    String formattedKey2 = MessageFormat.format(key2, "4 years", "Barney and Friends", "Spongebob");
    

    另见:


    安卓

    对于 Android,该过程更容易。您只需将所有这些String 消息放入res/values/strings.xml 文件中。然后,您可以创建该文件的不同语言版本,并将该文件放在包含语言代码的values 文件夹中。例如,如果您想添加西班牙语支持,您只需创建一个名为res/values-es/ 的文件夹并将您的strings.xml 的西班牙语版本放在那里。 Android 会根据手机的配置自动决定使用哪个文件。

    另见:

    【讨论】:

    • 要明确:您将向您的翻译人员提供字符串Your input '{0}' is excellent",并将翻译(存储在ResourceBundle 中)传递给MessageFormat,然后将{0} 替换为内容你提供。
    • 在 android 上执行此操作的建议方法是按照 BalusC 的建议将字符串放入 res/values-xx/strings.xml 文件中。但您可以使用采用格式字符串的 Context.getString() 版本而不是使用 {0}。 (参见d.android.com/reference/android/content/Context.html)它采用标准的java Formatter 风格的字符串。所以你的价值看起来像“你的输入'%1$s'非常好”
    【解决方案2】:

    一个非技术性的考虑。在许多文化(包括西方文化)中,在英语短语中嵌入免费数据看起来不会很顺利,在这些文化中,您需要在语法上达成一致,例如数量、性别或大小写。更电报的风格通常会有所帮助(例如优秀的输入:“xyz”)——那么至少每个人都会得到同样程度的笨拙!

    【讨论】:

    • 如果您使用参数化占位符,这不是问题。你可以在任何你想要的语法上放置它。
    • 我不认为你明白我在说什么。与大多数西方(和其他)语言相比,英语语法很简单。在用英语编写字符串模板时,可能记得为单数和复数提供替代(“{0} is ...” vs “{0} are ...”),但你是对于初学者,仍然无法满足对名词中不同性别或格使用何种词形的限制。在编写英文原文时要牢记这一点:尽可能以电报形式出现,以免翻译听起来过于错乱。
    • 顺便说一句,@BalusC,您的回答非常正确,而且我们实际上可以做到的最好。我只是建议通过同时处理英文措辞,应用程序可以在其本地化变体中留下更专业的印象。
    • 我明白你的意思。这确实需要仔细考虑。
    • 一个很好的观点。考虑“我爱我的 {pet}”和“我的 {pet} 爱我”。在英语中,如果我用“dog”代替“{pet}”,这两个句子都可以正常工作。但是,如果,比如说,我尝试用拉丁语来做这件事,并将“canis”替换为“Amo {pet} mei”和“{pet} meum amat”......好吧,“canis”是主语形式,所以第二句将工作正常。但在第一句话中我们得到“Amo canis mei”。 “canis”仍然是主语形式,所以这将转化为“I, a dog, love”之类的东西。我们真的很想将其更改为对象形式“canem”。用模板来做这件事并不容易。
    【解决方案3】:

    我认为可能必须定义一个格式字符串以包含“N 中的 1”功能,最好将其定义为使常见情况变得容易(例如复数)。例如,定义 {0#string1/string2/string3} 以在参数 0 为零或小于零时输出 string1,如果恰好为 1,则输出 string2,如果大于 1,则输出 string3}。然后可以说“你的抽屉里有 {0} {0#knives/knife/knives}。”

    【讨论】:

    • 至少,对于西欧语言,我认为不需要二元...(介于单数和复数之间,对于两个对象!)。
    猜你喜欢
    • 1970-01-01
    • 2015-04-08
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多