【问题标题】:PHP Gettext - No translationPHP Gettext - 没有翻译
【发布时间】: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。

标签: php windows translation gettext poedit


【解决方案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...?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多