Übersetzungsmanagement

Over the Air (Strings)

Inhalte werden von Phrase Language AI maschinell aus dem Englischen übersetzt.

Aktualisiere Übersetzungen für iOS-, Android-, React Native- und Flutter-Anwendungen mit einem einzigen Klick, ohne eine neue Version im App Store oder bei Google Play zu veröffentlichen. Aktualisierungen für Textlabels werden sofort an mobile Apps gesendet.

OTA_user_device_diagram.png

Over-the-Air (OTA) integriert sich auch mit den i18Next- und Rails-Plattformen, sodass User lokalisierten Inhalt in Webanwendungen aktualisieren und verwalten können, ohne ein erneutes Deployment zu benötigen.

Eine neue Version muss erstellt werden, damit die aktualisierten Einstellungen angewendet werden. Alle Inhalte eines Releases müssen in Phrase Strings verfügbar sein, das Übersetzungen direkt an die Anwendung überträgt. Wenn der Inhalt nicht vorhanden ist, werden die Übersetzungen nicht geliefert.

Beim ersten Start einer Anwendung, die das iOS-, Android-, React Native- oder Flutter-SDK auf einem Gerät implementiert, wird eine eindeutige und zufällige Gerätekennung generiert. Diese Kennung verfolgt aktive User über einen bestimmten Zeitraum. Sie wird nicht für andere Formen oder Mittel des Trackings verwendet und enthält keine User- oder Geräteinformationen.

Das einzige Limit bezüglich OTA ist die Anzahl der MAU (monatlich aktive User), abhängig vom gewählten Plan.

MAU ist die Anzahl der Geräte, von denen aus Übersetzungen angefordert werden. Jedem Gerät wird eine zufällige ID zugewiesen, und die MAU wird aus der Anzahl der verschiedenen IDs berechnet, die in den letzten 30 Tagen zugewiesen wurden. Jede Interaktion mit phrase Servern wird als Anfrage betrachtet.

Daten

Das SDK kommuniziert mit dem OTA-Service, um nach Updates zu suchen und enthält die folgenden Details bei jeder Anfrage:

  • Gerätekennung (z.B. "F3AFCB10-80A2-84CB-94C0-27F5EF58876D". Einzigartig für diese App und daher keine Verfolgung eines bestimmten Geräts möglich.)

  • App-Version (z.B. "1.2.0")

  • Letzte Aktualisierung der Übersetzungsdatei (z.B. "1542187679")

  • SDK-Version (z.B. "1.0.0")

  • Sprache (z.B. "de-DE")

  • Dateiformat (z.B. "strings")

  • Client (z.B. "ios")

  • Distributions-ID (ID der Distribution)

  • Umgebungsgeheimnis (zur Unterscheidung zwischen Entwicklung und Produktion)

OTA-Distributionen

Zielplattformen werden innerhalb der Distribution definiert:

  • iOS

  • Android

  • Flutter

  • i18next

  • Rails

Mehrere Distributionen sind möglich, aber idealerweise gibt es eine Distribution pro Projekt. Wenn eine Distribution für iOS und Android verwendet wird, werden Platzhalter für die beiden Formate automatisch konvertiert.

Fallbacks

Wenn Sprachfallbacks in den Spracheinstellungen des Projekts festgelegt sind, an das die Distribution angeschlossen ist, werden Strings aus der ausgewählten Sprache angezeigt, wenn die angeforderte Sprache existiert, aber der Schlüssel nicht übersetzt ist.

Wenn eine länderspezifische Sprache (z.B. en-GB) verwendet wird, die aber nicht Teil der Veröffentlichung ist, kann das System auf eine Standardversion (z.B. en) dieser Sprache zurückgreifen, falls sie im Projekt existiert. Falls die angeforderte Sprache überhaupt nicht gefunden wird, kann stattdessen die Standardsprache des Projekts bereitgestellt werden.

Eine Distribution erstellen

