Polyglot 允许在 Interface Builder 中直接从 Storyboard/XIB 文件本地化用户界面。
它为常见的 UI 元素提供扩展,以便在 Interface Builder 中设置本地化文本。例如,UILabel 将显示一个 "Text Key" 属性。当设置了值时,Polyglot 将使用该值调用 NSLocalizedString 并将其设置到标签的文本属性中。
为什么选择 Polyglot?
已经存在几种国际化 UI 的方式
- 传统上,我们会对每个区域创建每个 Storyboard。这使得 Storyboard 非常难以维护。
- 为每个 UI 元素定义 出初始化器 并使用 NSLocalizedString 设置文本是一个常见的做法。这会增加不必要的初始化器,并产生大量的模板代码。
- 基础国际化 是一个用于本地化 UI 的强大工具,但让我们面对现实,它并不是最佳解决方案。生成的 字符串文件 很难维护,且在修改 Storyboard 时对开发者不够友好。
Polyglot 并不试图取代这些工具,而是提供了一种本地化过程的补充方法。与创建初始化器相比,它是一种干净且简单的解决方案。同时,它也易于维护,并保持对 字符串文件 的控制。
系统要求
- iOS 8.0+ / macOS X 10.9+
- Xcode 7.0+
设置
CocoaPods
请确保您正在使用最新的 CocoaPods 版本。
然后在 podfile 中添加 Polyglot pod。以下是一个 iOS 项目的 podfile 示例
platform :ios, '8.0'
use_frameworks!
pod 'PolyglotLocalization'
注意 use_frameworks! 行,这一点很重要。同时,请注意最低平台版本需要遵守上面要求中的说明。
最后,别忘了更新您的 pod 并打开生成的 xcworkspace 文件
$ pod install
其他
还有其他方法可以将 Polyglot 添加到您的项目中。Polyglot 是一组用 Swift 编写的扩展,因此您可以将文件复制到项目中(不推荐),或将项目作为依赖项添加...
请注意,由于 Interface Builder 不会识别该情况下的 inspectable 属性,因此不能将项目作为 静态库 包括。
使用方法
基本操作
一旦设置了 Polyglot,打开您的 Storyboard 或 XIB 文件。选择一个显示文本的 UI 元素(例如 UILabel),您将在属性检查器中看到一个名为 "Text Key" 的属性。将以下值设置为 "Text Key" 属性:hello_wolrd。
现在您需要将相应的值添加到 Localizable.strings 文件中
"hello_wolrd" = "Hello World";
现在您可以运行应用程序,标签应显示 Hello World。
属性命名
可以由 Polyglot 本地化的属性,其名称为原始属性后跟 key
- 文本 -> 文本 Key
- 标题 -> 标题 Key
- 占位符 -> 占位符 Key
这样,就很容易识别每个情况下将本地化哪些属性。
基于表的键
NSLocalizedString() 有一个 tableName 属性,允许使用特定的 '.strings' 文件。Polyglot 提供以下格式以指定表名
[table_name].string_key
因此,如果您想从 'Common.strings' 文件中使用 'field_title' 键,您可以在 Interface Builder 中设置如下:
[Common].field_title
CSV 属性
当一个元素列表需要本地化时,键将以 CSV(逗号分隔值)指定。例如,分段控件就是这种情况。相应的属性将按如下方式命名:标题 KeysCSV。
键列表通过提取逗号分隔值获得。值将被修剪,所以逗号旁边的空格将被忽略。
然后,每个键都将用来本地化相应的元素。例如,第一个键将用于本地化第一个段,依此类推。以下示例将修改前三个段的标题:
segment_one, segment_two, segment_three
如果存在超过三个段,则其余段不会被修改。同样,我们可以留空元素以忽略某些元素。以下示例将仅修改第一个和第三个段的标题
segment_one, , segment_three
UIButton
UIButton 允许为每个状态设置标题文本。对此,Polyglot 为每种状态提供了一种属性:默认、高亮、选中和禁用。
如果我们只需要为所有状态分配一个标题,我们只需分配 默认标题 Key 并将其他空余项留空。
高级
自定义密钥管理
Polyglot 允许您配置如何处理密钥。您需要修改 Polyglot.localizer 来设置自己的实现。
默认情况下,它解析表格和上面在“基于表格的键”中指定的密钥。这通过 TabledLocalizer 类实现。
假设我们想验证每个密钥都已实际翻译,否则抛出致命错误。我们像这样配置 Polyglot
Polyglot.localizer = TabledLocalizer { key, tableName in
let result = NSLocalizedString(key, tableName: tableName, value: "{NOTFOUND}", comment: key)
if result == "{NOTFOUND}" {
fatalError("Poliglot: Key '\(key)' not found")
}
return result
}
我们需要在应用程序启动时运行此代码,在 UI 加载之前。对于 iOS,它通常在 UIApplicationDelegate.application(application, didFinishLaunchingWithOptions) 实现中。而对于 MacOS 应用程序,您应该在您的 NSApplicationDelegate 中覆盖 awakeFromNib 并将代码放置在那里。
override func awakeFromNib() {
Polyglot.localizer = ...
}
不要忘记导入模块
import PolyglotLocalization
还有一件事...
如果你喜欢这个库,请确保分享它!
证书
Polyglot 根据 MIT 许可证发布。有关详细信息,请参阅 LICENSE。