[英]Is there an elegant way to convert ISO 639-2 (3 letter) language codes to Java Locales?
[英]Convert from 'fr_FR' type language codes to ISO 639-2 language codes
我需要將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字母的代碼時,我可以在我構建的地圖。 問題是我會更好地為我提供直接的解決方案。 對不起,我從一開始就沒有解釋過這個。
您可以在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/
創建一個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
這個評論太長了所以......
你知道符號樣式fr_FR是否符合某個標准嗎? 我沒有在這方面找到任何東西。
前兩個字母是語言代碼:
語言參數是有效的ISO語言代碼。 這些代碼是ISO-639定義的小寫雙字母代碼。
最后兩個字母是國家代碼:
country參數是有效的ISO國家/地區代碼。 這些代碼是ISO-3166定義的大寫雙字母代碼。
所以現在你已經找到了這方面的東西,這解釋了這種符號對應的標准。
這一切都在java.util.Locale的文檔中討論過。 雙字母代碼也來自ISO標准,而Locale有一個方法getISO3Language()可以滿足您的需求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.