iOS開(kāi)發(fā)之SDK國(guó)際化

需求

對(duì)SDK內(nèi)部text進(jìn)行國(guó)際化處理

詳細(xì)業(yè)務(wù)需求

在控制器上顯示一段文字吼虎,底下有三個(gè)按鈕破婆,每一個(gè)按鈕點(diǎn)擊之后切換不同的語(yǔ)種劳闹,分英文掘鄙、簡(jiǎn)體中文和繁體中文三種耘戚。

準(zhǔn)備工作

  • 裝有Xcode的MAC電腦一臺(tái)
  • 原生工程一個(gè): SDKInternationalizationDemo.xcodeproj
  • Framework工程一個(gè):FrameworkTest.xcodeproj
  • Bundle工程一個(gè):FrameworkTestBundle.xcodeproj

注意:
創(chuàng)建靜態(tài)庫(kù)可以參考:iOS開(kāi)發(fā)庫(kù)之(二):靜態(tài)庫(kù)Framework的創(chuàng)建
創(chuàng)建Bundle可以參考:iOS之Bundle的創(chuàng)建與使用

國(guó)際化步驟

  • 第一步:在Bundle中新建一個(gè)名為L(zhǎng)ocalizable.strings文件:


    Snip20180115_23.png

點(diǎn)擊剛剛創(chuàng)建的Localizable.strings文件,點(diǎn)擊以下紅框:


Snip20180115_27.png
Snip20180115_25.png

默認(rèn)只支持英文的:


Snip20180115_34.png
  • 第二步:設(shè)置Localizable.strings多語(yǔ)言支持:


    Snip20180115_33.png

選擇需要支持的語(yǔ)言操漠,比如說(shuō)Chinese(Simlified)/Chinese(Traditional):


Snip20180115_35.png

本處只需要支持三種:英文收津、簡(jiǎn)體中文、繁體中文,那配置結(jié)果如下圖:


Snip20180115_36.png
  • 第三步:設(shè)置Localizable.strings國(guó)際化的內(nèi)容朋截,以鍵值對(duì)的形式來(lái)設(shè)置:


    Snip20180115_41.png
Snip20180115_42.png

Snip20180115_43.png

以上屬于Bundle里面的設(shè)置內(nèi)容蛹稍,這個(gè)國(guó)際化的內(nèi)容就設(shè)置完了,接下來(lái)是如何顯示不同的內(nèi)容部服,先編譯一下Bundle,另外每次改變Bundle都需要重新單獨(dú)編譯~

  • 第四步:在SDK中創(chuàng)建字符串常量文件
//KODCommonConst.h
#import <UIKit/UIKit.h>

UIKIT_EXTERN NSString *const KODShowText;

//KODCommonConst.m
#import "KODCommonConst.h"

NSString *const KODShowText = @"KODShowText";

  • 第五步:在SDK中創(chuàng)建分類(lèi)唆姐,用來(lái)讀取國(guó)際化里面的內(nèi)容:
//NSBundle+KODLocalizable.h
#import <UIKit/UIKit.h>

@interface NSBundle (KODLocalizable)
+ (instancetype)KOD_localizableBundleWithBundleName:(NSString *)bundleName;
+ (NSString *)KOD_localizedStringForKey:(NSString *)key value:(NSString *)value;
+ (NSString *)KOD_localizedStringForKey:(NSString *)key;
@end

//NSBundle+KODLocalizable.m
#import "NSBundle+KODLocalizable.h"
#define kKODBundleName @"FrameworkTestBundle.bundle"
#define kDSADLanguageStyle @"DSADLanguageStyle"

@implementation NSBundle (KODLocalizable)
+ (instancetype)KOD_localizableBundleWithBundleName:(NSString *)bundleName{
    static NSBundle *localizableBundle = nil;
    if (localizableBundle == nil) {
        if (!bundleName) {
            bundleName = kKODBundleName;
        }
        NSString *bundleType = nil;
        if (bundleName && ![bundleName hasSuffix:@"bundle"]) {
            bundleType = @"bundle";
        }
        NSString *bundlePath = [[NSBundle mainBundle] pathForResource:bundleName ofType:bundleType];
        localizableBundle = [NSBundle bundleWithPath:bundlePath];
    }
    return localizableBundle;
}

+ (NSString *)KOD_localizedStringForKey:(NSString *)key{
    return [self KOD_localizedStringForKey:key value:nil];
}

+ (NSString *)KOD_localizedStringForKey:(NSString *)key value:(NSString *)value{
    NSBundle *bundle = nil;
    //NSString *language = [self getLanguageFromSystem];
    //NSString *language = [self getLanguageFromPlist];
    NSString * language = [self getLanguageFromDevelopersSetup];
    if (!language) {
        language = [self getLanguageFromSystem];
    }
    //從FrameworkTestBundle.bundle中查找資源
    NSString *bundlePath = [[NSBundle KOD_localizableBundleWithBundleName:nil] pathForResource:language ofType:@"lproj"];
    bundle = [NSBundle bundleWithPath:bundlePath];
    value = [bundle localizedStringForKey:key value:value table:nil];
    return [[NSBundle mainBundle] localizedStringForKey:key value:value table:nil];
}