Um eine Distribution zu erstellen, folge diesen Schritten:

  1. Klicke auf der Integrationen-Seite im Over the air (OTA)-Kasten auf Konfigurieren oder auf die Anzahl der Konfigurationen, wenn bereits welche existieren.

    Die Over the air-Seite öffnet sich und zeigt bestehende Konfigurationen an.

  2. Klicke auf Neue Distribution. Das Distribution hinzufügen-Fenster öffnet sich.

  3. Im Allgemein-Tab gib einen Namen an, mit welchem Projekt die Distribution verknüpft ist, erforderliche Sprachen und erforderliche Plattformen.

    • Für Android-Distributionen klicke auf den Android-Tab, um die Formatoption auszuwählen, die jede Übersetzung einschließlich HTML-Tags in CDATA einschließt, falls erforderlich.

    • Nachdem du das Projekt ausgewählt hast, das mit der Distribution verknüpft werden soll, wird der Planung-Tab verfügbar. Falls erforderlich, nutze diesen Tab, um OTA-geplante Veröffentlichungen in der Distribution einzurichten.

  4. Im Fallback-Sprachen-Tab wähle distributionsspezifische Fallback-Einstellungen aus, wie benötigt. Fallback-Optionen werden in der Liste nach Priorität angezeigt.

  5. Optional klicke auf den Übersetzungen-Tab, um die Option auszuwählen, die neueste geprüfte Version der Übersetzungen zu verwenden.

  6. Klicke auf Speichern.

    Distributionsdetails werden mit IDs angezeigt, die von den SDKs benötigt werden. Details können erneut angezeigt werden, indem du die Distribution von der Over the air-Seite aus anklickst.

OTA-Releases

Um Übersetzungen zu aktualisieren, erstelle ein neues Release innerhalb der Distribution. Der aktuelle Stand des Projekts wird exportiert und den verbundenen Clients zur Verfügung gestellt.

Um ein Release zu erstellen, folge diesen Schritten:

  1. Klicke auf der Over the air-Seite neben der erforderlichen Distribution auf Release hinzufügen.

    Das Neues Release-Fenster öffnet sich.

  2. Gib eine Beschreibung, erforderliche Plattform, Branch, Sprachen und App-Versionen an.

    Falls notwendig, gib Tags ein, um nur Schlüssel mit bestimmten Tags in das Release einzuschließen.

  3. Klicke auf Speichern.

    Das Release wird der Liste am unteren Rand der Distributionsdetailseite hinzugefügt.

OTA-Releases planen

Um wiederkehrende Zeitpläne für das Release der Distribution einzurichten, folge diesen Schritten:

  1. Klicke auf der Over the air-Seite auf das Zahnrad-Symbol Phrase_Gear.png neben der erforderlichen Distribution.

    Das Distribution bearbeiten-Fenster wird angezeigt.

  2. Wähle den Releasezeitplan-Tab und klicke auf Planung aktivieren.

    Optionen für die Releaseplanung werden angezeigt.

    Hinweis

    Planungsoptionen sind auch bei der Erstellung einer neuen Distribution verfügbar.

  3. Wähle im Dropdown-Menü Veröffentlichungen alle erstellen die Veröffentlichungsfrequenz aus, indem du eine der verfügbaren Optionen auswählst:

    • Tag

    • Woche

      Wähle die gewünschten Wochentage für die geplanten Releases aus.

  4. Gib eine Uhrzeit und die relevante Zeitzone an.

  5. Falls nötig, wähle Branch, Tags und Sprachen für die geplanten Releases aus.

    • Das Feld Branch wird nur angezeigt, wenn im Projekt das Branching aktiviert ist. Das Auswählen eines Branches aktualisiert die Liste der Sprachen und Sprachen.

  6. Optional kannst du die App-Versionen in den Feldern Minimale Version und Maximale Version angeben.

    Lass es leer, um das geplante Release auf alle Versionen der App anzuwenden.

  7. Klicke auf Speichern.

    Die Distribution wird mit Informationen zur Release-Planung aktualisiert.

Das Deaktivieren des Plans stoppt das automatische Release der Distribution, aber die konfigurierten Einstellungen bleiben gespeichert.

Hinweis

Aufgrund kontinuierlicher Verbesserungen kann die Benutzeroberfläche nicht genau so aussehen wie im Video dargestellt.

OTA Mobile SDK und Web Library Berichte

