iOS應(yīng)用內(nèi)切換本地化語(yǔ)言
最近遇到個(gè)需要在應(yīng)用內(nèi)部設(shè)置語(yǔ)言的需求,默認(rèn)使用系統(tǒng)設(shè)置的語(yǔ)言,如果用戶在App內(nèi)設(shè)置了別的語(yǔ)言,以后則按照新設(shè)置的語(yǔ)言顯示界面。
于是,寫(xiě)了個(gè)新輪子SOLocalization,希望大家喜歡,其實(shí)代碼很簡(jiǎn)單,有興趣的可以直接去讀源代碼,有補(bǔ)充的可以直接向我提交 pull request。
1.創(chuàng)建本地化文件。
創(chuàng)建本地化字符串文件,文件名可以是默認(rèn)的 infoPlist.strings,也可以是別的,為這個(gè)文件設(shè)置好要支持的語(yǔ)言及內(nèi)容。
2.導(dǎo)入 SOLocalization。
3.配置 SOLocalization。
設(shè)置支持的語(yǔ)言及默認(rèn)語(yǔ)言,當(dāng)系統(tǒng)設(shè)置的語(yǔ)言不屬于支持的語(yǔ)言時(shí)會(huì)使用默認(rèn)語(yǔ)言。
- [SOLocalization configSupportRegions:@[SOLocalizationEnglish, SOLocalizationSimplifiedChinese] fallbackRegion:SOLocalizationEnglish];
4.設(shè)置 UIKit 對(duì)象。
為 UIKit 對(duì)象設(shè)置合適的屬性,像下面這樣簡(jiǎn)單,而且這樣設(shè)置后,當(dāng)語(yǔ)言切換時(shí),這些 UIKit 對(duì)象的文本內(nèi)容會(huì)自動(dòng)變?yōu)樾略O(shè)置的語(yǔ)言,不需要任何額外處理。
- UIBarButtonItem *change = [[UIBarButtonItem alloc]initWithTitle:@"" style:UIBarButtonItemStylePlain target:self action:@selector(changeLanguage:)];
- // 這里的 @"Setting" 就是 strings 文件中對(duì)應(yīng)的那個(gè) key,下同
- change.sol_title = @"Setting";
- self.navigationItem.rightBarButtonItem = change;
- self.label.sol_text = @"label";
- [self.button sol_setTitle:@"button" forState:UIControlStateNormal];
- self.textField.sol_placeholder = @"textField placeholder";
- self.navigationItem.sol_title = @"title";
對(duì)于 SOLocalization 暫不支持切換語(yǔ)言后自動(dòng)修改文本內(nèi)容的 UIKit 對(duì)象,可以這樣獲取需要的本地化字符串:
- // 其中 “title” 為 strings 文件中對(duì)應(yīng)的 key,“infoPlist”是本地化字符串文件名
- NSString *localizedString = SOLocalizedStringFromTable(@"title", @"infoPlist");
5.修改應(yīng)用內(nèi)使用的語(yǔ)言
- // to use English
- [SOLocalization sharedLocalization].region = SOLocalizationEnglish;
- // to use 簡(jiǎn)體中文
- [SOLocalization sharedLocalization].region = SOLocalizationSimplifiedChinese;
6.自定義的本地化字符串文件名
SOLocalization 提供的 API 中,默認(rèn)使用的本地化字符串文件名為 infoPlist.strings 文件,如果使用其他文件名(比如使用這個(gè)文件名:local.strings),如下即可:
- // 對(duì)于支持的 UIKit 對(duì)象
- label.sol_table = @"local";
- // 使用 SOLocalizedStringFromTable 時(shí)
- NSString *localizedString = SOLocalizedStringFromTable(@"title", @"local");