如何调试gettext无法在PHP中工作?

glu*_*utz 15 php localization gettext internationalization setlocale

我想在php 5.5中使用php gettext扩展(在win2008服务器上,使用IIS7).我这样做:

<?php

$locale = "es";
if (isSet($_GET["locale"])) $locale = $_GET["locale"];
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("messages", "./locale");
textdomain("messages");

echo gettext("Hello world");

?>
Run Code Online (Sandbox Code Playgroud)

使用此文件夹结构:

locale/es/LC_MESSAGES/messages.mo
Run Code Online (Sandbox Code Playgroud)

但它总是只返回Hello世界而不是正确的翻译现在(基于我缺乏西班牙语技能)是在messages.po文件中:

msgid ""
msgstr ""
"Project-Id-Version: TestXlations\n"
"POT-Creation-Date: 2014-04-19 08:15-0500\n"
"PO-Revision-Date: 2014-04-19 09:18-0500\n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.6.3\n"
"X-Poedit-Basepath: .\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SearchPath-0: c:/dev\n"

msgid "Hello world"
msgstr "Hola World"
Run Code Online (Sandbox Code Playgroud)

这从cmd行和IIS失败.所以我看到gettext调用等并执行它但它没有读取翻译文件.我该如何进一步调试?即使删除翻译文件,我也会得到相同的行为.

akk*_*kky 16

您应该检查返回的值并知道哪个函数失败了.它不是特定的,但对任何PHP脚本或任何编程语言调试都很有用.

<?php
$locale = 'es';
if (isset($_GET["locale"])) $locale = $_GET["locale"];

$domain = 'messages';

$results = putenv("LC_ALL=$locale");
if (!$results) {
    exit ('putenv failed');
}

// http://msdn.microsoft.com/en-us/library/39cwe7zf%28v=vs.100%29.aspx
$results = setlocale(LC_ALL, $locale, 'spanish');
if (!$results) {
    exit ('setlocale failed: locale function is not available on this platform, or the given local does not exist in this environment');
}

$results = bindtextdomain($domain, "./locales");
echo 'new text domain is set: ' . $results. "\n";

$results = textdomain($domain);
echo 'current message domain is set: ' . $results. "\n";

$results = gettext("Hello world");
if ($results === "Hello world") {
    echo "Original English was returned. Something wrong\n";
}
echo $results . "\n";
Run Code Online (Sandbox Code Playgroud)

  • 对.除了gettext调用之外,它看起来都很好.确实有些不对劲. (4认同)
  • 同样在这里.真的很沮丧.你有没有发现你的问题是什么? (3认同)

sha*_*pta 11

你在'locale -a'的输出中找到"es"吗?如果没有,则需要运行以下命令.

 sudo locale-gen es
Run Code Online (Sandbox Code Playgroud)

  • 我最近移动了主机,我的gettext停止工作.检查了区域设置-a并看到缺少​​区域设置,添加它并再次开始工作! (2认同)

小智 10

在Linux上遇到同样的问题,我得出了这样的结论:即使您为项目提供了自己的*.mo文件,操作系统也必须知道语言环境本身.

在系统级别安装请求的区域设置为我解决了问题.

见:locale-gen

实际调试 gettext 可能没什么帮助,但至少你可以尝试一下.


Mac*_*eeE 6

由于不知道在OS上使用哪种语言包,幸好该setlocale()函数允许使用数组.根据PHP文档:

"如果locale是一个数组或后跟其他参数,则尝试将每个数组元素或参数设置为新的语言环境直到成功.如果在不同系统上以不同名称知道语言环境或为可能提供回退,这将非常有用.不可用的语言环境"

有了这个,您可以通过检查以后的集合来查找操作系统回退的区域设置:

$locales = array( "fr_FR", "fr_FR.UTF-8", "fr_FR.utf8", "fr-FR" );

if (( $setTo = setlocale( LC_ALL, $locales )) === FALSE )
{
    echo "Unable to set a locale that the OS recognises.";
    return false;
}
else
{
    echo "Set LC_ALL to " . $setTo; //echos fr_FR.utf8
    return true;
}
Run Code Online (Sandbox Code Playgroud)

$setTo将提供$locales成功的价值.在查找要编写.pofor的区域设置时,这可能会有所帮助.

根据我的评论中写的,我遇到的问题是我没有setlocale()在每个页面请求的每个脚本的顶部执行此操作,因为您需要通过会话或数据库值保留用户对语言的选择.一旦它被设定,我天真地相信,它永远被设定!