前言 我們日常使用App中,只有中文就夠了,然而如果我們的App是面向國際化的,那麼多語言就必不可少。本文整理了在iOS中多語言的實現。 準備工作 添加支持的語言 選擇工程,在info下麵的Localizations中,點擊加號按鈕,添加支持的語言 建立strings文件 方法1.選擇一個story ...
前言
- 我們日常使用App中,只有中文就夠了,然而如果我們的App是面向國際化的,那麼多語言就必不可少。本文整理了在iOS中多語言的實現。
準備工作
添加支持的語言
- 選擇工程,在info下麵的
Localizations
中,點擊加號按鈕,添加支持的語言
建立strings文件
- 方法1.選擇一個
storyboard
,例如預設的Main.storyboard,
在Localization
欄中勾選支持的語言。系統就會生成對應的文件。 - 方法2.我們直接新建
strings
資源文件。在該文件的File Inspecter
的Localizatio
n欄中勾選支持的語言。
準備對應文案
- 例如在
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)]
上面基本就是實現一個可控的多語言版本的實現過程。
推薦