translations language component change php symfony internationalization

php - language - ¿Cómo transformaría una aplicación web preexistente en una multilingüe?



translation symfony 4 (6)

Voy a trabajar en un proyecto donde una aplicación web bastante grande necesita modificarse para manejar varios idiomas. La cosa funciona con un código PHP hecho a mano, pero está bastante limpio.

Me preguntaba ¿cuál sería la mejor manera de hacer eso?

  1. Hacer algo por mi cuenta, tratando de encajar en la arquitectura real.

  2. ¿Reescribiendo una buena parte usando un marco (por ejemplo, Symfony) que me administrará i18n?

Para la opción 1, ¿dónde debo almacenar los datos de i18n? * .po, xliff, DB puro?

Pensé en una alternativa: usar Symfony solo para la traducción, pero configurar el controlador para cargar el sitio web como ya está. Rápido, pero sucio. Por otro lado, nos permite hacer la siguiente modificación, moviéndonos lentamente a Symfony completo: este sitio web es realmente un buen candidato para eso.

Pero tal vez haya algunos motores de traducción independientes que harían el trabajo mejor que un framework web completo. Es un poco como usar una bazuca para matar una mosca ...


Es importante notar que hay dos pasos involucrados antes de traducir:

  1. Internacionalización: es decir, permitir que su sitio maneje varios idiomas
  2. Localización: esto incluye traducir sus textos (obtenidos en el paso 1) a cada idioma que planea apoyar

Ver más sobre esto en Wikipedia .

El paso 1 requiere que tenga en cuenta el hecho de que algunos idiomas se escriben de derecha a izquierda (RTL) y caracteres no europeos como el japonés o el chino. Si no planea manejar estos idiomas y caracteres, podría ser más simple.

Para este tipo de situación, preferiría tener un archivo de idioma (en realidad tantos archivos de idioma como los que tengo previsto admitir, nombrando cada uno como langcode.php como en.php o fr.php ) con una matriz asociativa que contenga todos los textos utilizado en el sitio. El procedimiento sería el siguiente:

  1. Escanee su sitio para cada texto individual que debe ser localizado
  2. Para cada página / sección crearía una matriz $lang[''sectionname''][]
  3. Para cada texto crearía una entrada $lang[''sectionname''][''textname'']
  4. Lang.php una clase Lang.php que recibiría un parámetro lang en la creación de instancias, pero tendría un valor predeterminado en caso de que no se reciba lang (este método carga langcode.php según el parámetro o por defecto según el idioma que prefiera)
  5. La clase tendría un método setPage() que recibiría la página / sección que se mostrará
  6. La clase tendría un método show() que recibiría el texto que se mostraría (se llamaría a show() tantas veces como se muestran los textos en una página determinada ... show() es un tipo de contenedor para echo $lang[''mypage''][''mytext''] )

De esta manera, podría tener tantos idiomas como desee de una manera muy fácil. Incluso podría tener un administrador de idioma en el que abra su página de idioma base (en realidad solo lee recursivamente las matrices y las visualiza en áreas de texto) y luego puede "Guardar como ..." en otro idioma.

Utilizo un enfoque similar en mi sitio . Sin embargo, es solo una página, pero he hecho sitios de varias páginas con esta idea.

Si tiene contenido enviado por el usuario o algún CMS bastante complicado, sería una historia diferente. Podrías buscar frameworks amigables con i18n (Drupal viene a la mente).


Hay varias maneras de abordar esto. Ninguno de ellos es "la mejor manera" y todos tienen problemas a corto o largo plazo. Lo primero que hay que decir es que los sitios multilingües no son fáciles, los traductores y las personas encantadoras, pero es difícil trabajar con ellos y la mayoría de los programadores ven el problema como un problema técnico solamente. También hay otra dimensión, fuera del alcance de esta respuesta, en cuanto a si está traduciendo o localizando. Esto implica mirar las costumbres culturales del público objetivo y luego adaptar el lenguaje, el estilo, el diseño, el color, el tipo de letra, etc. a esa cultura. Finalmente, no use MT, Machine Translation, para nada serio o si necesita ser preciso y cuando los traductores se aseguren de que están traduciendo de un idioma extranjero a su idioma nativo, lo que significa que entienden todos los matices del idioma de destino.

Derecha. Soluciones. Sobre la base de que no desea volver a escribir el sitio, simplemente clone el sitio que tiene y traduzca las copias al idioma de destino. Suponiendo que la base del código es estable, puede usar un VCS para administrar cualquier cambio de código. Puede ajustar partes individuales del sitio para que se ajusten al idioma de destino, por ejemplo, el texto en francés es en promedio un 30% más grande que el texto equivalente en inglés, por lo que usar un sitio para entregarlo significa que puede tener problemas de formato y necesita cambiar un texto. diferentes archivos css dentro y fuera según el idioma. Puede parecer una forma torpe de hacerlo, pero ¿cuánto tiempo van a existir los sitios? La sobrecarga de administración de hacerlo de esta manera puede ser menor que otras opciones.

Segunda vía sin reconstrucción. Reemplace todo el contenido en el sitio actual con etiquetas y luego coloque el idioma diferente en las tablas de archivo o db, olfatee el idioma deseado por los usuarios (¿tiene usuarios registrados que pueden hacer una preferencia o desea obtener la etiqueta de idioma del navegador, o va a ser URL dot-com punto-fr, punto-de que hacen la elección) y luego reemplazar las etiquetas con el idioma de destino. Luego debe abordar los problemas de tamaño y la imagen por separado. Esta solución está en vigencia cuando marcos como Symfony y Zend hacen para implementar l10n.

Luego podría reconstruir con un framework o con gettext y posiblemente tener una solución más limpia, pero recuerde que los frameworks fueron diseñados para resolver otros problemas, no la traducción, y el componente de traducción ha entrado en el marco como una solución parcial, no completa.

El gran problema con todas las soluciones es el mantenimiento continuo. Porque no solo tienes un código base sino también múltiples bases de lenguaje para mantener. A menos que todos en una sola solución sean realmente inteligentes y efectivos, entonces la tarea en curso será difícil.



Si se trata de un soporte de caracteres de varios bytes, tal vez valga la pena verificar las funciones de cadenas multibyte en PHP:

http://uk.php.net/manual/en/book.mbstring.php

Estos manejarán mejor los caracteres multi-byte.


Trabaja con archivos de idiomas.

  1. Reemplazar cada cadena de texto por una variable
  2. Cree un archivo de idioma por idioma y en él defina cada variable con su texto correspondiente. (french.inc, dutch.inc ...)
  3. Incluya el archivo correcto en cada página.

Eso es para sitios pequeños.

Si crece, reemplace los archivos por un DB. :)


Utilizo el parámetro hl y gettext combinando traducciones de motor que ya existen con el .po propio que hace que aparezcan nuevas traducciones y lenguajes cuando el motor o mi ejemplo django / gae agregan:

{% get_current_language as LANGUAGE_CODE %}{{ LANGUAGE_CODE }}{% get_available_languages as LANGUAGES %}{% for LANGUAGE in LANGUAGES %}{% ifnotequal LANGUAGE_CODE LANGUAGE.0 %}{{ LANGUAGE.0 }}{% endifnotequal %}{% endfor %}

Por lo tanto, mantener los duplicados y usar las traducciones completas ya hace que los nombres faltantes, por ejemplo, los nombres de los meses árabes, aparezcan directamente cuando el equipo del motor agrega una aplicación.