O problema com Software Localizando para múltiplas plataformas

Adobe tem uma longa história de desenvolvimento de produtos para múltiplas plataformas, quer se trate de aplicações de desktop como nossos aplicativos Creative Suite emblemáticos ou aplicações sensíveis ao toque mais recentes, como Photoshop Toque. A maioria dos nossos aplicativos de desktop foram construídos para Windows e Mac e aplicações mais recentes continuar esta tendência, com suporte para iOS e Android, incluindo tablet e telefone fatores de forma para ambos.

Claro que isso não teria sido possível sem os esforços cuidadosos da equipe de engenharia para manter em grande parte uma única base de código para todas as plataformas.

Apesar de ter uma única base de código tem benefícios óbvios, na camada de interface do usuário muitas vezes é importante ter variações de plataformas específicas para uma melhor usabilidade. Cada plataforma tem geralmente uma convenção específica para se referir ao sistema de menus, teclas de atalho e elementos de interface do usuário. Por exemplo, em uma plataforma Windows uma String UI pode ser – “Selecione um arquivo de mídia através do botão Procurar ou digite um caminho válido.” ea mesma seqüência para a plataforma do Mac pode ser – “Selecione um arquivo de mídia através do botão Escolher ou digite um caminho válido.”

Isso significa que as cordas UI traduzíveis pode ter muitas variações no idioma de origem, dependendo de qual plataforma eles são destinados a. Isto é o que o nosso grupo de globalização geralmente se refere como "Plataforma de variância’. Cordas localizáveis ​​são essencialmente múltiplo entidades. Cada corda localizável tem um identificador e múltiplos valores associados cada um dos quais podem ser selecionados com base em determinados critérios. Os critérios mais óbvios e comumente utilizado é o idioma da interface do usuário do aplicativo, mas ele não precisa ser o único. Plataforma também pode decidir o valor de uma string.

Suporte de variação plataforma não é apenas útil para o tratamento de diferenças de terminologia para se referir a elementos de interface do usuário do sistema, ele também ajuda a adaptar cordas para diferentes tamanhos de tela. Aplicação moderna são projetados para suportar vários formatos de dispositivos como tablet e telefone com a interface do usuário que está sendo ajustado para cada plataforma para uma melhor experiência do usuário. Variância plataforma, neste caso, pode ser usado para apoiar cadeias mais longas para a vista Tablet e cordas mais curtas para a exibição do telefone.

No entanto, outra área onde o suporte de variação plataforma poderia ser útil é em ter diferentes valores localizáveis ​​para uma versão Pro versus uma versão do Consumidor da aplicação.

Contudo, localizar strings com dados variante da plataforma é um problema. O problema é duas vezes, é na gestão dos processos e cronograma do projeto para permitir a localização ágil e lançamento simultâneo para todas as plataformas-alvo. O segundo aspecto é tecnicamente apoiar a variância plataforma em ambas as bibliotecas de programação e ferramentas de tradução. Muitas ferramentas e bibliotecas de assumir um único valor para uma origem e uma seqüência alvo, mas no caso da plataforma de variância não só pode haver múltiplas fontes e os valores de alvo para uma cadeia lá não necessita de ser de um-para-um entre os valores de origem e de destino. Pode haver múltiplas variantes de plataforma para a cadeia de origem que são mapeados para o mesmo valor / target traduzido ou uma única seqüência de origem pode precisam ser traduzidos de forma diferente com base na plataforma para o local de destino. Por exemplo:

  • pt_BR: “Por favor, feche a janela e começar de novo.”
  • fr_FR padrão: “Feche o diálogo e tente novamente.”
  • O Windows fr_FR: “Feche o diálogo e tente novamente.”

Desde que eu sou parte da equipe de ferramentas de globalização aqui no Adobe, o restante deste post eu descrever o problema mais de uma ferramentas técnicas e perspectivas bibliotecas, desenho da minha experiência. O problema processo também é bastante complexo e, provavelmente, ter um post muito mais tempo blog para discutir. Na verdade, há um um relacionado já neste blog, ver – link.

Suporte Variance plataforma em Bibliotecas

Idealmente, as bibliotecas de globalização / APIs usadas no código para gerenciar cadeias externalizados e os formatos de armazenamento correspondentes para os dados externalizados deve ter uma noção de um valor variante plataforma para cada corda. Deve haver uma maneira de pedir um valor de string para uma localidade e uma plataforma específica, juntamente com uma disposição para voltar a cair para um valor padrão no caso de um valor específico da plataforma não é especificado.

