Sprievodca ResourceBundle

1. Prehľad

Mnoho vývojárov softvéru má počas svojej profesionálnej kariéry príležitosť vyvinúť viacjazyčné systémy alebo aplikácie. Zvyčajne sú určené pre koncových používateľov z rôznych regiónov alebo jazykových oblastí.

Udržiavať a rozširovať tieto aplikácie je vždy náročné. Schopnosť pracovať súčasne s rôznymi špecifickými lokalizačnými údajmi je zvyčajne rozhodujúca. Úprava údajov aplikácie by mala byť čo najjednoduchšia bez potreby opätovnej kompilácie. Preto sa všeobecne vyhýbame napevno označeným menovkám alebo menám.

Našťastie môžeme bankovať v prostredí Java, ktoré nám poskytuje túto triedu, ktorá nám pomáha vyriešiť všetky vyššie uvedené problémy.

Jednoducho povedané ResourceBundle umožňuje našej aplikácii načítať údaje z rôznych súborov obsahujúcich údaje špecifické pre miestne nastavenie.

1.1. Zdrojové zväzky

Prvá vec, ktorú by sme mali vedieť, je, že sú v nej všetky súbory jeden zväzok zdrojov musí byť v rovnakom balíku / adresári a musí mať spoločný základný názov. Môžu mať prípony špecifické pre miestne nastavenie označujúce jazyk, krajinu alebo platformu oddelené symbolom podčiarknutia.

Je dôležité, aby sme mohli pridať kód krajiny, ak už existuje, alebo platformu, ak existujú kódy jazyka a krajiny.

Pozrime sa na príklady názvov súborov:

  • ExampleResource
  • ExampleResource_en
  • ExampleResource_en_US
  • ExampleResource_en_US_UNIX

Predvolený súbor pre každý zväzok údajov je vždy jeden bez akýchkoľvek prípon - ExampleResource. Pretože existujú dve podtriedy ResourceBundle: PropertyResourceBundle a ListResourceBundle, môžeme zameniteľne uchovávať údaje v súboroch vlastností aj v súboroch Java.

Každý súbor musí mať názov špecifický pre miestne nastavenie a správna prípona súboru, napríklad, ExampleResource_en_US.properties alebo Example_en.java.

1.2. Súbory nehnuteľností - PropertyResourceBundle

Súbory nehnuteľností sú reprezentované symbolom PropertyResourceBundle. Ukladajú údaje vo forme dvojíc kľúč - hodnota, ktoré rozlišujú veľké a malé písmená.

Poďme analyzovať ukážkový súbor vlastností:

# Tlačidlá continueButton pokračovať cancelButton = zrušiť! Štítky ahojLabel: ahoj 

Ako vidíme, existujú tri rôzne štýly definovania párov kľúč - hodnota.

Všetky sú rovnocenné, ale ten prvý je asi najpopulárnejší medzi Java programátorov. Je potrebné vedieť, že komentáre môžeme vkladať aj do súborov nehnuteľností. Komentáre vždy začínajú # alebo !.

1.3. Súbory Java - ListResourceBundle

Najskôr je potrebné vytvoriť triedu, ktorá sa dá rozšíriť, aby sme mohli ukladať údaje týkajúce sa konkrétneho jazyka ListResourceBundle a potlačí getContents () metóda. Konvencia názvu triedy je rovnaká ako pre súbory vlastností.

Pre každý Miestne nastavenie, musíme vytvoriť samostatnú triedu Java.

Tu je ukážka triedy:

verejná trieda ExampleResource_pl_PL rozširuje ListResourceBundle {@Override chránený objekt [] [] getContents () {vrátiť nový objekt [] [] {{"mena", "poľský zlotý"}, {"toUsdRate", nový BigDecimal ("3,401")}} , {"mestá", nový reťazec [] {"Varšava", "Krakov"}}}; }}

Súbory Java majú jednu veľkú výhodu oproti súborom vlastností, ktorou je možnosť uchovať akýkoľvek objekt, ktorý chceme - nielen Struny.

Na druhej strane, každá zmena alebo zavedenie novej triedy java špecifickej pre miestne nastavenie vyžaduje prekompilovanie aplikácie, zatiaľ čo súbory vlastností je možné rozšíriť bez ďalšieho úsilia.

2. Použite zväzky zdrojov

Už vieme, ako definovať zväzky zdrojov, takže sme pripravení ich použiť.

Uvažujme o krátkom útržku kódu:

Locale locale = new locale ("pl", "PL"); ResourceBundle exampleBundle = ResourceBundle.getBundle ("package.ExampleResource", miestne nastavenie); assertEquals (exampleBundle.getString ("mena"), "poľský zlotý"); assertEquals (exampleBundle.getObject ("toUsdRate"), nový BigDecimal ("3.401")); assertArrayEquals (exampleBundle.getStringArray ("mestá"), nový reťazec [] {"Varšava", "Krakov"});

Po prvé, môžeme definovať naše Miestne nastavenie, pokiaľ nechceme použiť predvolený.

Po tom, nazvime statickú továrenskú metódu ResourceBundle. Musíme prejsť názov zväzku s jeho balíkom / adresárom a miestne nastavenie ako parametre.

Existuje aj továrenská metóda, ktorá vyžaduje názov zväzku, iba ak je predvolené miestne nastavenie v poriadku. Len čo máme objekt, môžeme načítať hodnoty podľa ich kľúčov.

