traductor traducir para pagina idioma español ejemplo codigo cambiar boton atributo archivos php internationalization gettext

php - para - traducir archivos html a español



Gettext: ¿es una buena idea que el ID del mensaje sea el texto en inglés? (10)

Nos estamos preparando para traducir nuestro sitio web PHP a varios idiomas, y el soporte gettext en PHP parece ser el camino a seguir.

Todos los tutoriales que veo recomiendan usar el texto en inglés como el ID del mensaje, es decir,

gettext ("¡Hola!")

¿Pero es realmente una buena idea? Digamos que alguien en marketing quiere cambiar el texto a "Hola, ¡todos!". Entonces, ¿no tiene que actualizar todos los archivos de idioma porque esa cadena, que en realidad es el ID del mensaje, ha cambiado?

¿Es mejor tener algún tipo de identificación genérica, como "hola.mensaje", y un archivo de traducción al inglés?


¿No has respondido tu propia pregunta? :)

Claramente, si tiene la intención de soportar i18n de su aplicación, debería tratar todas las implementaciones de idioma de la misma manera. Si alguien decide que una cadena debe cambiar, realiza un cambio similar en todos los archivos de idioma. Los metadatos con el checkin deben agrupar todos los archivos de idioma en el mismo cambio. Si su idioma "predeterminado" se maneja de manera diferente, eso hace que sea más difícil de mantener.


La razón por la que los ID son ingleses es para que se devuelva el ID si la traducción falla por alguna razón: la traducción del idioma actual y el token no están disponibles u otros errores. Eso, por supuesto, asume que el desarrollador está escribiendo el texto original en inglés, no una persona de documentación.

Además, si el texto en inglés cambia, ¿es probable que las otras traducciones deban actualizarse?

En la práctica, también usamos Pure IDs en lugar de texto en inglés, pero significa que tenemos que hacer mucho trabajo extra para el inglés por defecto.


Me atrevería a decir que nunca (para la mayoría de los valores de nunca) quiere usar texto libre como claves para nada. Imagínese si SO utilizó el título de la consulta como clave para esta página, por ejemplo. Si alguien lo vincula, y luego se edita el título, el enlace ya no es válido.

Su problema es similar, excepto que también sería responsable de actualizar todos los enlaces ...

Como menciona Douglas Leeder, lo que probablemente desee hacer es utilizar inglés como idioma predeterminado (copia de seguridad), aunque una interfaz que usa el inglés y otro idioma entremezclado es muy confuso (pero ligeramente divertido, también).


Utilizo ID significativos como " welcome_back_1 ", que sería " welcome back, %1 ", etc. Siempre tengo el inglés como mi idioma "base", así que en el peor de los casos, cuando un idioma específico no tiene un ID de mensaje, retroceso en inglés.

No me gusta usar frases en inglés reales como ID de mensaje porque si el inglés cambia también lo hace la ID. Esto podría no afectarle demasiado si usa algunas herramientas automatizadas, pero me molesta. No me gusta usar códigos simples (como msg3975) porque no significan nada, por lo que leer el código es más difícil, a menos que desperdicies comentarios en todas partes.


Estoy totalmente en desacuerdo con la respuesta de Richard Harrisons acerca de la cual dice que es "el único camino". Querido amigo, no confíes en una respuesta que diga que es la única manera, porque la "única manera" no existe.

Aquí hay otra manera que en mi humilde opinión tiene algunas ventajas sobre el enfoque de Richards:

  • Comience usando la proto-versión de la cadena en inglés como Original.
  • No muestre estos proto-strings pero cree un archivo de traducción para inglés no exento
  • Copie las proto-cadenas a la traducción para el comienzo

Ventajas:

  • código legible
  • el texto de tu código está muy cerca, sino es idéntico al que muestra tu vista
  • si quiere cambiar el texto en inglés, no cambia la proto-cadena, pero la traducción
  • si quieres traducir lo mismo dos veces, simplemente escribe una proto-cadena ligeramente diferente o simplemente agrega ''versión para esto y aquello'' y todavía tienes un código perfectamente legible

Guau, me sorprende que nadie defienda el uso del inglés como clave. Usé este estilo en un par de proyectos de software, y en mi humilde opinión funcionó bastante bien. La legibilidad del código es excelente, y si cambia una cadena en inglés, resulta obvio que el mensaje debe considerarse para la retraducción (lo cual es algo bueno).

En el caso de que solo corrija la ortografía o haga algún otro cambio que definitivamente no requiera traducción, es una cuestión simple actualizar los ID de esa cadena en los archivos de recursos.

Dicho esto, actualmente estoy evaluando si llevar o no esta manera de llevar adelante el I18N a un nuevo proyecto, por lo que es bueno escuchar algunas ideas sobre por qué podría no ser una buena idea.


