gettext设置不起作用
问题描述:
我gettext工作,但现在它突然不会翻译。我知道发生了什么事。我正尝试使用/sys/locale/no_NO/LC_MESSAGES/messages.po
将网页翻译为挪威语。gettext设置不起作用
/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
答
日本我必须做到以下几点:
putenv("LANG=ja_JP.UTF-8");
setlocale(LC_MESSAGES, 'ja_JP.UTF-8');
bindtextdomain('messages', '../locale');
bind_textdomain_codeset('messages', 'UTF-8');
textdomain('messages');
与其他语言,我发现我并不总是必须添加enc编码后缀,这是非常不一致的。同样,我不能只在“en”正常工作时使用“ja”。
setlocale
返回false,除非语言环境在/usr/share/i18n/SUPPORTED
中列出,但翻译通常会工作,尽管出现错误。
答
我看到你正在与挪威战斗。我也遇到了Debian服务器的问题,它只支持nb_NO和nn_NO,但不支持no_NO。 的解决方案是使用区域设置名称为文件夹和设置的确切名称:
确保你已经安装了语言环境:
$ locale -a
C
POSIX
en_US.utf8
nb_NO.utf8
nn_NO.utf8
所以PHP设置为挪威语:
setlocale(LC_ALL, 'nb_NO.utf8');
putenv('LANGUAGE=nb_NO.utf8');
PO文件的路径应该具有相同的名称,例如:
./i18n/nb_NO.utf8/LC_MESSAGES/messages.po
我猜相同的解决方案将适用于Ubuntu。
答
您可能需要重新配置的区域设置:
安装的debconf(即运行apt-get更新则易于得到安装的debconf,作为root)
运行的dpkg-重新配置的语言环境根
这代码为我工作:
//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';
}
}
尝试添加'putenv(“LANG = $ locale”);'。这是最后一级环境变量gettext探测器,但有时会有所帮助。否则'LANGUAGE ='具有比'LC_ALL ='更高的优先级并且允许替代'no_No:nl_NL:en_GB' – mario 2011-04-14 01:43:26