ApplangaUITest 2.0.195

ApplangaUITest 2.0.195

Applanga 维护。



  • Mbaas Development GmbH 提供

Applanga SDK for iOS 本地化


版本 2.0.177

网站: https://www.applanga.com

变更日志: https://www.applanga.com/changelog/ios


目录

  1. 安装
  2. 配置
  3. 使用
  4. 可选设置
  5. 本地化推送通知与 Info.plist
  6. SwiftUI
  7. WatchOS
  8. MacOS
  9. 分支

自动推送通知本地化与 InfoPlist.strings

安装

CocoaPods [?]

  1. 有关 CocoaPod 的详细说明,请参阅 CocoaPod 的入门指南

  2. 创建 Podfile 后,请插入此行代码: pod 'Applanga',要能够在 UI 测试期间进行截图,请为您的 UI 测试目标插入 pod 'ApplangaUITest'

  3. 完成此操作后,从命令行重新运行 pod install

Carthage [?]

  1. 如果您是 Carthage 的初学者,请首先参阅他们的文档

  2. 将以下行添加到您的 Cartfile 中

    binary "https://raw.githubusercontent.com/applanga/sdk-ios/master/Applanga.json" ~> 2.0
    
  3. 从命令行运行 carthage update 并按照 carthage 文档的说明链接 Applanga.framework 到您的项目: iOS 入门

Swift Package Manager [?]

注意:此功能仅在 Xcode 版本 12+ 中受支持

1:只需将存储库 URL https://github.com/applanga/sdk-ios 添加为 swift 包依赖项,并选择最新发布标签

手动(无代码)

  1. 如果您想要翻译您的 iOS 应用,请从 Github 下载 Applanga iOS SDK 的最新版本。解压它,然后将 Applanga.framework 拖放到您的目标的 嵌入的二进制文件 部分,并选中“如果需要,将条目复制到目标组文件夹中”选项。

  2. 构建设置 选项卡下,您需要将 基本 更改为 所有 并搜索 其他链接器标志。双击“其他链接器标志”右侧的空白区域,将打开一个弹出窗口。点击加号(+),并添加 -ObjC, -lsqlite3, -lz

  3. 要能够正确地将您的应用上传到 iTunesConnect,您需要解决由通用二进制文件触发的 App Store 提交流程中的错误。为此,在目标 构建阶段 中添加一个新的 运行脚本阶段。**重要提示**:确保此 运行脚本阶段 位于 嵌入框架 构建阶段下方。您可以拖动和放建筑阶段来重新排列它们。将以下行粘贴到此 运行脚本阶段 的脚本文本字段中

    bash "$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/Applanga.framework/strip-framework.sh"

配置

  1. 要开始使用Applanga进行iOS本地化,请从仪表盘中的“项目概览”下载您的应用的Applanga设置文件。方法是点击准备发布按钮,然后点击获取设置文件

  2. Applanga设置文件添加到您的应用资源中。它将被自动加载。

  3. 现在,如果您启动您的应用,应该会看到一个日志消息确认Applanga已被初始化,或者在缺少配置的情况下显示一个警告。

  4. 为确保您的设置文件对于每个构建都始终是最新的,请参阅“可选设置”中的关于自动Applanga设置文件更新的文档部分。


注意:要确保原生iOS对话框被正确翻译,并且要在App Store上显示您支持的语言,您需要为每种语言打包至少一个.bundle中的.strings文件。(该文件可以是空的)

使用

基本


注意:如果您未指定默认值,字符串将不会在Applanga仪表板上创建。

扩展

