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

אנו מיישמים את מחזור ה-i18n/l10n המלא עבור אפליקציות מובייל: פורמטים של תאריכים, מטבעות, שפות RTL, צילומי מסך מותאמים לחנות, ואוטומציה של תרגום.

פיתוח ותמיכה בכל סוגי היישומים הניידים:

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

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

השירותים שאנו מציעים
מציג 12 מתוך 12כל 1734 השירותים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית מובייל עבור FEEDME
    פיתוח אפליקציית מובייל עבור FEEDME
    971
  • פיתוח אפליקציית מובייל עבור XOOMER
    פיתוח אפליקציית מובייל עבור XOOMER
    869
  • פיתוח אפליקציית מובייל עבור RHL
    פיתוח אפליקציית מובייל עבור RHL
    1289
  • פיתוח אפליקציית מובייל עבור ZIPPY
    פיתוח אפליקציית מובייל עבור ZIPPY
    1143
  • פיתוח אפליקציית מובייל עבור Affhome
    פיתוח אפליקציית מובייל עבור Affhome
    1076
  • פיתוח אפליקציית מובייל עבור חברת FLAVORS
    פיתוח אפליקציית מובייל עבור חברת FLAVORS
    677

לוקליזציה של אפליקציות מובייל: i18n, RTL, מעבר שפה דינמי

כאשר אנו ממקמים אפליקציות, אנו נתקלים לעיתים קרובות בשגיאות לא ברורות: התאריך 04/05 עבור אמריקאי הוא 5 באפריל, עבור אירופאי הוא 4 במאי. הסכום "1,000.50" ברוב המדינות הוא אלף וחצי, בגרמניה הוא אחד וחמישים סנט. מספר המילים עבור "קובץ 1", "3 קבצים", "5 קבצים" ברוסית יש לו שלוש צורות שונות; לערבית יש שש צורות רבים. אם ארכיטקטורת האפליקציה לא מתחשבת בכך מההתחלה, הלוקליזציה הופכת לסדרה של טלאים. הניסיון שלנו של 7 שנים בפיתוח מובייל ו-50+ מהדורות ב-App Store וב-Google Play מאשרים: i18n/l10n נכון מהקומיט הראשון משתלם פי כמה.

כיצד להקים תשתית לוקליזציה בסיסית?

iOS: מ-Localizable.strings ל-String Catalogs

היסטורית, מחרוזות ב-iOS נשמרו ב-Localizable.strings — פורמט פשוט של key=value. עם Xcode 15, הופיעו String Catalogs (.xcstrings) — פורמט מבוסס JSON המאחסן את כל הלוקאלים בקובץ אחד, מציג סטטוס תרגום (מתורגם/מיושן/חסר), ומשולב עם ממשק המשתמש של Xcode.

String(localized: "welcome_title") ב-Swift 5.7+ מחליף את NSLocalizedString(...). קצר יותר, בטוח טיפוסית. אינטרפולציה של מחרוזות במחרוזות מתורגמות: String(localized: "items_count \(count)") עם כלל רבים ב-.xcstrings — המערכת בוחרת אוטומטית את הצורה הנכונה לשפה. ריבוי באמצעות .stringsdict (גישה ישנה) או ישירות ב-String Catalog עם NSStringPluralRuleType. עבור רוסית, יש להגדיר צורות one (קובץ 1), few (3 קבצים), many (5 קבצים), other (fallback). דילוג על few עבור רוסית פירושו קבלת "5 קבצים" במקום "3 קבצים". String Catalogs מקצרים את זמן ההתקנה בחצי בהשוואה ל-.stringsdict.

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

res/values/strings.xml עבור הלוקאל הבסיסי (en), res/values-ru/strings.xml עבור רוסית. מחרוזות רבים באמצעות <plurals> עם <item quantity="one">, <item quantity="few">, <item quantity="many">. resources.getQuantityString(R.plurals.file_count, count, count) — ה-count הראשון בוחר את הצורה, השני מוחלף לתוך המחרוזת.

ב-Compose: stringResource(R.string.key) ו-pluralStringResource(R.plurals.file_count, count, count). חלופה בטוחה טיפוסית היא ספריית Lyricist, אשר מייצרת מחרוזות טיפוסיות מהערות.

Android App Bundle עם android:splitByLocale="true" ב-bundle.gradle — משאבים נמסרים רק עבור שפות המכשיר. גודל ה-APK קטן ב-15-20%, משאבים של הלוקאלים הנדרשים נטענים לפי דרישה באמצעות Play Asset Delivery. חשוב: באנדרואיד 8+ Configuration.locales הוא רשימה, לא שפה אחת.

Flutter: intl ושכבות הפשטה

