Criação de Serviços com Conteúdos em Múltiplos Idiomas

Objetivos

  • Apresentação da funcionalidade de publicação de conteúdo em múltiplos idiomas
  • Desenvolvimento de serviços utilizando esta funcionalidade
  • Apresentar o serviço “Selecionador de Localização”

Referências complementares

  • Content

Introdução

O Lumis Portal provê uma infraestrutura para publicação de conteúdos de serviços do tipo content em múltiplos idiomas. Com isso, é possível que um mesmo site possua versões em idiomas diferentes sem que haja necessidade de recriar toda a sua estrutura para cada idioma.

Publicação

Todo conteúdo com suporte multi-idioma de serviços no Lumis Portal está associado a um idioma. Caso o idioma não seja especificado no cadastro, o conteúdo será associado ao idioma atual da sessão do usuário. Por exemplo, se o publicador estiver navegando no portal em inglês e cadastrar um conteúdo com suporte multi-idioma e não especificar o idioma, o idioma associado ao conteúdo será em inglês.

Além disso, o publicador pode especificar um conteúdo em um idioma como default. Caso o publicador especifique um conteúdo em um idioma como default, esse conteúdo será apresentado caso não exista conteúdo equivalente no idioma da sessão do usuário.

Caso o publicador não especifique um conteúdo em um idioma como default e não exista conteúdo equivalente no idioma da sessão do usuário, nenhum conteúdo será exibido.

Front-end padrão de administração de conteúdo múltiplo-idioma

Na administração de um serviço multilíngue é apresentada uma coluna Idioma, com todas as opções de idiomas disponíveis para tradução. Para cada conteúdo, é sublinhada a bandeira do idioma correspondente. Por exemplo, se um conteúdo foi cadastrado em inglês, será sublinhada a bandeira dos Estados Unidos, se o conteúdo foi cadastrado em espanhol, será sublinhada a bandeira da Espanha.

Segue abaixo um exemplo de exibição da administração do serviço padrão de notícias, apresentando o campo idioma:

imagem1.jpg

Caso o usuário clique em uma bandeira, poderá traduzir o conteúdo para o idioma correspondente. Por exemplo, se o usuário selecionar a bandeira inglesa, será aberta uma janela para preencher o conteúdo em inglês.

Outra forma de traduzir o conteúdo é através do botão de editar. Ao selecionar um conteúdo e clicar no botão de editar será aberta uma janela com os campos do conteúdo preenchido. O usuário então deve selecionar a aba Idioma conforme figura abaixo:

imagem2.jpg

Para traduzir para outro idioma, o usuário deve clicar na bandeira correspondente ao idioma para qual o conteúdo será traduzido. Ao clicar em uma bandeira, será aberta uma janela para adicionar conteúdo, com o idioma correspondente já selecionado na aba Idioma.

Estrutura de dados

Para possibilitar a publicação de conteúdos em múltiplos idiomas, o Lumis Portal possui um conjunto de classes criadas no pacote lumis.content.core.

Um objeto do tipo Content representa um conteúdo e está associado a uma instância de serviço. Cada tradução do conteúdo é especificada em um objeto do tipo ContentLocale. Um objeto do tipo ContentLocale possui múltiplas versões do tipo ContentVersion, sendo que apenas uma está ativa.

Configuração de um source de conteúdo com suporte a múltiplos idiomas

Para que um source de um serviço do tipo content possua suporte a múltiplos idiomas, o source deve ser do tipo contentTable e deve-se incluir dentro da tag metaData, a tag <multiLanguage /> conforme exemplo abaixo:


<source id="especialidade" type="contentTable">
  <table>especialidade</table>
  <fields>
    <field id="IdEspecialidade" dataType="guid" isPrimaryKey="true" display="false" />
    <field id="Nome" name="Nome" dataType="string" isPrimaryName="true"/>
  </fields>
  <metaData>
    <multiLanguage/>
  </metaData>
</source>
  

Referência a conteúdos multi-idioma

Caso seja necessário que um campo de um source referencie um conteúdo com suporte a multi-idioma, deve-se fazer a referência pelo campo contentId do conteúdo e não pela sua chave primária. Isso deve ser feito para que, quando for alterado o idioma da sessão do usuário, o conteúdo relacionado seja traduzido conforme o idioma corrente.

Strings: como criar e usar strings para internacionalizar um serviço

É possível internacionalizar descrições de serviços, interfaces e campos, através de strings mapeadas e traduzidas em um arquivo no formato “strings” + “código_de_localização”.xml, onde o código de localização foi previamente cadastrado através do serviço Selecionador de Localização.

Caso a tradução desejada fosse português, o arquivo deveria se chamar strings.pt_br.xml. Caso a tradução desejada fosse inglês, o arquivo deveria se chamar strings.en_us.xml.

Como boa prática, os arquivos de mapeamento de strings devem estar localizados em um diretório strings, no diretório do serviço.

Segue abaixo um exemplo de como ficaria o arquivo servicedefinition.xml:


<?xml version="1.0" encoding="UTF-8"?>
<serviceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.lumis.com.br/lumisportal/xsd/servicedefinition.xsd">
  <service id="tese" name="STR_SERVICE_NAME" type="lum_content">
    <description>STR_SERVICE_DESCRIPTION</description>
    <workflow enabled="true"/>
  </service>
  <interfaces>
    <interface id="list" name="STR_INTERFACE_NAME" type="lum_contentList" />
  </interfaces>
