6

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

4

6 回答 6

3

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

  • Flat out 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 没有这样做。

我希望这至少可以为您指明正确的方向。

参考

Windows 上的 PHP 本地化教程

国家代码

语言代码

于 2012-05-15T23:24:17.230 回答
3

您的代码将此作为返回值提及bindtextdomain

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

使用setlocaleofSpanish_Spain.1252textdomainof 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 替代,所以要小心键查找失败。可能首先要测试的最好的东西是完全没有空格的键。
于 2012-05-16T03:26:46.820 回答
2

一个建议:您可能需要 .mo 文件的完整语言环境。这可能是 Spanish_Spain.UTF8 或 esn_esn.UTF8 或 esn_esp.UTF8(不是 1252,因为您更改了代码库)。

要跟踪它要查找的目录,您可以安装进程监视器 (http://technet.microsoft.com/en-us/sysinternals/bb896645)。它会在信息上显示存储桶负载,但您应该能够找出正在查找的文件/目录。

(我的另一个想法是检查文件权限——但如果您在 Zend_Translate 中已经有类似的东西,那么可能不是原因,但无论如何都值得检查)。

对不起,如果不好 - 但可能会给你一个线索。

于 2012-05-14T11:36:33.243 回答
1

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

于 2012-05-16T00:02:36.163 回答
1

这里。它在 Windows 和 linux 上也适用于我。数组中的最后一个值适用于 windows。可以在此处找到语言名称列表。我的目录在

./locales/en/LC_MESSAGES/domain.mo
         /cs/LC_MESSAGES/domain.mo
于 2012-05-09T19:30:36.707 回答
0

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

于 2012-05-12T09:37:14.003 回答