iOS多語言(國際化)開發(跟隨系統 + APP內手動設定)
阿新 • • 發佈:2019-01-07
一:跟隨系統切換語言
1>建立好專案工程後, 新建一個多語言檔案:
2>新增要設定的語言型別:
3>新增成功
細心的朋友可能會發現在English
後面寫的是3 Files Localized
,這是因為英語是系統預設新增的,而且同時為Main.storyboard
和 LaunchScreen.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>預設設定一種語言,比如英文,在APPDelegate
的didFinishLaunchingWithOptions
中:
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"];