Дан*_*нин 9 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>
标签和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]
Run Code Online (Sandbox Code Playgroud)
functions.php
,包括在之前<!DOCTYPE html>
:
+ $charset=$_GET["charset"];
+ if(!isset($charset)) {
+ $charset="UTF-8";
+ }
Run Code Online (Sandbox Code Playgroud)
head.php
,<head>
标签内容:
+ <meta charset="<?=$charset?>">
Run Code Online (Sandbox Code Playgroud)
因此,如果我没有将charset设置为get request,它将变为UTF-8,否则它将来自get request.对于Chiense我把它设置为GBK
,就像在淘宝网上一样,浏览器设置了正确的字符集.
但毕竟我只是用中文字形编码的西里尔字符,逐个字符.
像这样: ?????? ? ??????
变成这样: ?????? ? ??????
如果你把这些中文字符粘贴到解码器应用程序中,选择左边的GB2312(中文字符集中的一个)和右边的UTF-8,你会有?????? ? ??????
- 一些西里尔字符被破坏但这显然是一个原始字符串,因为在翻译中我有更多的缩短??
对于这句话.
请帮帮我.
更新2
我只是忘了设置bind_textdomain_codeset();
到$domain
,它是messages
.
所有的工作都在unicode charset上.一切正常.
我能够在不改变<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>
Run Code Online (Sandbox Code Playgroud)
我的.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 "??"
Run Code Online (Sandbox Code Playgroud)
根据文档的评论gettext()
,您应该将字符编码和其他相关标题放在.po
文件中,例如
"Content-Type: text/plain; charset=UTF-8\n"
Run Code Online (Sandbox Code Playgroud)
您可以.po
通过msgfmt -c bridges.po -o bridges.mo
从终端运行命令来检查文件的语法.如果它认为您的.po
文件有任何问题,它会警告您.正如评论者所说,我认为你不需要安装中文系统库.
PS我不知道这些中文翻译是否正确.这正是谷歌翻译给我的!:)
归档时间: |
|
查看次数: |
569 次 |
最近记录: |