我目前正在尝试使用PHP和poedit的gettext。我写了以下test.php文件:
<?php
error_reporting(E_ALL | E_DEPRECATED | E_USER_DEPRECATED | -1);
bindtextdomain('messages', './i18n/');
textdomain('messages');
setlocale(LC_ALL, $_GET['l']);
putenv("LANG=".$_GET['l']);
echo _('test :-(');
?>
这是我的message.po:
msgid ""
msgstr ""
"Project-Id-Version: Community Chess\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-10-07 18:34+0100\n"
"PO-Revision-Date: \n"
"Last-Translator: Martin Thom <info@martin-thoma.de>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-SourceCharset: utf-8\n"
"X-Poedit-Basepath: /var/www/community-chess\n"
"X-Poedit-SearchPath-0: .\n"
#: test.php:8
msgid "test :-("
msgstr "Juhu :-)"
#~ msgid "test"
#~ msgstr "Juhu!"
我的目录结构是
community-chess
test.php
i18n
de_DE
LC_MESSAGES
messages.po
messages.mo
当我看到http://localhost/community-chess/test.php?l=de_DE时,我得到“测试:-(”
我用
生成了语言环境sudo locale-gen de_DE
并使用
进行检查locale -a
为什么不起作用?我如何从gettext获得一些反馈?
答案 0 :(得分:1)
这对我在Linux上的CE ZendServer和NetBsd上的Apache服务器上的工作
文件“message.po”是从应用程序的根目录生成的:
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-04-30 19:38+0200\n"
"PO-Revision-Date: 2013-04-12 14:00+0000\n"
"Last-Translator: gin(e) <ginex@posta.indivia.net>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: eo\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: include/apteryx_text.php:3
msgid "email:"
msgstr "Retpoŝtadreso:"
这是新的树目录:
res/locale/
de_DE/
LC_MESSAGES/
messages.mo
eo_EO/
LC_MESSAGES/
messages.mo
eo->eo_EO (symlink)
我必须添加“eo”符号链接,因为我支持的系统上只有三个世界语语言环境:
eo
eo.iso88593
eo.utf8
编译whit:
sudo locale-gen eo
sudo locale-gen eo.iso88593
sudo locale-gen eo.utf8
sudo update-locale
sudo dpkg-reconfigure locales
目前我的locale.php代码是:
$charset="UTF-8";
$gettext_domain="messages";
$locale_dir="res/locale";
putenv("LC_ALL=$lang");
$l=split("_",$lang);
/* not in all system and not all locales got the classic name this stupid method try to solve it*/
if(! setlocale(LC_ALL, $lang.".".$charset))
if(! setlocale(LC_ALL, $lang))
if(! setlocale(LC_ALL,$l[0].".".$charset))
setlocale(LC_ALL,$l[0]);
bindtextdomain($gettext_domain, "res/locale");
textdomain($gettext_domain);
bind_textdomain_codeset($gettext_domain, $charset);
因为whitout它gettext不起作用。我认为locale目录必须与设置为whit setlocale的语言具有相同的名称。另一件事是测试每个函数叫什么返回。它们必须永远不会返回NULL或FALSE。你可以用简单的方式做到这一点:
var_dump(bindtextdomain($gettext_domain, "res/locale"));
var_dump(textdomain($gettext_domain));
..and so on..
最后但不是列表,记得为所有.mo文件设置正确的apache权限,重新启动apache服务器并通过phpinfo()验证“GetText Support”已“启用”。
答案 1 :(得分:1)
当我通过cmd“/ path / to / nginx -s reload”重新启动nginx时,它不起作用,但在我用cmd“/etc/init.d/php-fpm restart重新启动php-fpm之后“,有效! 希望我的经验对有问题的人有帮助:))
答案 2 :(得分:0)
如果您错过了,OP在上面的评论中说,他通过简单地重启Apache来解决这个问题。 _()
只是没有工作,我遇到了麻烦。区域设置设置正常,bindtextdomain
和textdomain
返回正确的值,但它无法正常工作。 我重新启动了Apache,但它确实有效。