¿Localización en php, mejores prácticas o enfoque?

11

Estoy localizando mi aplicación php. Tengo el dilema de elegir el mejor método para lograr lo mismo.

Método 1: actualmente estoy almacenando palabras para localizarlas en una matriz en un archivo php

<?php

$values = array (
                        'welcome' => 'bienvenida'
                ); 

?>

Estoy usando una función para extraer y devolver cada palabra según el requisito

Método 2: ¿Debo usar un archivo txt que almacene cadenas del mismo?

<?php
$welcome = 'bienvenida'; 
?>

Mi pregunta es cuál es un mejor método, en términos de velocidad y esfuerzo para desarrollar el mismo y por qué.

Editar: Me gustaría saber qué método de dos es más rápido en responder y ¿por qué sería eso? Además, cualquier mejora en el código anterior sería apreciada.

sree
fuente
2
¿has considerado gettext?
sagarchalise
@sagarchalise Lo he investigado, pero quiero construir mi propio método, es decir, cualquiera de los dos anteriores. Por lo tanto, me gustaría saber qué método funciona más rápido y cuál es más confiable. :)
sree
Si quieres saber en términos de velocidad, solo haz algunos casos de prueba. ¿Qué funciona más rápido, 1 millón de veces el primer o el segundo método?
Francisco Presencia
2
No reinvente una rueda que funcione bien.
gbjbaanb

Respuestas:

10

PHP tiene grandes posibilidades integradas para la localización. La forma más común parece ser gettext : este tutorial muestra cómo se usa.

Desde PHP 5.3 también hay intl que ofrece muchas más funciones (por ejemplo, para formatear números, fechas y monedas dependiendo de la configuración regional).

oezi
fuente
Gracias por su respuesta, pero, ¿podría saber de lo anterior qué método es mejor construir en términos de velocidad y confiabilidad?
sree
10

En primer lugar, gettextes un buen camino a seguir, así que no descarte si no suena fácil al principio; Sin embargo, también hay otras opciones que pueden ser útiles para conocer. Antes de explicar eso, echemos un vistazo a sus sugerencias primero:

En su forma arrayde hacer esto, tiene una solución bastante sencilla. Lo bueno es que puede almacenar sus traducciones en un almacenamiento de datos, luego cargarlas en su script PHP como una matriz, y eso es todo. Sin embargo, si desea almacenar su matriz estáticamente en un archivo PHP, entonces la edición necesita a) un programador PHP o un usuario experimentado que esté familiarizado con la sintaxis PHP, solo para editar el archivo b) sincronización entre incluso cuatro o cinco archivos de idiomas diferentes podría ser bastante molesto y propenso a errores.

Lo que debe tener en cuenta aquí es: ¿cómo puede agregar elementos nuevos al archivo de idioma más adelante? ¿Puedo dejarlo en manos de un traductor o debería haber un programador PHP?

Tu forma variablede hacerlo no es práctica. ¿Por qué? Supongo que tendrá un par de funciones al menos en su aplicación, ¿verdad? Luego debe pasar todas estas variables cuando llama a la función, o las necesita global. Si cree que tendrá más de diez variables como esta, le recomiendo encarecidamente que haga esto. También puede haber conflicto de nombres: puede anular potencialmente el valor de otra variable con el mismo nombre, sin embargo, esto podría resolverse agregando un prefijo incluso tan simple como un guión bajo, por lo que tendrá, $_welcomepor ejemplo. De todos modos, si yo fuera tú, ni siquiera lo pensaría; No lo hagas

Una buena forma de hacerlo es definir constantes con un prefijo. Entonces, por ejemplo, en tu en.lang.phptendrás algo como define( 'LABEL_WELCOME', 'Welcome' );y en tu no.lang.phptendrás define ( 'LABEL_WELCOME', 'Velkommen' );. Lo bueno de usar constantes en lugar de variables es que siempre están disponibles en su secuencia de comandos. Por lo tanto, no necesita inyectarlos ni globalizarlos. En comparación con las matrices y las variables, son más rápidas debido a la forma en que PHP las maneja: ocupan menos espacio en la memoria. El inconveniente es que no puede pasarlos al traductor, por lo que nuevamente necesita un desarrollador de PHP. También la sincronización entre archivos podría ser un poco dolorosa nuevamente.

La otra opción es tener una Función o Clase / Método para recuperar la traducción. Será menos eficiente, sin embargo, no creo que necesite ese tipo de micro-optimización, pero la ventaja adicional es que puede aplicar una lógica personalizada mientras recupera la traducción. Por ejemplo, imagina que algún día tu amado gerente de proyecto te pregunta si puedes convertir todos esos textos en mayúsculas. No puede negarse a hacerlo, por lo que tener una función intermedia podría ayudarlo mucho cuando necesite aplicar / cambiar un patrón a todas sus traducciones.

Para concluir:

  1. Piense en cómo los traductores pueden usarlo y encuentre una solución KISS que funcione para ellos.

  2. Piensa en cómo puedes mantener la sincronización entre diferentes idiomas.

  3. Think about if the same translation might be needed, let say for the mobile app. A cross platform solution could save your time. Don't dismiss JSON and ordinary Databases.

  4. Think about how you can apply/change the logic when retrieving the translations.

  5. Forgot about the performance. 99.9% of times you won't get that far to do micro-optimization like Constant vs. Variables vs. Function Calls. I assume your time as a developer/staff is more expensive rather than a processor time.

Update #1

My goodness, I post an answer for a year old question. Why no one is saying anything here? We need alerts for these cases.

Update #2

On the right side it says it's a year old question; However it's been asked two years ago! Everything is misleading here!

Mahdi
fuente
u look like a time traveller back into time :) tnx for the answer though!
sree
3
@sree Yes! I'm coming from April 4, 2014! If you buy some Facebook or WhatsApp shares in 2012, you won't need to write PHP code in 2014!
Mahdi
1
rofl agreed !!!
sree