6

假设我们可以在运行时更改 Localizable.strings,即放置在 NSBundle 中。当前,即使我们更改它的内容,NSLocalizedString也会返回旧的(缓存的)值。

  1. 运行应用程序
  2. 获取特定 key1 <- value1 的 LocalizableString
  3. 更改 Localizable.strings key1 = value2
  4. <-- 在应用程序中做一些事情来使本地化缓存失效-->
  5. 检查特定 key1 == value2 的 LocalizableString

我已经尝试过的:

  • [[NSBundble mainBundle] 无效资源缓存]
  • [UIApplication_performMemoryWarning]
  • 试着看看,如果有一些字典。用于缓存,在 NSBundle 的 ivars 中。
  • 试图看到,在 NSBundle 的 GNUStep 实现中,但它与我们在 ios 6.0 中的不同

我不能做什么(根据定义): - 我不能调配 [NSBundle localizableStringForKey:value:table] - 我不能更改宏 - 一般来说,我不能影响任何原始项目代码,只能在步骤 #4 添加一些东西

这仅用于开发目的。所以,我不需要在 AppStore 或其他地方发布它,所以任何私有方法或解决方案都可以。

所以,问题是。可能有人知道如何做到这一点,或者有人给我另一个想法如何做到这一点?谢谢你。

4

2 回答 2

2

注意:此解决方案使用私有 API,如果您使用此代码,您向 App Store 提交的应用程序将被拒绝。

所以,经过一番搜索,我找到了对我有帮助的链接

如何删除 NSBundle 缓存

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

刷新包缓存后,使用新的本地化键。所以现在我不需要在模拟器中重新启动我的应用程序来查看可本地化字符串的变化。

于 2013-03-11T07:50:36.270 回答
1

您可以使用uncache解决方案。

Localizable.nocache.strings在您的lproj文件夹中使用。

例如example.bundle/Resources/de.lproj/Localizable.nocache.strings

url通过 FileManager获取后加载本地化字符串。

func localizedString(key: String) -> String {
   let bundle = Bundle(url: bundleUrl)
   return bundle.localizedString(forKey: key, value: nil, table: "Localizable.nocache")
}
于 2020-07-19T08:53:30.187 回答