El problema con la Localización de software para múltiples plataformas

Adobe tiene una larga historia de desarrollo de productos para múltiples plataformas, ya se trate de aplicaciones de escritorio como nuestras aplicaciones de Creative Suite insignia o aplicaciones táctiles más recientes, como Photoshop Touch. La mayoría de nuestras aplicaciones de escritorio se han construido para Windows y Mac y las aplicaciones más recientes continuar en esta tendencia con soporte para iOS y Android incluyendo Tablet y teléfono factores de forma para ambos.

Por supuesto, esto no habría sido posible sin los cuidadosos esfuerzos del equipo de ingeniería para mantener en gran medida una base de código único para todas las plataformas.

Mientras que tener una sola base de código tiene beneficios obvios, en la capa de interfaz de usuario a menudo es importante tener variaciones específicas de la plataforma para una mejor usabilidad. Cada plataforma tiene generalmente un convenio específico para referirse a los menús del sistema, atajos de teclado y elementos de interfaz de usuario. Por ejemplo en una plataforma Windows una cadena UI podría ser – “Seleccione un archivo multimedia mediante el botón Examinar o escriba una ruta de acceso válida.” y de la misma cadena para la plataforma Mac podría ser – “Seleccione un archivo multimedia a través del botón Seleccionar o escriba una ruta de acceso válida.”

Esto significa que las cadenas traducibles de interfaz de usuario pueden tener muchas variaciones en la lengua fuente, dependiendo de qué plataforma están destinados a. Esto es lo que nuestro grupo por lo general se refiere a la globalización como 'Plataforma Varianza’. Cadenas localizables son esencialmente entidades de varios valores. Cada cadena localizable tiene un identificador de valores asociados y múltiples, cada uno de los cuales se pueden seleccionar sobre la base de ciertos criterios. Los criterios más evidentes y de uso común es la configuración regional de la interfaz de usuario de la aplicación, pero no tienen por qué ser el único. Plataforma también puede decidir el valor de una cadena.

Apoyo varianza plataforma no es sólo útil para el tratamiento de las diferencias de terminología para referirse a los elementos de la interfaz de usuario del sistema, también ayuda a adaptarse cuerdas para diferentes tamaños de pantalla. Aplicación de modernos están diseñados para soportar dispositivos múltiples factores de forma como tableta y teléfono con la interfaz de usuario está ajustado para cada plataforma para la mejor experiencia de usuario. Varianza Plataforma en este caso puede ser utilizado para apoyar cadenas más largas para la vista de la tableta y las cadenas más cortas para la vista Phone.

Otra área donde el apoyo varianza plataforma podría ser útil es en tener diferentes valores localizables para una versión Pro frente a una versión de consumo de la aplicación.

Sin embargo, Traducir cadenas con datos variante de la plataforma es un problema. El problema es dos veces, uno está en la gestión de los procesos y el calendario del proyecto para permitir la localización ágil y despacho simultáneo a todas las plataformas de destino. El segundo aspecto está apoyando técnicamente la varianza plataforma en ambas bibliotecas de programación y herramientas de traducción. Muchas de las herramientas y las bibliotecas suponen un valor único para una fuente y una cadena de destino, pero en caso de variación de la plataforma no sólo no puede ser fuente de múltiples y valores objetivo para una cadena no es necesario establecer una relación uno a uno entre los valores de origen y destino. Puede haber múltiples variantes de la plataforma para una cadena de origen que puede ser necesario traducir de manera diferente sobre la base de la plataforma de mapa en el mismo valor / target traducida o una cadena de origen para la configuración regional de destino. Por ejemplo:

  • es_ES: “Por favor, cierre el cuadro de diálogo y volver a empezar.”
  • fr_FR default: “Cierre el diálogo y vuelva a intentarlo.”
  • Ventanas fr_FR: “Cierre el diálogo y vuelva a intentarlo.”

