前置条件
确保您的 Xcode 项目设置为使用基本国际化。
通过在 Xcode 文件浏览器中选择项目文件来访问您的项目设置。选择项目本身,而不是您的一个目标。在本地化部分,勾选 使用基本国际化
复选框。
我们建议您在语言列表中添加您希望应用程序翻译成的所有语言。但是,您不需要为每个 Interface Builder 文件(Storyboard,XIB)启用本地化。字符串将从这些文件中提取并在运行时由 Smartling SDK 本地化。
在您的代码中,所有面向用户的字符串都需要使用宏 NSLocalizedString
外部化。这是在 iOS 上本地化应用程序的标准方式,Smartling 只是其行为的简单覆盖。
将字符串导入 Smartling
手动操作
您可以将项目的 .strings
文件手动上传至 Smartling 控制台,以便将字符串提供给翻译。您可以使用 Apple 的 genstrings
命令行工具将所有字符串从代码中提取到一个 Localizable.strings 文件中。对于包含在 Interface Builder 文件中的本地化字符串,您可以使用 ibtool
命令行工具来抽取。
自动
Smartling提供Ruby Gem来提取您的字符串并将其自动上传到仪表板。使用以下命令通过Rubygems安装
gem install smartling_xcode
然后执行
smartling_xcode init
系统将提示您输入项目ID和API密钥,这些可以在Smartling仪表板上找到。
现在可以在您的Xcode项目文件夹中运行以下操作
smartling_xcode push
您的应用程序的字符串现在已在仪表板上可供使用。
安装说明
在以下选项中选择适合您需求的SDK
- 完整Smartling SDK - 完整的Smartling SDK具有应用程序内审查、上下文捕获和空中推送服务模式,是满足您所有本地化需求的便捷解决方案。它可以作为静态库(适用于针对iOS < 8.0的Objective-C应用程序)或作为动态框架(适用于Swift应用程序或仅针对iOS > 8.0的Objective-C应用程序)提供。它通常会将约200Kb添加到最终用户的设备上。
- 仅MDN的静态库 - Smartling SDK的轻量级版本,仅包含空中推送服务模式。如果您的应用程序具有严格的尺寸要求,则建议您在发布版本中使用此选项。它通常会将约65Kb添加到用户的设备上。它仅作为静态库提供。
(在iPhone 7版本的带有bitcode的发布版样本应用上进行应用程序尺寸测量。结果可能会有所不同。)
完整Smartling SDK
1. 安装Smartling包
静态库
如果您的应用程序使用Objective-C并且针对iOS < 8.0,请选择我们的静态库。在您的项目的podfile
中添加如下所示的Smartling pod。
source 'https://github.com/CocoaPods/Specs.git'
target 'MyApp' do
pod 'SmartlingSDK'
end
动态框架
如果您的应用程序符合以下任一条件,请选择我们的动态框架:
use_frameworks!
已存在于您的podfile中,并且没有被注释掉。- 您的应用程序包含Swift代码。
- 您的应用程序没有针对iOS < 8.0。
在您的项目podfile
中添加如下所示的Smartling-framework pod。
source 'https://github.com/CocoaPods/Specs.git'
target 'MyApp' do
use_frameworks!
pod 'SmartlingFramework'
end
如果您使用Carthage,请将SmartlingFramework仓库添加到您的cartfile
中,如下所示。
github "Smartling/ios-lqa-framework"
2. 初始化库
Objective-C
在您应用的main.m中,导入库并调用start方法,如下所示
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import <SmartlingSDK/Smartling.h>
int main(int argc, char * argv[]) {
@autoreleasepool {
[Smartling startWithProjectId:@"<Project ID>" andOptions:@{SLLogging : SLLoggingInfo, SLMode: <Mode>}];
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
Swift
在您的应用AppDelegate.swift中,导入库并调用start方法,如下所示
import UIKit
import SmartlingSDK
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
...
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
SmartlingSDK.start(withProjectId: "<Project ID>", andOptions: [SLLogging: SLLoggingInfo, SLMode: <Mode>])
return true
}
3. 检查您的构建设置
进入项目的构建设置,查找Other linker flags
。确保存在-ObjC
标志或添加它。
仅MDN库
在您的项目podfile
中,按照如下所示添加Smartling库。
source 'https://github.com/CocoaPods/Specs.git'
target 'MyApp' do
pod 'Smartling-MDN'
end
在您应用的main.m中,导入库并调用start方法,如下所示
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import <SmartlingMDN/SmartlingMDN.h>
int main(int argc, char * argv[]) {
@autoreleasepool {
[SmartlingMDN startWithProjectId:@"<Project ID>" OTAKey:@"<OTA key>" andOptions:@{SLLogging: SLLoggingInfo}];
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
OTA密钥是您项目OTA更新的AES密钥,当您在Smartling账户中启用移动服务时,您的Smartling联系人会将其发送给您。您在Smartling仪表板上找不到这个密钥。
最后,转到您的项目构建设置,找到其他链接器标志
。确保存在或添加-ObjC
标志。
模式(仅完整Smartling SDK)
OTA托管
在OTA托管模式下,发布字符串以用户所在语言提供并显示在应用中。如何使用OTA托管。
要构建OTA托管模式下的应用
- 在使用Smartling启动方法时,使用
SLMode: SLOTAServing
。 - 添加
SLOTAKey
选项,使用项目OTA更新的AES密钥。OTA密钥是当您在Smartling账户中启用移动服务时,由您的Smartling联系人发送给您的。您在Smartling仪表板上找不到此密钥。
应用内审查
应用内审查模式允许团队成员登录到编辑字符串并审查它们的应用内上下文。如何使用应用内审查。
要构建应用内审查模式下的应用,在智能启动方法中使用SLMode: SLInAppReview
。
上下文捕获
使用上下文捕获模式,用户可以在运行应用时交互式地创建截图。如何使用上下文捕获。
要构建上下文捕获模式下的应用
- 在Smartling启动方法中使用
SLMode: SLContextCapture
。 - 从Smartling仪表板生成API v2令牌。使用
SLAPIUserId
和SLAPIUserSecret
选项传递用户ID和密钥。
自动化上下文捕获
您可以使用Xcode UI测试来自动化上下文捕获。
您的应用需要以上下文捕获模式启动。将以下方法添加到您的应用UI测试中,并在需要触发屏幕捕获的任何地方调用它
+ (void)triggerContextCapture {
XCUIApplication *app = [[XCUIApplication alloc] init];
XCUIElement *window = [app.windows elementBoundByIndex:0];
XCUICoordinate *origin = [window coordinateWithNormalizedOffset:CGVectorMake(0.0, 0.0)];
XCUICoordinate *triggerCoord = [origin coordinateWithOffset:CGVectorMake(100, 100)];
[triggerCoord pressForDuration:5.0];
}
您还可以通过调用以下方法直接从您的应用代码中触发屏幕截图
[Smartling captureWindow:<UIWindow> withCompletion:^(NSError *error) {
// Error handling
}];
您可以通过调用[[UIApplication sharedApplication] keyWindow]
或从视图控制器使用self.view.window
来获取您的应用主窗口。
应用内审查和上下文捕获
此模式与应用内审查模式相同,但在操作菜单中添加了一个附加选项,允许用户在应用内部切换到上下文捕获模式。这样,他们可以使用单个构建版本访问两种模式。
要在此组合模式下构建应用,在 Smartling 启动方法中使用 SLMode: SLInAppReviewAndContextCapture
,并包含上述“自动化上下文捕获”部分中描述的API v2令牌。
禁用
您可以在项目中保留Smartling库,但可以通过省略启动方法或使用SLMode: SLDisabled
选项来完全禁用其功能。
附加选项
SLLogging
定义SDK输出到控制台日志的级别。
- SLLoggingNone(默认)
- SLLoggingInfo
- SLLoggingDebug
运行时更改区域设置(仅限Smartling完整SDK)
在OTA服务模式下,如果您想让用户能够在应用内更改他们的区域设置,Smartling可以帮助您非常容易地实现这一目标。
- 从Smartling仪表板生成API v2令牌。使用Smartling启动选项
SLAPIUserId
和SLAPIUserSecret
传递用户ID和密码。 - 将
SLAllowLocaleChange
选项设置为@YES
。可选地,您可以使用SLForceLocale
在启动时强制设置区域,例如如果正在保存用户的选择。如果不设置此选项,将使用设备区域。 - 要向用户显示一组可用的区域,Smartling允许您请求您的应用项目可用的区域列表。调用方法
[Smartling getProjectLocalesWithCompletion:^(NSArray *locales, NSError *error){...}]
,完成块将返回包括区域名称和ID的区域数组。 - 当用户选择一个区域时,您可以使用方法
[Smartling setLocaleWithId:<NSString *localeId> andCompletion:^(BOOL success){...}]
来设置它。完成块将在UI与所选区域的文本完全更新后调用。
复数
为了使用复数规则本地化字符串,请使用方法pluralizedStringWithKey:value:
,而不是使用NSLocalizedString
,如下所示
NSNumber *value = @(5);
label.text = [NSString stringWithFormat:[Smartling pluralizedStringWithKey:@"<key>" value:value], value];