Welcome to
  LoginServices | About Albania | Career | Translation Articles | Contact Us
Bullet  Home

Bullet  Services

Bullet  About Albania

Bullet  Resources

Bullet  FAQ

Bullet  Contact Us





A collection of Albanian Grammar e-books


 
Recursos do Microsoft .NET
Posted on Monday, October 01 @ 04:54:47 EDT
Topic: Portuguese Articles

TranslationLocalizationInterpretationDTP & Printing


 
 

Levando as técnicas de localização mais adiante; para quem já é usuário avançado

Introdução
Por volta do ano 2000, a Microsoft Corporation lançou o .NET (lê-se “ponto net”), seu ambiente integrado de programação, para consolidar e simplificar o conjunto heterogêneo de ferramentas (COM, operações de banco de dados, programação Win32, páginas de código versus Unicode etc.) que surgiram ao longo de mais de 20 anos de desenvolvimento do Windows [1]. De fato, o .NET foi muito bem recebido por aqueles que tinham grande interesse em internacionalização, localização e uma relação transparente com o Unicode. A Microsoft tinha finalmente oferecido um sistema limpo, baseado em classes e em Unicode, com modelos fáceis e eficazes de recursos e localidades.



Neste artigo, vou mostrar uma técnica de localização em .NET que apareceu em sua primeira versão “.x”, a versão 1.1. A metodologia é clássica, e a idéia fundamental é muito conhecida na comunidade de localização. O conceito básico gira em torno da combinação entre um recurso padrão incorporado, que contém um idioma de fallback, e recursos satélites, que gerenciam scripts adicionais.

Em um artigo posterior, você aprenderá sobre um interessante conceito que apareceu pela primeira vez no .NET 2.0. Nesse caso, os recursos satélites desaparecem para dar lugar a um recurso único, com rigidez de tipos. O resultado é robusto e menos sujeito a falhas, mas talvez você precise trabalhar um pouco mais para criar versões de seu programa em diferentes idiomas.

Conceitos básicos
No .NET, os recursos são baseados em XML e os arquivos têm extensão .resx. Um arquivo .resx oferece o mecanismo básico para armazenar pares de objetos e chaves. Geralmente, um objeto é uma string, mas estruturas mais complexas também são possíveis, inclusive ícones, bitmaps e outras estruturas gráficas, desde que possam ser convertidas em Base64. Existem ferramentas no .NET com essa finalidade. Neste artigo, eu uso apenas texto simples nos exemplos.

Um arquivo .resx começa com um esquema, seguido por pares de chaves e dados contendo informações sobre o recurso. A seguir está um exemplo abreviado: a string chave é “tram” (bonde) e a string de valor é um comentário sobre as ironias da vida. O texto citado é de Camillo Sbarbaro, traduzido para o inglês.

< ?xml version="1.0" encoding="utf-8" ? >

    schema > …. > …. schema>
    …
   
        life is like a tram, when you get to sit down it’s the end of the line value>
   
    …
root>

Figura 1: Formato .resx básico
Naturalmente, o formato .resx nativo não é muito amigável para trabalhar, a menos que você goste de complexidade. Portanto, por motivos práticos, o localizador ou desenvolvedor recebe uma tabela em que podem ser inseridas as entradas desejadas. Durante a compilação, o conteúdo da tabela é convertido no formato .resx. Todos os comentários também são mantidos, mas não podem ser acessados diretamente. Você precisará usar técnicas de XML para recuperar o valor. Se você acrescentar recursos satélites a seu projeto, obterá também um conjunto de tabelas adicionais.

Nome

Valor

Comentário

tram

Life is like a tram, when you get to sit down it’s the  end of the line [2]

From the works of Camillo Sbarbaro [3]






 

Figura 2: Exemplo da tabela de entrada do arquivo de recursos

O modelo de recursos do .NET 1.1
O modelo de recursos do .NET 1.1 parecerá muito familiar aos localizadores experientes, embora os detalhes sejam bem diferentes dos usados para gerenciar os recursos do Windows. Existe um arquivo .resx principal que é compilado e se torna o assembly executável. O conteúdo pode estar em qualquer idioma e normalmente é escolhido como fallback final. No exemplo abaixo, o fallback é em inglês. O conceito de fallback é importante pois, se tudo o mais falhar, pelo menos algumas informações serão exibidas, mesmo que não sejam entendidas de imediato pelo usuário.

Os recursos satélites são acrescentados para gerenciar os outros idiomas. Eles seguem uma convenção especial de nomenclatura que consiste em um nome básico, um identificador Microsoft RFC 1766 (idioma, ou idioma-região, como es, es-ES, fr, de-DE etc.) e a extensão .resx (..resx). É muito simples acrescentar ao projeto esse tipo de arquivo de recursos. Para cada idioma, você tem acesso a uma tabela adicional de entradas, que é compilada durante o processo. O assembly satélite resultante é colocado em um diretório com o mesmo nome do identificador RFC 1766, imediatamente abaixo do diretório do assembly principal. A Figura 3 mostra alguns detalhes da versão de nosso exemplo. Observe o relacionamento entre os recursos em francês e o próprio executável. Tenha em mente que os recursos de fallback residem no assembly original e todos os outros idiomas são armazenados nas DLLs satélites.