//這個(gè)設(shè)置語(yǔ)言是通過(guò)讀取當(dāng)前系統(tǒng)使用語(yǔ)言
+ (NSString *)getLanguageFromSystem{
    NSString *language = [NSLocale preferredLanguages].firstObject;
    if ([language hasPrefix:@"en"]) {
        language = @"en";
    } else if ([language hasPrefix:@"zh"]) {
        if ([language rangeOfString:@"Hans"].location != NSNotFound) {
            language = @"zh-Hans"; // 簡(jiǎn)體中文
        } else {
            language = @"zh-Hant"; // 繁體中文
        }
    } else {
        language = @"en";
    }
    return language;
}

//這個(gè)是設(shè)置語(yǔ)言通過(guò)Plist文件來(lái)讀取
+ (NSString *)getLanguageFromPlist{
    NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"SDKInternationalizationDemoPlist.plist" ofType:nil];
    if (!bundlePath) {
        return nil;
    }
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:bundlePath];
    if (dict) {
        NSInteger languageNum = [[dict valueForKey:@"language"] integerValue];
        switch (languageNum) {
            case 1:
                return @"en";     //語(yǔ)言為英語(yǔ):en
                break;
            case 2:
                return @"zh-Hans";//語(yǔ)言為簡(jiǎn)中:zh-Hans
                break;
            case 3:
                return @"zh-Hant";//語(yǔ)言為繁中:zh-Hanz
                break;
            default:
                return @"en";
                break;
        }
    }
    return @"en";
}

//這個(gè)是設(shè)置語(yǔ)言通過(guò)開(kāi)發(fā)者手動(dòng)調(diào)用,從NSUserDefaults里面去讀kDSADLanguageStyle這個(gè)字段是哪一種語(yǔ)言
+ (NSString *)getLanguageFromDevelopersSetup{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSInteger languageStyle = [[userDefaults valueForKey:kDSADLanguageStyle] integerValue];
    if (!languageStyle) {
        return nil;
    }
    switch (languageStyle) {
        case 1:
            return @"en";
            break;
        case 2:
            return @"zh-Hans";
            break;
        case 3:
            return @"zh-Hant";
            break;
        default:
            return @"en";
            break;
    }
}

@end
  • 第六步:在SDK中需要設(shè)置文字的時(shí)候調(diào)用如下即可:
NSString *showText = [NSBundle KOD_localizedStringForKey: KODShowText];
showLabel.text = showText;

注意:其他的聯(lián)調(diào)的我就不說(shuō)了廓八,另外還有Alert的那個(gè)類(lèi)我也不說(shuō)了奉芦,大家更詳細(xì)的可以看DEMO,DEMO傳送門(mén)

以下附上三張效果圖:

  • 點(diǎn)擊了配置英語(yǔ)的按鈕剧蹂,效果:


    Snip20180115_44.png
  • 點(diǎn)擊了配置簡(jiǎn)體中文按鈕声功,效果:


    Snip20180115_45.png
  • 點(diǎn)擊了配置繁體中文按鈕,效果:


    Snip20180115_46.png

附帶其他的國(guó)際化:
3分鐘實(shí)現(xiàn)iOS語(yǔ)言本地化/國(guó)際化(圖文詳解)

以上3璧稹O劝汀!


七禾.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冒冬,一起剝皮案震驚了整個(gè)濱河市伸蚯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌简烤,老刑警劉巖剂邮,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異横侦,居然都是意外死亡挥萌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)枉侧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)引瀑,“玉大人,你說(shuō)我怎么就攤上這事棵逊∩烁恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵辆影,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我黍特,道長(zhǎng)蛙讥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任灭衷,我火速辦了婚禮次慢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己迫像,他們只是感情好劈愚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著闻妓,像睡著了一般菌羽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上由缆,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天注祖,我揣著相機(jī)與錄音,去河邊找鬼均唉。 笑死是晨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舔箭。 我是一名探鬼主播罩缴,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼层扶!你這毒婦竟也來(lái)了靴庆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怒医,失蹤者是張志新(化名)和其女友劉穎炉抒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體稚叹,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焰薄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扒袖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塞茅。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖季率,靈堂內(nèi)的尸體忽然破棺而出野瘦,到底是詐尸還是另有隱情,我是刑警寧澤飒泻,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布鞭光,位于F島的核電站,受9級(jí)特大地震影響泞遗,放射性物質(zhì)發(fā)生泄漏惰许。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一史辙、第九天 我趴在偏房一處隱蔽的房頂上張望汹买。 院中可真熱鬧佩伤,春花似錦、人聲如沸晦毙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)见妒。三九已至孤荣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徐鹤,已是汗流浹背垃环。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留返敬,地道東北人遂庄。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像劲赠,于是被迫代替她去往敵國(guó)和親涛目。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353