iOS開發(fā) 本地化語言和手動切換語言

App要國際推廣,需要支持多語言申屹』嬷ぃ可以通過本地化語言和切換來實(shí)現(xiàn)。配置本地化語言也是比較簡單哗讥,通過下面幾步可以簡單實(shí)現(xiàn):

一:配置項(xiàng)目本地化支持簡體中文和英文

  • 工程-PROJECT-info->Localizations嚷那,點(diǎn)“+”,選擇(Chinese(Simplified))添加簡體中文忌栅,英文Xcode自帶有(English)车酣,所以不需要再次添加曲稼。


    1

二:添加多語言文件

  • 我們選擇使用自己的語言文件索绪,所以要創(chuàng)建一個后綴為.strings文件;
  • 需要可以手動切換語言,而不是根據(jù)系統(tǒng)語言變換贫悄,所以命名不能為Localizable.strings瑞驱;
  • 文件取名為Language.strings(自己隨意命名,后綴為:.strings)(記得Targets要勾選項(xiàng)目)窄坦。
    2

三:配置Language.strings本地化唤反,支持簡體中文和英文。

  • 選中Language.strings文件鸭津,查看Xcode右側(cè)邊欄信息彤侍;
  • 點(diǎn)擊Localization中的Localize…按鈕;
  • 選擇Base或中文或英文 然后Localize逆趋;
  • 勾選中文和英文盏阶,Base項(xiàng)可有可無,都選擇UseFile闻书。
    3

    這時候Language.strings會多出兩個子文件名斟,分別對應(yīng)英文和簡體中文。在項(xiàng)目工程文件夾中也會看到兩個文件夾en.lprojzh-Hans.lproj魄眉。這兩個文件夾不要復(fù)制其他項(xiàng)目的砰盐,因?yàn)檫@兩個文件跟本項(xiàng)目工程文件相關(guān)聯(lián),直接復(fù)制過來會讀取不到里面的.strings文件坑律。當(dāng)然岩梳,直接復(fù)制里面的內(nèi)容是可以的。

四:在Language.strings添加并完善所有需要轉(zhuǎn)換的文字

  • 每個字段都以分號間隔,因?yàn)椴皇荗C文件所以不需要使用@表示字符串冀值;
  • “key鍵”=“value值”淘捡,鍵可以用中文,也可有用英文池摧,性能有沒差別看不出焦除。
4

五:寫個宏定義,用來讀取語言文件和返回的value值作彤。宏最好是全局的膘魄,畢竟在一個項(xiàng)目里會有多個文件會用到。

 #define Localized(key)  [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]] localizedStringForKey:(key) value:nil table:@"Language"]

六:保存當(dāng)前使用語言到NSUserDefaults

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    // 在AppDelegate.m文件didFinishLaunchingWithOptions獲取當(dāng)前手機(jī)語言竭讳,并存儲到NSUserDefaults创葡。
    if (![[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"]) {
  
        NSArray *languages = [NSLocale preferredLanguages];
        NSString *language = [languages objectAtIndex:0];
      
        if ([language hasPrefix:@"zh-Hans"]) {
          //開頭匹配
            [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];
        }else{
            [[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"];
        }
    }
    return YES;
}

七:創(chuàng)建并初始化UI控件

ViewController.m創(chuàng)建并初始化UILabel用于顯示多語言文字,UIButton切換語言按鈕及響應(yīng)事件绢慢。
讀取根據(jù)語言文件鍵值獲取返回值灿渴,使用方法:Localized(key)

7

八:添加通知中心

接收到通知的時候響應(yīng)事件胰舆,也可用不用通知做骚露,直接在按鈕點(diǎn)擊事件添加語言切換操作。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLanguage) name:@"changeLanguage" object:nil];
}
- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

九:添加切換語言事件

ViewController.m創(chuàng)建并初始化UILabel用于顯示多語言文字缚窿,UIButton切換語言按鈕及響應(yīng)事件棘幸。

// 按鈕點(diǎn)擊事件
- (void)btnClick
{
   //修改本地獲取的語言文件-交替
    NSString *language = [[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"];
    
    if ([language isEqualToString: @"en"]) {
        
        [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];
        
    }else {
        
        [[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"];
    }
    
    [[NSUserDefaults standardUserDefaults] synchronize];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"changeLanguage" object:nil];
}

十:收到語言切換通知做相應(yīng)處理

  • 因?yàn)槭且⑿滤性噲D,所以之前的所有試圖都要重新初始化倦零,需要重新設(shè)置window.rootViewController
  • 為了不再重復(fù)代碼误续,就直接調(diào)用AppDelegatetoMain(重新加載窗口方法)方法,來設(shè)rootViewController
- (void)changeLanguage
{
    /*
    // 全局重置
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    // 重新加載主控制器
    [delegate toMain];
    // 設(shè)置選中第幾個vc
    delegate.tabbarCtr.selectedIndex = 1;
  // 部分重置
    label.text = [NSString stringWithFormat:@"我的手機(jī)是=%@",Localized(@"apple")];
}
演示
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扫茅,一起剝皮案震驚了整個濱河市蹋嵌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌葫隙,老刑警劉巖栽烂,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異停蕉,居然都是意外死亡愕鼓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進(jìn)店門慧起,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菇晃,“玉大人,你說我怎么就攤上這事蚓挤』撬停” “怎么了驻子?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長估灿。 經(jīng)常有香客問我崇呵,道長,這世上最難降的妖魔是什么馅袁? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任域慷,我火速辦了婚禮,結(jié)果婚禮上汗销,老公的妹妹穿的比我還像新娘犹褒。我一直安慰自己,他們只是感情好弛针,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布叠骑。 她就那樣靜靜地躺著,像睡著了一般削茁。 火紅的嫁衣襯著肌膚如雪宙枷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天茧跋,我揣著相機(jī)與錄音慰丛,去河邊找鬼。 笑死厌衔,一個胖子當(dāng)著我的面吹牛璧帝,可吹牛的內(nèi)容都是我干的捍岳。 我是一名探鬼主播富寿,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锣夹!你這毒婦竟也來了页徐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤银萍,失蹤者是張志新(化名)和其女友劉穎变勇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贴唇,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搀绣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了戳气。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片链患。...
    茶點(diǎn)故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瓶您,靈堂內(nèi)的尸體忽然破棺而出麻捻,到底是詐尸還是另有隱情纲仍,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布贸毕,位于F島的核電站郑叠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏明棍。R本人自食惡果不足惜乡革,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摊腋。 院中可真熱鬧箩做,春花似錦、人聲如沸新娜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽类咧。三九已至馒铃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痕惋,已是汗流浹背区宇。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留值戳,地道東北人议谷。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像堕虹,于是被迫代替她去往敵國和親卧晓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評論 2 349

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