2010-05-26 14 views
6

Ich habe eine Website. Ich versuche, gettext zur Arbeit zu bringen, damit meine englischen, schwedischen und norwegischen Seiten auftauchen können. Ich kann es nicht zur Arbeit bringen. Was habe ich falsch gemacht?PHP und Gettext funktionieren nicht auf meinem Server

Dies ist meine Config-Code:

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

Und mein Weg ist /var/www/rssbot.dk/lang/. Soll ich chmod richtig machen, oder ...?

+0

Wo haben legen Sie die .mo-Dateien unter 'lang'? Haben Sie eine '/ var/www/rssbot.dk/lang/en_DE/LC_MESSAGES/messages.mo'? Probieren Sie auch 'locale -a' aus, um zu sehen, ob alle Gebietsschemas verfügbar sind. –

+0

Ja „Pfad“ und -a seine Rückkehr nach locale (C en_GB.utf8 en_US.utf8 POSIX ) – ParisNakitaKejser

+3

mich korrigieren, wenn ich falsch bin, aber ich bin nicht sicher, de_DE ein gültiges Gebietsschema ist. Versuchen Sie 'en_US' oder vielleicht nur' en', das regionenneutral sein sollte. Möglicherweise müssen Sie auch andere Gebietsschemas als Englisch auf Ihrem Betriebssystem installieren, damit die anderen Sprachen funktionieren. –

Antwort

3

ich gefunden habe, dass einige gettext locale-gen ausgeführt haben installiert müssen für jedes Gebietsschema Sie verwenden möchten. Ich fand das vor allem für Ubuntu wahr. Möglicherweise müssen Sie PHP (Apache) nach der Ausführung von locale-gen neu starten.

sudo locale-gen se_SE 
sudo locale-gen no_NO 

Ich habe habe ein test setup (mit Arbeits locale-Dateien), die, wenn Sie gettext Setup bestimmen arbeitet.

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

Das hat auch für mich funktioniert!Ich benutze einen LAMP-Stack mit Docker-Containern (Ubuntu 14.04 LTS). Hier ist eine interessante Diskussion, die mich schließlich zu dieser Antwort auf SO geführt hat: https://bugs.php.net/bug.php?id=66265 –

0

Es gibt ein paar Dinge, die schief gehen könnten.

1- Für die meisten Systeme zu empfangen, benötigen Sie die folgenden Zeilen:

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

2- Unter Linux wenn setlocaleQ mit LC_ALL statt LC_MESSAGES mit, müssen Sie das Gebietsschema installiert haben auf dem Server!

Es kann wie dieser mit einem Befehl installiert werden (Ubuntu)

aptitude install language-pack-sv 

Oder nur mit einem Befehl umkonfiguriert wie diese

sudo locale-gen sv_SE 

3- Geben der Name .mo Dateien und Landverzeichnis

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

4- Bei einfachen und doppelten Anführungszeichen Mischen während gettext() oder _() enthalten, benötigen zwei bindtextdomain nutzen zu können!

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

5- Codierung kann an vielen Stellen ein Problem sein. Wenn Ihre .mo-Datei nicht die selbe Kodierung (zB utf-8) hat als Ihr PHP-Skript, stimmt sie möglicherweise nicht überein!

Verwandte Themen