Управление переводами

Over the Air (Strings)

Контент автоматически переведен с английского языка с помощью Phrase Language AI.

Одним щелчком мыши обновите переводы для приложений iOS, Android, React Native и Flutter, не выпуская новую версию в App Store или Google Play. Обновления для текстовых отметок мгновенно перебрасываются в мобильные приложения.

OTA_user_device_diagram.png

Обновление по воздуху (OTA) также интегрируется с платформами i18Next и Rails, позволяя пользователям обновить локализованный контент в веб-приложениях и управлять им, не требующий перераспределения.

Заказ на применение обновленных настроек требует создания нового релиза. Весь контент, входящий в релиз, должен быть доступен в Phrase Strings, которая передает переводы прямо в приложение. При отсутствии контента переводы не будут доставлены.

При первом запуске приложения, реализующего на устройстве iOS, Android, React Native или Flutter SDK, генерируется уникальный и случайный идентификатор устройства. Этот идентификатор отслеживает активных пользователей за заданный период времени. Он не используется для каких-либо других форм или средств отслеживания и не содержит никакой информации о пользователе или устройстве.

Единственным пределом обновления по воздуху (OTA) является количество ЕАП (активных пользователей в месяц) в зависимости от выбранного плана ценообразования.

MAU — это количество уникальных устройств, с которых запрашиваются переводы. Каждому устройству присваивается случайный Идентификатор, и ЕАП рассчитывается на основе количества различных идентификаторов, назначенных за последние 30 дней. Каждое взаимодействие с серверами phrase считается запросом.

Данные

SDK поддерживает связь с услугой обновлений по воздуху (OTA) для заказа обновлений и включает в себя следующие сведения при каждом запросе:

  • Идентификатор устройства (например, "F3AFCB10-80A2-84CB-94C0-27F5EF58876D". Уникальный вариант для этого приложения, поэтому не позволяет отслеживать конкретное устройство.)

  • Версия приложения (например "1.2.0")

  • Последнее обновить файл перевода (например "1542187679")

  • Версия SDK (например, "1.0.0")

  • Языковой стандарт (например, «de-DE»)

  • Формат файла (например, "Strings")

  • Клиент (например, "ios")

  • Идентификатор дистрибутива (Идентификатор дистрибутива)

  • Секрет окружающей среды (для разграничения разработки и производства)

OTA Дистрибутивы

Внутри дистрибутива определены переводы платформы:

  • iOS

  • Android

  • Флаттер

  • i18next

  • Rails

Возможно несколько дистрибутивов, но в идеале на проект должен приходиться один дистрибутив. При использовании дистрибутива для iOS и Android заполнители для двух форматов автоматически конвертируются.

Резервные варианты

Если в настройках языка проекта установлен резервный язык, к которому подключен дистрибутив, при наличии запрошенного языка будут отображаться Strings с выбранного языка, но ключ не переведен.

Если используется язык конкретной страны (например, en-GB), но не является частью релиза, система может вернуться к стандартной версии (например, en) этого языка, если он существует в проекте. Если запрошенный язык вообще не найден, вместо него можно использовать языковой стандарт проекта по умолчанию.

Создать дистрибутив

Чтобы создать дистрибутив, выполните следующие действия:

  1. В Box обновлений по воздуху (OTA) на странице «Интеграции» нажмите «Настроить» или количество конфигураций, если они уже существуют.

    Открывается страница обновлений по воздуху, на которой отображаются существующие конфигурации.

  2. Нажмите «Новый дистрибутив». Откроются окна Добавить дистрибутив.

  3. Во вкладке «Общие» укажите Имя, с которым связан дистрибутив проекта, необходимые языки и необходимые платформы.

    • Для дистрибутивов Android перейдите на вкладку Android, чтобы выбрать формат, который при необходимости помещает любой перевод, включая HTML tags в CDATA.

    • После выбора проекта для связи с дистрибутивом становится доступной вкладка «Запланирование». При необходимости используйте эту вкладку, чтобы настроить запланированные обновления по воздуху (OTA) в дистрибутиве.

  4. Во вкладке «Резервные языки» выберите необходимые резервные настройки для конкретного дистрибутива. Приоритеты резервных вариантов отображаются в списке.

  5. Также перейдите на вкладку «Переводы», чтобы выбрать вариант использовать последнюю проверено версию переводов.

  6. Нажмите «Сохранить».

    Информация о дистрибутиве отображается с идентификаторами, необходимыми для SDK. Подробная информация может быть отображена снова, если щелкнуть дистрибутив на странице обновления по воздуху.

