PHP Gettext - 没有翻译

Posted

技术标签:

【中文标题】PHP Gettext - 没有翻译【英文标题】:PHP Gettext - No translation 【发布时间】:2012-05-16 05:49:39 【问题描述】:

我正在尝试使用 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_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 我已经尝试过该语言环境和目录,但 setlocale() 然后返回 false。 【参考方案1】:

您的代码将此作为来自bindtextdomain 的返回值:

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

使用Spanish_Spain.1252setlocalemessagestextdomain,对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... 等。我现在将修改我的问题。不过,感谢您发现这一点!【参考方案2】:

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

【讨论】:

【参考方案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 没有这样做。

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

参考文献

PHP Localization Tutorial on Windows

Country Codes

Language Codes

【讨论】:

【参考方案4】:

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

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

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

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

【讨论】:

谢谢 - 我稍后会查看进程监视器,看看它是否对我有帮助。可能正是我正在寻找的。​​span> 【参考方案5】:

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

【讨论】:

@jasir请阅读我原来的问题;每当我的 .MO 文件发生更改时,我都会重新启动 Apache。谢谢。【参考方案6】:

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

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

【讨论】:

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

以上是关于PHP Gettext - 没有翻译的主要内容,如果未能解决你的问题,请参考以下文章

gettext中的php字符串变量

php 使用gettext WordPress过滤器更改任何可翻译的字符串。

php 使用gettext WordPress过滤器更改任何可翻译的字符串。

php 使用gettext WordPress过滤器更改任何可翻译的字符串。

用原始语言切换 gettext 翻译语言

通过 XMLHttpRequest 将 gettext 与 PHP 中的 Javascript 一起使用