在我们的某个网络应用中,用户可以选择首选语言,因此我们需要为每个用户动态设置区域设置。基本上是:
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"
那么为什么会发生这种情况?
答案 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
}