Puesto que soy parte del equipo de herramientas de la globalización aquí en Adobe, el resto de este post que describe el problema más de unos instrumentos técnicos y la perspectiva de las bibliotecas, dibujo de mi experiencia. El problema proceso también es bastante complejo y probablemente tomaría un puesto mucho más tiempo el blog para discutir. De hecho hay una idea afín ya en este blog, ver – enlace.

Plataforma de Apoyo varianza en las Bibliotecas

Lo ideal sería que las bibliotecas de la globalización / API utilizadas en el código para manejar cadenas externalizados y los formatos de almacenamiento correspondientes a los datos externalizados deben tener una noción de un valor variante de la plataforma para cada cadena. Debe haber una manera de solicitar un valor de cadena para una configuración regional y plataforma específica, junto con una disposición a caer de nuevo a un valor por defecto en caso de que no se especifica un valor específico de la plataforma.

Como un ejemplo, la API de Java ResourceBundle apoya la selección de un conjunto de 'Configuración regional', no se hace mención explícita de una "Plataforma", pero la "Configuración regional’ en sí es extensible para apoyar variantes. El mecanismo de la variante en la 'Configuración regional’ se puede utilizar para el apoyo a diferentes plataformas y también hay un mecanismo de repliegue. En Adobe tenemos una biblioteca multiplataforma desarrollada personalizada denominada ZString para la gestión de cadenas externalizados con el apoyo explícito de varianza plataforma.

Plataforma de Apoyo varianza en las Herramientas de Traducción

La mayoría de los sistemas de gestión de traducción (TMS) tener un uno-a-un modelo de cadenas de código coincidentes con cadenas traducidas para cada localidad. Esta suposición está detrás de la arquitectura de los algoritmos de correspondencia TM, así como el diseño de la mesa de trabajo de traducción. Un banco de trabajo de traducción típica por lo general ofrece una vista de lado a lado de origen y de destino cuerdas, pero sólo apoyar una sola cadena de origen que corresponde a un único valor traducido.

Typical Translation Workbench

Un equipo típico de la vista lateral de la fuente y el contenido de destino en una herramienta de traducción

Todavía estamos buscando la solución ideal a este problema. Para la gestión de las memorias de una posible solución con los sistemas existentes es tener entradas duplicadas en la memoria de traducción (TM) o una TM separado para cada plataforma.

Sin embargo, traductores todavía se ven limitadas por la visión presentada por el banco de trabajo de traducción. Una posible solución para permitir que proveedores de traducción para proporcionar traducciones específicos de la plataforma es de duplicar todas las cadenas de origen para cada posible plataforma de destino. El valor de la fuente de la plataforma por defecto se puede utilizar como el valor de origen para todos los demás plataforma si la interfaz de usuario de la aplicación ya especifica un valor para una plataforma específica, en cuyo caso que se utiliza. Ahora el traductor puede proporcionar diferentes traducciones para cada plataforma, si es necesario. Esta solución sin embargo, parece haber una gran cantidad de trabajo adicional para los traductores. Algunos de optimización es posible gracias a la traducción de una sola plataforma de primera y el aprovechamiento de traducciones para todas las otras plataformas.

En un escenario ideal, el banco de trabajo de traducción proporcionaría un lado a la vista lateral de todas las variantes de la plataforma para la cadena de origen y de destino de las cuerdas. Con la capacidad para el traductor para eliminar las variantes de la cadena traducida en los que no se requieren y proponer variantes para la cadena traducida incluso si la cadena de origen no tiene ningún. Esto permitiría a los traductores a trabajar a través del contenido de código en una sola pasada, edición de traducciones apalancadas, proporcionando nuevas traducciones cuando resulte necesario y proponer valores traducidos específicos de la plataforma, según corresponda.

Una aproximación a esta visión ideal es una hoja de cálculo de Excel con cada cadena de origen que se representa en una fila y tiene una columna separada para cada plataforma, tanto para las cadenas de origen y destino. Con valores en blanco en una columna de la plataforma que significa que la traducción del defecto se utilizará para esa plataforma y las entradas de la plataforma no están en blanco que se utiliza para las traducciones específicas de la plataforma.