Locais dos arquivos no diretório do projeto
Figura 3: Locais dos arquivos no diretório do projeto
Quanto ao código, ele é bem simples neste caso. No entanto, se você não tiver experiência em trabalhar com .NET, talvez leve algum tempo para aprender exatamente que parâmetros são necessários ao usar o gerenciador de recursos, ResourceManager (veja a listagem na Figura 4). Espero que você não se importe; é preciso ler e compreender um pouco de codificação. A linguagem de programação é C# e, se servir de conforto, C# é uma das linguagens atuais de programação mais fáceis de aprender.

Neste exemplo, eu uso algumas ferramentas de configuração do .NET para obter um identificador RFC 1766 que especifique a “localidade” (ou, em termos de .NET, a “cultura”) dos recursos. Então é criado um objeto ResourceManager que consulta o programa (Assembly no linguajar .NET). O ResourceManager solicita a citação usando a string chave “tram”. Observe que o resultado depende da cultura para a qual o identificador RFC 1766 tenha criado uma instância. Por fim, a saída é exibida ou o gerenciador de exceções informa um erro.

Este é o resultado quando o identificador é “fr” (francês) e a recuperação é feita com sucesso:

« la vie c’est comme un autobus: dès que tu réussis à t’asseoir, tu dois descendre »

using System;

using System.Globalization;

using System.Resources;

using System.Reflection;

using System.Configuration;


namespace ConsoleLocalizationExample {

   class Quotes {

      [STAThread]

      static void Main(string[] args) {

         // use app.config to set culture

         AppSettingsReader rdr = new AppSettingsReader();

         // read RFC-1766 identifier to determine the user interface language

         string rfcid = (string)rdr.GetValue("culture", typeof(System.String));

         // create a resource manager referencing the program

         ResourceManager rm = new ResourceManager("Quotes.QuotesRes",

                                    Assembly.GetExecutingAssembly());

         // things can go wrong, so use try / catch to get useful information

         try {

            // if successful, output will be the quote in the expected language

            Console.WriteLine(rm.GetString("tram", new CultureInfo(rfcid)));

         } catch (Exception ex) {

            // failed, show exception information

            Console.WriteLine(ex);

         }

      }

   }
}

Figura 4: Código do projeto de exemplo
No caso de qualquer outra cultura, espere apenas o idioma inglês — ele é o fallback [4], aquele arquivo .resx original que nós criamos. Você pode experimentar trocar a definição de ‘value’ (o valor) no arquivo app.config e, se achar que entendeu as etapas de programação, poderá tentar acrescentar outro recurso satélite para testar suas habilidades. Por exemplo, tente o idioma tcheco (“cs” é a marca de idioma): aparecerdução abaixo (mas certifique-se de ter definido a página de código de saída no console como UTF-8; se você passar nesse teste, estará indo muito bem!)

“v životě je to jako v tramvaji, když si konečně můžeš sednout, je konečná”

Depois de examinar o código, você deverá estar plenamente consciente de que o sucesso na recuperação da mensagem dependerá de haver um objeto ResourceManager que possa consultar o assembly principal e todos os seus satélites. O uso do gerenciador exige a criação de instâncias com dois parâmetros: o nome do assembly, que é o arquivo .resx, e o assembly em execução no momento. Para recuperar a própria string, talvez seja necessário alterar dinamicamente a cultura da interface do usuário, como fizemos no código de exemplo. Essa possibilidade só está disponível em programas .NET e é uma dádiva dos deuses para quem está testando esse tipo de programa.

Opcionalmente, se você puder alternar seu sistema operacional para outra interface de usuário, poderá tentar alterá-la para testar seus resultados. Esse método, no entanto, exige que você tenha a Interface do Usuário Multilíngüe (MUI, Multilingual User Interface) instalada em seu computador. Por outro lado, isso significa que seu computador deve ter a versão do Windows em inglês (EUA), com o idioma MUI necessário instalado. Recomendo executar o teste usando a configuração apropriada do app.config (Figura 5).

xml version="1.0" encoding="utf-8" ?>

     

           

      appSettings>
configuration>
Figura 5: Arquivo app.config do projeto .NET 1.1

Resumo
O método básico de localização no Microsoft .NET é conhecido. Naturalmente, os detalhes talvez sejam novos para você, mas a metodologia não é difícil de aprender nem de implementar. No entanto, muito tempo se passou desde o lançamento do .NET 1.1, e agora toda a energia está concentrada no .NET 2.0 e no .NET 3.0 (Vista).

Aguarde uma complementação, em momento oportuno, sobre recursos com rigidez de tipo no uso de .NET 2.0 / 3.0.



Assembly no .NET
Na estrutura do Microsoft .NET, um assembly é uma biblioteca de códigos parcialmente compilada para uso em implantação, controle de versões e segurança.
Há dois tipos: assemblies de processo (EXE) e assemblies de biblioteca (DLL).

