Посмотрите на класс java.util.ResourceBundle
, в основном метод getBundle()
. (Вы можете использовать это или реализовать подобный механизм самостоятельно.)
В принципе, у вас есть иерархия локалей, и всякий раз, когда локаль специально не поддерживается, вы возвращаетесь к родительской локали. В вашем случае "ja_JP"
(в нотации Java) имеет родительский языковой стандарт "ja"
, который, в свою очередь, имеет родительский языковой стандарт ""
.
Поскольку большинство японских страниц не относятся к Японии, вы обычно выполняете весь перевод на японский язык для ja
, и только если для японских пользователей в Японии действует только что-то особенное, дополнительно укажите ja_JP
. Тогда у вас также не будет проблем, если какой-то пользователь отправит jp_US
, поскольку он использует японский в США.
Если вы хотите использовать механизм Java ResourceBundle только для указания, для каких локалей у нас есть данные, вы можете создать (например) эти (пустые) файлы:
- MyLocale.properties - соответствует "" Locale
- MyLocale_de.properties - соответствует локали "de" (немецкий)
- MyLocale_en.properties - соответствует локали "en" (английский)
- MyLocale_ja.properties - соответствует локали "ja" (японский)
Тогда в вашей программе вы бы написали
Locale rLocale = request.getLocale();
ResourceBundle bundle = ResourceBundle.getBundle("MyLocale", rLocale);
Locale selectedLocale = bundle.getLocale();
Теперь selectedLocale определенно является одним из "", "de", "en", "jp", независимо от того, какой была локаль rLocale. Например, для «en», «en_GB», «en_US» во всех случаях будет выбрано «en», «ja» и «ja_JP» приведут к «ja», тогда как «de_DE» и «de_AT» будут оба приводят к "de", а "it_IT", "eo" и большинству других локалей приводят к "".
«Правильный путь Java» для этого:
Вы не спросите свой пакет о его Locale, а просто используете его как ResourceBundle, беря из него локализованные ресурсы. Итак, когда вам нужен текст, вы делаете
String text = bundle.getText("greeting.hello");
и затем выведите текст. Иногда вы должны использовать MessageFormat для форматирования текста со вставленными значениями (или Formatter). (Тогда ваши файлы свойств, конечно, не будут пустыми, но будут содержать такие строки:
greeting.hello = Hello World!
(в английском файле)
greeting.hello = Hallo Welt!
(в немецком файле)
Обратите внимание, что часто браузер отправляет не только один код локали, но и список предпочтительных. Таким образом, на самом деле вы должны выполнить этот «поиск по пакетам» для каждого из этих кодов и взять первый, который действительно возвращает что-то отличное от «», и возвращаться к «» только тогда, когда не найдено ни одного запрошенного языка. (Например, мой браузер отправляет «eo», «de_DE», «de», «en». Поскольку большинство веб-сайтов не поддерживают эсперанто, они обращаются к немецкому (если доступно и выбор реализован правильно), или к язык по умолчанию (если они смотрят только на первую запись)).