Локаль меняет каждую другую загрузку страницы - PullRequest
0 голосов
/ 23 марта 2012

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

function i18n_date($format, $date, $locale) {
    setlocale(LC_TIME, $locale);
    return strftime($format, $date);
}

Проблема заключается в том, что при каждой другой загрузке страницы языковой стандарт изменяется на значение по умолчанию в диапазоне от setlocale() до strftime(). Согласно PHP документам этого следует ожидать от " многопоточного серверного API, такого как IIS или Apache на Windows ", но наша сборка сервера Apache не является многопоточной:

Server version: Apache/2.2.17 (Ubuntu)
Server built:   Nov  3 2011 02:13:53
Server's Module Magic Number: 20051115:25
Server loaded:  APR 1.4.2, APR-Util 1.3.9
Compiled using: APR 1.4.2, APR-Util 1.3.9
Architecture:   64-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/etc/apache2"
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="/var/run/apache2/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="apache2.conf"

Так тогда почему это происходит?

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

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

0 голосов
/ 24 марта 2012

Если локали не постоянны, используйте что-то ПРОСТОЕ (СЕССИЯ звонит в колокола ???).

Когда пользователь выбирает свой язык, сохраните его в ассоциативном массиве $ _SESSION.

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

if (isset($_SESSION['locale'])){
    setlocale($_SESSION['locale']);
}
else{
    //ask for the locale or whatever you need to do
}
...