中文本地化不适用于 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服务器。

在我设置<meta charset="GBK">并在.htaccess年关闭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 请求,它将变为 UTF-8,否则它将从 get 请求开始。对于Chiense,我将其设置为GBK,就像在 Taobao.com 上一样,浏览器设置了正确的字符集。

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

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

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

如果您将这些汉字粘贴到解码器应用程序中,选择左侧的 GB2312(一个来自中文字符集(和右侧的 UTF-8,您将得到?е?ви? и ??л?ги – 一些西里尔字符损坏,但这显然是一个原始字符串,因为在翻译中我对这个短语有更多的缩短服务

请帮帮我。


更新 2

我只是忘了bind_textdomain_codeset();设置为$domain,这是messages

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

总结

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

解释/示例

设置 <meta charset="..."> 标记仅告诉浏览器页面上正在使用的字符编码。PHP 仍然需要知道选择哪个文件来替换字符串。无论如何,尽管本文档另有建议,但我认为您仍然可以使用 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 "您好"

根据对gettext()文档的评论,您应该将字符编码和其他相关标头放在.po文件中,例如

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

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

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