2012-05-07 47 views
6

Estoy tratando de usar la extensión PHP gettext para traducir algunas cadenas. Todas las funciones parecen devolver los valores correctos, pero al llamar al gettext()/_() solo se devuelve la cadena original. Los archivos PO/MO parecen correctos y creo que configuré los directorios correctamente. Estoy ejecutando WAMP Server con PHP 5.3.10 en Windows (también intenté ejecutar 5.3.4 y 5.3.8 porque tengo las instalaciones).PHP Gettext - Sin traducción

En primer lugar, ver /new2/www/index.php:

$locale = 'esn'; # returns Spanish_Spain.1252 in var dump 

putenv("LC_ALL={$locale}"); // Returns TRUE 
setlocale(LC_ALL, $locale); // Returns 'Spanish_Spain.1252' 

$domain = 'messages'; 
bindtextdomain($domain, './locale'); // Returns C:\wamp\www\new2\www\locale 
bind_textdomain_codeset($domain, 'UTF-8'); // Returns UTF-8 
textdomain($domain); // Returns'messages' 

print gettext("In the dashboard"); // Prints the original text, not the translation. 
exit; 

He creado la siguiente estructura de archivos:

www/new2/www/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo 

también he intentado reemplazar Spanish_Spain.1252 con: es_ES, esn, esp, Spanish, y Spanish_Spain.

El archivo PO usado para generar el Mo es igual que (sólo la entrada pertinente dado):

#: C:\wamp\www\new2/www/index.php:76 
msgid "In the dashboard" 
msgstr "TRANSLATED es_ES DASHBOARD" 

Este se generó usando PoEdit. He reiniciado Apache después de agregar cualquier archivo .MO nuevo. También tenga en cuenta que antes estaba usando Zend_Translate con Gettext y que se está traduciendo correctamente. Sin embargo, deseo confiar en la extensión nativa de gettext, en parte porque estoy intentando crear un framework liviano.

Cualquier ayuda sería apreciada.

Editar: Estructura de directorios modificada. Nota: podrá probar las respuestas recientes dentro de las 24 horas.

+0

¿No debería su ubicación y directorio ser 'es_ES.UTF-8'? – mario

+0

@mario He intentado con esa locale y el directorio pero 'setlocale()' luego devuelve falso. – Pete171

Respuesta

1

Mire here. Funciona para mí en Windows y en Linux también. Los últimos valores en la matriz funcionan para Windows. La lista de nombres de idiomas se puede encontrar en here. Mis catálogos están en

./locales/en/LC_MESSAGES/domain.mo 
     /cs/LC_MESSAGES/domain.mo 
+0

@ FandaIntenté usar los nombres de la configuración regional de Windows (incluidos 'esn' y' esp' - como en mi pregunta). Acabo de probar varios ejemplos directamente desde la publicación a la que vinculó, estableciendo la configuración regional en 'array ('de_DE.UTF-8', 'de_DE', 'de', 'german')'. Creé un archivo 'locale/[VALUE-FROM-ARRAY]/LC_MESSAGES/messagess.mo' para cada uno de estos valores y reinicié Apache antes de volver a intentarlo - sin suerte. Todas las funciones regresan correctamente, sin embargo. ¿Alguna otra sugerencia? – Pete171

+0

