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

标签 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>来自服务器的标记和字符集 Windows-1251 . 砍掉俄罗斯 PHP 服务器。

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

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

.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 request中设置charset,它就变成了UTF-8,否则就从get request中去。对于 Chiense,我将其设置为 GBK , 就像在淘宝网一样,浏览器设置正确的字符集。

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

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

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

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

请帮助我。


更新 2

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

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

最佳答案

总结

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

解释/例子

设置<meta charset="...">标签只告诉浏览器页面上使用的是什么字符编码。 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"

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

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

关于php - 中文本地化不适用于 PHP gettext 扩展,因为它适用于英语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31209150/

相关文章:

java - cxf ws-security 时间戳格式

ios - 如何从坐标中获取本地化的街道名称?

c++ - 一种跨平台的本地化资源格式

android - Android 应用本地化

PHP 循环 : Bootstrap Slider Add div with item class every 3 item and the first one will have active

php - 需要使照片以随机顺序出现,但要保持并排响应。

regex - 产品/1 而不是产品.php?id=1

php - 当存在预加载文件时 Apache 不会启动

php - 带有短代码的 get_post_meta 数据,是否可能

php - 如何正确地将password_verify与PDO和盐一起使用?