Это не так просто, как должно быть (по моему скромному мнению). Прежде всего вы должны извлечь локали из $_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()
, но также вводит некоторые другие недостатки, такие как отсутствие поддержки строковых операций с поддержкой локали (например, сортировка).