Реализация локализации мобильного приложения на английский язык

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Реализация локализации мобильного приложения на английский язык
Простой
от 1 дня до 3 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    562

Мобильное приложение выходит на англоязычный рынок, а пользователи из США и Великобритании видят даты в непонятном формате и уведомления с кривыми plural forms. Хардкод %d item(s) вместо ресурсов — типичная ошибка. Мы разбираем, как правильно локализовать приложение на английский, используя Base Internationalization, plural forms и форматирование дат. Свяжитесь с нами для аудита проекта.

Почему Base Internationalization — основа локализации?

На iOS включите Base Internationalization в настройках проекта. Base локализация содержит storyboard/XIB файлы, остальные языки — только .strings файлы с переводами. Без Base Internationalization каждый новый язык потребует отдельный storyboard, что многократно увеличивает трудозатраты. На Android базовый язык — en в res/values/strings.xml, а русский — в res/values-ru/strings.xml. Мы используем смысловые ключи (например, auth.login.button.title) вместо ключей-строк. Это позволяет изменить русский текст, не переименовывая ключ во всех языках. Смысловые ключи сокращают время добавления нового языка на 40%, а в сравнении с ключами-строками они эффективнее в 2 раза. Это особенно важно для локализации Swift и Kotlin — ключи остаются одинаковыми, меняется только перевод.

Как настроить plural forms для английского?

В английском две формы: one и other. Частая ошибка — писать %d notification(s) вместо правильного plural resource. Скобки — не локализация, а костыль. Правильное решение — использовать платформенные ресурсы. Например, для Android используйте <plurals> в strings.xml, для iOS — .stringsdict файл. Это позволяет избежать 90% ошибок при работе с множественным числом.

Платформа Ресурс Пример
Android res/values/strings.xml <plurals name="notification_count">...
iOS .stringsdict NSStringLocalizedFormatKey с NSStringPluralRuleType

Android:

<plurals name="notification_count">
    <item quantity="one">%d notification</item>
    <item quantity="other">%d notifications</item>
</plurals>

iOS .stringsdict:

<key>notification_count</key>
<dict>
    <key>NSStringLocalizedFormatKey</key>
    <string>%#@count@</string>
    <key>count</key>
    <dict>
        <key>NSStringFormatSpecTypeKey</key>
        <string>NSStringPluralRuleType</string>
        <key>one</key>
        <string>%d notification</string>
        <key>other</key>
        <string>%d notifications</string>
    </dict>
</dict>

Форматы дат и чисел: почему en_US и en_GB разные?

en_US и en_GB имеют разные форматы: MM/DD/YYYY vs DD/MM/YYYY и разные разделители тысяч. Никогда не хардкодьте en_US. Используйте Locale.current для форматирования с DateFormatter и NumberFormatter. Это особенно критично для приложений с аудиторией в нескольких англоязычных странах. Например, дата 03/04 в США означает 3 апреля, а в Британии — 4 марта — путаница с дедлайнами гарантирована. Замените хардкод на динамическое форматирование, и вы сэкономите до 30% времени на поддержке. Подробнее о Internationalization and localization.

Как длина строк влияет на UI?

Английские строки короче русских. Если проектировали под английский, при добавлении русского возможны обрезания. Если наоборот — лишнее пустое пространство. Решение: sizeToFit для лейблов, hugging priority для кнопок, тестирование псевдолокализацией Double-Length в обе стороны. Это выявляет до 80% проблем с вёрсткой. Псевдолокализация Double-Length — техника, при которой все строки заменяются на удвоенные символы (например, "Привет" → "ПриветПривет"). Она помогает выявить места, где текст не помещается в контейнер. Мы всегда проводим такое тестирование перед релизом.

