Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Índice

Introdução

Qualquer aplicação tem pelo menos um idioma para interface do usuário. Muitas aplicações têm mais de um. O TNF fornece um sistema de localização flexível para uma aplicação.

A primeira coisa a fazer é declarar quais idiomas são suportados. Isso é feito no método PreInitialize de seu módulo como mostrado abaixo: 

Bloco de código
languagec#
firstline1
titleMétodo PreInitialize
linenumberstrue
Configuration.Localization.Languages.Add(new LanguageInfo("en", "English", "famfamfam-flag-england", true));
Configuration.Localization.Languages.Add(new LanguageInfo("pt-BR", "Português", "famfamfam-flags br"));

Fontes de Localização

Os textos de localização podem ser armazenados em diferentes fontes. Você pode usar mais de uma fonte na mesma aplicação (Se você tiver mais de um módulo, cada módulo pode definir uma fonte de localização separada, ou um módulo pode definir várias fontes). A interface ILocalizationSource deve ser implementada por uma fonte de localização. Em seguida, ela é registrada na configuração de localização do TNF.

Cada fonte de localização deve ter um nome exclusivo.

Existem alguns tipos de fontes de localização predefinidos, que o TNF traz suporte nativo.

O .NET Core ainda mantem suporte a Globalização e Localização default do framework.

Arquivos XML

Os textos de localização podem ser armazenados em arquivos XML:

Bloco de código
languagec#
firstline1
titleSimpleTaskSystem.xml
linenumberstrue
<?xml version="1.0" encoding="utf-8" ?>
<localizationDictionary culture="en">
  <texts>
    <text name="TaskSystem" value="Task System" />
    <text name="TaskList" value="Task List" />
    <text name="NewTask" value="New Task" />
    <text name="Xtasks" value="{0} tasks" />
    <text name="CompletedTasks" value="Completed tasks" />
    <text name="EmailWelcomeMessage">Hi,
Welcome to Simple Task System! This is a sample
email content.</text>
  </texts>
</localizationDictionary>

Para distinção de cada arquivo e sua linguagem são usadas convenções. Seguindo o nosso exemplo acima onde temos duas linguagens (Inglês como padrão e português) teríamos dois arquivos xml:

SimpleTaskSystem.xml

SimpleTaskSystem-pt-BR.xml

Quando um texto é solicitado, o TNF obtém o texto do arquivo XML do idioma atual (usando Thread.CurrentThread.CurrentUICulture). Se ele não existe no idioma atual, obtém o texto do arquivo XML do idioma padrão.

Registrando Fontes de Localização XML

Os arquivos XML podem ser armazenados em seu File System ou podem ser incorporados para o Assembly. Para XMLs armazenados no File System, podemos registrar uma fonte de localização XML como mostrado abaixo (método PreInitialize de nosso modulo):

Bloco de código
languagec#
firstline1
titleRegistrando uma fonte de localização
linenumberstrue
Configuration.Localization.Sources.Add(
    new DictionaryBasedLocalizationSource(
        "SimpleTaskSystem",
        new XmlFileLocalizationDictionaryProvider(
            HttpContext.Current.Server.MapPath("~/Localization/SimpleTaskSystem")
            )
        )
    );

Para arquivos XML incorporados ao nosso assembly, devemos marcar todos os arquivos XMLs de localização como embedded resources (Selecionar arquivos XMLs, abrir a janela de propriedades (F4) e alterar o seu Build Action para Embedded resource). Em seguida, podemos registrar a fonte de localização como mostrado abaixo:

Bloco de código
languagec#
firstline1
titleRegistrando um embedded resource
linenumberstrue
Configuration.Localization.Sources.Add(
    new DictionaryBasedLocalizationSource(
        "SimpleTaskSystem",
        new XmlEmbeddedFileLocalizationDictionaryProvider(
            Assembly.GetExecutingAssembly(),
            "MyCompany.MyProject.Localization.Sources"
            )
        )
    );

Arquivos JSON

Os arquivos JSON podem ser usados para armazenar textos para uma fonte de localização. Um exemplo de arquivo de localização do JSON é mostrado abaixo:

Bloco de código
languagec#
firstline1
titleRegistrando um fonte de localização JSON
linenumberstrue
{
  "culture": "en",
  "texts": {
    "TaskSystem": "Task system",
    "Xtasks": "{0} tasks"
  }
}


Para distinção de cada arquivo e sua linguagem são usadas convenções. Seguindo o nosso exemplo acima onde temos duas linguagens (Inglês como padrão e português) teríamos dois arquivos json:

MySourceName.json

MySourceName-pt-BR.json

Registrando Fontes de Localização JSON

Os arquivos JSON podem ser armazenados em seu File System ou podem ser incorporados para o Assembly. Para JSONs armazenados no File System, podemos registrar uma fonte de localização JSON como mostrado abaixo (método PreInitialize de nosso modulo):

Bloco de código
languagec#
firstline1
titleConfigurando uma fonte de localização JSON
linenumberstrue
Configuration.Localization.Sources.Add(
    new DictionaryBasedLocalizationSource(
        "MySourceName",
        new JsonFileLocalizationDictionaryProvider(
            HttpContext.Current.Server.MapPath("~/Localization/MySourceName")
            )
        )
    );

Para arquivos JSON incorporados ao nosso assembly, devemos marcar todos os arquivos JSONs de localização como embedded resources (Selecionar arquivos JSON, abrir a janela de propriedades (F4) e alterar o seu Build Action para Embedded resource). Em seguida, podemos registrar a fonte de localização como mostrado abaixo:

Bloco de código
languagec#
firstline1
titleRegistrando uma fonte de localização JSON
linenumberstrue
Configuration.Localization.Sources.Add(
    new DictionaryBasedLocalizationSource(
        "MySourceName",
        new JsonEmbeddedFileLocalizationDictionaryProvider(
            Assembly.GetExecutingAssembly(),
            "MyCompany.MyProject.Localization.Sources"
            )
        )
    );

SQL Server

Para utilizar a estrutura do TNF para localização em banco de dados você irá precisar criar em seu banco duas tabelas TnfLanguages e TnfLanguageTexts.

A tabela TnfLanguages representa os idiomas suportados e TnfLanguageTexts as suas traduções:

Para criação do estrutura você deverá executar o seguinte script: Localization-Script.sql

Agora para criar suporte a uma nova linguagem você pode inserir via SQL:

Bloco de código
languagesql
firstline1
titleInsertLanguage.sql
linenumberstrue
INSERT INTO [dbo].[TnfLanguages] ([TenantId],[IsDeleted],[Name],[DisplayName],[CreationTime])
VALUES (NULL,0,'pt-BR','Português',GETDATE())

Note que a tabela contém o campo TenantId. Preencha esta informação caso você esteja trabalhando com Multi-tenancy.

Para incluir uma nova chave de tradução utilize o SQL:

Bloco de código
languagesql
firstline1
titleInsertLocalizationKey.sql
linenumberstrue
INSERT INTO [dbo].[TnfLanguageTexts] ([TenantId],[LanguageName],[Source],[Key],[Value],[CreationTime])
VALUES (NULL,'pt-BR','ArchitectureApp','President_Title','Página Inicial',GETDATE())

Note que a tabela contém o campo TenantId. Preencha esta informação caso você esteja trabalhando com Multi-tenancy.