为iOS应用程序带来动态本地化– Vincent Pradeilles –中

可以在我的 GitHub上找到 一个演示本文内容的演示项目

对于用户而言,能够与使用他能理解的语言本地化的应用进行交互具有极其重要的意义。 毫无疑问,iOS在为开发人员提供很少的成本方面提供了出色的性能。

不幸的是,它仅以静态方式提供,这意味着该应用是使用设备的语言环境进行本地化的,但是一旦用户进入应用内部,SDK便无法为我们提供动态更新本地化的方法。

这样的功能仍然可以带来巨大的商业价值。 例如,让我们以一个推销员为例,该推销员使用iOS应用程序在展览会上向潜在客户展示其产品。 并非他遇到的所有人都会说相同的语言,因此能够即时切换其应用的本地化将是一个很好的帮助。

在本文中,我将向您展示如何利用Objective-C运行时的特性来实现此目标,而无需创建新的本地化API。

iOS如何处理本地化?

在iOS应用中, Localizable.strings文件被视为资源,因此使用Bundle类进行存储和访问。 为了更好地了解手头的结构,我们可以检查应用程序的内容:

我们看到,对于每个本地化,都有一个对应的.lproj目录,其中包含本地化的资源。

因此,我们实现动态本地化的策略将是找到一种方法来使应用程序在这些目录之间动态交换。

进入Objective-C运行时

从iOS 11开始,所有应用程序都使用Objective-C运行时运行,Objective-C运行时是一个托管Objective-C兼容类并允许它们按预期进行交互的环境。 对我们来说幸运的是,此运行时公开了一个API,该API允许我们的应用程序与其配合使用。 尽管需要谨慎使用,但它绝对拥有强大的力量。

让我们考虑一下这个函数:

结论

在本文中,我专注于可本地化的字符串,因为它是迄今为止在给定应用程序中最常见的一种本地化资源。 但是,我所描述的解决方案当然可以应用于任何本地化的资源,例如音频文件,视频等。