中文本地化不适用于 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 服务器。
我在.htaccess
中设置<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?>">
所以,如果我不在get请求中设置charset,它就变成了UTF-8,否则就从get请求中去。对于 Chiense,我将其设置为 GBK
,就像 Taobao.com 一样,浏览器设置了正确的字符集。
但毕竟我只有用中文字形编码的西里尔字符,一个字符一个字符地编码。
像这样:Сервис и услуги
变成这样:褋械褉胁懈褋 懈 褍褋谢褍谐懈
如果你把这些中文字符粘贴到decoder app,左边选择GB2312(一个来自中文字符集),右边选择UTF-8,你会得到?е?ви? и ??л?ги
——一些西里尔字符损坏了但是这个显然是一个原始字符串,因为在翻译中我对这个短语进行了更多的缩短服务
。
请帮帮我
更新 2
刚才忘记把bind_textdomain_codeset();
设置成$domain
了,原来是messages
.
所有适用于 unicode 字符集。一切正常。
总结
我能够在不将 <meta charset="...">
值从 utf-8
更改开的情况下完成这项工作。您还应该能够从 .htaccess
中删除 AddDefaultCharset
规则,并从 RewriteRule
中删除 &charset=GBK
。您需要确保您的 .po
文件的格式和编译正确,并确保服务器可以找到它。
Explanation/Example
设置 <meta charset="...">
标签只会告诉 浏览器 页面上使用的字符编码。 PHP 仍然需要知道要 select 哪个文件来替换字符串。而且无论如何,虽然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,您应该将字符编码和其他相关 headers 放入 .po
文件中,例如
"Content-Type: text/plain; charset=UTF-8\n"
您可以在终端中通过 运行 命令 msgfmt -c bridges.po -o bridges.mo
检查 .po
文件的语法。如果它认为您的 .po
文件有任何问题,它会警告您。正如评论者所建议的,我认为您不需要安装中文系统库。
P.S。不知道这些中文翻译对不对。这正是 Google 翻译给我的! :)
我已经使用 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 服务器。
我在.htaccess
中设置<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?>">
所以,如果我不在get请求中设置charset,它就变成了UTF-8,否则就从get请求中去。对于 Chiense,我将其设置为 GBK
,就像 Taobao.com 一样,浏览器设置了正确的字符集。
但毕竟我只有用中文字形编码的西里尔字符,一个字符一个字符地编码。
像这样:Сервис и услуги
变成这样:褋械褉胁懈褋 懈 褍褋谢褍谐懈
如果你把这些中文字符粘贴到decoder app,左边选择GB2312(一个来自中文字符集),右边选择UTF-8,你会得到?е?ви? и ??л?ги
——一些西里尔字符损坏了但是这个显然是一个原始字符串,因为在翻译中我对这个短语进行了更多的缩短服务
。
请帮帮我
更新 2
刚才忘记把bind_textdomain_codeset();
设置成$domain
了,原来是messages
.
所有适用于 unicode 字符集。一切正常。
总结
我能够在不将 <meta charset="...">
值从 utf-8
更改开的情况下完成这项工作。您还应该能够从 .htaccess
中删除 AddDefaultCharset
规则,并从 RewriteRule
中删除 &charset=GBK
。您需要确保您的 .po
文件的格式和编译正确,并确保服务器可以找到它。
Explanation/Example
设置 <meta charset="...">
标签只会告诉 浏览器 页面上使用的字符编码。 PHP 仍然需要知道要 select 哪个文件来替换字符串。而且无论如何,虽然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,您应该将字符编码和其他相关 headers 放入 .po
文件中,例如
"Content-Type: text/plain; charset=UTF-8\n"
您可以在终端中通过 运行 命令 msgfmt -c bridges.po -o bridges.mo
检查 .po
文件的语法。如果它认为您的 .po
文件有任何问题,它会警告您。正如评论者所建议的,我认为您不需要安装中文系统库。
P.S。不知道这些中文翻译对不对。这正是 Google 翻译给我的! :)