繁体   English   中英

如何为本地化应用程序加载XIB?

[英]How are XIBs loaded for localized apps?

我发现在Simulator上成功运行和调试本地化应用程序几天后,它(或XCode部署过程)进入了一种状态,如果模拟器设置为我支持的本地语言之一,它将在启动时崩溃以下堆栈:

3   CoreFoundation                      0x01780e6a +[NSException raise:format:] + 58
4   UIKit                               0x008050fa -[UINib instantiateWithOwner:options:] + 2024
5   UIKit                               0x00806ab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168
6   UIKit                               0x0060c17a -[UIApplication _loadMainNibFile] + 172
7   UIKit                               0x0060ccf4 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 
8   UIKit                               0x00617617 -[UIApplication handleEvent:withNewEvent:] + 1533
9   UIKit                               0x0060fabf -[UIApplication sendEvent:] + 71
10  UIKit                               0x00614f2e _UIApplicationHandleEvent + 7576
11  GraphicsServices                    0x01e13992 PurpleEventCallback + 1550

发生崩溃是因为UIApplication无法加载MainWindow.nib文件:

因未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无法在bundle中加载NIB:'NSBundle /.app>(已加载)',名称为'MainWindow''

当您对应用进行本地化时,您有几个选择。 您可以执行以下一项(或两项):

  • 根据设备上的语言本地化每个加载的Xib文件。 因此,您的本地化UI完全由Interface Builder配置。
  • 您可以为每个语言目标设置Localizable.strings文件,并从代码中访问其中的字符串。

我之所以选择后者是因为我希望我所有的本地化字符串都在一个地方(所以它可以一次翻译)。 这意味着我的项目中的语言特定目录中没有任何xib文件(fr.lproj,zh-Hant.lproj等...)。 相反,我有en.lproj充满了我的所有xib文件(构建它们后的nib文件)和包含相应翻译的Localizable.strings文件的语言特定目录。

正如我所提到的,这已经好几天了。 今天(我不确定到底是什么点),模拟器上的应用程序在启动时开始崩溃。 在设备上安装应用程序工作正常,在英语模式下在模拟器上运行应用程序运行正常。

经过大量的填充,我意识到模拟器崩溃了,因为它正在语言特定目录中查找其nib文件(fr.lpro,sz-Hant.lproj,ja.lproj,具体取决于语言设置)。

因此,似乎模拟器处于一种状态,即在找不到语言特定目录中的nib后,它不会查看默认语言目录(en.lproj)。

我通过进入模拟器的应用程序目录(基于上面的异常消息)解决了这个问题:

/Users/.../Library/Application Support / iPhone模拟器/ 4.3 /应用程序//。应用程序

然后进入特定于语言的子目录,并将en.lproj中的所有nib文件复制到该目录中。

手动复制文件后,模拟器加载特定于语言的nib文件(实际上只是en.lproj目录中文件的副本),一切正常。

所以我的问题:

  • 这只是模拟器中的一个错误吗? 所以这是一个很大的NO
  • 有没有其他人有这个问题? 是的
  • 这是我不小心切换的一些模糊的XCode设置的结果吗? 不,看起来不像

更新

今天发现这个问题不仅限于模拟器,这种情况发生在设备上。 因此,上面描述的解决方法(将nib从默认语言目录复制到目标语言目录)显然无法在手机上运行。

我尝试了McCygnus的建议修复(删除我的xib的所有本地化,将它们移回根目录)并为我排序。 所以我猜本地化系统会检查当前的语言目录,然后检查根目录,它不会回退到您的默认语言。

我最近有这个问题,当时我有一个英文版的笔尖,但没有为任何其他语言本地化它(MyNib在en.lproj中)。 模拟器只在MyNib的另一个语言目录(da.lproj,de.lproj等)中查找,如果没有找到则不会回到英文版本。 我通过删除笔尖的英文本地化来修复它。 这导致它成为app bundle的根与其他资源而不是en.lproj。 之后一切都很完美。

我有点困惑,因为我认为本地化系统通过用户首选顺序检查所有语言,而英语通常被dev用作全部。 我不确定这是否是加载行为或模拟器错误的变化(我从未尝试过设备)。 我猜它是后者,但我不确定。 这提醒我,虽然我需要提交一份错误报告。

如果你正在使用

[[Class alloc] initWithNibName:@"aNibName" bundle:nil];  

改为

[[Class alloc] initWithNibName:@"aNibName" bundle:[NSBundle mainBundle]];

有相同的症状,但不同的根本原因我想分享。 我删除了McCygnus暗示的本地化(感谢你),但在iPad上仍然有相同的例外。 事实证明,我的Info.plist文件包含指向iPad特定主窗口nib文件(MainWindow-iPad.nib)的链接。 删除后,一切正常。

我只需重启xcode即可解决这个问题。 = /

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM