4

我需要在 Java 中将诸如fr_FR, en_GB, ja_JP(表示法语、英语和日语)之类的字符串转换为它们的 ISO 639-2 表示形式:fre/fra, eng, jpn.

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

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

非常感谢!

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

4

4 回答 4

6

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

转换{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/

于 2012-11-10T19:45:39.723 回答
3

评论太长了,所以...

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

前两个字母是语言代码:

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

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

country 参数是有效的 ISO 国家代码。这些代码是 ISO-3166 定义的大写的两个字母代码。

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

于 2011-03-01T15:10:34.253 回答
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
于 2011-03-01T14:54:14.910 回答
1

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

于 2011-03-01T14:54:51.230 回答