2010-05-26 14 views
6

Web sitem var. İngilizce, İsveççe ve Norveç sitelerimin gelebilmesi için gettext almaya çalışıyorum. İşe yaratamıyorum. Neyi yanlış yaptım?PHP ve Gettext benim sunucumda çalışmaz

Bu benim yapılandırma kodudur:

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

Ve yol /var/www/rssbot.dk/lang/ olduğunu. Chmod'u doğru yapmalı mıyım yoksa ...?

+0

.mo dosyalarını "lang" altına nereye yerleştirdiniz? Bir/var/www/rssbot.dk/lang/en_EN/LC_MESSAGES/messages.mo' var mı? Ayrıca tüm yerellerin mevcut olup olmadığını görmek için 'yerel ayarı' deneyin. –

+0

Evet "yol" ve -A onun dönüşünü yerel ayarında için ben yanılıyorum ama en_EN geçerli bir yerel olduğundan emin değilim eğer (en_GB.utf8 en_US.utf8 POSIX C ) beni düzelt – ParisNakitaKejser

+3

. Bölgeyi nötr olan 'tr' ya da belki sadece 'tr' deneyin. Diğer dilleri öğrenmek için işletim sisteminizde İngilizce'den başka yerel ayarlar da yüklemeniz gerekebilir. –

cevap

3

Bazı gettext yüklemelerinin kullanmak istediğiniz her yerel ayar için locale-gen çalıştırması gerektiğini buldum. Bunu özellikle Ubuntu için doğru buldum. locale-gen çalıştırdıktan sonra PHP'yi (apache) yeniden başlatmanız gerekebilir.

sudo locale-gen se_SE 
sudo locale-gen no_NO 

Ben bıraktığım bir test setup (ile yerelleştirme dosyalarını çalışma) Eğer gettext kurulum çalıştığını belirlemesi anlamına.

<?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

Bu benim için de çalıştı!Docker konteynerleri (Ubuntu 14.04 LTS) kullanarak bir LAMP yığını çalıştırıyorum. İşte eninde sonunda bu cevaba beni yönlendiren ilginç bir tartışma: https://bugs.php.net/bug.php?id=66265 –

0

Hatalı olabilecek birkaç şey var.

1- çoğu sistemlerini karşılamak için, aşağıdaki satırları gerekir: LC_ALL ile yerine ait LC_MESSAGES setlocale kullanırken Linux'ta

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

2-, sen yerel yüklü olması gerekir sunucuda!

Bu bir

sudo locale-gen sv_SE 

3- komutuyla yapılandırılmış yeniden sadece

aptitude install language-pack-sv 

ya da (Ubuntu için) bu gibi bir komut ile kurulabilir belirtme .mo dosyaları ve yerel dizinin adı

4- gettext() veya _() öğesini kullanırken tek ve çift tırnak işaretleri karıştırırken, iki bindtextdomain kullanmanız gerekecek!

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

5- Kodlama, birçok yerde bir sorun olabilir. .mo dosyanız PHP betiğinizden aynı kodlamada değilse (örneğin utf-8), eşleşmeyebilir!