Каков наилучший способ извлечения пользовательских локалей из Zend Framework с использованием полного списка предпочтений локали? - PullRequest
0 голосов
/ 05 ноября 2010

Zend Framework имеет отличный компонент под названием Zend_Locale. Есть все мелкие детали в правильном разборе языка и локали, отчасти потому, что он был взломан в HTTP Accept-Language header .

В Zend Framework locale docs написано:

Примечание: знать, что не существует только локали с 2 символами люди думают. Также есть языки и регионы, которые не только сокращено до 2 символов. Для этого вы не должны лишать регион и язык сами, но используйте Zend_Locale, когда вы хотите раздеться язык или регион из локали строка. В противном случае вы могли бы иметь неожиданное поведение в вашем коде когда ты делаешь это сам.

Совершенная. За исключением того, что я тестировал различные языковые переводы. Предполагая, что вы просматриваете с помощью Firefox, измените свои настройки и добавите несколько профилей language_region ... измените порядок по умолчанию. Вы увидите, что Zend тянет только по умолчанию. Документы даже говорят так:

Если пользователь предоставляет более одного локаль в своем браузере, Zend_Locale будет использовать первую найденную локаль. Если пользователь не предоставляет язык или скрипт вызывается из командная строка автоматическая локаль «среда» будет автоматически Использовано и возвращено.

Это прискорбно. Если у вас есть 5 определенных языков, вы хотите просмотреть все локали, определенные пользователем в браузере, и использовать язык, который соответствует ...

Итак, мой вопрос: какой подход вы бы использовали, чтобы проанализировать полный список и вывести какие-либо совпадения?

UPDATE Есть метод Zend_Locale :: getBrowser (), который возвращает полный список. Большой! Не уверен, почему Zend_Translate только тянет первый. Я вернусь после проверки того, как это работает ... возможно, потребуется собрать массив языков, для которых у вас есть переводы, и сравнить его с результатами getBrowser () и получить первое совпадение.

UPDATE2 Я реализовал решение, но оно все еще хакерское, потому что Zend_Translate и Zend_Locale не маленькие классы. Интернационализация - большая тема, очевидно. Есть немало интересного для исследования.

Но, по сути, все сводится к проверке соответствия каждого языка списку предпочтений браузера.

1 Ответ

0 голосов
/ 06 ноября 2010

Я получил форму захода на посадку http://www.zf -beginners-guide.com / книга

protected function _initLocale()
{
// try to auto-detect locale
// if fail, set locale manually
try {
$locale = new Zend_Locale('browser');
} catch (Zend_Locale_Exception $e) {
$locale = new Zend_Locale('en_GB');
}
// register locale
$registry = Zend_Registry::getInstance();
$registry->set('Zend_Locale', $locale);
}

но чего я боюсь, и он упоминает об обновлении локали:

ВНИМАНИЕ! Важно отметить, что Zend_Locale не будет бросать исключение, если идентификатор локали обнаружен содержит только язык код, а не код региона. За Например, какой-нибудь клиент и / или сервер среда может просто вернуть язык en или fr. Эта ситуация может иногда создают проблему, когда Zend_Locale используется с другими классы, ориентированные на локали, которые ожидают полный идентификатор локали, такой как Zend_Currency. Там нет реального Решение этой проблемы, кроме ручная настройка локали на основе доступные факты и «лучшая догадка» оценить. Предложенная новая функция в Zend_Locale в будущем позволит «Модернизация локали», где частично квалифицированные идентификаторы локали (для пример, en) будет автоматически преобразован в полностью квалифицированную локаль идентификаторы (например, en_US).

например, в Firefox, если вы выбираете только код языка [en] и этот код выше примет его как локаль, но другие классы, поддерживающие локали, сгенерируют исключение

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

...