Версии OTA

Чтобы обновить переводы, создайте новый релиз в дистрибутиве. Текущий статус проекта экспортируется и становится доступным для подключенных клиентов.

Чтобы создать релиз, выполните следующие действия:

  1. На странице обновления по воздуху нажмите «Добавить выпуск» рядом с необходимым дистрибутивом.

    Откроется окно Нового выпуска.

  2. Предоставьте Описание, необходимые версии платформы, ветви, языков и приложений.

    При необходимости введите tags, чтобы включить в релиз только ключи с определенными tags.

  3. Нажмите «Сохранить».

    Релиз добавлен в список внизу страницы со сведениями о дистрибутиве.

График OTA-релизов

Чтобы настроить регулярные расписания выпуска дистрибутива, выполните следующие действия:

  1. На странице обновления по воздуху нажмите на значок Phrase_Gear.png колеса рядом с необходимым дистрибутивом.

    Отображается окно Редактировать дистрибутив.

  2. Выберите вкладку «Запланировать выпуск» и нажмите «Включить планирование».

    Отображаются параметры расписания релизов.

    Примечание

    Параметры расписания также доступны после создания нового дистрибутива.

  3. В раскрывающемся списке «Создать выпуски» выберите частоту выпуска, выбрав один из доступных вариантов:

    • День

    • Неделя

      Выберите нужные будние дни для запланированных релизов.

  4. Укажите время и соответствующий Часовой пояс.

  5. При необходимости выберите Ветвь, tags и Languages для запланированных релизов.

    • Поле ветви отображается только если в проекте включено ветвление. При выборе ветви обновляется список языков и языков.

  6. При необходимости укажите версии приложений в полях «Минальная версия» и «Максимальная версия».

    Оставьте пустым, чтобы применить выпуск расписания ко всем версиям приложения.

  7. Нажмите «Сохранить».

    Дистрибутив пополняется информацией о расписании релизов.

Отключение расписания останавливает автоматический выпуск дистрибутива, но настроенные настройки сохраняются.

Примечание

Из-за постоянных доработок пользовательский интерфейс может быть не совсем таким, как представлено в видео.

Обновление по воздуху (OTA) мобильного SDK и отчеты веб-библиотеки

Интеграция соответствующего мобильного SDK или веб-библиотеки позволяет обновлять переводы одним щелчком мыши, но также предоставляет показатели для измерения использования. Отчеты мобильных SDK и веб-библиотек дают ценную информацию об активных пользователях приложений и языках их приложений. Доступ к этому набору отчетов возможен для каждого дистрибутива, а данные для отчетов обновляются дважды в день.

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

Доступ к отчетам по каждому дистрибутиву осуществляется через значок Reports.jpg на странице обновлений по воздуху.

Установка OTA Android SDK

С помощью SDK приложение регулярно проверяет обновленные переводы и скачивает их в фоновом режиме.

Регулярно проверяйте последние выпуски Android SDK, особенно учитывая обновления.

Если переводы не обновляются:

  • Убедитесь в правильности Идентификатора дистрибутива и секрета среды.

  • Убедитесь, что для текущей версии приложения был создан релиз.

  • Перезагрузите V ViewController, чтобы немедленно внести изменения.

Если используется неправильная версия перевода, обеспечьте выпуск с последними переводами и доступной текущей версией приложения, а также версиейName для набора приложений и используйте <Существующий.Незначительный. point>. формат.

Требования

  • Для SDK требуется как минимум соответствующая версия 1.2.0. Если используется старая версия appcompat, рассмотрите возможность использования SDK версии 2.1.3

  • Поддержка обратно совместимых элементов пользовательского интерфейса, таких как панель инструментов, в библиотеке зависит от AndroidX.

Включить SDK

Добавьте новое хранилище в корень Build.gradle:

allprojects {
    repositories {
        ...
        maven { url "https://maven.download.phrase.com" }
    }
}

Добавить библиотеку в зависимости:

dependencies {
    implementation "com.phrase.android:ota-sdk:3.5.0"
    ...
}

Поддержка Jetpack

