Разница в инициализации объекта Locale

Есть ли разница между этими двумя способами создания Locale:

Locale uk    = Locale.UK;

Locale en_uk = new Locale("en", "UK");

Единственное отличие, которое я пока заметил, заключается в том, что getDisplayCountry возвращает разные значения. Первое United Kingdom и второе UK , что меня не особо смущает. Есть ли кроме этого какая-нибудь разница? Тем более, что я хотел бы применить первый стиль для других регионов, таких как Германия, Франция, Корея и т. д.

Это потому, что вам нужно использовать GB, а не UK (двухбуквенный код страны ISO 3166 для Соединенного Королевства Великобритании и Ирландии — GB).

Mark Rotteveel 09.07.2024 20:00

Действительно, new java.util.Locale("en", "UK").getISO3Country() выдает исключение.

k314159 09.07.2024 20:07

@MarkRotteveel Возможно, вы захотите повторно опубликовать это как «и Северная Ирландия» — важное различие и деликатная тема!

Basil Bourque 09.07.2024 20:08

Кроме того, чтобы прояснить комментарий @MarkRotteveel, вам понадобится new Locale("en", "GB") (т. е. Locale.UK вполне нормально, и такого понятия, как Locale.GB, не существует).

k314159 09.07.2024 20:10

Спасибо вам всем. Для моего приложения нет большой разницы, Великобритания или Великобритания. Но что я заметил при тестировании, так это то, что если вы хотите изменить язык по умолчанию, то подойдет второй вариант. Например, Locale ca = Locale.CANADA;, где в качестве языка возвращается английский. Итак, если кому-то нужен французский, то второй способ правильный.

wannaBeDev 09.07.2024 20:17

Пропустить константы; используйте Locale.of. Locale.of( "en" , "GB" ) для английского в Великобритании, Locale.of( "en" , "CA" ) для английского в Канаде, Locale.of( "fr" , "CA" ) для французского в Канаде.

Basil Bourque 09.07.2024 20:46

Существуют онлайн-валидаторы, такие как этот, которые сообщат вам, что UK не является допустимым подтегом региона (страны).

andrewJames 09.07.2024 21:06

Кстати, константа Locale.UK по сути такая же, как new Locale("en", "GB") (объясняем разницу для new Locale("en", "UK"))

user85421 09.07.2024 22:17

@BasilBourque Да, я имел в виду Северную Ирландию... Мне следовало скопировать это из Википедии, а не печатать вручную. Думаю, мой разум опережал слова, которые я печатал.

Mark Rotteveel 10.07.2024 09:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вр; доктор

  • Неправильный код страны.
  • Не используйте константы Locale. Используйте Locale.of.
Locale.of( "en" , "GB" )  // For English language, and cultural norms of United Kingdom.

Другие примеры:

  • Locale.of( "en" , "CA" ) для английского в Канаде.
  • Locale.of( "fr" , "CA" ) для французского языка в Канаде.
  • Locale.of( "en" , "US" ) для английского в США.

GB, а не UK

Для ваших целей правильный код страны для Соединенного Королевства Великобритании и Северной ИрландииGB, а не UK, как прокомментировал Марк Роттевел.

КЛДР

Современная Java (9+ ) по умолчанию использует Common Locale Data Repository (CLDR) в качестве основного источника данных локализации. Запись № 827 в CLDR показывает код страны GB для Великобритании.

Стандартные коды стран

В Javadoc for Locale указано, что код страны/региона должен быть:

  • ISO 3166 код страны альфа-2 или…
  • UN M.49 цифровой-3 код города.

Если интересно, выведите дамп на консоль:

Arrays.stream( Locale.getISOLanguages() ).forEach( System.out::println );  // All 2-letter country codes defined in ISO 3166.
Arrays.stream( Locale.getISOCountries() ).forEach( System.out::println );  // All 2-letter language codes defined in ISO 639.

В Javadoc также отмечается, что полный список можно найти в Реестре языковых субтегов IANA с подсказкой по поиску Type: region. Там мы находим запись, в которой нам предлагается использовать GB для Соединенного Королевства.

%%
Type: region
Subtag: GB
Description: United Kingdom
Added: 2005-10-16
Comments: as of 2006-03-29 GB no longer includes the Channel Islands and
  Isle of Man; see GG, JE, IM
%%

Валидатор

Комментарий от andrewJames указывает нам на этот онлайн-валидатор от Кристофа Шнееганса для языкового тега IETF BCP 47 с комбинированным кодом языка и страны.

Здесь мы видим, что en-UK не удается, а en-GB проходит.

Избегайте констант Locale

Вам следует игнорировать константы , определенные в классе Locale, такие как Locale.UK и Locale.CANADA_FRENCH. Их создание было поспешным неудачным дизайнерским решением. Для получения дополнительной информации см. мой более длинный ответ.

Вместо этого в современной Java (19+ ) используйте удобные статические фабричные методы Locale.of.

Locale.UK, Locale.of( "en", "GB")

Посмотрите Locale.of в действии.

Locale locale = Locale.of( "en" , "GB" ) ; 

Мне интересно, где команда Java просила программистов воздерживаться от использования констант Locale? Я не увидел этого ни в этом вопросе, ни в ответах на него.

VGR 10.07.2024 00:03

@VGR Я пытался найти ссылку на это, наткнувшись на нее ранее на этой неделе. Но я потерпел неудачу. Так что я пока удалю это замечание. Спасибо за вопрос. Я нашел старую статью Sun, в которой говорилось: «Вам, вероятно, следует вообще избегать этих статических объектов». Но это было всего лишь мимолетное замечание одного человека, а не общее политическое заявление, которое я имел в виду.

Basil Bourque 10.07.2024 00:47

Другие вопросы по теме