Como internacionalizar um aplicativo da Web Java?

Aprendi com o Google que a internacionalização é o processo pelo qual posso fazer meu aplicativo da web para usar todos os idiomas. Eu quero entender Unicode para o processo de internacionalização, então eu aprendi sobre o Unicode aqui e ali .

Eu sou capaz de entender sobre Unicode que como um charset definido em codificado para bytes e novamente bytes decodificados para charset. Mas eu não sei como avançar mais. Eu quero aprender como comparar strings e preciso saber como implementar a internacionalização em meu aplicativo da web. Alguma sugestão, por favor? Por favor me guie.

Meu objective:

Meu objective principal é desenvolver um aplicativo da Web para tradução (inglês para árabe e vice-versa). Eu quero seguir a internacionalização. Desejo executar meu aplicativo da web para tradução em todos os três navegadores, ou seja, FF, Chrome, IE. Como faço para conseguir isso?

No caso de um aplicativo da web JSP / Servlet básico, a abordagem básica seria usar o taglib JSTL fmt em combinação com pacotes de resources . Os pacotes de resources contêm pares de valores-chave em que a chave é uma constante que é a mesma para todos os idiomas e o valor é diferente por idioma. Pacotes de resources geralmente são arquivos de propriedades que são carregados pela API ResourceBundle . Isso pode, no entanto, ser personalizado para que você possa carregar os pares de valores-chave, por exemplo, de um database.

Veja um exemplo de como internacionalizar o formulário de login do seu aplicativo da web com pacotes de resources baseados em arquivos de propriedades.


  1. Crie os seguintes arquivos e coloque-os em algum pacote, por exemplo, com.example.i18n (no caso do Maven, coloque-os na estrutura de pacotes dentro de src/main/resources ).

    text.properties (contém pares de valores-chave no idioma padrão, geralmente em inglês)

     login.label.username = Nome de usuário
     login.label.password = Senha
     login.button.submit = Iniciar session
    

    text_nl.properties (contém pares de valor-chave holandês ( nl ))

     login.label.username = Gebruikersnaam
     login.label.password = Wachtwoord
     login.button.submit = Inloggen
    

    text_es.properties (contém pares de valores-chave em espanhol)

     login.label.username = Nombre de usuario
     login.label.password = Contraseña
     login.button.submit = Acceder
    

    O nome do arquivo do pacote de resources deve aderir ao seguinte padrão: name_ll_CC.properties . A parte _ll deve ser o código de idioma ISO 693-1 em minúsculas. É opcional e necessário apenas quando a parte _CC estiver presente. A parte _CC deve ser o código de país ISO 3166-1 Alpha-2 em maiúsculas. É opcional e muitas vezes usado apenas para distinguir entre dialetos de idiomas específicos do país, como o inglês americano ( _en_US ) e o inglês britânico ( _en_GB ).


  2. Se ainda não tiver feito, instale o JSTL. Se você estiver executando em um contêiner Servlet 2.5 ou mais recente (Tomcat 6.0 e assim por diante) e seu web.xml for declarado em conformidade com a especificação do Servlet 2.5, basta colocar jstl-1.2.jar na pasta webapp /WEB-INF/lib .


  3. Crie o seguinte arquivo JSP de exemplo e coloque-o na pasta de conteúdo da web.

    login.jsp

     <%@ page pageEncoding="UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>       JSP/JSTL i18n demo   


    O gerencia o idioma atual. Se o idioma foi fornecido como parâmetro de solicitação (por menu suspenso), ele será definido. Senão, se a linguagem já foi definida anteriormente na session, então, escolha-a. Além disso, use o código do idioma fornecido pelo usuário no header da solicitação.

    O define o do idioma para o pacote de resources. É importante que esta linha esteja antes do .

    O inicializa o pacote de resources pelo nome base (ou seja, o nome completo do pacote qualificado até o nome exclusivo sem o especificador _ll_CC ).

    A recupera o valor da mensagem pela chave de pacote configurável especificada.

    O informa os searchbots em qual idioma a página está, de forma que ela não seja marcada como conteúdo duplicado (portanto, bom para SEO).

    O menu suspenso de idiomas será enviado imediatamente por JavaScript quando outro idioma for escolhido e a página será atualizada com o idioma recém-escolhido.


No entanto, você precisa ter em mente que os arquivos de propriedades são, por padrão, lidos usando a codificação de caracteres ISO-8859-1. Você precisaria escaping deles por escapes unicode. Isso pode ser feito usando a ferramenta native2ascii.exe fornecida pelo JDK. Veja também esta seção do artigo para mais detalhes.

Uma alternativa teórica seria fornecer um pacote com um Control personalizado para carregar esses arquivos como UTF-8, mas isso infelizmente não é suportado pelo taglib básico do JSTL fmt . Você precisaria gerenciar tudo sozinho com a ajuda de um Filter . Existem frameworks (MVC) que podem lidar com isso de uma maneira mais transparente, como o JSF, veja também este artigo .

Além do que o BalusC disse, você tem que tomar cuidado com a direcionalidade (já que o inglês é escrito da esquerda para a direita e o árabe é o contrário). A maneira mais fácil seria adicionar o atributo dir ao elemento html de sua página da Web JSP e externalizá-lo, portanto, o valor vem do arquivo de propriedades (assim como com outros elementos ou atributos):

  ...  

Além disso, há poucos problemas com o estilo desse aplicativo – você deve, pelo menos, evitar o posicionamento absoluto. Se você não pode evitar que, por algum motivo, você pode usar diferentes folhas de estilo por (cada?) Idioma ou fazer algo que é verboten , que é usar tabelas para gerenciar o layout. Se você quiser usar elementos div, sugiro usar o posicionamento relativo com atributos de estilo “simétricos” à esquerda e à direita (ambos com o mesmo valor), pois é isso que faz a direcionalidade de chaveamento funcionar.

Você pode encontrar mais sobre sites bidirecionais aqui .

Com base neste tutorial , estou usando o seguinte no GAE – Google App Engine:

Um arquivo jsp da seguinte forma:

 <%@ page import="java.io.* %> <% String lang = "fr"; //Assign the correct language either by page or user-selected or browser language etc. ResourceBundle RB = ResourceBundle.getBundle("app", new Locale(lang)); %>  <%@ page contentType="text/html;charset=UTF-8" language="java"%>    

<%= RB.getString("greeting") %>

E adicionando os arquivos chamados: app.properties (padrão) e app_fr.properties (e assim por diante para cada idioma). Cada um desses arquivos deve conter as seqüências necessárias: key: value_in_language, por exemplo, app_fr.properties contém:

 greeting=Bonjour! 

app.properties contém:

 greeting=Hello! 

Isso é tudo