Чтобы включить поддержку обновления по воздуху (OTA) перевода Jetpack Compose, выполните следующие действия:

  1. Добавьте library playmentation "com.phrase.android:ota-sdk-compose:3.5.0" в корень Build.gradle.

  2. Оберните код Jetpack Compose в Phrase { ...}.

Конфигурация

Инициализируйте SDK в классе приложений и добавить Идентификатор дистрибутива и секрет среды. Классы, унаследованные от Application, должны перезаписать attraitBaseContext, чтобы включить переводы вне контекста деятельности:

public class MainApplication extends Application {
  @Override
  public void onCreate() {
      super.onCreate();
      Phrase.setup(this, "DISTRIBUTION_ID", "ENVIRONMENT_TOKEN");
      Phrase.updateTranslations();
  }

  @Override
  protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(Phrase.wrapApplicationContext(newBase));
  }  
}

Впрыскивайте SDK в каждое действие, например, создавая базовое действие, которое все остальные действия унаследуют от:

public class BaseActivity extends AppCompatActivity {
  @NonNull
  @Override
  public AppCompatDelegate getDelegate() {
    return Phrase.getDelegate(this, super.getDelegate());
  }
}

Переводы можно использовать как обычно в верстках:

<TextView android:text="@string/translation_key" />

А внутренний код:

TextView text = (TextView) findViewById(R.id.text_id);
text.setText(R.string.translation_key);

Некоторые библиотеки не поддерживают автоматическую разворачивание контекста и ожидают определенного класса. В этом случае обертку контекста в компонентах Jetpack Compose можно отключить с помощью:

Phrase(contextWrapping = false) {
    Text( text = phraseString(R.string.test) )
}

Конфигурации для уровней журнала:

  • Java PhraseLog.setLogLevel(Severity.Debug);

  • Котлин

    PhraseLog.logLevel = Severity.Verbose

  • Другие поддерживаемые параметры журнала

    • None

    • Error

    • Warning

    • Info

    • Debug

    • Verbose

Изменить язык

Если язык системы не используется, в методе setLocaleCode можно указать другой язык. Языковой код (языковой стандарт) должен присутствовать в релизе.

Phrase.setLocaleCode("fr");
Phrase.updateTranslations();

Пользовательская версия приложения

SDK использует версию приложения по умолчанию, чтобы вернуть релиз, соответствующий ограничениям на выпуск для версии min и max. Версия приложения должна использовать семантическое управление версиями, иначе обновить перевода не возвращается. В случае, если приложение не использует семантическую версию, можно вручную переопределить используемую версию приложения.

Пример:

Phrase.setAppVersion("3.2.4");

Версия должна быть установлена перед вызовом UpdateTranslations( ).

Задать тайм-аут

Тайм-аут для скачивания переводов по умолчанию установлен на уровне 10s.

По умолчанию можно изменить с помощью:

Phrase.setTimeout(10000); // Timeout in milliseconds

Обновить обратный вызов

Если требуется обработка успешных обновлений перевода, прикрепите обработчик обратного вызова:

Phrase.updateTranslations(new TranslationsSyncCallback() {
    @Override
    public void onSuccess(boolean translationsChanged) {
    }

    @Override
    public void onFailure() {
    }
});

Обновления перевода также могут запускаться вручную. Новые извлеченные переводы отображаются при След. запуске приложения.

Чтобы сделать последние переводы доступными сразу, используйте метод Phrase.applyPendingUpdates(). Это можно совместить с прослушиванием обновлений перевода:

Phrase.updateTranslations(new TranslationsSyncCallback() {
    @Override
    public void onSuccess(boolean translationsChanged) {
      if(translationsChanged) {
         Phrase.applyPendingUpdates()
        // Custom logic to refresh UI
      }
    }

    @Override
    public void onFailure() {
    }
});

Пользовательский интерфейс не отображает переводы автоматически и должен быть воссоздан.

Настройка центра хранения и обработки данных в США

Также поддерживается центр хранения и обработки данных phrase US. Настроить центр хранения и обработки данных в США можно по телефону:

Phrase.setHost("https://ota.us.phrase.com/")

Резервный вариант

В случае, если связаться с Phrase невозможно из-за отсутствия сетевого подключения клиента или перерыва в предоставлении услуги, SDK использует пакетные переводы из файла ресурса. Рекомендуется регулярно обновлять пакетные переводы в приложении. SDK также кэширует переводы на устройстве локально. Если такой кэш существует, он используется до След. обновить перевода.

