前言
- 我們日常使用App中,只有中文就夠了,然而如果我們的App是面向國際化的,那么多語言就必不可少,本文整理了在iOS中多語言的實作,
準備作業
添加支持的語言
- 選擇工程,在info下面的
Localizations中,點擊加號按鈕,添加支持的語言
建立strings檔案
- 方法1.選擇一個
storyboard,例如默認的Main.storyboard,在Localization欄中勾選支持的語言,系統就會生成對應的檔案, - 方法2.我們直接新建
strings資源檔案,在該檔案的File Inspecter的Localization欄中勾選支持的語言,
準備對應文案
- 例如在
Localizable.strings(English)中,
"訊息" = "Messages"; "搜索" = " Search";
實作
- 思路:
- 偏好設定中存盤我們設定的語言,默認是簡體中文
- 當我們切換多語言的時候,更改偏好設定中存盤的語言
- 顯示的時候,傳入key,
- 如果設定了其他語言,就根據對應的bundle中的key取出對應value來顯示
切換多語言的實作
定義宏
- 定義多語言的宏,如下,定義了三種宏,分別是簡體中文,繁體中文,英文,韓文
#define Chinese_Simple @"zh-Hans" #define Chinese_Traditional @"zh-Hant" #define English_US @"en" #define Korean @"ko"
定義偏好設定的檔案名稱
#define Language_Key @"eagle_languageKey"
設定多語言
/// 設定多語言 /// @param language 語言 - (void)setNewLanguage:(NSString *)language { NSString * setLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:Language_Key]; if ([language isEqualToString:setLanguage]) { return; } // 簡體中文 else if ([language isEqualToString:Chinese_Simple]) { [[NSUserDefaults standardUserDefaults] setObject:Chinese_Simple forKey:Language_Key]; [[NSUserDefaults standardUserDefaults] synchronize]; } // 繁體中文 else if ([language isEqualToString:Chinese_Traditional]) { [[NSUserDefaults standardUserDefaults] setObject:Chinese_Traditional forKey:Language_Key]; [[NSUserDefaults standardUserDefaults] synchronize]; } // 英文 else if ([language isEqualToString:English_US]) { [[NSUserDefaults standardUserDefaults] setObject:English_US forKey:Language_Key]; [[NSUserDefaults standardUserDefaults] synchronize]; } // 韓語 else if ([language isEqualToString:Korean]) { [[NSUserDefaults standardUserDefaults] setObject:Korean forKey:Language_Key]; [[NSUserDefaults standardUserDefaults] synchronize]; } }
使用
#define languageStringWithKey(key) [[LanguageTools sharedInstance] getStringForKey:key] NSString *title = languageStringWithKey(@"確定");
具體實作如下,先偏好設定存盤的當前語言獲取對應bundle,然后拿到這個bundle之后,根據key找到對應的值,
// 根據語言名獲取bundle - (NSBundle *)bundle { NSString * setLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:Language_Key]; //默認是簡體中文 if (setLanguage == nil || [setLanguage isEqualToString:@"zh-Hans-CN"]) { setLanguage = Chinese_Simple; } NSString * bundlePath = [[NSBundle mainBundle] pathForResource:setLanguage ofType:@"lproj"]; return [NSBundle bundleWithPath:bundlePath]; } // 根據key獲取value - (NSString *)getStringForKey:(NSString *)key { NSBundle * bundle = [[LanguageTools sharedInstance] bundle]; if (bundle) { NSString * valueString = NSLocalizedStringFromTableInBundle(key, @"Localizable", bundle, @"HelloWord"); if (!KCNSSTRING_ISEMPTY(valueString)) { return valueString; } DDLogInfo(@"\n********** have not add key **********\n \"%@\" = \"%@\" \n****************************",key,key); return NSLocalizedString(key, @"HelloWord"); } return NSLocalizedString(key, @"HelloWord"); }
NSLocalizedString
-
NSLocalizedString是一個定義在NSBundle.h中的宏,用途是尋找當前系統語言對應的Localizable.strings檔案中的某個key的值, -
第一個引數是
key的名字,第二個引數是對這個“鍵值對”的注釋,在用genstrings工具生成Loclizable.strings檔案時會自動加上去,例如上面代碼中的HelloWord就是注釋, -
NSLocalizedString系列的四個宏,其實最終都是呼叫了[bundle localizedStringForKey:(key) value:(val) table:(tbl)],根據我們的自定義程度不同可以選擇不同的宏,
#define NSLocalizedString(key, comment) \ [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil] #define NSLocalizedStringFromTable(key, tbl, comment) \ [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)] #define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \ [bundle localizedStringForKey:(key) value:@"" table:(tbl)] #define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \ [bundle localizedStringForKey:(key) value:(val) table:(tbl)]
上面基本就是實作一個可控的多語言版本的實作程序,
推薦??:
如果你想一起進階,不妨添加一下交流群1012951431
面試題資料或者相關學習資料都在群檔案中 進群即可下載!

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/4178.html
標籤:iOS