</serviceDefinition>
  

E como ficaria o arquivo strings.pt_br.xml:


<?xml version="1.0" encoding="UTF-8"?>
<strings> 
   <string id="STR_SERVICE_NAME">Teses</string> 
   <string id="STR_SERVICE_DESCRIPTION">Serviço para gerenciamento de teses.</string> 
   <string id="STR_INTERFACE_NAME">Lista de teses</string> 
</strings>
  

Exemplo de serviço multi-idioma

Considere um serviço de cadastro de notícias categorizadas, onde tanto a notícia quanto a categoria são cadastradas em mais de um idioma. Desta forma, o arquivo servicedefinition.xml ficaria da seguinte forma:


<?xml version="1.0" encoding="UTF-8"?>
<serviceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.lumis.com.br/lumisportal/xsd/servicedefinition.xsd">
  <service id="newsCategorized” name="STR_SERVICE_NAME" type="lum_content">
    <description>STR_SERVICE_DESCRIPTION</description>
    <workflow enabled="true"/>
  </service>
  <interfaces>
     <interface id=”administrationNews” name=”STR_ADMINISTRATION_NEWS” type=”lum_contentAdministrationList” />
     <interface id="addNews" name="STR_ADD_NEWS" type="lum_contentAdministrationAddPropertyPage" />
     <interface id="editNews" name="STR_EDIT_NEWS" type="lum_contentAdministrationEditPropertyPage" />
     <interface id="listNews" name="STR_LIST_NEWS" type="lum_contentList" />
     <interface id=”administrationCategory” name=”STR_ADMINISTRATION_CATEGORY” type=”lum_contentAdministrationList” />
     <interface id="addCategory" name="STR_ADD_CATEGORY" type="lum_contentAdministrationAddPropertyPage" />
     <interface id="editCategory" name="STR_EDIT_CATEGORY" type="lum_contentAdministrationEditPropertyPage" /> 
  </interfaces>
</serviceDefinition>
  

A seção de sources do arquivo doudefinition.xml ficaria assim:


<sources>
   <source id="news" type="contentTable">
      <table>news</table>
      <fields>
         <field id="idNews" display="false" name="STR_ID" dataType="string" isPrimaryKey="true"/>
         <field id="title" name="STR_TITLE" dataType="string" isPrimaryName="true" isSearchable="true"/>
         <field id="introduction" name="STR_INTRODUCTION" dataType="text" isIntroduction="true" isSearchable="true" />
         <field id="content" name="STR_CONTENT" dataType="html" isSearchable="true"/>
         <field id="idCaterory" name="STR_CATEGORY" dataType="string" lookupRelationId="category" lookupFieldId="title" />
        </fields>
        <relations>
           <relation id="category">
              <relationField fieldId="idCaterory" foreignFieldId="contentId"/>
           </relation>          
        </relations>
        <metaData>
           <multiLanguage/>
        </metaData>
      </source>
      <source id="category" type="contentTable">
         <table>category</table>
            <fields>
               <field id="idCategory" display="false" name="STR_ID" isPrimaryKey="true"/>
               <field id="title" name="STR_TITLE" dataType="string" isPrimaryName="true" isSearchable="true"/>
           </fields>
      </source>
        <metaData>
          <multiLanguage/>
        </metaData>
      </source>
    </sources>
  

Vale considerar que a associação entre o source news e o source category é feito pelo contentId. Dessa forma, ao se traduzir o portal, tanto o conteúdo do source news como sua respectiva associação ao source category serão traduzidos conforme o idioma da sessão do usuário.

Serviço Selecionador de Localização

Para que o idioma de um portal desenvolvido no Lumis Portal seja alterado, o usuário final pode selecionar uma das localizações através do serviço Selecionador de Localização. Para isso, o serviço conta com uma interface chamada Selecionador de Localização, cuja visualização padrão é representada na figura abaixo:

imagem3.jpg

Além disso, o serviço conta com duas interfaces administrativas, chamadas de Administração e Administração de Expressões.

A interface Administração possibilita o cadastro de idiomas, informando o Código e o Nome do idioma. Para cadastrar um novo idioma, o administrador deve acessar a interface Administração, que apresentará todos os idiomas já cadastrados, conforme figura abaixo:

imagem4.jpg

Ao clicar em adicionar, será aberta a janela para preenchimento do Código e do Nome do idioma, conforme figura abaixo:

imagem5.jpg

A interface Administração de Expressões permite que o administrador cadastre expressões e suas respectivas traduções conforme o idioma.

Para toda ocorrência de uma expressão cadastrada nos nomes dos objetos da solução (canais, páginas, instâncias de serviços e interfaces), o portal realizará a tradução conforme o idioma da sessão do usuário.

Por exemplo, considere uma expressão cadastrada chamada “Administração de contatos” com tradução “Contact administration” no idioma “en_US”. Tal expressão pode ser utilizada no título de uma interface de um serviço customizado. Caso o idioma da sessão do usuário seja Inglês, o título das instâncias de interfaces com a expressão “Administração de contatos” será traduzido para “Contact administration”.

Dessa forma, com esse artigo, apresentou-se a funcionalidade de publicação multi-idioma de conteúdos, assim como exemplos de como utilizá-la, de forma simples e intuitiva, possibilitando a criação de portais em mais de um idioma, sem a necessidade de recriar o site inteiro para cada idioma desejado.

Autor: Sergio Fernandes