|
|
Advertisements |
|
|
|
Recursos do Microsoft .NET
By Bill Hall,
a developer and consultant for Windows and Win32 platforms
Become a member of TranslationDirectory.com at just
$12 per month (paid per year)
English
Version
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" ? >
<root>
<xsd:schema > …. </xsd:schema>
…
<data name="tram">
<value>life is like a tram, when you get to sit down it’s the end of the line </value>
</data>
…
</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 (<nome básico>.<identificador rfc1766>.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.
|
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" ?>
<configuration>
<appSettings>
<add key = "culture" value = "fr" />
</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. |
<Glossário>
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 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.
Submit your article!
Read more articles - free!
Read sense of life articles!
E-mail
this article to your colleague!
Need
more translation jobs? Click here!
Translation
agencies are welcome to register here - Free!
Freelance
translators are welcome to register here - Free!
|
|
|
Free
Newsletter |
|
|
|
|