2009-09-12 11 views
7

En todas partes en SO cuando se trata de hacer una aplicación multilingüe en PHP, todos dicen que gettext es la mejor manera de hacerlo. Solo quiero saber por qué?¿Qué tiene de bueno gettext para los archivos de idioma?

Al igual que lo que hace que este método a continuación, menos eficiente que el uso de gettext?

<?PHP 
//Have seperate language files for each language I add, this would be english file 
function lang($phrase){ 
    static $lang = array(
     'NO_PHOTO' => 'No photo\'s available', 
     'NEW_MEMBER' => 'This user is new' 
    ); 
    return $lang[$phrase]; 
} 
//Then in application where there is text from the site and not from users I would do something like this 
echo lang('NO_PHOTO'); // No photo's available would show here 
?> 

Respuesta

13

Una buena cosa con gettext es que es una especie de estándar de facto: es utilizado por una gran cantidad de aplicaciones, en muchos idiomas - lo que significa que muchas personas trabajan con él.

Otra cosa buena (tal vez una consecuencia, o una causa, o ambos, en realidad) es que varias herramientas, como Poedit por ejemplo, existen para editar archivos de gettext: usted no tiene que pasar por algo de PHP (o lo que sea) código fuente. Y esto es muy importante:

  • significa que la gente no técnicos pueden editar archivos de localización gettext
    • tal vez esto no parece importante para usted ahora,
    • pero si están trabajando en un gran aplicación de código abierto, será importante si tiene éxito y muchas personas lo necesitan en su propio idioma.
  • significa que no lo hacen riesgo de romper la aplicación (piensan "Error de análisis", debido a una falta de coincidencia entre comillas, por ejemplo ;-))
+1

Por lo que respecta al rendimiento, ¿cree que utilizar una función con una matriz o constantes para los archivos de idioma sería tan rápido o tan bueno en el rendimiento como usar gettext? Mi aplicación es bastante grande pero siempre será un proyecto privado donde soy el único que necesita editarlo, para mí sería más fácil no tener que configurar gfettext y asegurarme de que el servidor lo tiene instalado y en ejecución. Pero si hay CUALQUIER ganancia en el rendimiento al usar gettext, entonces probablemente pondría más esfuerzo en seguir esa ruta. – JasonDavis

+1

Realmente no sé sobre interpretaciones (esto: http://mel.melaxis.com/devblog/2006/04/10/benchmarking-php-localization-is-gettext-fast-enough/ ¿podría ser útil?) - - pero su implementación tiene muchos otros problemas que lo que dije en mi respuesta; por ejemplo: no hay plural, toda una gran matriz para analizar y mantener en la memoria –

+0

GRACIAS ese enlace es exactamente lo que he estado buscando, es algo viejo pero sigue siendo lo que quiero, un benchtest sin que yo tenga que hacerlo (solo porque no sé cómo configurar gettext aún) – JasonDavis

6

Hay algunos inconvenientes en tu "implementación".

  • A diferencia de gettext se implementa en php. ;-)
  • Mantiene toda la traducción en memoria, no importa si la usa o no
  • Lo que es peor, crea la matriz completa de datos cada vez que necesita una línea (lleva un tiempo y bastante memoria) en PHP)
  • es incapaz de manejar formas plurales para muchos idiomas
  • El código, usando esta traducción es difícilmente legible
  • El código, el uso de esta traducción no tiene retroceso incorporado para usar en caso de traducción ausente.

Básicamente, su implementación es ampliamente utilizada en muchos proyectos que se mueren por reclamar su apoyo a la internacionalización e invención altamente innovadora de la rueda, pero no se preocupan por el resultado y no conocen el bien del malo.

4

Es la misma respuesta que para todas las preguntas buscando como:

¿Cuál es mejor con [hightly resultó y solución utilizada ampliamente] que con [mi hacky engreído aplicación novato ]?

  • ha sido aquí durante mucho tiempo, un creas o no, si dev experimentado trabajó en ella, lo usó y lo alabó, probablemente por una razón.
  • Es un estándar, por lo que incluso si su solución fuera mejor, el precio a pagar por romperlo puede no valer la pena.
  • Puede hacer 1000 más que su implementación porque está desarrollado teniendo en cuenta un alcance global, mientras que su idea solo tiene como objetivo resolver su problema.

No estoy criticando, todos lo hicimos, tratando de convencernos de que somos sabelotodos y que otros somos programadores excesivos. Esa es parte del camino para aprender. De hecho, continuamente hago eso, reinventando la rueda o presumiendo con mis amigos/colegas sobre algún código de KISS que pirateé. Con el tiempo, que acaba de terminar haciendo cada vez menos, y supongo que usted deja de hacer que el día en que usted realmente merecen hacerlo :-)

+0

mi aplicación de nook engreído hacky en este caso se usa en varias aplicaciones OPEN SOURCE grandes, de hecho, veo ambos métodos a menudo y estoy tratando de averiguar cuál es la mejor ruta sin instalar gettext y haciendo un benchmark si alguien más tiene ya lo he hecho. – JasonDavis

+0

PunBB es OpenSource y comenzó con una de las peores bases de código jamás conocidas. Comencé un proyecto de código abierto en mis primeros años de programación. Cometer errores y tener un gran ego como algo que no tiene nada que ver con el código abierto, es algo que todos hacemos.No lo tomes como algo personal, sé feliz de saber que estás progresando ;-) –

+0

Y, por cierto, eres el que tiene 'La optimización prematura no es la raíz de todo mal' como una cita en su perfil. ¿No es hora de aplicarlo? –

1

El ventaja de gettext, en comparación con otras soluciones como la suya , Tablas de cadenas de Java o recursos de Windows, es que hace que el código fuente sea más legible.

Compare esto:

printf(_("No photo available (error %d)."), err); 

con esto:

printf(i18n(NO_PHOTO), err); 
// or some variant of the same thing 

En el primer caso, se puede ver el mensaje correcto allí en el código y saber exactamente lo que hace. En este último caso, solo verá una constante simbólica y tendrá que buscar el texto exacto y los especificadores de formato.

Cuestiones relacionadas