需求
對(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文件:
點(diǎn)擊剛剛創(chuàng)建的Localizable.strings文件,點(diǎn)擊以下紅框:
默認(rèn)只支持英文的:
-
第二步:設(shè)置Localizable.strings多語(yǔ)言支持:
選擇需要支持的語(yǔ)言操漠,比如說(shuō)Chinese(Simlified)/Chinese(Traditional):
本處只需要支持三種:英文收津、簡(jiǎn)體中文、繁體中文,那配置結(jié)果如下圖:
-
第三步:設(shè)置Localizable.strings國(guó)際化的內(nèi)容朋截,以鍵值對(duì)的形式來(lái)設(shè)置:
以上屬于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ǔ)的按鈕剧蹂,效果:
-
點(diǎn)擊了配置簡(jiǎn)體中文按鈕声功,效果:
-
點(diǎn)擊了配置繁體中文按鈕,效果:
附帶其他的國(guó)際化:
3分鐘實(shí)現(xiàn)iOS語(yǔ)言本地化/國(guó)際化(圖文詳解)
以上3璧稹O劝汀!