App要國際推廣,需要支持多語言申屹』嬷ぃ可以通過本地化語言和切換來實(shí)現(xiàn)。配置本地化語言也是比較簡單哗讥,通過下面幾步可以簡單實(shí)現(xiàn):
一:配置項(xiàng)目本地化支持簡體中文和英文
-
工程-PROJECT-info->Localizations嚷那,點(diǎn)“+”,選擇(Chinese(Simplified))添加簡體中文忌栅,英文Xcode自帶有(English)车酣,所以不需要再次添加曲稼。
二:添加多語言文件
- 我們選擇使用自己的語言文件索绪,所以要創(chuàng)建一個后綴為
.strings
文件; - 需要可以手動切換語言,而不是根據(jù)系統(tǒng)語言變換贫悄,所以命名不能為
Localizable.strings
瑞驱; - 文件取名為
Language.strings
(自己隨意命名,后綴為:.strings
)(記得Targets
要勾選項(xiàng)目)窄坦。
三:配置Language.strings本地化唤反,支持簡體中文和英文。
- 選中
Language.strings
文件鸭津,查看Xcode右側(cè)邊欄信息彤侍; - 點(diǎn)擊
Localization
中的Localize…
按鈕; - 選擇
Base
或中文或英文 然后Localize
逆趋; - 勾選中文和英文盏阶,
Base
項(xiàng)可有可無,都選擇UseFile
闻书。
這時候Language.strings
會多出兩個子文件名斟,分別對應(yīng)英文和簡體中文。在項(xiàng)目工程文件夾中也會看到兩個文件夾en.lproj
和zh-Hans.lproj
魄眉。這兩個文件夾不要復(fù)制其他項(xiàng)目的砰盐,因?yàn)檫@兩個文件跟本項(xiàng)目工程文件相關(guān)聯(lián),直接復(fù)制過來會讀取不到里面的.strings
文件坑律。當(dāng)然岩梳,直接復(fù)制里面的內(nèi)容是可以的。
四:在Language.strings添加并完善所有需要轉(zhuǎn)換的文字
- 每個字段都以分號間隔,因?yàn)椴皇荗C文件所以不需要使用@表示字符串冀值;
- “key鍵”=“value值”淘捡,鍵可以用中文,也可有用英文池摧,性能有沒差別看不出焦除。
五:寫個宏定義,用來讀取語言文件和返回的value值作彤。宏最好是全局的膘魄,畢竟在一個項(xiàng)目里會有多個文件會用到。
#define Localized(key) [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]] localizedStringForKey:(key) value:nil table:@"Language"]
六:保存當(dāng)前使用語言到NSUserDefaults
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 在AppDelegate.m文件didFinishLaunchingWithOptions獲取當(dāng)前手機(jī)語言竭讳,并存儲到NSUserDefaults创葡。
if (![[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"]) {
NSArray *languages = [NSLocale preferredLanguages];
NSString *language = [languages objectAtIndex:0];
if ([language hasPrefix:@"zh-Hans"]) {
//開頭匹配
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];
}else{
[[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"];
}
}
return YES;
}
七:創(chuàng)建并初始化UI控件
在ViewController.m
創(chuàng)建并初始化UILabel
用于顯示多語言文字,UIButton
切換語言按鈕及響應(yīng)事件绢慢。
讀取根據(jù)語言文件鍵值獲取返回值灿渴,使用方法:Localized(key)
。
八:添加通知中心
接收到通知的時候響應(yīng)事件胰舆,也可用不用通知做骚露,直接在按鈕點(diǎn)擊事件添加語言切換操作。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLanguage) name:@"changeLanguage" object:nil];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
九:添加切換語言事件
在ViewController.m
創(chuàng)建并初始化UILabel
用于顯示多語言文字缚窿,UIButton
切換語言按鈕及響應(yīng)事件棘幸。
// 按鈕點(diǎn)擊事件
- (void)btnClick
{
//修改本地獲取的語言文件-交替
NSString *language = [[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"];
if ([language isEqualToString: @"en"]) {
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];
}else {
[[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"];
}
[[NSUserDefaults standardUserDefaults] synchronize];
[[NSNotificationCenter defaultCenter] postNotificationName:@"changeLanguage" object:nil];
}
十:收到語言切換通知做相應(yīng)處理
- 因?yàn)槭且⑿滤性噲D,所以之前的所有試圖都要重新初始化倦零,需要重新設(shè)置
window.rootViewController
- 為了不再重復(fù)代碼误续,就直接調(diào)用
AppDelegate
的toMain
(重新加載窗口方法)方法,來設(shè)rootViewController
- (void)changeLanguage
{
/*
// 全局重置
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
// 重新加載主控制器
[delegate toMain];
// 設(shè)置選中第幾個vc
delegate.tabbarCtr.selectedIndex = 1;
// 部分重置
label.text = [NSString stringWithFormat:@"我的手機(jī)是=%@",Localized(@"apple")];
}