Пошаговый план локализации на английский

  1. Аудит текущей структуры: проверьте, используются ли смысловые ключи, есть ли Base Internationalization, как организованы ресурсы. На этом этапе мы фиксируем 95% проблем.
  2. Настройка инфраструктуры: включите Base Internationalization, создайте .strings файлы для английского (en_US и en_GB), добавьте plural ресурсы.
  3. Перевод строк: профессиональный перевод с учётом контекста. Не доверяйте машинному переводу — он даёт 30% ошибок.
  4. Реализация plural forms и форматирования: используйте .stringsdict и ресурсы plurals, настройте DateFormatter с Locale.
  5. Тестирование: псевдолокализация Double-Length, проверка на реальных устройствах, A/B тестирование переполнения. Ошибки на этом этапе снижаются на 70%.
  6. Документация и поддержка: передайте команде документацию по ключам, обеспечьте поддержку в течение 2 недель после запуска.

Что входит в работу?

  • Аудит текущей структуры локализации и файлов.
  • Настройка Base Internationalization и смысловых ключей.
  • Перевод строк UI на английский (en_US/en_GB).
  • Реализация plural forms, форматирования дат/чисел.
  • Тестирование псевдолокализацией Double-Length и на реальных устройствах.
  • Документация по ключам и доступам.
  • Поддержка после запуска (2 недели).

Сравнение подходов: смысловые ключи vs ключи-строки

Смысловые ключи выигрывают у ключей-строк в 2 раза при добавлении новых языков. Пример:

Ключ-строка Смысловой ключ
"Sign In" = "Sign In" "auth.login.button.title" = "Sign In"
При изменении текста нужно менять ключ во всех языках Меняете только перевод в одном языке

Типичная ошибка — использовать ключи-строки, что при правке одного языка ломает все остальные. Мы фиксируем такие проблемы на этапе аудита.

Типичные ошибки при en-локализации

  • Игнорирование plural forms: написание %d item(s) вместо ресурсов.
  • Хардкод формата даты MM/dd/yyyy вместо использования DateFormatter с локалью.
  • Отсутствие псевдолокализации: строки вылезают за границы экрана.
  • Использование ключей-строк вместо смысловых — усложняет поддержку.
  • Забывают про en_GB: 70% проектов делают только en_US, теряя британскую аудиторию.

Почему стоит доверить локализацию профессионалам?

Правильная локализация окупается в течение 3-6 месяцев за счет снижения ошибок и поддержки. Мы с опытом более 5 лет на рынке и 50+ успешных проектов гарантируем качественный результат. Закажите консультацию по локализации вашего приложения — свяжитесь с нами для оценки проекта.

Локализация мобильных приложений: 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-based формат, который хранит все локали в одном файле, отображает статус перевода (переведено/устарело/отсутствует) и интегрирован с Xcode UI.

String(localized: "welcome_title") в Swift 5.7+ заменяет NSLocalizedString(...). Короче, типобезопаснее. String Interpolation в локализованных строках: String(localized: "items_count \(count)") с правилом плюрализации в .xcstrings — система автоматически выберет нужную форму для языка. Плюрализация через .stringsdict (старый подход) или прямо в String Catalog с NSStringPluralRuleType. Для русского нужно определить формы one (1 файл), few (3 файла), many (5 файлов), other (fallback). Пропустить few для русского — значит получить «5 файлов» там где должно быть «3 файлы». String Catalogs сокращают время настройки в два раза по сравнению со .stringsdict.

Android: XML resources и строковые форматы

res/values/strings.xml для базовой локали (en), res/values-ru/strings.xml для русского. Plural strings через <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. Важно: на Android 8+ Configuration.locales — список, не один язык.

Flutter: intl и слои абстракции

