2011-04-14 117 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'; 
    } 
}