Die Integration des passenden mobilen SDKs oder der Web-Bibliothek ermöglicht es, Übersetzungen mit einem Klick zu aktualisieren und bietet außerdem Metriken zur Messung der Nutzung. Die Berichte des mobilen SDKs und der Web-Bibliothek geben wertvolle Einblicke in aktive App-User und deren App-Sprachen. Dieses Set von Berichten kann für jede Distribution aufgerufen werden und die Daten für die Berichte werden zweimal täglich aktualisiert.

Berichte werden für die Anzahl aktiver User, Gesamtanfragen, Anfragen pro Sprache, Anfragen pro Plattform und für nicht bereitgestellte Gerätesprachen bereitgestellt.

Berichte für jede Distribution sind über das Reports.jpg Symbol auf der Over the air Seite zugänglich.

OTA Android SDK Installation

Mit dem SDK überprüft die App regelmäßig auf aktualisierte Übersetzungen und lädt diese im Hintergrund herunter.

Überprüfe regelmäßig die neuesten Releases des Android SDKs, insbesondere im Hinblick auf Upgrades.

Falls Übersetzungen nicht aktualisiert werden:

  • Stelle sicher, dass die Distributions-ID und das Umgebungspasswort korrekt sind.

  • Stelle sicher, dass ein Release für die aktuelle App-Version erstellt wurde.

  • Lade den ViewController neu, um Änderungen sofort sichtbar zu machen.

Wenn die falsche Version einer Übersetzung verwendet wird, stelle sicher, dass ein Release mit den neuesten Übersetzungen und der aktuellen App-Version verfügbar ist und der versionName für die App gesetzt ist und das <major>.<minor>.<point>. Format verwendet wird.

Anforderungen

  • Das SDK erfordert mindestens appcompat Version 1.2.0. Wenn du eine ältere Version von appcompat verwendest, überlege, SDK Version 2.1.3 zu nutzen.

  • Die Bibliothek hängt von AndroidX ab, um rückwärtskompatible UI-Elemente wie die Toolbar zu unterstützen.

SDK einbinden

Füge ein neues Repository zur root build.gradle hinzu:

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

Füge die Bibliothek als Abhängigkeit hinzu:

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

Jetpack Compose Unterstützung

Um Jetpack Compose Unterstützung für OTA-Übersetzungen zu aktivieren, folge diesen Schritten:

  1. Füge die Bibliothek implementation "com.phrase.android:ota-sdk-compose:3.5.0" zur build.gradle im Root hinzu.

  2. Umschließe den Jetpack Compose Code mit Phrase { ... }.

Konfiguration

Initialisiere das SDK in der Anwendungsklasse und füge die Distributions-ID und das Umgebungsgeheimnis hinzu. Klassen, die von Application erben, sollten attachBaseContext überschreiben, um Übersetzungen außerhalb des Aktivitätskontexts zu ermöglichen:

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));
  }  
}

Injiziere das SDK in jede Aktivität, z.B. indem du eine Basisaktivität erstellst, von der alle anderen Aktivitäten erben:

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

Übersetzungen können wie gewohnt in Layouts verwendet werden:

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

Und im Code:

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

Einige Bibliotheken unterstützen das automatische Entpacken des Kontexts nicht und erwarten eine spezifische Klasse. In diesem Fall kann das Context-Wrapping in Jetpack Compose-Komponenten deaktiviert werden mit:

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

Konfigurationen für Log-Level:

  • Java PhraseLog.setLogLevel(Severity.Debug);

  • Kotlin

    PhraseLog.logLevel = Severity.Verbose

  • Andere unterstützte Logging-Optionen

    • None

    • Error

    • Warning

    • Info

    • Debug

    • Verbose

Sprache ändern

Wenn nicht die Systemsprache verwendet wird, kann eine andere Sprache in der Methode setLocaleCode festgelegt werden. Der Sprachcode (locale) muss in einem Release vorhanden sein.

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

Benutzerdefinierte App-Version

Das SDK verwendet standardmäßig die App-Version, um ein Release zurückzugeben, das den Release-Beschränkungen für die minimale und maximale Version entspricht. Die App-Version muss semantische Versionierung verwenden, sonst wird kein Übersetzungs-Update zurückgegeben. Falls die App keine semantische Versionierung verwendet, ist es möglich, die verwendete App-Version manuell zu überschreiben.

