iOS APP 多語(yǔ)言支持

歡迎訪問(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)擊+添加。

添加項(xiàng)目語(yǔ)言支持

2穆律、添加App名稱文件

文件的名字一定要是InfoPlist惠呼!

方法:File -> New -> File... -> iOS-> Resource -> Strings File

新建InfoPlist

3、設(shè)置InfoPlist.strings的Localization

方法:在項(xiàng)目中找到并選中InfoPlist.strings文件峦耘,在靠右邊的穿口中剔蹋,選擇支持的語(yǔ)言類型。

本例中選擇的是英語(yǔ)辅髓、簡(jiǎn)體中文泣崩、繁體中文

選擇語(yǔ)言

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的值硝皂。

語(yǔ)言支持文件

具體的做法如下:

為了方便使用,我們新建一個(gè)繼承NSObjectXYJLanguageTool類作谭,用來(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ǔ)

應(yīng)用內(nèi)切換為簡(jiǎn)體中文

切換為簡(jiǎn)體中文

應(yīng)用內(nèi)切換為繁體中文

切換為繁體中文

本例中的demo已經(jīng)提交到Github上贝或,點(diǎn)擊這里下載,歡迎提出批評(píng)和指正锐秦,最后謝謝大家咪奖!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市酱床,隨后出現(xiàn)的幾起案子羊赵,更是在濱河造成了極大的恐慌,老刑警劉巖斤葱,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慷垮,死亡現(xiàn)場(chǎng)離奇詭異揖闸,居然都是意外死亡揍堕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門汤纸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)衩茸,“玉大人,你說(shuō)我怎么就攤上這事贮泞±愦龋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵啃擦,是天一觀的道長(zhǎng)囊蓝。 經(jīng)常有香客問(wèn)我,道長(zhǎng)令蛉,這世上最難降的妖魔是什么聚霜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任狡恬,我火速辦了婚禮,結(jié)果婚禮上蝎宇,老公的妹妹穿的比我還像新娘弟劲。我一直安慰自己,他們只是感情好姥芥,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布兔乞。 她就那樣靜靜地躺著,像睡著了一般凉唐。 火紅的嫁衣襯著肌膚如雪庸追。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天台囱,我揣著相機(jī)與錄音锚国,去河邊找鬼。 笑死玄坦,一個(gè)胖子當(dāng)著我的面吹牛血筑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播煎楣,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼豺总,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了择懂?” 一聲冷哼從身側(cè)響起喻喳,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎困曙,沒(méi)想到半個(gè)月后表伦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慷丽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蹦哼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片要糊。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纲熏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锄俄,到底是詐尸還是另有隱情局劲,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布奶赠,位于F島的核電站鱼填,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏毅戈。R本人自食惡果不足惜苹丸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一塑猖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谈跛,春花似錦羊苟、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至阻桅,卻和暖如春凉倚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嫂沉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工稽寒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趟章。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓杏糙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蚓土。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宏侍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容