Ideal Translation Workbench

Una vista workbench traducción propuesta que permite la traducción simultánea para múltiples plataformas

Todavía estamos experimentando para encontrar la mejor solución para nuestras necesidades, que ofrece flexibilidad a los traductores y sin embargo, aprovecha la inversión en herramientas y procesos de traducción existentes. El objetivo es ser capaz de soportar ciclos de lanzamiento más rápido ágiles con todas las versiones de la plataforma sucediendo simultáneamente.

Creo que este es un buen foro para pedir a nuestros lectores del blog, si se han enfrentado a problemas similares y las soluciones que se han desarrollado para tratar con él.

Las herramientas de Adobe Moisés ya está disponible para Windows

Este artículo fue originalmente escrito en Inglés. Texto en otros idiomas se proporcionan a través de la traducción automática.

Tenemos una actualización de la Adobe Moses Tools que anunció en este blog en mayo 11. Las herramientas ya están disponibles en paquetes pre-construidos para Windows! Echa un vistazo a la la sección de descargas de la M4Loc sitio para obtener el Windows paquetes y para la documentación y otra información acerca de las herramientas.

Por favor, descargar las herramientas y háganos saber lo que piensas!

–Raymond Flournoy
Senior Program Manager
Translation Technology Team

La invocación de la UCI de aplicaciones de Adobe AIR (Parte 2): el uso de Flash Builder 4.6

Este artículo fue originalmente escrito en Inglés. Texto en otros idiomas fue proporcionada por la traducción automática.

En mi artículo anterior del blog http://blogs.adobe.com/globalization/invoking-icu-from-adobe-air-applications-2, He demostrado con las extensiones de AIR3 ActionScript nativos función para invocar la UCI de una aplicación AIR. Usé las herramientas de desarrollo de AIR para compilar y generar los diversos componentes. En este artículo, Yo demuestro lo mismo con la versión preliminar de Adobe Flash Builder 4.6. Es mucho más simple de hacer esto en Flash Builder para evitar la línea de comandos complicados.

La versión preliminar de Adobe Flash Builder4.6 tiene una nueva versión del SDK de Flex 4.5.2, que se ha integrado AIR3. Por favor, descargue los archivos de muestra de la siguiente manera.

Usted necesitará el siguiente software para construir una extensión de la UCI para la plataforma AIR.

1 Edificio extensión UCI para Adobe AIR

Adobe AIR t nativo extensiones, también conocida como "anemia" o archivos "ENA" se archivan los paquetes. Estos consisten en

  • Clases de ActionScript envoltorio poner en DLLs externas
  • Los archivos DLL externa
  • XML que describe los detalles del archivo de archivos DLL externa

Los archivos archivados ANE se utilizan igual que las bibliotecas de SWC en la integración en una aplicación AIR. En otras palabras, ANE es un archivo de la biblioteca pública y se ha API de ActionScript.

Cubriendo todos los detalles sobre la extensión de ActionScript es demasiado para este artículo del blog, pero voy a explicar los pasos para crear esta muestra y ejecutar. A continuación se muestran los pasos secuenciales y los comandos.

1.1 DLL de Windows del edificio AIR UCI Extensión

1) La carpeta AirIcuExtensionWin tiene el estudio Visual solución "AirIcuExtension.sln '. Abrir en MS VS2010.

2) El AIRIcuExtension.cpp archivo tiene el código necesario necesario para interactuar con Adobe AIR 3. También tiene las rutinas de envoltura llamadas UCI funciones C.

3) Este es un proyecto DLL y el resultado de la compilación es AirIcuExtension.dll

1.2 Edificio ActionScript Library en FB 4.6

1.2.1 La construcción de la biblioteca de ActionScript

Crear un nuevo proyecto de biblioteca de ActionScript y el nombre de AirIcuExtension. Vea el archivo descargado ActionScript FB4.6 proyecto de biblioteca.

1.2.2 Embalaje extensión nativa ActionScript

