这个类允许您无需在应用程序中编写任何额外的代码即可自动国际化(i18n)您的界面(XIB文件)。不再需要为各种区域设置使用多个XIB,或只为翻译标签文本而创建 outlets!
只需在XIB中任何元素的文本中使用Localizable.strings的键(如UIButton
的标题、UILabel
的文本等),它将在运行时自动动态翻译!
IBOutlet
来访问您的XIB对象,只是为了通过代码中的NSLocalizedString
手动翻译它们的文本!注意:以数字开头的字符串不会被翻译。这是一个避免在XIB中放置的静态数字(您可能稍后通过代码将此“0.00”字符串替换为某个真实值)进行无用翻译的功能。
要使用它,只需将OHAutoNIBi18n.h
和OHAutoNIBi18n.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开始,您可以使用"基本本地化"(请参阅Apple教程:国际化您的应用)。
但是,这个过程要求您为每个XIB文件创建一个与XIB文件同名且扩展名为*.strings的文件,并且需要依赖于Interface Builder的"对象ID"(这些名称往往描述不清,也难以阅读)。
这可能会变得相当繁琐
出于所有这些原因,基本本地化最终并不是一个很好的解决方案,而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许可证发布。