Como um exemplo, a API Java ResourceBundle suporta a seleção de um pacote de 'Locale', não há menção explícita de uma "Plataforma", mas o 'Locale’ si é extensível para suportar variantes. O mecanismo de variante no 'Local’ pode ser usado para suportar plataformas diferentes, e existe também um mecanismo de queda para trás. No Adobe temos uma biblioteca multi-plataforma desenvolvido personalizado chamado ZString para o gerenciamento de cadeias de externalizados com apoio explícito para a plataforma de variância.

Suporte Variance plataforma em Ferramentas de Tradução

A maioria dos sistemas de gerenciamento de tradução (TMSS) ter um one-to-one modelo de strings com as cordas correspondentes traduzidos para cada localidade. Este pressuposto está por trás da arquitetura dos algoritmos correspondentes TM, bem como o desenho da bancada tradução. Um típico bancada tradução normalmente oferece um lado a vista lateral de origem e de destino cordas, mas apenas apoiar uma única seqüência de fonte correspondente a um valor único traduzido.

Typical Translation Workbench

Um lado típico de visão lateral de origem e conteúdo alvo de uma ferramenta de tradução

Nós ainda estamos procurando a solução ideal para este problema. Para gerenciar os TMs uma possível solução usando os sistemas existentes é ter entradas duplicadas na memória de tradução (TM) ou um TM separado para cada plataforma.

Contudo, tradutores ainda são limitados pela visão apresentada pela sua bancada de trabalho de tradução. Uma possível solução para permitir que os fornecedores de tradução para fornecer a plataforma traduções específicas é duplicar todas as cordas de origem para cada plataforma alvo possível. O valor de origem para o padrão da plataforma pode ser usado como valor de fonte para todas as outras, a menos que a plataforma de aplicação UI já especifica um valor para uma plataforma específica, caso em que é usado. Agora, o tradutor pode fornecer traduções diferentes para cada plataforma, se necessário. Essa solução no entanto parece ser uma quantidade significativa de trabalho adicional para os tradutores. Alguns otimização é possível traduzir uma única plataforma primeiro e aproveitando traduções para todas as outras plataformas.

Em um cenário ideal da bancada tradução daria um lado a vista lateral de todas as variantes de plataforma para a string de origem e as cordas alvo. Com a capacidade para o tradutor para remover as variantes da seqüência traduzida onde eles não são necessários e propor variantes para a cadeia traduzido mesmo se a seqüência de origem não tem qualquer. Isso permitiria que os tradutores a trabalhar com o conteúdo de origem em uma única passagem, edição de traduções alavancados, proporcionando novas traduções quando necessário e propondo valores traduzidos específicos da plataforma, conforme apropriado.

Uma aproximação com esta visão ideal é uma folha de Excel com cada corda fonte que está sendo representado em uma linha e ter uma coluna separada para cada plataforma, tanto para fonte e cordas alvo. Com os valores em branco numa coluna plataforma significando que o padrão de tradução é para ser usado para essa plataforma e entradas da plataforma não em branco a ser utilizado para a plataforma de tradução específicos.

Ideal Translation Workbench

A proposta vista bancada tradução permitindo traduções simultâneas para múltiplas plataformas

Nós ainda estamos experimentando para encontrar a solução ideal para as nossas necessidades, que oferece flexibilidade para tradutores e ainda aproveita o nosso investimento em processos e ferramentas de tradução existentes. O objetivo é ser capaz de suportar mais rápido ciclos de lançamento ágeis com todas as versões da plataforma acontecendo simultaneamente.

Acho que este é um bom fórum para pedir aos nossos leitores do blog, se enfrentaram problemas semelhantes e as soluções que desenvolvemos para lidar com ele.

Ferramentas Adobe de Moisés agora disponível para Windows

Este artigo foi escrito originalmente em Inglês. Texto em outros idiomas é fornecido através de tradução automática.

Temos uma atualização sobre o Adobe Moses Tools qual anunciou neste blog em Maio 11. As ferramentas já estão disponíveis em pacotes pré-compilados para Windows! Confira o baixar seção do M4Loc site para obter o Windows pacotes e de documentação e outras informações sobre as ferramentas.