Para un paquete de ANE, usted todavía tiene que hacerlo en línea de comandos. FB 4.6 no tiene una función hasta el momento para generar ANES en el IDE.

Abra la bandeja de AirIcuExtension.swc es un archivo comprimido. Abrirlo con WinRAR o WinZip programa y extraer el library.swf archivo en el paquete de SWC en el AirIcuExtension bin carpeta.

La carpeta src recursos contiene el archivo extension.xml, AirIcuExtension.dll y la UCI dlls icudt48.dll, icuuc48.dll, icuio48.dll y icuin48.dll. El archivo external.xml define los detalles de la biblioteca externa a AIR runtime.

Por razones de simplicidad, lugar de la AirIcuExtension.dll, UCI dlls y archivos en extension.xml AirIcuExtension bin carpeta. Todos estos archivos son empaquetados en un archivo comprimido llamado AiricuExtension.ane con el siguiente comando.

C:\FB4.6 SDK bin adt-package-storetype pkcs12-storepass <passwd> -Keystore <AIR certificado> -TSA no son objeto de ane-AirIcuExtension.ane extension.xml swc AirIcuExtension.swc plataformas Windows x86 library.swf AirIcuExtension.dll icudt48.dll icuin48.dll icuio48.dll icuuc48.dll

Uso Adobe FlashBuilder4.6 o C:\FB4.6 SDK bin se han programa, se puede generar un certificado de AIR.

La salida es un archivo AirIcuExtension.ane en el AirIcuExtension bin carpeta.

1.3 La construcción de la AirIcuExtensionTest.mxml programa de prueba

Ahora que hemos construido y empaquetado del paquete de la extensión nativa AiricuExtension.ane, estamos dispuestos a usar este y llamar a los servicios de la UCI en un programa de prueba.

La carpeta AirIcuExtensionTest src contiene el archivo de prueba AirIcuExtensionTest.mxml. El archivo descriptor AirIcuExtensionTest-app.xml tiene los detalles de extensión nativa.

Flash builder4.6 tiene una nueva función de vincular las aplicaciones de Flash con archivos de ANE. Como puede ver en la orden del FB4.6 las propiedades del proyecto "Flex Build Path ', hay una nueva pestaña para Extensiones nativas. Uso 'Añadir ANE " botón, agregar el archivo AirIcuExtension.ane presente en la carpeta AirIcuExtension / bin como se muestra a continuación.

Ver también el comando 'paquete Flex construcción ", en las propiedades del proyecto, hay una nueva pestaña para Extensión de los nativos. Por favor, asegúrese de que la casilla de verificación es AiricuExtension En.

La salida swf AirIcuExtensionTest.swf se coloca en la carpeta bin-debug.

1.4 La construcción de paquete de AIR para ejecutar AirIcuExtensionTest

El último paso es empaquetar el AirIcuExtensionTest arriba. SWF y archivos AirIcuExtension.ane en una carpeta ejecutable AIR. Podemos hacer esto en FB4.6 ahora en lugar de utilizar la línea de comandos tediosa.

  • EN FB4.6, seleccione AiricuExtensionProject y ejecutar el comando de menú Proyecto->Exportación versión de lanzamiento ...
  • En el diálogo posterior, elegir Instalador nativo firmado botón de radio. Sólo podemos crear instaladores nativos como estamos usando OS paquete específico ANE.
  • En el Extensiones nativas lengüeta, asegúrese de que el AirIcuExtension.ane casilla de verificación está habilitado.
  • Terminar de crear la versión de lanzamiento después de entrar en las credenciales de aire correcta certificado.

La salida del comando anterior es un instalador AirIcuExtensionTest.exe. Mediante la ejecución de lo, puede instalar el programa de pruebas.

2 Conclusión

La muestra ilustra la manera de invocar a la UCI de ActionScript. La extensión de AIR en la UCI es fácil de construir con la próxima Builder AdobeFlash 4.6 liberación. ANE es una gran característica para los desarrolladores de AIR y aplicaciones AIR pueden hacer uso de la plataforma o la unidad de cuidados intensivos proporcionan servicios de globalización.

