Lokalizacija poruka o iznimkama na Javi

1. Pregled

Iznimke u Javi koriste se kao signal da je nešto pošlo po zlu u programu. Osim izbacivanja iznimke, možemo dodati i poruku koja će pružiti dodatne informacije.

U ovom ćemo članku iskoristiti getLocalizedMessage metoda za pružanje poruka o iznimkama na engleskom i francuskom jeziku.

2. Paket resursa

Trebamo način pretraživanja poruka pomoću a porukaKljuč prepoznati poruku i Lokalno kako bi se utvrdilo koji će prijevod pružiti vrijednost za porukaKljuč. Stvorit ćemo jednostavnu klasu za apstraktni pristup našem ResourceBundle za dohvaćanje prijevoda poruka na engleski i francuski:

poruke javne klase {public static String getMessageForLocale (String messageKey, Locale locale) {return ResourceBundle.getBundle ("messages", locale) .getString (messageKey); }} 

Naše Poruke razred koristi ResourceBundle za učitavanje datoteka svojstava u naš snop, koji je u korijenu naše staze. Imamo dvije datoteke - jednu za naše poruke na engleskom i jednu za naše poruke na francuskom:

# messages.properties message.exception = Ja sam iznimka.
# messages_fr.properties message.exception = Ovo je iznimka.

3. Lokalizirana klasa izuzetaka

Naše Iznimka podrazred će koristiti zadani Lokalno kako bismo odredili koji prijevod koristiti za naše poruke. Dobit ćemo zadano Lokalno koristeći Locale # getDefault.

Da se naša aplikacija izvodi na poslužitelju, koristili bismo zaglavlja HTTP zahtjeva da bismo identificirali Lokalno koristiti umjesto postavljanja zadane vrijednosti. U tu svrhu stvorit ćemo konstruktor koji će prihvatiti Lokalno.

Stvorimo svoje Iznimka podrazred. Za ovo bismo mogli produžiti bilo koji RuntimeException ili Iznimka. Produljimo Iznimka i nadjačati getLocalizedMessage:

javna klasa LocalizedException proširuje Exception {private final String messageKey; privatni konačni lokacijski jezik; javni LocalizedException (String messageKey) {this (messageKey, Locale.getDefault ()); } javni LocalizedException (String messageKey, Locale locale) {this.messageKey = messageKey; this.locale = locale; } public String getLocalizedMessage () {return Messages.getMessageForLocale (messageKey, locale); }} 

4. Sve to zajedno

Stvorimo neke jedinične testove kako bismo provjerili radi li sve. Stvorit ćemo testove za prijevode na engleski i francuski kako bismo provjerili da li se prilagođava Lokalno uz iznimku tijekom gradnje:

@Test javna praznina givenUsEnglishProvidedLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessage () {LocalizedException localizedException = new LocalizedException ("message.exception", Locale.US); Niz usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (usEnglishLocalizedExceptionMessage) .isEqualTo ("Ja sam iznimka."); } @Test javna praznina givenFranceFrenchProvidedLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages () {LocalizedException localizedException = new LocalizedException ("message.exception", Locale.FRANCE); Niz franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (franceFrenchLocalizedExceptionMessage) .isEqualTo ("Je suis une iznimka."); }

Naša se iznimka može koristiti zadanim Lokalno također. Stvorimo još dva testa za provjeru zadanog Lokalno funkcionalnost radi:

@Test javna praznina givenUsEnglishDefaultLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessages () {Locale.setDefault (Locale.US); LocalizedException localizedException = novo LocalizedException ("message.exception"); Niz usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (usEnglishLocalizedExceptionMessage) .isEqualTo ("Ja sam iznimka."); } @Test javna praznina givenFranceFrenchDefaultLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages () {Locale.setDefault (Locale.FRANCE); LocalizedException localizedException = novo LocalizedException ("message.exception"); Niz franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (franceFrenchLocalizedExceptionMessage) .isEqualTo ("Je suis une iznimka."); } 

5. Upozorenja

5.1. Upisivanje bacača

Morat ćemo imati na umu okvir za evidentiranje koji koristimo za slanje Iznimka instance u zapisnik.

Log4J, Log4J2 i Logback uporaba getMessage za preuzimanje poruke za pisanje u dodavač dnevnika. Ako koristimo java.util.logging, sadržaj dolazi iz getLocalizedMessage.

Mogli bismo razmotriti nadjačavanje getMessage zazivati getLocalizedMessage tako da se nećemo morati brinuti koja se implementacija zapisnika koristi.

5.2. Aplikacije na strani poslužitelja

Kada lokaliziramo poruke o iznimkama za klijentske aplikacije, trebamo se brinuti samo o trenutnom sustavu Lokalno. Međutim, ako želimo lokalizirati poruke o iznimkama u aplikaciji na poslužitelju, trebali bismo imati na umu da je prebacivanje zadane postavke Lokalno utjecat će na sve zahtjeve unutar našeg aplikacijskog poslužitelja.

Ako odlučimo lokalizirati poruke o iznimkama, stvorit ćemo konstruktor za našu iznimku da prihvati Lokalno. To će nam pružiti mogućnost lokalizacije naših poruka bez ažuriranja zadanih postavki Lokalno.

6. Sažetak

Lokalizacija poruka o iznimkama prilično je jednostavna. Sve što trebamo napraviti je stvoriti ResourceBundle za naše poruke, a zatim implementirajte getLocalizedMessage u našem Iznimka potklase.

Kao i obično, primjeri su dostupni na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found