i18n: Internacionalização em Java

Internacionalização (Internationalization) é o processo de projetar aplicações que podem se adaptar a diferentes localidades geográficas sem a necessidade de alterar o código. O termo é abreviado para i18n devido às 18 letras entre o primeiro “i” e o último “n” do termo original em inglês “internationalization”.

As características fundamentais de uma aplicação que se adapta a diferentes idiomas sem alteração em código são as seguintes:

  • Independente da localização, a aplicação será executada da mesma forma.
  • Elementos textuais, como mensagens de status e labels de componentes GUI, não são colocados no meio do código (hardcoded). Os elementos textuais são armazenados fora do código fonte e recuperados dinamicamente.
  • Adicionar novos idiomas não requer uma nova compilação do código fonte.
  • Datas e formatos monetários aparecem de acordo com a localidade do usuário.

Localização (Localization) é o processo que adapta o software a uma região específica ou idioma, considerando-se componentes e tradução de textos. Além de alterar números, datas e moedas, outros tipos de dados devem ser levados em consideração, como sons e imagens, que podem requerer alterações se forem culturalmente sensíveis.

Quanto melhor a internacionalização de uma aplicação, mais fácil é a sua localização para um idioma particular.

Um exemplo simples de internacionalização

Suponha que você tenha o seguinte programa.

public class NotI18N {

    static public void main(String[] args) {

        System.out.println("Hello.");
        System.out.println("How are you?");
        System.out.println("Goodbye.");
    }
}

É preciso que ele seja disponibilizado em diversos países.  Ter várias versões do programa, em termos de manutenção, é uma péssima ideia. Este é um exemplo claro de que o programa precisa de internacionalização.

A seguinte versão mostra o programa em uma versão internacionalizada.

import java.util.*;

public class I18N {

    static public void main(String[] args) {

        String language;
        String country;

        if (args.length != 2) {
            language = new String("en");
            country = new String("US");
        } else {
            language = new String(args[0]);
            country = new String(args[1]);
        }

        Locale currentLocale;
        ResourceBundle messages;

        currentLocale = new Locale(language, country);

        messages = ResourceBundle.getBundle("MessagesBundle", currentLocale);
        System.out.println(messages.getString("greetings"));
        System.out.println(messages.getString("inquiry"));
        System.out.println(messages.getString("farewell"));
    }
}

Para compilar e executar o programa internacionalizado é preciso ter os arquivos de propriedade que contém as mensagens a serem exibida, de acordo com a localização escolhida. Note que a localização padrão é en-US.

Abaixo segue o conteúdo dos arquivos de propriedade.

MessagesBundle.properties

greetings = Hello.
farewell = Goodbye.
inquiry = How are you?

MessagesBundle_en_US.properties

greetings = Hello.
farewell = Goodbye.
inquiry = How are you?

MessagesBundle_fr_FR.properties

greetings = Bonjour.
farewell = Au revoir.
inquiry = Comment allez-vous?

Agora o programa permite escolher, via linha de comando, o idioma a ser utilizado durante sua execução.  O seguinte comando inicia a aplicação utilizando o código de idioma fr (francês) e o código de país FR (França), então o programa irá utilizar as mensagens do arquivo MessagesBundle_fr_FR.properties.

java I18NSample fr FR

 

Referências 

The Java Tutorials, Internationalization. Disponível em: http://docs.oracle.com/javase/tutorial/i18n/. Acessado em 29 mai. 2013.

4 Replies to “i18n: Internacionalização em Java”

  1. Boa tarde Gabriel.
    No eclipse eu tive que importar a ResourceBundle e ficou assim o código

    import java.util.Locale;
    import java.util.ResourceBundle;

    public class I18N {

    static public void main(String[] args) {

    String language;
    String country;

    if (args.length != 2) {
    language = new String(“pt”);
    country = new String(“BR”);
    } else {
    language = new String(args[0]);
    country = new String(args[1]);
    }

    Locale currentLocale;
    ResourceBundle messages;

    currentLocale = new Locale(language, country);

    messages = ResourceBundle.getBundle(“MessagesBundle”, currentLocale);
    System.out.println(messages.getString(“greetings”));
    System.out.println(messages.getString(“inquiry”));
    System.out.println(messages.getString(“farewell”));
    }
    }

    1. Olá, Adriano!

      Realmente a melhor opção para import é como você fez, o import específico. Embora o import com asterisco não influencie na performance da aplicação, o import específico é uma boa prática que melhora a legibilidade do código.

      Abraço!

Leave a Reply

Your email address will not be published. Required fields are marked *