Лучшая практика обработки локалей с помощью валют и языковых переключателей

Я работаю над многоязычным проектом с Zend Framework (немецкий и английский), где у меня есть небольшая форма для заказа продукта. Пользователь должен иметь возможность:

  • Измените предпочитаемую валюту для цены продукта
  • Измените свой предпочтительный язык для всего веб-сайта.

В настоящий момент я использую Zend_Locale:: findLocale() для получения локали пользователя. С настройками моего браузера я получаю "de_CH", и это хорошо работает. Но есть некоторые проблемы, как только:

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

Только код языка Код языка достаточно для обработки Zend_Translate, но Zend_Currency нуждается в дополнительной информации. Я думаю, что нет никакого решения, чтобы получить полный язык с кодом страны от каждого возможного пользователя. Мой вопрос: как вы справляетесь с этими ситуациями? Вы проверяете свой bootstrap _initLocale(), если код страны отсутствует и используется код страны по умолчанию? Существуют ли методы Zend Framework для этого?

Неподдерживаемый язык Если язык пользователя "fr", я хотел бы использовать язык по умолчанию, потому что наш сайт не поддерживает французский. Есть ли лучшая возможность, чем добавить белый список в бутстрап? Например, метод из Zend_Translate?

Неподдерживаемая валюта Что делать, если язык пользователя поддерживается, но не его валюта? Должен ли я изменить языковой стандарт в bootstrap или мне нужно сделать копию локали и изменить ее для Zend_Currency?

Основная проблема Я думаю, что моя главная проблема заключается в том, что я не уверен, как справляться со всеми этими различными языковыми проблемами. Мой предпочтительный подход состоял бы в том, чтобы проверить набор локалей в bootstrap _initLocale(), поэтому я могу быть уверен, что могу поддерживать его язык и валюту.

Спасибо за ваши советы.

С уважением, Нико

Редактирование 1 Я задумался над тем, как справиться с этими проблемами. Что вы думаете об этом подходе?

  • Zend_Locale(): отфильтровать все короткие локали (без кода страны) и использовать белый список с языками, поддерживаемыми вашим приложением (только код языка). Если нет соответствия, используйте значение по умолчанию, указанное вашим приложением.
  • Zend_Translate: начните с кода языка из локали. Но если пользователь изменит предпочтительный язык, оставьте локаль такой, какой она есть (возможно, нет соответствующего языкового стандарта на основе нового языкового кода и старого кода страны) и просто измените код языка в Zend_Translate.
  • Zend_Currency: Используйте язык по умолчанию. Если пользователь изменяет предпочтительную валюту, просто измените валюту, а не локаль. Таким образом, форматирование останется на основе старого языка, потому что изменение валюты не означает, что пользователь также хочет изменить свой язык.

Будет ли этот подход приемлемым? Проблема с шагом 1, если локали браузера установлены следующим образом:

  • де
  • en_US

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

Ответ 1

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

de to de_DE требует, чтобы вы знали, находятся ли они в Германии, но это может по умолчанию de_CH, которое является вашей локалью, если вы не знаете локальную сеть.

* The user has configured his browser to just give me the language code ('de' instead of 'de_CH')

Сопоставьте это в своем приложении. Ваше картографирование может преобразовать это в de_DE для жителей Германии, которые говорят по-немецки. Или de_CH для жителей Швейцарии, которые говорят по-немецки. Или fr_CH для жителей Швейцарии, которые говорят по-французски, и так далее для англоговорящих, это будет en_CH или en_DE. Таким образом, это решает две проблемы.

Пользовательский язык и местоположение необходимы для точного определения языка для пользователя.

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

Ссылка: Юникод - локальность и языковое сопоставление

* The user prefers a language which is not supported by my website

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

* The user is from a country where they got a currency which isn't supported by my product order form

В этом случае вы должны вернуться к своему стандарту.

В Zend есть много примеров использования Locales в своей вики. Наиболее распространенным местом установки локации в Zend является файл начальной загрузки.

Я использовал эту ссылку для ссылки на поддержку этого ответа на вики Zend Framework. В приведенном ниже коде представлен небольшой пример того, как класс Zend_Locale генерирует исключения, если локаль недействительна. Вы можете проверить местоположение и язык на этом этапе и использовать его в сочетании с информацией, которую вы получаете от браузера, чтобы точно установить языковой стандарт для пользователя.

Ссылка: Введение в Zend Locale

  // within the bootstrap file
  try {
      $locale = new Zend_Locale('auto');
  } catch (Zend_Locale_Exception $e) {
      $locale = new Zend_Locale('de');
  }
  // within your model/controller
  $date = new Zend_Date($locale);
  $currency = new Zend_Currency($locale)

Ответ 2

Вот статья, которую я написал о локализации, которая, я думаю, может оказаться полезной при ответе на некоторые ваши вопросы.

http://phpadvent.org/2010/localization-by-anthony-gentile

Ответ 3

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