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