實現iOS中的多語言切換


前言

  • 我們日常使用App中,只有中文就夠了,然而如果我們的App是面向國際化的,那么多語言就必不可少。本文整理了在iOS中多語言的實現。

准備工作

添加支持的語言

  • 選擇工程,在info下面的Localizations中,點擊加號按鈕,添加支持的語言

建立strings文件

  • 方法1.選擇一個storyboard,例如默認的Main.storyboard,Localization欄中勾選支持的語言。系統就會生成對應的文件。
  • 方法2.我們直接新建strings資源文件。在該文件的File InspecterLocalization欄中勾選支持的語言。

准備對應文案

  • 例如在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

面試題資料或者相關學習資料都在群文件中 進群即可下載!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM