Китайская локализация не работала с расширением PHP gettext, как это работает с английским

я уже локализовал веб-сайт с русского на английский с PHP и gettext только с упаковкой всех строк в .

это работает.

вот суть:https://gist.github.com/Grawl/ba8f39b8398791c6a67e

но это не работает с китайским переводом. Я только что добавил compiled .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]

functions.php, включен до <!DOCTYPE html>:

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

head.php, the <head> содержимое тега:

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

Итак, если я не устанавливаю charset в get request, он становится UTF-8, иначе он переходит из get request. Для Chiense я установил его в GBK, как на Taobao.com, и настройки браузера правильно.

но ведь у меня просто кириллица, закодированная китайскими иероглифами, символ за символом.

такой: Сервис и услуги

становится этот: 褋械褉胁懈褋 懈 褍褋谢褍谐懈

если вставить эти иероглифы в приложение дешифратора, выбрал GB2312 слева (один из китайских гарнитур) и UTF-8 справа, у вас будет ?е?ви? и ??л?ги – некоторые кириллические символы повреждены, но это, очевидно, исходная строка, потому что в переводе у меня больше сокращается 服务 за эту фразу.

помогите мне пожалуйста.


обновление 2

я просто забыл поставить bind_textdomain_codeset(); to $domain, это было messages.

все работает на кодировке unicode. Все нормально.

1 ответов


резюме

я смог сделать эту работу без изменения <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>

мой .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() документация, вы должны поместить кодировка и другие соответствующие заголовки внутри , например,

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

вы можете проверить синтаксис .po файл, выполнив команду msgfmt -c bridges.po -o bridges.mo из вашего терминала. Он предупредит вас, если он думает, что что-то не так с вашим . Как предположил комментатор, Я думаю, вам не нужно устанавливать китайские системные библиотеки.

P. S. Я не знаю, если эти китайские переводы правильно или нет. Это только то, что Google Translate дал мне! :)