2011-01-13 54 views
5

我有一個的.po的.mo文件,其地址爲/區域/ nld_nld/LC_MESSAGES/一個文件夾中。這兩個文件的名字都是消息。我一直在嘗試使用下面的代碼:如何在php中使用po/pot文件?

try.php:

<?php 
require_once("Localization.php"); 
echo _("Hello World!"); 
?> 

的Localization.php放在這裏:

<?php 
$locale = "nld_nld"; 
if (isSet($_GET["locale"])) $locale = $_GET["locale"]; 
putenv("LC_ALL=$locale"); 
setlocale(LC_ALL, $locale); 
bindtextdomain("messages", "./locale"); 
bind_textdomain_codeset("messages", 'UTF-8'); 
textdomain("messages"); 
?> 

無論是try.php和本地化文件在同一個目錄中。另外,我使用xampp。我也執行了phpinfo();。在表格中,在「GetText支持」前面,提到了啓用。 messages.pomessages.mo文件是我使用poEdit創建的有效文件。我是一個Windows用戶。但是,當我打開try.php時,它只是回顯Hello World! (而不是它的翻譯字符串。另外,我(根據poEdit)。不過,我沒有得到的結果翻譯的.po文件100%。在這一點幫助,將不勝感激。

謝謝!提前

回答

2

當代碼回頭看我。在西班牙語翻譯的工作網站上,我注意到我也有不同順序的相同的行,也許這有什麼區別?例如:

<?php 
putenv('LC_MESSAGES=es_ES'); 
setlocale(LC_MESSAGES, 'es_ES.utf8'); 
bindtextdomain('es','/full/path/here/application/locale'); 
textdomain('messages-es'); 
bind_textdomain_codeset('messages-es', 'UTF-8'); 
?> 

對於上面的代碼工作,我的.mo文件是在/full/path/here/application/locale/es_ES.utf8文件夾。

也許下面的代碼,我以前用過可以幫助你進一步解決:

<?php 
function TestLang($langCode) { 
    echo('<b>TESTING LANG CODE: ' . strtolower($langCode) . '</b><br />'); 
    putenv('LC_MESSAGES=' . strtolower($langCode) . '_' . strtoupper($langCode)); 
    echo('LC_MESSAGES: ' . getenv('LC_MESSAGES') . '<br />'); 
    $localeResult = setlocale(LC_MESSAGES, strtolower($langCode) . '_' . strtoupper($langCode) . '.utf8'); 
    echo('Locale: ' . $localeResult . '<br />'); 
    $textDomain = bindtextdomain(strtolower($langCode), ROOT . '/' . APP_DIR . '/locale'); 
    echo('Text Domain: ' . $textDomain . '<br />'); 
    textdomain(strtolower($langCode)); 
    $codeSet = bind_textdomain_codeset(strtolower($langCode), 'UTF-8'); 
    echo('Code Set: ' . $codeSet . '<br />'); 
    echo('.mo File: ' . $textDomain . '/' . $localeResult . '/LC_MESSAGES/' . $langCode . '.mo<br />'); 
    echo('<br />-- ' . _('Hello World!') . ' --<br />'); 
} 

TestLang('en'); 
TestLang('de'); 
TestLang('es'); 
TestLang('fr'); 
// etc.. 
?> 
+0

textdomain()通常是最後一個函數調用(實際上,如果使用多個域,每次調用gettext之後可能需要調用_())。首先綁定所有域,然後選擇一個域。 – eckes

+0

在你的例子中,你使用了兩個不同的域名'es'和'messages-es'。這可能不起作用(並且通常您沒有文件名中的語言標識符,因爲它是由目錄定義的)。因此「/full/path/here/application/locale/es_ES/LC_MESSAGES/messages.mo」將是域「messages」和LC_TYPE es_ES的文件名。 – eckes

0

輸出的$result=bindtextdomain($domain,$path)的返回值,它會告訴你,如果你的本地路徑是確實的路徑,你希望你的翻譯文件生活。然後檢查這些文件的文件訪問權限(如果它們(和根目錄以下的目錄)可以由www用戶訪問)。它位於./locale/LC_MESSAGES/nld_nld/

textdomain($domain)應該是最後一個方法(在實際的gettext轉換之前)。 bindtextdomain和textdomain的域參數應該是相同的域名(它不在您的答案中)並且等於mo文件基本名稱。

確保沒有任何php文件使用其他文本域,特別是當您使用「require_once」時。

順便說一句,你已經在請求中尋找區域標識符的代碼(沒有過濾器),並使用nld_nld作爲默認的故障恢復,我會在那裏放置一個正常的語言(主要網站語言,如「en」)。

相關問題