SDK использует последний релиз для переводов. В случае, если для приложения установлен versionName, будет использоваться последний релиз, удовлетворяющий ограничениям версии.

Добавить новый язык

Создание нового языка в phrase и создайте новый релиз. SDK извлекает язык, если это язык устройства пользователя. Рекомендуется регулярно добавлять новые strings.xml для файлов на новых языках при выпуске новой версии приложения. Или пользователи увидят резервные переводы, определенные Android, только при первом запуске приложения.

Аудит

SDK имеет закрытый оригинал и не может быть просмотрен или изменен. Если это требование организации, можно предоставить аудит. При необходимости Свяжитесь с нами для более подробной информации.

Поддержка пользовательского просмотра

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

  • Пример Котлина

    Прежде:

    context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyleAttr, 0).use {
        text = it.getText(R.styleable.CustomView_android_text)
    }

    После:

    context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyleAttr, 0).use {
        text = it.getTextWithPhrase(R.styleable.CustomView_android_text)
    }
  • Пример Java

    Прежде:

    final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyleAttr, 0);
    try {
        setText(ta.getText(R.styleable.CustomView_android_text));
    } finally {
        ta.recycle();
    }

    После:

    final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyleAttr, 0);
    try {
        setText(PhraseTypedArray.getTextWithPhrase(ta, R.styleable.CustomView_android_text));
    } finally {
        ta.recycle();
    }

Пример приложения

https://github.com/phrase/android-sdk-example

Установка SDK обновлений по воздуху (OTA)

С помощью SDK приложение регулярно проверяет обновленные переводы и скачивает их в фоновом режиме.

Требования

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

Установка

Добавьте phrase в pubspec.yaml:

dependencies:
  phrase: ^2.5.1 
  ...
  intl: ^0.18.0
  flutter_localizations:
    sdk: flutter
  ...

flutter:
  generate: true
  ...

Как и в библиотеке intl, генерирование кода используется для обработки файлов ARB. Выполните эту команду, чтобы обновить:

flutter pub run phrase

Использование build_runner:

flutter pub run build_runner watch

Использование

Initialize phrase в файле main.dart:

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_gen/gen_l10n/phrase_localizations.dart';
import 'package:phrase/phrase.dart';

void main() {
  Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]");
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      название: 'Flutter Demo',
      //..
      localizationsDelegates: PhraseLocalizations.localizationsDelegates,
      supportedLocales: PhraseLocalizations.supportedLocales,
    );
  }
}

Получить доступ к сообщениям с помощью:

Text(AppLocalizations.of(context)!.helloWorld);

Настройка

Обновить поведение

Переводы обновления по воздуху (OTA) обновляются каждый раз при запуске приложения. Чтобы отключить это:

Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", 
    checkForUpdates: false);

Обновить вручную:

Phrase.updateTranslations(context).then((_) => print("Done!"));

Пользовательская версия приложения

SDK использует версию приложения по умолчанию, чтобы вернуть релиз, соответствующий ограничениям на выпуск для версии min и max. Версия приложения должна использовать семантическое управление версиями, иначе обновить перевода не будет возвращено. В случае, если приложение не использует семантическую версию, версию приложения можно вручную переопределить: есть возможность вручную переопределить версию приложения:

Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]",
    customAppVersion: "1.2.3"); "1.2.3");

Настройка центра хранения и обработки данных в США

Также поддерживается центр хранения и обработки данных phrase US. Центр хранения и обработки данных в США можно выбрать, передав соответствующий параметр имени интерфейса приложений API в конфигурации SDK:

Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", хост: PhraseHost.us);

Пример приложения

https://github.com/phrase/flutter_sdk_example

Обновление по воздуху (OTA)

С помощью SDK приложение регулярно проверяет обновленные переводы и скачивает их в фоновом режиме.

Также поддерживается Mac Catalyst.

SDK можно установить вручную или через Swift Package Manager, Carthage или Coao Pods.

Если переводы не обновляются:

  • Убедитесь в правильности Идентификатора дистрибутива и секрета среды.

  • Убедитесь, что для текущей версии приложения был создан релиз.

  • Перезагрузите V ViewController, чтобы немедленно внести изменения.

