Как автоматически установить язык пользователя в PHP? - PullRequest
8 голосов
/ 29 ноября 2008

Есть ли простой способ проанализировать HTTP_ACCEPT_LANGUAGE пользователя и установить языковой стандарт в PHP?

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

Пакет PEAR I18Nv2 находится в бета-версии и почти три года не менялся, поэтому я бы не стал его использовать, если это возможно.

Также было бы хорошо, если бы он мог выяснить, работает ли сервер в Windows или нет, так как языковые строки Windows отличаются от остального мира ... (немецкий язык - "deu" или "немецкий" вместо " де».)

Ответы [ 4 ]

5 голосов
/ 29 ноября 2008

Это не так просто, как должно быть (по моему скромному мнению). Прежде всего вы должны извлечь локали из $_SERVER['HTTP_ACCEPT_LANGUAGE'] и отсортировать их по значениям q. После этого вам нужно получить соответствующий системный языковой стандарт для каждого из указанных языковых стандартов, что не должно быть проблемой на компьютере * nix (вам, возможно, придется справиться с правильным набором символов), но в Windows вам придется переводить языковые стандарты в Локали Windows, например de_DE будет German_Germany (опять же, вы также должны справиться с проблемами кодировки, если вы используете UTF-8 в своем приложении, например). Я думаю, вам придется создать таблицу поиска для этой проблемы - и есть много локалей; -)

Нет, вы пытаетесь использовать один языковой стандарт за другим (отсортированный по убыванию значений q), пока не найдете совпадение, используя setlocale() (функция вернет false, если данный языковой стандарт не может задавать).

Но тогда будет последнее препятствие, с которым нужно справиться:

Информация о локали сохраняется за процесс, а не за поток. если ты работают PHP на многопоточном сервер API, как IIS или Apache на Windows вы можете испытать внезапное изменения настроек локали в то время как скрипт работает хотя скрипт сам по себе никогда не вызывал setlocale () сам. Это происходит из-за других скрипты, работающие в разных потоках одного и того же процесса в то же время изменение локали процесса в целом с помощью Setlocale ().

(см .: http://de2.php.net/manual/en/function.setlocale.php)

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

Поэтому упомянутый Zend_Locale не полагается на функцию PHP setlocale() (используется только для получения информации о локали системы), а вместо этого использует систему на основе данных, предоставленных Unicode CLDR Project . Это делает компонент независимым от всех этих проблем setlocale(), но также вводит некоторые другие недостатки, такие как отсутствие поддержки строковых операций с поддержкой локали (например, сортировка).

2 голосов
/ 29 ноября 2008

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

Хорошая новость о Zend - вам не нужно устанавливать все это. Это плохо связанная структура, и вы можете просто использовать Zend_Locale без использования других компонентов. Может быть, вы хотите объединить это с Zend_Translate.

Проверить

2 голосов
/ 29 ноября 2008

Хорошее решение - в пути .

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

Это может выглядеть так:

en_US, en;q=0.8, fr_CA;q=0.2, *;q=0.1

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

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


Для локали Windows, возможно, вам нужно преобразовать имена ISO 639-1 в ISO 639-2 / 3?

1 голос
/ 29 ноября 2008

Есть http_negotiate_language, но это зависит от http-расширения. В качестве альтернативы, см. Комментарии на странице руководства, для реализации пользовательского пространства.

...