iOS - 在项目中本地化字符串

1,138 阅读3分钟

本地化是一个经常被忽视的问题。我们开始一个项目,我们知道我们只需要支持一种语言,我们根据这个要求处理我们的字符串。当需要支持第二语言时,该项目发展得如此之快,以至于适应第二语言会导致痛苦和沮丧。

从一开始就这么做

iOS 和 Xcode 以一种基本但实用的方式支持本地化字符串:我们可以定义一个Localizable.strings文件,并以n种语言本地化该文件。对于每种语言,我们都有一个包含所有字符串的键值文件:

// German strings

"ok_button_title" = "OK";
"cancel_button_title" = "Abbrechen";

/*Main Screen*/
"main_title" = "Willkommen";
// Spanish strings

"ok_button_title" = "Vale";
"cancel_button_title" = "Cancelar";

/*Main Screen*/
"main_title" = "Bienvenido";

为了访问这些字符串,我们需要做的就是使用NSLocalizedString(key, comment: "")并传递我们感兴趣的密钥。例如。NSLocalizedString("ok_button_title", comment: "")

这会很好地工作,如果我们要以德语或西班牙语启动应用程序,系统将知道要使用哪些字符串。

让他们处于控制之中

这种方法的主要缺点是键是字符串,如果它们开始移动,可能容易出错。

这也很容易解决。让我们定义一个名为的新类型Strings,它将包含我们所有的键:

enum Strings: String {
	case okButtonTitle = "ok_button_title"
	case cancelButtonTitle = "cancel_button_title"
	case mainTitle = "main_title"
	case mainSubtitle = "main_subtitle"
}

我们甚至可以定义一个扩展来获取Strings枚举中每个键的本地化字符串:

extension Strings {
    var localized: String {
        return NSLocalizedString(rawValue, comment: "")
    }
}

现在我们需要做的就是在 a 中使用字符串UILabel,例如,调用:

label.text = Strings.mainTitle.localized

提取字符串

使字符串和措辞保持最新通常是开发人员的负担。设计师会制作一个模型,然后产品经理需要检查/更新一些措辞。开发人员的任务通常是确保这些措辞保持同步。如果一个项目在多个平台(iOS、Android、Web...)上运行,保持措辞最新和同步很容易失控。

更明智的方法是将这些字符串移出项目并将它们放在每个平台都可以访问的集中式工具中。您可以构建这样的服务,也可以使用商业解决方案。为了本教程,我将使用POEditor:一个在线工具,它允许您定义术语及其翻译,并提供一个 API 来访问该信息。

设置项目 

这一步非常简单:我们创建一个项目,我们添加新条目(在 POEditor 中称为术语)并提供翻译。这就是全部。

PO编辑器 PO编辑器

自动获取字符串

基本思想是,在每次构建时,我们都希望获取最新的字符串,Strings自动生成我们的枚举(列出所有可用的键),并下载不同支持语言的翻译。

为此,我正在使用 Python,并以自己的方式深入其中(请不要评判我的 Python 知识:我什么都不知道)。

400:请求无效

该脚本主要做两件事:首先,它获取项目中列出的所有术语。有了它,我们创建了我们的Strings类(我们还处理从蛇形到骆驼形的大小写转换)。

第二步是下载包含翻译的文件。

此脚本在构建阶段运行:

构建阶段 构建阶段

结论 

这可以很容易地改进,但是通过一些巧妙的技巧,我们能够创建一个设置,让开发人员不再真正需要担心字符串。PM 或营销人员可以使用该工具并更新这些字符串,应用程序将在下一次构建期间接收更改。

该工具还支持导出文件的其他格式(JSON、Android XML 等),因此该脚本可以轻松适应您的项目/平台要求。

谢谢阅读!✌️