Если используется неправильная версия перевода, убедитесь, что доступен релиз с последними переводами и актуальной версией приложения.

Swift Package Manager

Добавить URL-адрес общедоступного хранилища (https:/github.com/phrase/ios-sdk/). Xcode автоматически обрабатывает остальную часть установки.

Карфаген

Добавьте в Картфайл следующую строку:

binary "https://raw.githubusercontent.com/phrase/ios-sdk/master/PhraseSDK.json" ~> 3.0.0

Обновите карфаген и добавьте PhraseApp.framework в свой проект, как описано в Карфагенской документации.

Какао-стручки

Добавьте в свой подфайл следующую строку:

pod 'PhraseSDK'

Запустите установку капсулы. Если вы новичок в какао-подах, см. их документацию.

Ручная установка

Выполните следующие действия:

  1. Скачайте последний релиз.

  2. Добавьте PraseSDK.framework в Xcode в качестве связанного двоичного файла для перевода.

  3. Скрипт для удаления лишних двоичных файлов необходимо запустить, прежде чем загрузить приложение, так как магазин Apple отклоняет приложения, включая двоичные файлы симулятора.

    Перейдите в раздел «Построить этапы» и добавьте раздел «Запустить сценарий», нажав символ +. Вставить в этот скрипт:

    FRAMEWORK="PhraseSDK"
    FRAMEWORK_EXECUTABLE_PATH="${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/$FRAMEWORK.framework/$FRAMEWORK"
    EXTRACTED_ARCHS=()
    for ARCH in $ARCHS
    do
       lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
       EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
    done
    lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
    rm "${EXTRACTED_ARCHS[@]}"
    rm "$FRAMEWORK_EXECUTABLE_PATH"
    mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"

Конфигурация

  1. Импортировать PhraseSDK:

    import PhraseSDK
  2. Инициализируйте SDK, вызвав следующий код:

    Phrase.shared.setup(
      distributionID: <Distribution ID>, 
      environmentSecret: <Environment Secret>
    )
  3. Чтобы обновить файлы локализации, вызовите Prase.shared.updateTranslation().

    Этот метод создает исключение при неправильной настройке SDK.

    Чтобы настроить обновление по воздуху (OTA) для использования центра хранения и обработки данных США, установите узел перед вызовом PraseApp.shared.updateTranslation() с помощью Phrase.shared.configuration.apiHost = .us.

Рекомендуется вызвать обе функции в AppDelegate в методе applicationDidFinishLaunchingWithOptions.

Цель-С

Интегрируйте SDK в приложение Objective-C:

@import PhraseSDK;

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [[Phrase shared] setDebugMode:true]; // Optional

  [[Phrase shared] setupWithDistributionID:@"Your Distribution ID"
                         environmentSecret:@"Your Environment Secret"];

  // OR:
  //
  //  [[Phrase shared] setupWithDistributionID:@"Your Distribution ID"
  //                         environmentSecret:@"Your Environment Secret"
  //                                   timeout:10];

  // Update translations using callback block:
  [[Phrase shared] updateTranslationsWithCompletionHandler:^(BOOL updated, NSError* error){
    NSLog(@"Updated: %@", updated ? @"true" : @"false");

    if (error) {
      NSLog(@"Domain: %@ Code: %ld Message: %@", error.domain, (long)error.code, error.localizedDescription);
    } else {
      NSLog(@"No error");
    }

    // Translate via bundle proxy:
    NSString *translation = NSLocalizedString(@"layouts.application.about", @"");
    NSLog(@"NSLocalizedString via bundle proxy: %@", translation);

    // OR:
    //
    // Translate using fallback method:
    NSString *otherTranslation = [[Phrase shared]
                                  localizedStringForKey:@"layouts.application.about" value:NULL table:NULL];
    NSLog(@"Phrase.shared localizedStringForKey: %@", otherTranslation);
  }];

  // OR:
  //
  // [[Phrase shared] updateTranslationsWithCompletionHandler:NULL]; // ignore result and errors (not recommended)

  // [...] Your other code
  
  return YES;
}

Отключить свайзинг

Чтобы отключить переключение, установите значение PhraseSDKMainBundleProxyDisabled на YES в файле Info.plist.

При отключенном нажатии обновленные переводы больше не отображаются. Перевод по- прежнему будет синхронизирован при вызове UpdateTranslation, к нему можно получить доступ с помощью метода Phrase.localizedString().

Обработка версий приложения

Для определения того, какой релиз следует вернуть SDK, требуется семантическая версия приложения, чтобы переводы обновлялись.

SDK пытается получить смысловую версию следующим образом:

  • CFBundleShortVersionString используется в семантическом режиме.

  • Если нет, CFBundleVersion используется в семантическом режиме.

  • Если оба термина не являются семантическими, используется комбинация (CFBundleShortVersionString.CFBundleVersion).

Если CFBundleShortVersionString отсутствует или не может быть создан с помощью семантической версии вместе с CFBundleVersion, SDK выдает сообщение PraseSetupError.appVersionNotSemantic.

Отключить перевод для нескольких таблиц

Чтобы OTA не переводила никакие таблицы в основном пакете iOS, кроме локализуемой таблицы по умолчанию, задайте следующий параметр:

Phrase.shared.configuration.ignoreOtherTables = true

Обратные звонки

Прикрепите обработчик обратного вызова для выполнения успешных обновлений перевода:

Phrase.shared.updateTranslation { result in
            switch result {
            case .success(let updated):
            case .failure:
            }
        }

Режим debug

Если требуется дополнительная информация, включите режим Debug, чтобы получить дополнительный вход PraseSDK.framework в консоль:

Phrase.shared.configuration.debugMode = true

Установить тайм-аут для запросов

Установите тайм-аут для запросов против phrase, позвонив по телефону:

Phrase.shared.configuration.timeout = TimeInterval(20)

Тайм-аут по умолчанию составляет 10 секунд, и соединения, занимающие больше 10 секунд, будут закрыты.

Переопределение языка вручную

Если в качестве языкового стандарта не используется язык системы, в вызове init можно указать другой языковой стандарт. Код языкового стандарта должен присутствовать в релизе от phrase:

Phrase.shared.configuration.localeOverride = "en-US"

Резервный вариант

В случае невозможности извлечь новые переводы из phrase через SDK используются последние файлы переводов, которые получила установка. Если приложение так и не получило новых файлов от phrase, то оно использует скомпилированные файлы перевода приложения. Это предотвращает ошибки при возникновении технических трудностей или сетевых ошибок. Рекомендуется обновлять файлы перевода, скомпилированные в приложении, с каждым выпуском.

Аудит

SDK имеет закрытый оригинал и не может быть просмотрен или изменен. Если это требование организации, можно предоставить аудит. При необходимости Свяжитесь с нами для более подробной информации.

Реакция на обновление по воздуху (OTA)

С помощью SDK приложение регулярно проверяет обновленные переводы и скачивает их в фоновом режиме.

Библиотека переводов обновлений по воздуху (OTA) работает только с библиотекой react- i18next.

Чтобы установить React Native SDK, выполните следующие действия:

  1. Выполните эту команду:

    $ npm install react-native-phrase-sdk --save
  2. Инициализируйте Phrase:

    import Phrase from "react-native-phrase-sdk";
    
    let phrase = new Phrase(
        "YOUR_DISTRIBUTION_ID",
        "YOUR_DEVELOPMENT_OR_PRODUCTION_SECRET",
        "YOUR_APP_VERSION",
        "i18next"
    );

    Формат файла может быть как i18next (как в примере выше), так и i18next_4, в результате чего будет создан файл формата i18next v4.

    Также поддерживается центр хранения и обработки данных Phrase US. Чтобы использовать React Native SDK с центром хранения и обработки данных США, перейдите соответствующий хост во время инициализации:

    import Phrase from "react-native-phrase-sdk";
    
    let phrase = new Phrase(
        "YOUR_DISTRIBUTION_ID",
        "YOUR_DEVELOPMENT_OR_PRODUCTION_SECRET",
        "YOUR_APP_VERSION",
        "i18next",
        host="https://ota.us.phrase.com/"
    );  
    
  3. Создайте модуль i18next на основе примера:

    import resourcesToBackend from "i18next-resources-to-backend";
    
    const backendPhrase = resourcesToBackend((language, namespace, callback) => {
        phrase.requestTranslation(language)
            .then((remoteResources) => {
                callback(null, remoteResources);
            })
            .catch((error) => {
                callback(error, null);
            });
    });
    
    const backendFallback = resourcesToBackend(localResources)
  4. Инициализируйте i18n с помощью модуля Phrase:

    i18n
      .use(ChainedBackend)
      .use(initReactI18next)
      .init({
        backend: {
            backends: [backendPhrase, backendFallback]
        }
        //...
      });