En una palabra, no hagas esto.

La misma palabra / frase en inglés a menudo puede tener más de un significado, y cada significado tiene una traducción diferente.

Defina identificadores mnemotécnicos para sus cadenas y trate el inglés como un idioma más.

De acuerdo con otros carteles que los números de identificación en el código son una pesadilla para la legibilidad del código.

Ex ingeniero de localización


Además de las consideraciones anteriores, hay muchos casos en los que desearía que la "clave" (msgid) fuera diferente del texto fuente (inglés). Por ejemplo, en la vista HTML, me gustaría decir [aaaa] dónde el destino y la etiqueta de esa etiqueta de anclaje dependen de la configuración regional del usuario. Por ejemplo, podría ser un enlace a una red social, y en Estados Unidos sería Facebook, pero en China sería Weibo. Entonces los MsgIds podrían ser algo así como socialSiteUrl y socialSiteLabel.

Yo uso una mezcla.

Para cadenas básicas que no creo que tengan conflictos / cambios / significados extraños, haré que la clave sea la misma que en inglés.


Hay mucho que considerar y responder no es tan fácil.

Usando inglés simple

Pros

  • Fácil de escribir y LEER código
  • En la mayoría de los casos, funciona incluso sin ejecutar funciones de traducción en código

Contras

  • Los programadores involucrados también deben ser buenos redactores :)
  • Necesita escribir textos precisos correctos completamente en inglés, incluso en el caso de que el primer idioma que necesita ejecutar sea otra cosa (es decir, estamos comenzando una serie de proyectos en checo y luego los estamos traduciendo a EN).
  • En muchos casos, necesita usar contextos. Si no lo haces desde el principio, es mucho trabajo agregarlos más tarde. Para explicar: en inglés, una palabra puede tener muchos meands diferentes, y necesita usar contextos para diferenciarlos, y no siempre es tan fácil (orden = orden de clasificación, o puede ser orden de compra).
  • Puede ser muy difícil corregir el inglés más adelante en el proceso. Las correcciones de las cadenas fuente a menudo llevarán a la pérdida de frases ya traducidas. Es muy frustrante perder la traducción a 3 idiomas diferentes solo porque corrigió el inglés.

Usando llaves

Pros

  • Puede usar funciones de plataforma de localización incluso para el idioma inglés. Es decir, estamos usando la encantadora plataforma Crowdin. Hay muchas herramientas útiles, o mejor dicho, un flujo de trabajo completo para la gestión de la traducción: votar por diferentes traducciones, historial de traducción, glosarios (lo que ayuda a mantener la traducción / el lenguaje coherente), pruebas, aprobación, etc. El uso de claves hace que este proceso mas suave.

  • Es mucho más fácil enviar textos en inglés para corregir, etc. Por lo general, no es una buena idea dejar que los redactores modifiquen tu código directamente :)

Contras

  • Configuración de proyecto más complicada.
  • Más difícil de usar% d,% s, etc.

Al final del día, un traductor debería poder sentarse y cambiar los textos para cada idioma (para que coincida con el significado) sin tener que involucrar al programador que ya hizo su trabajo.

Esto me hace sentir que la respuesta correcta es usar una versión modificada de gettext donde coloques cadenas como esta

_(id, backup_text, context) _(''ABOUT_ME'', ''About Me'', ''HOMEPAGE'')

el contexto es opcional

¿por qué de esta manera? porque necesita identificar el texto en el sistema usando ID únicos que no sean textos en inglés que puedan repetirse en otros lugares.

También debe mantener la copia de seguridad, la identificación y el contexto en el mismo lugar en su código para reducir las discrepancias.

La identificación también debe ser legible, lo que trae el problema de sinónimos y uso duplicado (incluso como identificadores), podríamos prefijar los identificadores como este "HOMEPAGE_ABOUT_ME" o "MAIL_LETTER", pero

  1. la gente se olvida de hacer esto al principio y cambiarlo más tarde es un problema
  2. es más flexible para que el sistema pueda agruparse tanto por id como por contexto

por eso también agregué la variable de contexto al final

el texto de la copia de seguridad puede ser prácticamente cualquier cosa, incluso podría ser "[ABOUT_ME @ HOMEPAGE texto no se pudo cargar, póngase en contacto con [email protected]]"

No funcionará con los programas actuales de edición de texto como "poedit", pero creo que puede definir nombres de variables personalizados para traducciones como "t ()" sin el guión bajo al inicio.

Sé que gettext también tiene soporte para contextos, pero no está muy bien documentado ni es ampliamente utilizado.

PD: No estoy seguro del mejor orden variable para aplicar un código bueno y extensible, por lo que las sugerencias son bienvenidas.