1. 程式人生 > >iOS-生成國際化包-配置App多語言支援

iOS-生成國際化包-配置App多語言支援

如果你的App需要支援多國語言。那麼,就應該為你的App應用新增“國際化”支援。
國際化其實都大同小異,其核心思想就是為每種語言單獨定義一份資源。

1.建立國際化語言檔案:檔名為:Localizable.strings
這裡寫圖片描述

2.選中Localizable.strings檔案,在Utilites中,點選Localizable選項
這裡寫圖片描述

3.建立English語言包。
建立後,你的Localizable.strings檔案下將掛在英文的語言支援檔案。
這裡寫圖片描述

4.根據需要新增其他多國語言支援。
這裡寫圖片描述
直接點選Finish。
這裡寫圖片描述

新增語言支援。

我們以我的檔案為例:
在Localizable.strings(Chinese(Simplified))中,加入如下程式碼:
“hello” = “你好”;
在Localizable.strings(English)中,加入如下程式碼:
“hello” = “Hello”;

其他的同理

 label  = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 50)];
    label.textColor = [UIColor orangeColor];

    [label setText:NSLocalizedString(@"hello",@"")];
    [self.view addSubview:label];

至此,國際化就配置好了,當在“設定”中切換系統語言的時候,app的語言可以自動切換了

應用內切換語言

應用啟動時,首先會讀取NSUserDefaults中的key為AppleLanguages的內容,該key返回一個String陣列,儲存著APP支援的語言列表,陣列的第一項為APP當前預設的語言。

在安裝後第一次開啟APP時,會自動初始化該key為當前系統的語言編碼,如簡體中文就是zh-Hans。

那麼我們要實現語言切換改變AppleLanguages的值即可,但是這裡有一個坑,因為蘋果沒提供給我們直接修改APP預設語言的API,我們只能通過NSUserDefaults手動去操作,且AppleLanguages的值改變後APP得重新啟動後才會生效(才會讀取相應語言的lproj中的資源,意義著就算你改了,資源還是載入的APP啟動時lproj中的資源),猜測應該是框架層在第一次載入時對AppleLanguages的值進行了記憶體緩衝

為了方便,定義巨集

#define AppLanguage @"appLanguage"

查詢對應的strings檔案

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

按鈕切換

- (void)viewDidLoad {
    [super viewDidLoad];
    label  = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 50)];
    label.textColor = [UIColor orangeColor];

    [label setText:NSLocalizedString(@"hello",@"")];
    [self.view addSubview:label];





    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(100, 400, 100, 50);
    [button setTitle:NSLocalizedString(@"change",@"") forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];

}

- (void)buttonClick {


    NSString *currentLanguage = [[NSUserDefaults standardUserDefaults]objectForKey:AppLanguage];
    if ([currentLanguage isEqualToString: @"en"]) {
        [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:AppLanguage];
    }else
    {
        [[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:AppLanguage];
    }
    [[NSUserDefaults standardUserDefaults] synchronize];



    label.text= CustomLocalizedString(@"hello", nil);



    NSLog(@"當前使用的語言:%@",currentLanguage);
}