【问题标题】:PHP gettext function only returns original untranslated stringPHP gettext 函数只返回原始未翻译的字符串
【发布时间】:2011-01-26 09:39:34
【问题描述】:

我正在尝试使用 gettext 向我的网站添加本地化支持。我遵循了有关如何设置 gettext 的各种指南并完成了以下操作:

我在项目目录的根目录中创建了以下文件和目录:

test.php

locale/
  de_DE
    LC_MESSAGES
       messages.mo
       messages.po

  en_GB
    LC_MESSAGES
       messages.mo
       messages.po

我使用Poedit 创建了上述 .po 和 mo 文件。我已经让 sue 它使用 Unix 行尾、UTF-8 并相应地设置语言和国家/地区。

然后我创建了一个名为 test.php 的 PHP 脚本,其中包含以下代码:

<?php

  define('LOCALE', 'de_DE');

  // Set up environmental variables
  putenv("LC_ALL=" . LOCALE);
  setlocale(LC_ALL, LOCALE);
  bindtextdomain("messages", "./locale");
  bind_textdomain_codeset("messages", LOCALE .".utf8");
  textdomain("messages");

  die(gettext('This is a test.'));

?>

我已导入文本“这是一个测试”。到 Poedit 并提供翻译并保存。

但由于某种原因,test.php 脚本只会输出未翻译的原始文本。它拒绝加载翻译文件的版本。

值得注意的是,服务器运行的是Linux(Ubuntu), Apache 2.2.11 和 PHP 5.2.6-3ubuntu4.5。我检查了phpinfo() 并启用了gettext。

【问题讨论】:

    标签: php apache localization gettext


    【解决方案1】:

    您的问题可能与系统上缺少区域设置有关。请安装德语语言环境,一切正常:

    sudo apt-get install language-pack-de-base
    

    然后,发出以下命令,您应该会看到德语语言环境:

    locale -a
    

    之后,假设您描述的目录结构中仍有 .po 和 .mo 文件,以下代码应该可以工作:

      <?php
    
      setlocale(LC_ALL, 'de_DE.UTF-8');
      bindtextdomain('messages', './locale');
      textdomain('messages');
    
      echo gettext('This is a test.');
    
      ?>
    

    【讨论】:

    • 那么,它奏效了吗?这实际上是与缺少语言环境或其他原因有关的问题吗?
    • 没问题!我很高兴能帮上忙!
    【解决方案2】:

    是的,是的,PHP 的 gettext 再次支持。只是一个提示,可能对您有帮助,也可能对您没有帮助:

    由于 PHP 糟糕的 gettext 实现,很多像​​ WordPress 这样的开源项目都切换到了这个:http://savannah.nongnu.org/projects/php-gettext/,并且完全绕过了原来的版本。

    我在我的一个项目中也这样做了,我不能说我错过了什么。

    商业项目的缺点:它在 GPL 之下。

    【讨论】:

    • 有趣。我会看看这个。啊,虽然它是 GPL 将是一个问题。
    • 无法使用它,因为就像你说的那样,它是 GPL,而我遇到的这个问题是关于商业项目的。
    • 我知道问题所在。我们这里也有一个闭源项目,我们只能自己实现一些东西,因为我们不能使用 php-gettext(或者想依赖 PHP 的 gettext 模块)。但是,我认为值得回答,因为它是一个重要的项目,可以合并到其他 GPL ed PHP 软件中。
    【解决方案3】:

    试试下面的

    <?php
    
      define(LC_MESSAGES, 'de_DE');
    
      // Set up environmental variables
      putenv("LANGUAGE=de_DE");
      bindtextdomain("*", dirname(__FILE__).'/locale');
      bind_textdomain_codeset("messages", 'UTF-8');      
    
      die(gettext('This is a test.'));
    
    ?>
    

    【讨论】:

    • 不幸的是,这不起作用。它仍然只显示英文版本。
    猜你喜欢
    • 2011-11-09
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多