Mejores prácticas para crear files de traducción para múltiples plataforms

Actualmente estamos enfrentando el problema de crear y hospedar traducciones para una aplicación para múltiples plataforms (iOS, Android, HTML5, BlackBerry …). ¿Hay alguna práctica recomendada para alojar las traducciones y crear los files de traducción necesarios (en.lproj / Localizable.string, values-fr / strings.xml, …) sobre la marcha?

Pienso en alojar las traducciones y sus keys en una tabla en Google Docs (u otras plataforms) y exportar los datos a csv y usar scripts para crear los files.

Busco en Internet pero no encontré un buen punto de partida hasta ahora.

Puede probar Loco o Shuttle como herramienta de localización multiplataforma.

¿Conoces a Transifex ?

Transifex es una plataforma de localización abierta y moderna. Es un sistema web que automatiza el flujo de trabajo de traducción para proyectos internacionales complejos.

Hemos utilizado con éxito PhraseApp para múltiples plataforms. Tienen una API para que podamos proporcionar scripts de shell en el tree del proyecto para actualizar las traducciones con un command rápido. Incluso puede hacer eso como un paso de compilation.

Tenga en count que parece que hay algunos obstáculos difíciles de gestionar para estos services, ya que las diferentes plataforms localizadas tienen diferentes sets de características. Por ejemplo, Android admite la pluralización que iOS no hace IIRC.

Hay http://www.getlocalization.com/

Es gratis si está dispuesto a publicar y compartir sus cadenas individuales y su traducción públicamente.

Hago aplicaciones en inglés y japonés. Lo que hago es almacenar ambas traducciones en un file al que puedo acceder en cualquier lugar de la aplicación, es decir, una variable global, instancia, singleton o cualquier cosa con la que se sienta cómodo.
Haga todas las traducciones que necesite en su casa porque los traductores informáticos no dicen las cosas bien. Luego, dondequiera que lo use, hágalo de la list con un valor boolean que dice inglés o japonés.

Una herramienta de traducción de código abierto en línea (desplegable a su server de elección) que puede cumplir con sus requisitos es Pootle , que está construida sobre el package de herramientas de traducción . He usado Pootle como traductor para LibreCAD . Podría navegar por el Servidor de Traducción de LibreCAD y verlo en acción. LibreCAD usa Qt como base-framework y Pootle maneja la carga y descarga de files TS, que se usan para traducciones en Qt. Después de haber usado Transifex , puedo decirte que Pootle no es tan elegante (puedes ver eso por ti mismo, aunque ten en mente que el server de traducción de LibreCAD usa una versión anterior de Pootle), pero no está mal trabajar con eso. Solo debe establecer que los files que su aplicación necesitará para las traducciones se pueden exportar (y posiblemente importar) desde (y posiblemente hasta) su Servidor de Traducción. Puede traducir usando un browser web o puede traducir sin connection y luego cargar sus files editados y aplicar por lotes todas sus traducciones modificadas. Otra herramienta de traducción basada en la web que parece proporcionar un enfoque similar y más moderno que Pootle (se ve mejor y tiene una integración de control de versiones ajustada), aunque también se basa en Translate Toolkit, es Weblate . Esto también es de código abierto y se puede implementar en el server de su elección.

Para proporcionar más información, si mira los formattings de file relacionados con la traducción , tendrá una mejor idea de lo que Pootle y Translate Toolkit pueden exportar / importar. Desde esa list y desde mi experiencia de traducción, puedo decirte que los files INI se utilizan para traducciones en Joomla! núcleo y extensiones, las matrices de traducción PHP se utilizan para traducciones en aplicaciones Yii , y los files Qt Linguist TS se utilizan, como se mencionó anteriormente, para traducciones en aplicaciones Qt. También he experimentado con GNU gettext , que está avalado por la biblioteca de Free Software Foundation para su localización. GNU gettext usa files PO para traducciones, que pueden ser manejados por Translate Toolkit.

La idea central detrás de todos los enfoques de localización, no importa cuál sea la plataforma, es más o less lo mismo. Diseñe su código teniendo un idioma principal en mente y use este idioma en su código. El inglés sería la opción ideal, pero esto no es necesario. Debe elegir un idioma con el que todos los desarrolladores puedan trabajar, un idioma que no ralentice el desarrollo (mientras busca un par de tags para los botones, no le gustaría pensar solo una label por minutos) y un lenguaje que sea utilizado por su público objective principal, solo en el caso de que exista una audiencia objective principal y, al mismo time, el desarrollo con otro idioma en mente podría hacer que la aplicación se sienta antinatural para su público objective principal, después de que se haya traducido a su objective principal lenguaje de la audiencia Este es también el idioma en el que todos sus traductores recibirán las cadenas de idioma de origen (y, por lo tanto, tendrán como punto de reference), para traducir a todos los demás idiomas de destino. Es posible que tenga que comprometerse, porque estamos hablando de uno y solo un idioma para el desarrollo. Continuando, en cualquier momento durante el desarrollo que necesita insert una cadena de idioma en su código, no la inserta directamente, sino que la encierra en una llamada de function especial especificada por la plataforma de localización que usa. En una aplicación Qt, por ejemplo, en lugar de QLabel *label = new QLabel("Password:"); escribiría QLabel *label = new QLabel(tr("Password:")); . Durante la ejecución de la aplicación, el idioma del usuario se determina dentro de la llamada de function tr , se busca el file de idioma apropiado para el idioma del usuario y el post traducido correspondiente a "Password:" para el idioma del usuario se recupera y se utiliza como label . La determinación / definición de lenguaje es un mecanismo separado que esencialmente obtiene / establece una variable global / estática, la que se busca cuando se llama a la function tr en el ejemplo anterior. Lo que puede manejarse especialmente por cada plataforma son forms plurales (traducción condicional basada en algún parámetro). En Yii, por ejemplo, podrías tener 'n==1#one book|n>1#many books' como la cadena de traducción. En su aplicación, usaría Yii::t('app', 'n==1#one book|n>1#many books', 1); , es decir, también proporcionaría el número real como un parámetro, de modo que se pueda usar el formulario correcto (el parámetro 'app' utilizado en la function de traducción se refiere a una categoría específica de traducción denominada app , ya que, en cada idioma, podría use diferentes categorías de traducción para partes de su aplicación).

Para agregar un poco de información final, usar un backend general genérico para las traducciones le permitiría reutilizar la gran mayoría de sus cadenas traducidas, al migrar de un marco a otro, o incluso si existen varias implementaciones diferentes para la misma aplicación en al mismo time, por ejemplo, existe una aplicación basada en browser junto con una aplicación nativa. Las forms plurales requerirían un manejo especial y traducciones separadas para la misma cadena de lenguaje debido a que son realmente específicas de la plataforma (pero, si es necesario, la mayoría de las forms plurales se pueden eliminar moviendo la condición del dominio de la cadena de traducción al dominio del código). Pero la gran mayoría de las traducciones en una aplicación son asignaciones directas de una cadena a otra. Algunos frameworks, como Qt, tienen herramientas para escanear los files fuente y actualizar files de traducción basados ​​en nuevos usos de la function de traducción especial ( tr en Qt). Si existe una herramienta de ese tipo para el marco de su elección, no tendría que agregar una asignación de traducción de forma manual a un file de traducción. Después de escanear los files fuente, la asignación aparecerá en los files de traducción, por defecto a la cadena original como su traducción y esperando que la cadena traducida lo reemplace. Investigue los posibles flujos de trabajo antes de comprometerse a un enfoque.