Un auto-completar ligera ejemplo ActionScript con un trie

Este artículo fue originalmente escrito en Inglés. Texto en otros idiomas fue proporcionada por la traducción automática.


Auto-completado se utiliza ampliamente a través de Internet y las aplicaciones móviles. Una gran cantidad de sitios web y aplicaciones de tratar de completar su entrada tan pronto como empiece a escribir. En este post, Me gustaría introducir un simple ActionScript auto-completar la solución mediante el uso de la estructura trie de datos.

Un trie es un árbol ordenado estructura de datos que se utiliza para almacenar una matriz asociativa. Todos los descendientes de un nodo tienen un prefijo común de la cadena asociada a ese nodo, y la raíz se asocia con la cadena vacía. A partir del nodo raíz, se puede comprobar si una palabra existe en el trie fácilmente siguientes puntos correspondientes a las letras en la palabra objetivo. Trie es una estructura de datos conocidos en la informática; usted puede encontrar la información detallada sobre trie a través de Wikipedia.

Aquí tenemos una implementación sencilla trie en ActionScript:

/**
* Una estructura de datos simple para almacenar y buscar palabras.
* @ See http://en.wikipedia.org / wiki / Trie para obtener más detalles.
*/

public class Trie {
private var _rootKeys:Array;
public function Trie():void {
_rootKeys=[];
}

/**
* Devuelve una lista de palabras que tienen el prefijo dado.
*/

public function get(prefix:String):Array {
var results:Array=[];
var letter:String=prefix.substr(0,1);
var root:TrieNode=_rootKeys[letter];
if (root) {
getWordList(prefix, 1, root, results);
}
return results;
}

/**
* Agregar una palabra al objeto que puede ser igualado como prefijo.
*/

public function add(word:String):void {
var letter:String=word.substr(0,1);
var root:TrieNode=_rootKeys[letter];


if (!root) {
root=createNode(letter);
_rootKeys[letter]=root;
}
insertWord(word, 1, root);
}


private function traverse(root:TrieNode, results:Array, prefix:String):void {
if(root.children) {
for each( var c:TrieNode in root.children ) {
var node:TrieNode = c as TrieNode;
if( node.word ) {
results.push( prefix + node.value);
}
traverse(node, results, prefix+node.value );
}
}
}


private function getWordList(prefix:String,
position:uint,
root:TrieNode,
results:Array):void {
var letter:String=prefix.substr(position,1);
var child:TrieNode=root.children[letter];
if (!letter || !child) {
return;
}


if ( position<(prefix.length-1) ) {
getWordList(prefix, ++position, child, results);
}else {
if (!child.word) {
traverse( child, results, prefix);
}
}

}


private function insertWord(word:String,
position:uint,
root:TrieNode):void {
var letter:String=word.substr(position,1);
if (position==word.length || !letter) {
return;
}


var child:TrieNode=root.children[letter];
if (! child) {
child=createNode(letter);
root.children[letter]=child;
}


if (position==word.length-1) {
child.word=true;
} else {
insertWord(word, ++position, child);
}
}


private function createNode(letter:String):TrieNode {
return new TrieNode(letter,false);
}
}

Formato de fecha y hora en los calendarios gregoriano no

Este artículo fue originalmente escrito en Inglés. Texto en otros idiomas fue proporcionada por la traducción automática.

Aunque el calendario gregoriano es el calendario más utilizado civiles, hay otros calendarios utilizados en diferentes países y regiones.

Calendario islámico se utiliza en muchos países islámicos y tiene muy pocas variaciones de un. Japón utiliza el calendario imperial que identifican el año con un nombre de la era(Reinado, nengo) y un número. Tailandia utiliza un calendario que cuenta en la era budista.

Con el paquete flash.globalization, que más fácil dar formato a una fecha en el calendario no gregoriano. Ver el código de abajo.