Faça o download das ferramentas e deixe-nos saber o que você pensa!

–Raymond Flournoy
Senior Program Manager
Translation Technology Team

Invocando UTI a partir de aplicativos Adobe AIR (Parte 2): usando o Flash Builder 4.6

Este artigo foi escrito originalmente em Inglês. Textos em outros idiomas foram fornecidos via tradução automática.

Em meu artigo anterior http://blogs.adobe.com/globalization/invoking-icu-from-adobe-air-applications-2, eu demonstrei o use das extensões de AIR3 ActionScript nativa característica de invocar UTI de um aplicativo AIR. Eu usei as ferramentas de desenvolvedor AIR para compilar e criar vários componentes. Neste artigo, Eu demonstro o mesmo usando a versão pré-lançamento do Adobe Flash Builder 4.6. É muito mais simples de fazer isso no Flash Builder evitando a linha de comando complicado.

A versão pré-lançamento do Adobe Flash Builder4.6 tem uma nova versão do Flex SDK 4.5.2, que tem AIR3 integrada. Faça o download do arquivos de exemplo da seguinte forma.

Você vai precisar do software a seguir para construir uma extensão da UTI para a plataforma AIR.

1 Extensão UTI Edifício para Adobe AIR

Adobe AIR extensões nativas t, também conhecido como 'ane' ou 'ANE "os processos foram arquivados pacotes. Estes consistem em

  • Classes wrapper ActionScript pôr em DLLs externas
  • O DLLs externas
  • Detalhes do arquivo XML descrevendo de DLLs externas

Os arquivos arquivados ANE são usados ​​apenas como bibliotecas SWC na integração em um aplicativo AIR. Em outras palavras, ANE arquivo é uma biblioteca e tem público ActionScript APIs.

Cobrindo todos os detalhes sobre a extensão ActionScript é demais para este artigo no blog, mas eu vou explicar os passos para criar esse exemplo e executar. Abaixo estão as etapas seqüenciais e comandos.

1.1 DLL Edifício do Windows Extensão AIR UTI

1) A pasta AirIcuExtensionWin tem o estúdio Visual solução "AirIcuExtension.sln '. Abrir esta em MS VS2010.

2) O AIRIcuExtension.cpp arquivo tem o código necessário necessário para fazer a interface com o Adobe AIR 3. Tem também as rotinas wrapper chamar funções C UTI.

3) Este é um projeto DLL ea saída de construção é AirIcuExtension.dll

1.2 Edifício ActionScript Biblioteca em FB 4.6

1.2.1 A construção da biblioteca ActionScript

Criar um novo projeto de biblioteca ActionScript e nomeá-la AirIcuExtension. Ver o projeto de biblioteca baixado ActionScript FB4.6.

1.2.2 Embalagem extensão nativa ActionScript

Para um pacote ANE, você ainda precisa fazê-lo na linha de comando. FB 4.6 não tem ainda uma característica de gerar ANES no IDE.

Abra o bin AirIcuExtension.swc é um arquivo zipado. Abri-lo usando WinRAR ou WinZip programa e extrair o library.swf arquivo no pacote para o swc AirIcuExtension bin pasta.

A pasta src resources contém o arquivo extension.xml, AirIcuExtension.dll e UTI dlls icudt48dll, icuuc48dll, icuio48.dll e icuin48.dll. O arquivo external.xml define os detalhes biblioteca externa para AIR runtime.

Para simplificar, coloque o AirIcuExtension.dll, UTI dlls e arquivos em extension.xml AirIcuExtension bin pasta. Todos esses arquivos são compactados em um arquivo zipado chamado AiricuExtension.ane usando o seguinte comando.

C:\FB4.6 SDKs bin adt-package-storetype pkcs12-storepass <senha> -Keystore <Certificado de AIR> -tsa nenhum alvo ane AirIcuExtension.ane extension.xml-swc AirIcuExtension.swc-plataforma Windows x86-library.swf AirIcuExtension.dll icudt48.dll icuin48.dll icuio48.dll icuuc48.dll

Utilização Adobe FlashBuilder4.6 ou C:\FB4.6 SDKs bin ter tomado programa, pode-se gerar um certificado AIR.

A saída é um arquivo AirIcuExtension.ane no AirIcuExtension bin pasta.

1.3 Construindo o AirIcuExtensionTest.mxml Programa de teste

