Форматировать валюту на языке независимо от страны - PullRequest
1 голос
/ 27 сентября 2011

Я хочу отформатировать сумму денег (в евро) на языке пользователя на Java независимо от страны, в которой находится пользователь:

final NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(loc);
currencyFormat.setCurrency(EUR);
currencyFormat.format(new BigDecimal("1.99"));

Однако выходные данные для разных входных локалей (loc) выглядят следующим образом:

  • nl_NL: € 1,99
  • nl_BE: 1,99 €
  • nl_DE: EUR 1,99
  • nl (new Locale("nl")): EUR 1,99

Итак, у меня две проблемы

  • Результат зависит от страны, а не только от языка (как показывают первые 2), но страна не должна иметь для меня значения. В мою игру можно играть, например, на голландском, путешествуя по Африке.
  • При использовании локали без страны или со страной, которая не соответствует языку (второй 2), символ валюты не печатается.

Обратите внимание, что я разрабатываю интерфейс оплаты для игры, поэтому языковой стандарт nl_DE означает, что интерфейс и валюты должны отображаться на голландском языке, но он показывает только способы оплаты, доступные в Германии.

Ответы [ 4 ]

1 голос
/ 27 сентября 2011

Я не совсем уверен, чем вы занимаетесь, но, похоже, у вас есть, скажем, веб-приложение, и вам нужны отдельные кусочки информации о языке и стране. Хорошо, позвольте мне уточнить, что:

  1. Чтобы правильно отформатировать сумму, которую вы платите, вам на самом деле нужны и язык, и страна, то есть локаль, поскольку именно она определяет соответствующий формат.
  2. Чтобы предложить правильную платежную систему, вам нужен только страновой пользователь, в настоящее время расположенный.
  3. Для отображения соответствующих переводов вам нужен только язык (по крайней мере, вы так думаете).

Теперь о том, как это сделать. Самым простым способом было бы создать какой-то профиль пользователя и позволить пользователю выбирать, какие будут лучшие локали для форматирования, что для перевода и какие платежные системы он хочет использовать. Если вы разрабатываете какую-то веб-игру, вы можете читать Locales из заголовков HTTP Accept-Language (вам действительно нужно установить хорошие значения по умолчанию, и это лучшее место для поиска такой информации). Чтобы «отделить» язык от страны, все, что вам нужно, это прочитать язык и код страны из локали, что так просто:

Locale locale = request.getLocale(); // the most acceptable Locale using Servlet API
String language = locale.getLanguage(); // gets language code
String country = locale.getCountry(); // gets country code

Теперь языка часто недостаточно для чтения текстов из комплектов ресурсов, поскольку существуют локали (например, zh_CN, zh_TW), для которых фактический язык различается в зависимости от страны (в приведенном выше примере упрощенный китайский язык используется на материковой части Китая как так же как в Сингапуре, тогда как весь другой говорящий по-китайски мир использует традиционный китайский). Поэтому вам по-прежнему нужен реальный язык.

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

Это отвечает на ваш вопрос, или я что-то не так понял??

1 голос
/ 27 сентября 2011

Мне не ясно, что вы подразумеваете под языком, независимо от страны. Само наименование валюты, очевидно, не зависит от языка и страны, но соглашения о форматировании зависят от культуры, а не от языка. Как правило, мы привязываем эти вещи к чему-то кроме локальных настроек машины в наших приложениях, потому что всегда есть проблемы с тем же языком, используемым в разных культурах - например, Испания использует 9,999,99, а Мексика - 9,999,99, но оба (номинально) говорят на испанском языке. И, конечно же, тот факт, что кто-то живет в определенной стране, не означает, что он не работает в другой культурной среде (например, удаленные сотрудники или региональные менеджеры, которые пересекают культурные границы).

Это не такая простая проблема, и ее действительно можно решить, только определив сферу ожиданий.

1 голос
/ 27 сентября 2011

Я думаю, я должен просто разделить язык ввода для моего экрана оплаты на:

  • Отображение локали, например, nl_NL, nl_BE, fr_FR. Используется для отображения материалов. Это свойство учетных записей пользователей.
  • Страна проживания, например NL, FR, TR. Пользователь, чтобы определить способы оплаты. Это определяется по IP-адресу, но может быть переопределено вручную.
0 голосов
/ 27 сентября 2011

Ваши способы оплаты не должны быть привязаны к локали, они должны быть привязаны к тому, что вам требуется для системы обработки платежей.Затем вы должны отобразить это значение в соответствии с обычаями выбранного региона.

...