区域设置会更改每个其他页面加载

时间:2012-03-23 12:41:42

标签: php locale

在我们的某个网络应用中,用户可以选择首选语言,因此我们需要为每个用户动态设置区域设置。基本上是:

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

问题是,在setlocale()strftime()之间,每个其他网页加载,区域设置都更改为默认值。根据{{​​3}},这应该是“多线程服务器API,如IIS或Apache on 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 个答案:

答案 0 :(得分:2)

setlocale()不是持久的,你需要在每次需要时设置它。

答案 1 :(得分:0)

如果locales不是持久性的,那么使用PERSISTENT(SESSION响铃任何铃声)。

当用户选择他的Locale时,将其保存到$ _SESSION关联数组中。

然后每次加载页面时,首先检查变量是否存在。如果是,则设置区域设置,否则请求它。

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