JDK Локальный класс обработки кодов языка ISO для иврита (и), идиш (yi) и индонезийского (id) - программирование
Подтвердить что ты не робот

JDK Локальный класс обработки кодов языка ISO для иврита (и), идиш (yi) и индонезийского (id)

При создании объекта Locale с одним из следующих кодов языков: he, yi и id it не сохраняет свою ценность.

Например:

Locale locale = new Locale("he", "il");
locale.getLanguage(); // -> "iw"

Что вызывает это и есть ли способ обойти это?

4b9b3361

Ответ 1

Класс Locale не накладывает никаких проверок на то, что вы его кормите, но он заменяет некоторые коды языков для своих старых значений. Из документация:

ISO 639 не является стабильным стандартом; некоторые из кодов языка (в частности, "iw", "ji" и "in" ) изменились. Эта конструктор принимает как старые коды ( "iw", "ji", так и "in" ), и новые коды ( "he", "yi" и "id" ), но все остальные API в Locale будут возвращает только OLD-коды.

Здесь конструктор:

public Locale(String language, String country, String variant) {
    this.language = convertOldISOCodes(language);
    this.country = toUpperCase(country).intern();
    this.variant = variant.intern();
}

И вот волшебный метод:

private String convertOldISOCodes(String language) { 
    // we accept both the old and the new ISO codes for the languages whose ISO 
    // codes have changed, but we always store the OLD code, for backward compatibility 
    language = toLowerCase(language).intern(); 
    if (language == "he") { 
        return "iw"; 
    } else if (language == "yi") { 
        return "ji"; 
    } else if (language == "id") { 
        return "in"; 
    } else { 
        return language; 
    }
}

Объекты, которые он создает, являются неизменными, поэтому нет работы вокруг этого. Класс также final, поэтому вы не можете его расширять и не имеете определенного интерфейса для реализации. Один из способов сохранить эти коды языков - создать оболочку вокруг этого класса и использовать ее.