כיצד לבצע לוקליזציה לאפליקציית Android באמצעות בינה מלאכותית
הגדירו תיקיות values/, תרגמו את strings.xml באמצעות בינה מלאכותית, החליפו שפות ב־Kotlin, ולאחר מכן העלו צילומי מסך כדי ש־PTC (Private Translation Cloud) תסקור את אפליקציית ה־Android הפועלת. בסוף המדריך הזה תהיה לכם אפליקציית Android רב-לשונית מוכנה להפצה, כשכל שפת יעד מאומתת באמצעות סקירה חזותית לפני השחרור.
מדריך זה מניח שיש לכם פרויקט Android קיים ב־Android Studio. אם אתם מתחילים מאפס, צרו תחילה פרויקט חדש באמצעות התבנית Empty Activity.
כיצד Android מפענחת משאבים מותאמים מתיקיות values-{locale}/
Android מארגנת משאבים מותאמים בתיקיות res/values-{locale}/ בתוך app/src/main/. תיקיית ברירת המחדל היא values/, המכילה את מחרוזות שפת המקור. כל שפת יעד מקבלת תיקיית values-{locale}/ משלה.
app/src/main/res/
values/strings.xml # source language (typically English) - REQUIRED
values-es/strings.xml # Spanish
values-fr/strings.xml # French
values-de/strings.xml # German
values-ja/strings.xml # Japanese
values-zh-rCN/strings.xml # Simplified Chinese (region-specific)
כללו תמיד את תיקיית values/ כברירת מחדל ללא קוד שפה. זוהי רשת הביטחון (fallback) שלכם. Android בוחרת את התיקייה הנכונה בזמן ריצה בהתאם להגדרות האזור (locale) במכשיר המשתמש. אם שפת המשתמש היא ספרדית אך אין לכם תיקיית values-es/, Android תחזור לשימוש בתיקיית values/. הנסיגה הזו מתבצעת בשקט. אפליקציה המתורגמת חלקית תציג אנגלית מעורבת בספרדית, ללא שגיאה.
קודי האזור עוקבים אחר תקן BCP 47. es לספרדית, pt-rBR לפורטוגזית ברזילאית (שימו לב לקידומת r עבור האזור), zh-rCN לסינית מפושטת.
העבירו כל מחרוזת הפונה למשתמש אל strings.xml
השתמשו תמיד במשאבי מחרוזת המאוחסנים ב־strings.xml. לעולם אל תכתבו טקסט קבוע (hardcode) ישירות בקוד Kotlin/Java או בתכונת פריסה מסוג android:text=. טקסט מקודד לא ניתן לתרגום.
העבירו כל מחרוזת הפונה למשתמש אל res/values/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Notes</string>
<string name="welcome_message">Welcome, %1$s!</string>
<string name="notes_count_zero">No notes yet</string>
<plurals name="notes_count">
<item quantity="one">%d note</item>
<item quantity="other">%d notes</item>
</plurals>
<string-array name="categories">
<item>Personal</item>
<item>Work</item>
<item>Travel</item>
</string-array>
</resources>
התייחסו לכל מחרוזת ב־Kotlin באמצעות מזהה ה־R.string.* שנוצר:
val appName = stringResource(R.string.app_name)
val welcome = stringResource(R.string.welcome_message, userName)
val counts = pluralStringResource(R.plurals.notes_count, notes.size, notes.size)
מוסכמות מפתח ש־PTC מכבדת:
- מצייני מיקום לפי מיקום. השתמשו ב־
%1$s, %2$d, %3$fבמקום ב־%s, %d. שפות מסוימות דורשות שינוי בסדר הארגומנטים. מצייני מיקום לפי מיקום מאפשרים זאת. PTC מזהה ומשמרת אותם באופן אוטומטי. <plurals>עבור שמות עצם ספירים. אל תכתבוif (count == 1) "1 note" else "$count notes"בקוד. השתמשו ב־<plurals>עם כמויות מסוגone/other/few/many. PTC מייצרת את קטגוריות הריבוי הנכונות לכל שפת יעד (צורה אחת ליפנית, 2 לאנגלית, 4 לפולנית, 6 לערבית).<string-array>עבור רשימות סטטיות. PTC מתרגמת כל פריט תוך שמירה על מבנה המערך.- השתמשו בתווי מילוט עבור גרשים (
\') ומרכאות (\") כדי למנוע שגיאות ניתוח XML.
תרגום strings.xml עם PTC ב־5 שלבים
- התחילו פרויקט PTC בלוח הבקרה שלכם. העלו את קובץ ה־
values/strings.xmlשלכם, הגדירו את נתיבי הפלט ובחרו שפות יעד. PTC תומכת ב־40+ שפות. במהלך תקופת הניסיון בחינם, תוכלו לבחור שתי שפות כלשהן. PTC משתמשת בשפת המקור כדי לבחור את מנוע תרגום המכונה הנכון וכדי לדלג על מחרוזות שבהן המקור זהה ליעד. - סקרו את תיאור האפליקציה שנוצר אוטומטית. PTC יוצרת תיאור קצר של אפליקציית ה־Android שלכם מהקובץ שהועלה. ערכו אותו כדי לתאר טוב יותר את האפליקציה ואת קהל היעד שלכם. PTC משתמשת בהקשר זה כדי להתאים את הטון והרשמיות הנכונים לכל שפה.
- העלו תרגומים קיימים (אופציונלי). אם כבר יש לכם קובצי
values-*/strings.xmlמתורגמים, העלו אותם כדי ש־PTC תוכל להתאים את עצמה לסגנון הקיים שלכם. אחרת, תרגמו מאפס. - תרגמו וסקרו. PTC מכבדת כל מפתח
name=(המפתחות שלכם לעולם לא משתנים), כל מציין מיקום לפי מיקום, ומייצרת את קטגוריות הריבוי הנכונות לכל יעד. אם תרגום חורג ממגבלות האורך שלכם, PTC מדגישה זאת כדי שדבר לא יתפספס. ערכו כל מחרוזת במקום או בקשו מ־PTC לתרגם מחדש תוך התחשבות במגבלה. - הורידו את קובצי ה־
strings.xmlהמתורגמים לכל שפה כקובץ ZIP. כל קובץ זהה מבחינה מבנית למקור שלכם. אותם מפתחות, אותם מערכים, אותן תגיות ריבוי. ערכים מתורגמים.
הכניסו את קובצי ה־strings.xml המתורגמים לתיקיות values-{locale}/
הכניסו כל קובץ מתורגם לתיקיית ה־values-{locale}/ המתאימה:
app/src/main/res/values-es/strings.xml # from PTC
app/src/main/res/values-fr/strings.xml # from PTC
app/src/main/res/values-de/strings.xml # from PTC
בנו מחדש את הפרויקט. Android תזהה את המשאבים החדשים באופן אוטומטי. כדי לאמת, שנו את שפת האמולטור או המכשיר והפעילו מחדש את האפליקציה. ממשק המשתמש אמור להופיע בשפה החדשה.
הוסיפו בורר שפות בתוך האפליקציה באמצעות AppCompatDelegate.setApplicationLocales()
אפליקציות רבות זקוקות לבורר שפות פנימי כדי שהמשתמשים יוכלו לעקוף את הגדרות האזור של המכשיר. החל מ־Android 13 (API 33), הגישה המקובלת משתמשת ב־AppCompatDelegate.setApplicationLocales():
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.os.LocaleListCompat
fun setAppLanguage(languageTag: String) {
val locales = LocaleListCompat.forLanguageTags(languageTag)
AppCompatDelegate.setApplicationLocales(locales)
}
// Usage in a settings screen
binding.spanishButton.setOnClickListener {
setAppLanguage("es")
}
binding.frenchButton.setOnClickListener {
setAppLanguage("fr")
}
כדי להצהיר באילו שפות האפליקציה שלכם תומכת (כך שבורר השפות של המערכת יציג אותן), הוסיפו קובץ locales_config.xml:
<!-- res/xml/locales_config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
<locale android:name="en"/>
<locale android:name="es"/>
<locale android:name="fr"/>
<locale android:name="de"/>
<locale android:name="ja"/>
</locale-config>
והתייחסו אליו ב־AndroidManifest.xml:
<application
android:localeConfig="@xml/locales_config"
... >
עבור אפליקציות המיועדות ל־Android 12 ומטה, הגישה הישנה יותר היא לשמור את בחירת המשתמש ב־SharedPreferences ולהחיל אותה בכל הפעלה של האפליקציה:
fun setLocale(context: Context, languageCode: String) {
// Save the user's choice
val prefs = context.getSharedPreferences("Settings", Context.MODE_PRIVATE)
prefs.edit().putString("app_language", languageCode).apply()
// Apply the new locale
val locale = Locale(languageCode)
Locale.setDefault(locale)
val config = Configuration()
config.setLocale(locale)
context.resources.updateConfiguration(config, context.resources.displayMetrics)
// Restart the activity so changes take effect
if (context is Activity) {
context.recreate()
}
}
לאחר מכן טענו את השפה השמורה בכל הפעלה של האפליקציה:
override fun onCreate() {
super.onCreate()
val prefs = getSharedPreferences("Settings", Context.MODE_PRIVATE)
val languageCode = prefs.getString("app_language", "en") ?: "en"
val locale = Locale(languageCode)
Locale.setDefault(locale)
val config = Configuration()
config.setLocale(locale)
resources.updateConfiguration(config, resources.displayMetrics)
}
זה נשמר בין הפעלות ועובד בצורה נכונה לאחר הפרסום ב־Google Play.
השתמשו ב־start/end (ולא left/right) עבור שפות הנכתבות מימין לשמאל
עבור ערבית, עברית, פרסית ואורדו, השתמשו ב־start ו־end במקום ב־left ו־right בפריסות שלכם, כך ש־Android תשקף את הפריסה באופן אוטומטי:
<!-- Instead of this -->
<TextView android:layout_marginLeft="16dp" />
<!-- Use this -->
<TextView android:layout_marginStart="16dp" />
ב־Jetpack Compose, השתמשו ב־Arrangement.Start במקום ב־Arrangement.Absolute.Left. הפעילו את האפשרות "Force RTL layout direction" ב־Developer Options כדי לבדוק את השיקוף מבלי לשנות את שפת המכשיר.
אוטומציה של תרגום Android בכל גרסה עם Git או ה־API של PTC
בפרויקטים פעילים, הרצה ידנית של התרגום בכל גרסה אינה יעילה. PTC מציעה שתי דרכים לאוטומציה.
אינטגרציית Git (מומלץ). עברו אל Settings > Merge Requests בלוח הבקרה של PTC ולחצו על Add Git Integration כדי לחבר את המאגר שלכם ב־GitHub, GitLab או Bitbucket. ספקו טוקן גישה עם הרשאות קריאה וכתיבה ובחרו את הענפים שעל PTC לנטר. משם, PTC תזהה שינויים, תתרגם מחרוזות חדשות או מעודכנות ותפתח merge request לסקירה שלכם.
אינטגרציית API. עברו אל Settings > Manage API Tokens וצרו טוקן גישה. לאחר מכן השתמשו ב־API של PTC בתוך ה־CI הקיים שלכם:
# .github/workflows/translate.yml
name: PTC translate
on:
push:
branches: [main]
paths:
- 'app/src/main/res/values/strings.xml'
jobs:
translate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Translate with PTC
run: |
cat > .ptc-config.yml <<'EOF'
source_locale: en
files:
- file: app/src/main/res/values/strings.xml
output: app/src/main/res/values-{{lang}}/strings.xml
EOF
curl -fsSL https://raw.githubusercontent.com/OnTheGoSystems/ptc-cli/main/ptc-cli.sh -o ptc-cli.sh
chmod +x ptc-cli.sh
./ptc-cli.sh --config-file .ptc-config.yml --api-token="${{ secrets.PTC_API_TOKEN }}"
הן אינטגרציית Git והן אינטגרציית API הן תכונות Pro הזמינות בעת הפעלת Pay-As-You-Go. עיינו ב־תיעוד ה־API של PTC עבור נקודות קצה, webhooks ומודל האינטגרציה המלא.
סקירת תרגום חזותית של אפליקציית ה־Android המתורגמת שלכם – הפצה ללא QA ידני לכל שפה
לאחר ש־PTC מתרגמת את קובץ ה־strings.xml שלכם, העבודה לא הסתיימה. תווית מתורגמת עלולה לחרוג מגבולות הכפתור בגרמנית. המילה "Submit" עשויה להיות מתורגמת כשם עצם בצרפתית כשממשק המשתמש זקוק לפועל. מחרוזת אנגלית מקודדת שמישהו שכח לעטוף ב־getString(R.string.welcome) תישאר לא מתורגמת באופן בולט באפליקציית ה־Android הפועלת. איתור בעיות אלו דורש באופן מסורתי סבב QA ידני בכל שפת יעד. זהו השלב האיטי והיקר ביותר בלוקליזציה למובייל.
ה־AI Visual QA של PTC מחליף את הסבב הזה. עבור אפליקציות Android נייטיב (שאינן פועלות בדפדפן, ולכן תהליך התוסף אינו חל עליהן), השתמשו בהעלאת צילומי מסך. צלמו את המסכים הקריטיים של האפליקציה הפועלת בכל שפת יעד (הגדרות, זרימה ראשית, מקרי קצה) והעלו אותם ל־PTC. ה־AI החזותי של PTC יבחן כל מסך וידווח בחזרה:
- בעיות ש־PTC יכולה לתקן ב־
strings.xml. PTC תתרגם מחדש את הפועל במשמעות הנכונה, תבחר מילה נרדפת קצרה יותר שמתאימה לרוחב הכפתור, ותייצר מחדש ריבוי שמתחשב במגבלות הפריסה. PTC תפתח PR עם התיקונים. זה לא דורש מכם שום עבודה. - בעיות שנמצאות בקוד ה־Kotlin שלכם. עטיפת
getString()חסרה, מחרוזות מקודדות, או שרשור משפטים שצריך להשתמש ב־String.format()עם מצייני מיקום. PTC תייצר פרומפט מוכן להדבקה עבור Cursor או Claude Code. צוות הפיתוח שלכם יעטוף את המחרוזות תוך שניות.
התוצאה: אתם מפיצים אפליקציית Android מאומתת ורב-לשונית בכל גרסה. אתם לא מקבלים רק strings.xml מתורגם עם צורך ב-QA ידני משלים.
תרגמו את דף האפליקציה ב־Play Store, את הערות הגרסה ואת הודעות ה־Push
תיאור דף האפליקציה ב־Play Store, הערות הגרסה ("מה חדש") וטקסט הודעות ה־Push נמצאים מחוץ ל־strings.xml. תכונת Paste to Translate של PTC מטפלת בטקסטים אלו באותו פרויקט. הדביקו את טקסט המקור בלוח הבקרה של PTC, בחרו שפות יעד, וקבלו בחזרה תרגומים המשתמשים באותו מילון מונחים ובאותו טון מותג כמו המחרוזות בתוך האפליקציה. לאחר מכן, ב־Google Play Console, עברו אל Store Presence > Main Store Listing > Translations, הוסיפו את התיאורים הקצרים והארוכים המתורגמים ושמרו.
תרגום תוכן משתמש בתוך האפליקציה עם ה־API של PTC
צ'אט בתוך האפליקציה, פוסטים חברתיים וביקורות משתמשים זקוקים לתרגום עם הגעת התוכן. ה־REST API של PTC מתרגם תוכן זה לפי דרישה עם אימות Bearer-token, תוך שימוש באותו מילון מונחים וטון מותג כמו תרגומי ה־strings.xml שלכם.
בדיקת אפליקציית ה־Android המותאמת שלכם בכל גרסה
שנו את שפת המכשיר בהגדרות, או השתמשו בבורר השפות של האמולטור ב־Android Studio. עבור כל שפה, בדקו אם יש טקסט ארוך מדי עבור רכיבי ממשק המשתמש, תרגומים חסרים (חזרה שקטה לברירת המחדל), פורמט תאריך/מספר/מטבע שגוי ובעיות פריסה עם טקסט ארוך יותר. עבור שפות RTL, הפעילו את האפשרות "Force RTL layout direction" ב־Developer Options.
מחירון תרגום Android לאחר תקופת הניסיון בחינם
Pay-As-You-Go, ללא דמי מנוי. אתם משלמים רק על מה שאתם מתרגמים. 500 המילים הראשונות בכל חודש הן בחינם, והתעריף יורד ככל שמתרגמים יותר. השתמשו במחשבון המחירים לקבלת הערכה.
עכשיו תרגמו את אפליקציית ה־Android האמיתית שלכם
התחילו את תקופת הניסיון של 30 יום בחינם – 20,000 מילים ל־2 שפות, ללא כרטיס אשראי. העלו את קובץ ה־strings.xml שלכם, תרגמו אותו תוך דקות, ולאחר מכן העלו צילומי מסך ותנו ל־PTC לאמת את האפליקציה הפועלת.
נושאים קשורים:
- תרגום אפליקציות iOS ו־Android באמצעות בינה מלאכותית – סקירת שירות עבור צוותים רב-פלטפורמיים.
- כיצד לבצע לוקליזציה לאפליקציית ה־iOS שלכם – המדריך המקביל עבור Xcode ו־SwiftUI.
- תיעוד ה־API של PTC – נקודות קצה REST לאינטגרציית CI.