Lokalizácia správ o výnimkách v prostredí Java

1. Prehľad

Výnimky v Jave sa používajú na signalizáciu toho, že sa v programe niečo pokazilo. Okrem zrušenia výnimky môžeme dokonca pridať správu, ktorá poskytne ďalšie informácie.

V tomto článku využijeme výhody getLocalizedMessage metóda poskytovania správ o výnimkách v angličtine aj vo francúzštine.

2. Balík zdrojov

Potrebujeme spôsob, ako vyhľadať správy pomocou a messageKey na identifikáciu správy a Miestne nastavenie určiť, ktorý preklad poskytne hodnotu pre messageKey. Vytvoríme jednoduchú triedu na abstraktný prístup k našim ResourceBundle na získanie prekladov správ z angličtiny a francúzštiny:

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

Náš Správy trieda používa ResourceBundle načítať súbory vlastností do nášho zväzku, ktorý je koreňom našej cesty k triede. Máme dva súbory - jeden pre naše anglické správy a jeden pre naše francúzske správy:

# messages.properties message.exception = Som výnimka.
# messages_fr.properties message.exception = Je to iná výnimka.

3. Lokalizovaná trieda výnimiek

Náš Výnimka podtrieda použije predvolené nastavenie Miestne nastavenie aby sme určili, ktorý preklad sa má pre naše správy použiť. Dostaneme predvolené Miestne nastavenie použitím Miestne # getDefault.

Ak by naša aplikácia bežala na serveri, na identifikáciu by sme použili hlavičky požiadaviek HTTP Miestne nastavenie použiť namiesto nastavenia predvoleného. Za týmto účelom vytvoríme konštruktor, ktorý prijme a Miestne nastavenie

Poďme vytvoriť naše Výnimka podtrieda. Za týmto účelom by sme mohli predĺžiť buď RuntimeException alebo Výnimka. Poďme predĺžiť Výnimka a prepísať getLocalizedMessage:

verejná trieda LocalizedException rozširuje výnimku {private final String messageKey; súkromné ​​konečné miestne nastavenie miestneho nastavenia; public LocalizedException (String messageKey) {this (messageKey, Locale.getDefault ()); } verejná LocalizedException (reťazec messageKey, miestne miestne nastavenie) {this.messageKey = messageKey; this.locale = miestne nastavenie; } public String getLocalizedMessage () {return Messages.getMessageForLocale (messageKey, locale); }} 

4. Dáme všetko dohromady

Vytvorme niekoľko testov jednotiek, aby sme overili, či všetko funguje. Vytvoríme testy pre preklady do angličtiny a francúzštiny, aby sme overili úspešné absolvovanie testu Miestne nastavenie s výnimkou počas výstavby:

@Test public void givenUsEnglishProvidedLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessage () {LocalizedException localizedException = new LocalizedException ("message.exception", Locale.US); Reťazec usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (usEnglishLocalizedExceptionMessage) .isEqualTo ("Som výnimkou."); } @Test public void givenFranceFrenchProvidedLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages () {LocalizedException localizedException = new LocalizedException ("message.exception", Locale.FRANCE); Reťazec franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (franceFrenchLocalizedExceptionMessage) .isEqualTo ("Je suis une výnimka."); }

Naša výnimka môže použiť predvolené nastavenie Miestne nastavenie tiež. Vytvorme ďalšie dva testy na overenie predvoleného nastavenia Miestne nastavenie funkcionalita funguje:

@Test public void givenUsEnglishDefaultLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessages () {Locale.setDefault (Locale.US); LocalizedException localizedException = nový LocalizedException ("message.exception"); Reťazec usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (usEnglishLocalizedExceptionMessage) .isEqualTo ("Som výnimkou."); } @Test public void givenFranceFrenchDefaultLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages () {Locale.setDefault (Locale.FRANCE); LocalizedException localizedException = nový LocalizedException ("message.exception"); Reťazec franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (franceFrenchLocalizedExceptionMessage) .isEqualTo ("Je suis une výnimka."); } 

5. Upozornenia

5.1. Vrhacie hárky

Budeme musieť pamätať na rámec protokolovania, ktorý používame na odosielanie Výnimka inštancie do denníka.

Používajú sa Log4J, Log4J2 a Logback getMessage načítať správu a napísať príjemcovi protokolu. Ak použijeme java.util.logovanie, obsah pochádza z getLocalizedMessage.

Možno by sme chceli zvážiť prekonanie getMessage dovolať sa getLocalizedMessage takže sa nebudeme musieť obávať, ktorá implementácia protokolovania sa použije.

5.2. Aplikácie na strane servera

Keď lokalizujeme naše správy o výnimkách pre klientske aplikácie, musíme si robiť starosti iba s prúdom jedného systému Miestne nastavenie. Avšak Ak chceme lokalizovať správy o výnimkách v aplikácii na strane servera, mali by sme mať na pamäti prepnutie predvoleného nastavenia Miestne nastavenie ovplyvní všetky požiadavky v rámci nášho aplikačného servera.

Ak by sme sa rozhodli lokalizovať správy o výnimkách, vytvoríme na našej výnimke konštruktor na akceptovanie Miestne nastavenie. Toto nám dá možnosť lokalizovať naše správy bez aktualizácie predvoleného nastavenia Miestne nastavenie.

6. Zhrnutie

Lokalizácia správ o výnimkách je dosť jednoduchá. Všetko, čo musíme urobiť, je vytvoriť ResourceBundle pre naše správy, potom implementujte getLocalizedMessage v našom Výnimka podtriedy.

Ako obvykle sú príklady k dispozícii na GitHub.