ここでは、他のアプローチ、特に通知ベースのアプローチについていくつかの議論があります。
iOS:アプリを再起動せずにプログラムでアプリの言語を変更する方法は?
私の見解では、実際には 3 つのタスクがあります。(1) nib から自動的にロードされたリソースの再ローカライズ。(たとえば、ペン先から別のカスタム UIView を動的にインスタンス化する場合、「古い」言語文字列と設定 (画像、テキスト方向) は引き続き読み込まれます) (2) 現在画面に表示されている文字列の再ローカリゼーション。(3) 開発者 (あなた) がプログラム コードに挿入した文字列の再ローカリゼーション。
(3)から始めましょう。定義を探すと、NSLocalizedString がマクロであることがわかります。したがって、既存のコードをあまり変更したくない場合は、新しいヘッダー ファイルを作成することで (3) の問題を解決できる可能性があります。そのヘッダー ファイルで、適切な場所からローカライズされた文字列を#undef
再度#define NSLocalizedString
選択します。iOS のデフォルトではなく、何らかのグローバル変数 (アプリ デリゲート ivar など) で追跡している場所です。NSLocalizedString を再定義したくないが独自の代替を作成している#undef NSLocalizedString
場合、将来の開発者が置き換えたマクロの代わりに誤ってそれを呼び出してほしくない場合は、おそらくそうする必要があります。理想的なソリューションではありませんが、おそらく最も実用的なソリューションです。
(1)については、Interface Builder でローカライズを行っておらず、viewDidLoad などで動的にローカライズする場合は問題ありません。説明したのと同じ動作 (つまり、変更された NSLocalizedString など) を使用できます。それ以外の場合は、(a) 上記のリンクで説明されているように通知システムを実装する (複雑)、または (b) ローカライズを IB から viewDidLoad に移行することを検討する、または (c)initWithNibName:
古い言語リソースでロードされたオブジェクトをオーバーライドして交換することを試みることができます。 、新しい言語リソースがロードされたもの。これは、このディスカッションの一番下で Mohamed が言及したアプローチでした: http://learning-ios.blogspot.ca/2011/04/advance-localization-in-ios-apps.html. 彼はそれが問題を引き起こすと主張しています (viewDidLoad は呼び出されません)。うまくいかなくても、試してみると何かうまくいくことがわかるかもしれません。
最後に、(2) はおそらく最も簡単なタスクです。現在のビューを削除して再追加するだけです (場合によっては、再描画するだけです)。