iOS國際化處理

最近被安排處理一下舊項目的國際化處理数焊。寫篇文章記錄下心得乍惊,也希望能為遇到問題的你提供點思路蔫耽。開始進入正題撩炊。

國際化處理分為兩種設(shè)置形式:
一: 國際化處理是使應用程序本身在不同的語言系統(tǒng)下展現(xiàn)出不同的語言狀態(tài)外永。例如機主設(shè)備為中文狀態(tài),那么我們的APP內(nèi)部涉及到的信息展示和提示都是用中文提示拧咳。
二:APP內(nèi)部提供設(shè)置界面伯顶,用戶手動來設(shè)置自己需要的語言模式。

Snip20170311_1.png

設(shè)置步驟

  1. 添加語言支持(系統(tǒng)默認支持英文環(huán)境)
Snip20170311_3.png

2.創(chuàng)建語言支持文件

創(chuàng)建新文件骆膝,InfoPlist.strings和Localizable.strings文件

Snip20170311_4.png

我們先來解釋下這兩個.strings文件分別是什么作用祭衩。

Snip20170311_6.png

infoPlist.strings是用來設(shè)置APP的應用名稱的相關(guān)信息的
我們在這里配置應用APP在不同語言系統(tǒng)下展示的名稱。


Snip20170311_7.png

文件配置

Snip20170311_17.png

如圖我們可以讓自己的app在安裝后展示的名稱根據(jù)系統(tǒng)語言來自動顯示阅签。這些信息就是在infoPlist.strings文件中配置的掐暮。或許你會發(fā)現(xiàn)我的圖片中的兩個.strings文件會有一個下拉小三角政钟,這是因為你還需要一步配置路克。

Snip20170311_5.png

選中你的.strings 文件(InfoPlist.strings和Localizable.strings的處理方式一致),如上圖點擊箭頭指向的 Localize...按鈕养交,會有彈窗提示精算。


Snip20170311_8.png

我選擇右側(cè)的按鈕就行了 Localize
此時剛才的位置會出現(xiàn)如下選項

Snip20170311_9.png

我們分別選擇我們的目標語言就行了 勾選完之后對應的.strings文件下就會生成對應的文件。


Snip20170311_10.png

此時我們的基本文件配置已經(jīng)完成碎连。(這里需要提示一點:InfoPlist.stirngs文件的命名必須嚴格按照格式字母命名殖妇。Localizable.strings的命名也建議使用(Localizable)因為接下來回用到,如果你沒有按照這個命名規(guī)格破花,那么在使用的時候就要注意一個參數(shù)的設(shè)置了谦趣。接下來回提示到。)

代碼實現(xiàn)

我們先來簡單了解小國際化實現(xiàn)的 內(nèi)部邏輯座每。我們上述配置的文件生成之后 系統(tǒng)會自動生成對應語言的.lproj文件前鹅。

Snip20170311_11.png

它內(nèi)部就是對應的.strings文件,當我們設(shè)置指定的語言系統(tǒng)之后峭梳,需要通過系統(tǒng)方法指定到對應的文件中來獲取我們的關(guān)鍵字所對應的信息舰绘。我們先來看一下.strings的配置項

Snip20170311_12.png

如圖我們在獲取相同的關(guān)鍵字時在不同語言系統(tǒng)下對應的值 是不同的。系統(tǒng)就是通過這種方式實現(xiàn)多系統(tǒng)的對應顯示葱椭。

核心代碼實現(xiàn)

.h文件

xxx.h
// ----- 多語言設(shè)置  
#define CHINESE @"zh-Hans"
#define ENGLISH @"en"
#define GDLocalizedString(key) [[GDLocalizableController bundle] localizedStringForKey:(key) value:@"" table:nil]
#import <Foundation/Foundation.h>
@interface GDLocalizableController : NSObject

+(NSBundle *)bundle;//獲取當前資源文件

+(void)initUserLanguage;//初始化語言文件

+(NSString *)userLanguage;//獲取應用當前語言

+(void)setUserlanguage:(NSString *)language;//設(shè)置當前語言

@end

.m文件

