Java Language
Локализация и интернационализация
Поиск…
замечания
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
- Учебник по Java: интернационализация
- Oracle: интернационализация: понимание языка в платформе Java
- JavaDoc:
Locale
Автоматически отформатированные даты с использованием «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