Atualize traduções para aplicativos iOS, Android, React Native e Flutter com um único clique sem lançar uma nova versão na App Store ou no Google Play. As atualizações de etiquetas de texto são pushed instantaneamente para aplicativos móveis.
O Over-the-Air (OTA) também se integra com as plataformas i18Next e Rails, permitindo que os usuários atualizem e gerenciem conteúdo localizado em aplicativos da Web sem precisarem de uma redefinição.
É necessário criar um novo lançamento para pedido das configurações atualizadas serem aplicadas. Todo o conteúdo incluído em um lançamento deve estar disponível no Phrase Strings, que transmite traduções diretamente ao aplicativo. Se o conteúdo não estiver presente, as traduções não serão entregues.
Ao iniciar um aplicativo que implemente o iOS, Android, React Native ou Flutter SDK pela primeira vez em um dispositivo, um identificador de dispositivo exclusivo e aleatório é gerado. Este identificador rastreia usuários ativos em um período dado. Ele não é usado para qualquer outra forma ou meio de rastreamento e não contém informações de usuário ou dispositivo.
O único limite para a OTA é o montante de MAU (usuários ativos mensalmente), dependendo do plano de preços selecionado.
O MAU é o número de dispositivos exclusivos a partir dos quais as traduções são solicitadas. A cada dispositivo é atribuído um ID aleatório, e o MAU é calculado a partir do número de IDs diferentes atribuídos nos últimos 30 dias. Qualquer interação com servidores phrase é considerada uma solicitação.
Dados
O SDK comunica com o serviço OTA pedido verificar atualizações e inclui os seguintes detalhes com cada solicitação:
-
Identificador do dispositivo (p.ex: "F3AFCB10-80A2-84CB-94C0-27F5EF58876D". É exclusivo para este aplicativo e, portanto, não permite o rastreamento de um dispositivo específico.)
-
Versão do aplicativo (p.ex: "1.2.0")
-
Última atualização do arquivo de tradução (p.ex: "1542187679")
-
Versão de SDK (p.ex: "1.0.0")
-
Local (p.ex. "de-DE")
-
Formato de arquivo (p.ex. "Strings")
-
Cliente (p.ex. "ios")
-
ID de distribuição (ID da distribuição)
-
Segredo ambiental (para distinguir entre o desenvolvimento e a produção)
As plataformas de tradução são definidas na distribuição:
-
iOS
-
Android
-
Flutter
-
i18next
-
Rails
As distribuições múltiplas são possíveis, mas idealmente há uma distribuição por projeto. Se utilizar uma distribuição para iOS e Android, os marcadores de posição dos dois formatos são convertidos automaticamente.
Fallbacks
Se fallbacks de idioma forem definidos nas configurações de idioma do projeto ao qual a distribuição está conectada, Strings do idioma selecionado serão exibidos se o idioma solicitado existir, mas a chave não for traduzida.
Se um idioma específico de país (por exemplo, en-GB) for usado, mas não fizer parte do lançamento, o sistema poderá voltar a usar uma versão padrão (por exemplo, en) desse idioma se ele existir no projeto. Se o idioma solicitado não for encontrado, o local padrão do projeto poderá ser utilizado.
Criar uma distribuição
Para criar uma distribuição, siga estes passos:
-
Na caixa configuração ou no número de configurações, se algumas já existirem.
na página de , clique emA página
é aberta e mostra configurações existentes. -
Clique em Nova distribuição. A janela é aberta.
-
Na aba Geral, forneça um , ao qual o a distribuição está associado, os necessários e as necessárias.
-
Para as distribuições Android, clique na aba Android para selecionar a opção de formato que inclua qualquer tradução contendo tags HTML em CDATA, se necessário.
-
Após selecionar o projeto a ser associado à distribuição, a aba Cronograma fica disponível. Se necessário, use esta aba para configurar lançamentos programados OTA na distribuição.
-
-
Na aba idiomas de fallback, selecione configurações de fallback específicas da distribuição conforme necessário. As opções de fallback são prioritárias conforme exibido na lista.
-
Opcionalmente, clique na aba traduções para selecionar a opção para usar a versão mais recente revisada das traduções.
-
Clique em Gravar.
Os detalhes da distribuição são exibidos com IDs exigidos pelos SDKs. Detalhes podem ser exibidos novamente clicando na distribuição na página
.
Para atualizar traduções, crie um novo lançamento na distribuição. O estado atual do projeto é exportado e disponibilizado a clientes conectados.
Para criar um lançamento, siga estes passos:
-
Na página Over the air, clique em Adicionar lançamento ao lado da distribuição necessária.
A janela
é aberta. -
Forneça uma
, necessária, , e .Se necessário, insira tags para incluir apenas chaves com tags específicos no lançamento.
-
Clique em Gravar.
O lançamento está adicionado à lista na parte de baixo da página de detalhes de distribuição.
Para configurar cronogramas recorrentes para lançar a distribuição, execute estas etapas:
-
Na página
, clique no ícone dede roda de caule ao lado da distribuição desejada.
A janela
é exibida. -
Selecione a aba Cronograma lançamento e clique em .
As opções de programação do lançamento são exibidas.
Nota
As opções de agendamento também estão disponíveis na criação de uma nova distribuição.
-
No
suspenso, escolha a frequência de lançamento selecionando uma das opções disponíveis:-
-
Selecione os dias úteis desejados para os lançamentos programados.
-
-
Forneça um horário e
relevantes. -
Se necessário, selecione
, e para os lançamentos programados.-
O campo
é exibido somente se a ramificação estiver ativada no projeto. Selecionar um ramo atualiza a lista de locais e idiomas.
-
-
Opcionalmente, especifique as versões do aplicativo nos campos
e .Deixe em branco para aplicar o lançamento do cronograma a todas as versões do aplicativo.
-
Clique em Gravar.
A distribuição é atualizada com informações de cronograma de lançamento.
Desativar o cronograma interrompe o lançamento automático da distribuição, mas as configurações configuradas são gravadas.
A integração do SDK móvel apropriado ou da biblioteca da Web permite atualizar traduções com um único clique, mas também fornece métricas para medir o uso. Os relatórios do SDK móvel e da Biblioteca Web fornecem informações valiosas sobre usuários ativos do aplicativo e seus idiomas de aplicativo. Este conjunto de relatórios pode ser acessado para cada distribuição e os dados dos relatórios são atualizados duas vezes por dia.
São fornecidos relatórios sobre o número de usuários ativos, solicitações gerais, solicitações por idioma, solicitações por plataforma e idiomas de dispositivos não fornecidos.
Os relatórios para cada distribuição são acessados pelo ícone de na página .
Com o SDK, o aplicativo verifica regularmente traduções atualizadas e faz download deles no background.
Verifique regularmente as últimas lançamentos do SDK Android, especialmente considerando upgrades.
Se as traduções não estiverem sendo atualizadas:
-
Certifique-se de que o ID de distribuição e o segredo do ambiente estão corretos.
-
Certifique-se de que um lançamento foi criado para a versão atual do aplicativo.
-
Recarregue o
ViewController
para fazer as alterações aparecerem imediatamente.
Se a versão errada de uma tradução estiver sendo usada, certifique-se de que um lançamento com as traduções mais recentes e a versão atual do aplicativo está disponível e o versionName
para o aplicativo definido e está usando o formato <Maior>.<Menor>.<point>.
Formato.
Requisitos
-
O SDK requer pelo menos a versão appcompat 1.2.0. Se estiver usando uma versão mais antiga do appcompat, considere usar a Versão SDK 2.1.3
-
A biblioteca depende do AndroidX para usar elementos de interface compatíveis com a anterior, como a barra de ferramentas.
Incluir o SDK
Adicionar um novo repositório ao build.gradle
raiz:
allprojects { repositories { ... maven { url "https://maven.download.phrase.com" } } }
Adicionar a biblioteca como dependência:
dependencies { implementation "com.phrase.android:ota-sdk:3.5.0" ... }
Suporte para Jetpack
Para ativar o suporte do Jetpack Compose para traduções OTA, execute estas etapas:
-
Adicione a biblioteca
implementação "com.phrase.android:ota-sdk-compose:3.5.0"
aobuild.gradle
raiz. -
Envolva o código do Jetpack Compose no
Phrase {...}
.
Configuração
Inicialize o SDK na classe do aplicativo e adicione o ID de distribuição e o segredo do ambiente. As classes herdadas do Aplicativo devem substituir AddBaseContext
para ativar traduções fora do contexto da atividade:
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)); } }
Injectar o SDK em cada atividade, p.ex., criando uma atividade base da qual todas as outras atividades herdam:
public class BaseActivity extends AppCompatActivity { @NonNull @Override public AppCompatDelegate getDelegate() { return Phrase.getDelegate(this, super.getDelegate()); } }
As traduções podem ser usadas como normalmente nos layouts:
<TextView android:text="@string/translation_key" />
E dentro do código:
TextView text = (TextView) findViewById(R.id.text_id); text.setText(R.string.translation_key);
Algumas bibliotecas não aceitam o desenchimento automático do contexto e esperam uma classe específica. Neste caso, a envoltura de contexto nos componentes Jetpack Compose pode ser desativada com:
Phrase(contextWrapping = false) { Text( text = phraseString(R.string.test) ) }
Configurações para níveis de registro:
-
Java
PhraseLog.setLogLevel(Severity.Debug);
-
Kotlin
PhraseLog.logLevel = Severity.Verbose
-
Outras opções de registro aceitas
-
None
-
Error
-
Warning
-
Info
-
Debug
-
Verbose
-
Alterar idioma
Se não estiver usando o idioma do sistema, um idioma diferente poderá ser definido no método setLocaleCode
. O código do idioma (local) deve estar presente em um lançamento.
Phrase.setLocaleCode("fr"); Phrase.updateTranslations();
Versão personalizada do aplicativo
O SDK usa a versão do aplicativo como padrão para retornar um lançamento que corresponda às restrições de lançamento para a versão mínima e máxima. A versão do aplicativo deve usar a versão semântica, caso contrário, nenhuma atualização da tradução será gerada. Caso o aplicativo não use a versão semântica, é possível substituir manualmente a versão do aplicativo usado.
Exemplo:
Phrase.setAppVersion("3.2.4");
A versão precisa ser definida antes de ligar updateTranslations(
).
Confirmar tempo limite
O tempo limite padrão para downloads de tradução está definido para 10 segundos.
O padrão pode ser alterado com:
Phrase.setTimeout(10000); // Timeout in milliseconds
Atualizar retorno
Se o tratamento de atualizações de tradução bem-sucedidas for necessário, anexe um operador de retorno:
Phrase.updateTranslations(new TranslationsSyncCallback() { @Override public void onSuccess(boolean translationsChanged) { } @Override public void onFailure() { } });
As atualizações da tradução também podem ser acionadas manualmente. As traduções recém-checadas são exibidas no lançamento do Seguinte aplicativo.
Para tornar as últimas traduções disponíveis imediatamente, use o método Phrase.applyPendingUpdates
() . Isso pode ser combinado com ouvir atualizações de tradução:
Phrase.updateTranslations(new TranslationsSyncCallback() { @Override public void onSuccess(boolean translationsChanged) { if(translationsChanged) { Phrase.applyPendingUpdates() // Custom logic to refresh UI } } @Override public void onFailure() { } });
A interface não exibe traduções automaticamente e deve ser recriada.
Configurar centro de dados US
O centro de dados phrase US também é aceito. O centro de dados US pode ser configurado chamando:
Phrase.setHost("https://ota.us.phrase.com/")
Fallback
Caso não seja possível acessar o phrase devido a uma conexão de rede ausente do cliente ou uma interrupção do serviço, o SDK usa as traduções pacotadas do arquivo de recurso. Recomenda-se atualizar regularmente as traduções pacotadas no aplicativo. O SDK também cache as traduções localmente no dispositivo. Se houver esse cache, ele será usado até que a Seguinte tradução seja atualizada.
O SDK usa o lançamento mais recente para as traduções. Caso o versionName
para o aplicativo seja definido, será usado o lançamento mais recente que satisfaça às restrições de versão.
Adicionar um novo idioma
Criando o novo idioma no Phrase e criando um novo lançamento. O SDK obtém o idioma quando este é o idioma do dispositivo de um usuário. Recomenda-se adicionar regularmente um novo strings.xml
para novos arquivos de idiomas ao lançar uma nova versão do aplicativo ou os usuários só verão as traduções de fallback determinadas pelo Android na primeira inicialização do aplicativo.
Revisão
O SDK é texto original fechado e não pode ser visualizado nem modificado. Se for uma exigência de organização, podem ser feitas auditorias. Entre em contato para obter mais detalhes, se necessário.
Suporte para visualização personalizada
As exibições personalizadas podem ser traduzidas usando atributos estilizados. Como o TypedArray
não permite substituir os recursos, são necessárias pequenas alterações na exibição personalizada:
-
Exemplo de Kotlin
Antes:
context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyleAttr, 0).use { text = it.getText(R.styleable.CustomView_android_text) }
Após:
context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyleAttr, 0).use { text = it.getTextWithPhrase(R.styleable.CustomView_android_text) }
-
Exemplo de Java
Antes:
final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyleAttr, 0); try { setText(ta.getText(R.styleable.CustomView_android_text)); } finally { ta.recycle(); }
Após:
final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyleAttr, 0); try { setText(PhraseTypedArray.getTextWithPhrase(ta, R.styleable.CustomView_android_text)); } finally { ta.recycle(); }
Exemplo de aplicativo
Com o SDK, o aplicativo verifica regularmente traduções atualizadas e faz download deles no background.
Requisitos
Esta biblioteca depende da versão 0.18.0 da biblioteca intl do Flutter.Siga o seu guia para adicionar suporte de localizações ao aplicativo.
Instalação
Adicionar phrase ao pubspec.yaml:
dependencies: phrase: ^2.5.1 ... intl: ^0.18.0 flutter_localizations: sdk: flutter ... flutter: generate: true ...
Como na biblioteca intl
, a geração de código é usada para processar arquivos ARB. Execute este comando para atualizar:
flutter pub run phrase
Usando build_runner:
flutter pub run build_runner watch
Uso
Inicializar phrase no arquivo 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: 'Demonstração de flutador', //.. localizationsDelegates: PhraseLocalizations.localizationsDelegates, supportedLocales: PhraseLocalizations.supportedLocales, ); } }
Acessar mensagens com:
Text(AppLocalizations.of(context)!.helloWorld);
Personalizar
Atualizar comportamento
As traduções OTA são atualizadas sempre que o aplicativo é lançado. Para desabilitar este:
Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", checkForUpdates: false);
Para atualizar manualmente:
Phrase.updateTranslations(context).then((_) => print("Done!"));
Versão personalizada do aplicativo
O SDK usa a versão do aplicativo como padrão para retornar um lançamento que corresponda às restrições de lançamento para a versão mínima e máxima. A versão do aplicativo deve usar a versão semântica, caso contrário, nenhuma atualização da tradução será gerada. Caso o aplicativo não use a versão semântica, a versão do aplicativo pode ser substituída manualmente: é possível substituir a versão do aplicativo manualmente:
Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", customAppVersion: "1.2.3");
Configurar centro de dados US
O centro de dados phrase US também é aceito. O centro de dados US pode ser selecionado passou o parâmetro de hostname da API relevante na configuração SDK:
Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", host: PhraseHost.us);
Exemplo de aplicativo
Com o SDK, o aplicativo verifica regularmente traduções atualizadas e faz download deles no background.
O Mac Catalyst também é aceito.
O SDK pode ser instalado manualmente ou por meio do gerente de pacotes do Swift, Carthage ou Cocoa Pods.
Se as traduções não estiverem sendo atualizadas:
-
Certifique-se de que o ID de distribuição e o segredo do ambiente estão corretos.
-
Certifique-se de que um lançamento foi criado para a versão atual do aplicativo.
-
Recarregue o
ViewController
para fazer as alterações aparecerem imediatamente.
Se a versão errada de uma tradução estiver sendo usada, certifique-se de que um lançamento com as traduções mais recentes e a versão atual do aplicativo está disponível.
Swift Package Manager
Adicione o URL do repositório público (https: //gitHub.com/ phrase/ios-sdk/). O Xcode lida com o restante da instalação automaticamente.
Cartago
Adicione a seguinte linha ao seu arquivo de cartão:
binary "https://raw.githubusercontent.com/phrase/ios-sdk/master/PhraseSDK.json" ~> 3.0.0
Execute a atualização do cartão e adicione o PhraseApp.framework
ao seu projeto como é descrito na documentação Carthage.
Cocoa Pods
Adicione a seguinte linha ao seu Podfile:
pod 'PhraseSDK'
Execute a instalação do pod. Se você é novo(a) no CocoaPods, consulte sua documentação.
Instalação manual
Execute estas etapas:
-
Baixe a última versão.
-
Adicione
PhraseSDK.framework
no Xcode como o binário vinculado à tradução. -
Um roteiro para eliminar os binários extra precisa ser executado antes de você fazer upload do aplicativo, pois a loja da Apple reprova aplicativos, incluindo simuladores de binários.
Vá para
e adicione uma seção clicando no símbolo +. Colar neste roteiro: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"
Configuração
-
Import PhraseSDK:
import PhraseSDK
-
Inicialize o SDK chamando o seguinte código:
Phrase.shared.setup( distributionID: <Distribution ID>, environmentSecret: <Environment Secret> )
-
Para atualizar arquivos de localização, fale
Phrase.shared.updateTranslation
.Este método criará uma exceção se o SDK não tiver a configuração correta.
Para configurar OTA para usar o centro de dados US, defina o host antes de ligar para
PhraseApp.shared.updateTranslation()
comPhrase.shared.configuration.apiHost = .us
.
Recomenda-se a chamada de ambas as funções dentro do AppDelegate
no método DidFinishLaunchingWithOptions
.
Objetivo-C
Integrar o SDK no aplicativo 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; }
Desabilitar balançar
Para desabilitar o swizzling, defina PhraseSDKMainBundleProxyDisabled
para YES no arquivo Info.plist
.
Quando o recurso swizzling está desativado, as traduções atualizadas não são mais exibidas. A tradução ainda será sincronizada se updateTranslation
for chamado e poderá ser acessada com o método Phrase.localizedString()
.
Manuseio de versões do aplicativo
Para determinar qual lançamento deve ser retornado, o SDK requer uma versão semântica do aplicativo para que as traduções sejam atualizadas.
O SDK tenta obter uma versão semântica da seguinte maneira:
-
CBundleShortVersionString
é usado se semântico. -
Caso contrário,
CFBundleVersion
é usada se for semântica. -
Se os dois não forem semânticos, é usada uma combinação de (
CBundleShortVersionString.CFBundleVersion
).
Se CBundleShortVersionString
estiver ausente ou não puder ser criado com uma versão semântica juntamente com CBundleVersion
, o SDK lançará a mensagem PhraseSetupError.appVersionNotSemantic
.
Desabilitar tradução para várias tabelas
Para evitar que a OTA traduza tabelas no pacote principal do iOS além da tabela padrão Localizable
, defina a seguinte opção:
Phrase.shared.configuration.ignoreOtherTables = true
Chamadas
Anexe um operador de retorno para processar as atualizações de tradução bem-sucedidas:
Phrase.shared.updateTranslation { result in switch result { case .success(let updated): case .failure: } }
Modo debug
Se for necessário obter mais informações, ative o modo Debug para obter logon adicional do PhraseSDK.framework
na consola:
Phrase.shared.configuration.debugMode = true
Confirmar tempo limite para solicitações
Defina um tempo limite para as solicitações contra o phrase chamando:
Phrase.shared.configuration.timeout = TimeInterval(20)
O tempo limite padrão é de 10 segundos e conexões que levam mais de 10 segundos serão fechadas.
Fornecer substituição de idioma manual
Se não usar o idioma do sistema como local, um local diferente poderá ser definido na chamada init. O código local precisa estar presente em um lançamento do phrase:
Phrase.shared.configuration.localeOverride = "en-US"
Fallback
Caso não possam ser obtidas novas traduções do phrase por meio do SDK, os arquivos de tradução mais recentes da instalação recebidos são usados. Se o aplicativo nunca recebeu novos arquivos do phrase, ele usa os arquivos de tradução compilados do aplicativo. Isso evita erros em caso de qualquer dificuldade técnica ou erros de rede. Recomenda-se manter os seus arquivos de tradução compilados no aplicativo atualizados a cada lançamento.
Revisão
O SDK é texto original fechado e não pode ser visualizado nem modificado. Se for uma exigência de organização, podem ser feitas auditorias. Entre em contato para obter mais detalhes, se necessário.
Com o SDK, o aplicativo verifica regularmente traduções atualizadas e faz download deles no background.
A biblioteca para traduções OTA só funciona com a biblioteca react-i18next.
Para instalar o React Native SDK, siga estes passos:
-
Executar este comando:
$ npm install react-native-phrase-sdk --save
-
Inicializar phrase:
import Phrase from "react-native-phrase-sdk"; let phrase = new Phrase( "YOUR_DISTRIBUTION_ID", "YOUR_DEVELOPMENT_OR_PRODUCTION_SECRET", "YOUR_APP_VERSION", "i18next" );
O formato de arquivo pode ser
i18next
(como no exemplo acima) oui18next_4
, o que resulta no arquivo de formato i18next v4.O centro de dados phrase US também é aceito. Para usar o React Native SDK com o centro de dados US, informe o host relevante durante a inicialização:
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/" );
-
Criar backend i18next com base na instância:
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)
-
Inicializar i18n com o backend do phrase:
i18n .use(ChainedBackend) .use(initReactI18next) .init({ backend: { backends: [backendPhrase, backendFallback] } //... });
Exemplo de arquivo 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 } });
Exemplo de aplicativo
A biblioteca i18next-Phrase-backend implanta um exemplo de backend para i18next que recupera as traduções dos lançamentos OTA.
Para criar um novo lançamento, a plataforma
precisa ser definida para a distribuição e fazer parte de um lançamento.Uso
Para inicializar phrase:
import i18n from "i18next"; import { I18nextPhraseBackend } from "@phrase/i18next-backend"; i18n .use(I18nextPhraseBackend) .init({ fallbackLng: 'en', backend: { distribuição: 'DISTRIBUTION_ID', segredo: 'YOUR_ENVIRONMENT_SECRET', appVersion: '1.0.0', '1.0.0', } });
Caching
A biblioteca está cacheando traduções e não verificará novas traduções por 5 minutos. O cache pode ser configurado definindo a opção cacheExpirationTime
na configuração de backend para fins de teste.
i18n .use(I18nextPhraseBackend) .init({ fallbackLng: 'en', backend: { distribuição: 'DISTRIBUTION_ID', segredo: 'YOUR_ENVIRONMENT_SECRET', appVersion: '1.0.0', '1.0.0', cacheExpirationTime: 60 * 5, / tempo em segundos } });
Nota
Recomenda-se usar pelo menos 5 minutos de tempo de cache em ambientes de produção.
Exemplo de aplicativo
A biblioteca Phrase-OTA-i18n implanta um exemplo de backend para a joia I18n que recupera as traduções dos lançamentos OTA. Com a biblioteca, o aplicativo verifica regularmente traduções atualizadas e faz download deles no background.
A biblioteca é válida para qualquer aplicativo Ruby utilizando a joia i18n.
Para criar um novo lançamento, a plataforma
precisa ser definida para a distribuição e fazer parte de um lançamento.Instalação
-
Adicione a seguinte linha ao Gemfile do aplicativo:
gem 'phrase-ota-i18n'
-
Executar:
$ bundle install
-
Em alternativa, instale-o como:
$ gem install phrase-ota-i18n
Uso
Para gerar a configuração:
bundle exec rails generate phrase_ota:install --distribution-id <DISTRIBUTION_ID> --secret-token <SECRET>
Debugging
A jóia tem uma configuração de Debug
que pode ser ativada no inicializador definindo:
config.debug = true