2011-12-09 37 views
2

我有一个字符串,其中包含如下所示的名称列表: “John问Kim,Kelly,Lee和Bob关于新年计划”。列表中的名字数量可以非常多。 我怎样才能在Java中本地化? 我在考虑ResourceBundle和MessageFormat。我将如何在MessageFormat中为此编写模式? 有没有更好的方法?本地化一个包含名称列表的字符串

+0

你能举一个例子,说明字符串对于不同的本地化来说会是什么样子? –

+0

我的问题更多的是与格式(将名称动态插入本地化的字符串模式)。类似于“{1}询问{2}和{3}关于新年计划' –

回答

2

你可以这样做:

"{0} asked {1} about the new year plans" 

其中0是第一个名字,1是一个逗号分隔的其他名称的列表。

希望这会有所帮助。

+0

{1}不能是逗号分隔列表,它应该在姓氏前包含'和'。还有'和'需要进行本地化。 –

+1

然后,如果只有一个人,或者“{0}和{1}”,则需要基于人数由另一格式化程序构建“1”:“{0}”(或无格式)当多于一个时--0成为除最后一个人以外的所有人的逗号分隔列表,1是最后一个人。 – cjstehno

1

对于本地化,常规方法是使用外部语言包,它是一个文件,其中包含要显示的文本,为每个文本分配一个名称/键,然后通过键在程序中加载文本。

0

你可以在你的资源包(用于国际化)用的MessageFormat(以取代名称占位符)结合起来:“{0}要求{1}对新的一年的计划”

这将是由你来但是,事先准备好名字。

2

我看到一个答案已被接受,我只是在这里添加这个作为替代。的代码已经硬编码值的数据,而是仅意味着呈现可以细化一个想法:

MessageFormat people = new MessageFormat("{0} asked {1,choice,0#no one|1#{2}|2#{2} and {3}|2<{2}, and {3}} about the new year plans"); 
String john = "John"; 
Object[][] parties = new Object[][] { {john, 0}, {john, 1, "Kim"}, {john, 2, "Kim", "Kelly}, {john, 4, "Kim, Kelly, Lee", "Bob"}}; 
for (final Object[] strings : parties) { 
    System.out.println(people.format(strings)); 
} 

此输出以下:

John asked no one about the new year plans 
John asked Kim about the new year plans 
John asked Kim and Kelly about the new year plans 
John asked Kim, Kelly, Lee, and Bob about the new year plans 

确定所使用的名称数对于第二个参数并为第三个参数创建逗号分隔的字符串不会显示在该示例中,但可以轻松完成而不是使用我使用的硬编码值。

11

本地化(内联)列表不仅仅是翻译单词“和”。CLDR处理格式化列表的问题,请查看他们的page on lists。恐怕ICU还没有支持,所以你可能需要单独编码。

另一个问题是,你不能指望能够像这样的句子中使用名称。例如,许多语言都要求对象处于倾斜的形式。在芬兰语中,你的例句应该是“John kysyiKimiltä,Kellyltä,Leeltäja Bobilta uudenvuoden suunnitelmista”。因此,你可能需要找出并包含名称的不同倾斜形式。此外,如果使用的语言没有拉丁字母,您可能需要音译形式的名称(例如,阿拉伯语,约翰是جون)。还有其他问题。在俄语中,与“问”相对应的动词取决于受试者的性别(例如,спросила与спросил)。

我知道这听起来很复杂,但本地化通常很复杂。如果只针对一组有限的语言,事情会变得更容易,所以定义目标很重要 - 可能会接受一些可能导致语法错误表达式的简化。但是对于涵盖各种语言的本地化,您可能需要将生成函数进行本地化。也就是说,对于每种语言,您都可以使用一个函数,该函数接受一个名称列表作为参数,并返回一个表示该语句的字符串,可能使用包含关于专有名称的信息(音译形式,不同倾向形式,性别)的资源文件出现。

在某些情况下,您甚至可能会考虑用英语生成该句子,然后将其发送给在线翻译人员。例如,谷歌翻译可以处理我提到的一些问题。它肯定会产生很多错误的翻译,但对于语法结构非常简单的句子,如果您可以接受一些错误,它可能是一个实用的解决方案。如果您考虑尝试此操作,请确保您充分测试自动翻译器如何处理您将使用的特定句子。通常你可以通过重新构造句子来改善结果。将一个句子分成几个句子通常是有帮助的。但即使你的简单句子在自动翻译中也会出现问题。

如果您可以重新构造句子结构,例如:这样所有的名词都会出现在主题位置,并且避免了像“新年计划”这样的“包装”表达。例如,“约翰问金,凯利,李和鲍勃对新年有什么计划”会更简单,既用于自动翻译,也用于基于模式的本地化。

+2

ICU版本50和更高版本为此(ListFormatter)提供了一个API。请参阅http://site.icu-project.org/download/50:“将Java util.ListFormat更改为text.ListFormatter和其他更新,使用CLDR数据(#9369,#9420),将端口转换为C++(#7168)” – Fredrik

+0

@Fredrik,ListFormatter旨在处理列表中的标点符号(例如“A,B和C”与“A,B和C”)以及“和”的单词。在问句中定位句子时还有许多其他问题。 –

+0

我知道它做了什么;我的评论是澄清了“我恐怕ICU在这方面还没有支持”这一点。 ListFormatter是您提到的CLDR数据的API。 – Fredrik

相关问题