Есть ли разница между этими двумя способами создания Locale
:
Locale uk = Locale.UK;
Locale en_uk = new Locale("en", "UK");
Единственное отличие, которое я пока заметил, заключается в том, что getDisplayCountry
возвращает разные значения. Первое United Kingdom
и второе UK
, что меня не особо смущает. Есть ли кроме этого какая-нибудь разница? Тем более, что я хотел бы применить первый стиль для других регионов, таких как Германия, Франция, Корея и т. д.
Действительно, new java.util.Locale("en", "UK").getISO3Country()
выдает исключение.
@MarkRotteveel Возможно, вы захотите повторно опубликовать это как «и Северная Ирландия» — важное различие и деликатная тема!
Кроме того, чтобы прояснить комментарий @MarkRotteveel, вам понадобится new Locale("en", "GB")
(т. е. Locale.UK
вполне нормально, и такого понятия, как Locale.GB
, не существует).
Спасибо вам всем. Для моего приложения нет большой разницы, Великобритания или Великобритания. Но что я заметил при тестировании, так это то, что если вы хотите изменить язык по умолчанию, то подойдет второй вариант. Например, Locale ca = Locale.CANADA;
, где в качестве языка возвращается английский. Итак, если кому-то нужен французский, то второй способ правильный.
Пропустить константы; используйте Locale.of
. Locale.of( "en" , "GB" )
для английского в Великобритании, Locale.of( "en" , "CA" )
для английского в Канаде, Locale.of( "fr" , "CA" )
для французского в Канаде.
Существуют онлайн-валидаторы, такие как этот, которые сообщат вам, что UK
не является допустимым подтегом региона (страны).
Кстати, константа Locale.UK
по сути такая же, как new Locale("en", "GB")
(объясняем разницу для new Locale("en", "UK")
)
@BasilBourque Да, я имел в виду Северную Ирландию... Мне следовало скопировать это из Википедии, а не печатать вручную. Думаю, мой разум опережал слова, которые я печатал.
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 указано, что код страны/региона должен быть:
Если интересно, выведите дамп на консоль:
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 Я пытался найти ссылку на это, наткнувшись на нее ранее на этой неделе. Но я потерпел неудачу. Так что я пока удалю это замечание. Спасибо за вопрос. Я нашел старую статью Sun, в которой говорилось: «Вам, вероятно, следует вообще избегать этих статических объектов». Но это было всего лишь мимолетное замечание одного человека, а не общее политическое заявление, которое я имел в виду.
Это потому, что вам нужно использовать GB, а не UK (двухбуквенный код страны ISO 3166 для Соединенного Королевства Великобритании и Ирландии — GB).