Applanga SDK for iOS 本地化
版本 2.0.174
更新日志: https://www.applanga.com/changelog/ios
目录
自动推送通知本地化和InfoPlist.strings
安装
?]
CocoaPods [-
请参阅CocoaPod的入门指南以获取有关CocoaPods的详细说明。
-
创建Podfile后,请插入以下代码行:
pod 'Applanga'
。要在UI测试期间进行屏幕截图,请在UI Test Target中插入pod 'ApplangaUITest'
。 -
完成后,从命令行重新运行
pod install
。
?]
Carthage [-
如果您是Carthage的新手,请首先参阅其文档。
-
请将以下行添加到您的Cartfile
binary "https://raw.githubusercontent.com/applanga/sdk-ios/master/Applanga.json" ~> 2.0
-
从命令行运行
carthage update
并按照carthage文档中描述的方式将Applanga.framework链接到您的项目中:iOS入门。
?]
Swift Package Manager [注意:这仅在Xcode版本12及以上受支持
1:简单地将仓库URL https://github.com/applanga/sdk-ios 添加为swift包依赖项,并选择最新的发布标签
手动(零代码)
-
如果您想翻译iOS应用,请从 Github 下载Applanga iOS SDK的最新版本。解压缩后,将Applanga.framework拖放到您目标项目的《嵌入式二进制》部分,并勾选“如有需要,将项目复制到目标组文件夹中”选项。
-
在《构建设置》选项卡下,您需要将《基本》更改为《全部》,并搜索《其他链接器标志》。双击“其他链接器标志”右侧的空白处,将弹出一个窗口。点击加号(+),然后添加 `-ObjC, -lsqlite3, -lz`。
-
为了能够正确上传您的应用到iTunesConnect,您需要解决由通用二进制触发的App Store提交错误。要做到这一点,请在目标项目的《构建阶段》中添加一个新的《运行脚本阶段》。重要:请确保此《运行脚本阶段》位于《嵌入框架》构建阶段下方。您可以拖放构建阶段以重新排序。将以下行粘贴到此《运行脚本阶段》的脚本文本框中。
bash "$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/Applanga.framework/strip-framework.sh"
配置
-
要开始使用Applanga进行iOS本地化,请从控制台的“项目概览”中下载您的应用的《Applanga设置文件》,通过点击《[准备发布]》按钮,然后点击《[获取设置文件]》。
-
将《Applanga设置文件》添加到您的应用资源中。它将自动加载。
-
现在,如果您启动您的应用,您应该会看到一个确认Applanga已初始化的日志消息,或者在缺少配置的情况下看到一个警告。
-
要确保您的设置文件始终对所有构建都是最新的,请参阅《可选设置》中关于《自动Applanga设置文件更新》的文档部分。
注意:为了确保原生iOS对话框正确翻译,并在Appstore上显示您支持的语言,您需要为每种语言将至少一个(strings)文件打包到您的应用中。(文件可以是空的)
用法
基本操作
- 一旦Applanga集成并配置,每次您在调试模式或草稿模式启动应用时,它都会将您的本地字符串与Applanga仪表板同步。如果找到新的缺失字符串。存储在您的应用的故事板或xib文件的字符串中的翻译将立即发送到仪表板。Applanga还会在使用后自动检测故事板和代码中的字符串。应启用故事板以进行基本国际化。如果您有其他应自动上传的"strings"文件,您可以在Info.plist中通过键"ApplangaAdditionalStringFiles"添加它们,如果您有其他代码在额外的"strings"框架包中,您可以使用键"ApplangaAdditionalFrameworks"将它们作为逗号分隔的列表添加。您不需要使用任何特殊代码。
-
对于Objective-C,使用原生方法NSLocalizedStringWithDefaultValue(@"APPLANGA_ID", nil, NSBundle.mainBundle, @"default value", @"")
-
使用 Swift 时,您可以像往常一样使用 NSLocalizedString("APPLANGA_ID", value: "default value", comment: "")。
-
注意:如果您未指定默认值,字符串将不会在 Applanga 控制台上创建。
扩展
除了基本用法外,Applanga 还支持您字符串中的 命名参数、复数、部分更新以节省空间和带宽,以及 UIWebView
实例中 HTML 和 JavaScript 内容的翻译。
-
代码本地化
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](http://unicode.org/.../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]。因此,zero 的复数化 ID 为 "APPLANGA_ID[zero]"
-
更新内容
要触发更新,请调用
//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 })
-
更改语言
您可以使用以下调用在运行时更改应用程序的语言
//objc BOOL success = [Applanga setLanguage: language];
//swift var success: Bool = Applanga.setLanguage(language)
语言必须是在仪表板上已添加的语言的ISO字符串。如果语言可以设置,或者它已经是当前语言,则返回值将为YES,否则将为NO。设置的语种将被保存,要重置为设备语言,请调用
//objc Applanga.setLanguage(nil);
//swift Applanga.setLanguage(nil);
在成功调用后,您需要重新初始化您的UI,以便使更改生效,例如您可能需要重新创建根Storyboard控制器并展示它。
语言参数格式预期为[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 } } }
-
WebViews
如果启用,Applanga还可以翻译WebViews中的内容。
将
ApplangaTranslateWebViews
设置为YES
添加到您的Info.plist中,以启用所有WebView的翻译支持。如果您使用已弃用的
UIWebView
或较新的WKWebView
,则存在一些差异,因为在UIWebView
中直接的Applanga调用是同步的,但在WKWebView
中则需要异步。要在
UIWebView
中初始化Applanga用于您的网络内容,您需要像这样从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) { })
One Dimensional JSON Objects也可以用Named Arguments来使用,如果您添加了
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标签复数化,您可以传递具有值
zero
、one
、two
、few
、many
和other
的applanga-plural-rule
属性。<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而不是您的不当地化文字。这对于截图(尤其是Swipe的说明,如以下Swiper中的自动截图所示的SmartUI)可能很重要。例如,如果您有一个参数字符串或任何在运行时更改的字符串,那么在截图过程中可能不会收集特定的字符串。如果启用显示ID模式,Applanga可以精确匹配字符串ID,因此截图字符串的收集将是准确的。
在正式生产环境中不要使用此标志。要看到更改,您必须在更改此标志后重新加载UI。
-
屏幕截图捕获
为了提供翻译的上下文,Applanga SDK提供功能将应用程序的截图与元数据(如当前语言、分辨率和可见字符串,包括它们的位姿)一起上传。每个屏幕截图都将分配一个标签。一个标签可能包含具有不同核心元数据的多个屏幕截图:语言、应用程序版本、设备、平台、操作系统和分辨率。您可以在此处了解更多信息:与屏幕截图协作和在此处:上传屏幕截图。
5.1 手动屏幕截图捕获和上传
要手动截取屏幕截图,首先需要将您的应用设置为草稿模式。
将应用设置为草稿模式后,只需用两指向下滑动即可。这将显示截图菜单并加载标签列表。
现在,您可以选择一个标签并按下“截图”来捕获和上传当前可见屏幕的包括所有元数据的截图,并将其分配给所选的标签。在屏幕截图菜单中可用之前,标签必须在仪表板中创建。
5.2 通过UITests自动截图捕获和上传
可以通过扩展现有的UI Tests并在每个视图上捕获截图,或者创建一个专门遍历您的应用程序并在每个视图上调用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()时更新。这些组将添加到调用本身中指定的任何组中,它们将始终被请求。参数值必须是一个字符串,其中包含用逗号分隔的组或语言列表。
-
指定默认组
... <key>ApplangaUpdateGroups</key> <string>turorial,chapter1,chapter2</string> ...
-
指定默认语言
... <key>ApplangaUpdateLanguages</key> <string>en,de-at,fr</string> ...
-
禁用Storyboard字符串的上传 您可以选择禁用收集Storyboard字符串,通过将该值设置为false。这将不会阻止上传可能为Storyboard创建的本地化"strings"文件,但会停止上传为Storyboard中的文本UI元素创建的晦涩难懂的字符串ID。
... <key>ApplangaCollectStoryBoardStrings</key> <false/> ...
-
自动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 Package Manager
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 中的报告导航窗口中的构建报告。在那里您可以找到每个更新步骤的日志。
如果文件更新成功,您应该会看到“设置文件已更新!”的日志。如果它已经是最新版本,您将看到“设置文件已更新至最新”的日志。
-
在初始化时禁用自动字符串更新
如果您希望 SDK 在应用启动时不会自动更新您的字符串,您可以设置以下内容
... <key>ApplangaInitialUpdate</key> <false/> ...
您仍然可以在任何时候调用 Applanga.Update() 来更新您的字符串
-
禁用草稿模式
如果您希望创建一个在任意时刻都无法启用草稿模式的小程序,可以将以下设置添加到您的 plist 文件中。
... <key>ApplangaDraftModeEnabled</key> <false/> ...
您也可以在运行时使用以下方法
Applanga.setDraftModeEnabled(bool);
这将覆盖 plist 中的设置,但它不会覆盖 Applanga 控制面板中禁用草稿模式的设置。
-
转换占位符
要在 iOS 和 Android 之间转换占位符,您需要在您的 plist 中启用以下内容
... <key>ApplangaConvertPlaceholders</key> <true/> ...
常用占位符
以下是占位符不会被转换,因为在 iOS 和 Android 上都得到了支持。
- 科学记数法
%e
和%E
%c
和%C
特殊字符%f
浮点数%g
和%G
计算机科学记数法%a
和%A
浮点数- 八进制整数
%o
(%O
see Android to iOS conversion) %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$@
”
- 科学记数法
-
语言映射
您可以将一个区域设置映射到另一个区域设置。例如,如果您没有在仪表板上添加
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> ...
- 在应用启动时等待
为了接收 Applanga 仪表板中最新字符串到您的应用中, SDK 将等待初始更新完成,这导致启动时最多会延迟 10 秒(通常更快)。如果设置为“是”,如果您希望在后台执行此操作,可以将键
ApplangaWaitOnAppStart
添加到 info.plist 中并将其设置为 NO,如下例所示。 Applanga SDK 不会延迟应用启动,但这也意味着初始屏幕可能不会有最新的空对字符串。因此,如果要启用此功能,应确保在发布前设置文件是最新的,并且要注意某些经过更新的字符串可能会被显示。示例
... <key>ApplangaWaitOnAppStart</key> <false/> ...
自动推送通知本地化和InfoPlist字符串
使用Applanga SDK,您只能本地化本地通知,因为远程通知、应用程序显示名称(CFBundleDisplayName)以及其他定义在您的Info.plist中的多个NS*UsageDescription等字符串不使用应用程序运行时,因此无法使用SDK在运行时进行本地化。对于这类字符串,您可以使用Applanga命令行界面以管理Applanga仪表板上的字符串,并在创建新构建时更新InfoPlist.strings文件。
关于详细信息,请参阅我们的翻译推送通知和Info.plist本地化博客文章。
SwiftUI
要使用Applana与SwiftUI功能,请将ApplanaSwiftUI框架包含到您的项目中,并按照Readme中的集成说明操作。
如果您想要仅仅使用基础Applanga框架,您可以使用这个扩展来本地化文本组件
//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翻译的最佳方法是在测试期间自动进行。
要启用SwiftUI屏幕上字符串位置的收集,您需要启用applanga ID模式,这意味着每个字符串都将按其ID展示而非本地化。这是将正确的id与其位置链接到屏幕的唯一方法。要启用applanga显示ID模式,将参数传递到您的ApplangaUITest实例
let app = XCUIApplication()
let applangaUITest = ApplangaUITest(app: app, enableShowIdMode: true)
app.launch()
一个好的做法是在启用show id模式的情况下一次性捕获所有截图,然后在不启用show id模式的情况下捕获所有截图。这样,所有截图都正确地将翻译与它们链接起来,您仍然可以看到包含实际翻译的截图。
WatchOS
虽然截图和草稿模式菜单不可用,但在WatchOS目标中使用时,字符串上传和自动剧情板翻译正常工作。只需按照以下额外步骤操作即可使其正常工作。
a. 当使用cocoa pods或SPM安装时,还必须将applanga sdk应用于以“extension”结尾的watch目标。
b. 确保任何希望本地化的storyboard或字符串文件也是扩展目标成员。
c. 在扩展目标的info.plist中添加您想要本地化的字符串文件或剧情板的名称。例如,如果您正在本地化Interface.storyboard,则可以如下添加:key="ApplangaAdditionalStringFiles" value="Interface".
d. 在您的watch扩展目标的info.plist中添加以下条目:key="ApplangaAdditionalFrameworks" value="your project name WatchKit App".
MacOS
虽然截图和草稿模式菜单不可用,但在MacOS目标中使用时,字符串上传和自动剧情板翻译正常工作。只需像iOS sdk一样安装并正常使用即可。
TV OS
自动翻译和草稿模式将无需任何特殊修改即可在TV OS上工作。
目前唯一不可用的功能是草稿模式截图菜单。
分支
如果你的项目是一个分支项目,请使用至少SDK版本2.0.174,并更新你的设置文件。设置文件定义了你当前应用程序的默认分支。此分支在应用启动和更新调用时使用。为确保分支功能正常,请查找日志行:分支已启用。
要了解更多关于分支的信息,请点击这里[链接]。
草稿模式
启用草稿模式后,您可以在运行时切换分支 - 需要重新启动应用程序。您还可以使用我们的草稿覆盖来切换当前分支。您拍摄的每一张截图都与当前分支相关联。
生产应用
已经发布的且仍然使用不带分支的设置文件和较旧SDK的应用程序将继续工作,并将使用在 Applanga 控制台上定义的默认分支。