先决条件
确保您的 Xcode 项目的设置使用了基本国际化。
在 Xcode 文件资源管理器中选择项目文件,进入项目设置。选择项目本身,而不是您的目标之一。在本地化部分,勾选 使用基本国际化
复选框。
我们建议您将希望将您的应用翻译成所有希望的语言添加到语言列表中。但是,您不需要为每个 Interface Builder 文件(故事板,XIB)启用本地化。字符串将被提取并为运行时由 Smartling SDK 本地化。
在您的代码中,所有面向用户字符串都需要使用宏 NSLocalizedString
外部化。这是 iOS 上本地化应用的标准方式,Smartling 简单地覆盖了其行为。
将您的字符串导入 Smartling
手动进行
您可以将项目的 .strings
文件手动上传到 Smartling 控制台,以便您的翻译人员可以使用这些字符串。您可以使用 Apple 的 genstrings
命令行工具将所有字符串从代码中提取到 Localizable.strings 文件中。对于包含在 Interface Builder 文件中的本地化字符串,您可以使用 ibtool
命令行工具进行提取。
自动
Smartling 提供了一个 Ruby 包来提取您的字符串并将它们自动上传到仪表板。使用以下命令通过 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 到终端用户设备的 app 中。
- 仅 MDN 的静态库 - 这是 Smartling SDK 的简化版,仅包含空中服务模式。如果您对 app 大小有严格的要求,建议在发布构建中使用此选项。它通常会增加约 65Kb 到用户设备的 app 中。它仅提供作为静态库。
(在启用 bitcode 的示例应用的发布版本上,对 iPhone 7 版本进行了 app 大小测量。结果可能会有所不同。)
完整 Smartling SDK
1. 安装 Smartling 包
静态库
如果您应用程序使用Objective-C语言且目标iOS < 8.0,请选择我们的静态库。在您的项目podfile
中,添加Smartling库如下。
source 'https://github.com/CocoaPods/Specs.git'
target 'MyApp' do
pod 'SmartlingSDK'
end
动态库
如果您的应用程序符合以下条件之一,请选择我们的动态库
use_frameworks!
选项已在您的podfile中存在并且已取消注释。- 您的应用程序包含Swift代码。
- 您的应用程序的目标iOS版本不小于8.0。
在您的项目podfile
中,添加Smartling-library库如下。
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. 检查你的构建设置
进入项目构建设置,查找 其他链接器标志
。确认存在 -ObjC
标志,或添加它。
MDN-only 库
在你的项目 podfile
中添加如下所示的 Smartling pod。
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 运行模式构建应用程序
- 使用
SLMode: SLOTAServing
- 添加
SLOTAKey
选项,使用项目的 AES OTA 更新密钥。 OTA 密钥是在你通过 Smartling 账户启用移动时由 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启动选项传递用户ID和密钥,例如使用
SLAPIUserId
和SLAPIUserSecret
。 - 将
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];