如何使用PHP的po / pot文件?

时间:2011-01-13 16:57:45

标签: php gettext mo php-gettext po

我在地址为 / locale / nld_nld / LC_MESSAGES / 的文件夹中有 .po .mo 文件。这两个文件的名称都是消息。我一直在尝试使用以下代码:

try.php:

<?php
require_once("Localization.php");
echo _("Hello World!");
?>

Localization.php就在这里:

<?php
$locale = "nld_nld";
if (isSet($_GET["locale"])) $locale = $_GET["locale"];
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("messages", "./locale");
bind_textdomain_codeset("messages", 'UTF-8');
textdomain("messages");
?>

try.php和Localization文件都在同一目录中。另外,我使用xampp。我还实现了phpinfo();。在表格中,在“GetText支持”前面,提到了启用。 messages.po messages.mo 文件是我使用poEdit创建的有效文件。我是一个Windows用户。但是,当我打开try.php时,它只是回显了Hello World! (不是它的翻译字符串。另外,我已经将 .po 文件100%翻译(根据poEdit)。但是,我还没有得到结果。对此有点帮助将不胜感激。

提前致谢!

3 个答案:

答案 0 :(得分:2)

当回顾我在西班牙语翻译工作网站上的代码时,我注意到我也有不同顺序的相同行,也许这有所不同?例如:

<?php
putenv('LC_MESSAGES=es_ES');
setlocale(LC_MESSAGES, 'es_ES.utf8');
bindtextdomain('es','/full/path/here/application/locale');
textdomain('messages-es');
bind_textdomain_codeset('messages-es', 'UTF-8');
?>

要使上述代码生效,我的 .mo 文件位于 /full/path/here/application/locale/es_ES.utf8 文件夹中。

也许我之前使用的以下代码可能会帮助您进一步排查问题:

<?php
function TestLang( $langCode ) {
  echo( '<b>TESTING LANG CODE: ' . strtolower( $langCode ) . '</b><br />' );
  putenv( 'LC_MESSAGES=' . strtolower( $langCode ) . '_' . strtoupper( $langCode ));
  echo( 'LC_MESSAGES: ' . getenv( 'LC_MESSAGES' ) . '<br />' );
  $localeResult = setlocale( LC_MESSAGES, strtolower( $langCode ) . '_' . strtoupper( $langCode ) . '.utf8' );
  echo( 'Locale: ' . $localeResult . '<br />' );
  $textDomain = bindtextdomain( strtolower( $langCode ), ROOT . '/' . APP_DIR . '/locale' );
  echo( 'Text Domain: ' . $textDomain . '<br />' );
  textdomain( strtolower( $langCode ));
  $codeSet = bind_textdomain_codeset( strtolower( $langCode ), 'UTF-8' );
  echo( 'Code Set: ' . $codeSet . '<br />' );
  echo( '.mo File: ' . $textDomain . '/' . $localeResult . '/LC_MESSAGES/' . $langCode . '.mo<br />' );
  echo( '<br />-- ' . _( 'Hello World!' ) . ' --<br />' );
}

TestLang( 'en' );
TestLang( 'de' );
TestLang( 'es' );
TestLang( 'fr' );
// etc..
?>

答案 1 :(得分:0)

问题可能是UTF-8中的“ ​​- ”。 还有其他行可以添加Windows兼容性。 请尝试阅读:http://www.php.net/manual/en/function.setlocale.php#89076

答案 2 :(得分:0)

输出$result=bindtextdomain($domain,$path)的返回值,它会告诉您本地路径是否确实是您希望翻译文件生效的路径。然后检查这些文件的文件访问权限(如果它们(以及直到root的目录)可由www-user访问)。它位于./locale/LC_MESSAGES/nld_nld /

textdomain($domain)应该是最后一种方法(在实际的gettext转换之前)。 bindtextdomain和textdomain的domain参数应该是相同的域名(它不在您的答案中)并且等于mo文件基本名称。

确保您的所有php文件都不使用其他textdomain,尤其是当您使用“require_once”时。

顺便说一句,您所拥有的代码在请求中查找区域设置标识符(没有过滤器)并使用nld_nld作为默认的故障恢复,我会在其中放置一种普通语言(如“en”之类的主站点语言)。