2011-03-25 10 views
6

Para que mi aplicación sea multilingüe, me pregunto si existen grandes ventajas para el texto de GNU o si existen grandes desventajas de construir su propia 'biblioteca'.¿Cuáles son las razones para usar o no usar el gettext nativo de PHP versus una autoconstrucción?

También si se recomienda más 'construir su propio', ¿cuáles son las mejores prácticas? Obviamente tienen que estar almacenados en la base de datos, dudo que quiera trabajar con archivos planos, por lo que en algún momento será mejor guardarlos en caché, ¿cómo debo hacerlo?

+0

dices caché, donde ... archivo plano tal vez. – RobertPitt

+0

Haha, touché. Pero me refería a tener mi catálogo en archivos planos. –

Respuesta

5

La extensión gettext tiene algunas peculiaridades.

  • Mantiene cadenas de traducción en la memoria, y por lo tanto puede requerir un reinicio (en el tiempo de ejecución de mod_php) cuando se actualizan los catálogos.
  • La API gettext no fue diseñada para aplicaciones web. (Busca las variables de entorno y la configuración del sistema. Debe alimentar con cuchara el encabezado Aceptar idioma.)
  • Muchas personas tienen problemas para configurarlo.
  • Por otro lado, hay más soporte de herramientas para gettext.

Casi siempre tendrá menos problemas con una solución artesanal. Pero dicho esto, el gettext API es inmejorable en concisión. _("orig text") es más o menos la interfaz óptima para traducir texto.

Si quiere codificar algo usted mismo, le recomiendo que se concentre en eso.

  • usar un simple nombre de la función. En lugar de _(), algunas aplicaciones php usan el doble guión bajo __(). No adopte ninguna biblioteca que dificulte el uso de cadenas traducidas. (Por ejemplo, si utiliza Zend Framework, siempre escriba una función de envoltura).
  • Acepte el texto en inglés como entrada. Evite las claves de traducción mnemónicas (por ejemplo, BTN_SUBMT)
  • No utilice en ningún caso la base de datos para catálogos de traducción. Esos textos son datos de tiempo de ejecución, no datos de aplicaciones. (Para ver un mal ejemplo osCommerce.)

A menudo puede salirse con guiones matriz PHP lang/nl.php contiene nada más que $text["orig english"] = "dutch here";, que son fáciles de utilizar de cualquier método de acceso que utilice.

También evite presionar todo en ese sistema. A veces es inevitable adoptar un segundo mecanismo para textos más largos. Yo por ejemplo usé template/mail.EN.txt para manchas más grandes.

+0

Estoy de acuerdo. Por otro lado, gettext es casi el estándar '' de facto '' con respecto a las herramientas que se benefician de él: los editores de PO, xgettext y msgmerge son realmente herramientas realmente útiles cuando se trata de gestionar traducciones. – Artefact2

+0

Gracias por su respuesta elaborativa, una pregunta sin embargo. ¿Por qué son incorrectos los índices como "BTN_SUBMIT"? –

+0

@Gerben Jacobs: No están equivocados per se. Pero mirando hacia atrás, desearía haber evitado este esquema. Es un enfoque bastante típico de PHP para 'definir (" TEXT_BTN_NAME "," Nombre del botón ")'. Pero eso hace que sea mucho más difícil realizar una transición posterior a otros sistemas y, sobre todo, hace que el código fuente sea menos legible. El uso de abreviaturas a menudo se basa en la suposición falsa de que desea cambiar el contenido del texto todo el tiempo. En la práctica, ese no es el caso. Escribe tu aplicación y tráela al final. Es más simple hacer eso de una vez y no de forma gradual. Pero de lo contrario no hay ningún problema técnico real con ABBRV. – mario

1

Gettext es not thread-safe.

Antes de decidir implementar el suyo, le sugiero que eche un vistazo a Zend_Translate. Tiene soporte nativo para un adaptador gettext, así como TMX, CSV, INI, Array y más formatos. También debería ser fácil escribir su propio adaptador si su formato preferido no es compatible, como el almacenamiento de la base de datos.

+0

FYI: 'setlocale' y por lo tanto' gettext' no es seguro para subprocesos porque las variables de entorno no son seguras para subprocesos. Suena como una buena idea para agregar una nueva API proxy-environment. –

+2

gettext no es seguro para subprocesos, pero no importa en muchos casos: http://stackoverflow.com/questions/1646249/php-gettext-problems-like-non-thread-safe/6726570#6726570. Zend-translate es agradable, pero gordo y definitivamente mucho más lento que el módulo incorporado de PHP. – Stann

Cuestiones relacionadas