Поиск…


замечания

Java поставляется с мощным и гибким механизмом для локализации ваших приложений, но также легко злоупотреблять и завершать работу с программой, которая игнорирует или изменяет локаль пользователя, и, следовательно, как они ожидают, что ваша программа будет вести себя.

Ваши пользователи ожидают увидеть данные, локализованные в форматах, к которым они привыкли, и попытка поддерживать это вручную - это безумное поручение. Вот лишь небольшой пример того, как пользователи ожидают увидеть контент, который вы можете предположить, «всегда» отображается определенным образом:

Даты чисел Местная валюта Иностранная валюта Расстояния
Бразилия
Китай
Египет
Мексика 20/3/16 1.234,56 $ 1,000.50 1,000.50 USD
Соединенное Королевство 20/3/16 1,234.56 £ 1,000.50 100 км
Соединенные Штаты Америки 3/20/16 1,234.56 $ 1,000.50 1,000.50 MXN 60 миль

Общие ресурсы

Ресурсы Java

Автоматически отформатированные даты с использованием «locale»

SimpleDateFormatter отлично подходит, но, как и название, он не очень хорошо масштабируется.

Если вы внедрили "MM/dd/yyyy" всем своем приложении, ваши международные пользователи не будут счастливы.

Пусть Java сделает для вас работу

Используйте static методы в DateFormat чтобы получить правильное форматирование для вашего пользователя. Для настольного приложения (где вы будете полагаться на локаль по умолчанию ) просто вызовите:

String localizedDate = DateFormat.getDateInstance(style).format(date);

Где style - одна из констант форматирования ( FULL , LONG , MEDIUM , SHORT и т. Д.), Указанных в DateFormat .

Для приложения на стороне сервера, где пользователь указывает свой локаль как часть запроса, вы должны передать его явно в getDateInstance() :

String localizedDate =
    DateFormat.getDateInstance(style, request.getLocale()).format(date);

Сравнение строк

Сравните два случая игнорирования строк:

"School".equalsIgnoreCase("school"); // true

Не использовать

text1.toLowerCase().equals(text2.toLowerCase());

Языки имеют разные правила для преобразования верхнего и нижнего регистров. «I» будет преобразован в «i» на английском языке. Но на турецком языке «я» становится «ı». Если вам нужно использовать toLowerCase() используйте перегрузку, String.toLowerCase(Locale) Locale : String.toLowerCase(Locale) .

Сравнение двух строк, игнорирующих незначительные отличия:

Collator collator = Collator.getInstance(Locale.GERMAN);
collator.setStrength(Collator.PRIMARY);
collator.equals("Gärten", "gaerten"); // returns true

Сортировка строк в соответствии с порядком естественного языка, игнорируя регистр (используйте ключ сопоставления для:

String[] texts = new String[] {"Birne", "äther", "Apfel"};
Collator collator = Collator.getInstance(Locale.GERMAN);
collator.setStrength(Collator.SECONDARY); // ignore case
Arrays.sort(texts, collator::compare); // will return {"Apfel", "äther", "Birne"}

место действия

Класс java.util.Locale используется для представления «географического, политического или культурного» региона для локализации данного текста, числа, даты или операции. Таким образом, объект Locale может содержать страну, регион, язык, а также вариант языка, например диалект, произнесенный в определенном регионе страны, или разговариваемый в другой стране, чем страна, из которой происходит этот язык.

Экземпляр Locale передается компонентам, которые должны локализовать свои действия, независимо от того, преобразует ли он вход, выход или просто нуждается в его внутренних операциях. Класс Locale не может выполнять какую-либо интернационализацию или локализацию самостоятельно

язык

Язык должен быть ISO 639 2 или 3 символьным языковым кодом или зарегистрированным языковым subtag длиной до 8 символов. В случае, если на языке есть код с кодом 2 и 3 символа, используйте 2 символьный код. Полный список кодов языков можно найти в реестре субтега языка IANA.

Коды языков нечувствительны к регистру, но класс Locale всегда использует строчные версии кодов языков

Создание локали

Создание экземпляра java.util.Locale можно выполнить четырьмя различными способами:

Locale constants
Locale constructors
Locale.Builder class
Locale.forLanguageTag factory method 

Java ResourceBundle

Вы создаете экземпляр ResourceBundle следующим образом:

Locale locale = new Locale("en", "US");
ResourceBundle labels = ResourceBundle.getBundle("i18n.properties");
System.out.println(labels.getString("message"));

У меня есть файл i18n.properties :

message=This is locale

Выход:

This is locale

Настройка локали

Если вы хотите воспроизвести состояние с использованием других языков, вы можете использовать setDefault() . Его использование:

 setDefault(Locale.JAPANESE); //Set Japanese


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow