Útmutató a ResourceBundle-hez

1. Áttekintés

Számos szoftverfejlesztő szakmai karrierje során lehetőség nyílik többnyelvű rendszerek vagy alkalmazások fejlesztésére. Ezeket általában különböző régiókból vagy különböző nyelvterületekről származó végfelhasználóknak szánják.

Mindig kihívást jelent ezen alkalmazások fenntartása és kiterjesztése. Az a képesség, hogy különféle lokalizációs adatokkal egyidejűleg működjön, döntő fontosságú. Az alkalmazás adatainak a lehető legegyszerűbbnek kell lennie, újrafordítás nélkül. Ezért általában kerüljük a hardcode-os címkék vagy gombok nevét.

Szerencsére olyan Java-ban tudunk bankolni, amely ezt az osztályt biztosítja számunkra, ami segít a fent említett problémák megoldásában.

Egyszerűen fogalmazva: ResourceBundle lehetővé teszi az alkalmazásunk számára, hogy különálló fájlokból töltsön be adatokat, amelyek lokálspecifikus adatokat tartalmaznak.

1.1. ResourceBundles

Az első dolog, amit tudnunk kell, hogy az összes fájl benne van egy erőforráscsomagnak ugyanabban a csomagban / könyvtárban kell lennie, és közös alapnévvel kell rendelkeznie. Lehet, hogy a nyelvre, az országra vagy a platformra jelölt nyelvspecifikus utótagok vannak elválasztva aláhúzással.

Fontos, hogy országkódot csatolhatunk, ha már van nyelvi kód, vagy platformot, ha nyelvi és országkódok vannak.

Nézzük meg a fájlnevek példáját:

  • ExampleResource
  • PéldaForrás_hu
  • PéldaForrás_hu_HU
  • PéldaForrás_hu_HU_UNIX

Minden adatcsomag alapértelmezett fájlja mindig egy, utótag nélkül - ExampleResource. Mivel két alosztálya van ResourceBundle: PropertyResourceBundle és ListResourceBundle, felcserélhető módon megőrizhetjük az adatokat a tulajdonfájlokban, valamint a java fájlokban.

Minden fájlnak rendelkeznie kell egy lokálspecifikus név és egy megfelelő fájlkiterjesztés, például, ExampleResource_en_US.properties vagy Példa_hu.java.

1.2. Tulajdoni fájlok - PropertyResourceBundle

A tulajdonságfájlokat a PropertyResourceBundle. Az adatokat kis- és nagybetű érzékeny kulcs-érték párok formájában tárolják.

Elemezzünk egy minta tulajdonságfájlt:

# Gombok folytatásaGomb folytatása CancelButton = törlés! Hello címke: hello 

Mint láthatjuk, a kulcs-érték párok meghatározásának három különböző stílusa van.

Mindegyik egyenértékű, de az első valószínűleg a legnépszerűbb Jáva programozók. Érdemes tudni, hogy a tulajdonságfájlokba is tehetünk megjegyzéseket. A megjegyzések mindig azzal kezdődnek # vagy !.

1.3. Java fájlok - ListResourceBundle

Először is, a nyelvspecifikus adataink tárolásához létre kell hoznunk egy kiterjeszthető osztályt ListResourceBundle és felülírja a getContents () módszer. Az osztálynév megegyezik a tulajdonságfájlokéval.

Az egyes Területi beállítás, külön Java osztályt kell létrehoznunk.

Itt van egy minta osztály:

public class ExampleResource_pl_PL kiterjeszti a ListResourceBundle {@Orride védett objektumot] [] getContents () {return new Object [] [] {{"currency", "polish zloty"}, {"toUsdRate", new BigDecimal ("3.401")} , {"városok", új húr [] {"Varsó", "Krakkó"}}}; }}

A Java fájloknak egyetlen fő előnye van a tulajdonfájlokkal szemben, amely lehetőséget nyújt bármilyen kívánt objektum megtartására - nemcsak Húrok.

Másrészről egy új lokálspecifikus java osztály minden módosítása vagy bevezetése megköveteli az alkalmazás újrafordítását, míg a tulajdonságfájlok minden további erőfeszítés nélkül kibővíthetők.

2. Használja az erőforráscsomagokat

Már tudjuk, hogyan kell meghatározni az erőforráscsomagokat, ezért készen állunk a használatára.

Vegyük fontolóra a rövid kódrészletet:

Locale locale = new Locale ("pl", "PL"); ResourceBundle exampleBundle = ResourceBundle.getBundle ("package.ExampleResource", területi beállítás); assertEquals (exampleBundle.getString ("valuta"), "lengyel zloty"); assertEquals (exampleBundle.getObject ("toUsdRate"), új BigDecimal ("3.401")); assertArrayEquals (exampleBundle.getStringArray ("városok"), új String [] {"Varsó", "Krakkó"});

Először is meghatározhatjuk a sajátunkat Területi beállítás, hacsak nem akarjuk használni az alapértelmezettet.

Ezt követően hívjuk meg a statikus gyári metódust ResourceBundle. Át kell mennünk a csomag neve és a csomag / könyvtár és a területi beállítás paraméterként.

Van egy olyan gyári módszer is, amely csak akkor igényel csomagnevet, ha az alapértelmezett területi beállítás megfelelő. Amint megvan az objektum, lekérhetjük az értékeket a kulcsukkal.

Ezenkívül a példa azt mutatja, hogy használhatjuk getString (karakterlánc-kulcs), getObject (karakterlánc-kulcs), és getStringArray (karakterlánc-kulcs) hogy megszerezzük a kívánt értékeket.

