加载本地化的pathForResource适用于iOS模拟器,但在设备上失败

时间:2015-12-14 15:07:23

标签: ios localization ios-simulator nsbundle

我正在尝试从iOS 9中的mainBundle加载本地化的HTML文件。本地化文件都命名为" help.html",位于" de .LPROJ"和" en.lproj"目录,分别。

如果我在模拟器(iOS 9.2)上运行此代码段,它将返回正确的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]];

我已经检查并确认文件存在于部署到设备的应用包中,并且文件名(包括大写/小写)是正确的。

1 个答案:

答案 0 :(得分:0)

似乎NSBundle preferredLocalizationsFromArray的行为已从iOS 8.4更改为9.0。

示例:我选择了"奥地利"作为地区,"德国"作为语言。

  • iOS 8.4只返回一个首选的本地化" de"。
  • iOS 9.0返回两个 - " de_AT"和" de"。

对于" de_AT",NSBundle pathForResource找不到" de"本地化,并返回零。

修复此问题(理想情况下不必要)解决方法:

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;
}