有没有办法在不重新启动应用程序的情况下使 NSBundle 本地化缓存失效? [iOS]

     2023-02-25     295

关键词:

【中文标题】有没有办法在不重新启动应用程序的情况下使 NSBundle 本地化缓存失效? [iOS]【英文标题】:Is there a way to invalidate NSBundle localization cache, withour restarting application? [iOS] 【发布时间】:2012-11-11 14:48:19 【问题描述】:

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

    运行应用程序 获取特定 key1 的 LocalizableString 更改 Localizable.strings key1 = value2 检查特定 key1 的 LocalizableString 是否 == value2

我已经尝试过的:

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

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

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

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

【问题讨论】:

"假设我们可以在运行时 Localizable.strings 中进行更改" - 你不能。 好吧,我可以在模拟器上运行应用程序时做到这一点。 在模拟器上,应用程序在您的用户帐户的权限下运行,它们不限于在沙箱中运行。在设备上,您无法修改位于 app bundle 中的文件。 【参考方案1】:

您可以使用 uncache 解决方案。

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

例如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")

【讨论】:

【参考方案2】:

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

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

How to remove NSBundle cache

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

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

【讨论】:

由于这是私有 API 使用,您将无法使用此解决方法提交应用程序。我刚刚尝试过,但失败了。 正如问题本身所提到的:这仅用于开发目的。所以,我不需要在 AppStore 什么的发布它,所以任何私有的方法,或解决方案都可以。

有没有办法在不使用“显示:块”参数的情况下使表格主体可滚动?

】有没有办法在不使用“显示:块”参数的情况下使表格主体可滚动?【英文标题】:Isthereanywaytomaketable\'sbodyscrollablewithoutusing"display:block"parameter?【发布时间】:2020-06-1702:07:26【问题描述】:我在显示可滚动表格时遇到... 查看详情

有没有办法在不使用子项的情况下使 Firebase 搜索查询不区分大小写? [复制]

】有没有办法在不使用子项的情况下使Firebase搜索查询不区分大小写?[复制]【英文标题】:IsthereawaytomakeaFirebasesearchquerycaseinsensitivewithoutusingchild?[duplicate]【发布时间】:2021-12-1406:45:42【问题描述】:这是我在Dart中的Firestore查询... 查看详情

有没有办法在不重新启动 Xcode 6 的情况下打开 Swift Playground?

】有没有办法在不重新启动Xcode6的情况下打开SwiftPlayground?【英文标题】:IsthereawaytoopenSwiftPlaygroundwithoutrestartingXcode6?【发布时间】:2014-06-2302:22:57【问题描述】:有没有办法在不关闭Xcode并重新启动的情况下打开SwiftPlayground?... 查看详情

是否可以在不重新编译的情况下使科尔多瓦应用程序可调试?

】是否可以在不重新编译的情况下使科尔多瓦应用程序可调试?【英文标题】:Isitpossibletomakeacordovaappdebuggablewithoutrecompiling?【发布时间】:2021-11-1120:38:16【问题描述】:我有一个旧版本应用程序的.apk文件,但无法使用cordova从源... 查看详情

有没有办法在不重新启动 Solr 服务器的情况下动态更新同义词文件?

】有没有办法在不重新启动Solr服务器的情况下动态更新同义词文件?【英文标题】:IsthereawaytodynamicallyupdateasynonymfilewithoutrestartingSolrserver?【发布时间】:2012-07-1808:00:57【问题描述】:我们知道conf目录中有一个synonym.txt文件,每... 查看详情

有没有办法在不重新启动终端的情况下通过 bash_profile “资源”? [复制]

】有没有办法在不重新启动终端的情况下通过bash_profile“资源”?[复制]【英文标题】:Isthereawayto"resource"bybash_profilewithoutrestartingterminal?[duplicate]【发布时间】:2016-11-1220:37:35【问题描述】:我经常不得不对我的~/.bash_profi... 查看详情

如何在不先启动 IE 的情况下使我的 WinCE 应用程序中的网络工作?

】如何在不先启动IE的情况下使我的WinCE应用程序中的网络工作?【英文标题】:HowcanImakenetworkingworkinmyWinCEappwithoutlaunchingIEfirst?【发布时间】:2009-03-0614:54:12【问题描述】:我有一个简单的WinCE网络应用程序(在C、Win32API中)。... 查看详情

