【发布时间】:2011-03-19 01:28:41
【问题描述】:
我想知道为添加了运行时数据的语句处理国际化的正确方法是什么。例如 1)您的输入“xyz”非常好! 2) 当您从“Barney and Freinds”切换到“Spongebob”节目时,您已经“4 岁”了。
双引号值是在运行时获得或计算的用户数据。我的平台主要是 Java/Android。西方语言的正确解决方案优于较弱的通用解决方案。
【问题讨论】:
标签: java android internationalization
我想知道为添加了运行时数据的语句处理国际化的正确方法是什么。例如 1)您的输入“xyz”非常好! 2) 当您从“Barney and Freinds”切换到“Spongebob”节目时,您已经“4 岁”了。
双引号值是在运行时获得或计算的用户数据。我的平台主要是 Java/Android。西方语言的正确解决方案优于较弱的通用解决方案。
【问题讨论】:
标签: java android internationalization
要检索本地化文本(消息),请使用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} 替换为内容你提供。
一个非技术性的考虑。在许多文化(包括西方文化)中,在英语短语中嵌入免费数据看起来不会很顺利,在这些文化中,您需要在语法上达成一致,例如数量、性别或大小写。更电报的风格通常会有所帮助(例如优秀的输入:“xyz”)——那么至少每个人都会得到同样程度的笨拙!
【讨论】:
我认为可能必须定义一个格式字符串以包含“N 中的 1”功能,最好将其定义为使常见情况变得容易(例如复数)。例如,定义 {0#string1/string2/string3} 以在参数 0 为零或小于零时输出 string1,如果恰好为 1,则输出 string2,如果大于 1,则输出 string3}。然后可以说“你的抽屉里有 {0} {0#knives/knife/knives}。”
【讨论】: