Преобразование из языковых кодов типа 'fr_FR' в языковые коды ISO 639-2 - PullRequest
3 голосов
/ 01 марта 2011

Мне нужно конвертировать в Java из таких строк, как fr_FR, en_GB, ja_JP (что означает французский, английский и японский язык), в их представления ISO 639-2: fre/fra, eng, jpn.

Знаете ли вы, соответствует ли стиль обозначения fr_FR определенному стандарту? Я ничего не нашел в этом отношении.

Знаете ли вы, как я могу выполнить преобразование из этой нотации в языковые коды ISO 639-2 (трехбуквенные)?

Большое спасибо!

Обновление: я знаю метод getISO3Language (). И я также знаю, что я мог бы построить, перебирая доступные локали, строки вроде fr_FR, а затем сделать сопоставление с 3-буквенным кодом ISO 639-2 - таким образом, всякий раз, когда я ищу 3-буквенный код, я могу найти на карте, которую я построил. Дело в том, что я бы лучше подошел ко мне прямым решением. Извините, что я не объяснил это с самого начала.

Ответы [ 4 ]

5 голосов
/ 10 ноября 2012

Вы можете увидеть стиль записи {language}_{country} в javadoc java.util.ResourceBundle.getBundle (String, Locale, ClassLoader) , так что использование стиля записи будет не таким уж плохим,С другой стороны, также следует отметить, что языковые теги имеют стиль {language}-{country} (не подчеркивание '_', а дефис '-').Подробное описание можно найти в javadoc java.util.Locale .

. Простой способ конвертировать {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>

или загрузите jar nv-i18n из Maven Central Repository напрямую.

Исходный код nv-i18n и javadoc размещены на GitHub.

Источник: https://github.com/TakahikoKawasaki/nv-i18n
Javadoc: http://takahikokawasaki.github.com/nv-i18n/

3 голосов
/ 01 марта 2011

Создайте объект 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 голосов
/ 01 марта 2011

Это слишком долго для комментария, поэтому ...

Знаете ли вы, если стиль записи fr_FR соответствует определенному стандарту? Я не нашел ничего в этом что касается.

Первые две буквы - код языка:

Аргумент языка является допустимым ISO Код языка. Эти коды являются строчные двухбуквенные коды как определяется ISO-639.

Последние две буквы - код страны:

Аргументом страны является действительный ISO Код страны. Эти коды являются прописные двухбуквенные коды как определяется ISO-3166.

Итак, теперь вы нашли что-то в этом отношении, объясняющее, каким стандартам соответствуют эти обозначения.

1 голос
/ 01 марта 2011

Это все обсуждается в документации java.util.Locale.Двухбуквенные коды также взяты из стандартов ISO, и в Locale есть метод getISO3Language (), который делает то, что вы хотите.

...