假设我们可以在运行时更改Localizable.strings,它位于NSBundle中 目前,即使我们更改了内容, NSLocalizedString 也会返回旧的(缓存)值。
我已经尝试过:
我不能做什么(根据定义): - 我无法调动[NSBundle localizableStringForKey:value:table] - 我不能改变宏 - 一般情况下,我不能影响任何原始项目代码,只能在第4步添加一些东西
这仅用于开发目的。所以,我不需要在AppStore中发布它,所以任何私有方法或解决方案都可以。
所以,问题是。可能有人知道这样做的方法,还是有人给我另一个想法怎么做呢?谢谢。
答案 0 :(得分:2)
注意:此解决方案使用私有API,如果您使用此代码,则会拒绝向App Store提交您的应用。
所以,经过一些搜索,我找到了帮助我的链接
// First, we declare the function. Making it weak-linked
// ensures the preference pane won't crash if the function
// is removed from in a future version of Mac OS X.
extern void _CFBundleFlushBundleCaches(CFBundleRef bundle)
__attribute__((weak_import));
BOOL FlushBundleCache(NSBundle *prefBundle) {
// Before calling the function, we need to check if it exists
// since it was weak-linked.
if (_CFBundleFlushBundleCaches != NULL) {
NSLog(@"Flushing bundle cache with _CFBundleFlushBundleCaches");
CFBundleRef cfBundle =
CFBundleCreate(nil, (CFURLRef)[prefBundle bundleURL]);
_CFBundleFlushBundleCaches(cfBundle);
CFRelease(cfBundle);
return YES; // Success
}
return NO; // Not available
}
刷新捆绑缓存后,将使用新的本地化密钥。 所以现在我不需要在模拟器中重启我的应用程序,以便查看可本地化字符串的变化。
答案 1 :(得分:0)
您可以使用 uncache 解决方案。
在Localizable.nocache.strings
文件夹中使用lproj
。
例如example.bundle/Resources/de.lproj/Localizable.nocache.strings
通过FileManager获取url
后,加载本地化的字符串。
func localizedString(key: String) -> String {
let bundle = Bundle(url: bundleUrl)
return bundle.localizedString(forKey: key, value: nil, table: "Localizable.nocache")
}