לוקליזציה של Java - עיצוב הודעות

1. הקדמה

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

נשתמש בשתי Java MessageFormat וספריית הצד השלישי, המחלקה לטיפול נמרץ.

2. מקרה שימוש בלוקליזציה

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

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

נניח שיש לנו לקוח דוא"ל ואנחנו רוצים להציג התראות כשמגיעה הודעה חדשה.

דוגמה פשוטה להודעה כזו עשויה להיות זו:

אליס שלחה לך הודעה.

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

אליס מבטיחה שליחת הודעה. 

בעוד שאנשים פולנים ישמחו לראות את זה:

אליס וויסלנה ci wiadomość. 

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

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

הודעת מחרוזת = "אליס שלחה" + כמות + "הודעות"; 

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

בוב שלח שתי הודעות. בוב שליח הודעות דה -וקס. בוב ויסלאל דווי וויאדומוצ'י.

שימו לב, איך הפועל משתנה במקרה של פולנית (wysłała לעומת wysłał) שפה. זה ממחיש את העובדה ש שרשור מחרוזת בנאלי לעתים נדירות מקובל על לוקליזציה של הודעות.

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

3. לוקליזציה של הודעה

אנו עשויים להגדיר את לוקליזציה, או l10n, של יישום כתהליך התאמת היישום לנוחות המשתמש. לפעמים, המונח הַפנָמָה, אוֹ i18n, משמש גם.

על מנת למקם את היישום, קודם כל, בואו נמנע את כל ההודעות שקודדו בקשיח על ידי העברתן לתוכנה שלנו אֶמְצָעִי תיקיה:

כל קובץ צריך להכיל צמדי ערך-מפתח עם ההודעות בשפה המתאימה. לדוגמה, קובץ messages_en. נכסים צריך להכיל את הצמד הבא:

label = אליס שלחה לך הודעה.

messages_pl. נכסים צריך להכיל את הצמד הבא:

תווית = Alice wysłała ci wiadomość.

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

ResourceBundle bundle = ResourceBundle.getBundle ("הודעות", Locale.UK); הודעת מחרוזת = bundle.getString ("תווית");

ערך המשתנה הוֹדָעָה יהיה "אליס שלחה לך הודעה."

Java אזור המחלקה מכילה קיצורי דרך לשפות ולמדינות הנפוצות.

במקרה של השפה הפולנית, אנו עשויים לכתוב את הדברים הבאים:

ResourceBundle bundle = ResourceBundle.getBundle ("הודעות", Locale.forLanguageTag ("pl-PL")); הודעת מחרוזת = bundle.getString ("תווית");

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

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

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

4. פורמט הודעה

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

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

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

4.1. Java MessageFormat

על מנת לעצב מחרוזות, Java מגדירה שיטות פורמט רבות ב מיתר. אבל, אנחנו יכולים לקבל תמיכה רבה יותר באמצעות java.text.format.MessageFormat.

לשם המחשה, בואו ניצור תבנית ונזין אותה ל- a MessageFormat למשל:

תבנית מחרוזת = "בתאריך {0, תאריך}, {1} שלח לך" + "{2, בחירה, 0 # אין הודעות | 1 # הודעה | 2 # שתי הודעות | 2 <{2, מספר, שלם} הודעות} . "; מעצב MessageFormat = MessageFormat חדש (תבנית, Locale.UK); 

במחרוזת התבנית יש משבצות לשלושה מצייני מיקום.

אם אנו מספקים כל ערך:

הודעת מחרוזת = formatter.format (אובייקט חדש [] {date, "Alice", 2});

לאחר מכן MessageFormat ימלא את התבנית ויעביר את ההודעה שלנו:

ב -27 באפריל 2019 אליס שלחה לך שתי הודעות.

4.2. MessageFormat תחביר

מהדוגמה לעיל אנו רואים כי דפוס ההודעה:

דפוס = "בתאריך {...}, {..} שלח לך את {...}.";

מכיל מצייני מיקום שהם הסוגריים המתולתלים {…} עם טיעון נדרש אינדקס ושני טיעונים אופציונליים, סוּג ו סִגְנוֹן:

{index} {index, type} {index, type, style}

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

כשהוא נוכח, סוּג ו סִגְנוֹן עשוי לקחת את הערכים הבאים:

