לוקליזציה של הודעות חריגות בג'אווה

1. סקירה כללית

חריגים ב- Java משמשים לאות שמשהו השתבש בתוכנית. בנוסף לזריקת החריג, אנו יכולים אפילו להוסיף הודעה על מנת לספק מידע נוסף.

במאמר זה ננצל את ה- getLocalizedMessage שיטה לספק הודעות חריגות באנגלית ובצרפתית.

2. צרור משאבים

אנו זקוקים לדרך לחפש הודעות באמצעות messageKey לזהות את המסר ואת אזור לזהות איזה תרגום יספק את הערך עבור ה- messageKey. ניצור מעמד פשוט להפשטת גישה אל שלנו ResourceBundle לאחזור תרגומי הודעות באנגלית וצרפתית:

הודעות מחלקה ציבורית {מחרוזת סטטית ציבורית getMessageForLocale (String messageKey, Locale locale) {return ResourceBundle.getBundle ("הודעות", locale) .getString (messageKey); }} 

שֶׁלָנוּ הודעות שימושים בכיתה ResourceBundle כדי לטעון את קבצי המאפיינים לחבילה שלנו, שנמצאת בבסיס מסלול הכיתה שלנו. יש לנו שני קבצים - אחד להודעות באנגלית ואחד להודעות בצרפתית:

# messages.properties message.exception = אני יוצא מן הכלל.
# messages_fr.properties message.exception = יוצא מן הכלל.

3. מחלקת חריגים מקומית

שֶׁלָנוּ יוצא מן הכלל מחלקה משנה תשתמש בברירת המחדל אזור כדי לקבוע באיזה תרגום להשתמש להודעות שלנו. נקבל את ברירת המחדל אזור באמצעות אזור # getDefault.

אם היישום שלנו פועל בשרת, היינו משתמשים בכותרות בקשת HTTP כדי לזהות את אזור להשתמש במקום להגדיר את ברירת המחדל. לצורך כך, ניצור קונסטרוקטור שיקבל a אזור.

בואו ניצור את שלנו יוצא מן הכלל תת מחלקה. לשם כך נוכל להאריך גם את זה חריגת זמן ריצה אוֹ יוצא מן הכלל. בואו נאריך יוצא מן הכלל ולדרוס getLocalizedMessage:

מחלקה ציבורית LocalizedException מרחיבה חריגה {private final מחרוזת messageKey; אזור מקומי פרטי סופי; ציבורי LocalizedException (מחרוזת messageKey) {זה (messageKey, Locale.getDefault ()); } LocalizedException ציבורי (מחרוזת messageKey, locale locale) {this.messageKey = messageKey; this.locale = אזור; } מחרוזת ציבורית getLocalizedMessage () {return Messages.getMessageForLocale (messageKey, locale); }} 

4. לשים את הכל ביחד

בואו ליצור כמה בדיקות יחידה כדי לוודא שהכל עובד. ניצור מבחנים לתרגומים לאנגלית וצרפתית לאימות העברת מנהג אזור למעט במהלך הבנייה:

@Test ציבורי בטל שניתןUsEnglishProvidedLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessage () {LocalizedException localizedException = LocalizedException חדש ("message.exception", Local.US); מחרוזת usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (usEnglishLocalizedExceptionMessage) .isEqualTo ("אני יוצא מן הכלל."); } @Test public void givenFranceFrenchProvidedLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages () {LocalizedException localizedException = new LocalizedException ("message.exception", Local.FRANCE); מחרוזת franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (franceFrenchLocalizedExceptionMessage) .isEqualTo ("חריג Je suis une."); }

החריג שלנו יכול להשתמש בברירת המחדל אזור גם כן. בואו ניצור שתי בדיקות נוספות לאימות ברירת המחדל אזור פונקציונליות עובדת:

@ מבחן חלל ציבורי שניתןUsEnglishDefaultLocale_whenLocalizingMessage_thenMessageComesFromDefaultMessages () {Locale.setDefault (Locale.US); LocalizedException localizedException = חדש LocalizedException ("message.exception"); מחרוזת usEnglishLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (usEnglishLocalizedExceptionMessage) .isEqualTo ("אני יוצא מן הכלל."); } @Test public void givenFranceFrenchDefaultLocale_whenLocalizingMessage_thenMessageComesFromFrenchTranslationMessages () {Locale.setDefault (Locale.FRANCE); LocalizedException localizedException = חדש LocalizedException ("message.exception"); מחרוזת franceFrenchLocalizedExceptionMessage = localizedException.getLocalizedMessage (); assertThat (franceFrenchLocalizedExceptionMessage) .isEqualTo ("חריג Je suis une."); } 

5. אזהרות

5.1. חוטבי עצים

עלינו לזכור את מסגרת הרישום שאנו משתמשים בה כדי לשלוח יוצא מן הכלל מקרים ליומן.

השימוש ב- Log4J, Log4J2 ו- Logback getMessage כדי לאחזר את ההודעה שכתבה למוסף היומן. אם נשתמש java.util.logging, התוכן בא מ getLocalizedMessage.

כדאי שנשקול לעקוף getMessage להפעיל getLocalizedMessage כך שלא נצטרך לדאוג באיזה יישום רישום משתמשים.

5.2. יישומי צד השרת

כאשר אנו לוקחים את ההודעות החריגות שלנו ליישומי לקוח, עלינו לדאוג רק לנוכח מערכת אחת אזור. למרות זאת, אם ברצוננו למקם הודעות חריגות ביישום בצד השרת, עלינו לזכור כי החלפת ברירת המחדל אזור ישפיע על כל הבקשות בשרת היישומים שלנו.

אם נחליט למקם הודעות חריגות, ניצור קונסטרוקטור על החריג שלנו שיקבל את אזור. זה יאפשר לנו לאתר את ההודעות שלנו מבלי לעדכן את ברירת המחדל אזור.

6. סיכום

לוקליזציה של הודעות חריגות היא פשוטה למדי. כל מה שאנחנו צריכים לעשות זה ליצור ResourceBundle להודעות שלנו ואז ליישם getLocalizedMessage בשלנו יוצא מן הכלל מחלקות משנה.

כרגיל, הדוגמאות זמינות ב- GitHub.