歡迎訪問(wèn)我的博客muhlenXi卫枝,該文章出自我的博客。
版權(quán)聲明:本文為muhlenXi原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處玉控,未經(jīng)允許不得轉(zhuǎn)載.
導(dǎo)語(yǔ):
App根據(jù)手機(jī)系統(tǒng)的語(yǔ)言進(jìn)行顯示。第二種是在App內(nèi)自行設(shè)置語(yǔ)言狮惜,也就是應(yīng)用內(nèi)切換語(yǔ)言高诺,設(shè)置的是什么語(yǔ)言,就顯示什么語(yǔ)言碾篡。
寫個(gè)demo玩一下虱而,實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。
基礎(chǔ)文件配置:
1开泽、首先是添加App的本地化語(yǔ)言支持牡拇。
方法:PROJECT
-> Info
-> Localizations
-> 點(diǎn)擊+
添加。
2穆律、添加App名稱文件
文件的名字一定要是InfoPlist
惠呼!
方法:File
-> New
-> File...
-> iOS
-> Resource
-> Strings File
3、設(shè)置InfoPlist.strings的Localization
方法:在項(xiàng)目中找到并選中InfoPlist.strings
文件峦耘,在靠右邊的穿口中剔蹋,選擇支持的語(yǔ)言類型。
本例中選擇的是英語(yǔ)辅髓、簡(jiǎn)體中文泣崩、繁體中文
4、設(shè)置對(duì)應(yīng)文件的key-value鍵值對(duì)
點(diǎn)擊InfoPlist.strings
左邊的三角形符號(hào)展開(kāi)該文件洛口,分別在對(duì)應(yīng)的strings文件中設(shè)置對(duì)應(yīng)的鍵值對(duì)矫付。
4-1、在InfoPlist.strings(English)文件中輸入:
"CFBundleDisplayName" = "EnglishName";
4-2第焰、在InfoPlist.strings(Chinese(Simplified))文件中輸入:
"CFBundleDisplayName" = "CFBundleDisplayName" = "中文名字";
保存后編譯并運(yùn)行就可以了买优。
系統(tǒng)語(yǔ)言切換:
創(chuàng)建Localizable字符串文件
同樣的步驟,執(zhí)行2-3步驟挺举,創(chuàng)建一個(gè)名字為Localizable
的strings文件杀赢,然后設(shè)置 Localizable.strings 的 Localization 。
然后執(zhí)行步驟4豹悬,設(shè)置不同語(yǔ)言中項(xiàng)目所需的字符串葵陵。
本例中,我們需要設(shè)置Alarm clock瞻佛、Medicine脱篙、Setings娇钱、Find Band、test words等字符串绊困。
也就是說(shuō):
1-在Localizable.strings(English)文件中輸入:
"Alarm clock" = "Alarm clock";
"Medicine" = "Medicine";
"Setings" = "Setings";
"Find Band" = "Find Band";
"test words" = "test words";
2-在Localizable.strings(Chinese(Simplified))文件中輸入:
"Alarm clock" = "鬧鐘提醒";
"Medicine" = "吃藥提醒";
"Setings" = "設(shè)置";
"Find Band" = "尋找手環(huán)";
"test words" = "測(cè)試語(yǔ)句";
調(diào)用 NSLocalizedString(key, comment)
方法
舉例:
self.descriptionLabel.text = NSLocalizedString(@"test words", @"描述文字");
到這里第二部分的內(nèi)容基本就完了文搂。
應(yīng)用內(nèi)切換語(yǔ)言:
應(yīng)用內(nèi)切換語(yǔ)言的思路是:每當(dāng)我們添加一種語(yǔ)言的支持后,系統(tǒng)就會(huì)在我們的項(xiàng)目中生成對(duì)應(yīng)語(yǔ)言的
.lproj
支持文件秤朗。我們將NSUserDefaults
將用戶的語(yǔ)言設(shè)置保存到本地中煤蹭,保存的String的值和下圖中的文件名一樣。然后通過(guò)NSBundle
根據(jù).lproj
支持文件生成bundle取视,最后通過(guò)NSLocalizedStringFromTableInBundle
方法獲取對(duì)應(yīng)的String的值硝皂。
具體的做法如下:
為了方便使用,我們新建一個(gè)繼承NSObject
的XYJLanguageTool
類作谭,用來(lái)管理我們的語(yǔ)言稽物。
XYJLanguageTool.h
中的代碼如下:
#import <Foundation/Foundation.h>
#define XYJGetStringWithKey(key) [[XYJLanguageTool sharedInstance] getStringForKey:key]
@interface XYJLanguageTool : NSObject
@property (nonatomic,strong,readonly) NSBundle * bundle;
// 單例初始化方法
+ (id) sharedInstance;
// 根據(jù)key獲取相應(yīng)的String
- (NSString *) getStringForKey:(NSString *) key;
// 應(yīng)用內(nèi)設(shè)置新語(yǔ)言
- (void) setNewLanguage:(NSString *) language;
@end
XYJLanguageTool.m
,中的代碼如下:
#import "XYJLanguageTool.h"
#define Language_Key @"languageKey"
#define Chinese_Simple @"zh-Hans"
#define Chinese_Traditional @"zh-Hant"
#define English_US @"en"
@implementation XYJLanguageTool
+ (id)sharedInstance
{
static dispatch_once_t onceToken;
static XYJLanguageTool * languageTool;
dispatch_once(&onceToken, ^{
languageTool = [[XYJLanguageTool alloc] init];
});
return languageTool;
}
// 根據(jù)語(yǔ)言名獲取bundle
- (NSBundle *)bundle
{
NSString * setLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:Language_Key];
//默認(rèn)是簡(jiǎn)體中文
if (setLanguage == nil) {
setLanguage = Chinese_Simple;
}
NSString * bundlePath = [[NSBundle mainBundle] pathForResource:setLanguage ofType:@"lproj"];
return [NSBundle bundleWithPath:bundlePath];
}
// 根據(jù)key獲取value
- (NSString *)getStringForKey:(NSString *)key
{
NSBundle * bundle = [[XYJLanguageTool sharedInstance] bundle];
if (bundle) {
return NSLocalizedStringFromTableInBundle(key, @"Localizable", bundle, @"HelloWord");
}
return NSLocalizedString(key, @"HelloWord");
}
- (void)setNewLanguage:(NSString *)language
{
NSString * setLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:Language_Key];
if ([language isEqualToString:setLanguage]) {
return;
}
// 簡(jiǎn)體中文
else if ([language isEqualToString:Chinese_Simple]) {
[[NSUserDefaults standardUserDefaults] setObject:Chinese_Simple forKey:Language_Key];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// 繁體中文
else if ([language isEqualToString:Chinese_Traditional]) {
[[NSUserDefaults standardUserDefaults] setObject:Chinese_Traditional forKey:Language_Key];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// 英文
else if ([language isEqualToString:English_US]) {
[[NSUserDefaults standardUserDefaults] setObject:English_US forKey:Language_Key];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// 發(fā)送更新語(yǔ)言的通知,用于重新設(shè)置Window的RootViewController
[[NSNotificationCenter defaultCenter] postNotificationName:@"UpDateLanguageUI" object:nil];
}
使用方法如下(記得導(dǎo)入頭文件):
通過(guò)調(diào)用XYJGetStringWithKey
方法來(lái)獲取相應(yīng)的字符串折欠。
舉例如下:
self.navigationItem.title = XYJGetStringWithKey(@"Alarm clock");
最后的真機(jī)運(yùn)行圖如下:
應(yīng)用內(nèi)切換為英語(yǔ)
應(yīng)用內(nèi)切換為簡(jiǎn)體中文
應(yīng)用內(nèi)切換為繁體中文
本例中的demo已經(jīng)提交到Github上贝或,點(diǎn)擊這里下載,歡迎提出批評(píng)和指正锐秦,最后謝謝大家咪奖!