סקירה כללית על פתרון בעיות בשפה ובלוקאל

החל מ-Android 7.0 (רמת API 24), Android מספק תמיכה משופרת למשתמשים שדוברים כמה שפות, כך שהוא יוכל לבחור כמה לוקאלים בהגדרות. במכשירי Android מספקת את היכולת הזו על ידי הרחבה משמעותית של מספר הלוקאלים הנתמכים ושינוי האופן שבו המערכת מטפלת במשאבים.

המסמך הזה מתחיל בהסבר על האסטרטגיה לפתרון משאבים ב: גרסאות Android שקודמות לגרסה 7.0 (רמת API 24). בשלב הבא נתאר את האסטרטגיה המשופרת של רזולוציית המשאבים ב-Android 7.0. לבסוף, הוא מסביר איך לנצל את היתרונות של את המספר הרחב של לוקאלים כדי לתמוך ביותר משתמשים שדוברים כמה שפות.

אתגרים בפתרון של משאבי שפה

לפני Android 7.0, לא תמיד ניתן היה להפעיל את Android התאמה בין הלוקאלים של האפליקציה והמערכת.

לדוגמה, נניח שמתקיים המצב הבא:

  • שפת ברירת המחדל של האפליקציה שלך היא en_US (אנגלית ארה"ב), וגם יש בה מחרוזות בספרדית שמותאמות לשוק המקומי בes_ES קובצי משאבים.
  • המכשיר מוגדר ל-es_MX

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

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

טבלה 1. רזולוציית המשאבים ללא התאמה מדויקת של הלוקאל.

הגדרות משתמש משאבי אפליקציות יישוב משאבים
fr_CH ברירת מחדל (en)
de_DE
es_ES
fr_FR
it_IT
כדאי לנסות fr_CH => הפעולה נכשלה
לנסות fr => הפעולה נכשלה
שימוש בברירת המחדל (en)

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

שיפורים באסטרטגיה לפתרון משאבים

מערכת Android 7.0 (רמת API 24) מספקת רזולוציית משאבים יעילה יותר, מוצאת חלופות טובות יותר באופן אוטומטי. עם זאת, כדי לזרז את הרזולוציה ולשפר רצוי לאחסן משאבים בדיאלקט ההורה הנפוץ ביותר. לדוגמה, אם אחסנתם משאבים בספרד בספרייה values-es-rUS לפני כן, להעביר אותם לספרייה values-b+es+419, שמכיל ספרדית של אמריקה הלטינית. באופן דומה, אם יש לכם מחרוזות משאבים ספרייה בשם values-en-rGB, שינוי השם הספרייה אל values-b+en+001 (בינלאומי באנגלית), מכיוון שהתשובה רכיב ההורה של en-GB מחרוזות הוא en-001. הדוגמאות הבאות מסבירות למה השיטות האלה משפרות את הביצועים, והאמינות של פתרון המשאבים.

דוגמאות לרזולוציית משאבים

בגרסאות Android מתקדמות יותר מ-7.0, המקרה שמתואר כאן העיצוב של טבלה 1 שונה:

טבלה 2. אסטרטגיית פתרון משופרת למקרים שבהם אין התאמה מדויקת למיקום.

הגדרות משתמש משאבי אפליקציות יישוב משאבים
  1. fr_CH
ברירת מחדל (en)
de_DE
es_ES
fr_FR
it_IT
כדאי לנסות fr_CH => הפעולה נכשלה
לנסות fr => הפעולה נכשלה
כדאי לנסות ילדי fr => fr_FR
שימוש ב-fr_FR

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

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

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

הגדרות משתמש משאבי אפליקציות יישוב משאבים
  1. fr_CH
  2. it_CH
ברירת מחדל (en)
de_DE
es_ES
it_IT
כדאי לנסות fr_CH => הפעולה נכשלה
לנסות fr => הפעולה נכשלה
כדאי לנסות ילדי fr => הפעולה נכשלה
נסה אותו_CH => הפעולה נכשלה
לניסיון => הפעולה נכשלה
כדאי לנסות ילדים => it_IT
השתמש בזה_IT

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

עיצוב האפליקציה כך שתתמוך בלוקאלים נוספים

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

לציין את השפות שהאפליקציה תומכת בהן

כדי להבטיח ששפות תקינות יטופלו כראוי, יש לציין את השפות שהאפליקציה תומכת בהן באמצעות המאפיין resConfigs בקובץ build.gradle ברמת המודול.

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

מגניב

android {
    defaultConfig {
        ...
        resConfigs "en", "es"
    }
}

Kotlin

android {
    defaultConfig {
        ...
        resConfigs("en", "es")
    }
}
בגלל האופן שבו מערכת ה-build ממזגת משאבים מהאפליקציה ויחסי התלות שלה, עליך לציין שפות נתמכות באופן הזה כדי להבטיח שהגדרות השפה של המשתמש יתקבלו כראוי.

ממשק API של LocaleList

החל מ-Android 7.0 (רמת API 24), מערכת Android חושפת את API של LocaleList.getDefault() שמאפשר לאפליקציות לשלוח שאילתות ישירות על רשימת השפות שהמשתמש ציין. ה-API הזה מאפשרת ליצור התנהגות באפליקציה ותצוגה אופטימלית של התוכן. לדוגמה, חיפוש Google יכול להציג תוצאות בכמה שפות בהתאם להגדרות המשתמש. אפליקציות דפדפן יכול להימנע מהצעה לתרגם דפים בשפה שהמשתמש כבר מכיר, ואפליקציות מקלדת יכולות להפעיל באופן אוטומטי את כל הפריסות המתאימות.

כלים לעיצוב

עד גרסה 6.0 של Android (רמת API 23), מערכת Android תומכת רק בגרסה אחת או שני לוקאלים בהרבה שפות נפוצות (en, es, ar, fr, ru). מכיוון שהיו רק כמה וריאציות לכל שפה, אפליקציות יכולות להימנע משמירת מספרים ותאריכים בתור מחרוזות בקידוד קשיח בקובצי משאבים. עם זאת, בזכות המערך המורחב של Android מקומי, יכולות להיות הבדלים משמעותיים בפורמטים של תאריכים, שעות, מטבעות ועוד גם בתוך אזור יחיד. ניתן לבצע קידוד קשיח של הפורמטים חוויה מבלבלת למשתמשי קצה. לכן, כשמפתחים ל-Android מגרסה 7.0 ואילך, חשוב להשתמש בעיצובים במקום במספרים בתוך הקוד ובמחרוזות תאריך.

לדוגמה, Android 7.0 ומעלה כולל תמיכה עבור 27 לוקאלים של ערביות. הלוקאלים האלה יכולים לשתף את רוב המשאבים אבל חלקם מעדיפים ספרות ASCII, בעוד שאחרים מעדיפים ספרות נייטיב. לדוגמה, כשרוצים ליצור משפט עם משתנה ספרה, כמו "יש לבחור קוד אימות בן 4 ספרות", יש להשתמש בעיצובים כפי שמוצג בהמשך:

 format(locale, "Choose a %d-digit PIN", 4)