2010-05-26 29 views
6

Tengo un sitio web. Intento que Gettext funcione para que mis sitios de inglés, Suecia y Noruega puedan aparecer. No puedo conseguir que funcione. ¿Qué he hecho mal?PHP y Gettext no funcionan en mi servidor

Este es mi código de configuración:

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

y mi camino es /var/www/rssbot.dk/lang/. ¿Debo hacer que chmod sea correcto o ...?

+0

¿Dónde colocaste los archivos .mo en 'lang'? ¿Tiene un '/ var/www/rssbot.dk/lang/en_EN/LC_MESSAGES/messagess.mo'? Pruebe también 'locale -a' para ver si todas las configuraciones regionales están disponibles. –

+0

Sí para "camino" y para locale -a su retorno (C en_GB.utf8 en_US.utf8 POSIX ) me – ParisNakitaKejser

+3

Corregir si me equivoco, pero no estoy seguro de en_EN es una localización válida. Pruebe 'en_US' o quizás simplemente' en', que debería ser neutral para la región. También puede que tenga que instalar otras configuraciones regionales además del inglés en su sistema operativo para que otros idiomas funcionen. –

Respuesta

3

He descubierto que algunas instalaciones de gettext deben tener locale-gen para cada configuración regional que desee utilizar. Descubrí que esto es cierto para Ubuntu en particular. Es posible que deba reiniciar PHP (apache) después de ejecutar locale-gen.

sudo locale-gen se_SE 
sudo locale-gen no_NO 

He tiene un test setup (con trabajar los archivos de traducción) que puede determinar si la configuración de gettext está funcionando.

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

¡Esto funcionó para mí también!Estoy ejecutando una pila LAMP usando contenedores docker (Ubuntu 14.04 LTS). Aquí hay una discusión interesante que finalmente me llevó a esta respuesta en SO: https://bugs.php.net/bug.php?id=66265 –

0

Hay algunas cosas que pueden salir mal.

1- para dar cabida a la mayoría de los sistemas, necesita las siguientes líneas:

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

2- En Linux, cuando se utiliza con setlocale LC_ALL en lugar de LC_MESSAGES, necesitará tener instalado el entorno local en el servidor!

Se puede instalar con un comando como este (para Ubuntu)

aptitude install language-pack-sv 

O simplemente re-configurado con un comando como éste

sudo locale-gen sv_SE 

3- Especificar el nombre de los archivos .mo y el directorio local

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

4- Al mezclar comillas simples y dobles mientras usas gettext() o _(), necesitarás usar dos bindtextdomain!

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

5- La codificación puede ser un problema en muchos lugares. Si su archivo .mo no está en la misma codificación (utf-8 por ejemplo) que su script PHP, ¡podría no coincidir!

Cuestiones relacionadas