Проверка языкового тега BCP-47 с использованием Java API - PullRequest
1 голос
/ 22 марта 2020

Насколько я знаю, единственный способ проверить, является ли данный языковой тег 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...