סוּגסִגְנוֹן
מספרמספר שלם, מטבע, אחוז, פורמט מותאם אישית
תַאֲרִיךפורמט קצר, בינוני, ארוך, מלא, מותאם אישית
זְמַןפורמט קצר, בינוני, ארוך, מלא, מותאם אישית
בְּחִירָהפורמט מותאם אישית

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

בואו נסתכל מקרוב על פורמט מותאם אישית.

בדוגמה שלמעלה השתמשנו בביטוי הפורמט הבא:

{2, בחירה, 0 # אין הודעות | 1 # הודעה | 2 # שתי הודעות | 2 <{2, מספר, מספר שלם} הודעות}

באופן כללי, לסגנון הבחירה יש צורה של אפשרויות המופרדות על ידי הבר (או הצינור) האנכי:

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

{2, בחירה, ... | 2 <{2, מספר, מספר שלם} הודעות}

סוג הבחירה הוא מבוסס מספר, כך שיש סדר טבעי לערכי ההתאמה kאני המחלקים שורה מספרית למרווחים:

אם אנו נותנים ערך k ששייך למרווח [kאני, קאני + 1) (הקצה השמאלי נכלל, הימני אינו נכלל) ואז ערך vאני נבחר.

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

דפוס = "יש לך" + "{0, בחירה, 0 # אין הודעות | 1 # הודעה | 2 # שתי הודעות | 2 <{0, מספר, מספר שלם} הודעות}.";

ולהעביר ערכים שונים עבור מציין המיקום הייחודי שלה:

נהוֹדָעָה
-1, 0, 0.5אין לך הודעות.
1, 1.5יש לך הודעה.
2יש לך שתי הודעות.
2.5יש לך שתי הודעות.
5יש לך 5 הודעות.

4.3. עושה דברים טובים יותר

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

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

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

לדוגמה, בגרסה האנגלית, נניח את המחרוזת הבאה:

label = בתאריך {0, תאריך, מלא} {1} שלח לך + {2, בחירה, 0 # כלום | 1 # הודעה | 2 # שתי הודעות | 2 <{2, מספר, שלם} הודעות}.

עלינו לשנות מעט את הגרסה הצרפתית בגלל מקרה ההודעה האפס:

label = {0, תאריך, קצר}, {1} 0 <vous a voyé + {2, choice, 0 # aucun message | 1 # un message | 2 # deux messages | 2 <{2, number, integer} הודעות} .

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

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

4.4. טיפול נמרץ MessageFormat

בואו נשתמש ב- רכיבים בינלאומיים ל- Unicode ספריית (ICU). כבר הזכרנו את זה בהדרכה שלנו המרת מחרוזת לכותרת. זהו פתרון בוגר ונמצא בשימוש נרחב המאפשר לנו להתאים אישית את היישום לשפות שונות.

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

בעת כתיבת שורות אלה, הגרסה האחרונה של ICU עבור Java (ICU4J) הוא 64.2. כרגיל, כדי להתחיל להשתמש בו, עלינו להוסיף אותו כתלות בפרויקט שלנו:

 com.ibm.icu icu4j 64.2 

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

נאנגליתפולני
0אליס לא שלחה לך שום הודעות.

בוב לא שלח לך שום הודעות.

Alice nie wysłała ci żadnej wiadomości.

Bob nie wysłał ci żadnej wiadomości.

1אליס שלחה לך הודעה.

בוב שלח לך הודעה.

אליס וויסלנה ci wiadomość.

Bob wysłał ci wiadomość.

> 1אליס שלחה לך הודעות N.

בוב שלח לך הודעות N.

אליס וויסלנה ci N wiadomości.

Bob wysłał ci N wiadomości.

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

בואו נשתמש בקובץ מחדש formats.properties ולהוסיף שם מפתח label-icu עם התוכן הבא:

label-icu = {0} שלח לך + {2, רבים, = 0 {אין הודעות} = 1 {הודעה} + {{2, מספר, מספר שלם} הודעות}} אחרות.

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

אובייקט [] data = אובייקט חדש [] {"אליס", "נקבה", 0}

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

label-icu = {0} {2, רבים, = 0 {nie} אחר {}} + {1, בחר, זכר {wysłał} נקבה {wysłała} אחר {wysłało}} + ci {2, רבים, = 0 { żadnych wiadomości} = 1 {wiadomość} + אחר {{2, מספר, שלם} wiadomości}}.

אנו משתמשים בו על מנת להבחין בין wysłał / wysłała / wysłało.

5. מסקנה

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

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


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