私はこれを数回行いました。iOSはこのために設計されていないため、最初に行うべきことは、アプローチを再検討するか、クライアントに戻って、それが必要であることを絶対に確認することです。このアプローチが正しい状況はごくわずかであり、ほとんどが間違いです。
最初の問題は、文字列リソースのローカライズです。 NSBundle
ローカライズされた文字列をロードするメソッドを提供します。現在選択している言語を管理するためのシングルトンクラスを用意します。en.lproj
言語を変更すると、ディレクトリ(または選択した言語)をバンドルとしてロードできます。その時点から、通常のマクロを使用してローカライズされた文字列リソースを取得する代わりに、シングルトンのメソッドを使用して現在のバンドルからそれらをフェッチします。
同じことが画像やその他のリソースにも当てはまります。シングルトンはどのローカリゼーションバンドルが機能しているかを知っているので、必要なリソースを求めてください。
言語を変更するときは、シングルトンに伝えてください。シングルトンは関連するバンドルをロードして通知を投稿できるため、ViewControllerは自分自身を更新することができます。
運が良ければ、ペン先のレイアウトは言語に依存せずに変更なしで機能します。これは、ローカライズされたインターフェイス要素のアウトレットコレクションを持つ他のユーザーが継承するベースビューコントローラを設定できることを意味します。通知をリッスンし、コレクションをウォークして必要なアイテムを更新する必要があります。
運が悪く、ローカリゼーションごとに異なるレイアウトが必要な場合は、状態を保存し、シングルトンから関連するペン先を取得してから、すべてをリロードして状態を復元する必要があります。
また、完全に修正できない問題もあります。iOSは、それがメインシステム言語であると見なします。制御できないiOS提供のコンテンツがある場合、それはメインシステム言語にローカライズされます。アプリケーションが完全に初期化される前に(つまり、で) AppleLanguages
、ロケールを含む文字列を含む配列にユーザー設定を設定することで、これを少し軽減できます。ただし、これはアプリケーションの起動時にのみ言語を変更できます。main.c