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

Дан*_*нин 9 php apache localization gettext chinese-locale

我已经使用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>标签和charset从服务器进入Windows-1251.Chop俄罗斯PHP服务器.

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

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

.htaccess:

- AddDefaultCharset UTF-8
+ AddDefaultCharset off
+ RewriteRule ^cn index.php?locale=zh_CN&charset=GBK [L]
Run Code Online (Sandbox Code Playgroud)

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

+ $charset=$_GET["charset"];
+ if(!isset($charset)) {
+   $charset="UTF-8";
+ }
Run Code Online (Sandbox Code Playgroud)

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

+ <meta charset="<?=$charset?>">
Run Code Online (Sandbox Code Playgroud)

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

但毕竟我只是用中文字形编码的西里尔字符,逐个字符.

像这样: ?????? ? ??????

变成这样: ?????? ? ??????

如果你把这些中文字符粘贴到解码器应用程序中,选择左边的GB2312(中文字符集中的一个)和右边的UTF-8,你会有?????? ? ??????- 一些西里尔字符被破坏但这显然是一个原始字符串,因为在翻译中我有更多的缩短??对于这句话.

请帮帮我.


更新2

我只是忘了设置bind_textdomain_codeset();$domain,它是messages.

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

mor*_*tic 7

摘要

我能够在不改变<meta charset="...">价值的情况下完成这项工作utf-8.你也应该能够删除AddDefaultCharset从您的规则.htaccess,并删除&charset=GBK从你的RewriteRule.您需要确保.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>
Run Code Online (Sandbox Code Playgroud)

我的.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 "??"
Run Code Online (Sandbox Code Playgroud)

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

"Content-Type: text/plain; charset=UTF-8\n"
Run Code Online (Sandbox Code Playgroud)

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

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