¿Intentó cambiar el nombre de lang subdir a código de 2 letras? (locales/de/LC ...? – Fanda

+0

@FandaYes, tengo. Sin suerte. – Pete171

0

problema puede ser también que cuando se cambia su * .po y .mo * archivos, usted tiene que reiniciar el servidor Apache. Esto puede ser un problema, por lo que puede usar una solución alternativa: siempre cambie el nombre de estos archivos a un nuevo nombre y se volverán a cargar.

+0

@jasirPor favor, lea mi pregunta original; He reiniciado Apache cada vez que mis archivos .MO han cambiado. Gracias. – Pete171

2

Sugerencia: es posible que necesite la configuración regional completa para el archivo .mo. Esto es probablemente Spanish_Spain.UTF8 o esn_esn.UTF8 o esn_esp.UTF8 (no 1252, ya que cambia la base del código).

Para rastrear qué directorio está buscando, puede instalar Process monitor (http://technet.microsoft.com/en-us/sysinternals/bb896645). Extrae cantidades de elementos en la información, pero debería poder averiguar qué archivo/directorio se está buscando.

(Mi otro pensamiento es verificar los permisos de archivos, pero si ya tienes algo similar en Zend_Translate, entonces probablemente no sea la causa, pero vale la pena consultarlo de todos modos).

Lo siento si no es bueno, pero podría darle una pista.

+0

Gracias. Echaré un vistazo al monitor de procesos más adelante y veré si me ayuda. Podría ser exactamente lo que estoy buscando. – Pete171

3

Configuré esto en mi instancia XAMPP y lo resuelvo.

  • Flat out setlocale no funciona en Windows, por lo que lo que devuelve es irrelevante.
  • Para Windows se establece la configuración regional utilizando los códigos de idioma/país estándar (en este caso es es_ES español que se habla en España)
  • Bajo el directorio locale crear es_ES/LC_MESSAGES /. Aquí donde vive tu archivo messages.mo.

    $locale = 'es_ES'; 
    
    putenv("LC_ALL={$locale}"); // Returns TRUE 
    
    $domain = 'messages'; 
    bindtextdomain($domain, './locale'); 
    bind_textdomain_codeset($domain, 'UTF-8'); 
    textdomain($domain); // Returns'messages' 
    
    print gettext("In the dashboard"); 
    exit; 
    

no estoy seguro si esto hizo una diferente, pero lo hizo dos cosas al crear el archivo po. En poEdit en Archivo -> Preferencias cambié el formato final de línea a Windows. Y después de crear el po inicial con poEdit, abrí el archivo en Notepad ++ y cambié el tipo de codificación a UTF-8 ya que poEdit no lo hacía.

Espero que esto al menos te dirija en la dirección correcta.

Referencias

PHP Localization Tutorial on Windows

Country Codes

Language Codes

1

nunca he intentado usar gettext en Windows, pero cada vez que tenía problemas con gettext en sistemas Linux, la razón era que un paquete de idioma apropiado no estaba instalado.

3

Su código menciona esto como el valor de retorno de bindtextdomain:

C:\wamp\www\new2\www\locale 

Con la setlocale de Spanish_Spain.1252 y textdomain de messages, llama a gettext se verá en esta ruta:

C:\wamp\www\new2\www\locale\Spanish_Spain.1252\LC_MESSAGES\messages.mo 

Pero creó la estructura de archivos de:

www/new2/locale/Spanish_Spain.1252/LC_MESSAGES/messages.mo 
     ^^ 
     www/ missing here 

Editar

Bueno, eso no sirvió de nada. He creado un script de prueba en Windows y uso de dicho programa como tú:

$locale = "Dutch_Netherlands.1252"; 
putenv("LC_ALL=$locale"); // 'true' 
setlocale(LC_ALL, $locale); // 'Dutch_Netherlands.1252' 
bindtextdomain("messages", "./locale"); // 'D:\work\so\l10n\locale' 
textdomain("messages"); // 'messages' 

echo _("Hello world"); // 'Hallo wereld' 

Mi estructura de carpetas es la siguiente:

D:\work\so\l10n\ 
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.mo 
    \locale\Dutch_Netherlands.1252\LC_MESSAGES\messages.po 
    \test.php 

creo que sirve, aunque parece casi idéntica a la suya. Algunas cosas que encontraron en línea:

  • Es importante establecer el conjunto de caracteres en el archivo .po
  • espacios dentro del archivo de localización podría tener una alternativa UTF8, por lo que tener cuidado con las búsquedas de fallo clave. Probablemente, lo mejor para probar primero son las teclas sin espacios en absoluto.
+0

Ahh, Lo siento, lo copié incorrectamente. De hecho, he creado 'C: \ wamp \ www \ new2 \ www \ locale \ Spanish ...', etc. Ahora modificaré mi pregunta. ¡Gracias por detectar eso! – Pete171

+0

@ Pete171 He actualizado mi respuesta, eche un vistazo. –

Cuestiones relacionadas