2011-03-10 77 views
15

以下示例在帶有Apache的Mac OS X上工作,即,我得到翻譯後的字符串回顯。但在使用lighttpd的Ubuntu上,我得到了原始文本'Inactive account'。我嘗試過各種各樣的環境變量組合,沒有任何運氣。這不是文件權限,因爲我可以回顯.mo文件的內容。在Ubuntu上無法獲取gettext(php)

<?php 

//$locale = 'sv_SE.UTF-8'; 
$locale = 'sv_SE'; 

$dir = dirname(__FILE__); 

// File permission is apparantly not a problem as this works... 
//echo file_get_contents($dir . '/sv_SE/LC_MESSAGES/flattr.mo'); 

putenv("LANG=$locale"); 
putenv("LANGUAGE=$locale"); 
putenv("LC_ALL=$locale"); 
putenv("LC_MESSAGES=$locale"); 
setlocale(LC_ALL, $locale); 
setlocale(LC_MESSAGES, $locale); 
//setlocale(LANG, $locale); 
//setlocale(LANGUAGE, $locale); 

bindtextdomain('flattr', $dir); 
//bind_textdomain_codeset("flattr", 'UTF-8'); 
textdomain('flattr'); 

echo _("Inactive account"); 

?> 

任何人有什麼想法?

+0

先後在OS本身正確設置了語言?看到我以前的問題也許可以幫助http://stackoverflow.com/questions/1431354/php-gettext-in-norwegian – fabrik 2011-03-10 09:16:04

+1

您是否爲sv_SE生成語言環境?如果不是,則將包含'sv_SE.UTF-8'的行添加(或取消註釋)到'/ etc/locale.gen'中,然後運行'sudo locale-gen'。 – 2011-03-10 09:16:16

+0

sudo locale-gen sv_SE.UTF-8(然後重新啓動lighttpd)工作。你可以把它作爲這個問題的答案張貼,所以我可以將其標記爲正確的?謝謝! – pthulin 2011-03-10 09:48:13

回答

33

我正面臨同樣的問題。我將描述我在Ubuntu 10.10上修復它所做的事情。

1)確保你已經 'gettext的' 安裝,

sudo apt-get install gettext 

或者,您可以安裝的PHP-gettext的'如果 '的gettext' 無法安裝。如果您已經安裝了「gettext」,則不需要包'php-gettext'。

2)然後爲您的語言生成語言環境。在這個例子中,我將使用'sv_SE'。查找支持的語言環境中 '在/ usr/share/i18n中/支',

less /usr/share/i18n/SUPPORTED 

你會發現多行以 'sv_SE' 開始,

sv_SE.UTF-8 UTF-8 
sv_SE ISO-8859-1 
sv_SE.ISO-8859-15 ISO-8859-15 

這意味着你有多種選擇用於爲sv_SE生成語言環境。其中一個選項的名稱中沒有句點(。)(即sv_SE ISO-8859-1);這是該語言環境的默認字符集。爲了生成默認字符集的語言環境,運行以下命令,

sudo locale-gen sv_SE 

如果你想生成該區域設置爲UTF-8字符集,運行此命令,

sudo locale-gen sv_SE.UTF-8 

重啓Apache 3)最後,更新您的PHP腳本以匹配您生成的語言環境。最後,更新您的PHP腳本以匹配您生成的語言環境。如果您生成'sv_SE'的語言環境,則可以使用以下命令:

setlocale(LC_ALL,「sv_SE」);

但如果產生的UTF-8當量的該區域設置,使用,

的setlocale(LC_ALL, 「sv_SE.UTF-8」);

所有應該現在工作。

+0

+1非常感謝! – iLLin 2012-04-21 15:07:14

+4

Debian發現有一個名爲'locales-all'的包,可以提供一個更簡單的方法,而無需手動執行locale-gen。我還需要'apt-get install locales' – kizzx2 2012-11-21 17:15:19

+0

+1,很好解釋! – 2013-07-14 17:06:34

1

儘管我遵循接受的答案中列出的步驟,但我無法在Ubuntu 14.04 LTS上使用它。我必須做兩件重要的事情:

(1)在生成messages.mo文件之前,我必須在消息中指定。po明確UTF-8字符集:

msgid "" 
msgstr "Project-Id-Version: PACKAGE VERSION\n" 
     "Report-Msgid-Bugs-To: \n" 
     "POT-Creation-Date: 2016-12-19 16:28+0530\n" 
     "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 
     "Last-Translator: FULL NAME <[email protected]>\n" 
     "Language-Team: LANGUAGE <[email protected]>\n" 
     "Language: \n" 
     "MIME-Version: 1.0\n" 
     "Content-Type: text/plain; charset=UTF-8\n" <---------change here 
     "Content-Transfer-Encoding: 8bit\n" 

(2)我必須保持與安裝的區域設置相同的文件夾名稱。例如,我通過運行sudo locale-gen kn_IN安裝了卡納達。這產生了kn_IN.UTF-8。請注意UTF-8中的大寫字母和連字符。我用這同一個名字,而在我的PHP腳本和在那裏我把messages.mo文件的文件夾名稱設置本地化:

php腳本:

// I18N support information 
$locale = "kn_IN.UTF-8";  <----------change here 
putenv("LANG=".$locale); 
putenv("LC_ALL=".$locale); 
setlocale(LC_ALL, $locale); 

$domain = 'messages'; 
bindtextdomain($domain, "./Locale"); 
bind_textdomain_codeset($domain, 'UTF-8'); 
textdomain($domain); 

文件夾名稱:

project_folder 
    /Locale 
     /kn_IN.UTF-8  <------change here 
      /LC_MESSAGES 
       /messages.mo 

Ubuntu對文件夾和文件名稱區分大小寫。所以請確保大寫字母保持如上所示。

參考文檔其中我指出了正確的方向:https://sendy.co/forum/discussion/935/translation-not-being-picked-up-on-ubuntu/p1