我已经使用 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/