Skip to content

Latest commit

 

History

History
307 lines (273 loc) · 9 KB

File metadata and controls

307 lines (273 loc) · 9 KB

Pacote de Recursos (Resource Bundle)

Objetivo
Build a resource bundle for a locale and call a resource bundle from an application.
-
Construa um resource bundle (conjunto de recursos) para um Locale e invoque um resource bundle a partir de uma aplicação.

É esperado que o candidato saiba compreender e analisar o uso de resource bundles e sua relação com a classe Locale.

Ao codificar uma aplicação com internacionalização é comum o uso de resource bundles, ou "conjunto de recursos" em português. São arquivos, geralmente .properties ou classes Java, que armazenam Strings. Cada arquivo contém Strings em idiomas, ou Locales, diferentes.

Antes de continuar, entenda a execução do método main no exemplo a seguir e o que é apresentado no console após sua execução.

src/org/j6toj8/localization/resourcebundle/ResourceBundle_Complete.java
link:../../../src/org/j6toj8/localization/resourcebundle/ResourceBundle_Complete.java[role=include]
../../../resources/Text.properties
link:../../../resources/Text.properties[role=include]
../../../resources/Text_pt.properties
link:../../../resources/Text_pt.properties[role=include]
../../../resources/Text_pt_BR.properties
link:../../../resources/Text_pt_BR.properties[role=include]
../../../resources/Text_es.properties
link:../../../resources/Text_es.properties[role=include]
../../../resources/Text_es_ES.properties
link:../../../resources/Text_es_ES.properties[role=include]
Saída no console
 -- Locale padrão (en_US) --
tripod - tripod
keyboard - keyboard
glass - glass
paper - paper
phone - phone
rubber - rubber
sticker - sticker
pen - pen

 -- Locale es_ES --
tripod - tripod
keyboard - teclado
glass - 	vaso
paper - paper
phone - phone
rubber - rubber
sticker - sticker
pen - pen

 -- Locale pt_BR --
