从'fr_FR'类型语言代码转换为ISO 639-2语言代码

时间:2011-03-01 14:43:02

标签: java localization locale iso

我需要将Java从fr_FRen_GBja_JP(意为法语,英语和日语)等字符串转换为ISO 639-2表示形式:{{ 1}},fre/fraeng

您知道符号样式jpn是否符合某个标准吗?我没有在这方面找到任何东西。

您知道如何将此表示法转换为ISO 639-2(3个字母)语言代码吗?

非常感谢!

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

4 个答案:

答案 0 :(得分:5)

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

{language}_{country}转换为ISO 639-2(3个字母)代码的简单方法是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-i18n的jar。

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

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

答案 1 :(得分:3)

创建一个Locale对象,然后使用getISO3Language()http://download.oracle.com/javase/1.5.0/docs/api/java/util/Locale.html#getISO3Language()

String lang="fr", country="FR", convertedLang;
Locale l = new Locale(lang, country);
convertedLang= l.getISO3Language(); // should be what you're after

答案 2 :(得分:2)

这对于评论来说太长了......

  

你知道是否有符号样式   fr_FR是否符合某个标准?   我在这里找不到任何东西   方面。

前两个字母是语言代码:

  

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

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

  

country参数是有效的ISO   国家代码。这些代码是   大写,双字母代码为   由ISO-3166定义。

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

答案 3 :(得分:1)

这在java.util.Locale的文档中都有讨论。两个字母的代码也来自ISO标准,Locale有一个方法getISO3Language()可以满足您的需求。