2010-02-23 37 views
10

Hasta ahora, las únicas 2 cosas buenas que he visto sobre el uso de gettext en lugar de matrices es que no tengo que crear la "sub-matriz" de "saludo" (o como se llame). Y no tengo que crear una carpeta para el "idioma predeterminado".Usando PHP Gettext Extension vs PHP Arrays in Multilingual Websites?

¿Existen otros pros y los contras de usar gettext y php arrays para sitios web multilingües?

USO getText:

español/messages.po:

#: test.php:3 
msgid "Hello World!" 
msgstr "Hola Mundo" 

index.php:?

<?php echo _("Hello World!"); ?> 

index.php lang = español:

<?php echo _("Hello World!"); ?> turns to Hola Mundo 

utilizando matrices PHP:

lang.en.php

<?php 
$lang = array(
    "greeting" => "Hello World", 
); 
?> 

lang.es.php

<?php 
$lang = array(
    "greeting" => "Hola Mundo", 
); 
?> 

index.php:?

<?php echo $lang['greeting']; ?> greeting turns to Hello World 

index.php lang = español

<?php echo $lang['greeting']; ?> greeting turns to Hola Mundo 

(empecé con gettext, pero no fue apoyado en mi compartida libre Zymic de alojamiento. No quería usar Zend_translate, lo encontré demasiado complicado para mi tarea simple, así que finalmente terminé usando php define, pero más tarde alguien me dijo que debería usar matrices)

Respuesta

7

Al usar GNU gettext obtienes soporte para marcadores de posición como con printf y formularios internacionales plurales. El orden de los marcadores de posición puede cambiarse en la traducción o saltarse.

Ejemplo de documentación de PHP:


<?php 
setlocale(LC_ALL, 'cs_CZ'); 
printf(ngettext("%d window", "%d windows", 1), 1); // gives "1 okno" 
printf(ngettext("%d window", "%d windows", 2), 2); // gives "2 okna" 
printf(ngettext("%d window", "%d windows", 5), 5); // gives "5 oke" 
?> 

Otra ventaja es que se pueden utilizar herramientas estándar para la gestión de terminología, traducciones y la memoria de traducción automática como se ha señalado por @middus.

Para entornos compartidos hay un gran php-gettext library de Danilo Segan.

+0

Al utilizar matrices, todavía se puede utilizar pladeholders utilizando printf, ¿verdad? (Sin embargo, no tiene los formularios en plural) – middus

+0

Sí, puede. :) –

+0

El propio gettext de PHP es realmente escamoso con mod_php al menos. No solo el problema de almacenamiento en caché, sino algunas actualizaciones, las traducciones simplemente no funcionan. Así que hay uno casi en reemplazo: [php-gettext] (https://launchpad.net/php-gettext/) Es extremadamente simple de usar en lugar de 'setlocale' usas' _setlocale' y así sucesivamente ... – Ciantic

4

En mi opinión, no hace Demasiado sentido usar un formato binario (archivos .mo gettext) para un lenguaje dinámico como php.

Sin embargo, un pro de gettext es la existencia de un enorme ecosistema de herramientas que los traductores de su software pueden usar (por ejemplo, Poedit). Lo malo es que siempre tiene que compilar su .po a .mo antes de implementarlo, mientras que puede simplemente reemplazar un archivo php que contenga una matriz sobre la marcha.

Otra desventaja es que, como ya ha reconocido, no está disponible en todas las instalaciones de php.

5

El pro más obvio para el uso de gettext() es, por supuesto, que la cadena de origen se ubica en el lugar al que pertenece. Es decir. que tiene mucho más sentido para escribir este

echo _("This is a string"); 

que

echo $lang['a_string']; 

no hablar de que hay que elaborar un nuevo marcador de posición variable para cada traducción posible. Con gettext() la cadena de traducción en sí misma actúa como el índice.

+0

@tobefound Estoy de acuerdo contigo, pero encontré 2 profesionales de echo echo lang ['a_string']; (en realidad ahora usé l ('string_a);): 1. Dado que el contenido está fuera de la página de índice, el código parece más legible y compacto. 2. Si quiero traducir todo el contenido de la página web, puedo copiar y pegar el contenido en un traductor (ya que lang.php solo contiene frases y palabras. – alexchenco

8

Recomiendo usar gettext, lo estoy haciendo en PHP durante 5 años con buenos resultados.

En primer lugar, si usa echo _('my text to translate') y no tiene traducción, verá la cadena original en la salida, lo cual es bueno. Usando arreglos como echo $translation['were is my translation'] y no hay ninguno, simplemente no verá nada. pero ten cuidado, usar poedit y hacer un echo _(''); no es una buena idea, poedit usa el msgid "" para la información del proyecto que muy probablemente no quieras mostrar a tu audiencia, así que uno debe encargarse de no tratar de traducir cadenas vacías :)

También es muy rápido y tiene algunas características adicionales para plurales y cosas, también poedit por ejemplo hace la vida más fácil teniendo un db de traducción por lo que no debe traducir lo mismo una y otra vez, los que ya hizo serán prellenado y marcado como "verificar si es correcto". Muy cómoda.

theby middus mencionó la desventaja de que tiene que compilar el archivo po mientras que podría sobrescribir fácilmente un archivo php cuando usa matrices; también sobrescribe su archivo mo, y si utiliza poedit, lo hace después de guardar el archivo archivo. Así que, de hecho, presionas guardar y copiar el archivo, sam como cuando editas un archivo php.

Pero un inconveniente real es, si usa mod_php. Tenga en cuenta que con mod_php no es seguro para las roscas, aunque nunca he tenido ningún problema.

Lo más importante es que tenga que reiniciar su apache al usar mod_php o sus llamadas gettext fallarán (a veces no se devuelve ninguna traducción, a veces se termina con la página favorita sin contenido). Pero al usar algo como mod_itk (creo que cgi/fastcgi puede hacer esto) ya ni siquiera tendrás este problema.

-1

Cuando el usuario selecciona cualquier idioma del menú desplegable o cualquier área a continuación, guardar Identificación del idioma seleccionado en la sesión como,

$ _SESSION [ 'lenguaje'] = 1;

Ahora recupera los datos del 'contenido' de la tabla de la base de datos en función del ID de idioma almacenado en la sesión.

Más detalles aquí

http://skillrow.com/multilingual-website-in-php-2/