OHAutoNIBi18n 0.2.1

OHAutoNIBi18n 0.2.1

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2017年8月

Olivier Halligon维护。



  • 作者:
  • Olivier Halligon

这是什么

这个类允许您无需在应用程序中编写任何额外的代码即可自动国际化(i18n)您的界面(XIB文件)。不再需要为各种区域设置使用多个XIB,或只为翻译标签文本而创建 outlets!

只需在XIB中任何元素的文本中使用Localizable.strings的键(如UIButton的标题、UILabel的文本等),它将在运行时自动动态翻译!

  • 您不再需要按语言/地区维护一个XIB文件!
  • 您也不需要有一个 IBOutlet 来访问您的XIB对象,只是为了通过代码中的NSLocalizedString手动翻译它们的文本!

注意:以数字开头的字符串不会被翻译。这是一个避免在XIB中放置的静态数字(您可能稍后通过代码将此“0.00”字符串替换为某个真实值)进行无用翻译的功能。

安装

要使用它,只需将OHAutoNIBi18n.hOHAutoNIBi18n.m添加到您的项目中,这样就完成了!OHAutoNIBi18n将在运行时自动加载并动态翻译您的XIB,而无需任何额外的代码。

如果您还想使用_T()_Tf()_Tfn()宏,您还可以添加并引入#import "OHL10nMacros.h"

或者,您可以使用CocoaPods安装所有这些。只需在Podfile中添加pod "OHAutoNIBi18n"

调试未本地化的字符串

如果您想要OHAutoNIBi18n在它遇到不属于您的Localizable.strings文件中任何翻译的字符串时提醒您,可以定义OHAutoNIBi18n_DEBUG 1。在这种情况下,它将在控制台中记录一条消息,并在运行时围绕XIB中的文本添加一个$字符,这样您就可以轻松看到它。

注意,您可以在XIB中使用以"."开头的字符串(例如,“.Lorem ipsum dolor sit amet”),当OHAutoNIBi18n_DEBUG设置时,不会对此类字符串发出警告。这对于只用作“布局助手”的字符串很有用(例如,如果您使用的“占位符字符串”比空标签更容易帮助您在XIB中定位。),例如,对于您想要通过代码覆盖其文本的UILabel的定制UITableViewCell,即使您知道您最终会通过代码来覆盖它。

工作原理

这个类使用方法劫持机制来截获对awakeFromNib的调用,并能够自动本地化由运行时从XIB文件中创建/提取的对象。当您将应用程序加载到内存中时,方法劫持会自动进行,所以您甚至不需要添加代码来安装它:OHAutoNIBi18n.m文件在项目中的存在就使一切变得神奇!

与Xcode 4.5的"基本本地化"比较

从Xcode 4.5开始,您可以使用"基本本地化"(请参阅Apple教程:国际化您的应用)。

但是,这个过程要求您为每个XIB文件创建一个与XIB文件同名且扩展名为*.strings的文件,并且需要依赖于Interface Builder的"对象ID"(这些名称往往描述不清,也难以阅读)。

这可能会变得相当繁琐

  • 如果您有很多XIB文件,您将不得不创建大量*.strings文件,从而产生大量文件
  • 在基本本地化中,您的*.strings文件将使用抽象对象ID,这远远不利于识别XIB中的对象(更不说当您需要向翻译您应用的翻译人员提供这些Localizable.strings文件时,他们如何理解如何将这些ID与实际的UI相匹配?)
  • 这同样也是问题,因为您的应用中使用了多个XIB的共同术语,比如某些词汇或特定于您应用域的字符串,这些字符串在所有XIB文件中都使用。在这种情况下,基本本地化要求您在所有*.strings文件中都重复这个术语,而使用OHAutoNIBi18n,您只需在一次Localizable.strings中将其翻译即可。

出于所有这些原因,基本本地化最终并不是一个很好的解决方案,而OHAutoNIBi18n并没有这些怪癖。

在框架中使用

如果您有一个包含故事板和XIB的框架,需要使用OHAutoNIBi18n来自动本地化,您可以在您的框架中嵌入OHAutoNIBi18n,与您的故事板、XIB和Localizable.strings文件一起。

在这种情况下,由于使用框架您的本地化字符串不会位于应用程序的主捆绑包中,而是在框架捆绑包内的Localizable.strings文件中,因此您需要告诉OHAutoNIBi18n使用框架捆绑包,而不是主捆绑包。为此,您必须在框架的生命周期中尽早调用以下方法,尤其是在加载任何框架的故事板或XIB之前

// Objective-C
NSBundle* fmkBundle = [NSBundle bundleForClass:SomeClassOfYourFmk.class];
[OHAutoNIBi18n setLocalizationBundle:fmkBundle tableName:nil];
// Swift
let fmkBundle = Bundle(for:SomeClassOfYourFmk.self)
OHAutoNIBi18n.setLocalizationBundle(fmkBundle, tableName:nil)

使用SomeClassOfYourFmk作为您框架的一部分,以便轻松从它派生框架捆绑包。

您还可以在自动翻译XIB和Storyboards时设置一个不同的表来查找本地化,在此处指定一个特定的tableName。如果设置为nil,则将使用默认名称Localizable

许可证

本代码遵循MIT许可证发布。