iOS 應用程式內部國際化,不跟隨系統語言

來源:互聯網
上載者:User

前言:網路上關於iOS國際化的文章很多,但基本上都是基於跟隨系統語言的國際化,筆者就不贅述了-0 –

今天要講的是不跟隨系統的切換語言版本方案,即程式內部的切換語言版本方案。


       應用內部語言不跟隨系統語言,由應用自己進行控制,通過配置多個語言檔案,根據使用者的選擇動態擷取不同檔案夾下的語言檔案,顯示在介面上。

       最後把使用者選擇的語言持久化到本地,下次運行時讀取。


1、建立工程

      建立Single View Application工程,取名為MyInternational。

                                                     


2、添加多語言檔案

      我們選擇使用自己的語言檔案,而不是系統的localizable.string,因為在項目開發使用svn時,多人操作同一檔案可能會造成衝突。

在Resource中添加新的Strings File:

                                                           

      

      取名為hello(記得Targets要勾選項目)

                                                                


      建立完成之後會產生hello.string檔案,把它拖進Supporting Files裡。


3、配置hello.string國際化

      首先配置剛才的hello.string檔案。

      點擊hello.strings檔案,點擊圈中的Make localized(本地化)。

                                                                            

   

      只有English,沒關係點擊確定。

                                                               


4、設定項目國際化

      網路上很多配置方法不靠譜,因為新版的Xcode位置“+”號的位置換了,這裡教大家正確的方法,點擊項目—>選擇Project—>選擇Info—>點擊“+”號。

                                                    


      點擊“+”號後,添加中文,當然也可以添加其他的語言,彈出對話方塊,infoPlist是配置系統的國際化檔案,可以配置表徵圖之類的多語言環境,不屬於本文範圍,nib檔案看需要配,這裡選擇不配。

                                                     

     

      配置完成之後,再看hello.string便分成了兩個檔案。

                                                                                 

      完成上面的四步便完成了項目內的多語言環境配置,下面來看看代碼怎麼寫。


5、添加需要的字串

      分別在hello.strings(English)與hello.strings(Chinese)裡面添加對應語言的字串。

      字串的格式為“key”=“value”;鍵值對(別忘記分號!)

      接下來設定項目需要的字串,一個用於lable的顯示,一個用於button的顯示。

 

    hello.strings(English)

 

    hello.strings(Chinese)

 

6、看看流程

                                                    

【實現思路:】

      在初始化首個Controller的時候,進行應用語言的載入。首次載入因為userLanguage(應用內語言)不存在,則使用系統當前的語言,儲存到userlanguage,下次直接讀。讀出來之後,擷取到對應檔案路徑,得到檔案的索引,儲存到工具類InternationalControl的靜態變數bundle中。

其他地方需要用字串時,用工具類獲得bundle即可讀取相應檔案中的字串。


7、建立工具類InternationalControl

                          

InternationalControl.h

#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>@interface InternationalControl : NSObject+(NSBundle *)bundle;//擷取當前資源檔+(void)initUserLanguage;//初始化語言檔案+(NSString *)userLanguage;//擷取應用當前語言+(void)setUserlanguage:(NSString *)language;//設定當前語言@end

InternationalControl.m

1)建立靜態變數bundle,以及擷取方法bundle(註:此處不要使用getBundle)。

static NSBundle *bundle = nil;+ ( NSBundle * )bundle{        return bundle;}

userLanguage儲存在NSUserDefaults中,首次載入時要檢測是否存在,如果不存在的話讀AppleLanguages,並賦值給userLanguage。
+(void)initUserLanguage{        NSUserDefaults *def = [NSUserDefaults standardUserDefaults];        NSString *string = [def valueForKey:@"userLanguage"];         if(string.length == 0){                //擷取系統當前語言版本(中文zh-Hans,英文en)        NSArray* languages = [def objectForKey:@"AppleLanguages"];        
        NSString *current = [languages objectAtIndex:0];                string = current;                [def setValue:current forKey:@"userLanguage"];                [def synchronize];//持久化,不加的話不會儲存}    //擷取檔案路徑    NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@"lproj"];        bundle = [NSBundle bundleWithPath:path];//產生bundle}

+(NSString *)userLanguage{        NSUserDefaults *def = [NSUserDefaults standardUserDefaults];        NSString *language = [def valueForKey:@"userLanguage"];        return language;}

+(void)setUserlanguage:(NSString *)language{        NSUserDefaults *def = [NSUserDefaults standardUserDefaults];        //1.第一步改變bundle的值    NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj" ];        bundle = [NSBundle bundleWithPath:path];        //2.持久化    [def setValue:language forKey:@"userLanguage"];        [def synchronize];}

8、拖nib,配置點擊事件

一個button,一個label,button用於切換語言,label用於顯示資訊。

                                                                       


9、配置載入的第一個Controller,這裡是YGViewController

YGViewController.h

#import <UIKit/UIKit.h>@interface YGViewController : UIViewController@property (retain, nonatomic) IBOutlet UILabel *inviteLabel;//label- (IBAction)changeLanguage:(id)sender;//點擊事件@property (retain, nonatomic) IBOutlet UIButton *btChange;//button@end


YGViewController.m

1)載入:

- (void)viewDidLoad{    //註冊通知,用於接收改變語言的通知    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLanguage) name:@"changeLanguage" object:nil];    [InternationalControl initUserLanguage];//初始化應用語言        NSBundle *bundle = [InternationalControl bundle];        NSString *inviteMsg = [bundle localizedStringForKey:@"invite" value:nil table:@"hello"];    NSString *buttonInfo = [bundle localizedStringForKey:@"buttonInfo" value:nil table:@"hello"];//table為hello.string的檔案名稱        [_btChange setTitle:buttonInfo forState:UIControlStateNormal];        _inviteLabel.text = inviteMsg;        [super viewDidLoad];}

- (IBAction)changeLanguage:(id)sender {        NSString *lan = [InternationalControl userLanguage];        if([lan isEqualToString:@"en"]){//判斷當前的語言,進行改變            [InternationalControl setUserlanguage:@"zh-Hans"];        }else{            [InternationalControl setUserlanguage:@"en"];}        //改變完成之後發送通知,告訴其他頁面修改完成,提示重新整理介面    [[NSNotificationCenter defaultCenter] postNotificationName:@"changeLanguage" object:nil];}

-(void)changeLanguage{        [_btChange setTitle:[[InternationalControl bundle] localizedStringForKey:@"buttonInfo" value:nil table:@"hello"] forState:UIControlStateNormal];        _inviteLabel.text =[[InternationalControl bundle] localizedStringForKey:@"invite" value:nil table:@"hello"];}

10、運行介面

                                                                            


                                                                            

可以看到點擊切換語言之後,語言切換成功。

退出程式再次進入,保留了上次選擇的語言。

 

 http://blog.csdn.net/yang8456211/article/details/12031667


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.