Beispiel:

Phrase.setAppVersion("3.2.4");

Die Version muss festgelegt werden, bevor updateTranslations( ) aufgerufen wird.

Timeout setzen

Das Standard-Timeout für Übersetzungsdownloads ist auf 10s gesetzt.

Das Standard-Timeout kann geändert werden mit:

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

Update-Callback

Wenn die Bearbeitung erfolgreicher Übersetzungs-Updates erforderlich ist, füge einen Callback-Handler hinzu:

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

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

Übersetzungsupdates können auch manuell ausgelöst werden. Neu abgerufene Übersetzungen werden beim nächsten Start der Anwendung angezeigt.

Um die neuesten Übersetzungen sofort verfügbar zu machen, benutze die Methode Phrase.applyPendingUpdates(). Dies kann mit dem Abbonnieren von Übersetzungsupdates kombiniert werden:

Phrase.updateTranslations(new TranslationsSyncCallback() {
    @Override
    public void onSuccess(boolean translationsChanged) {
      if(translationsChanged) {
         Phrase.applyPendingUpdates()
        // Eigene Logik, um die UI zu aktualisieren
      }
    }

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

Die UI zeigt Übersetzungen nicht automatisch an und muss neu erstellt werden.

Konfiguriere das US-Datencenter

Das Phrase US-Datencenter wird ebenfalls unterstützt. Das US-Datencenter kann durch Aufruf von:

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

Fallback

Falls es wegen einer fehlenden Netzwerkverbindung des Clients oder einer Dienstunterbrechung nicht möglich ist, Phrase zu erreichen, verwendet das SDK die gebündelten Übersetzungen aus der Ressourcendatei. Das regelmäßige Aktualisieren der gebündelten Übersetzungen in der App wird empfohlen. Das SDK speichert Übersetzungen auch lokal auf dem Gerät. Wenn ein solcher Cache existiert, wird er bis zum nächsten Übersetzungsupdate verwendet.

Das SDK verwendet die aktuellste Veröffentlichung für die Übersetzungen. Falls der versionName für die App festgelegt ist, wird die aktuellste Veröffentlichung verwendet, die die Versionsbeschränkungen erfüllt.

Neue Sprache hinzufügen

Die neue Sprache in Phrase erstellen und eine neue Veröffentlichung erstellen. Das SDK ruft die Sprache ab, wenn dies die Gerätesprache eines Users ist. Regelmäßig eine neue strings.xml für neue Sprachdateien hinzuzufügen, wenn eine neue App-Version veröffentlicht wird, wird empfohlen, sonst sehen die User beim ersten Start der App nur die von Android bestimmten Fallback-Übersetzungen.

Prüfung

Das SDK ist Closed Source und kann nicht eingesehen oder modifiziert werden. Falls es eine Anforderung der Organisation ist, können Prüfungen bereitgestellt werden. Kontaktiere uns für weitere Details, falls erforderlich.

Unterstützung für benutzerdefinierte Ansichten

Benutzerdefinierte Ansichten können mit stilisierten Attributen übersetzt werden. Da TypedArray das Überschreiben der Ressourcen nicht erlaubt, sind leichte Änderungen in der benutzerdefinierten Ansicht erforderlich:

  • Kotlin Beispiel

    Vorher:

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

    Nachher:

    context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyleAttr, 0).use {
        text = it.getTextWithPhrase(R.styleable.CustomView_android_text)
    }
  • Java Beispiel

    Vorher:

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

    Nachher:

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

Beispiel-App

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

OTA Flutter SDK Installation

Mit dem SDK überprüft die App regelmäßig auf aktualisierte Übersetzungen und lädt diese im Hintergrund herunter.

Anforderungen

Diese Bibliothek hängt von Version 0.18.0 der Flutter intl Bibliothek ab. Folge ihrem Leitfaden, um Unterstützung für Lokalisierungen zur App hinzuzufügen.

Installation

Füge Phrase zur pubspec.yaml hinzu:

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

flutter:
  generate: true
  ...

Wie in der intl-Bibliothek wird Codegenerierung verwendet, um ARB-Dateien zu verarbeiten. Führe diesen Befehl aus, um zu aktualisieren:

flutter pub run phrase

Mit build_runner:

flutter pub run build_runner watch

Verwendung

Initialisiere Phrase in der main.dart-Datei:

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(
      title: 'Flutter Demo',
      //..
      localizationsDelegates: PhraseLocalizations.localizationsDelegates,
      supportedLocales: PhraseLocalizations.supportedLocales,
    );
  }
}

