2011-04-14 87 views
1

我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

+0

尝试添加'putenv(“LANG = $ locale”);'。这是最后一级环境变量gettext探测器,但有时会有所帮助。否则'LANGUAGE ='具有比'LC_ALL ='更高的优先级并且允许替代'no_No:nl_NL:en_GB' – mario 2011-04-14 01:43:26

回答

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'); 

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

setlocale返回false,除非语言环境在/usr/share/i18n/SUPPORTED中列出,但翻译通常会工作,尽管出现错误。

1

我看到你正在与挪威战斗。我也遇到了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。

0

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

安装的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'; 
    } 
}