Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java或Groovy中为多种语言获取数字的序号后缀_Java_Grails_Localization_Groovy - Fatal编程技术网

如何在Java或Groovy中为多种语言获取数字的序号后缀

如何在Java或Groovy中为多种语言获取数字的序号后缀,java,grails,localization,groovy,Java,Grails,Localization,Groovy,我正在建立一个多语言的grails网站,我需要获得几种语言的数字后缀,如英语、法语、西班牙语、德语和意大利语 我相信这个问题对于多语言网站的所有者来说是很常见的。我发现这提供了一个解决方案,但它只是英语 例如: /** *@value number *@locale Current locale *@returns ordinal suffix for the given number **/ public static String getOrdinalFor(int value, L

我正在建立一个多语言的grails网站,我需要获得几种语言的数字后缀,如英语、法语、西班牙语、德语和意大利语

我相信这个问题对于多语言网站的所有者来说是很常见的。我发现这提供了一个解决方案,但它只是英语

例如:

/**
 *@value number 
 *@locale Current locale
 *@returns ordinal suffix for the given number
**/
public static String getOrdinalFor(int value, Locale locale) 
将给出以下结果:

 assert getOrdinalFor(1, Locale.ENGLISH) == "st"
 assert getOrdinalFor(1, Locale.FRENCH) == "er"
 assert getOrdinalFor(2, Locale.ENGLISH) == "nd"
 assert getOrdinalFor(3, Locale.ENGLISH) == "rd"
 assert getOrdinalFor(4, Locale.ENGLISH) == "th"
 assert getOrdinalFor(4, Locale.FRENCH) == "ème"

您知道一个库(Java或Groovy)可以帮助您做到这一点吗?或者你知道实现它的算法吗?

我认为在许多语言中,这种方法是不可能的,因为他们根本没有序数的概念,序数可以由一个数字和一些字母作为扩展名组成。对于“1st”,即德语,您只能根据所编号的类别写“1.”或“erster”/“erste”/“erstes”。

我不知道有任何库,但最好的算法可能是在
地图中掌握所有可能的数字/地区/序号

对于未被地图覆盖的其他数字,可以考虑倒计时直到在地图中找到匹配(因此请求序号为例如<代码> 5 /代码>或更高)将返回序号为<代码> 4 (下一次下一次匹配):

公共静态字符串getOrdinalFor(int值、区域设置){
映射序号=空;
对于(int i=value;i>0&(ordinal==null | | |!ordinal.containsKey(locale));i--){
序数=序数.get(i);
}
返回序号!=null?序号.get(区域设置):null;//或其他默认值?
}

除非你能在每种语言中应用一条规则,否则试图回避复杂的语言问题是很常见的。你不仅要考虑数字和序数,而且要考虑它出现的上下文,甚至句子内的位置如何影响翻译。 这样的资源更容易翻译,而不是试图写“第一名”:

#easyToTranslate_en.properties
label.position=Position: {0,number,integer}
根据您试图做的事情,您可能会选择以下解决方案:

#compromise_en.properties
label.position.first=1st place
label.position.second=2nd place
label.position.third=3rd place
label.position.default=Position: {0,number,integer}
这需要读取资源的代码执行案例测试,以选择要加载的资源。

int index=2;
int index = 2;
ChoiceFormat choiceFormat = new ChoiceFormat("1#st | 2#nd | 3#rd | 20<th");
String output = index + choiceFormat.format(index);

ChoiceFormat ChoiceFormat=new ChoiceFormat(“1#st | 2 | nd | 3 | rd | 20给定您的解决方案,您如何处理以下数字:2900932?它只会返回
th
。OP当然也只能从数字中选择最新的数字来获取顺序。哈希图中所有可能的数字?那将是一张大地图!”在地图中找到匹配之前,可以考虑倒计时。"->这将无法正常工作。例如:您本应添加23。如果您想要24的正确值,您也必须添加24,但如果您想要33的正确值,则必须再次添加。对于34、43、44,…@BalusC,相同:对于2900932,其“nd”,但是对于2900912,其“th”,则只需相应地更改代码。我至少给出了t他提出了一个基本的开始。这并不意味着我们都要为其他人制定一个全面的解决方案。这是他自己的问题/要求,而不是我们的。我至少不会阻止你这么做:)或“ersten”取决于句子结构。我同意这很复杂。也许所有语言都不可能。但对于英语、西班牙语、法语和德语等西方语言,我确信这是可能的(而且实现起来并不困难)。令人惊讶的是,AFAIK中没有任何库可以部分解决这种常见情况……是的,如果可以的话,尽量避开这个要求。你到底需要这些后缀做什么?一旦你超过了1、2和3,你真的需要额外的吗?我所研究的多语言系统只是让所有的字符串都由人类翻译,如果我们使用序数,它将被视为字符串。因此,由于每个字符串的翻译成本都发生了变化,以确保我们只使用必要的内容。我惊讶地发现,我们可以用许多国际符号来代替字符串。
#easyToTranslate_en.properties
label.position=Position: {0,number,integer}
#compromise_en.properties
label.position.first=1st place
label.position.second=2nd place
label.position.third=3rd place
label.position.default=Position: {0,number,integer}
int index = 2;
ChoiceFormat choiceFormat = new ChoiceFormat("1#st | 2#nd | 3#rd | 20<th");
String output = index + choiceFormat.format(index);