Nachrichten abrufen mit:

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

Anpassung

Aktualisierungsverhalten

OTA-Übersetzungen werden jedes Mal aktualisiert, wenn die App gestartet wird. Um dies zu deaktivieren:

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

Manuelle Aktualisierung:

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

Benutzerdefinierte App-Version

Das SDK verwendet standardmäßig die App-Version, um ein Release zurückzugeben, das den Release-Beschränkungen für die minimale und maximale Version entspricht. Die App-Version muss semantische Versionierung verwenden, andernfalls wird kein Übersetzungsupdate zurückgegeben. Falls die App keine semantische Versionierung verwendet, kann die App-Version manuell überschrieben werden: Es ist möglich, die App-Version manuell zu überschreiben:

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

Konfiguriere das US-Datencenter

Das Phrase US-Datencenter wird ebenfalls unterstützt. Das US-Datencenter kann ausgewählt werden, indem der relevante API-Hostname-Parameter in der SDK-Konfiguration übergeben wird:

Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", host: PhraseHost.us);

Beispiel-App

https://github.com/phrase/flutter_sdk_example

OTA iOS-Installation

Mit dem SDK überprüft die App regelmäßig auf aktualisierte Übersetzungen und lädt diese im Hintergrund herunter.

Mac Catalyst wird ebenfalls unterstützt.

Das SDK kann manuell oder über Swift Package Manager, Carthage oder Cocoa Pods installiert werden.

Falls Übersetzungen nicht aktualisiert werden:

  • Stelle sicher, dass die Distributions-ID und das Umgebungspasswort korrekt sind.

  • Stelle sicher, dass ein Release für die aktuelle App-Version erstellt wurde.

  • Lade den ViewController neu, um Änderungen sofort sichtbar zu machen.

Falls die falsche Version einer Übersetzung verwendet wird, stelle sicher, dass ein Release mit den neuesten Übersetzungen und der aktuellen App-Version verfügbar ist.

Swift Package Manager

Füge die öffentliche Repository-URL hinzu (https://github.com/phrase/ios-sdk/). Xcode übernimmt den Rest der Installation automatisch.

Carthage

Füge die folgende Zeile in deinen Cartfile ein:

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

Führe carthage update aus und füge das PhraseApp.framework zu deinem Projekt hinzu, wie in der Carthage-Dokumentation beschrieben.

Cocoa Pods

Füge die folgende Zeile in dein Podfile ein:

pod 'PhraseSDK'

Führe pod install aus. Falls du neu bei CocoaPods bist, sieh dir deren Dokumentation an.

Manuelle Installation

Befolge diese Schritte:

  1. Lade das neueste Release herunter.

  2. Füge PhraseSDK.framework in Xcode als verknüpfte Binärdatei zum Ziel hinzu.

  3. Ein Skript zum Entfernen der zusätzlichen Binärdateien muss ausgeführt werden, bevor du die App hochlädst, da der Apple Store Apps mit Simulator-Binärdateien ablehnt.

    Gehe zu Build Phases und füge einen Run Script Abschnitt hinzu, indem du auf das + Symbol klickst. Füge dieses Skript ein:

    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"

Konfiguration

  1. Importiere PhraseSDK:

    import PhraseSDK
  2. Initialisiere das SDK, indem du den folgenden Code aufrufst:

    Phrase.shared.setup(
      distributionID: <Distribution ID>, 
      environmentSecret: <Environment Secret>
    )
  3. Um die Lokalisierungsdateien zu aktualisieren, rufe Phrase.shared.updateTranslation() auf.

    Diese Methode löst eine Ausnahme aus, wenn das SDK nicht korrekt eingerichtet ist.

    Um OTA zu konfigurieren, um das US-Datencenter zu nutzen, setze den Host, bevor du PhraseApp.shared.updateTranslation() mit Phrase.shared.configuration.apiHost = .us aufrufst.

Es wird empfohlen, beide Funktionen innerhalb des AppDelegate in der Methode applicationDidFinishLaunchingWithOptions aufzurufen.

Objective-C

Integriere das SDK in die Objective-C-Anwendung:

@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"];

  // ODER:
  //
  //  [[Phrase shared] setupWithDistributionID:@"Deine Distribution ID"
  //                         environmentSecret:@"Dein Environment Secret"
  //                                   timeout:10];

  // Aktualisiere Übersetzungen mit Callback-Block:
  [[Phrase shared] updateTranslationsWithCompletionHandler:^(BOOL updated, NSError* error){
    NSLog(@"Aktualisiert: %@", updated ? @"true" : @"false");

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

    // Übersetze über Bundle-Proxy:
    NSString *translation = NSLocalizedString(@"layouts.application.about", @"");
    NSLog(@"NSLocalizedString über Bundle-Proxy: %@", translation);

    // ODER:
    //
    // Übersetze mit Fallback-Methode:
    NSString *otherTranslation = [[Phrase shared]
                                  localizedStringForKey:@"layouts.application.about" value:NULL table:NULL];
    NSLog(@"Phrase.shared localizedStringForKey: %@", otherTranslation);
  }];

  // ODER:
  //
  // [[Phrase shared] updateTranslationsWithCompletionHandler:NULL]; // Ergebnis und Fehler ignorieren (nicht empfohlen)

  // [...] Dein anderer Code
  
  return YES;
}