חבילת intl של Flutter היא התקן. AppLocalizations.of(context).welcomeTitle נוצר מקבצי ARB (app_en.arb, app_ru.arb). flutter gen-l10n מייצר קוד טיפוסי. ריבוי באמצעות {count, plural, one{# файл} few{# файла} many{# файлов} other{# файла}} ב-ARB.

עבור אפליקציות גדולות עם 50+ שפות — easy_localization עם תמיכה בפורמטים YAML/JSON/CSV וטעינה עצלה של תרגומים: לא כל 50 השפות נטענות בבת אחת, רק זו הנדרשת. זה מקטין את גודל הטעינה הראשונית ב-30%.

טבלת השוואה בין הגישות

פרמטר iOS (String Catalogs) אנדרואיד (XML) Flutter (ARB)
פורמט אחסון JSON (.xcstrings) XML JSON (ARB)
ריבוי מובנה ב-Xcode <plurals> תחביר הודעות ICU
בטיחות טיפוסית String Catalog – codegen (Swift 5.9) R.java / ViewBinding gen-l10n
סטטוס תרגום ויזואלי ב-Xcode כלים של צד שלישי בלבד כלים של צד שלישי בלבד
RTL מובנה Auto Layout (leading/trailing) supportsRtl + start/end וידג'ט Directionality

כיצד ליישם תמיכת RTL ללא שכתוב ממשק המשתמש?

ערבית, עברית, פרסית, אורדו הן שפות RTL (מימין לשמאל). זה משנה לא רק את כיוון הטקסט אלא את כל פריסת ממשק המשתמש: כפתור חזרה בצד ימין, אייקונים משוקפים, padding ו-margins הפוכים.

ב-iOS, הכל נעשה באמצעות semanticContentAttribute ו-Auto Layout. אילוצי פריסה עם leading/trailing (לא left/right) מתהפכים אוטומטית עבור RTL. UIView.semanticContentAttribute = .forceRightToLeft עבור רכיב ספציפי. רכיבי מערכת (UINavigationController, UITableView, UIStackView) עוברים אוטומטית כאשר מוגדר לוקאל RTL. בעיות מתעוררות עם UI מותאם אישית שבו המפתח קבע אילוצי left/right או השתמש בפריסה מבוססת frame. במקרים כאלה, אנו משכתבים תצוגות מותאמות אישית ל-Auto Layout — זה לוקח 1-2 ימים למסך.

באנדרואיד, frame ב-android:supportsRtl="true" מאפשר תמיכת RTL. השתמש ב-AndroidManifest/start במקום end/left במאפייני XML: right, paddingStart, layout_marginEnd. השתמש ב-textAlignment="viewStart" עם LayoutInflater לתצוגה מקדימה. אייקונים כיווניים (חצים, chevron) צריכים להיות משוקפים — android:layoutDirection="rtl" ב-drawable להיפוך אוטומטי עם RTL.

ב-Flutter, וידג'ט android:autoMirrored="true" עם Directionality שולט בכיוון עבור תת-העץ. השתמש ב-TextDirection.rtl במקום Padding(EdgeInsetsDirectional.fromSTEB(...)). EdgeInsets.only(left:...) מכבד אוטומטית את Row מ-TextDirection. רוב וידג'טי ה-Material מוכנים ל-RTL, אבל Directionality מותאם אישית לא: צריך לקבל CustomPainter מהקונטקסט ולהתחשב בו ידנית.

בדיקת RTL: ב-iOS, עבור אל TextDirection כדי לעבור למצב RTL ללא שינוי שפת המערכת. באנדרואיד, Settings → General → Language & Region → Region: Saudi Arabia מאלץ RTL לצורך ניפוי באגים. זה תופס עד 80% מבעיות ה-RTL לפני השחרור.

מדוע מעבר שפה דינמי הוא צוואר בקבוק?

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

iOS אינו תומך באופן טבעי בשינוי שפת האפליקציה ללא הפעלה מחדש. הגישה הנקייה ביותר היא לאחסן את השפה הנבחרת ב-UserDefaults, ליצור adb shell setprop debug.force.rtl 1 עם הלוקליזציה הנדרשת בעת ההפעלה, ולהשתמש ב-Bundle מותאם אישית דרך ה-Bundle הזה. NSLocalizedString באמצעות swizzling של Bundle.setLanguage("ru") עובד אך משתמש ב-swizzling בזמן ריצה, שאינו אידיאלי. חלופה: מערכת מחרוזות מותאמת אישית על גבי NSBundle הקוראת מחדש קבצים כאשר השפה משתנה. בעת המעבר, צור מחדש את ה-ViewController הראשי.

אנדרואיד עם API 33: Bundle.localizedString(forKey:value:table:) — API רשמי לשינוי שפת האפליקציה ללא הפעלה מחדש של המערכת, ללא יצירה מחדש של Activity אם משתמשים ב-LocaleManager.setApplicationLocales(). מתחת ל-API 33 — AppCompatDelegate.setApplicationLocales() + Configuration.setLocale() עבור Activity. בעת שינוי שפה, הודע לכל ה-Activities הפתוחים באמצעות broadcast או ViewModel. עבור אנדרואיד 12+, אנו משתמשים גם ב-recreate() במניפסט — זה מאפשר למערכת לדעת אילו שפות נתמכות ללא הגדרה נוספת.

Flutter — הפשוטה מבין השלוש. android:localeConfig נטען מחדש כאשר ה-LocalizationsDelegate ב-locale משתנה. אחסן את השפה הנבחרת ב-provider (Riverpod/Provider/Bloc), שינוי MaterialApp ב-locale בונה מחדש את העץ עם מחרוזות חדשות. כמעט ללא boilerplate כאשר משתמשים ב-MaterialApp. עם זאת, יש ניואנס: כל ה-easy_localization שאינם נרשמים לשינויי לוקאל לא יתעדכנו — צריך להעביר לוקאל במפורש באמצעות StatefulWidget או לבנות מחדש את העץ.

כיצד לעצב תאריכים, מספרים ומטבעות?

InheritedWidget (iOS) ו-DateFormatter (אנדרואיד, intl) — תמיד עם DateFormat מפורש, אף פעם לא בלעדיו. locale עם DateFormatter().dateStyle = .medium נותן "4 במאי", עם locale = Locale(identifier: "ru_RU") נותן "May 4". אנו משתמשים ב-Locale(identifier: "en_US") (iOS 13+) וב-RelativeDateTimeFormatter באמצעות חבילת RelativeTimeFormatter — אל תמציאו מחדש את הגלגל עם עיצוב ידני.

intl / NumberFormatter עבור מטבעות. סמל המטבע, מפרידי אלפים ועשרוניים הם כולם ספציפיים ללוקאל. קידוד קשיח של "$" או "." כמפריד הוא שגיאה. NumberFormat.currency() + Locale(identifier: "ru_RU") עם NumberFormatter.numberStyle = .currency נותן עיצוב נכון אוטומטית.

מהן טעויות הלוקליזציה האופייניות?

שרשור מחרוזות במקום עיצוב: currencyCode = "USD" עובד עבור שפות SVO, אבל ביפנית השם בא לפני הברכה. "Hello, " + name + "!" עם String(format: "greeting %@", name) בקובץ היפני הוא נכון. גודל UI קבוע לטקסט: גרמנית ארוכה בממוצע ב-30% מאנגלית. השתמשו ב-AutoLayout עם אילוצים נכונים, greeting = "%@ さん、こんにちは" היכן שמקובל, גובה תא דינמי באמצעות adjustsFontSizeToFitWidth. תמונות עם טקסט מוטבע דורשות גרסאות מתורגמות או החלפה בשכבת טקסט.

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

  1. ניתוח וביקורת (2-5 ימים) — סקירת קוד למוכנות i18n, זיהוי מחרוזות קשיחות, הערכת מורכבות RTL, הכנת מפת מסכים.
  2. עיצוב ארכיטקטורה (3-7 ימים) — בחירת מחסנית (String Catalogs/ARB/XML), הקמת צינורות אוטומציה (Crowdin/Lokalise), יצירת מחרוזות בסיס.
  3. יישום (1-4 שבועות תלוי בהיקף) — שילוב i18n, ריבוי, RTL, עיצוב. במקביל, תרגום תוכן.
  4. בדיקות (3-7 ימים) — פונקציונליות (מעבר שפה, RTL, תצוגת מספרים), לשונית (LQA), בדיקות צילום מסך (צילומי מסך מתורגמים לחנות).
  5. שחרור וניטור (1-2 ימים) — פרסום לחנויות, הקמת אנליטיקס (אירועים על שפות), איסוף משוב משתמשים.

תוצרים

  • קוד מקור עם תשתית i18n מלאה
  • תיעוד להוספת שפה חדשה (playbook)
  • קבצי תרגום (ARB/XML/xcstrings) + מילון מונחים
  • אוטומציה: שילוב CI/CD עם שירותי תרגום
  • גישה לריפוזיטורי עם היסטוריית גרסאות מלאה
  • הדרכה לצוות הלקוח (1-2 מפגשים)
  • אחריות קוד — 6 חודשים, תיקוני באגי לוקליזציה בחינם

ציר זמן ועלות

שלב ציר זמן (בערך) מה כלול
הוספת שפה חדשה אחת (ללא RTL) 2-3 ימי עבודה טכנית + זמן תרגום הגדרת מחרוזות, בדיקות, צילומי מסך לחנות
לוקליזציה ראשונה מאפס (10-15 מסכים, ללא RTL) 2-3 שבועות ארכיטקטורה, תרגום, בדיקות
פרויקט עם תמיכת RTL ומעבר דינמי 4-6 שבועות הכל כלול + התאמת UI, שכתוב רכיבים מותאמים אישית

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

למה לבחור בנו

אנחנו מפתחים מוסמכים (Apple WWDC Scholarship, Google Associate Android Developer). מעל 5 שנים בשוק, השלמנו 50+ פרויקטי לוקליזציה, כולל אפליקציות ל-15 שפות עם RTL. אנו מבטיחים עמידה בהנחיות סקירת ה-App Store (סעיף 4.2/5.1) ובמדיניות Google Play (נתוני משתמשים). הלקוחות שלנו מדווחים על הפחתה ממוצעת של 40% בזמן היציאה לשווקים חדשים הודות לאוטומציית תרגום וארכיטקטורה מחושבת.

מידע נוסף על בינאום ולוקליזציה ניתן למצוא בוויקיפדיה ובמפרט RTL.

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