PHP Gettext - 没有翻译

7
我正在尝试使用PHP的gettext扩展来翻译一些字符串。所有函数似乎都返回了正确的值,但调用gettext()/_()仅返回原始字符串。PO/MO文件看起来是正确的,而且我相信我已经正确设置了目录。我在Windows上运行着带有PHP 5.3.10的WAMP服务器(也尝试过运行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.1252es_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小时内尝试最近的答案。


你的语言环境和目录不应该是 es_ES.UTF-8 吗? - mario
@mario 我尝试了那个本地化和目录,但是 setlocale() 返回了 false。 - pb149
6个回答

3
我在我的XAMPP实例上设置并弄清楚了这个问题。
  • Flat out setlocale does not work on Windows, so what it returns is irrelevant.
  • For Windows you set the locale using the standard language/country codes (in this case es_ES is Spanish as spoken in Spain)
  • Under your locale directory create es_ES/LC_MESSAGES/. This where your messages.mo file lives.

    $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没有这样做。
我希望这至少能指引您正确的方向。 参考资料 Windows上的PHP本地化教程 国家代码 语言代码

3

您的代码将这作为bindtextdomain的返回值:

C:\wamp\www\new2\www\locale

使用 setlocale 设定为 Spanish_Spain.1252textdomain 设定为 messages,调用 gettext 会查找以下路径:

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

编辑

好的,那并没有帮助。我已经在Windows上创建了一个测试脚本,并像你一样使用POEdit:

$locale = "Dutch_Netherlands.1252";
putenv("LC_ALL=$locale"); // 'true'
setlocale(LC_ALL, $locale); // 'Dutch_Netherlands.1252'
bindtextdomain("messages", "./locale"); // 'D:\work\so\l10n\locale'
textdomain("messages"); // 'messages'

echo _("Hello world"); // 'Hallo wereld'

我的文件夹结构是这样的:

D:\work\so\l10n\
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.mo
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.po
    \test.php

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

  • 在.po文件中设置字符集非常重要。
  • 本地化文件中的空格可能具有UTF8替代方案,因此要注意键查找失败的情况。最好首先测试没有任何空格的键。

啊,对不起 - 我复制错了。实际上我创建了 C:\wamp\www\new2\www\locale\Spanish... 等等。我现在会修改我的问题。谢谢你发现了这个错误! - pb149

2
建议:您可能需要完整的区域设置来获取.mo文件。这可能是Spanish_Spain.UTF8或esn_esn.UTF8或esn_esp.UTF8(不是1252,因为您更改了代码库)。
要跟踪它正在查找的目录,您可以安装Process Monitor(http://technet.microsoft.com/en-us/sysinternals/bb896645)。它会输出大量信息,但您应该能够找到正在寻找哪个文件/目录的信息。
(我还想检查文件权限-但如果您已经在Zend_Translate中有类似的东西,那么可能不是原因,但无论如何都值得检查)。
如果翻译不好,请见谅-但可能会给您一些线索。

谢谢 - 我稍后会查看进程监视器,看看它是否能帮助我。可能正是我需要的东西。 - pb149

1

我从未尝试在Windows上使用gettext,但每次我在Linux系统上使用gettext时遇到问题的原因是没有安装适当的语言包。


1

点击这里。它在我的Windows和Linux上都可以运行。数组中的最后一个值适用于Windows。语言名称列表可以在这里找到。我的目录在

./locales/en/LC_MESSAGES/domain.mo
         /cs/LC_MESSAGES/domain.mo

@Fanda我已经尝试使用Windows语言环境名称(包括我的问题中提到的esnesp)。我刚刚直接从您链接的帖子中尝试了几个示例,将语言环境设置为array('de_DE.UTF-8', 'de_DE', 'de', 'german')。我为这些值中的每一个创建了一个locale/[VALUE-FROM-ARRAY]/LC_MESSAGES/messages.mo文件,并在再次尝试之前重新启动了Apache - 但没有成功。所有函数都正确返回,还有其他建议吗? - pb149
你尝试将lang子目录重命名为两个字母的代码了吗?(locales/de/LC... ?) - Fanda

0
问题也可能是当您更改*.po和*.mo文件时,您必须重新启动Apache服务器。 这可能是个问题,所以您可以使用解决方法 - 将这些文件始终重命名为某个新名称,它们将被重新加载。

@jasir请阅读我的原始问题;每当我的.MO文件更改时,我都会重新启动Apache。谢谢。 - pb149

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接