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.
link:../../../src/org/j6toj8/localization/resourcebundle/ResourceBundle_Complete.java[role=include]link:../../../resources/Text.properties[role=include]
link:../../../resources/Text_pt.properties[role=include]
link:../../../resources/Text_pt_BR.properties[role=include]
link:../../../resources/Text_es.properties[role=include]
link:../../../resources/Text_es_ES.properties[role=include]
-- 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-
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→ Localept_BR -
Text_pt.properties→ Localept -
Text_es_ES.properties→ Localees_ES -
Text_es.properties→ Localees
-
-
O arquivo
.propertiespode ser expresso com 3 separadores diferentes:=(igual),:(dois pontos) ou um espaço em branco.../../../resources/Text.propertieslink:../../../resources/Text.properties[role=include]
O mais comum é utilizar o
=para separar as propriedades, mas as 3 funcionam da mesma forma. -
Em arquivos
.properties, linhas que começam com#ou!são comentários.../../../resources/Text_pt_BR.propertieslink:../../../resources/Text_pt_BR.properties[role=include]
../../../resources/Text_es_ES.propertieslink:../../../resources/Text_es_ES.properties[role=include]
-
Em arquivos
.properties, apenas espaços no final da linha são considerados.../../../resources/Text_pt.propertieslink:../../../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}. -
Em arquivos
.properties, se você terminar a linha com uma contrabarra, pode quebrar a linha.../../../resources/Text_es.propertieslink:../../../resources/Text_es.properties[role=include]
Neste exemplo, seria o mesmo que escrever em uma única linha:
keyboard=teclado. -
Em arquivos
.properties, você também pode usar os caracteres java como\te\n.../../../resources/Text_es_ES.propertieslink:../../../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 palavravasofoi impressa no console com uma tabulação à esquerda. -
Você pode recuperar todas as chaves e valores do resource bundle programaticamente.
src/org/j6toj8/localization/resourcebundle/ResourceBundle_KeysProgrammatically.javalink:../../../src/org/j6toj8/localization/resourcebundle/ResourceBundle_KeysProgrammatically.java[role=include]
Saída no consoletripod - tripod keyboard - keyboard glass - glass paper - papel phone - phone rubber - rubber pen - caneta sticker - sticker
-
O resource bundle também pode ser uma classe Java.
resource/Text_fr_CA.javalink:../../../resources/Text_fr_CA.java[role=include]
src/org/j6toj8/localization/resourcebundle/ResourceBundle_JavaBundle.javalink:../../../src/org/j6toj8/localization/resourcebundle/ResourceBundle_JavaBundle.java[role=include]
Saída no consoleverre -
Ao utilizar classes Java, uma vantagem é poder armazenar valores que não sejam apenas
String.resource/Text_fr_FR.javalink:../../../resources/Text_fr_FR.java[role=include]
-
A nomenclatura do arquivo é a mesma para classes Java e arquivos
.properties, mudando apenas a extensão.Veja que os arquivos
.propertiesse chamamText_xx_XX.properties, e os arquivos.javase chamamText_xx_XX.java. Programaticamente, ambos são utilizados da mesma forma. -
Se houver um arquivo
.propertiese uma classe Java para o mesmoLocale, a classe Java é utilizada.resource/Text_fr_CA.javalink:../../../resources/Text_fr_CA.java[role=include]
resource/Text_fr_CA.propertieslink:../../../resources/Text_fr_CA.properties[role=include]
src/org/j6toj8/localization/resourcebundle/ResourceBundle_JavaClassTakesPrecedence.javalink:../../../src/org/j6toj8/localization/resourcebundle/ResourceBundle_JavaClassTakesPrecedence.java[role=include]
Saída no consolestylo 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.propertiespara o mesmoLocale. -
Ao buscar por um resource bundle, o Java tenta encontrar um arquivo com o
Localeexato. Se não encontrar, busca na seguinte ordem:-
Um arquivo do mesmo idioma, mas sem o país;
-
Um arquivo do
Localepadrão; -
Um arquivo do
Localepadrão, mas sem o país; -
Um arquivo sem
Locale, que é o resource bundle padrão; -
Lança
MissingResourceExceptioncaso não encontre.Por exemplo, ao executar a aplicação com o Locale padrão
en_US, e solicitar um Localept_BR, a ordem de busca do resource bundle seria a seguinte:-
Text_pt_BR→ Locale exato -
Text_pt→ Locale solicitado, sem o país -
Text_en_US→ Locale padrão -
Text_en→ Locale padrão, sem o país -
Text→ Resource Bundle padrãosrc/org/j6toj8/localization/resourcebundle/ResourceBundle_NotExactLocale.javalink:../../../src/org/j6toj8/localization/resourcebundle/ResourceBundle_NotExactLocale.java[role=include]
Saída no consolept_BR it
Veja que o
Localepadrão épt_BR. Por isso ele foi utilizado ao solicitar um resource bundle parazh_CN, pois não existe um bundle para esseLocale.Por outro lado, ao solicitar um resource bundle para o
Localeit_CH, ele encontrou o mais próximo, que seria oLocaleit, mas sem um país específico.
-
-
-
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.javalink:../../../src/org/j6toj8/localization/resourcebundle/ResourceBundle_Inheritance.java[role=include]
../../../resources/Text.propertieslink:../../../resources/Text.properties[role=include]
../../../resources/Text_pt.propertieslink:../../../resources/Text_pt.properties[role=include]
../../../resources/Text_pt_BR.propertieslink:../../../resources/Text_pt_BR.properties[role=include]
Saída no consoleLocale: pt_BR caneta papel keyboard
Veja que nesse exemplo foi localizado um resource bundle com o
Localeexatopt_BR. Porém, nem todas as chaves foram encontradas nesse arquivo:-
canetafoi localizado no arquivoText_pt_BR.properties -
papelfoi localizado no arquivoText_pt.properties -
keyboardfoi localizado no arquivoText.properties
-
-
Using a Resource Bundle
Boyarsky, Jeanne; Selikoff, Scott. OCP: Oracle Certified Professional Java SE 8 Programmer II Study Guide (p. 258). Wiley. Edição do Kindle.
-
Class ResourceBundle. Java Documentation.
-
About the ResourceBundle Class. Java Documentation.