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_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 小时内尝试最近的答案。
【问题讨论】:
你的语言环境和目录不应该是es_ES.UTF-8
吗?
@mario 我已经尝试过该语言环境和目录,但 setlocale()
然后返回 false。
【参考方案1】:
您的代码将此作为来自bindtextdomain
的返回值:
C:\wamp\www\new2\www\locale
使用Spanish_Spain.1252
的setlocale
和messages
的textdomain
,对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 语言环境名称(包括esn
和 esp
- 在我的问题中)。我刚刚从您链接到的帖子中直接尝试了几个示例,将语言环境设置为array('de_DE.UTF-8', 'de_DE', 'de', 'german')
。我为这些值中的每一个创建了一个locale/[VALUE-FROM-ARRAY]/LC_MESSAGES/messages.mo
文件,并在重试之前重新启动了 Apache - 不走运。但是,所有函数都正确返回。还有什么建议吗?
您是否尝试将 lang 子目录重命名为 2 个字母代码? (语言环境/de/LC...?以上是关于PHP Gettext - 没有翻译的主要内容,如果未能解决你的问题,请参考以下文章
php 使用gettext WordPress过滤器更改任何可翻译的字符串。
php 使用gettext WordPress过滤器更改任何可翻译的字符串。