앱 스토어 또는 구글 플레이에서 새 버전을 출시하지 않고 iOS, 안드로이드, React Native 및 Flutter 애플리케이션에 대한 번역을 한 번의 클릭으로 업데이트. 텍스트 라벨에 대한 업데이트는 즉시 모바일 앱으로 Push됩니다.
OTAOver-the-Air)는 i18next 및 Rails 플랫폼과 손쉽게 통합되므로 사용자는 재배포가 필요하지 않고도 웹 애플리케이션의 현지화된 컨텐츠 업데이트 관리할 수 있습니다.
업데이트된 설정이 적용되려면 새 릴리스를 생성해야 합니다. 릴리스에 포함된 모든 컨텐츠 Phrase Strings 직접 애플리케이션으로 번역을 스트리밍해야 합니다. 컨텐츠 없는 경우 번역이 전송되지 않습니다.
iOS, Android, React Native 또는 Flutter SDK가 구축된 애플리케이션을 처음 시작할 때 고유하고 무작위 디바이스 식별자가 생성됩니다. 이 식별자는 지정된 기간에 걸쳐 활성 사용자를 추적합니다. 다른 형태 또는 추적 수단에 사용되지 않으며 사용자 또는 기기 정보를 포함하지 않습니다.
OTA에 관한 유일한 제한은 선택한 요금제에 따라 MAU(월간 활성 사용자)의 양입니다.
MAU는 번역을 요청하는 고유한 디바이스의 수입니다. 각 장치에 무작위 ID 할당되며, 지난 30일 동안 할당된 다른 ID의 수에 따라 MAU가 계산됩니다. Phrase 서버와의 모든 상호 작용은 요청으로 간주됩니다.
데이터
SDK는 업데이트를 확인하기 순서 OTA 서비스 통신하고 각 요청에 다음 세부 정보를 포함합니다.
-
디바이스 식별자(예: "F3AFCB10-80A2-84CB-94C0-27F5EF58876D". 이 앱에 고유하며 따라서 특정 기기를 추적할 수 없습니다.)
-
앱 버전(예: "1.2.0")
-
번역 파일의 마지막 업데이트(예: "1542187679")
-
SDK 버전(예: "1.0.0")
-
로캘(예: "de-DE")
-
파일 형식(예: "Strings")
-
클라이언트(예: "ios")
-
배포 ID(배포 ID)
-
환경 비밀번호(개발과 생산을 구별하기)
대상 플랫폼은 배포 내에서 정의됩니다.
-
iOS
-
Android
-
Flutter
-
i18next
-
Rails
여러 배포가 가능하지만 이상적으로 프로젝트 하나의 배포가 있습니다. iOS 및 Android용 배포를 사용하는 경우 두 형식의 자리 표시자가 자동으로 변환됩니다.
Fallbacks
배포가 연결된 프로젝트의 언어 설정에 언어 대체 항목이 설정된 경우 요청된 언어가 있지만 키가 번역되지 않은 경우 선택한 언어의 Strings가 표시됩니다.
국가별 언어(예: en-GB)가 사용되었지만 릴리스에 포함되지 않으면 해당 언어가 프로젝트에 있는 경우 시스템이 해당 언어의 표준 버전(예: en)으로 되돌릴 수 있습니다. 요청한 언어 전혀 찾을 수 없는 경우 프로젝트 기본 로캘 대신 제공될 수 있습니다.
배포 생성
배포를 생성 다음 단계를 수행하십시오.
-
설정 또는 구성 수가 이미 있는 경우를 클릭합니다.
페이지의 Box에서페이지가 열려 기존 구성을 표시합니다.
-
새 배포를 클릭합니다. 창이 열립니다.
-
전문탭에서 , 배포가 연결된 , 필수 및 필수 을 입력합니다.
-
Android 배포의 경우 필요한 경우 CDATA에 HTML 태그가 있는 번역을 포함하는 형식 옵션을 선택하려면 Android 탭을 클릭하십시오.
-
배포와 연결할 프로젝트를 선택한 후 일정 탭을 사용할 수 있습니다. 필요한 경우 이 탭을 사용하여 배포에 OTA 예약 릴리스를 설정합니다.
-
-
번체 언어 탭에서 필요에 따라 배포 관련 대체 설정을 선택합니다. 목록 표시된 대체 옵션은 우선 순위가 높습니다.
-
선택적으로, 최신 검토됨 번역 버전을 사용하려면 번역 탭을 클릭하십시오.
-
저장을 클릭합니다.
배포 세부 정보는 SDK에서 필요한 ID와 함께 표시됩니다.
페이지에서 배포를 클릭하면 세부 정보를 다시 표시할 수 있습니다.
번역을 업데이트 배포 내에서 새 릴리스를 생성. 프로젝트 현재 상태를 내보내고 연결된 클라이언트에 사용할 수 있게 됩니다.
릴리스를 생성 다음 단계를 수행하십시오.
-
OTA 페이지에서 필요한 배포 옆에 추가 릴리스를 클릭합니다.
창이 열립니다.
-
, 필수 , , 및 을 제공하십시오.
필요한 경우 릴리스에 특정 tags 있는 키만 포함하도록 tags 입력합니다.
-
저장을 클릭합니다.
릴리스는 배포 세부 정보 페이지 아래의 목록 추가됩니다.
배포 릴리스를 반복 일정으로 설정 다음 단계를 수행하십시오.
-
페이지에서 원하는 배포 옆에 있는 톱니 바퀴아이콘을 클릭합니다.
창이 표시됩니다.
-
일정 릴리스 탭을 선택하고 을 클릭합니다.
릴리스 예약 옵션이 표시됩니다.
참고
새 배포를 만들 때 일정 옵션도 사용할 수 있습니다.
-
드롭다운에서 사용 가능한 옵션 중 하나를 선택하여 릴리스 빈도를 선택합니다.
-
-
예약된 릴리스에 원하는 일상을 선택.
-
-
시간 및 관련
를 제공하십시오. -
필요한 경우 예약된 릴리스에 대해
, 및 를 선택하십시오.-
필드는 프로젝트에서 분기를 활성화한 경우에만 표시됩니다. 분기 선택하면 로캘 및 언어 목록 업데이트됩니다.
-
-
선택적으로
및 필드에서 애플리케이션 버전을 지정합니다.앱의 모든 버전에 일정 릴리스를 적용하려면 비워 둡니다.
-
저장을 클릭합니다.
배포가 릴리스 일정 정보로 업데이트되었습니다.
일정을 비활성화하면 배포의 자동 릴리스가 중단되지만 구성된 설정 저장됩니다.
적절한 모바일 SDK 또는 웹 라이브러리를 통합하면 클릭 한 번역으로 업데이트할 수 있지만 사용 현황을 측정하는 측정 항목도 제공할 수 있습니다. 모바일 SDK 및 웹 라이브러리 보고서는 활성 앱 사용자와 앱 언어에 대한 가치있는 정보를 제공합니다. 이 보고서 세트는 각 배포에서 액세스할 수 있으며 보고서 데이터는 매일 두 번 업데이트됩니다.
활성 사용자 수, 전체 요청, 언어 요청, 플랫폼당 요청 및 제공되지 않은 디바이스 언어에 대한 보고서를 제공합니다.
각 배포에 대한 보고서는 아이콘을 통해 액세스할 수 있습니다.
SDK를 사용하면 앱이 정기적으로 업데이트된 번역을 확인하고 백그라운드에서 다운로드합니다.
특히 업그레이드를 고려하면 Android SDK의 최신 릴리스를 정기적으로 확인하십시오.
번역을 업데이트하지 않는 경우:
-
배포 ID 및 환경 비밀이 올바른지 확인하십시오.
-
현재 앱 버전에 대한 릴리스가 생성된지 확인하십시오.
-
변경 사항을 즉시 표시하려면
ViewController를
다시 로드하십시오.
잘못된 버전의 번역을 사용하고 있는 경우 최신 번역과 현재 앱 버전을 사용할 수 있고 앱에 대한 versionName
이 설정되어 있는 릴리스가 <주요한 문제>.< 사소한 문제>.<point>.
형식 사용 중인지 확인하십시오.
필수 사항
-
SDK에는 최소한 appcompat 버전 1.2.0이 필요합니다. 이전 버전의 appcompat을 사용하는 경우 SDK 버전 2.1.3을 사용하십시오.
-
라이브러리는 도구 모음 표시줄과 같은 후면 호환 UI 요소를 지원하기 위해 AndroidX에 의존합니다.
SDK 포함
루트 build.gradle
에 새 리포지토리를 추가합니다.
allprojects { repositories { ... maven { url "https://maven.download.phrase.com" } } }
라이브러리를 종속 상태로 추가:
dependencies { implementation "com.phrase.android:ota-sdk:3.5.0" ... }
제트팩 구성 지원
OTA 번역에 대한 Jetpack Compose 지원을 활성화 다음 단계를 수행하십시오.
-
라이브러리
implementation "com.phrase.android:ota-sdk-compose:3.5.0"
을 루트build.gradle
에 추가합니다. -
Phrase {...}
에 Jetpack Compose 코드를 래핑합니다.
구성
애플리케이션 클래스에서 SDK를 초기화하고 배포 ID 환경 비밀을 추가. 애플리케이션에서 상속되는 클래스는 활동 컨텍스트 외부의 번역을 활성화하려면 AboutBaseContext
덮어쓰야 합니다.
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는 기본적으로 앱 버전을 사용하여 최소 버전과 최대 버전의 릴리스 제한과 일치하는 릴리스를 반환합니다. 앱 버전은 시멘틱 버전 평가를 사용 합니다. 그렇지 않으면 번역 업데이트 반환되지 않습니다. 앱이 시맨틱 버전 설정을 사용 않는 경우 사용한 앱 버전을 수동으로 재정의할 수 있습니다.
예:
Phrase.setAppVersion("3.2.4");
updateTranslations()
을 호출하기 전에 버전을 설정해야 합니다.
시간 초과 설정
번역 다운로드의 기본 시간 초과 시간이 10초로 설정됩니다.
기본값을 변경할 수 있습니다:
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() { } });
UI는 자동으로 번역을 표시하지 않아 다시 생성해야 합니다.
미국 데이터 센터 설정
phrase 미국 데이터 센터 또한 지원됩니다. 미국 데이터 센터 호출하여 구성할 수 있습니다.
Phrase.setHost("https://ota.us.phrase.com/")
번체
클라이언트 네트워크 연결 누락 또는 서비스 중단으로 인해 phrase 연결할 수 없는 경우 SDK는 자원 파일의 번역 번들로 연결됩니다. 앱의 번역 번들 정기적인 업데이트를 권장합니다. SDK는 또한 장치에서 로컬으로 번역을 캐시합니다. 이러한 캐시는 있는 경우 다음 번역 업데이트 때까지 사용됩니다.
SDK는 번역에 가장 최근 릴리스를 사용합니다. 앱의 versionName
이 설정된 경우 버전 제한을 충족하는 최신 릴리스가 사용됩니다.
새 언어 추가
phrase 새 언어 생성하고 새 릴리스를 생성. SDK는 사용자 기기 언어 경우 언어 가져옵니다. 새로운 앱 버전을 출시할 때 새로운 언어 파일에 대해 정기적으로 새 strings.xml를
추가하는 것이 좋거나 사용자는 앱을 처음 시작할 때 Android에서 결정한 대체 번역만 볼 수 있습니다.
감사
SDK는 소스 닫혀 있으므로 볼거나 수정할 수 없습니다. 조직 요구 사항이라면 감사를 제공할 수 있습니다. 필요한 경우 자세한 내용을 연락처로 문의하십시오.
사용자 지정 보기 지원
사용자 지정 보기는 스타일별 속성을 사용하여 번역할 수 있습니다. TypedArray
를 사용하면 리소스를 덮어쓸 수 없으므로 사용자 지정 보기에 작은 변경 사항이 필요합니다.
-
Kotlin 예시
이전:
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(); }
사례 앱
SDK를 사용하면 앱이 정기적으로 업데이트된 번역을 확인하고 백그라운드에서 다운로드합니다.
필수 사항
이 라이브러리는 Flutter의 intl 라이브러리의 0.18.0 버전에 의존합니다. 앱에 현지화 지원을 추가하려면 이들의 가이드를 따르십시오.
설치
pubspec.yaml에 Phrase 추가:
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
사용 현황
main.dart
파일에서 Phrase 초기화:
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 데모', //.. 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는 기본적으로 앱 버전을 사용하여 최소 버전과 최대 버전의 릴리스 제한과 일치하는 릴리스를 반환합니다. 앱 버전은 시멘틱 버전 평가를 사용 합니다. 그렇지 않으면 번역 업데이트 반환되지 않습니다. 앱이 의미 체계적 버전 구성을 사용 않는 경우 앱 버전을 수동으로 재정의할 수 있습니다. 앱 버전을 수동으로 재정의할 수 있습니다.
Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", customAppVersion: "1.2.3");
미국 데이터 센터 설정
phrase 미국 데이터 센터 또한 지원됩니다. 미국 데이터 센터 SDK 구성에서 관련 API 호스트 이름 매개 변수를 전달하여 선택할 수 있습니다.
Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", host: PhraseHost.us);
사례 앱
SDK를 사용하면 앱이 정기적으로 업데이트된 번역을 확인하고 백그라운드에서 다운로드합니다.
Mac Catalyst도 지원됩니다.
SDK는 수동으로 또는 Swift Package Manager, Carthage 또는 Cocoa Pod를 통해 설치할 수 있습니다.
번역을 업데이트하지 않는 경우:
-
배포 ID 및 환경 비밀이 올바른지 확인하십시오.
-
현재 앱 버전에 대한 릴리스가 생성된지 확인하십시오.
-
변경 사항을 즉시 표시하려면
ViewController를
다시 로드하십시오.
잘못된 번역 버전을 사용하는 경우 최신 번역과 현재 앱 버전을 가진 릴리스가 있는지 확인하십시오.
Swift 패키지 관리자
공개 리포지토리 URL 추가(https: //gitHub.com/phrase/ios-sdk/). Xcode는 나머지 설치를 자동으로 처리합니다.
카르타지
다음 줄을 카트 파일에 추가.
binary "https://raw.githubusercontent.com/phrase/ios-sdk/master/PhraseSDK.json" ~> 3.0.0
카테고리 업데이트를 실행하고 카테고리 문서에 설명된 대로 프로젝트에 PhraseApp.framework
을 추가합니다.
코카오 포드
다음 줄을 Podfile에 추가.
pod 'PhraseSDK'
포드 설치 실행 CocoaPods에 새로운 경우 문서를 참조하십시오.
수동 설치
다음 단계를 수행하십시오.
-
최신 정보 업데이트를 다운로드합니다.
-
Xcode에
PhraseSDK.framework
를 대상에 연결된 이진으로 추가합니다. -
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"
구성
-
Import PhraseSDK:
import PhraseSDK
-
다음 코드를 호출하여 SDK를 초기화합니다.
Phrase.shared.setup( distributionID: <Distribution ID>, environmentSecret: <Environment Secret> )
-
현지화 파일을 업데이트하려면
Phrase.shared.updateTranslation()를
사용하십시오.이 방법으로 SDK가 올바르게 설정 않으면 예외가 발생합니다.
OTA를 미국 데이터 센터 사용으로 구성하려면
Phrase.shared.configuration.apiHost = .us
로PhraseApp.shared.updateTranslation()
을 호출하기 전에 호스트를 설정합니다.
applicationDidFinishLaunchingWithOptions
방법에서 AppDelegate
내에서 두 개의 함수를 호출하는 것이 좋습니다.
대상-C
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; }
사용 안 함 swizzling 사용 안 함
사용 안 함을 사용하려면 Info.plist
파일에서 PhraseSDKMainBundleProxyDisabled를
예로 설정합니다.
swizzling를 비활성화하면 더 이상 업데이트된 번역이 표시되지 않습니다. updateTranslation
를 호출하여 Phrase.localizedString() 방법으로 액세스할 수 있는 경우 번역이 계속 동기화됩니다
.
앱 버전 처리
SDK에서 반환해야 하는 릴리스를 결정하려면 번역이 업데이트되기 위해 앱의 의미 버전이 필요합니다.
SDK는 다음과 같이 의미형 버전을 얻으려고 합니다.
-
시멘틱한 경우
CFBundleShortVersionString
이 사용됩니다. -
그렇지 않으면 시멘틱한 경우
CFBundleVersion
이 사용됩니다. -
두 가지가 시멘틱하지 않으면 (
CFBundleShortVersionString.CFBundleVersion
)의 조합이 사용됩니다.
CFBundleShortVersionString
가 누락되었거나 시멘틱 버전과 함께 생성할 수 없는 경우 CFBundleVersion
SDK는 PhraseSetupError.appVersionNotSemantic
메시지를 버립니다.
여러 표에 대해 번역 사용 안 함
기본 Localizable
테이블 이외의 기본 iOS 번들의 테이블을 OTA가 번역하지 못하게 하려면 다음 옵션을 설정합니다.
Phrase.shared.configuration.ignoreOtherTables = true
콜백
성공적인 번역 업데이트를 처리하려면 콜백 처리기를 연결하십시오.
Phrase.shared.updateTranslation { result in switch result { case .success(let updated): case .failure: } }
Debug 모드
추가 정보가 필요한 경우 Debug 모드를 활성화하여 PhraseSDK.framework
을 추가로 콘솔에 로그인하십시오.
Phrase.shared.configuration.debugMode = true
요청에 대한 시간 초과 설정
다음을 호출하여 phrase 대한 요청에 대한 시간 초과를 설정합니다.
Phrase.shared.configuration.timeout = TimeInterval(20)
기본 시간 초과는 10초이며 10초 이상 걸리는 연결은 닫히게 됩니다.
수동 언어 재정의 공유
시스템 언어 로캘 사용하지 않으면 init 호출에서 다른 로캘 설정할 수 있습니다. 로캘 코드는 phrase: 릴리스에 있어야 합니다.
Phrase.shared.configuration.localeOverride = "en-US"
번체
SDK를 통해 phrase 새 번역을 가져올 수 없는 경우 설치가 받은 최신 번역 파일이 사용됩니다. 앱이 phrase 새 파일을 받은 적이 없는 경우 앱의 작성된 번역 파일을 사용합니다. 이를 통해 기술적인 어려움이나 네트워크 오류가 발생할 경우 오류가 예방됩니다. 매 릴리스 시 앱에 compiled된 번역 파일을 최신 상태로 유지하는 것이 좋습니다.
감사
SDK는 소스 닫혀 있으므로 볼거나 수정할 수 없습니다. 조직 요구 사항이라면 감사를 제공할 수 있습니다. 필요한 경우 자세한 내용을 연락처로 문의하십시오.
SDK를 사용하면 앱이 정기적으로 업데이트된 번역을 확인하고 백그라운드에서 다운로드합니다.
OTA 번역 라이브러리가 react-i18next 라이브러리와만 작동합니다.
React Native SDK를 설치하려면 다음 단계를 수행하십시오.
-
이 명령을 실행합니다.
$ npm install react-native-phrase-sdk --save
-
초기화 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/" );
-
인스턴스 기반 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)
-
Phrase 백엔드 i18n 초기화:
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 } });
사례 앱
i18next-Phrase 백엔드 라이브러리는 i18next의 예시 백엔드를 구현하여 OTA 릴리스에서 번역을 검색합니다.
새 릴리스 생성하려면
플랫폼을 배포에 설정하고 릴리스의 일부로 설정해야 합니다.사용 현황
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분간의 캐싱 시간을 사용 것이 좋습니다.
사례 앱
Phrase-OTA-i18n 라이브러리는 I18n 기호의 예시 백엔드를 구현하여 OTA 릴리스의 번역을 검색합니다. 라이브러리와 함께 응용 프로그램은 정기적으로 업데이트된 번역을 확인하고 백그라운드에서 다운로드합니다.
라이브러리는 i18n gem을 사용하는 모든 Ruby 애플리케이션에 유효합니다.
새 릴리스 생성하려면
플랫폼을 배포에 설정하고 릴리스의 일부로 설정해야 합니다.설치
-
응용 프로그램의 Gemfile에 다음 줄을 추가.
gem 'phrase-ota-i18n'
-
실행:
$ bundle install
-
또는 다음으로 설치하십시오.
$ gem install phrase-ota-i18n
사용 현황
구성 생성하려면 다음과 같이 하십시오.
bundle exec rails generate phrase_ota:install --distribution-id <DISTRIBUTION_ID> --secret-token <SECRET>
디버그
보석에는 다음으로 설정하여 초기화기에서 활성화할 수 있는 Debug
구성이 있습니다.
config.debug = true