2010-05-26 133 views
6

我有一個網站。我試圖讓gettext工作,以便我的英語,瑞典和挪威站點能夠出現。我無法讓它工作。我做錯了什麼?PHP和Gettext不能在我的服務器上工作

這是我的配置代碼:

// define constants (defualt - danish) 
$lang = 'da_DA'; 
$lang_short = ''; 
$lang_prefix = 'da'; 

if (isset($_GET['lang'])) 
{ 
    switch($_GET['lang']) 
    { 
     case 'en': 
      $lang = 'en_EN'; 
      $lang_short = 'en/'; 
      $lang_prefix = 'en'; 
      break; 
     case 'se': 
      $lang = 'se_SE'; 
      $lang_short = 'se/'; 
      $lang_prefix = 'se'; 
      break; 
     case 'no': 
      $lang = 'no_NO'; 
      $lang_short = 'no/'; 
      $lang_prefix = 'no'; 
      break; 
    } 
} 
define('LANG', $lang_short); 
define('LANG_PREFIX', $lang_prefix); 

putenv("LC_ALL=". $lang); 
bindtextdomain('messages', ROOT .'lang/'); 

我的路徑是/var/www/rssbot.dk/lang/。我應該讓chmod正確還是...?

+0

你把.mo文件放在'lang'下的哪個位置?你有'/ var/www/rssbot.dk/lang/en_EN/LC_MESSAGES/messages.mo'嗎?還可以嘗試'locale -a'來查看是否所有的語言環境都可用。 – 2010-05-26 17:39:47

+0

是爲「路徑」,並locale -a命令其返回(C en_GB.utf8 en_US.utf8 POSIX ) – ParisNakitaKejser 2010-05-26 17:44:07

+3

糾正我,如果我錯了,但我不知道的en_EN是一個有效的語言環境。試試'en_US'或者只是'en',這應該是區域中立的。您可能還需要在操作系統上安裝英語以外的其他語言環境才能使其他語言正常工作。 – 2010-05-26 18:06:18

回答

3

我發現某些gettext安裝需要爲要使用的每個語言環境運行locale-gen。我發現這對Ubuntu尤其如此。在運行locale-gen後,您可能需要重新啓動PHP(apache)。

sudo locale-gen se_SE 
sudo locale-gen no_NO 

我已經有一個test setup(與工作區域設置文件),它可以決定你是否gettext的安裝工作。

<?php 

//Depending on your OS, putenv/setlocale/both will set your language. 
putenv('LC_ALL=es_MX'); 
setlocale(LC_ALL, 'es_MX'); 

bindtextdomain("su", "./locale"); //set the locale folder for a textdomain 
bind_textdomain_codeset("su", "UTF-8"); //set the codeset for a textdomain 
textdomain("su"); //choose a textdomain 

if(gettext("Hello World!") === "Hola a todos!") { 
    print "We translated it correctly"; 
} else { 
    print "Gettext setup isn't working"; 
} 

?> 
+0

這也適用於我!我使用Docker容器(Ubuntu 14.04 LTS)運行LAMP堆棧。這是一個有趣的討論,最終讓我在SO上得到了這個答案:https://bugs.php.net/bug.php?id = 66265 – 2014-10-04 12:40:32

0

有幾件事情可能會出錯。

1,以適應大多數系統中,你需要下面幾行:

<?php 
$newlocale = setlocale(LC_MESSAGES, "sv_SE"); 
putenv("LANG=$newlocale"); 
?> 

2 - 在Linux上,使用的setlocale時LC_ALL的代替LC_MESSAGES,你將需要安裝的語言環境在服務器上!

它可以與像這樣的(爲Ubuntu)

aptitude install language-pack-sv 

或者只是重新配置成與這樣的命令一個

sudo locale-gen sv_SE 

3-命令安裝指定.mo文件和區域設置目錄的名稱

<?php 
// Use default.mo located at ./locale/LC_MESSAGES/default.mo 
bindtextdomain("domain", "./locale"); 
?> 

4-在使用gettext()或_()時混合單引號和雙引號時,您將需要使用兩個bindtextdomain!

<?php 
// Double quote _("Hello world") is matched 
bindtextdomain("domain", "./locale"); 
// Single quote _('Hello world') is matched 
bindtextdomain('domain', "./locale"); 
?> 

5-編碼可能是許多地方的問題。如果.mo文件與您的PHP腳本不是相同的編碼(例如utf-8),則它可能不匹配!

相關問題