Gli aggiornamenti over-the-air (OTA) offrono un modo flessibile per consegnare aggiornamenti di traduzione ad applicazioni per dispositivi mobili e web senza richiedere una nuova versione su App Store, Google Play o altre piattaforme di distribuzione. Questo approccio supporta la localizzazione continua e i flussi di lavoro di sviluppo agile riducendo ritardi e processi manuali.
La funzione OTA di Phrase Strings si integra con le piattaforme iOS, Android, React Native, Flutter, i18next e Rails. Gli aggiornamenti per le etichette di testo vengono istantaneamente inviati alle app per dispositivi mobili.
È necessario creare una nuova versione in ordine all’applicazione delle impostazioni aggiornate. Tutti i contenuti inclusi in una versione devono essere disponibili in Phrase Strings, che trasmette le traduzioni direttamente all'applicazione. Se il contenuto non è presente, le traduzioni non verranno consegnate.
Per le applicazioni per dispositivi mobili, OTA richiede l’integrazione del relativo Software Development Kit (SDK) nell’applicazione per recuperare traduzioni da Phrase Strings a runtime.
Quando si avvia un'applicazione che implementa iOS, Android, React Native o Flutter SDK per la prima volta su un dispositivo, viene generato un identificatore univoco e casuale del dispositivo. Questo identificatore traccia gli utenti attivi in un determinato periodo di tempo. Non viene utilizzato per altre forme o mezzi di tracciabilità e non contiene informazioni sull'utente o sul dispositivo.
L’unico limite relativo all’OTA è il numero di utenti attivi mensili (MAU), a seconda del piano tariffario selezionato.
MAU è il numero di dispositivi univoci da cui vengono richieste le traduzioni. A ogni dispositivo viene assegnato un ID casuale. Il MAU viene calcolato in base al numero di ID univoci assegnati negli ultimi 30 giorni. Ogni interazione con i server phrase è considerata una richiesta.
Dati inviati con richieste OTA
L’SDK comunica con il servizio OTA ordine verificare la presenza di aggiornamenti e include i seguenti dettagli con ogni richiesta:
-
Identificatore del dispositivo (ad es. "F3AFCB10-80A2-84CB-94C0-27F5EF58876D". Unico per questa app e quindi non consente il monitoraggio di un dispositivo specifico.)
-
Versione dell'app (ad es. "1.2.0")
-
Ultimo aggiornato del file di traduzione (ad es. "1542187679")
-
Versione SDK (ad esempio "1.0.0")
-
Impostazioni locali (ad es. "de-DE")
-
Formato file (ad es. "Strings")
-
Cliente (ad es. "ios")
-
ID distribuzione (ID distribuzione)
-
Chiave privata ambientale (per distinguere tra sviluppo e produzione)
Le distribuzioni sono una configurazione configurata che definisce come e dove vengono consegnati gli aggiornamenti OTA per una piattaforma o un progetto specifico.
Le piattaforme di destinazione sono definite all'interno della distribuzione:
-
iOS
-
Android
-
Flutter
-
i18next
-
Rails
Sono possibili più distribuzioni, ma idealmente c'è una distribuzione per progetto. Se utilizzi una distribuzione per iOS e Android, i segnaposto per i due formati vengono automaticamente convertiti.
Fallback
Se i fallback della lingua sono impostati nelle impostazioni della lingua del progetto a cui è connessa la distribuzione, vengono visualizzate Strings della lingua selezionata se esiste la lingua richiesta, ma la chiave non viene tradotta.
Se viene utilizzata una lingua specifica del paese (ad esempio en-GB), ma non fa parte della versione, il sistema può ricorrere a una versione standard (ad esempio en) di tale lingua se esiste nel progetto. Se la lingua richiesta non viene trovata, è possibile utilizzare le impostazioni locali predefinite del progetto.
Crea una distribuzione
Per creare una distribuzione, segui i passaggi riportati di seguito:
-
Dalla Box Configura o sul numero di configurazioni se ne esistono già alcune.
nella pagina fare clic suLa pagina
apre e mostra le configurazioni esistenti. -
Fai clic su Nuova distribuzione. Si apre la finestra .
-
Nella scheda Generale, fornire un , a quale è associata la distribuzione, le richieste e richieste.
-
Per le distribuzioni Android, fare clic sulla scheda Android per selezionare l'opzione di formato che include qualsiasi traduzione inclusi tag HTML in CDATA, se necessario.
-
Dopo aver selezionato il progetto da associare alla distribuzione, diventa disponibile la scheda Pianificazione. Se necessario, usa questa scheda per configurare versioni pianificate nella distribuzione.
-
-
Nella scheda Lingue di failback, seleziona le impostazioni di fallback specifiche della distribuzione come richiesto. Le opzioni di failback hanno la priorità come visualizzato nell'elenco.
-
Facoltativamente, fare clic sulla scheda Traduzioni per selezionare l'opzione per usare l'ultima versione revisionata delle traduzioni. Abilita questa opzione solo quando si lavora con il flusso di lavoro.
-
Fai clic su Salva.
I dettagli di distribuzione vengono visualizzati con gli ID richiesti dagli SDK. I dettagli possono essere visualizzati di nuovo cliccando sulla distribuzione dalla pagina
.
Per aggiornare le traduzioni, crea una nuova versione all'interno della distribuzione. Lo stato corrente del progetto viene esportato e reso disponibile ai clienti connessi.
Per creare una versione, segui i passaggi riportati di seguito:
-
Dalla pagina Over the air fare clic su Aggiungi versione accanto alla distribuzione richiesta.
Si apre la finestra della
. -
Fornire una
, le , , e richieste.Se necessario, inserisci i tags per includere solo le chiavi con tags specifici nella versione.
-
Fai clic su Salva.
La versione viene aggiunta all'elenco in fondo alla pagina dei dettagli di distribuzione.
Per configurare pianificazioni ricorrenti per il rilascio della distribuzione, segui i passaggi riportati di seguito:
-
Dalla pagina
, clicca sull'iconaruota dentata accanto alla distribuzione richiesta.
Viene visualizzata la finestra
. -
Seleziona la scheda Pianificazione versioni e fai clic su .
Vengono visualizzate le opzioni di pianificazione del rilascio.
Nota
Le opzioni di pianificazione sono disponibili anche al momento della creazione di una nuova distribuzione.
-
Dal menu a discesa
versione, scegli la frequenza delle versioni selezionando una delle opzioni disponibili:-
-
Seleziona i giorni feriali desiderati per le versioni pianificate.
-
-
Fornisci un'ora e
rilevante. -
Se necessario, selezionare
, e per le versioni pianificate.-
Il campo
viene visualizzato solo se il branching è abilitato nel progetto. La selezione di un branch aggiorna l'elenco di impostazioni locali e lingue.
-
-
Facoltativamente, specificare le versioni dell'applicazione nei campi
e .Lascia vuoto per applicare la versione di pianificazione a tutte le versioni dell'app.
-
Fai clic su Salva.
La distribuzione viene aggiornata con informazioni sulla pianificazione delle versioni.
La disabilitazione della pianificazione interrompe il rilascio automatico della distribuzione, ma le impostazioni configurate vengono salvate.
L'integrazione dell'SDK o della libreria Web appropriata per dispositivi mobili consente l'aggiornamento delle traduzioni con un solo clic, ma fornisce anche metriche per misurare l'utilizzo. I rapporti sull'SDK e sulla libreria Web per dispositivi mobili offrono informazioni preziose sugli utenti attivi dell'app e sulle loro lingue. Questo set di rapporti è disponibile per ogni distribuzione e i dati vengono aggiornati due volte al giorno.
Vengono forniti rapporti per il numero di utenti attivi, richieste complessive, richieste per lingua, richieste per piattaforma e per le lingue del dispositivo non fornite.
Ai rapporti per ogni distribuzione si accede tramite l'icona nella pagina .
Con l'SDK, l'app verifica regolarmente la presenza di traduzioni aggiornate e le scarica in background.
Controlla regolarmente le ultime versioni dell'SDK per Android, soprattutto considerando gli aggiornamenti.
Se le traduzioni non vengono aggiornate:
-
Assicurati che ID distribuzione e chiave privata d'ambiente siano corretti.
-
Assicurati che sia stata creata una versione per la versione dell'app corrente.
-
Ricarica il
ViewController
per fare apparire immediatamente le modifiche.
Se si utilizza la versione sbagliata di una traduzione, assicurarsi che sia disponibile una versione con le traduzioni più recenti e la versione dell'app corrente e che sia impostato il versionName
per l'app e che si utilizzi il formato <major>.<minor>.<point>.
Requisiti
-
L'SDK richiede almeno la versione appcompat 1.2.0. Se utilizzi una versione precedente di appcompat, considera l'utilizzo dell'SDK versione 2.1.3
-
La libreria dipende da AndroidX per supportare elementi dell'interfaccia utente retrocompatibili come la barra degli strumenti.
Includi l'SDK
Aggiungi un nuovo archivio alla root build.gradle
:
allprojects { repositories { ... maven { url "https://maven.download.phrase.com" } } }
Aggiungi la libreria come dipendenza:
dependencies { implementation "com.phrase.android:ota-sdk:3.5.0" ... }
Supporto Jetpack Compose
Per abilitare il supporto Jetpack Compose per le traduzioni OTA, segui i passaggi riportati di seguito:
-
Aggiungere la libreria
implementation "com.phrase.android:ota-sdk-compose:3.5.0"
alla rootbuild.gradle
. -
Includi il codice Jetpack Compose in
Phrase { ... }
.
Configurazione
Inizializza l'SDK nella classe applicazione e aggiungi l'ID distribuzione e la chiave privata d'ambiente. Le classi ereditate dall'applicazione dovrebbero sovrascrivere attackBaseContext
per abilitare traduzioni al di fuori del contesto di attività:
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)); } }
Inietta l'SDK in ogni attività, ad esempio creando un'attività di base da cui tutte le altre attività ereditano:
public class BaseActivity extends AppCompatActivity { @NonNull @Override public AppCompatDelegate getDelegate() { return Phrase.getDelegate(this, super.getDelegate()); } }
Le traduzioni possono essere utilizzate come al solito nei layout:
<TextView android:text="@string/translation_key" />
E codice interno:
TextView text = (TextView) findViewById(R.id.text_id); text.setText(R.string.translation_key);
Alcune librerie non supportano lo srotolamento automatico del contesto e si aspettano una classe specifica. In questo caso l’avvolgimento del contesto nei componenti Jetpack Compose può essere disabilitato con:
Phrase(contextWrapping = false) { Text( text = phraseString(R.string.test) ) }
Configurazioni per i livelli di registro:
-
Java
PhraseLog.setLogLevel(Severity.Debug);
-
Kotlin
PhraseLog.logLevel = Severity.Verbose
-
Altre opzioni di registrazione supportate
-
None
-
Error
-
Warning
-
Info
-
Debug
-
Verbose
-
Modifica lingua
Se non si utilizza la lingua del sistema, è possibile impostare una lingua diversa nel metodo setLocaleCode
. Il codice della lingua (impostazioni locali) dev’essere presente in una versione.
Phrase.setLocaleCode("fr"); Phrase.updateTranslations();
Versione dell'app personalizzata
L'SDK utilizza la versione dell'app per impostazione predefinita per restituire una versione che corrisponda ai vincoli di rilascio per la versione min e max. La versione dell'app deve usare il controllo delle versioni semantico, altrimenti la traduzione non viene aggiornata. Se l'app non usa il controllo delle versioni semantico, è possibile sostituire manualmente la versione dell'app utilizzata.
Esempio:
Phrase.setAppVersion("3.2.4");
La versione deve essere impostata prima di chiamare updateTranslations( )
.
Timeout impostato
Il timeout predefinito per i download di traduzioni è impostato su 10s.
L’impostazione predefinita può essere modificata con:
Phrase.setTimeout(10000); // Timeout in milliseconds
Aggiorna richiamata
Se è necessaria la gestione di aggiornamenti della traduzione riusciti, allega un gestore della richiamata:
Phrase.updateTranslations(new TranslationsSyncCallback() { @Override public void onSuccess(boolean translationsChanged) { } @Override public void onFailure() { } });
Gli aggiornamenti della traduzione possono anche essere attivati manualmente. Le traduzioni recuperate vengono visualizzate all’Avanti lancio dell’applicazione.
Per rendere immediatamente disponibili le traduzioni più recenti, usa il metodo Phrase.applyPendingUpdates()
. Questo può essere combinato con l'ascolto degli aggiornamenti della traduzione:
Phrase.updateTranslations(new TranslationsSyncCallback() { @Override public void onSuccess(boolean translationsChanged) { if(translationsChanged) { Phrase.applyPendingUpdates() // Custom logic to refresh UI } } @Override public void onFailure() { } });
L'interfaccia utente non mostra automaticamente le traduzioni e deve essere ricreata.
Configura data center USA
È supportato anche il data center phrase USA. Il data center USA può essere configurato chiamando:
Phrase.setHost("https://ota.us.phrase.com/")
Fallback
Se non è possibile raggiungere phrase a causa di una connessione di rete mancante del cliente o di un'interruzione del servizio, l'SDK utilizza le traduzioni in bundle dal file di risorse. Si consiglia di aggiornare regolarmente le traduzioni in bundle nell'app. L'SDK memorizza anche nella cache le traduzioni localmente sul dispositivo. Se tale cache esiste, verrà utilizzata fino alla traduzione Avanti aggiornata.
L'SDK usa la versione più recente per le traduzioni. Se il versionName
per l'app è impostato, verrà utilizzata la versione più recente che soddisfa le restrizioni di versione.
Aggiungi una nuova lingua
Creazione della nuova lingua in phrase e creare di una nuova versione. L'SDK recupera la lingua quando questa è la lingua del dispositivo di un utente. È consigliabile aggiungere regolarmente un nuovo strings.xml
per i file di nuove lingue quando si rilascia una nuova versione dell'app o gli utenti vedranno solo le traduzioni di failback determinate da Android al primo avvio dell'app.
Audit
L'SDK è di origine chiusa e non può essere visualizzato o modificato. Se si tratta di un requisito dell'organizzazione, possono essere forniti audit. Contattaci per maggiori dettagli se necessario.
Supporto visualizzazione personalizzata
Le visualizzazioni personalizzate possono essere tradotte utilizzando attributi in stile. Poiché TypedArray
non consente la sovrascrittura delle risorse, sono necessarie lievi modifiche nella visualizzazione personalizzata:
-
Esempio Kotlin
Prima di:
context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyleAttr, 0).use { text = it.getText(R.styleable.CustomView_android_text) }
Dopo:
context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyleAttr, 0).use { text = it.getTextWithPhrase(R.styleable.CustomView_android_text) }
-
Esempio Java
Prima di:
final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyleAttr, 0); try { setText(ta.getText(R.styleable.CustomView_android_text)); } finally { ta.recycle(); }
Dopo:
final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyleAttr, 0); try { setText(PhraseTypedArray.getTextWithPhrase(ta, R.styleable.CustomView_android_text)); } finally { ta.recycle(); }
Esempio di app
Con l'SDK, l'app verifica regolarmente la presenza di traduzioni aggiornate e le scarica in background.
Requisiti
Questa libreria dipende dalla versione 0.18.0 della libreria intl di Flutter.Segui la loro guida per aggiungere il supporto alle localizzazioni all'app.
Installazione
Aggiungi phrase a pubspec.yaml:
dependencies: phrase: ^2.5.1 ... intl: ^0.18.0 flutter_localizations: sdk: flutter ... flutter: generate: true ...
Come nella libreria intl
, la generazione di codice viene usata per elaborare i file ARB. Esegui questo comando per aggiornare:
flutter pub run phrase
Utilizzando build_runner:
flutter pub run build_runner watch
Utilizzo
Inizializza phrase nel file 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( title: "Flutter Demo", //.. localizzazioniDelegati: PhraseLocalizations.localizationsDelegates, Locali supportati: PhraseLocalizations.supportedLocales, ); } }
Accedi ai messaggi con:
Text(AppLocalizations.of(context)!.helloWorld);
Personalizzazione
Aggiorna comportamento
Le traduzioni OTA vengono aggiornate ogni volta che si lancia l'app. Per disabilitare ciò:
Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", checkForUpdates: false);
Per aggiornare manualmente:
Phrase.updateTranslations(context).then((_) => print("Done!"));
Versione dell'app personalizzata
L'SDK utilizza la versione dell'app per impostazione predefinita per restituire una versione che corrisponda ai vincoli di rilascio per la versione min e max. La versione dell'app deve usare il controllo delle versioni semantico altrimenti non verrà restituito alcun aggiornamento della traduzione. Se l’app non usa il controllo delle versioni semantico, la versione dell’app può essere sovrascritta manualmente: è possibile sostituire manualmente la versione dell’app:
Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", customAppVersion: "1.2.3");
Configura data center USA
È supportato anche il data center phrase USA. Il data center statunitense può essere selezionato passando il parametro hostname API rilevante nella configurazione dell’SDK:
Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", host: PhraseHost.us);
Esempio di app
Con l'SDK, l'app verifica regolarmente la presenza di traduzioni aggiornate e le scarica in background.
È supportato anche Mac Catalyst.
L'SDK può essere installato manualmente o tramite Swift Package Manager, Carthage o Cocoa Pods.
Se le traduzioni non vengono aggiornate:
-
Assicurati che ID distribuzione e chiave privata d'ambiente siano corretti.
-
Assicurati che sia stata creata una versione per la versione dell'app corrente.
-
Ricarica il
ViewController
per fare apparire immediatamente le modifiche.
Se si utilizza la versione sbagliata di una traduzione, assicurarsi che sia disponibile una versione con le traduzioni più recenti e la versione dell'app corrente.
Swift Package Manager
Aggiungi l’URL dell’archivio pubblico (https://GitHub.com/Phrase/ios-sdk/). Xcode gestisce automaticamente il resto dell'installazione.
Cartagine
Aggiungi la seguente riga nel tuo Cartfile:
binary "https://raw.githubusercontent.com/phrase/ios-sdk/master/PhraseSDK.json" ~> 3.0.0
Esegui Carthage Update e aggiungi PhraseApp.framework
al tuo progetto come descritto nella documentazione Carthage.
Cialde di cacao
Aggiungi la seguente riga nel tuo Podfile:
pod 'PhraseSDK'
Esegui installazione pod. Se sei nuovo su CocoaPods, consulta la loro documentazione.
Installazione manuale
Segui questi passaggi:
-
Scarica la versione più recente.
-
Aggiungi
PhraseSDK.framework
in Xcode come binario collegato alla destinazione. -
Uno script per rimuovere i binari extra deve essere eseguito prima di caricare l'app poiché l'Apple Store rifiuta le app inclusi i binari del simulatore.
Vai a
e aggiungi una sezione cliccando sul simbolo +. Incolla in questo script: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"
Configurazione
-
Importa PhraseSDK:
import PhraseSDK
-
Inizializza l'SDK chiamando il seguente codice:
Phrase.shared.setup( distributionID: <Distribution ID>, environmentSecret: <Environment Secret> )
-
Per aggiornare i file di localizzazione chiamare
Phrase.shared.updateTranslation()
.Questo metodo comporterà un'eccezione se la configurazione dell'SDK non è corretta.
Per configurare OTA per usare il data center statunitense, impostare l’host prima di chiamare
PhraseApp.shared.updateTranslation()
conPhrase.shared.configuration.apiHost = .us
.
Si consiglia di chiamare entrambe le funzioni all'interno dell'AppDelegate
nel metodo applicationDidFinishLaunchingWithOptions
.
Obiettivo-C
Integrare l’SDK nell’applicazione 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; }
Disabilita scorrimento
Per disabilitare lo swizzling, impostare PhraseSDKMainBundleProxyDisabled
su YES nel file Info.plist
.
Quando lo swizzling è disabilitato, le traduzioni aggiornate non vengono più visualizzate. La traduzione verrà comunque sincronizzata se viene chiamato updateTranslation
ed è possibile accedervi con il metodo Phrase.localizedString()
.
Gestione della versione dell'app
Per determinare quale versione deve essere restituita, l'SDK richiede una versione semantica dell'app in modo che le traduzioni vengano aggiornate.
L'SDK tenta di ottenere una versione semantica nel modo seguente:
-
CFBundleShortVersionString
viene usato semanticamente. -
In caso contrario,
CFBundleVersion
viene usato semantico. -
Se entrambi non sono semantici, viene utilizzata una combinazione di (
CFBundleShortVersionString.CFBundleVersion
).
Se CFBundleShortVersionString
manca o non può essere creato con una versione semantica insieme a CFBundleVersion
, l'SDK invia il messaggio PhraseSetupError.appVersionNotSemantic
.
Disabilita traduzione per tabelle multiple
Per impedire a OTA di tradurre altre tabelle nel bundle principale di iOS diverse dalla tabella Localizzabile
predefinita, impostare la seguente opzione:
Phrase.shared.configuration.ignoreOtherTables = true
Chiamate
Allega un gestore di richiamate per gestire gli aggiornamenti della traduzione riusciti:
Phrase.shared.updateTranslation { result in switch result { case .success(let updated): case .failure: } }
Modalità debug
Se sono necessarie ulteriori informazioni, abilitare la modalità Debug per ottenere una registrazione aggiuntiva di PhraseSDK.framework
nella console:
Phrase.shared.configuration.debugMode = true
Imposta il timeout per le richieste
Imposta un timeout per le richieste contro phrase chiamando:
Phrase.shared.configuration.timeout = TimeInterval(20)
Il timeout predefinito è di 10 secondi e le connessioni che richiedono più di 10 secondi verranno chiuse.
Fornisci la sostituzione manuale della lingua
Se non si utilizza la lingua del sistema come impostazioni locali, è possibile impostare impostazioni locali diverse nella chiamata iniziale. Il codice delle impostazioni locali deve essere presente in una versione di phrase:
Phrase.shared.configuration.localeOverride = "en-US"
Fallback
Se non è possibile recuperare nuove traduzioni da phrase tramite l'SDK, vengono utilizzati i file di traduzione più recenti ricevuti dall'installazione. Se l'app non ha mai ricevuto nuovi file da phrase, usa i file di traduzione compilati dall'app. Ciò evita errori in caso di difficoltà tecniche o errori di rete. Si consiglia di mantenere aggiornati i file di traduzione compilati nell'app con ogni versione.
Audit
L'SDK è di origine chiusa e non può essere visualizzato o modificato. Se si tratta di un requisito dell'organizzazione, possono essere forniti audit. Contattaci per maggiori dettagli se necessario.
Con l'SDK, l'app verifica regolarmente la presenza di traduzioni aggiornate e le scarica in background.
La libreria per le traduzioni OTA funziona solo con la libreria react-i18next.
Per installare React Native SDK, segui i passaggi riportati di seguito:
-
Esegui questo comando:
$ npm install react-native-phrase-sdk --save
-
Inizializza phrase:
import Phrase from "react-native-phrase-sdk"; let phrase = new Phrase( "YOUR_DISTRIBUTION_ID", "YOUR_DEVELOPMENT_OR_PRODUCTION_SECRET", "YOUR_APP_VERSION", "i18next" );
Il formato file può essere
i18next
(come nell'esempio sopra) oi18next_4
, il che risulta nel file in formato i18next v4.È supportato anche il data center phrase US. Per usare React Native SDK con il data center statunitense, passa l’host rilevante durante l’inizializzazione:
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/" );
-
Creare backend i18next in base all'istanza:
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)
-
Inizializza i18n con il backend phrase:
i18n .use(ChainedBackend) .use(initReactI18next) .init({ backend: { backends: [backendPhrase, backendFallback] } //... });
File di esempio 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 } });
Esempio di app
La libreria i18next-Frase-backend implementa un backend di esempio per i18next che recupera le traduzioni dalle versioni OTA.
Per creare una nuova versione, la piattaforma
deve essere impostata per la distribuzione ed essere parte di una versione.Utilizzo
Per inizializzare phrase:
import i18n from "i18next"; import { I18nextPhraseBackend } from "@phrase/i18next-backend"; i18n .use(I18nextPhraseBackend) .init({ fallbackLng: 'en', backend: { distribuzione: "ID_DISTRIBUZIONE", segreto: 'YOUR_ENVIRONMENT_SECRET', appVersion: '1.0.0', } });
Caching
La libreria memorizza nella cache le traduzioni e non controllerà la presenza di nuove traduzioni per 5 minuti. Il caching può essere configurato impostando l'opzione cacheExpirationTime
nella configurazione del backend a fini di test.
i18n .use(I18nextPhraseBackend) .init({ fallbackLng: 'en', backend: { distribuzione: "ID_DISTRIBUZIONE", segreto: 'YOUR_ENVIRONMENT_SECRET', appVersion: '1.0.0', cacheExpirationTime: 60 * 5, // tempo in secondi } });
Nota
Si consiglia di usare almeno 5 minuti di caching negli ambienti di produzione.
Esempio di app
La libreria Phrase-OTA-i18n implementa un backend di esempio per la gemma I18n che recupera le traduzioni dalle versioni OTA. Con la libreria, l'applicazione verifica regolarmente la presenza di traduzioni aggiornate e le scarica in background.
La libreria è valida per qualsiasi applicazione Ruby che utilizzi la gemma i18n.
Per creare una nuova versione, la piattaforma
deve essere impostata per la distribuzione ed essere parte di una versione.Installazione
-
Aggiungi la seguente riga al Gemfile dell'applicazione:
gem 'phrase-ota-i18n'
-
Esegui:
$ bundle install
-
In alternativa, installalo come:
$ gem install phrase-ota-i18n
Utilizzo
Per generare la configurazione:
bundle exec rails generate phrase_ota:install --distribution-id <DISTRIBUTION_ID> --secret-token <SECRET>
Debug
La gemma ha una configurazione di Debug
che può essere abilitata nell'inizializzatore impostando:
config.debug = true