Swizzling deaktivieren

Um Swizzling zu deaktivieren, setze PhraseSDKMainBundleProxyDisabled auf YES in der Info.plist Datei.

Wenn Swizzling deaktiviert ist, werden aktualisierte Übersetzungen nicht mehr angezeigt. Die Übersetzung wird immer noch synchronisiert, wenn updateTranslation aufgerufen wird und kann mit der Phrase.localizedString() Methode abgerufen werden.

App-Version-Verwaltung

Um zu bestimmen, welche Version zurückgegeben werden soll, benötigt das SDK eine semantische Version der App, damit Übersetzungen aktualisiert werden.

Das SDK versucht, eine semantische Version auf folgende Weise zu erhalten:

  • CFBundleShortVersionString wird verwendet, wenn semantisch.

  • Wenn nicht, wird CFBundleVersion verwendet, wenn semantisch.

  • Wenn beide nicht semantisch sind, wird eine Kombination aus (CFBundleShortVersionString.CFBundleVersion) verwendet.

Wenn CFBundleShortVersionString fehlt oder nicht zusammen mit CFBundleVersion mit einer semantischen Version erstellt werden kann, wirft das SDK die PhraseSetupError.appVersionNotSemantic Nachricht.

Deaktivieren der Übersetzung für mehrere Tabellen

Um zu verhindern, dass OTA andere Tabellen im Haupt-iOS-Bundle übersetzt als die Standard-Localizable-Tabelle, setze die folgende Option:

Phrase.shared.configuration.ignoreOtherTables = true

Callbacks

Einen Callback-Handler anhängen, um erfolgreiche Übersetzungsaktualisierungen zu verarbeiten:

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

Debug-Modus

Falls weitere Informationen benötigt werden, aktiviere den Debug-Modus, um zusätzliche Protokollierungen des PhraseSDK.framework in die Konsole zu erhalten:

Phrase.shared.configuration.debugMode = true

Timeout für Anfragen festlegen

Setze ein Timeout für die Anfragen an Phrase, indem du folgendes aufrufst:

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

Das Standard-Timeout beträgt 10 Sekunden und Verbindungen, die länger als 10 Sekunden dauern, werden geschlossen.

Manuelle Sprachüberschreibung bereitstellen

Falls du nicht die Systemsprache als Sprache verwendest, kann im Init-Aufruf eine andere Sprache festgelegt werden. Der Sprachcode muss in einer Veröffentlichung von Phrase vorhanden sein:

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

Fallback

Falls neue Übersetzungen nicht über das SDK von Phrase abgerufen werden können, werden die neuesten Übersetzungsdateien, die die Installation erhalten hat, verwendet. Falls die App nie neue Dateien von Phrase erhalten hat, werden die kompilierten Übersetzungsdateien der App verwendet. Dies verhindert Fehler bei technischen Schwierigkeiten oder Netzwerkfehlern. Es wird empfohlen, deine kompilierten Übersetzungsdateien in der App mit jeder Veröffentlichung auf dem neuesten Stand zu halten.

