中文本地化不适用于 PHP gettext 扩展,因为它适用于英语

Chinese localization not worked with PHP gettext extension as it works with English

我已经使用 PHP 和 gettext 将一个网站从俄语本地化为英语,只是将所有字符串包装到 __($string) 函数中。

有效。

要点如下:https://gist.github.com/Grawl/ba8f39b8398791c6a67e

但它不适用于中文翻译。我刚刚将已编译的 .mo(和源代码 .po)添加到 locale/zh_CN/LC_MESSAGES/ 中,访问 /index.php?locale=zh_CN 并且根本看不到它已翻译。

中文有什么问题?

我需要使用其他语言代码还是什么?

我使用 zh_CN 像在 WordPress 中那样在中文上映射。

我无法理解为什么


更新:

问题出在 HTML <meta> 标记和字符集中,来自 Windows-1251 中的服务器。 砍俄罗斯 PHP 服务器。

我在.htaccess中设置<meta charset="GBK">并关闭AddDefaultCharset后,中文本地化终于开始工作了。

毕竟,我添加了这些修改:

.htaccess:

- AddDefaultCharset UTF-8
+ AddDefaultCharset off
+ RewriteRule ^cn index.php?locale=zh_CN&charset=GBK [L]

functions.php,包括在<!DOCTYPE html>之前:

+ $charset=$_GET["charset"];
+ if(!isset($charset)) {
+   $charset="UTF-8";
+ }

head.php,<head>标签内容:

+ <meta charset="<?=$charset?>">

所以,如果我不在get请求中设置charset,它就变成了UTF-8,否则就从get请求中去。对于 Chiense,我将其设置为 GBK,就像 Taobao.com 一样,浏览器设置了正确的字符集。

但毕竟我只有用中文字形编码的西里尔字符,一个字符一个字符地编码。

像这样:Сервис и услуги

变成这样:褋械褉胁懈褋 懈 褍褋谢褍谐懈

如果你把这些中文字符粘贴到decoder app,左边选择GB2312(一个来自中文字符集),右边选择UTF-8,你会得到?е?ви? и ??л?ги——一些西里尔字符损坏了但是这个显然是一个原始字符串,因为在翻译中我对这个短语进行了更多的缩短服务

请帮帮我


更新 2

刚才忘记把bind_textdomain_codeset();设置成$domain了,原来是messages.

所有适用于 unicode 字符集。一切正常。

总结

我能够在不将 <meta charset="..."> 值从 utf-8 更改开的情况下完成这项工作。您还应该能够从 .htaccess 中删除 AddDefaultCharset 规则,并从 RewriteRule 中删除 &charset=GBK。您需要确保您的 .po 文件的格式和编译正确,并确保服务器可以找到它。

Explanation/Example

设置 <meta charset="..."> 标签只会告诉 浏览器 页面上使用的字符编码。 PHP 仍然需要知道要 select 哪个文件来替换字符串。而且无论如何,虽然this documentation suggests otherwise,我觉得还是可以用UTF-8来做中文本地化的。这是我在我的系统上设置的一个简单的工作示例:

<?php
    // initialize locale-related variables
    $locale     = $_GET['locale'] ?: 'en_US';
    $domain     = 'bridges';
    $locale_dir = dirname( __FILE__ ) . '/locale'; // using absolute path!

    // set up locale
    putenv( "LC_ALL=$locale" );
    setlocale( LC_ALL, $locale );
    bindtextdomain( $domain, $locale_dir );
    bind_textdomain_codeset( $domain, 'UTF-8' );
    textdomain($domain);
?><!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title><?= _( 'Localization Test' ) ?></title>
    </head>
    <body>
        <p><?= _( 'Hello' ) ?>!</p>
    </body>
</html>

我的 .po 文件位于 ./locale/zh_CN/LC_MESSAGES/bridges.po 看起来像:

msgid ""
msgstr ""
"Project-Id-Version: 1.0\n"
"PO-Revision-Date: 2015-07-20\n"
"Last-Translator: Morgan Benton\n"
"Language-Team: Chinese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_CN\n"

msgid "Localization Test"
msgstr "本土化试"

msgid "Hello"
msgstr "您好"

根据 comment on the gettext() documentation,您应该将字符编码和其他相关 headers 放入 .po 文件中,例如

"Content-Type: text/plain; charset=UTF-8\n"

您可以在终端中通过 运行 命令 msgfmt -c bridges.po -o bridges.mo 检查 .po 文件的语法。如果它认为您的 .po 文件有任何问题,它会警告您。正如评论者所建议的,我认为您不需要安装中文系统库。

P.S。不知道这些中文翻译对不对。这正是 Google 翻译给我的! :)