加载本地化 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(本地化问题)

iOS WebView 加载本地资源(图片,文件等)

ios如何加载本地文件

如何在本地从 Xcode 导航器加载 XML 文件 - iOS

-[NSBundle pathForResource:ofType:inDirectory:] 为本地化资源返回 nil