Agora que nós construímos e embalados o pacote de extensão nativa AiricuExtension.ane, estamos prontos para usar esse e chamar os serviços de UTI em um programa de teste.

A pasta AirIcuExtensionTest src contém o arquivo de teste AirIcuExtensionTest.mxml. O arquivo descritor AirIcuExtensionTest-app.xml tem os detalhes de extensão nativa.

Flash Builder 4.6 tem um novo recurso para ligar aplicações Flash com arquivos ANE. Como você vê a partir do comando FB4.6 propriedades do projeto "Flex Build Path", há uma nova guia para Native Extensions. Utilização 'Ed Lane' botão, adicione o arquivo presente na pasta AirIcuExtension.ane AirIcuExtension / bin, como mostrado abaixo.

Veja também o comando 'Pacote Construindo Flex' nas propriedades do projeto, há uma nova guia para Extensão nativa. Por favor, certifique-se que a caixa de seleção é AiricuExtension Em.

A saída de arquivos swf AirIcuExtensionTest.swf é colocado na pasta bin-debug.

1.4 Construir pacote AIR para executar AirIcuExtensionTest

O passo final é para empacotar o AirIcuExtensionTest acima. Swf e arquivos AirIcuExtension.ane em uma pasta executável AIR. Podemos fazer isso em FB4.6 agora, em vez de usar a linha de comando tedioso.

  • IN FB4.6, selecione AiricuExtensionProject e executar o comando menu Project->Exportação de Lançamento Construir ...
  • Na caixa de diálogo que se seguiu, escolher Assinado instalador nativo botão de rádio. Só podemos criar instaladores nativos, como estamos usando OS específicos pacote ANE.
  • Na tab Native Extensions tab, certifique-se que a checkbox AirIcuExtension.ane esteja selecionada.
  • Terminar de criar a versão de compilação depois de entrar as credenciais certificado correto AIR.

A saída do comando acima é um instalador AirIcuExtensionTest.exe. Ao executá-lo, você pode instalar o programa de teste.

2 Conclusão

Este exemplo ilustra como invocar ICU do ActionScript. A AIR extensão UTI é fácil de construir usando os próximos AdobeFlash Builder 4.6 lançamento. ANE é um ótimo recurso para os desenvolvedores AIR e aplicações AIR pode fazer uso da plataforma ou UTI desde serviços de globalização.

A auto-complete leve ActionScript exemplo com uma trie

Este artigo foi escrito originalmente em Inglês. Textos em outros idiomas foram fornecidos via tradução automática.


Auto-completar funcionalidade é amplamente utilizado através da internet e aplicativos móveis. Um monte de sites e aplicativos tentar completar a sua entrada, logo que você começa a digitar. Neste post, Gostaria de introduzir um simples ActionScript solução de auto-completar usando estrutura de dados trie.

Uma trie é uma árvore ordenada estrutura de dados que é usado para armazenar uma matriz associativa. Todos os descendentes de um nó têm um prefixo comum da seqüência associada a esse nó, ea raiz é associado com a string vazia. A partir do nó raiz, você pode verificar se uma palavra existe na trie facilmente por ponteiros seguintes correspondentes às letras na palavra-alvo. Trie é uma conhecida estrutura de dados em ciência da computação; você pode encontrar informações detalhadas sobre trie através Wikipedia.

Aqui está uma aplicação simples em ActionScript trie:

/**
* Uma estrutura de dados simples para armazenar e procurar palavras.
* @ See http://en.wikipedia.org / wiki / Trie para obter detalhes adicionais.
*/

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

/**
* Retornar uma lista de palavras que têm o prefixo 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;
}

/**
* Adicionar uma palavra para o objeto que pode ser comparada como um prefixo.
*/

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 data e hora em calendários não-gregorianos

Este artigo foi escrito originalmente em Inglês. Textos em outros idiomas foram fornecidos via tradução automática.

Embora o calendário gregoriano é o calendário mais utilizado civis, existem outros calendários usados ​​em diferentes países e regiões.

Calendário islâmico é usado em muitos países islâmicos e tem bastante variações poucos. Japão usa o calendário imperial que identificam o ano com um nome era(Título reinado, nengō) e um número. Tailândia usa um calendário que conta na era budista.

Com o pacote flash.globalization, mais fácil você pode formatar uma data no calendário gregoriano não-. Veja o código abaixo.