我正在尝试使用Drupal 6生成多语言。我的网站托管在Windows IIS 7.5服务器上。
我已经上传了.po文件,一切都很棒。我现在正处于逐步浏览网站的阶段,尝试在我第一次翻译网站时清除任何引起我注意的事情。
我遇到的问题是尝试以区域设置格式显示日期。
这是我用来显示本地日期的PHP代码:
$format = "%A, %b %#d, %Y : %H:%M%p"
if($language->language == 'zh-hans')
{
$loc=setlocale(LC_TIME, 'chs');
}else{
$loc=setlocale(LC_TIME, 'de');
}
$mytime = strftime($format, $time);
$mytime = iconv(mb_detect_encoding($mytime), 'utf-8', $mytime);
echo $mytime;
以上代码应以当前语言的本地格式显示日期(德语为中文)
德语显示如预期:
Freitag,2013年6月21日:16:48
但是中文输出看起来像这样:
???,?? 21,2013:16:48 ??
有关如何解决此问题的任何想法?
答案 0 :(得分:3)
第一个问题是设置LC_TIME
类别本身是不够的。 strftime
函数将尝试使用适当的语言格式化时间,但默认情况下似乎使用1252代码页,因此无法为中文等内容生成必要的字符。
我原本预计设置LC_TIME
和LC_CTYPE
就足够了,但我能让它工作的唯一方法就是使用LC_ALL
。因此,您的setlocale
来电应如下所示:
if($language->language == 'zh-hans')
{
$loc=setlocale(LC_ALL, 'chs');
}else{
$loc=setlocale(LC_ALL, 'de');
}
下一个问题是mb_detect_encoding
并不总能检测到正确的编码。在Windows上对我有用的是使用setlocale(LC_CTYPE, 0)
来取回当前的代码页。
$codepage = explode('.',setlocale(LC_CTYPE, 0));
$codepage = 'cp'.$codepage[1];
从setlocale(LC_CTYPE, 0)
调用返回的值是语言名称和以点分隔的代码页编号的组合。我们使用explode
拆分这两个部分,然后使用cp
为数字添加前缀,以iconv
可以理解的形式获取代码页。
然后我们可以简单地将字符串转换为utf-8,如下所示:
$mytime = iconv($codepage, 'utf-8', $mytime);