xxx.m文件
@implementation GDLocalizableController
static NSBundle *bundle = nil;
+(NSBundle  *)bundle{
   return bundle;
}
+(void)initUserLanguage{
   NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
   NSString *string = [def valueForKey:@"userLanguage"];
   if(string.length == 0){
       //獲取系統(tǒng)當前語言版本
       NSArray* languages = [def objectForKey:@"AppleLanguages"];
       NSString *current = [languages objectAtIndex:0];
       if ([current containsString:@"zh-Hans"] == YES) {
           current = @"zh-Hans";
       }else{
           current = @"en";
       }
       string = current;
       [def setValue:current forKey:@"userLanguage"];
       [def synchronize];//持久化捂寿,不加的話不會保存
   }
   //獲取文件路徑
   NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@"lproj"];
   bundle = [NSBundle bundleWithPath:path];//生成bundle
}

+(NSString *)userLanguage{
   NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
   NSString *language = [def valueForKey:@"userLanguage"];
   return language;
}

+(void)setUserlanguage:(NSString *)language{
   NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
   //1.第一步改變bundle的值
   NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj" ];
   bundle = [NSBundle bundleWithPath:path];
   //2.持久化
   [def setValue:language forKey:@"userLanguage"];
   [def synchronize];
}
@end

注意點

如果你在創(chuàng)建文件的時候沒有按照上述標準命名那么你在使用這個宏定義的時候。

GDLocalizedString(key) [[GDLocalizableController bundle] localizedStringForKey:(key) value:@"" table:nil]

里面table的參數(shù)就是你的文件名稱孵运。如果你的命名是Localizable.strings那么這里的table參數(shù)就可以是nil

使用說明

    self.btnChange.newText = GDLocalizedString(@"切換語言");
    self.lblTwo.newText = GDLocalizedString(@"測試二");
    self.lblOne.newText = GDLocalizedString(@"我是測試顯示");

使用這種方式賦值 會根據(jù)系統(tǒng)當前的語言系統(tǒng)來返回對應的值秦陋。


Snip20170311_12.png

上述代碼用到一個按鈕的分類(UILable同理實現(xiàn))

#import "UIButton+Localizable.h"
@implementation UIButton(Localizable)
-(void)setNewText:(NSString *)newText{
    [self setTitle:GDLocalizedString(newText) forState:0];
}
@end

當你處理切換語言事件后 去改變用戶設(shè)置就行了

 if ([[GDLocalizableController userLanguage] isEqualToString:@"en"]) {
        [GDLocalizableController setUserlanguage:CHINESE];
    }else{
        [GDLocalizableController setUserlanguage:ENGLISH];
    }
Snip20170311_16.png

基本使用 就是這些了,希望能為你提供思路

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末治笨,一起剝皮案震驚了整個濱河市驳概,隨后出現(xiàn)的幾起案子患整,更是在濱河造成了極大的恐慌膏萧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狂秦,死亡現(xiàn)場離奇詭異般眉,居然都是意外死亡辈赋,警方通過查閱死者的電腦和手機策精,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門凯沪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人果录,你說我怎么就攤上這事腌闯。” “怎么了雕憔?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長糖声。 經(jīng)常有香客問我斤彼,道長,這世上最難降的妖魔是什么蘸泻? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任琉苇,我火速辦了婚禮,結(jié)果婚禮上悦施,老公的妹妹穿的比我還像新娘并扇。我一直安慰自己,他們只是感情好抡诞,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布穷蛹。 她就那樣靜靜地躺著,像睡著了一般昼汗。 火紅的嫁衣襯著肌膚如雪肴熏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天顷窒,我揣著相機與錄音蛙吏,去河邊找鬼。 笑死鞋吉,一個胖子當著我的面吹牛鸦做,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谓着,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼泼诱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赊锚?” 一聲冷哼從身側(cè)響起坷檩,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤却音,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矢炼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體系瓢,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年句灌,在試婚紗的時候發(fā)現(xiàn)自己被綠了夷陋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡胰锌,死狀恐怖骗绕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情资昧,我是刑警寧澤酬土,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站格带,受9級特大地震影響撤缴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叽唱,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一屈呕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棺亭,春花似錦虎眨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凄敢,卻和暖如春涤躲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贡未。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工种樱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俊卤。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓嫩挤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親消恍。 傳聞我的和親對象是個殘疾皇子岂昭,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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