有没有办法在不创建新套接字的情况下处理 CRL 更新

】有没有办法在不创建新套接字的情况下处理CRL更新【英文标题】:IsthereawaytoprocessCRLupdateswithoutcreatinganewsocket【发布时间】:2021-08-1818:44:57【问题描述】:我正在尝试创建一个包含CRL的套接字服务器,客户端维护套接字连接,... 查看详情

在不混合的情况下使不透明的 UIView 变暗

...tblending【发布时间】:2014-10-1317:14:52【问题描述】:我的应用程序的背景是不透明的UIImageView。在某些情况下,我想以动画方式将其从全亮度调暗到大约50%。目前我降低了视图的alpha属性,这很好用。因为视图后面没有任何东西... 查看详情

如何在不打开应用程序的情况下使 ContentObserver 工作?

】如何在不打开应用程序的情况下使ContentObserver工作?【英文标题】:HowtomakeContentObserverworkwithouthavingapplicationopened?【发布时间】:2013-10-1511:39:54【问题描述】:我需要让我的应用程序监听Android中地址簿的变化。我读过它可以使... 查看详情

WPF:有没有办法在不重新定义整个样式的情况下覆盖 ControlTemplate 的一部分?

】WPF:有没有办法在不重新定义整个样式的情况下覆盖ControlTemplate的一部分?【英文标题】:WPF:IsthereawaytooverridepartofaControlTemplatewithoutredefiningthewholestyle?【发布时间】:2017-05-2500:24:57【问题描述】:我正在尝试设置WPFxctk:ColorPicke... 查看详情

有没有办法在不删除视图并重新添加的情况下更新 StackView 中的视图?

】有没有办法在不删除视图并重新添加的情况下更新StackView中的视图?【英文标题】:IsthereawaytoupdateviewsinStackViewwithoutremovingtheviewandreaddingit?【发布时间】:2021-02-1909:52:10【问题描述】:我有使用自动布局的视图。我知道我希望... 查看详情

在不修改快捷方式的情况下使批处理文件隐藏/最小化

...描述】:我正在VB.net中编写一个创建和调用批处理文件的应用程序。我希望这些批处理文件隐藏运行,但由于文件没有快捷方式,我需要在批处理代码本身中设置它。我该怎么做?【问题讨论】:见this。【参 查看详情

有没有办法在不关闭当前会话的情况下“刷新”终端/iTerm?

】有没有办法在不关闭当前会话的情况下“刷新”终端/iTerm?【英文标题】:Isthereawayto"refresh"theterminal/iTermwithoutclosingthecurrentsessions?【发布时间】:2018-06-1501:14:10【问题描述】:我刚刚在我的iTerm2中更新了我的xcode命令行... 查看详情

有没有办法在没有应用程序回收的情况下在 IIS 上发布网站?

】有没有办法在没有应用程序回收的情况下在IIS上发布网站?【英文标题】:IsthereawaytopublishwebsiteonIISwithoutapplicationrecycle?【发布时间】:2015-04-2407:09:16【问题描述】:我们需要进行快速更改以解决我们网站上的问题。但是,当... 查看详情

如何在不重新加载页面的情况下重新启动 Angular 应用程序?

】如何在不重新加载页面的情况下重新启动Angular应用程序?【英文标题】:Howtorestartangularappwithoutpagereload?【发布时间】:2014-07-2108:15:02【问题描述】:我想在不强制刷新页面的情况下重置我的Angular应用程序的状态。这样做的惯... 查看详情

在不停止应用程序的情况下重新启动流式查询

】在不停止应用程序的情况下重新启动流式查询【英文标题】:Restartstreamingquerywithoutstoppingapplication【发布时间】:2017-08-1015:30:04【问题描述】:我尝试使用下面的代码代替query.awaitTermination()在spark中重新启动流式查询,下面的... 查看详情

重新启动应用程序而不重新启动服务器?

】重新启动应用程序而不重新启动服务器?【英文标题】:restartapplicationwithoutrestartingserver?【发布时间】:2011-03-0808:11:55【问题描述】:有没有办法在不重新启动整个服务器的情况下重新启动ColdFusion应用程序?有两个ColdFusion应... 查看详情