Насколько я знаю, единственный способ проверить, является ли данный языковой тег BCP-47 действительным, - это использовать следующую идиому:
private static boolean isValid(String tag) {
try {
new Locale.Builder().setLanguageTag(tag).build();
return true;
} catch (IllformedLocaleException e) {
return false;
}
}
Однако недостатком этого подхода является то, что setLanguageTag
генерирует исключение, которое имеет заметные (в профиле) издержки производительности в рабочих нагрузках, где часто проверяются локали.
Функция setLanguageTag
реализована с использованием sun.util.locale
API, и как насколько я могу судить, это единственное место, где проверяется sun.util.locale.ParseStatus
.
То, что я хотел бы сделать, - это использовать метод, имеющий следующую семантику:
import sun.util.locale.LanguageTag;
import sun.util.locale.ParseStatus;
private static boolean isValid(String tag) {
ParseStatus sts = new ParseStatus();
LanguageTag.parse(tag, sts);
return !sts.isError();
}
Однако проверить локаль вышеуказанным способом невозможно, так как непосредственное использование классов sun.*
, поскольку для экспорта sun.util.locale
из модуля java.base
требуются дополнительные параметры JDK.
Есть ли способ проверки языкового тега без использования частных sun.*
API, при этом совместимый с реализацией sun.util.locale.LanguageTag#parse
?