Localizable.strings 在 iOS 框架中不起作用

Posted

技术标签:

【中文标题】Localizable.strings 在 iOS 框架中不起作用【英文标题】:Localizable.strings won't work in iOS framework 【发布时间】:2015-10-09 18:48:58 【问题描述】:

我有一个包含本地化包的框架。

构建包之前的本地化屏幕截图:

这是我在框架中用来获取包和字符串的代码:

+ (NSBundle*) bundleWithName:(NSString*)name 
NSString *mainBundlePath = [[NSBundle mainBundle] resourcePath];
NSString *frameworkBundlePath = [mainBundlePath stringByAppendingPathComponent:name];
if ([[NSFileManager defaultManager] fileExistsAtPath:frameworkBundlePath])
    return [NSBundle bundleWithPath:frameworkBundlePath];

return nil;



+(NSString *)localizedStringFromBundleWithKey:(NSString *)keyString

return NSLocalizedStringFromTableInBundle(keyString, nil, [Common bundleWithName:@"MyCool.bundle"], nil);

然后访问我的本地化字符串:

[infoView setFirstButtonTitle:[Common localizedStringFromBundleWithKey:@"dialog_button_preferences"]];

当我将框架拖放到测试项目中时,它看起来像这样:

如果我将我的设备更改为西班牙语或任何其他语言,测试项目中的字符串都会以英语显示。

然后进一步解决问题 - 如果我将 Localizable.strings 添加到测试项目(除了框架包中的那些),则所有本地化都不起作用,而是显示“关键”名称。

本地化 ios 框架的正确方法是什么?

【问题讨论】:

你为什么不在你的一门课上使用+ (NSBundle *)bundleForClass:(Class)aClass 不知道@Wain 是推荐的方法吗? 我也遇到过同样的问题。发现this SO 的答案表明NSBundle 中存在错误。 【参考方案1】:

一个应用程序可以由多个包组成,因此并非所有资源都是主包的一部分。将+ (NSBundle *)bundleForClass:(Class)aClass 与您的一个类一起使用,为您的资源获取正确的捆绑包。

【讨论】:

我忘了提到我的代码已经成功地找到/抓取了包。我已经验证过了。只是不会加载正确的本地化字符串 捆绑包,还是捆绑包?资源路径是否正确并且实际上指向了正确的文件? 所以 bundleForClass 不起作用,因为调用它的框架代码在框架中,但 bundle 不是。我现在已正确加载捆绑包(已确认)-尽管在系统上选择了另一种语言,但仅加载英语的问题仍然存在

以上是关于Localizable.strings 在 iOS 框架中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 将 NSDictionary 写入 Localizable.strings

一个 iOS 应用程序中的多个 Localizable.strings 文件

Xcode5 和 iOS7:Localizable.strings 中字符串中的尾随空格不再起作用

Localizable.strings 文件在 Copy Bundle Resources Xcode 5.1 中以红色显示

iOS- 国际化(多语言设置)

如何使用存储在 CocoaTouch 框架中的 Localizable.strings?