6

NSBundle に配置されている Localizable.strings を実行時に変更できると仮定しましょう。現時点では、その内容を変更しても、NSLocalizedStringは古い (キャッシュされた) 値を返します。

  1. アプリケーションの実行
  2. 特定の key1 <- value1 の LocalizableString を取得します
  3. Localizable.strings key1 = value2 を変更します
  4. <-- ローカリゼーション キャッシュを無効にするために、アプリケーションで何らかの処理を行う -->
  5. 特定の key1 == value2 の LocalizableString かどうかを確認します

私がすでに試したこと:

  • [[NSBundble mainBundle] invalidateResourceCache]
  • [UIApplication_performMemoryWarning]
  • 辞書がないか調べてみました。NSBundle の ivar で、キャッシングに使用されます。
  • 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 に答える