1. 程式人生 > >iOS多語言(國際化)開發(跟隨系統 + APP內手動設定)

iOS多語言(國際化)開發(跟隨系統 + APP內手動設定)

一:跟隨系統切換語言

1>建立好專案工程後, 新建一個多語言檔案:

這裡寫圖片描述

2>新增要設定的語言型別:

這裡寫圖片描述

3>新增成功

這裡寫圖片描述

細心的朋友可能會發現在English後面寫的是3 Files Localized,這是因為英語是系統預設新增的,而且同時為Main.storyboardLaunchScreen.storyboard設定了多語言,我在自己新增的時候沒有勾選這兩項.

3>使用多語言檔案在應用內設定對應語言

"label"="label";
"label"="標籤";
"label"="ラベル";

4>在類中為控制元件賦值

NSLocalizedString的使用,有一個必要的條件,就是:多語言檔名字必須是Localizable,否則到最後顯示的只能是key;者中設定完之後只能讓應用跟隨系統的語言版本進行切換,而使用者不能手動進行切換

label.text = NSLocalizedString("label", nil)

相關巨集說明

//跟隨系統切換, 多語言檔名必須是Localizable
NSLocalizedString("label", nil);
//下面三個都可以手動設定多語言
//第一個引數:是多語言中的key
//第二個引數:是多語言檔案的名字
//第三個引數:是對key的註釋說明,一般傳nil
NSLocalizedStringFromTable(@"label", @"STLocalizable", nil); //指定多語言檔名和bundle NSLocalizedStringFromTableInBundle(@"label", @"STLocalizable", bundle, nil); //在上面的基礎上增加一個預設值的引數 NSLocalizedStringWithDefaultValue(@"label", @"STLocalizable", bundle, @"label", nil);

也可以使用NSLocalizedStringFromTable

label.text = NSLocalizedStringFromTable
(@"label", @"STLocalizable", nil);

這樣在切換系統語言之後,啟動應用後APP內部的語言也就跟著切換了

二:APP內手動切換語言

1>專案工程Show in Finder後,發現每一種語言都對應一個資料夾,字尾是.lproj,

這裡寫圖片描述

在APP內切換語言的時候,實際上就是取這些資料夾中的STLocalizable.strings檔案

這裡寫圖片描述

2>獲取STLocalizable.strings

獲取這裡寫圖片描述檔案的value值,對應的想要切換語言的話,直接切換pathForResource後面的引數即可

NSString *path = [[NSBundle mainBundle] pathForResource:@"zh-Hans" ofType:@"lproj"];
NSString *labelString = [[NSBundle bundleWithPath:path] localizedStringForKey:@"label" value:nil table:@"STLocalizable"];
NSLog(@"result: %@", labelString);
//輸出:MultiLanguage[1887:72599] result: 標籤

3>在應用內切換語言,用NSUserDefaults儲存當前語言

- (IBAction)changeLanguage:(UIButton *)sender {
    switch (sender.tag) {
        case 10: { //中文
            [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:appLanguage];
        } break;
        case 11: { //日文
            [[NSUserDefaults standardUserDefaults] setObject:@"ja" forKey:appLanguage];
        } break;
        case 12: { //英文
            [[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:appLanguage];
        }  break;
        default:
            break;
    }
}

4>程式退出去後,下次進入繼續使用上次關閉程式的語言

//根據NSUserDefaults的key去取多語言型別
NSString *laguageType =[NSString stringWithFormat:@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]];
//在檔案目錄中確認多語言型別對應的路徑
NSString *path = [[NSBundle mainBundle] pathForResource:laguageType ofType:@"lproj"];
//在多語言檔案中查詢label對應的值
NSString *labelText = [[NSBundle bundleWithPath:path] localizedStringForKey:@"label" value:nil table:@"ASLocalized"];
self.label.text = labelText;

擴充套件

使用者第一次啟動APP的時候顯示什麼語言

1>預設設定一種語言,比如英文,在APPDelegatedidFinishLaunchingWithOptions中:

if (![[NSUserDefaults standardUserDefaults] objectForKey:appLanguage]) { 
    //預設設為英文
    [[NSUserDefaults standardUserDefaults] setObject:@"en"  forKey:appLanguage];
}

2>跟隨系統語言

需要獲取系統的首選語言順序,然後取第一個首選語言

//獲取第一個首選語言
NSString *language = [NSLocale preferredLanguages][0];

或者判斷做好的語言版本,在首選語言陣列中是否存在

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 if ([language hasPrefix:@"ja"] ) {
        [[NSUserDefaults standardUserDefaults] setObject:@"ja" forKey:appLanguage];
    } else {
        [[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:appLanguage];
    }
}

多語言開發可能用到的方法

#define LanguageKey @"appLanguage"
//獲取當前語言
[[NSUserDefaults standardUserDefaults] objectForKey:LanguageKey];
//獲取首選語言順序
[NSLocale preferredLanguages];
//獲取首選語言第一語言
[[NSLocale preferredLanguages] objectAtIndex:0];
//獲取系統所有語言
[NSLocale availableLocaleIdentifiers];
//獲取當前語言檔案路徑
NSString *currentLanguage = [[NSUserDefaults standardUserDefaults] ;objectForKey:LanguageKey];
NSString *path = [[NSBundle mainBundle] pathForResource:currentLanguage ofType:@"lproj"];
//根據key獲取當前語言對應的本地字串(引數value:如果key是nil或key在表中找不到本地化字串,則返回的值。)
NSString *value = [[NSBundle bundleWithPath:path] localizedStringForKey:@"label" value:nil table:@"TiLocalizable"];