C#
Linguagem de programação orientada ao objeto desenvolvida pela Microsoft como parte de seu projeto .NET e posteriormente aprovada como padrão pela ECMA e pela ISO. C# tem uma sintaxe processual e orientada ao objeto, baseada em C++ e contém aspectos de várias outras linguagens de programação (mais notadamente Delphi e Java), com ênfase especial na simplificação.

Fallback
Sistema de apoio para recuperação de dados em caso de falha.

Linguagem de Programação com Rigidez de Tipos
Na ciência da computação e na programação de computadores, o termo "rigidez de tipos" é usado para descrever como as linguagens de programação lidam com os tipos de dados.

MUI
A Multilingual User Interface (MUI) é um recurso da Microsoft que permite ao usuário final alterar o idioma da interface do usuário (UI) — por exemplo, alguém que esteja trabalhando com uma interface em inglês e precise alterar o idioma da interface para espanhol. Se seu aplicativo foi projetado para usuários de ambientes com vários idiomas, você poderá adicionar código para alterar automaticamente as strings da interface do usuário a fim de que correspondam ao idioma configurado em determinado computador (supondo que os recursos corretos estejam instalados).

Recursos Satélites
Satélites são recursos com objetivo específico que são usados em vez do recurso principal, que tem um objetivo geral. Em localização, o recurso principal pode estar, por exemplo, em inglês e pode haver vários satélites correspondentes, cada um específico a um idioma, como francês, português, russo etc.

Unicode
Padrão do setor criado para permitir que texto e símbolos de todos os sistemas de escrita do mundo possam ser consistentemente representados e manuseados por computadores.

UTF-8 (8-bit UCS/Unicode Transformation Format)
UTF-8 é uma codificação de caracteres de tamanho variável para Unicode. Ela é capaz de representar qualquer caractere universal no padrão Unicode. Por isso está, gradualmente, tornando-se a codificação preferida para emails, páginas da Web e outras situações em que os caractereses são armazenados ou distribuídos.

[1] Meu primeiro trabalho no mundo dos computadores foi adaptar o Windows 1.0 a computadores Olivetti e AT&T. Uma parte significativa do código era baseada no 8086. Anteriormente, eu tinha trabalhado como professor adjunto de matemática em uma grande universidade norte-americana, lecionando para estudantes de graduação e pós-graduação. Foi uma mudança fundamental, que ocorreu aos 50 anos de idade.
[2] A vida é como um bonde: quando você consegue um lugar sentado, já está no fim da linha

[3] Extraído da obra de Camillo Sbarbaro
[4] Ao executar esse programa, convém verificar se os resultados aparecem corretamente na saída do console. No Windows, o console é geralmente configurado para usar uma página de código que corresponda ao idioma da interface do usuário. Portanto, antes de executar o programa no nível de comando (procure o comando de console chcp), você talvez queira configurar a página de código do console para a página de código de saída esperada ou UTF-8. No .NET 2.0, você pode ignorar a configuração chcp e usar uma nova API para definir a codificação de saída recomendada (UTF-8). O resultado no console talvez ainda pareça estar incorreto, mas redirecioná-lo para um arquivo do bloco de notas garantirá um resultado adequado. A melhor solução seria a Microsoft, de uma vez por todas, corrigir o sofrível suporte visual do Unicode!
Bill Hall photoBill Hall foi desenvolvedor e consultor para as plataformas Windows e Win32, tendo iniciado sua experiência no Windows 1.0, que adaptou, em nível de sistema, para computadores AT&T/Olivetti. Programador de sistemas e de aplicativos ao longo de toda a sua carreira na área de computação, voltou-se para a internacionalização no início dos anos 90, assumindo vários projetos em idiomas europeus e do Extremo Oriente, além de contribuir com numerosos artigos para o Microsoft Systems Journal e a Multilingual Computing. Atualmente, está escrevendo uma série de monografias sobre internacionalização e localização em .NET e ensinando globalização no Windows e em .NET. Em vidas passadas, Bill foi aviador militar e civil, professor adjunto de matemática por aproximadamente 20 anos e, durante três anos, teve a função de editor associado na Mathematical Reviews.



By Bill Hall,
a developer and consultant for Windows and Win32 platforms




This article was originally published by the Ccaps Newsletter (http://www.ccaps.net/newsletter/newsletteren.htm). All rights reserved.


 
· More about Portuguese Articles
· Articles by Genta


Most read story about Portuguese Articles:
A capciosa terminologia da indústria petrolífera

Average Score: 0
Votes: 0

Please take a second and vote for this article:

Excellent
Very Good
Good
Regular
Bad


 Printer Friendly Printer Friendly

"Login" | Login/Create an Account | 0 comments
The comments are owned by the poster. We aren't responsible for their content.

No Comments Allowed for Anonymous, please register
Services | About Albania | Career | Resources | Links | Contact Us
Copyright© 2006-2009. Terms & Conditions, Privacy

Translation, Localization and Interpretation ServicesElia Company