Лучшая практика обработки локалей с помощью валют и языковых переключателей
Я работаю над многоязычным проектом с 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. Но я не знаю, какое решение устранит эту проблему, потому что я не могу "обновить" короткий язык до полного языкового стандарта.
Ответы
Ответ 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
В моем случае я хотел бы попросить пользователя выбрать свой язык и валюту при первом посещении моего сайта. на языке выберите интерфейс, я взял код языка из браузера пользователя в качестве ссылки на язык по умолчанию. а также я предоставляю кнопку быстрого переключения языка на моем сайте.