Lokalisering af undtagelsesmeddelelser i Java

1. Oversigt

Undtagelser i Java bruges til at signalere, at noget er gået galt i et program. Ud over at kaste undtagelsen kan vi endda tilføje en besked for at give yderligere oplysninger.

I denne artikel drager vi fordel af getLocalizedMessage metode til at give undtagelsesbeskeder på både engelsk og fransk.

2. Ressourcepakke

Vi har brug for en måde at slå meddelelser op ved hjælp af en beskednøgle for at identificere meddelelsen og Lokal for at identificere, hvilken oversættelse der giver værdien for beskednøgle. Vi opretter en enkel klasse til abstrakt adgang til vores ResourceBundle til hentning af engelske og franske oversættelser af beskeder:

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

Vores Beskeder klasse bruger ResourceBundle for at indlæse egenskabsfilerne i vores pakke, som er roden til vores klassesti. Vi har to filer - en til vores engelske beskeder og en til vores franske meddelelser:

# messages.properties message.exception = Jeg er en undtagelse.
# messages_fr.properties message.exception = Der er kun en undtagelse.

3. Lokaliseret undtagelsesklasse

Vores Undtagelse Underklasse bruger standard Lokal for at bestemme hvilken oversættelse der skal bruges til vores beskeder. Vi får standard Lokal ved brug af Lokal nr. GetDefault.

Hvis vores applikation kørte på en server, ville vi bruge HTTP-anmodningsoverskrifter til at identificere Lokal at bruge i stedet for at indstille standardindstillingen. Til dette formål opretter vi en konstruktør til at acceptere en Lokal.

Lad os skabe vores Undtagelse underklasse. Til dette kunne vi udvide enten RuntimeException eller Undtagelse. Lad os forlænge Undtagelse og tilsidesætte getLocalizedMessage:

offentlig klasse LocalizedException udvider Undtagelse {privat endelig String messageKey; privat endelig lokal lokalitet; offentlig LocalizedException (String messageKey) {dette (messageKey, Locale.getDefault ()); } offentlig LocalizedException (String messageKey, locale locale) {this.messageKey = messageKey; this.locale = lokalitet; } offentlig streng getLocalizedMessage () {return Messages.getMessageForLocale (messageKey, locale); }} 

4. Sætte det hele sammen

Lad os oprette nogle enhedstest for at kontrollere, at alt fungerer. Vi opretter tests til engelske og franske oversættelser for at bekræfte bestået en brugerdefineret Lokal til undtagelsen under konstruktion:

@Test offentlig ugyldighed givenUsEnglishProvidedLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessage () {LocalizedException localizedException = new LocalizedException ("message.exception", Locale.US); Streng usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (usEnglishLocalizedExceptionMessage) .isEqualTo ("Jeg er en undtagelse."); } @Test offentligt ugyldigt givetFranceFrenchProvidedLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages () {LocalizedException localizedException = new LocalizedException ("message.exception", Locale.FRANCE); String franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (franceFrenchLocalizedExceptionMessage) .isEqualTo ("Je suis une undtagelse."); }

Vores undtagelse kan bruge standard Lokal såvel. Lad os oprette yderligere to tests for at bekræfte standard Lokal funktionalitet fungerer:

@Test offentlig ugyldighed givetUsEnglishDefaultLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessages () {Locale.setDefault (Locale.US); LocalizedException localizedException = ny LocalizedException ("message.exception"); Streng usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (usEnglishLocalizedExceptionMessage) .isEqualTo ("Jeg er en undtagelse."); } @Test offentlig ugyldighed givetFranceFrenchDefaultLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages () {Locale.setDefault (Locale.FRANCE); LocalizedException localizedException = ny LocalizedException ("message.exception"); String franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (franceFrenchLocalizedExceptionMessage) .isEqualTo ("Je suis une undtagelse."); } 

5. forbehold

5.1. Logning Throwables

Vi bliver nødt til at huske den logningsramme, vi bruger til at sende Undtagelse forekomster til loggen.

Log4J, Log4J2 og Logback bruges getMessage for at hente den besked, der skal skrives til log-appender. Hvis vi bruger java.util.logging, indholdet kommer fra getLocalizedMessage.

Vi vil måske overveje at tilsidesætte getMessage at påberåbe sig getLocalizedMessage så vi behøver ikke bekymre os om, hvilken logningimplementering der bruges.

5.2. Server-side applikationer

Når vi lokaliserer vores undtagelsesbeskeder til klientapplikationer, behøver vi kun bekymre os om et systems nuværende Lokal. Imidlertid, hvis vi ønsker at lokalisere undtagelsesmeddelelser i en server-applikation, skal vi huske på, at skifte standard Lokal vil påvirke alle anmodninger på vores applikationsserver.

Hvis vi beslutter at lokalisere undtagelsesmeddelelser, opretter vi en konstruktør på vores undtagelse til at acceptere Lokal. Dette giver os muligheden for at lokalisere vores beskeder uden at opdatere standard Lokal.

6. Resume

Lokalisering af undtagelsesbeskeder er ret ligetil. Alt hvad vi skal gøre er at oprette en ResourceBundle til vores beskeder, implementer derefter getLocalizedMessage i vores Undtagelse underklasser.

Som sædvanligt er eksemplerne tilgængelige på GitHub.


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