加载本地化 pathForResource 在 iOS 模拟器上工作,但在设备上失败
Posted
技术标签:
【中文标题】加载本地化 pathForResource 在 iOS 模拟器上工作,但在设备上失败【英文标题】:Loading a localized pathForResource works on iOS simulator, but fails on device 【发布时间】:2015-12-14 15:07:23 【问题描述】:我正在尝试从 ios 9 中的 mainBundle
加载本地化 html 文件。本地化文件都名为“help.html”,位于“de.lproj”和“en.lproj”目录中,分别。
如果我在模拟器 (iOS 9.2) 上运行此代码 sn-p,它会返回正确的 indexPath
,但是当我在设备 (iOS 9.2) 上运行它时,它会返回 nil。
NSArray* availableLocalizations = [[NSBundle mainBundle] localizations];
NSArray* userPreferred = [NSBundle preferredLocalizationsFromArray:availableLocalizations forPreferences:[NSLocale preferredLanguages]];
NSString *indexPath = [[NSBundle mainBundle] pathForResource:@"help" ofType:@"html" inDirectory:nil forLocalization:[userPreferred objectAtIndex:0]];
我已经检查并确认这些文件存在于部署到设备的 app bundle 中,并且文件名(包括大写/小写)是正确的。
【问题讨论】:
【参考方案1】:NSBundle preferredLocalizationsFromArray
的行为似乎从 iOS 8.4 更改为 9.0。
示例:我选择“Austria”作为地区,选择“German”作为语言。
iOS 8.4 仅返回一个首选本地化“de”。 iOS 9.0 返回两个 - “de_AT”和“de”。对于“de_AT”,NSBundle pathForResource
找不到“de”本地化,返回 nil。
修复了这个(理想情况下是不必要的)解决方法:
NSArray* availableLocalizations = [[NSBundle mainBundle] localizations];
NSArray* userPreferred = [NSBundle preferredLocalizationsFromArray:availableLocalizations forPreferences:[NSLocale preferredLanguages]];
NSString *indexPath;
for (NSString *locale in userPreferred)
indexPath = [[NSBundle mainBundle] pathForResource:@"hilfe" ofType:@"html" inDirectory:nil forLocalization:locale];
if (indexPath) break;
【讨论】:
以上是关于加载本地化 pathForResource 在 iOS 模拟器上工作,但在设备上失败的主要内容,如果未能解决你的问题,请参考以下文章
NSBundle pathForResource 不适用于子目录本地化?
调用 [NSBundle pathForResource] 时得到 nil(本地化问题)
如何在本地从 Xcode 导航器加载 XML 文件 - iOS
-[NSBundle pathForResource:ofType:inDirectory:] 为本地化资源返回 nil