Образец файла i18next.js

import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import ChainedBackend from "i18next-chained-backend";
import resourcesToBackend from "i18next-resources-to-backend";
import translationEN from "./locales/en/translation.json";
import translationRU from "./locales/ru/translation.json";
import Phrase from "react-native-phrase-sdk";

const localResources = {
  en: {
    translation: translationEN,
  },
  ru: {
    translation: translationRU,
  },
};

let phrase = new Phrase(
    "YOUR_DISTRIBUTION_ID",
    "YOUR_ENVIRONMENT_ID",
    require('./package.json').version,
    "i18next"
);

const backendPhrase = resourcesToBackend((language, namespace, callback) => {
    phrase.requestTranslation(language)
        .then((remoteResources) => {
            callback(null, remoteResources);
        })
        .catch((error) => {
            callback(error, null);
        });
});

const backendFallback = resourcesToBackend(localResources)

i18n
  .use(ChainedBackend)
  .use(initReactI18next)
  .init({
    backend: {
        backends: [backendPhrase, backendFallback]
    },
    debug: true,
    lng: "en",
    fallbackLng: "en",
    interpolation: {
      escapeValue: false, // not needed for react as it escapes by default
    }
  });

Пример приложения

https://github.com/phrase/react_native_sdk_example

Установка OTA i18next Backend

Библиотека i18next- Phrase-backend реализует пример базового модуля для i18next, который извлекает переводы из обновлений по воздуху (OTA).

Чтобы создать новую версию, необходимо установить платформу i18next для дистрибутива и стать ее частью.

Использование

Чтобы инициализировать Phrase:

import i18n from "i18next";
import { I18nextPhraseBackend } from "@phrase/i18next-backend";

i18n
  .use(I18nextPhraseBackend)
  .init({
    fallbackLng: 'en',
    backend: {
      распределение: «DISTRIBUTION_ID»,
      секрет: 'YOUR_ENVIRONMENT_SECRET',
      appVersion: '1.0.0',
    }
  });

Кэширование

Библиотека кэширует переводы и не будет проверять новые переводы в течение 5 минут. Кэширование можно настроить, установив опцию cacheExpirationTime в конфигурации модуля для тестирования.

i18n
  .use(I18nextPhraseBackend)
  .init({
    fallbackLng: 'en',
    backend: {
      распределение: «DISTRIBUTION_ID»,
      секрет: 'YOUR_ENVIRONMENT_SECRET',
      appVersion: '1.0.0',
      cacheExpirationTime: 60 * 5, // время в секундах
    }
  });

Примечание

Рекомендуется использовать в производственных средах не менее 5 минут времени кэширования.

Пример приложения

https://github.com/phrase/ota-web-demo

Опорная установка рельсов OTA

В библиотеке phrase-ota-i18n реализован пример модуля для драгоценного камня I18n, который извлекает переводы из релизов OTA. С помощью библиотеки приложение регулярно проверяет обновленные переводы и скачивает их в фоновом режиме.

Библиотека действительна для любого приложения Ruby с использованием драгоценного камня i18n.

Чтобы создать новую версию, необходимо установить платформу Rails для дистрибутива и стать ее частью.

Установка

  1. Добавьте в Gemfile приложения следующую строку:

    gem 'phrase-ota-i18n'
  2. Выполнить:

    $ bundle install
  3. Также можно установить его в виде:

    $ gem install phrase-ota-i18n

Использование

Для создания конфигурации:

bundle exec rails generate phrase_ota:install --distribution-id <DISTRIBUTION_ID> --secret-token <SECRET>

Отладка

gem имеет конфигурацию Debug, которую можно активировать в инициализаторе, настроив:

config.debug = true
Была ли эта статья полезной?

Sorry about that! In what way was it not helpful?

The article didn’t address my problem.
I couldn’t understand the article.
The feature doesn’t do what I need.
Other reason.

Note that feedback is provided anonymously so we aren't able to reply to questions.
If you'd like to ask a question, submit a request to our Support team.
Thank you for your feedback.