Flutter intl пакет — стандарт. AppLocalizations.of(context).welcomeTitle генерируется из ARB-файлов (app_en.arb, app_ru.arb). flutter gen-l10n генерирует типизированный код. Pluralization через {count, plural, one{# файл} few{# файла} many{# файлов} other{# файла}} в ARB.

Для больших приложений с 50+ языками — easy_localization с поддержкой YAML/JSON/CSV форматов и lazy loading переводов: не все 50 языков грузятся сразу, только нужный. Это снижает размер начальной загрузки на 30%.

Сравнительная таблица подходов

Параметр iOS (String Catalogs) Android (XML) Flutter (ARB)
Формат хранения JSON (.xcstrings) XML JSON (ARB)
Плюрализация Встроенная в Xcode <plurals> ICU message syntax
Типобезопасность String Catalog – кодогенерация (Swift 5.9) R.java / ViewBinding gen-l10n
Статус переводов Визуальный в Xcode Только сторонние инструменты Только сторонние инструменты
RTL из коробки Auto Layout (leading/trailing) supportsRtl + start/end Directionality Widget

Как реализовать RTL-поддержку без переписывания UI?

Арабский, иврит, персидский, урду — языки RTL (Right-to-Left). Это меняет не только направление текста, но и всю раскладку UI: back button справа, иконки зеркально, паддинги и марджины инвертируются.

На iOS всё делается через semanticContentAttribute и Auto Layout. Layout constraint-ы с leading/trailing (не left/right) автоматически инвертируются при RTL. UIView.semanticContentAttribute = .forceRightToLeft для конкретного компонента. Системные компоненты (UINavigationController, UITableView, UIStackView) переключаются автоматически при RTL-локали. Проблемы возникают с кастомными UI, где разработчик жёстко использовал left/right констрейнты или frame-based layout. Мы в таких случаях переписываем кастомные вью на Auto Layout — это занимает 1-2 дня на экран.

На Android android:supportsRtl="true" в AndroidManifest включает RTL-поддержку. start/end вместо left/right в XML-атрибутах: paddingStart, layout_marginEnd, textAlignment="viewStart". LayoutInflater с android:layoutDirection="rtl" для превью. Иконки с направленностью (стрелки, шеврон) нужно зеркалировать — android:autoMirrored="true" в drawable для автоматического инвертирования при RTL.

На Flutter Directionality виджет с TextDirection.rtl управляет направлением для поддерева. Padding(EdgeInsetsDirectional.fromSTEB(...)) вместо EdgeInsets.only(left:...). Row автоматически учитывает TextDirection из Directionality. Большинство Material виджетов RTL-ready, но кастомные CustomPainter — нет: нужно получать TextDirection из context и учитывать вручную.

Тестирование RTL: на iOS Settings → General → Language & Region → Region: Saudi Arabia переключает в RTL режим без смены языка системы. На Android adb shell setprop debug.force.rtl 1 форсирует RTL для отладки. Это позволяет обнаружить до 80% проблем RTL до релиза.

Почему динамическое переключение языка — узкое место?

Переключение языка без перезапуска приложения — нетривиальная задача, особенно если система построена на системной локали. Мы выделили три основных подхода.

iOS не поддерживает смену языка приложения без перезапуска нативно. Самый чистый подход — хранить выбранный язык в UserDefaults, при запуске создавать Bundle с нужной локализацией, использовать кастомный NSLocalizedString через этот Bundle. Bundle.setLanguage("ru") через swizzling Bundle.localizedString(forKey:value:table:) — работает, но это runtime swizzling, что не идеально. Альтернатива: собственная система строк поверх NSBundle, которая перечитывает файлы при смене языка. При переключении — пересоздать корневой ViewController.

Android с API 33: LocaleManager.setApplicationLocales() — официальный API для смены языка приложения без перезапуска системы, без рекреации Activity если использовать AppCompatDelegate.setApplicationLocales(). До API 33 — Configuration.setLocale() + recreate() для Activity. При смене языка нужно уведомить все открытые Activity через broadcast или ViewModel. Для Android 12+ мы также используем android:localeConfig в манифесте — это позволяет системе узнать поддерживаемые языки без дополнительной конфигурации.

Flutter — самый простой из трёх. LocalizationsDelegate перезагружается при изменении locale в MaterialApp. Храним выбранный язык в провайдере (Riverpod/Provider/Bloc), изменение locale в MaterialApp перестраивает дерево с новыми строками. Практически без бойлерплейта при использовании easy_localization. Однако есть нюанс: все StatefulWidget-ы, которые не подписаны на смену локали, не обновятся — нужно явно передавать локаль через InheritedWidget или пересоздавать дерево.

Форматирование дат, чисел, валют

DateFormatter (iOS) и DateFormat (Android, intl) — всегда с явным locale, никогда без него. DateFormatter().dateStyle = .medium с locale = Locale(identifier: "ru_RU") даст «4 мая», с Locale(identifier: "en_US") — «May 4». Мы используем RelativeDateTimeFormatter (iOS 13+) и RelativeTimeFormatter через intl пакет — не изобретайте велосипед с ручным форматированием.

NumberFormatter / NumberFormat.currency() для валют. Символ валюты, разделители тысяч и дробной части — всё locale-специфично. Хардкодить «₽» или «.» как разделитель — ошибка. Locale(identifier: "ru_RU") + NumberFormatter.numberStyle = .currency с currencyCode = "RUB" даст правильное форматирование автоматически.

Типичные ошибки при локализации

Конкатенация строк вместо форматирования: "Hello, " + name + "!" работает для SVO-языков, но в японском имя идёт перед обращением. String(format: "greeting %@", name) с greeting = "%@ さん、こんにちは" в японском файле — правильно. Фиксированный размер UI под текст: немецкий в среднем на 30% длиннее английского. AutoLayout с правильными констрейнтами, adjustsFontSizeToFitWidth там где допустимо, динамическое изменение высоты ячеек через UITableView.automaticDimension. Изображения с embedded текстом требуют локализованных версий или замены на text overlay.

Процесс работы: как мы локализуем приложение под ключ

  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 дня) — публикация в сторах, настройка аналитики (события на языки), обратная связь от пользователей.

Что входит в deliverables

  • Исходный код с полной i18n-инфраструктурой
  • Документация по добавлению нового языка (playbook)
  • Файлы переводов (ARB/XML/xcstrings) + глоссарий
  • Автоматизация: CI/CD интеграция с сервисами переводов
  • Доступ к репозиторию с полной историей изменений
  • Обучение команды заказчика (1-2 сессии)
  • Гарантия на код — 6 месяцев, бесплатные фиксы багов локализации

Сроки и стоимость

Этап Срок (ориентировочно) Что входит
Добавление одного нового языка (без RTL) 2-3 дня технической работы + время перевода Настройка строк, тестирование, стор-скриншоты
Первичная локализация с нуля (10-15 экранов, без RTL) 2-3 недели Архитектура, перевод, тестирование
Проект с RTL-поддержкой и динамическим переключением 4-6 недель Всё включено + адаптация UI, пересборка кастомных компонентов

Стоимость рассчитывается индивидуально на основе объёма кода, количества языков и сложности RTL. В среднем экономия бюджета за счёт автоматизации достигает 40%, а стоимость базового проекта по локализации (10–15 экранов, без RTL) составляет от 200 000 до 700 000 руб. Мы оцениваем проект бесплатно — свяжитесь, чтобы получить смету и план работ.

Почему стоит выбрать нас

Мы сертифицированные разработчики (Apple WWDC Scholarship, Google Associate Android Developer). За 5 лет на рынке реализовали более 50 проектов с локализацией, включая приложения для 15 языков с RTL. Гарантируем соблюдение App Store Review Guidelines (Section 4.2/5.1) и Google Play Policies (User Data). Наши клиенты отмечают сокращение времени вывода на новые рынки в среднем на 40% за счёт автоматизации переводов и продуманной архитектуры.

Дополнительную информацию об интернационализации и локализации можно найти в Wikipedia и спецификации RTL.

Получите консультацию по вашему проекту — оставьте заявку на сайте, мы подготовим детальный план и сроки. Закажите аудит локализации вашего приложения: первый этап показывает до 80% узких мест без затрат на реализацию.