Prüfung

Das SDK ist Closed Source und kann nicht eingesehen oder modifiziert werden. Falls es eine Anforderung der Organisation ist, können Prüfungen bereitgestellt werden. Kontaktiere uns für weitere Details, falls erforderlich.

OTA React Native SDK Installation

Mit dem SDK überprüft die App regelmäßig auf aktualisierte Übersetzungen und lädt diese im Hintergrund herunter.

Die Bibliothek für OTA-Übersetzungen funktioniert nur mit der react-i18next-Bibliothek.

Um das React Native SDK zu installieren, folge diesen Schritten:

  1. Führe diesen Befehl aus:

    $ npm install react-native-phrase-sdk --save
  2. Initialisiere Phrase:

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

    Das Dateiformat kann entweder i18next (wie im obigen Beispiel) oder i18next_4 sein, was zu einer i18next v4 Formatdatei führt.

    Phrase US-Datencenter wird ebenfalls unterstützt. Um das React Native SDK mit dem US-Datenzentrum zu verwenden, übergib den entsprechenden Host während der Initialisierung:

    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. Erstelle i18next-Backend basierend auf Instanz:

    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. Initialisiere i18n mit Phrase-Backend:

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

Beispiel i18next.js Datei

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, // nicht nötig für React, da es standardmäßig escaped
    }
  });

Beispiel-App

https://github.com/phrase/react_native_sdk_example

OTA i18next Backend Installation

Die i18next-phrase-backend Bibliothek implementiert ein Beispiel-Backend für i18next, das die Übersetzungen von OTA-Veröffentlichungen abruft.

Um eine neue Veröffentlichung zu erstellen, muss die i18next Plattform für die Distribution eingestellt und Teil einer Veröffentlichung sein.

Verwendung

Um Phrase zu initialisieren:

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

i18n
  .use(I18nextPhraseBackend)
  .init({
    fallbackLng: 'en',
    backend: {
      distribution: 'DISTRIBUTION_ID',
      secret: 'YOUR_ENVIRONMENT_SECRET',
      appVersion: '1.0.0',
    }
  });

Caching

Die Bibliothek speichert Übersetzungen im Cache und überprüft für 5 Minuten nicht auf neue Übersetzungen. Caching kann konfiguriert werden, indem die Option cacheExpirationTime in der Backend-Konfiguration zu Testzwecken gesetzt wird.

i18n
  .use(I18nextPhraseBackend)
  .init({
    fallbackLng: 'en',
    backend: {
      distribution: 'DISTRIBUTION_ID',
      secret: 'YOUR_ENVIRONMENT_SECRET',
      appVersion: '1.0.0',
      cacheExpirationTime: 60 * 5, // Zeit in Sekunden
    }
  });

Hinweis

Es wird empfohlen, in Produktionsumgebungen mindestens 5 Minuten Caching-Zeit zu verwenden.

Beispiel-App

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

OTA Rails Backend Installation

Die phrase-ota-i18n Bibliothek implementiert ein Beispiel-Backend für das I18n gem, das die Übersetzungen von OTA-Releases abruft. Mit der Bibliothek überprüft die Anwendung regelmäßig auf aktualisierte Übersetzungen und lädt sie im Hintergrund herunter.

Die Bibliothek ist für jede Ruby-Anwendung gültig, die das i18n gem verwendet.

Um ein neues Release zu erstellen, muss die Rails Plattform für die Distribution festgelegt und Teil eines Releases sein.

Installation

  1. Füge die folgende Zeile zur Gemfile der Anwendung hinzu:

    gem 'phrase-ota-i18n'
  2. Ausführen:

    $ bundle install
  3. Alternativ installiere es mit:

    $ gem install phrase-ota-i18n

Verwendung

Um die Konfiguration zu generieren:

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

Fehlersuche

Das gem hat eine Debug-Konfiguration, die im Initializer aktiviert werden kann:

config.debug = true
War dieser Beitrag hilfreich?

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.