3. A megfelelő kötegerőforrás kiválasztása

Ha kötegelt erőforrást akarunk használni, fontos tudni, hogyan Jáva kiválasztja a kötegfájlokat.

Képzeljük el, hogy olyan alkalmazással dolgozunk, amelynek lengyel címkékre van szüksége, de az alapértelmezett JVM locale az Locale.US.

Az elején az alkalmazás az osztályterületen fogja keresni a fájlokat, amelyek megfelelnek az Ön által kért területi beállításoknak. A legspecifikusabb névvel kezdődik, vagyis olyan platformot, országot és nyelvet tartalmaz.

Ezután általánosabbra megy. Ha nincs egyezés, akkor ez az alapértelmezett területi beállításra esik, és ezúttal nincs platformellenőrzés.

Ha nincs egyezés, megpróbálja elolvasni az alapértelmezett csomagot. Mindennek világosnak kell lennie, amikor a kiválasztott fájlnevek sorrendjét nézzük:

  • Label_pl_PL_UNIX
  • Label_pl_PL
  • Label_pl
  • Címke_hu_HU
  • Címke_hu
  • Címke

Nem szabad megfeledkeznünk arról, hogy minden név mindkettőt képviseli .Jáva és .tulajdonságok fájlokat, de az előbbi elsőbbséget élvez az utóbbival szemben. Ha nincs megfelelő fájl, a MissingResourceException dobják.

4. Öröklés

Az erőforráscsomag másik előnye a tulajdon öröklése. Ez azt jelenti, hogy a kevésbé specifikus fájlokban szereplő kulcsérték-párokat azok öröklik, amelyek magasabbak az öröklődési fában.

Tegyük fel, hogy három tulajdonságfájlunk van:

# resource.properties cancelButton = cancel # resource_pl.properties folytatódikButton = dalej # resource_pl_PL.properties backButton = cofnij

Erőforráscsomag lekérve Területi beállítás („pl”, „PL”) az eredményben mindhárom kulcsot / értéket visszaadná. Érdemes megemlíteni, nincs visszaállítás az alapértelmezett területi csomagra amennyiben a vagyoni örökséget vesszük figyelembe.

Mi több, ListResourceBundles és PropertyResourceBundles nem azonos hierarchiában vannak.

Tehát, ha egy tulajdonságfájl található az osztályúton, akkor a kulcs-érték párokat csak a tulajdonságfájlokból örököljük. Ugyanez a szabály vonatkozik a Java fájlokra is.

5. Testreszabás

A fentiekből csak annyit tudtunk meg, hogy a ResourceBundle. Van azonban egy módja annak, hogy módosítsuk a viselkedését.

Ezt kiterjesztéssel tesszük ResourceBoundle.Control és felülírja a módszereit.

Megváltoztathatjuk például az értékek gyorsítótárban tartásának idejét, vagy meghatározhatjuk azt az állapotot, amikor a gyorsítótárat újratölteni kell.

A jobb megértés érdekében készítsünk példaként egy rövid módszert:

a public class ExampleControl kiterjeszti a ResourceBundle.Control {@Orride public list getCandidateLocales (String s, Locale locale) {return Arrays.asList (new Locale ("pl", "PL")); }}

Ennek a módszernek az a célja, hogy megváltoztassa a fájlok kiválasztásának módját az osztályúton. Ahogy látjuk, PéldaControl csak lengyelül fog visszatérni Területi beállítás, nem számít, mi az alapértelmezett vagy definiált Területi beállítás van.

6. UTF-8

Mivel még mindig sok alkalmazás használ JDK 8 vagy régebbi verziók, ezt érdemes tudni megelőzően Jáva 9ListResourceBundles még egy előnye volt PropertyResourceBundles. Mivel a Java fájlok karakterlánc objektumokat tárolhatnak, bármilyen karaktert képesek megtartani UTF-16 kódolás.

Ellenkezőleg, PropertyResourceBundle fájlokat tölt be alapértelmezés szerint a ISO 8859-1 kódolás, amelynek kevesebb karaktere van, mint UTF-8 (problémákat okozva lengyel nyelvű példáink számára).

Azon kívüli karakterek mentése érdekében UTF-8, használhatjuk a Native-To-ASCII átalakító - native2ascii. Az összes kódot, amely nem felel meg az ISO 8859-1 szabványnak, konvertálja azáltal, hogy kódolja őket \ uxxxx jelölés.

Íme egy példa a parancsra:

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

Lássuk, hogyan néznek ki a tulajdonságok a kódolás módosítása előtt és után:

#PolishHello = cześć előtt #PolishHello = cze \ u015b \ u0107 után

Szerencsére ez a kellemetlenség már nem létezik a Java 9-ben. JVM beolvassa a tulajdonságfájlokat UTF-8 kódolás, és nincs probléma a nem latin karakterek használatával.

7. Következtetés

BundleResource sok mindent tartalmaz, amire szükségünk van egy többnyelvű alkalmazás fejlesztéséhez. Az általunk lefedett funkciók eléggé egyértelművé teszik a különböző helyek manipulálását.

Kerüljük a hardcoding értékeket is, lehetővé téve a támogatott bővítését Nyelvek egyszerűen új hozzáadásával Területi beállítás fájlok, amelyek lehetővé teszik alkalmazásunk zökkenőmentes módosítását és karbantartását.

Mint mindig, a mintakód is elérhető a GitHubon.