我们如何本地化我们的应用程序

每个应用程序都需要本地化,即使它是小型“单一语言”应用程序也是如此。 您永远不知道何时可以添加另一种语言。 即使您完全确定应用程序中将不再有其他语言,出于多种原因,也不应该在代码中直接编写字符串。 因此,您可以创建一些自定义枚举,常量,也可以使用标准的默认本地化键。 猜猜有什么更好的。 😏

本地化不仅涉及字符串,而且日期,数字或货币也必须根据用户的语言环境进行本地化和格式化。 由于它是由iOS本身处理的,因此现在让我们谈谈字符串本地化。

紧随其后的文本不是任何普遍真理,也不建议您应如何去做。 这就是我们做到的方式。 您可以使用它,从中获得启发,但是当然它不一定适合每个人。

让我们将其分为2个级别。 第一个是在应用程序中的代码级本地化。 第二个是非程序员对字符串的管理和翻译。

在应用程序本身中,一切都很好。 在最低级别上,我们使用标准.strings格式以及一些其他工具,以使其更加舒适和防错(如下所述)。 但是问题是如何创建Localizable.strings ? 程序员定义了本地化密钥,并且有人必须创建翻译。

您可以将所有Localizable.strings文件发送到翻译器,但是对于非程序员来说,这是一种非常令人困惑的格式,并且文件以某种方式返回损坏的可能性也很大(被遗忘的分号,引号等)。

对,这个问题早已解决。 创建了很多服务,尤其是用于翻译应用程序的服务。 可能最著名的是PhraseApp,但是还有Smartling,transifex等。 所有这些服务有2个共同点。

  1. 只是个过分杀手-我们发现我们真的不需要像PhraseApp这样的野兽。 帐户,历史记录,图表和其他功能。
  2. 这非常昂贵-当然,我们不会破产,但是为什么要为我们不需要的东西付钱呢?

在开始使用类似“ 短语应用替代 ”之类的内容之前,请尝试一下其他方法。

我们都知道电子表格…具有实时协作的Google Excel,但是您可能会惊讶于Google Spreadsheet如此强大! 您可以使用Apps Script进行出色的工作,它具有良好的Web API,并且还有许多用于各种编程环境的开源库。 我们甚至已经使用电子表格作为小型应用程序的后端,但这是另一篇文章的主题。 因此,如果它可以代替后端,那么它应该能够处理少量本地化字符串。

我们创建了一个新的电子表格,其中包含用于每个应用程序的本地化键和支持的语言的列。 由于命名约定的不同,每个平台的键可能会有所不同,这就是我们拥有更多键列(例如key_ioskey_android )的原因。 例如,基本表如下所示:

  + ==================================== + =========== == + ========== + 
| key_ios | key_android | zh | cs |
+ ==================================== + =========== == + ========== +
| basic.cancel | basic_cancel | 取消| Zrušit|
+ ------------------ + ------------------ + ----------- -+ ----------- +
| 欢迎注册| welcome_register | 新帐户| Novýúčet|
+ ------------------ + ------------------ + ----------- -+ ----------- +

如上所述,这种格式非常适合翻译人员使用-只是一张excel表,每个人都知道如何使用它。 这也是生成.strings文件的一种很好的格式,因为它是机器可读的表。 双赢。

好的,我们有一个包含所有字符串的电子表格,但是如何将其转换为Localizable.strings呢? 很久以前,我们使用node.js工具将电子表格本地化,但是正如您所看到的,它有点过时了,我们还必须安装node.js,这并没有使我们的iOS团队感到高兴。 因此,我们决定创建自己的用Swift编写的工具。 💪这被称为ACKLocalization,它的功能与上述节点工具相同。 它具有一些输入参数,例如电子表格标识符,输出路径等,并基于这些输入生成Localizable.strings 。 如果您想尝试一下,请参阅github页面上的使用指南。

我们的本地化工具链的最后一部分是SwiftGen。 它使用Localizable.strings并生成漂亮且防错的枚举。

所以代替

  titleLabel.text = NSLocalizedString(“ order_list.title”,注释:“”) 

我们用

  titleLabel.text = L10n.OrderList.title` 

我们的方法不一定对每个人都有益,但它是免费,容易和简单的,最后但并非最不重要的是,它是开源的! …当然除了Google Spreadsheets。 can您可以分叉和编辑ACKLocalization或创建自己的下载脚本,可以替换SwiftGen或根本不需要使用它。 无论如何,我们很乐意在Twitter上或ACKLocalization GitHub页面上听到您的任何反馈。

如果您想知道如何将ACKLocalization和SwiftGen很好地集成到Xcode项目中,请参阅我们全新的iOS-MVVM-ProjectTemplate,它已在以太坊基金会的资助下发布。

最初于 2018 年10月2日 发布在 www.ackee.cz