Kivételüzenetek lokalizálása Java-ban

1. Áttekintés

A Java kivételeket arra használják, hogy jelezzék, hogy valami rosszul esett egy programban. A kivétel elvetése mellett akár üzenetet is felvehetünk, hogy további információkat nyújtsunk.

Ebben a cikkben kihasználjuk a getLocalizedMessage módszer kivételes üzenetek angol és francia nyelven történő megadására.

2. Erőforráscsomag

Szükségünk van egy módra az üzenetek megkeresésére az a használatával messageKey az üzenet és a Területi beállítás annak meghatározása, hogy melyik fordítás adja meg az értékét messageKey. Létrehozunk egy egyszerű osztályt, amely elvonja a hozzáférést az osztályunkhoz ResourceBundle angol és francia üzenetfordítások letöltéséhez:

public class Messages {public static String getMessageForLocale (String messageKey, Locale locale) {return ResourceBundle.getBundle ("üzenetek", locale) .getString (messageKey); }} 

A mi üzenetek osztály használ ResourceBundle betölteni a tulajdonságfájlokat a csomagunkba, amely az osztályútvonalunk gyökere. Két fájlunk van - egy az angol és egy a francia üzenetünkhöz:

# messages.properties message.exception = Kivételt képezek.
# messages_fr.properties message.exception = Je suis une kivétel.

3. Lokalizált kivétel osztály

A mi Kivétel alosztály az alapértelmezettet fogja használni Területi beállítás hogy meghatározzuk, melyik fordítást használjuk üzeneteinkhez. Megkapjuk az alapértelmezettet Területi beállítás felhasználásával Terület # getDefault.

Ha az alkalmazásunk egy szerveren fut, akkor a HTTP kérés fejlécét használjuk a Területi beállítás használni az alapértelmezett beállítás helyett. Erre a célra létrehozunk egy konstruktort, amely elfogadja a Területi beállítás.

Hozzuk létre a sajátunkat Kivétel alosztály. Ehhez akár meghosszabbíthatnánk RuntimeException vagy Kivétel. Hosszabbítsuk Kivétel és felülírja getLocalizedMessage:

public class LocalizedException kiterjeszti a Exception {private final String messageKey; saját végső Locale locale; public LocalizedException (String messageKey) {this (messageKey, Locale.getDefault ()); } public LocalizedException (String messageKey, Locale locale) {this.messageKey = messageKey; this.locale = területi beállítás; } public String getLocalizedMessage () {return Messages.getMessageForLocale (messageKey, locale); }} 

4. Az összes összerakása

Készítsünk néhány egységtesztet annak ellenőrzésére, hogy minden működik-e. Teszteket készítünk angol és francia fordításokhoz, hogy ellenőrizzük a szokás teljesítését Területi beállítás kivéve az építkezés során:

@Test public void givenUsEnglishProvidedLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessage () {LocalizedException localizedException = new LocalizedException ("message.exception", Locale.US); String usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (usEnglishLocalizedExceptionMessage) .isEqualTo ("Kivétel vagyok."); } @Test public void givenFranceFrenchProvidedLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages () {LocalizedException localizedException = new LocalizedException ("message.exception", Locale.FRANCE); String franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (franceFrenchLocalizedExceptionMessage) .isEqualTo ("Je suis une kivétel."); }

Kivételünk az alapértelmezettet használhatja Területi beállítás is. Hozzunk létre még két tesztet az alapértelmezés ellenőrzéséhez Területi beállítás a funkcionalitás működik:

@Test public void givenUsEnglishDefaultLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessages () {Locale.setDefault (Locale.US); LocalizedException localizedException = új LocalizedException ("üzenet.kivétel"); Karakterlánc usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (usEnglishLocalizedExceptionMessage) .isEqualTo ("Kivétel vagyok."); } @Test public void GivenFranceFrenchDefaultLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages () {Locale.setDefault (Locale.FRANCE); LocalizedException localizedException = új LocalizedException ("üzenet.kivétel"); String franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (franceFrenchLocalizedExceptionMessage) .isEqualTo ("Je suis une kivétel."); } 

5. Figyelmeztetések

5.1. Dobhatók naplózása

Szem előtt kell tartanunk a naplózási keretrendszert, amelyet a küldéshez használunk Kivétel példányokat a naplóba.

A Log4J, a Log4J2 és a Logback használat getMessage letölteni az üzenetet, hogy írjam a napló hozzáfűzőjéhez. Ha használjuk java.util.logging, a tartalom származik getLocalizedMessage.

Érdemes fontolóra venni az elsőbbséget getMessage hogy felhívja getLocalizedMessage így nem kell aggódnunk, hogy melyik naplózási megvalósítást használják.

5.2. Kiszolgálóoldali alkalmazások

Amikor kivételes üzeneteinket lokalizáljuk kliens alkalmazásokhoz, akkor csak egy rendszer aktualitása miatt kell aggódnunk Területi beállítás. Azonban, ha a kivételes üzeneteket egy kiszolgálóoldali alkalmazásban szeretnénk lokalizálni, akkor ne felejtsük el, hogy az alapértelmezettet váltjuk Területi beállítás hatással lesz az összes kérésre az alkalmazásszerverünkön belül.

Ha a kivételüzenetek lokalizálása mellett döntünk, létrehozunk egy kiviteli konstruktort, amely elfogadja a Területi beállítás. Ez lehetővé teszi számunkra, hogy lokalizáljuk üzeneteinket az alapértelmezett frissítés nélkül Területi beállítás.

6. Összefoglalás

A kivételes üzenetek lokalizálása meglehetősen egyszerű. Csak annyit kell tennünk, hogy létrehozunk egy ResourceBundle üzeneteinkhez, majd hajtsa végre getLocalizedMessage miénkben Kivétel alosztályok.

Szokás szerint a példák elérhetők a GitHub oldalon.