除了基本用法外,Applanga还提供对您的字符串中的命名参数复数化部分更新以及在UIWebView实例中的HTML和javascript内容翻译的支持,以节省空间和带宽。

  1. 代码本地化

    1.1 字符串

    //objc
    // get translated string for the current device locale
    [Applanga localizedStringForKey:@"APPLANGA_ID" withDefaultValue:@"default value"];
    //swift
    Applanga.localizedString(forKey: "APPLANGA_ID", withDefaultValue: "default value")

    1.2 命名参数

    //objc
    // if you pass a string:string dictionary you can get translated string
    // with named arguments. %{someArg} %{anotherArg} etc.
    NSDictionary* args = @{@"someArg": @"awesome",@"anotherArg": @"crazy"};
    [Applanga localizedStringForKey:@"APPLANGA_ID" withDefaultValue:@"default value" andArguments:args]
    //swift
    var args: [String: String] = ["someArg": "awesome", "anotherArg": "crazy"];
    Applanga.localizedString(forKey: "APPLANGA_ID", withDefaultValue: "default", andArguments: args)

    示例

    APPLANGA_ID = "This value of the argument called someArg is %{someArg} and the value of anotherArg is %{anotherArg}. You can reuse arguments multiple times in your text wich is %{someArg}, %{anotherArg} and %{someArg}."

    被转换为

    "This value of the argument called someArg is awesome and the value of anotherArg is crazy. You can reuse arguments multiple times in your text wich is awesome, crazy and awesome."

    1.3 复数化

    //objc
    // get translated string in given pluralisation rule (one)
    [Applanga localizedStringForKey:@"APPLANGA_ID" withDefaultValue:@"default value" andArguments:nil andPluralRule:ALPluralRuleOne]
    //swift
    Applanga.localizedString(forKey: "no default", withDefaultValue: "default", andArguments: nil, andPluralRule: ALPluralRule.one)

    可用的复数化规则

    //objc
    ALPluralRuleZero,
    ALPluralRuleOne,
    ALPluralRuleTwo,
    ALPluralRuleFew,
    ALPluralRuleMany,
    ALPluralRuleOther
    //swift
    ALPluralRule.zero,
    ALPluralRule.one,
    ALPluralRule.two,
    ALPluralRule.few,
    ALPluralRule.many,
    ALPluralRule.other

    您还可以指定一个数量,Applanga将根据以下条件选择最佳的复数化规则:[产量](http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html)

    //objc
    // get a string in the given quantity
    [Applanga localizedStringForKey:@"APPLANGA_ID" withDefaultValue:@"default value" andArguments:nil andPluralRule:ALPluralRuleForQuantity(quantity)]
    
    // or get a formatted string with the given quantity
    [NSString localizedStringWithFormat:[Applanga localizedStringForKey:@"APPLANGA_ID" withDefaultValue:@"default value" andArguments:nil andPluralRule:ALPluralRuleForQuantity(quantity)], quantity]
    //swift
    // get a string in the given quantity
    Applanga.localizedString(forKey: "APPLANGA_ID", withDefaultValue: "default value", andArguments: nil, andPluralRule: ALPluralRuleForQuantity(quantity))
    
    //or get a formatted string with the given quantity
    NSString.localizedStringWithFormat(NSString(string:(Applanga.localizedString(forKey: "APPLANGA_ID", withDefaultValue: "default", andArguments: nil, andPluralRule: ALPluralRuleForQuantity(quantity)))), quantity)
    

    在仪表板中,您通过将复数化规则附加到您的ID中创建一个复数化ID,格式如下:[zero][one][two][few][many][other]

    所以复数化ID为"APPLANGA_ID""APPLANGA_ID[zero]"

  2. 更新内容

    触发更新调用

    //objc
    [Applanga updateWithCompletionHandler:^(BOOL success) {
    	//called if update is complete
    }];
    //swift
    Applanga.update { (success: Bool) in
    	//called if update is complete
    }

    这将请求基础语言、开发语言以及设备当前语言的短标题和长标题。如果您正在使用组,请注意,这将只更新组。

    触发特定组语言的更新调用

    //objc
    NSArray* groups = @[@"GroupA", @"GroupB"];
    NSArray* languages = @[@"en", @"de", @"fr"];
     	
    [Applanga updateGroups:groups andLanguages:languages withCompletionHandler:^(BOOL success) {
    	//called if update is complete
    }];
    //swift
    var groups: [String] = ["GroupA", "GroupB"]
    var languages: [String] = ["en", "de", "fr"]
    
    Applanga.updateGroups(groups, andLanguages: languages, withCompletionHandler:  {(success: Bool) in
    	//called if update is complete
    })
  3. 更改语言

    您可以使用以下调用在运行时更改应用程序的语言

    //objc
    BOOL success = [Applanga setLanguage: language];
    //swift
    var success: Bool = Applanga.setLanguage(language)

    language必须是指定在仪表板中添加的语言的ISO字符串。如果语言可以设置,或者它已经是当前的语言,则返回值将是YES;否则,它将是NO。设置的语将保存,要重置到设备语言,请调用

    //objc
    Applanga.setLanguage(nil); 
    //swift
    Applanga.setLanguage(nil);

    在成功调用的之后,您需要重新初始化UI以确保更改生效,例如,您可以重新创建根Storyboard控制器并显示它。

    language参数的格式应为[language]-[region][language]_[region],其中区域是可选的。例如:"fr_CA"、"en-us"、"de"。

    如果您在切换到特定语言时遇到问题,可以更新设置文件或在使用更新内容调用时具体请求该语言(参见 2. 更新内容)。您还可以将语言指定为默认语言,以便在每个更新调用时请求该语言(参见 可选设置)。

    + (void) changeAppLanguage:(NSString *)language {
    		[Applanga updateGroups:nil andLanguages:@[language] withCompletionHandler:^( BOOL updateSuccess ){
    		
    		if(updateSuccess){
    				BOOL languageChangedSuccess = [Applanga setLanguage:language];
    			
    				if(languageChangedSuccess) {
    						//recreate ui
    				} 
    		} 
    }
  4. WebViews

    如果启用,Applanga也可以在WebViews中翻译内容。

    ApplangaTranslateWebViews设置为YES添加到Info.plist中,以启用对所有WebViews的翻译支持。

    如果使用已弃用的UIWebView或较新的WKWebView,则有一些差异,因为UIWebView中的直接Applanga调用是同步的,但在WKWebView中则需要异步。

    要在UIWebView中初始化Applanga用于您的web内容,您需要从JavaScript这样初始化Applanga

    <script type="text/javascript">
    	window.initApplanga = function() {
    		if(typeof window.ApplangaNative !== 'undefined') { window.ApplangaNative.loadScript();
      		} else { setTimeout(window.initApplanga, 180); } 
      	}; window.initApplanga();
    </script>

    如果您使用WKWebView,则无需这样做。

    4.1 字符串

    具有applanga-text="APPLANGA_ID"属性的标签的内联文本和HTML将被APPLANGA_ID的翻译值替换

    <div applanga-text="APPLANGA_ID">
    		***This will be replaced with the value of APPLANGA_ID***
    </div>

    或者您可以直接调用Applanga.getString,如下所示

    //UIWebView
    translation = Applanga.getString('APPLANGA_ID')
    //WKWebView
    Applanga.getString('APPLANGA_ID', undefined, undefined,  undefined, undefined, undefined, 
     function(translation) {
    })

    4.2 参数

    您可以使用applanga-args属性传递参数。默认情况下,参数将解析为一个逗号分隔的列表,然后替换字段如%{arrayIndex}。

    <div applanga-text="APPLANGA_ID" applanga-args="arg1,arg2,etc">
    	***This will be replaced with the value of APPLANGA_ID***
    	***and formatted with arguments***
    </div>

    直接调用

    //UIWebView
    translation = Applanga.getString('APPLANGA_ID', 'arg1,arg2,etc')
    //WKWebView
    Applanga.getString('APPLANGA_ID', 'arg1,arg2,etc', undefined,  undefined, undefined, undefined, 
     function(translation) {
    })

    如果要使用除逗号以外的不同分隔符,例如您的参数包含逗号,请使用applanga-args-separator

    <div applanga-text="APPLANGA_ID" 
    	applanga-args="arg1;arg2;etc"
    	applanga-args-separator=";">
    		***This will be replaced with the value of APPLANGA_ID***
    		***and formatted with arguments***
    </div> 

    直接调用

    //UIWebView
    translation = Applanga.getString('APPLANGA_ID', 'arg1,arg2,etc', ';')
    //WKWebView
    Applanga.getString('APPLANGA_ID', 'arg1,arg2,etc', ';',  undefined,  undefined,  undefined, 
     function(translation) {
    })

    可以将其用作命名参数的一维JSON对象,如果添加了applanga-args-separator="json"

    <div applanga-text="APPLANGA_ID" 
    	 applanga-args="{'arg1':'value1', 'arg2':'value2', 'arg3':'etc'}"
    	 applanga-args-separator="json">
    		***This will be replaced with the value of APPLANGA_ID***
    		***and formatted with json arguments***
    </div> 

    直接调用

    //UIWebView
    translation = Applanga.getString('APPLANGA_ID', "{'arg1':'value1', 'arg2':'value2', 'arg3':'etc'}", 'json')
    //WKWebView
    Applanga.getString('APPLANGA_ID', "{'arg1':'value1', 'arg2':'value2', 'arg3':'etc'}", 'json',  undefined,  undefined,  undefined, 
     function(translation) {
    })

    4.3 复数

    要将HTML标签复数化,您可以传递具有applanga-plural-rulezeroonetwofewmanyother值的属性。

    <div applanga-text="APPLANGA_ID" applanga-plural-rule="one">
    	***This will be replaced with the pluralized value of APPLANGA_ID***
    </div> 

    直接调用

    //UIWebView
    translation = Applanga.getPluralString('APPLANGA_ID', 'one')
    //WKWebView
    Applanga.getPluralString('APPLANGA_ID', 'one', undefined, undefined,
     function(translation) {
    })

    或者与参数一起使用

    //UIWebView
    translation = Applanga.getPluralString('APPLANGA_ID', 'one', 'arg1;arg2;etc', ';')
    //WKWebView
    Applanga.getPluralString('APPLANGA_ID', 'one', 'arg1;arg2;etc', ';', 
     function(translation) {
    })

    您也可以通过applanga-plural-quantity通过数量进行复数化

    <div applanga-text="APPLANGA_ID" applanga-plural-quantity=42>
    	***This will be replaced with the pluralized value of APPLANGA_ID***
    </div> 

    直接调用

    //UIWebView
    translation = Applanga.getQuantityString('APPLANGA_ID', 42)
    //WKWebView
    Applanga.getQuantityString('APPLANGA_ID', 42,  undefined, undefined, 
     function(translation) {
    })

    或者与参数一起使用

    //UIWebView
    translation = Applanga.getQuantityString('APPLANGA_ID', 42, 'arg1;arg2;etc', ';')
    //WKWebView
    Applanga.getQuantityString('APPLANGA_ID', 42, 'arg1;arg2;etc', ';', 
     function(translation) {
    })

    4.4 更新内容

    要从一个WebView触发内容更新,请使用JavaScript

    Applanga.updateGroups("GroupA, GroupB", "de, en, fr", function(success){
    	//called if update is complete
    });		

    4.5 启用显示ID模式

    Applanga.setShowIdModeEnabled(true);

    如果启用显示ID模式,Applanga将返回您的字符串ID而不是本地化。这对于屏幕截图很重要(尤其是SwiftUI,如以下自动捕获SwiftUI屏幕截图所述)。例如,如果您的字符串或任何在运行时更改的字符串可能不会在屏幕截图上收集,那么在显示ID模式下,Applanga可以精确匹配字符串ID,使得屏幕截图字符串收集更加准确。

    请勿在生产环境中使用此标志。要查看更改,必须在更改此标志后重新加载您的UI。

  5. 屏幕截图捕获

    为了翻译的上下文,Applanga SDK 提供了上传您应用程序截图的功能,并附带元数据,例如当前的语言、分辨率以及可见的字符串(包括其位置)。每个截图都将分配一个标签。一个标签可能有多个截图,这些截图的核心元数据各不相同:语言、应用版本、设备、平台、操作系统和分辨率。您可以在以下位置了解更多信息:处理截图以及上传截图

    5.1 手动截图捕获和上传

    要手动创建截图,您首先需要将您的应用设置为草稿模式

    当您的应用处于草稿模式时,您只需进行两次手势向下滑动。这将显示截图菜单并加载数据列表标签

    您现在可以选择一个标签,然后按捕获截图来捕获和上传截图,包括当前可见屏幕的所有元数据,并将其分配给所选标签。在使用截图菜单之前,需要在仪表板上创建标签。

    5.2 通过 UITests 自动截图捕获和上传

    可以通过扩展现有的 UI 测试来自动化截图,或者在应用程序的每个视图上捕获截图,或者创建一个专门用于遍历应用程序并调用每个视图上的 Applanga 截图捕获方法的脚本。

    请参阅安装了解如何将 ApplangaUITest 包添加到您的项目中。

    要捕获 Xcode 中运行UITests的截图,您首先必须使用当前应用程序实例初始化 Applanga,以便在开始测试之前设置特定的启动参数。

    //objc
    XCUIApplication* app = [[XCUIApplication alloc] init];
    ApplangaUITest* applangaUITest = [[ApplangaUITest alloc] initWithApp:app enableShowIdMode:false];
    //swift 
    let app = XCUIApplication()
    let applangaUITest = ApplangaUITest(app: app)

    要捕获截图,请指定一个标签/屏幕名称,并等待方法完成。

    //objc
    NSArray* expectations = [NSArray arrayWithObject:[self.applangaUITest takeScreenshotWithTag:@"ScreenName"]];
    [self waitForExpectations:expectations timeout:10];
     //swift 
     wait(for: [applangaUITest!.takeScreenshot(tag: "ScreenName")], timeout: 10.0)

    完整示例

    #import <ApplangaUITest-Swift.h>
    
    @interface MyUITestCase : XCTestCase
    @property ApplangaUITest *applangaUITest;
    @end
    
    @implementation MyUITestCase
    - (void)setUp {
    	...
    	XCUIApplication* app = [[XCUIApplication alloc] init];
    	self.applangaUITest = [[ApplangaUITest alloc] initWithApp:app enableShowIdMode:false];
    	[app launch];
    }
    
    - (void)testScreenshot {
    	XCUIApplication *app = [[XCUIApplication alloc] init];
    	
    	NSArray* expectations = [NSArray arrayWithObject:[self.applangaUITest takeScreenshotWithTag:@"ScreenName1"]];
    	[self waitForExpectations:expectations timeout:10];
    	//navigate to next view
    	...
    	NSArray* expectations = [NSArray arrayWithObject:[self.applangaUITest takeScreenshotWithTag:@"ScreenName2"]];
    	[self waitForExpectations:expectations timeout:10];
    }
    @end
    import ApplangaUITest
    class AutomatedScreenshotsTest: XCTestCase {
        let app = XCUIApplication()
        var applangaUITest: ApplangaUITest?
    
        func testScreenshot() {
            // enable show id mode if you are using swift ui so the string id will be linked to the tag name correctly
            // after that repeat the screenshot without show id mode
            applangaUITest = ApplangaUITest(app: app, enableShowIdMode: false) 
            app.launch()
            wait(for: [applangaUITest!.takeScreenshot(tag: "ScreenName")], timeout: 10.0)
        }
    }

可选设置

您可以在您的 plist 中指定一组默认组和李度,这些组和李度将在每次调用 Applanga.update() 或 Applanga.updateGroups() 时更新。这些组和李度将添加到任何在调用中本身指定的组和李度中,它们将始终被请求。参数值必须是一个字符串,其中包含用逗号分隔的组或语言列表。

  1. 指定默认组

    ...
    <key>ApplangaUpdateGroups</key>
    <string>turorial,chapter1,chapter2</string>
    ...
  2. 指定默认语言

    ...
    <key>ApplangaUpdateLanguages</key>
    <string>en,de-at,fr</string>
    ...
  3. 禁用 Storyboard 字符串的上传您可以选择禁用 Storyboard 字符串的收集,通过将该值设置为 false。这不会阻止上传为 Storyboard 创建的本地域化 .strings 文件,但它将停止上传为 Storyboard 中的文本 UI 元素创建的保密字符串 ID 的默认上传。

    ...
    <key>ApplangaCollectStoryBoardStrings</key>
    <false/>
    ...
  4. 自动 Applanga 设置文件更新

    如果您的应用用户没有互联网连接,则无法获取新的翻译更新,因此 Applanga SDK 将回退到上一次本地缓存的版本。如果应用程序是首次启动,则尚未在本地缓存任何字符串,因此 Applanga SDK 将回退到 Applanga 设置文件,该文件包含从生成、下载并集成到应用程序中以来的全部字符串。

    Applanga SDK 附带一个名为 settingsfile_update.py 的 Python 脚本,该脚本确保您的应用程序始终拥有最新的设置文件版本。脚本会递归查找项目中的 *.applanga 文件,并检查是否有新版本可用。如果有,则用来自 Applanga 后端的较新 Applanga 设置文件替换旧文件。

    在 XCode 中,您转到构建阶段新建运行脚本阶段,并添加以下行(如果您正在使用 CocoaPods)

    bash "$SOURCE_ROOT/Pods/Applanga/Applanga.framework/update-settingsfile.sh" "$SOURCE_ROOT/$TARGET_NAME"
    

    或者如果您正在使用 Carthage

    bash "$SOURCE_ROOT/Carthage/Checkouts/sdk-ios/Applanga.framework/update-settingsfile.sh" "$SOURCE_ROOT/$TARGET_NAME"
    

    或者如果您正在使用 Swift 包管理器

    bash "${BUILD_DIR%Build/*}/SourcePackages/checkouts/sdk-ios/Applanga.xcframework/update-settingsfile.sh" "$SOURCE_ROOT/$TARGET_NAME"
    

    或者如果您手动集成 Applanga SDK

    bash "$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/Applanga.framework/update-settingsfile.sh" "$SOURCE_ROOT/$TARGET_NAME"
    

    --

    您还可以从命令行手动运行更新脚本。导航到 Applanga.framework 目录,其中存放了 settingsfile_update.py 文件,然后运行

    bash update-settingsfile.sh ${YOUR TARGET DIRECTORY PATH}
    

    为了确保脚本正在运行并查看它何时更新或未更新,请在 Xcode 的报告导航窗口中查看构建报告。在那里,您将找到每个更新步骤的日志。

    如果文件更新成功,您应看到日志“设置文件已更新!”如果它已是最新的,您将看到日志“设置文件是最新的”。

  5. 初始化时禁用字符串更新

    如果您希望禁止 SDK 在应用启动时自动更新字符串,可以设置以下内容

    ...
    <key>ApplangaInitialUpdate</key>
    <false/>
    ...

    您仍可以在任何时候调用 Applanga.Update() 来更新字符串

  6. 禁用草案模式

    如果您希望在构建中始终不可用草案模式,可以添加以下设置到您的 plist 中。

    ...
    <key>ApplangaDraftModeEnabled</key>
    <false/>
    ...

    您还可以在运行时使用以下方法

    Applanga.setDraftModeEnabled(bool);
    

    这会覆盖 plist 中的设置,但不会覆盖 Applanga 控制台中禁用草案模式。

  7. 转换占位符

    要在大浪风格之间转换占位符,您需要在您的 plist 中启用以下内容

    ...
    <key>ApplangaConvertPlaceholders</key>
    <true/>
    ...

    常用占位符

    以下占位符不会进行转换,因为它们在 iOS 和 Android 上都受支持。

    • 科学计数法 %e%E
    • %c%C Unicode 字符
    • %f 浮点数
    • %g%G 电脑科学计数法
    • %a%A 浮点数
    • 八进制整数 %o(对于 %O,请参阅 Android 至 iOS 转换)
    • %x%X 使用小写字母(%x)或大写字母(%X)表示的十六进制表示
    • %d 将保持 %d
    • 位置性占位符如 %1$s 转换为 %1$@,反之亦然

    Android 占位符

    • %s%S 的所有实例都将转换为 %@
    • 不受支持的转换类型,如 %h%tY,将转换为默认的 %@ 类型。
    • 布尔类型 %b%B 将转换为 %@
    • %h%H 转换为 %@
    • 使用 '<' 的位置性字符串受支持。“Duke's Birthday: %1$tm %<te,%<tY”的结果为“Duke's Birthday: %1$@ %1$@,%1$@
  8. 语言映射

    您可以将一个区域映射到另一个区域。例如,如果您未将 es-CL 添加到您的仪表板,它通常将回退到 es。但是,如果要将 es-CL 视为 es-MX,则可以将其添加到映射中。注意日志

    ApplangaLanguageMap: es-CL 映射到 es-MX

    示例

    ...
    <key>ApplangaLanguageMap</key>
    <string>zh-Hant-HK=zh-HK,es-CL=es-MX</string>
    ...

    该区域将在 SDK 的所有地方进行映射,除了与 自定义语言回退 一起使用。在这种情况下,自定义回退将按 plist 中的设置执行,该 plist 中的条目不会发生任何其他映射。如果您有一个映射到具有自定义回退的区域,这也将有效,并且自定义回退将在映射之后执行。

  9. 启用系统语言回退

    默认情况下,applanga 使用自定义设备区域顺序,这个 plist 值会使 SDK 使用系统设置的优先级遍历语言。在找不到特定语言的字符串时,将使用该顺序进行翻译并提供回退。然后 SDK 会尝试使用列表中的下一个语言进行翻译。可用的选项包括

    applanga:默认 SDK 顺序 system:使用设备系统顺序

    ...
    <key>ApplangaLanguageFallback</key>
    <string>system</string>
    ...
  10. 启用自定义语言回退

    此plist值是一个字典,允许按语言设置自定义备用项。当SDK需要用指定语言翻译键时,它会按照提供的顺序使用。这仅覆盖那些语言的任何其他系统或默认备用项。其他语言按照通过ApplangaLanguageFallback值指定的备用项(如果没有设置则使用默认值)工作。备用项仅覆盖顶级语言,因此不能“嵌套”自定义备用项。

    示例

    ...
    <key>ApplangaCustomLanguageFallback</key>
    <dict>
    	<key>es-MX</key>
    	<array>
    		<string>es-MX</string>
    		<string>es-US</string>
    		<string>es</string>
    	</array>
    	<key>en-US</key>
    	<array>
    		<string>en-GB</string>
    		<string>de-DE</string>
    	</array>
    </dict>
    ...
  11. 等待应用启动

    为了将您的 Applanga 控制台中的最新字符串接收至您的应用,SDK 将等待初始更新完成,这可能导致启动时有最长10秒的延迟(通常更快)。如果设置为是,如果您希望在后台执行此操作,可以在 info.plist 中添加密钥 ApplangaWaitOnAppStart 并将其设置为 NO,如下例所示。这将导致 Applanga SDK 不延迟应用启动,但缺点是初始屏幕可能不会显示最新的空中字符串。因此,如果您启用此选项,请确保在发布前设置文件是最新的,并注意一些过时的字符串可能会显示。

    示例

    ...
    <key>ApplangaWaitOnAppStart</key>
    <false/>
    ...
  12. 自动上传带有当前应用字符串的标签

    如果您想上传包含您应用中所有本地字符串的标签,请在 plist 中添加以下密钥。

    ...
    <key>ApplangaTagLocalStringsPrefix</key>
    <string>some_tag</string>
    ...

    此plist值将作为标签前缀与捆绑包版本(例如 some_tag1)结合使用,然后当调试器连接到应用并在 Applanga.update() 后运行时,将执行自动标签上传,这也在应用启动时执行。如果它尚不存在,将在控制台上创建此标签。

    可以将此选项与 ApplangaAdditionalStringFilesApplangaAdditionalFrameworks 键结合使用,以包含这些位置的字符串。

自动推送通知本地化和InfoPlist字符串

使用 Applanga SDK,您只能对本地通知进行本地化,因为远程通知、应用显示名称(CFBundleDisplayName)以及 Info.plist 中定义的多个其他 NS*UsageDescription 等字符串不使用应用运行时,因此无法使用 SDK 在运行时进行本地化。对于这些类型的字符串,您可以使用 Applanga 命令行界面Applanga 控制台 中管理字符串,并更新 InfoPlist.strings 文件每当您创建新构建时。

有关详细信息,请参阅我们关于 翻译推送通知和 Info.plist 本地化 的博客文章。

SwiftUI

要使用 Applana 与 SwiftUI,请在项目中包含 ApplanaSwiftUI 框架,并遵循 Readme 中的集成说明。

如果您想继续仅使用基本 Applanga 框架,您可以使用此扩展对本机 Text 组件进行本地化

	//First add this extention to your project:
	extension Text {
	    init(applangaKey : String){
	        self.init(NSLocalizedString(applangaKey, tableName: nil, bundle: Bundle.main, value: "", comment:""))
	    }
	    init(applangaKey : String, defaultValue : String){
	        self.init(NSLocalizedString(applangaKey, tableName: nil, bundle: Bundle.main, value: defaultValue, comment:""))
    	}
	}
	
	//Then localise a text like so:
	
	Text(applangaKey: "hello_world")
	
	//or
	
   	Text(applangaKey: "hello_world", defaultValue: "Hello World")

SwiftUI 截图

为您的 SwiftUI 翻译生成截图的最佳方法是,在 自动化测试期间 描述的 UITests 中生成截图。

要使用 SwiftUI 收集屏幕上的字符串位置,您需要启用 applanga ID 模式,这意味着每个字符串都通过其 ID 显示,而不是通过本地化显示。这是将正确的 ids 与其位置链接到截图的 100% 精确的方法。要启用 applanga 显示 ID 模式,请将参数传递给您的 ApplangaUITest 实例。

    let app = XCUIApplication()
    let applangaUITest = ApplangaUITest(app: app, enableShowIdMode: true)
    app.launch()

一个不错的做法是,首先启用一次显示 ID 模式,然后生成所有没有显示 ID 模式的截图。这样,所有截图都正确地链接了翻译,您仍然可以看到带有实际翻译的截图。

WatchOS

尽管截图和草稿模式菜单不可用,但在WatchOS目标上,字符串上传和自动剧情翻译仍然正常工作,只需按照以下额外步骤操作即可使其正常工作。

a. 在使用Cocoa Pods或SPM安装时,您还必须将applanga sdks应用于以“extension”结尾的watch目标。

b. 确保您想本地化的任何storyboard或字符串文件也是extension目标的一部分。

c. 将您要本地化的字符串文件或storyboard的名称添加到extension目标的info.plist中。例如,如果要本地化Interface.storyboard,则可以按以下方式添加:key="ApplangaAdditionalStringFiles" value="Interface".

d. 在您的watch extension目标的info.plist中添加以下条目:key="ApplangaAdditionalFrameworks" value="您的项目名称 WatchKit App".

MacOS

尽管截图和草稿模式菜单不可用,但字符串上传和自动剧情翻译在MacOS目标上也能正常工作,只需像iOS SDK那样安装并正常使用即可。

TV OS

在TV OS上,无需进行任何特殊更改,即可正常使用自动翻译和草稿模式。

目前唯一不可用功能是草稿模式的截图菜单。

分支

如果您的项目是分支项目,请至少使用SDK版本2.0.177并更新您的设置文件。设置文件定义了当前应用的默认分支。此分支在应用启动和更新调用时使用。要确保分支正常工作,请查找日志行:分支已启用。

要了解更多关于分支的信息,请参阅此处.

草稿模式

启用草稿模式时,您可以在运行时切换分支 - 需要重新启动应用。您还可以使用我们的草稿覆盖层切换当前分支。您拍摄的每个截图都与当前分支相关联。

生产应用

已发布的应用如果仍使用没有分支且较旧的SDK的设置文件,它们将继续工作,并使用在Applanga仪表板上定义的默认分支。