gettext设置无法正常工作

时间:2011-04-14 01:38:08

标签: php internationalization translation locale gettext

我有gettext工作,但现在它突然不会翻译。我发现了最新情况。我正在尝试使用/sys/locale/no_NO/LC_MESSAGES/messages.po将该网页翻译为挪威语。

/public/home.php

$locale = "en_US";
if (isSet($_COOKIE['lang'])) $locale = $_COOKIE['lang'];
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("messages", "../sys/locale");
textdomain("messages");

echo "<p>locale: " . $locale . " "; 
echo gettext("Home"); 
exit(); 

打印出来

locale: no_No Home我应该locale: no_No Hjem

3 个答案:

答案 0 :(得分:1)

我看到你和挪威人打架了。我也遇到了Debian服务器的问题,它只支持nb_NO和nn_NO但不支持no_NO。 解决方案是使用区域设置名称的确切名称作为文件夹和设置:

确保已安装语言环境:

$ locale -a
C
POSIX
en_US.utf8
nb_NO.utf8
nn_NO.utf8

所以挪威语bokmål的php设置:

setlocale(LC_ALL, 'nb_NO.utf8');
putenv('LANGUAGE=nb_NO.utf8');

PO文件的路径应该具有相同的名称,例如:

./i18n/nb_NO.utf8/LC_MESSAGES/messages.po

我猜相同的解决方案适用于Ubuntu。

答案 1 :(得分:0)

对于日语,我必须做以下事情:

putenv("LANG=ja_JP.UTF-8");
setlocale(LC_MESSAGES, 'ja_JP.UTF-8');
bindtextdomain('messages', '../locale');
bind_textdomain_codeset('messages', 'UTF-8');
textdomain('messages');

使用其他语言,我发现我并不总是需要添加编码后缀,这是非常不一致的。同样地,当“en”工作正常时,我不能只使用“ja”。

setlocale返回false,除非/usr/share/i18n/SUPPORTED中列出了语言环境,但翻译通常会在错误的情况下正常工作。

答案 2 :(得分:0)

您可能需要重新配置区域设置:

安装debconf(即运行apt-get update然后以root身份运行apt-get install debconf)

以root身份运行dpkg-reconfigure locales

此代码对我有用:

//Put this in cookie for example

$lang = GetPrefLanguage($_SERVER["HTTP_ACCEPT_LANGUAGE"]);

$language = $lang . '.utf8';

setlocale(LC_ALL, $language);

// Set language
putenv('LANG='.$language);

// Specify location of translation tables
bindtextdomain('traductions', dirname(__FILE__).'/locale');

// Choose domain
textdomain("traductions");

// Translation is looking for in ./locale/xx_XX/LC_MESSAGES/traductions.mo now
/*GET Pref language */
function GetPrefLanguage($str_http_languages)
{
    $lang = substr($str_http_languages, 0, 2);

    switch($lang) {
        case 'fr':
            return 'fr_FR';
        break;
        case 'de':
            return 'de_DE';
        break;
        case 'en':
            return 'en_US';
        break;
        default:
            return 'en_US';
    }
}