Príklad navyše ukazuje, že môžeme použiť getString (reťazcový kľúč), getObject (reťazcový kľúč), a getStringArray (reťazcový kľúč) aby sme dostali hodnoty, ktoré chceme.

3. Výber správneho zdroja zväzku

Ak chceme použiť zdroj zväzku, je dôležité vedieť ako Java vyberie súbory balíkov.

Poďme si predstaviť, že pracujeme s aplikáciou, ktorá vyžaduje štítky v poľštine, ale je predvolená JVM miestne nastavenie je Locale.US.

Na začiatku bude aplikácia hľadať súbory v ceste triedy vhodné pre miestne nastavenie, ktoré požadujete. Začína sa to najšpecifickejším názvom, to znamená názvom obsahujúcim platformu, krajinu a jazyk.

Potom to prejde všeobecnejšie. Ak neexistuje zhoda, prepne sa späť na predvolené miestne nastavenie bez kontroly platformy tentokrát.

V prípade nezhody sa pokúsi prečítať predvolený balík. Všetko by malo byť jasné, keď sa pozrieme na poradie vybraných názvov súborov:

  • Label_pl_PL_UNIX
  • Label_pl_PL
  • Label_pl
  • Label_en_US
  • Label_en
  • Štítok

Mali by sme mať na pamäti, že každé meno predstavuje obe .java a .vlastnosti súbory, ale prvý má prednosť pred druhým. Ak neexistuje vhodný súbor, a MissingResourceException je hodená.

4. Dedenie

Ďalšou výhodou konceptu zväzku zdrojov je dedičnosť majetku. Znamená to, že páry kľúč - hodnota zahrnuté v menej špecifických súboroch dedia tie, ktoré sú vyššie v strome dedičstva.

Predpokladajme, že máme tri súbory vlastností:

# resource.properties cancelButton = zrušiť # resource_pl.properties continueButton = dalej # resource_pl_PL.properties backButton = cofnij

Bol načítaný zväzok zdrojov pre Miestne nastavenie („pl“, „PL“) vráti vo výsledku všetky tri kľúče / hodnoty. Stojí za zmienku, neexistuje žiadny východiskový balík miestnych nastavení pokiaľ sa uvažuje o dedičstve majetku.

Čo je viac, ListResourceBundles a PropertyResourceBundles nie sú v rovnakej hierarchii.

Takže ak sa v triede nachádza súbor vlastností, potom sa páry kľúč - hodnota dedia iba zo súborov vlastností. Rovnaké pravidlo platí aj pre súbory Java.

5. Prispôsobenie

Všetko, čo sme sa dozvedeli vyššie, bolo o predvolenej implementácii ResourceBundle. Existuje však spôsob, ako môžeme zmeniť jeho správanie.

Robíme to predĺžením ResourceBoundle.Control a prevyšujúce jeho metódy.

Môžeme napríklad zmeniť čas uchovávania hodnôt v pamäti cache alebo určiť stav, kedy sa má pamäť cache znovu načítať.

Pre lepšie pochopenie si pripravme krátku metódu ako príklad:

verejná trieda ExampleControl rozširuje ResourceBundle.Control {@Override public List getCandidateLocales (String s, Locale locale) {return Arrays.asList (new Locale ("pl", "PL")); }}

Účelom tejto metódy je zmeniť spôsob výberu súborov v triede. Ako vidíme, ExampleControl vráti iba polsky Miestne nastavenie, bez ohľadu na to, aké je predvolené alebo definované Miestne nastavenie je.

6. UTF-8

Pretože stále existuje veľa aplikácií, ktoré sa používajú 8. JDK alebo staršie verzie, stojí za to to vedieť pred Java 9ListResourceBundles mal oproti tomu ešte jednu výhodu PropertyResourceBundles. Pretože súbory Java môžu ukladať objekty typu String, sú schopné pojať akýkoľvek znak podporovaný programom UTF-16 kódovanie.

Naopak, PropertyResourceBundle načíta súbory štandardne pomocou ISO 8859-1 kódovanie, ktoré má menej znakov ako UTF-8 (čo spôsobuje problémy našim príkladom v poľskom jazyku).

Za účelom uloženia znakov, ktoré sú za nimi UTF-8, môžeme použiť Natívne na ASCII prevodník - native2ascii. Konvertuje všetky znaky, ktoré nie sú v súlade s normou ISO 8859-1, ich kódovaním \ uxxxx notácia.

Tu je príklad príkazu:

native2ascii -kódovanie UTF-8 utf8.properties nonUtf8.properties

Pozrime sa, ako vyzerajú vlastnosti pred a po zmene kódovania:

#Before polishHello = cześć #After polishHello = cze \ u015b \ u0107

Našťastie táto nepríjemnosť už v prostredí Java 9 neexistuje. JVM číta súbory vlastností v priečinku UTF-8 kódovanie a pri používaní znakov, ktoré nepoužívajú latinku, nie je problém.

7. Záver

BundleResource obsahuje veľa z toho, čo potrebujeme na vývoj viacjazyčnej aplikácie. Vďaka týmto vlastnostiam je manipulácia s rôznymi miestami celkom jednoduchá.

Tiež sa vyhýbame pevným hodnotám, čo nám umožňuje rozšíriť podporované hodnoty Miestne nastavenia jednoduchým pridaním nového Miestne nastavenie súbory umožňujúce hladkú úpravu a údržbu našej aplikácie.

Vzorový kód je ako vždy k dispozícii na serveri GitHub.