我正在尝试使用PHP gettext扩展来翻译一些字符串。所有函数似乎都返回正确的值,但调用gettext()
/ _()
仅返回原始字符串。 PO / MO文件似乎正确,我相信我已正确设置目录。我在Windows上使用PHP 5.3.10运行WAMP Server(也尝试运行5.3.4和5.3.8,因为我有安装)。
首先,请参阅/new2/www/index.php
:
$locale = 'esn'; # returns Spanish_Spain.1252 in var dump
putenv("LC_ALL={$locale}"); // Returns TRUE
setlocale(LC_ALL, $locale); // Returns 'Spanish_Spain.1252'
$domain = 'messages';
bindtextdomain($domain, './locale'); // Returns C:\wamp\www\new2\www\locale
bind_textdomain_codeset($domain, 'UTF-8'); // Returns UTF-8
textdomain($domain); // Returns'messages'
print gettext("In the dashboard"); // Prints the original text, not the translation.
exit;
我创建了以下文件结构:
www/new2/www/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo
我还尝试将Spanish_Spain.1252
替换为:es_ES
,esn
,esp
,Spanish
和Spanish_Spain
。
用于生成MO的PO文件是这样的(仅给出相关条目):
#: C:\wamp\www\new2/www/index.php:76
msgid "In the dashboard"
msgstr "TRANSLATED es_ES DASHBOARD"
这是使用PoEdit生成的。添加任何新的.MO文件后,我重新启动了Apache。另请注意,我之前使用Zend_Translate和Gettext,它正在正确翻译。我希望依赖本机gettext扩展,部分原因是因为我试图创建一个自己的轻量级框架。
任何帮助都将不胜感激。
编辑:修改后的目录结构。注意 - 将能够在24小时内尝试最近的答案。
答案 0 :(得分:3)
我在我的XAMPP实例上进行了设置并弄清楚了。
在您的语言环境目录下创建es_ES / LC_MESSAGES /。这是您的messages.mo文件所在的位置。
$locale = 'es_ES';
putenv("LC_ALL={$locale}"); // Returns TRUE
$domain = 'messages';
bindtextdomain($domain, './locale');
bind_textdomain_codeset($domain, 'UTF-8');
textdomain($domain); // Returns'messages'
print gettext("In the dashboard");
exit;
我不确定这是否有所不同,但我在创建po文件时做了两件事。在文件中的poEdit - >首选项我将行结束格式更改为Windows。在用poEdit创建初始po之后,我在Notepad ++中打开了文件,并将编码类型切换为UTF-8,因为poEdit没有这样做。
我希望这至少可以指出你正确的方向。
<强>参考强>
答案 1 :(得分:3)
您的代码将此提及为bindtextdomain
的返回值:
C:\wamp\www\new2\www\locale
setlocale
的{{1}}和Spanish_Spain.1252
的{{1}},对此textdomain
的调用将在此路径中显示:
messages
但您创建了以下文件结构:
gettext
修改强>
好的,所以没有帮助。我在Windows上创建了一个测试脚本,并像你一样使用POEdit:
C:\wamp\www\new2\www\locale\Spanish_Spain.1252\LC_MESSAGES\messages.mo
我的文件夹结构如下:
www/new2/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo
^^
www/ missing here
希望它有所帮助,虽然它看起来与你的几乎相同。我在网上找到的一些东西:
答案 2 :(得分:2)
建议:您可能需要.mo文件的完整区域设置。这可能是Spanish_Spain.UTF8或esn_esn.UTF8或esn_esp.UTF8(不是1252,因为您更改了代码库)。
要跟踪它正在查找的目录,您可以安装Process monitor(http://technet.microsoft.com/en-us/sysinternals/bb896645)。它会在信息上显示存储桶负载,但您应该能够找到正在查找的文件/目录。
(我的另一个想法是检查文件权限 - 但如果你已经在Zend_Translate中有类似的东西,那么可能不是原因,但无论如何都值得检查。)
对不起,如果不好 - 但可能会给你一个线索。
答案 3 :(得分:1)
看here。它也适用于Windows和Linux。数组中的最后一个值适用于Windows。可以找到语言名称列表here。我的目录在
./locales/en/LC_MESSAGES/domain.mo
/cs/LC_MESSAGES/domain.mo
答案 4 :(得分:1)
我从未尝试过在Windows上使用gettext,但每次我在linux系统上遇到gettext问题时,原因都是没有安装合适的语言包。
答案 5 :(得分:0)
问题还在于,当您更改* .po和* .mo文件时,您必须重新启动Apache服务器。这可能有问题,因此您可以使用变通方法 - 始终将这些文件重命名为新名称,然后重新加载。