PHP Gettext - No translation


PHP Gettext - No translation

我正在尝试使用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 文件。 另请注意,我以前在 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.1252messages 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 服务器。这可能是个问题,因此您可以使用解决方法 - 始终将这些文件重命名为某个新名称,它们将被重新加载。