Pregunta

Voy a trabajar en un proyecto en el que se necesita modificar una aplicación web bastante grande 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 hacerlo?

  1. Hacer algo por mi cuenta, tratando de ajustarme a la arquitectura real.

  2. ¿Reescribiendo una buena parte de ella con un marco (por ejemplo, Symfony) que administrará i18n por mí?

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 que cargue el sitio web como ya está. Rápido, pero sucio. Por otro lado, nos permite hacer la próxima modificación, moviéndonos lentamente hacia Symfony completo: este sitio web es realmente un buen candidato para eso.

Pero quizás hay algunos motores de traducción independientes que harían el trabajo mejor que todo un framework web. Es un poco como usar una bazuca para matar a una mosca ...

¿Fue útil?

Solución

Hay varias maneras de abordar esto. Ninguno de ellos " la mejor manera " y todos ellos con problemas a corto o largo plazo. Lo primero que hay que decir es que los sitios multilingües no son fáciles, traductores y gente encantadora, pero es difícil trabajar con ellos y la mayoría de los programadores ven el problema solo como uno técnico. También hay otra dimensión, fuera del alcance de esta respuesta, en cuanto a si está traduciendo o localizando. Esto implica ver las costumbres culturales del público objetivo y luego adaptar el idioma, el estilo, el diseño, el color, el tipo de letra, etc. a esa cultura. Por último, no utilice MT, Traducción automática, para nada serio o si necesita ser preciso y al adquirir traductores, asegúrese de que estén traduciendo de una lengua extranjera a su lengua materna, lo que significa que entienden todos los matices de la lengua de destino.

Bien. Soluciones Sobre la base de que no desea volver a escribir el sitio, simplemente copie el sitio que tiene y traduzca las copias al idioma de destino. Suponiendo que el código base sea 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 en inglés equivalente, por lo que usar un sitio para entregar esto significa que puede (tendrá) problemas de formato y necesita cambiar un Diferente archivo css dentro y fuera dependiendo del idioma. Puede parecer una forma torpe de hacerlo, pero ¿cuánto tiempo van a existir los sitios? La sobrecarga de gestió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 base de datos, huela el idioma deseado por los usuarios (¿tiene usuarios registrados que puedan hacer una preferencia o desea obtener la etiqueta de idioma del navegador? será la URL punto-com punto-fr, punto-de que haga la elección) y luego reemplace las etiquetas con el idioma de destino. Luego debe abordar los problemas de tamaño y los problemas de imagen por separado. Esta solución está en vigencia cuando marcos como Symfony y Zend implementan l10n.

Luego, puede reconstruir con un marco o con gettext y posiblemente tener una solución más limpia, pero recuerde que los marcos se diseñaron para resolver otros problemas, no la traducción, y el componente de traducción ha entrado en el marco como una solución parcial y no completa. p>

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

Otros consejos

Trabajar con archivos de idiomas.

  1. Reemplace 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 está creciendo, reemplace los archivos por una base de datos. :)

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

  1. Internacionalización: es decir, habilitando su sitio para manejar múltiples idiomas
  2. Localización: esto incluye traducir sus textos (obtenidos en el paso 1) a cada idioma que planea admitir

Vea más sobre esto en Wikipedia .

El paso 1 requiere que tenga en cuenta el hecho de que algunos idiomas están escritos 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 sencillo.

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

  1. Escanee su sitio en busca de cada texto que deba ser localizado
  2. Para cada página / sección crearía un $ lang ['sectionname'] [] array
  3. Para cada texto crearía una entrada $ lang ['sectionname'] ['textname']
  4. Crearía una clase Lang.php que recibiría un parámetro lang en la instanciación, pero tendría un valor predeterminado en caso de que no haya lang recibido (este método carga langcode.php según el parámetro o un valor predeterminado según su idioma preferido)
  5. La clase tendría un método setPage () que recibiría la página / sección que mostrarás
  6. La clase tendría un método show () que recibiría el texto que se mostrará ( show () se llamará tantas veces como se muestren los textos en una página dada ... show () es un tipo de envoltura para echo $ lang ['mypage'] ['mytext'] )

De esta manera, puede 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, acaba de leer recursivamente los arreglos y los muestra en áreas de texto) y luego puede " Guardar como ... " algún otro idioma.

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

Si tienes contenido enviado por el usuario o algún CMS bastante complicado, sería una historia diferente. Puede buscar marcos compatibles con i18n (Drupal viene a la mente).

Puede consultar Zend_Translate , es un programa bastante completo. bien documentado y la calidad del código en general es excelente. También te permite usar una API unificada para gettext, csv, db, ini file, array o lo que sea que termines guardando tus cadenas traducidas.

También, vea / vea este hilo: ¿Cuáles son las buenas herramientas / marcos para i18n de un código base de php? . Parece similar a tu pregunta.

Si es compatible con caracteres de múltiples bytes, entonces podría valer la pena revisar las funciones de cadena multibyte en PHP:

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

Estos manejarán mejor los caracteres de varios bytes.

Utilizo los parámetros hl y gettext que combinan las traducciones del motor con .po, que hace que aparezcan nuevas traducciones e idiomas cuando motor o mi django / gae example agrega:

{% 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, evitar duplicados y utilizar las traducciones ya existentes permite que aparezcan los nombres de los meses árabes que faltan para que aparezcan directamente cuando el equipo del motor agrega o aplicación

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top