首页 文章

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

提问于
浏览
9

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

有用 .

这是要点:https://gist.github.com/Grawl/ba8f39b8398791c6a67e

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

中国人怎么了?

我是否要使用其他语言代码?

我使用 zh_CN 来映射中文,就像在WordPress中一样 .

我无法理解 why .


Update:

问题出在HTML <meta> 标签和charset从服务器 Windows-1251 . Chop俄罗斯PHP服务器 .

<meta charset="GBK"> 中设置 <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?>">

因此,如果我没有将charset设置为get request,它将变为UTF-8,否则它将来自get request . 对于Chiense我把它设置为 GBK ,就像在淘宝网上一样,浏览器设置了正确的字符集 .

But after all I just has cyrillic characters encoded in Chinese glyphs, character by character.

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

成为这个: 褋械褉胁懈褋 懈 褍褋谢褍谐懈

如果将这些中文字符粘贴到decoder app中,选择左侧的GB2312(中文字符集中的一个)和右侧的UTF-8,则会有 ?е?ви? и ??л?ги - 某些西里尔字符已损坏,但这显然是原始字符串,因为在翻译中我有更多缩短 服务 这句话 .

Help me please.


Update 2

我忘记将 bind_textdomain_codeset(); 设置为 $domain ,它是 messages .

所有的工作都在unicode charset上 . 一切正常 .

1 回答

  • 7

    摘要

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

    说明/示例

    设置 <meta charset="..."> 标记只会告诉 browser 页面上正在使用什么字符编码 . PHP仍然需要知道要选择哪个文件来替换字符串 . 无论如何,虽然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,您应该将字符编码和其他相关标头放在 .po 文件中,例如

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

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

    附:我不知道这些中文翻译是否正确 . 这正是谷歌翻译给我的! :)

相关问题