增加本地化资源的很多工作其实是由NSBundle完成的。以UIViewController为例,初始化某个UIViewController对象时需要传入两个实参:第一个实参是XIB文件的文件名,第二个实参是指向某个NSBundle对象的指针。通常会将nil作为第二个实参传入,UIViewController会将这个nil解释为应用的主程序包(main bundle)。主程序包其实就是应用程序包,包含应用的所有资源和可执行文件。Xcode在构建应用时,会将所有的lproj目录复制到主程序包。
视图控制对象在载入视图时,会通过之前指定的NSBundle对象查找相应的XIB文件。NSBundle对象会根据设备当前的语言设置在相应的lproj目录中查找指定的文件,并将找到的路径返回给视图控制对象,以供其载入。
通过NSBundle的实例方法pathForResource:ofType:可以在所有的lproj目录中查找指定类型的资源文件。如果需要得到应用程序包中的某个资源文件的路径,就可以向主程序包发送这个消息。以下代码演示了如何得到资源文件myImage.png的路径:
NSString *path = [[NSBundle mainBundle] pathForResource:@“myImage”
ofType:@“png”];
NSBundle对象会先检查程序包的根目录,查找是否有myImage.png文件。如果有,就返回该文件的全路径。如果没有,NSBundle对象就会根据设备的当前语言设置在相应的lproj目录下继续查找。如果还是没有找到,就返回nil。
这也是为什么在本地化某个文件后,必须删除已经安装的应用并清理项目。Xcode不会在重新安装应用时删除任何文件,因此,即使某个文件已经本地化了,只要是覆盖安装的程序包,其根目录仍然会保留之前尚未本地化的版本。在这种情况下,即使程序包里有新的lproj目录,NSBundle对象还是会先找到根目录下的文件并返回该文件的路径。