2009-07-28 42 views
5

Siempre he oído sobre gettext - Sé que es una especie de comando de Unix buscar una traducción basada en el argumento de cadena proporcionado, y luego produce un archivo .pot pero alguien puede explicarme en términos sencillos cómo se cuida esto de en un marco web?Agregando soporte para i18n en PHP con gettext?

Podría ver cómo lo ha hecho algún marco establecido, pero la explicación de un profano sería útil porque podría ayudar a aclarar la imagen un poco más antes de profundizar en las cosas para proporcionar mi propia solución.

Respuesta

12

El sistema gettext hace eco de cadenas de un conjunto de archivos binarios que se crean a partir de archivos de texto fuente que contienen las traducciones en diferentes idiomas para la misma oración.

La clave de búsqueda es la oración en un idioma "base".

en el código fuente va a tener algo como

echo _("Hello, world!"); 

para cada idioma tendrá un archivo de texto correspondiente con la llave y la versión traducida (nótese el s% que se puede utilizar con las funciones printf)

french 
msgid "Hello, world!" 
msgstr "Salut, monde!" 
msgid "My name is %s" 
msgstr "Mon nom est %s" 

italian 
msgid "Hello, world!" 
msgstr "Ciao, mondo!" 
msgid "My name is %s" 
msgstr "Il mio nome è %s" 

Estos son los principales pasos que tiene que ir a través de la creación de sus localizaciones

  • toda su salida de texto debe utilizar las funciones de gettext (gettext(), ngettext(), _())
  • uso xgettext (* nix) para analizar sus archivos php y crear el archivo de texto .po base de
  • uso poedit a añadir textos de traducción para los archivos .po
  • uso msgfmt (* nix) para crear el archivo .mo binaria del archivo .po
  • poner los archivos .mo en una estructura de directorios como

locale/de_DE/LC_MESSAGES/myPHPApp.mo

locale/en_EN/LC_MESSAGES/myPHPApp.mo

locale/it_IT/LC_MESSAGES/myPHPApp.mo

entonces script php debe establecer la configuración regional que es necesario utilizar

El ejemplo de la php manual es muy claro para esa parte

<?php 
// Set language to German 
setlocale(LC_ALL, 'de_DE'); 

// Specify location of translation tables 
bindtextdomain("myPHPApp", "./locale"); 

// Choose domain 
textdomain("myPHPApp"); 

// Translation is looking for in ./locale/de_DE/LC_MESSAGES/myPHPApp.mo now 

// Print a test message 
echo gettext("Welcome to My PHP Application"); 

// Or use the alias _() for gettext() 
echo _("Have a nice day"); 
?> 

siempre desde el manual de PHP vistazo here para un buen tutorial

+0

Pero lo anterior El ejemplo del manual PHP no parece traducir la cadena dada. ¿Hay algo más que ver con el ejemplo? –

Cuestiones relacionadas