0

我正在尝试使用 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;

上面的代码应该以当前语言的本地格式显示日期(德语的中文)

德语按预期显示:

弗赖塔格,2013 年 6 月 21 日:16:48

但中文输出如下所示:

???,??2013 年 2 月 21 日 16:48??

有想法该怎么解决这个吗?

4

1 回答 1

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);
于 2013-06-22T00:34:37.880 回答