JDK Локальный класс обработки кодов языка ISO для иврита (и), идиш (yi) и индонезийского (id)
При создании объекта Locale с одним из следующих кодов языков: he, yi и id it не сохраняет свою ценность.
Например:
Locale locale = new Locale("he", "il");
locale.getLanguage(); // -> "iw"
Что вызывает это и есть ли способ обойти это?
Ответ 1
Класс Locale не накладывает никаких проверок на то, что вы его кормите, но он заменяет некоторые коды языков для своих старых значений. Из документация:
ISO 639 не является стабильным стандартом; некоторые из кодов языка (в частности, "iw", "ji" и "in" ) изменились. Эта конструктор принимает как старые коды ( "iw", "ji", так и "in" ), и новые коды ( "he", "yi" и "id" ), но все остальные API в Locale будут возвращает только OLD-коды.
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, поэтому вы не можете его расширять и не имеете определенного интерфейса для реализации. Один из способов сохранить эти коды языков - создать оболочку вокруг этого класса и использовать ее.