nkimraの日記

技術的なメモのブログ。

iOSアプリ上でローカライズを切り替える

環境

Mac OS X El Capitan
Xcode7.1
Swift2.1

通常はアプリのローカライズiOSで設定している言語が適用されるが、
アプリ上で設定できるようにしたサンプル。

f:id:nkimra:20151112000241p:plain

今回はセグメントコントローラで設定した言語のメッセージをラベルに表示するというiOSアプリ。

まずSingle View Applicationを作成する。
f:id:nkimra:20151112001105p:plain

Main.storyboardでラベルとセグメントコントローラを追加する。
f:id:nkimra:20151112001215p:plain

infoにあるLocalisationsにJapaneseを追加する。
f:id:nkimra:20151112001443p:plain

新規作成でString Filesを選択し、Localisable.stringsというファイル名で作成する。
f:id:nkimra:20151112001636p:plain

f:id:nkimra:20151112001645p:plain

ファイルを選択し、右側の「Localization」でBase、Japaneseにチェックをつける。
f:id:nkimra:20151112001819p:plain

ここまで設定できたら実際にコーディング。
まずStringを拡張してlocalisedメソッドを作成する。
このやり方はStackoverflowを参考にした。

extension String {
    func localized(lang: String) -> String {
        let path   = NSBundle.mainBundle().pathForResource(lang, ofType: "lproj")
        let bundle = NSBundle(path: path!)
        return NSLocalizedString(self, tableName: nil, bundle: bundle!, value: "", comment: "")
    }
}

最後にViewControllerの実装。
基本的にはセグメントコントローラのアクションで言語を切り替えて、ラベルのテキストに反映するだけ。

class ViewController: UIViewController {
    
    var lang: String = "Base";

    @IBOutlet weak var lbl: UILabel!
    
    @IBAction func switchSegment(sender: AnyObject) {
        if sender.selectedSegmentIndex == 0 {
            lang = "Base"
        } else {
            lang = "ja"
        }
        lbl.text = "LblText".localized(lang)
    }
    
    override func viewDidLoad() {        
        super.viewDidLoad()
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

今回はラベルだけ変更しているので問題ないが、ボタンの名前とかは正しく反映されないかもしれない(未検証)