Java Locale(java.util.Locale) представляет собой объект, который содержит информацию о конкретном географическом, политическом или культурном регионе, поэтому этот объект полезен для целей интернационализации.
Узнайте о локализации и интернационализации в Java с использованием класса Locale. Научитесь создавать объекты Locale и использовать их для форматирования даты, числа, валюты и сообщений.
1. Введение в локаль
Нам нужно будет работать с Java Locale api, когда мы захотим отображать числа, даты и время удобным для пользователя способом, соответствующим языковым и культурным ожиданиям наших клиентов. В Java класс java.util.Locale представляет определенный язык и регион мира.
Если класс изменяет свое поведение в зависимости от Locale, говорят, что он чувствителен к locale. Вот некоторые из классов, чувствительных к locale, определенных в Java:
- DateFormat или DateTimeFormatter: правила форматирования информации о дате и времени
- NumberFormat или DecimalFormat: правила форматирования чисел
- MessageFormat: правила форматирования строковых сообщений
Объект Locale логически состоит из таких полей, как язык, сценарий, страна, вариант и расширения.
//Locale enUsLocale = new Locale("EN", "US"); // Deprecated in Java 19Locale enUsLocale = Locale.of("EN", "US"); // Since Java 19System.out.println(enUsLocale.toLanguageTag()); //en-USSystem.out.println(enUsLocale.getDisplayName()); //English(United States)System.out.println(enUsLocale.getDisplayLanguage()); //EnglishSystem.out.println(enUsLocale.getDisplayCountry()); //United States
Для использования Locale его экземпляр передается компонентам приложения, которым необходимо локализовать свои действия, например, анализ ввода, форматирование вывода или другие внутренние операции. Класс Locale не предоставляет методов для выполнения каких-либо задач интернационализации или локализации самостоятельно.
2. Создание экземпляра локали
Экземпляр локали можно создать следующими способами:
2.1 Встроенные константы
Это самый простой вариант, использующий предопределенные константы в классе Locale. Например, Locale.US. Обратите внимание, что когда locale создается таким образом, то часть Locale, относящаяся к региону, не определена.
Итак, оба утверждения по сути равны:
//Region is missing in both casesLocale usLocale = Locale.US; //1Locale usLocale = new Locale.Builder().setLanguage("en").build(); //2
Программа Java для отображения валюты и времени в локали США.
Локаль usLocale = Локаль.США;длинное число = 123456789L;NumberFormat nf = NumberFormat.getInstance(usLocale);System.out.println( nf.format(число) ); //123,456,789Текущая дата = новая Дата();DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, usLocale);System.out.println( df.format(now) ); //19 июля 2016 г. 12:43:12 PM IST
2.2 Конструкторы локалей(устарели в Java 19)
В классе Locale доступны три конструктора:
- Локаль(язык строк)
- Локаль(язык строки, страна строки)
- Локаль(язык строки, страна строки, вариант строки)
Locale usLocale = new Locale("en");//orLocale usLocale = new Locale("en", "US");
2.3. Методы Locale.of() [Начиная с Java 19]
Начиная с JDK 19, три конструктора Locale устарели, и вместо них мы можем полагаться на три статических метода of().
Эквивалент предыдущего кода с использованием метода of():
Locale ro = Locale.of("en");Locale ro = Locale.of("en", "US");
2.4. Locale.Builder
Служебный класс Locale.Builder можно использовать для создания объекта Locale, соответствующего синтаксису IETF BCP(Best Common Practices) 47.
Этот метод вернет ошибку java.util.IllformedLocaleException, если его аргумент не является правильно сформированным элементом стандарта BCP 47.
Locale usLocale = new Locale.Builder().setLanguage("en").setRegion("US").build();
2.5. Метод Locale.forLanguageTag() Factory
Если у вас есть строка тега языка, соответствующая стандарту IETF BCP 47, вы можете использовать фабричный метод forLanguageTag(String).
Locale usLocale = Locale.forLanguageTag("en-US");
Это может быть особенно полезно для представления сложных тегов, таких как китайский язык, мандаринский диалект, упрощенный шрифт, «zh-cmn-Hans-CN».
Locale locale = Locale.forLanguageTag("zh-cmn-Hans-CN");
2.6. Диапазоны языков
Java поддерживает языковые диапазоны, что означает, что мы можем определить набор языковых тегов, которые разделяют некоторые определенные атрибуты. Например, «de-*» представляет языковой диапазон для распознавания немецкого языка в любом регионе.
Locale.LanguageRange lr = new Locale.LanguageRange("de-*", 1.0);
Конструктор Locale.LanguageRange() принимает два аргумента: диапазон языка и его вес(1.0, 0.5, 0.0). Вес показывает предпочтения пользователя(1.0 наивысший, 0.0 наименьший) и полезен для определения списков приоритетов.
Например, мы предпочитаем кастильский испанский(Испания) мексиканскому испанскому, а не бразильскому португальскому):
String rangeString = "es-ES;q=1.0,es-MX;q=0.5,pt-BR;q=0.0";List<Locale.LanguageRange> priorityList = Locale.LanguageRange.parse(rangeString);
3. Установка локали по умолчанию
Хотя можно задать Locale во всех классах, чувствительных к локали, во время выполнения, но если мы можем задать Locale по умолчанию для каждого пользовательского запроса при запуске(или Locale, специфичную для приложения), то нам не нужно будет устанавливать Locale для каждого чувствительного к локали объекта в коде приложения, и, таким образом, мы сможем избежать множества строк кода, а значит, и меньшего количества дефектов.
3.1 Использование Locale.setDefault()
Используйте метод Locale.setDefault(), чтобы задать экземпляр Locale, который все классы, чувствительные к локали, будут использовать по умолчанию.
Locale.setDefault(Locale.FRANCE);
3.2 Установка категорий локали
Это вполне возможно для использования смешанных правил форматирования локали. Класс Locale также позволяет нам устанавливать локаль по умолчанию для двух разных категорий, по отдельности.
Категории локалей представлены перечислением Locale.Category:
- Locale.Category.DISPLAY – для пользовательского интерфейса приложения, например, сообщений о пакетах ресурсов.
- Locale.Category.FORMAT – для форматирования даты, числа и валюты в зависимости от конкретной региональной информации
Locale.setDefault(Locale.Category.DISPLAY, Locale.US);Locale.setDefault(Locale.Category.FORMAT, Locale.FR);
4. Использование локали
4.1 Использование ResourceBundle
Программа Java для получения локализованных сообщений из пакета ресурсов. Не забудьте создать файлы свойств, специфичные для локали, и файл свойств по умолчанию.
- свойства.сообщений.об.ошибках
- error.messages_en.свойства
- error.messages_es.properties и т.д.
Locale locale = new Locale("en", "US");ResourceBundle labels = ResourceBundle.getBundle("error.messages", locale);System.out.println(labels.getString("resource.not.found"));
4.2 Использование DateFormat
Программа Java для преобразования формата даты в локальный шаблон отображения.
Locale locale = new Locale("en", "US");DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);System.out.println( df.format(new Date()) ); //February 24, 2022 at 10:13:01 PM IST
4.3 Использование числового формата
Аналогично мы можем форматировать числа в соответствии с региональными настройками.
NumberFormat nf = NumberFormat.getInstance(locale);System.out.println(nf.format(123456789L)); //123,456,789
Давайте рассмотрим пример форматирования числа в виде валюты.
NumberFormat cf = NumberFormat.getCurrencyInstance(locale);String currency = cf.format(123.456);System.out.println(currency); //$123.46
Ресурсы: