iOS 國(guó)際化(App內(nèi)語(yǔ)言切換)[轉(zhuǎn)]

原文鏈接:http://www.reibang.com/p/66618c845107

想要實(shí)現(xiàn)App內(nèi)的語(yǔ)言切換功能,那么首先要?jiǎng)?chuàng)建國(guó)際化語(yǔ)言文件葛峻,用于存儲(chǔ)對(duì)應(yīng)語(yǔ)言顯示的文本说搅。
1理肺、創(chuàng)建國(guó)際化語(yǔ)言文件
command+N乃摹,選擇Other里面的Empty文件。

image

我們將其命名為L(zhǎng)ocalizable.strings
選中剛才創(chuàng)建的文件赢乓,在其右側(cè)的的屬性欄中點(diǎn)擊Localize按鈕。

image

2石窑、設(shè)置項(xiàng)目需要支持的語(yǔ)言
選中project--->info--->Localization牌芋。
我們會(huì)發(fā)現(xiàn)里面默認(rèn)有一個(gè)英語(yǔ),我們可以點(diǎn)擊左下角的?號(hào)添加支持的語(yǔ)言松逊。

image

點(diǎn)擊+號(hào)躺屁,選擇簡(jiǎn)體中文。

image

默認(rèn)全選经宏,點(diǎn)擊完成即可:

image

這時(shí)我們展開Localizable.strings犀暑、Main.storyboard和LaunchScreen.storyboard驯击,會(huì)看到多了一些文件。

image

3耐亏、文本國(guó)際化

image
image

大家看這個(gè)可能會(huì)有疑問徊都,不知道是什么意思。
"首頁(yè)" = "首頁(yè)";
"首頁(yè)" = "Homepage";
其實(shí)這兩個(gè)是一個(gè)文本的不同語(yǔ)言的展示广辰∠窘茫“=”號(hào)左面的相當(dāng)于key值;“=”號(hào)右面的相當(dāng)于value值择吊。不過為了使用方便李根,更容易理解,我這里直接使用了中文的內(nèi)容作為key值几睛。
使用方法的話:NSLocalizedString(@"首頁(yè)", nil);
這樣房轿,在中文語(yǔ)言的時(shí)候返回“首頁(yè)”(中文),在英文語(yǔ)言中返回“ Homepage”(英文)所森。

如果你是用xib或者Storyboard展示文本的話囱持,想要文本國(guó)際化展示的話,需要另外的方法必峰。

image

首先選中xib或者Storyboard洪唐,選中需要支持的語(yǔ)言。

image
image

我們可以看到對(duì)應(yīng)的文件里面有對(duì)應(yīng)的顯示文本吼蚁。如果要想xib隨著設(shè)置的不同語(yǔ)言展示不同的文本的話凭需,可以在這兩個(gè)文件中修改。

4肝匆、本地存儲(chǔ)語(yǔ)言設(shè)置
使用NSUserDefaults存儲(chǔ)本地語(yǔ)言設(shè)置粒蜈。
直接上代碼:這是一位大神分享的代碼,我復(fù)制了一份旗国,效果很不錯(cuò)枯怖,看原文請(qǐng)點(diǎn)這里原文.

存儲(chǔ)、獲取能曾、重置本地語(yǔ)言設(shè)置

#import <Foundation/Foundation.h>

@interface UWConfig : NSObject

/**
 用戶自定義使用的語(yǔ)言度硝,當(dāng)傳nil時(shí),等同于resetSystemLanguage
 */
@property (class, nonatomic, strong, nullable) NSString *userLanguage;

/**
 重置系統(tǒng)語(yǔ)言
 */
+ (void)resetSystemLanguage;

@end

#import "UWConfig.h"

static NSString *const UWUserLanguageKey = @"UWUserLanguageKey";
#define STANDARD_USER_DEFAULT  [NSUserDefaults standardUserDefaults]

@implementation UWConfig

+ (void)setUserLanguage:(NSString *)userLanguage
{
    //跟隨手機(jī)系統(tǒng)
    if (!userLanguage.length) {
        [self resetSystemLanguage];
        return;
    }
    //用戶自定義
    [STANDARD_USER_DEFAULT setValue:userLanguage forKey:UWUserLanguageKey];
    [STANDARD_USER_DEFAULT setValue:@[userLanguage] forKey:@"AppleLanguages"];
    [STANDARD_USER_DEFAULT synchronize];
}

+ (NSString *)userLanguage
{
    return [STANDARD_USER_DEFAULT valueForKey:UWUserLanguageKey];
}

/**
 重置系統(tǒng)語(yǔ)言
 */
+ (void)resetSystemLanguage
{
    [STANDARD_USER_DEFAULT removeObjectForKey:UWUserLanguageKey];
    [STANDARD_USER_DEFAULT setValue:nil forKey:@"AppleLanguages"];
    [STANDARD_USER_DEFAULT synchronize];
}

@end

切換bundle

#import <Foundation/Foundation.h>

@interface NSBundle (UWUtils)

+ (BOOL)isChineseLanguage;

+ (NSString *)currentLanguage;

@end

#import "NSBundle+UWUtils.h"
#import "UWConfig.h"
#import <objc/runtime.h>

@interface UWBundle : NSBundle

@end

@implementation NSBundle (UWUtils)

+ (BOOL)isChineseLanguage
{
    NSString *currentLanguage = [self currentLanguage];
    if ([currentLanguage hasPrefix:@"zh-Hans"]) {
        return YES;
    } else {
        return NO;
    }
}

/*
 *  設(shè)置默認(rèn)語(yǔ)言類型
 */
+ (NSString *)currentLanguage
{
//    return [UWConfig userLanguage] ? : [NSLocale preferredLanguages].firstObject;
    return [UWConfig userLanguage] ? : @"zh-Hans";
}

+ (void)load
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //動(dòng)態(tài)繼承寿冕、交換蕊程,方法類似KVO,通過修改[NSBundle mainBundle]對(duì)象的isa指針驼唱,使其指向它的子類UWBundle藻茂,這樣便可以調(diào)用子類的方法;其實(shí)這里也可以使用method_swizzling來交換mainBundle的實(shí)現(xiàn),來動(dòng)態(tài)判斷辨赐,可以同樣實(shí)現(xiàn)优俘。
        object_setClass([NSBundle mainBundle], [UWBundle class]);
    });
}

@end

@implementation UWBundle

- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
    if ([UWBundle uw_mainBundle]) {
        return [[UWBundle uw_mainBundle] localizedStringForKey:key value:value table:tableName];
    } else {
        return [super localizedStringForKey:key value:value table:tableName];
    }
}

+ (NSBundle *)uw_mainBundle
{
    if ([NSBundle currentLanguage].length) {
        NSString *path = [[NSBundle mainBundle] pathForResource:[NSBundle currentLanguage] ofType:@"lproj"];
        if (path.length) {
            return [NSBundle bundleWithPath:path];
        }
    }
    return nil;
}

@end

5、使用方式
當(dāng)切換app語(yǔ)言的時(shí)候掀序,先存儲(chǔ)本地語(yǔ)言的設(shè)置帆焕;然后刷新界面即可。

- (IBAction)simplifiedChinese:(UIButton *)sender {
    [UWConfig setUserLanguage:@"zh-Hans"];

    // 刷新界面
    [self reloadTabBarViewController];
}

- (IBAction)english:(UIButton *)sender {
    [UWConfig setUserLanguage:@"en"];

    // 刷新界面
    [self reloadTabBarViewController];
}

刷新界面
我這兒是直接刷新了tabBar控制器森枪。

- (void)reloadTabBarViewController {

    UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];

    UITabBarController *tbc = [storyBoard instantiateInitialViewController];
    // 跳轉(zhuǎn)到個(gè)人中心頁(yè)面(即設(shè)置語(yǔ)言的那個(gè)tabBarItem)
    tbc.selectedIndex = self.tabBarController.selectedIndex;

    // 創(chuàng)建設(shè)置頁(yè)面
    UIViewController *settingVC = [storyBoard instantiateViewControllerWithIdentifier:@"setting"];
    settingVC.hidesBottomBarWhenPushed = YES;

    // 創(chuàng)建語(yǔ)言選擇界面
    FiFLanguageController *languageVC = [storyBoard instantiateViewControllerWithIdentifier:@"chooseLanguage"];
    languageVC.hidesBottomBarWhenPushed = YES;

    UINavigationController *nvc = tbc.selectedViewController;

    // 備用
    NSMutableArray *vcs = nvc.viewControllers.mutableCopy;
    [vcs addObjectsFromArray:@[settingVC, languageVC]];

    //解決奇怪的動(dòng)畫bug视搏。異步執(zhí)行
    dispatch_async(dispatch_get_main_queue(), ^{

        //注意刷新rootViewController的時(shí)機(jī),在主線程異步執(zhí)行
        //先刷新rootViewController
        [UIApplication sharedApplication].keyWindow.rootViewController = tbc;

        //然后再給個(gè)人中心的nvc設(shè)置viewControllers
        nvc.viewControllers = vcs;
    });
}

ok县袱,結(jié)束了浑娜!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市式散,隨后出現(xiàn)的幾起案子筋遭,更是在濱河造成了極大的恐慌,老刑警劉巖暴拄,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漓滔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡乖篷,警方通過查閱死者的電腦和手機(jī)响驴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撕蔼,“玉大人豁鲤,你說我怎么就攤上這事【ň冢” “怎么了琳骡?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)讼溺。 經(jīng)常有香客問我楣号,道長(zhǎng),這世上最難降的妖魔是什么怒坯? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任炫狱,我火速辦了婚禮,結(jié)果婚禮上剔猿,老公的妹妹穿的比我還像新娘毕荐。我一直安慰自己,他們只是感情好艳馒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般弄慰。 火紅的嫁衣襯著肌膚如雪第美。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天陆爽,我揣著相機(jī)與錄音什往,去河邊找鬼。 笑死慌闭,一個(gè)胖子當(dāng)著我的面吹牛别威,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驴剔,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼省古,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了丧失?” 一聲冷哼從身側(cè)響起豺妓,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎布讹,沒想到半個(gè)月后琳拭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡描验,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年白嘁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膘流。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡絮缅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出睡扬,到底是詐尸還是另有隱情盟蚣,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布卖怜,位于F島的核電站屎开,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏马靠。R本人自食惡果不足惜奄抽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甩鳄。 院中可真熱鬧逞度,春花似錦、人聲如沸妙啃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至馆匿,卻和暖如春抑胎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渐北。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工阿逃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赃蛛。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓恃锉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親呕臂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子破托,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容