我正在尝试使用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 文件。 另请注意,我以前在 Gettext 中使用Zend_Translate并且翻译正确。 不过,我希望依靠本机 gettext 扩展,部分原因是我正在尝试创建一个自己的轻量级框架。
任何帮助将不胜感激。
编辑:修改了目录结构。 注意 - 将能够在 24 小时内尝试最近的答案。
我在 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 后,我在记事本++中打开了文件并将编码类型切换为 UTF-8,因为 poEdit 没有这样做。
我希望这至少为您指明了正确的方向。
引用
Windows 上的 PHP 本地化教程
国家代码
语言代码
您的代码将其作为 bindtextdomain
的返回值:
C:'wamp'www'new2'www'locale
随着Spanish_Spain.1252
和messages
textdomain
setlocale
,对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 替代项,因此请注意密钥查找失败。可能首先测试的最好方法是完全没有空格的键。
建议:您可能需要 .mo 文件的完整区域设置。这可能是 Spanish_Spain.UTF8 或 esn_esn。UTF8 或 esn_esp。UTF8(不是 1252,因为您更改了代码库(。
若要跟踪要查找的目录,可以安装进程监视器 (http://technet.microsoft.com/en-us/sysinternals/bb896645(。它会在信息上喷出存储桶负载,但您应该能够找到正在查找的文件/目录。
(我的另一个想法是检查文件权限 - 但如果你已经在Zend_Translate中有了类似的东西,那么可能不是原因,但无论如何都值得检查(。
对不起,如果不好 - 但可能会给你一个线索。
看这里。它在Windows和Linux上也对我有用。数组中的最后一个值适用于窗口。语言名称列表可以在这里找到。我的目录在
./locales/en/LC_MESSAGES/domain.mo
/cs/LC_MESSAGES/domain.mo
我从未尝试过在Windows上使用gettext,但是每次我在Linux系统上遇到gettext问题时,原因是没有安装适当的语言包。
问题也可能是,当您更改 *.po 和 *.mo 文件时,您必须重新启动 Apache 服务器。这可能是个问题,因此您可以使用解决方法 - 始终将这些文件重命名为某个新名称,它们将被重新加载。