tripod - tripod
keyboard - keyboard
glass - glass
paper - papel
phone - phone
rubber - rubber
pen - caneta
sticker - sticker
  1. O nome do Locale é o sufixo do nome do arquivo, e o resource bundle padrão não tem sufixo. Exemplos:

    • Text.properties → Locale padrão

    • Text_pt_BR.properties → Locale pt_BR

    • Text_pt.properties → Locale pt

    • Text_es_ES.properties → Locale es_ES

    • Text_es.properties → Locale es

  2. O arquivo .properties pode ser expresso com 3 separadores diferentes: = (igual), : (dois pontos) ou um espaço em branco.

    ../../../resources/Text.properties
    link:../../../resources/Text.properties[role=include]

    O mais comum é utilizar o = para separar as propriedades, mas as 3 funcionam da mesma forma.

  3. Em arquivos .properties, linhas que começam com # ou ! são comentários.

    ../../../resources/Text_pt_BR.properties
    link:../../../resources/Text_pt_BR.properties[role=include]
    ../../../resources/Text_es_ES.properties
    link:../../../resources/Text_es_ES.properties[role=include]
  4. Em arquivos .properties, apenas espaços no final da linha são considerados.

    ../../../resources/Text_pt.properties
    link:../../../resources/Text_pt.properties[role=include]

    Neste exemplo, não é possível ver, mas existem 3 espaços no final da linha. O resultado é o mesmo que escrever paper=papel{sp}{sp}{sp}.

  5. Em arquivos .properties, se você terminar a linha com uma contrabarra, pode quebrar a linha.

    ../../../resources/Text_es.properties
    link:../../../resources/Text_es.properties[role=include]

    Neste exemplo, seria o mesmo que escrever em uma única linha: keyboard=teclado.

  6. Em arquivos .properties, você também pode usar os caracteres java como \t e \n.

    ../../../resources/Text_es_ES.properties
    link:../../../resources/Text_es_ES.properties[role=include]

    Neste exemplo, existe uma tabulação antes da palavra vaso. Você pode perceber no primeiro exemplo deste capítulo que a palavra vaso foi impressa no console com uma tabulação à esquerda.

  7. Você pode recuperar todas as chaves e valores do resource bundle programaticamente.

    src/org/j6toj8/localization/resourcebundle/ResourceBundle_KeysProgrammatically.java
    link:../../../src/org/j6toj8/localization/resourcebundle/ResourceBundle_KeysProgrammatically.java[role=include]
    Saída no console
    tripod - tripod
    keyboard - keyboard
    glass - glass
    paper - papel
    phone - phone
    rubber - rubber
    pen - caneta
    sticker - sticker
  8. O resource bundle também pode ser uma classe Java.

    resource/Text_fr_CA.java
    link:../../../resources/Text_fr_CA.java[role=include]
    src/org/j6toj8/localization/resourcebundle/ResourceBundle_JavaBundle.java
    link:../../../src/org/j6toj8/localization/resourcebundle/ResourceBundle_JavaBundle.java[role=include]
    Saída no console
    verre
  9. Ao utilizar classes Java, uma vantagem é poder armazenar valores que não sejam apenas String.

    resource/Text_fr_FR.java
    link:../../../resources/Text_fr_FR.java[role=include]
  10. A nomenclatura do arquivo é a mesma para classes Java e arquivos .properties, mudando apenas a extensão.

    Veja que os arquivos .properties se chamam Text_xx_XX.properties, e os arquivos .java se chamam Text_xx_XX.java. Programaticamente, ambos são utilizados da mesma forma.

  11. Se houver um arquivo .properties e uma classe Java para o mesmo Locale, a classe Java é utilizada.

    resource/Text_fr_CA.java
    link:../../../resources/Text_fr_CA.java[role=include]
    resource/Text_fr_CA.properties
    link:../../../resources/Text_fr_CA.properties[role=include]
    src/org/j6toj8/localization/resourcebundle/ResourceBundle_JavaClassTakesPrecedence.java
    link:../../../src/org/j6toj8/localization/resourcebundle/ResourceBundle_JavaClassTakesPrecedence.java[role=include]
    Saída no console
    stylo
    verre
    clavier

    Veja que os valores apresentados no console são aqueles definidos no arquivo Text_fr_CA.java, mostrando que a classe Java tem precedência sobre um arquivo .properties para o mesmo Locale.

  12. Ao buscar por um resource bundle, o Java tenta encontrar um arquivo com o Locale exato. Se não encontrar, busca na seguinte ordem:

    1. Um arquivo do mesmo idioma, mas sem o país;

    2. Um arquivo do Locale padrão;

    3. Um arquivo do Locale padrão, mas sem o país;

    4. Um arquivo sem Locale, que é o resource bundle padrão;

    5. Lança MissingResourceException caso não encontre.

      Por exemplo, ao executar a aplicação com o Locale padrão en_US, e solicitar um Locale pt_BR, a ordem de busca do resource bundle seria a seguinte:

      1. Text_pt_BR → Locale exato

      2. Text_pt → Locale solicitado, sem o país

      3. Text_en_US → Locale padrão

      4. Text_en → Locale padrão, sem o país

      5. TextResource Bundle padrão

        src/org/j6toj8/localization/resourcebundle/ResourceBundle_NotExactLocale.java
        link:../../../src/org/j6toj8/localization/resourcebundle/ResourceBundle_NotExactLocale.java[role=include]
        Saída no console
        pt_BR
        it

        Veja que o Locale padrão é pt_BR. Por isso ele foi utilizado ao solicitar um resource bundle para zh_CN, pois não existe um bundle para esse Locale.

        Por outro lado, ao solicitar um resource bundle para o Locale it_CH, ele encontrou o mais próximo, que seria o Locale it, mas sem um país específico.

  13. Os arquivos mais específicos herdam as chaves e valores de arquivos mais genéricos, caso eles não as tenham.

    src/org/j6toj8/localization/resourcebundle/ResourceBundle_Inheritance.java
    link:../../../src/org/j6toj8/localization/resourcebundle/ResourceBundle_Inheritance.java[role=include]
    ../../../resources/Text.properties
    link:../../../resources/Text.properties[role=include]
    ../../../resources/Text_pt.properties
    link:../../../resources/Text_pt.properties[role=include]
    ../../../resources/Text_pt_BR.properties
    link:../../../resources/Text_pt_BR.properties[role=include]
    Saída no console
    Locale: pt_BR
    caneta
    papel
    keyboard

    Veja que nesse exemplo foi localizado um resource bundle com o Locale exato pt_BR. Porém, nem todas as chaves foram encontradas nesse arquivo:

    • caneta foi localizado no arquivo Text_pt_BR.properties

    • papel foi localizado no arquivo Text_pt.properties

    • keyboard foi localizado no arquivo Text.properties

Referências