2011-03-01 106 views
3

我需要从Java转换为字符串,如fr_FR,en_GB,ja_JP(意为法语,英语和日语)到其ISO 639-2表示:fre/fra,eng,jpn从'fr_FR'类型的语言代码转换为ISO 639-2语言代码

你知道符号样式fr_FR是否符合某个标准?在这方面我没有发现任何东西。

您知道如何从此表达式转换为ISO 639-2(3个字母)的语言代码?

非常感谢!

更新:我知道方法getISO3Language()。而且我也知道,我可以通过迭代可用语言环境构造像fr_FR这样的字符串,然后使用ISO 639-2 3个字母的代码进行映射 - 因此,无论何时我搜索一个3字母代码,都可以在我建造的地图。事情是,我会更适合我一个更好的直接解决方案。对不起,我从一开始就没有解释过。

回答

2

这太长评论所以...

你知道的符号风格 fr_FR时符合一定的标准呢? 我还没有在这 方面发现任何东西。

前两个字母的语言代码:

语言参数是一个有效的ISO 语言代码。这些代码是由ISO-639定义的 小写双字母代码,即 。

最后两个字母是国家代码:

该国的说法是一个有效的ISO 国家代码。这些代码是 大写双字母代码,由ISO-3166定义为 。

所以现在你已经找到了这方面的一些东西,这解释了这个符号对应的标准。

+1

为了加以说明,en_GB表示在英国使用的英语,fr_FR表示在法国使用的法语。 en_US或en_EN(我永远不会记得哪一个,甚至可能因供应商而异)意味着在美国使用的英语,fr_CA意味着在加拿大使用的法语。 – Rich 2011-03-01 15:14:21

+0

@Rich:用2K +代表你可以修改我的答案,如果你想编辑它:) – Gugussee 2011-03-01 15:21:02

+0

谢谢你们!事实上,该符号是由连接2个符合2个标准的字符串组成的。这个连接肯定不是它自己的标准。 – ovdsrn 2011-03-01 15:24:08

1

这是所有java.util.Locale中的文档中讨论。双字母代码也来自ISO标准,Locale有一个方法getISO3Language(),它可以做你想做的事。

+0

谢谢!我知道这个方法。我更新了我的问题,以更清楚地反映我想要的内容。 – ovdsrn 2011-03-01 15:04:35

5

您可以在java.util.ResourceBundle.getBundle(String, Locale, ClassLoader)的javadoc中看到符号样式{language}_{country},因此使用符号样式不会太差。另一方面,还应该注意的是,语言标记具有{language}-{country}样式(不是下划线'_',而是连字符' - ')。详细说明可在java.util.Locale的javadoc中找到。

一个简单的方法来{language}_{country}转换为ISO 639-2(三字母)代码为new Locale(str.substring(0,2)).getISO3Language(),但似乎你正在寻找类似下面的另一种方式:

String locale = "fr_FR"; 

try 
{ 
    // LanguageAlpha3Code is a Java enum that represents ISO 639-2 codes. 
    LanguageAlpha3Code alpha3; 

    // LocaleCode.getByCode(String) [static method] accepts a string 
    // whose format is {language}, {language}_{country}, or 
    // {language}-{country} where {language} is IS0 639-1 (2-letter) 
    // and {country} is ISO 3166-1 alpha2 code (2-letter) and returns 
    // a LocaleCode enum. LocaleCode.getLanguage() [instance method] 
    // returns a LanguageCode enum. Finally, LanguageCode.getAlpha3() 
    // returns a LanguageAlpha3Code enum. 
    alpha3 = LocaleCode.getByCode(locale).getLanguage().getAlpha3(); 

    // French has two ISO 639-2 codes. One is "terminology" code 
    // (ISO 639-2/T) and the other is "bibliographic" code 
    // (ISO 639-2/B). 2 lines below prints "fra" for ISO 639-2/T 
    // and "fre" for ISO 639-2/B. 
    System.out.println("ISO 639-2/T: " + alpha3.getAlpha3T()); 
    System.out.println("ISO 639-2/B: " + alpha3.getAlpha3B()); 
} 
catch (NullPointerException e) 
{ 
    System.out.println("Unknown locale: " + locale); 
} 

上面的例子可以运行与nv-i18n国际化套餐。如果您正在使用Maven,尝试添加依赖下面你的pom.xml,

<dependency> 
    <groupId>com.neovisionaries</groupId> 
    <artifactId>nv-i18n</artifactId> 
    <version>1.1</version> 
</dependency> 

Maven Central Repository直接下载NV-国际化的罐子。

nv-i18n源代码和javadoc托管在GitHub上。

来源:https://github.com/TakahikoKawasaki/nv-i18n
的Javadoc:http://takahikokawasaki.github.com/nv-i18n/