PHP Gettext - 没有翻译

时间:2012-05-07 18:04:00

标签: php windows translation gettext poedit

我正在尝试使用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_ESesnespSpanishSpanish_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小时内尝试最近的答案。

6 个答案:

答案 0 :(得分:3)

我在我的XAMPP实例上进行了设置并弄清楚了。

  • 扁平化setlocale在Windows上不起作用,因此返回的内容无关紧要。
  • 对于Windows,您可以使用标准语言/国家/地区代码设置区域设置(在这种情况下,es_ES是西班牙语中的西班牙语)
  • 在您的语言环境目录下创建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没有这样做。

我希望这至少可以指出你正确的方向。

<强>参考

PHP Localization Tutorial on Windows

Country Codes

Language Codes

答案 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

希望它有所帮助,虽然它看起来与你的几乎相同。我在网上找到的一些东西:

  • 在.po文件中设置字符集很重要
  • 本地化文件中的空格可能有UTF8替代方案,因此要小心密钥查找失败。可能最好先测试的是没有空格的键。

答案 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服务器。这可能有问题,因此您可以使用变通方法 - 始终将这些文件重命名为新名称,然后重新加载。