iOS實(shí)現(xiàn)語言本地化

APP語言本地化炮叶,即語言國際化哥遮。指的是根據(jù)用戶操作系統(tǒng)的語言設(shè)置笨使,自動將APP的語言設(shè)置為和操作系統(tǒng)一致的語言環(huán)境。開發(fā)過程中包括以下本地化設(shè)置:

  • App名稱本地化
  • App中文字內(nèi)容本地化
  • 圖片本地化
  • Storyboard/Xib本地化

一竞阐、本地化基本設(shè)置:

  1. 通過Project→Info→Localizations缴饭,點(diǎn)擊“+”添加需要本地化/國際化的語言。Xcode默認(rèn)需要勾選Use Base Internationalization(使用基本國際化),如下圖:
image

注:如果勾選Use Base Internationalization馁菜,則如果未特別設(shè)置本地化語言茴扁,就使用Base選項(xiàng)配置。

  • 下圖為選擇添加本地化語言:

    Xcode創(chuàng)建工程汪疮,默認(rèn)開發(fā)語言為English,并選中Base選項(xiàng)峭火,下面手動添加Chinese語言。

image
  • 彈出如下對話框智嚷,直接點(diǎn)擊finish卖丸,如下圖:

    注:由下圖可見,我們將Main.Stroyboard和LaunchScreen.Storyboard添加進(jìn)Chinese語言配置文件中

image

二盏道、App名稱本地化:

應(yīng)用名稱本地化稍浆,是指同一個(gè)App的名稱,在手機(jī)不同的語言環(huán)境下顯示不同的名稱猜嘱。比如衅枫,微信在簡體中文環(huán)境下App名稱顯示為“微信”,在英語環(huán)境下顯示為“weChat”朗伶。

  1. 選中info.plist文件弦撩。按Command+N。創(chuàng)建文件窗口论皆,找到Strings File創(chuàng)建選項(xiàng)益楼,并創(chuàng)建名稱為InfoPlist.strings文件。

    image

  2. 創(chuàng)建InfoPlist.strings文件后点晴,在左側(cè)工程文件列表中感凤,如下圖:


    image
  3. 然后選中InfoPlist.strings,在Xcode右側(cè)文件檢查器中點(diǎn)擊Localize粒督,選擇需要本地化的語言陪竿。

    image

  4. 然后再右側(cè)Localization中勾選所有本地化語言,并查看左側(cè)文件列表坠陈,可發(fā)現(xiàn)InfoPlist.stirings左側(cè)多了一個(gè)箭頭萨惑,點(diǎn)擊箭頭可以展開,顯示支持的本地化語言仇矾。


    image
  5. 接下來庸蔼,我們分別用不同的語言給InfoPlist.strings下的文件設(shè)置對應(yīng)的名字

  • InfoPlist.strings(English)中添加代碼
// App在英語環(huán)境環(huán)境下顯示的名稱
CFBundleDisplayName = "TestDemo";
English
  • InfoPlist.strings(Chinese,simplified)中添加代碼
// App在中文環(huán)境環(huán)境下顯示的名稱
CFBundleDisplayName = "測試";
Chinese
  1. 最終效果:
  • 系統(tǒng)語言為英語:
English
  • 系統(tǒng)語言為簡體中文:
Chinese

注:以前本地化App名稱,需要在Info.plist文件中增加一個(gè)名為“Application has localized display name”的BOOL類型的Key贮匕,并且需要將其值設(shè)置為YES姐仅,目的是讓App支持本地化App名稱。現(xiàn)在這個(gè)已經(jīng)不需要配置了

三、App中文字內(nèi)容本地化

指的是App內(nèi)的字符串文字在不同的系統(tǒng)語言環(huán)境下顯示不同的內(nèi)容掏膏,例如“主頁”在簡體中文的語言環(huán)境下顯示“主頁”劳翰,在英語環(huán)境下顯示“home”,下面簡單介紹下如何設(shè)置本地化。

  1. 同樣需要添加strings類型文件馒疹,和設(shè)值displayName本地化相同按鍵 Command + N,創(chuàng)建名稱為Localizable.strings文件佳簸;

  2. 文件創(chuàng)建成功,查看Xcode左側(cè)文件列表颖变,就會發(fā)現(xiàn)多了一個(gè)名為Localizable.strings的文件生均;

    image
  3. 選中Localizable.strings文件,在Xcode右側(cè)點(diǎn)擊Localize腥刹,來選擇設(shè)置我們需要本地化的語言

    image
  4. 然后我們發(fā)現(xiàn)Xcode的右側(cè)配置列表如下圖马胧;

    image
  5. 然后Xcode左側(cè)的Localizable.stirings左側(cè)多了一個(gè)箭頭,展開后衔峰,如下圖所示佩脊;

    image
  6. Localizable.stirings中設(shè)置本地化詳細(xì)顯示內(nèi)容;

    • Localizable.strings(English)中添加代碼:

      "click" = "click";
      
    • Localizable.strings(Chinese,simplified)中添加代碼:

      "click" = "點(diǎn)擊";
      
  7. 在使用時(shí)垫卤,需要使用NSLocalizedString(key, comment)這個(gè)宏根據(jù)Key獲取對應(yīng)的字符串威彰,然后賦值給代碼中的字符串。

    // NSlocalizeString 第一個(gè)參數(shù)是內(nèi)容,根據(jù)第一個(gè)參數(shù)去對應(yīng)語言的文件中取對應(yīng)的字符串穴肘,第二個(gè)參數(shù)將會轉(zhuǎn)化為字符串文件里的注釋抱冷,可以傳nil,也可以傳空字符串@""梢褐。
    #define NSLocalizedString(key, comment) [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
    

    代碼:

    NSString *_title = NSLocalizedString(@"click", nil);
    self.title = _title;
    NSLog(@"Title:%@",_title);
    

    輸出:

    LocalizationsDemo[2565:164194] Title:點(diǎn)擊
    

    其他相似宏定義:

    #define NSLocalizedString(key, comment) \
         [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
    #define NSLocalizedStringFromTable(key, tbl, comment) \
         [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
    #define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
         [bundle localizedStringForKey:(key) value:@"" table:(tbl)]
    #define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \
         [bundle localizedStringForKey:(key) value:(val) table:(tbl)]
    
    #define NSLocalizedAttributedString(key, comment) \
         [NSBundle.mainBundle localizedAttributedStringForKey:(key) value:@"" table:nil]
    #define NSLocalizedAttributedStringFromTable(key, tbl, comment) \
         [NSBundle.mainBundle localizedAttributedStringForKey:(key) value:@"" table:(tbl)]
    #define NSLocalizedAttributedStringFromTableInBundle(key, tbl, bundle, comment) \
         [bundle localizedAttributedStringForKey:(key) value:@"" table:(tbl)]
    #define NSLocalizedAttributedStringWithDefaultValue(key, tbl, bundle, val, comment) \
         [bundle localizedAttributedStringForKey:(key) value:(val) table:(tbl)]
    
  8. 不同語言環(huán)境下的運(yùn)行結(jié)果:

    • 系統(tǒng)語言為英語:

      English
    • 系統(tǒng)語言為簡體中文:

      Chinese

四、圖片本地化

圖片本地化現(xiàn)在有兩種設(shè)置方式赵讯。

  • 方式一:與本地化內(nèi)容中字符串相同盈咳,通過NSLocalizedString(key,comment)來獲取相應(yīng)的字符串,然后根據(jù)這個(gè)字符串再獲取圖片边翼。

    NSString *imageName = NSLocalizedString(@"icon", nil);
    UIImage *image = [UIImage imageNamed:imageName];
    self.imageView.image = image;
    
    // Localizable.strings 中設(shè)置
    //Localizable.strings(English)中添加代碼:
    "click" = "click";
    "icon" = "English";
    //Localizable.strings(Chinese,simplified)中添加代碼:
    "click" = "點(diǎn)擊";
    "icon" = "chinese";
    
  • 方式二:添加需要本地化的語言

    1. 將圖片拖入工程鱼响,例如將圖片命名為"icon.png";

    2. 選中圖片,展開Xcode右側(cè)配置列表组底,點(diǎn)擊Localize丈积,配置本地語言為English

    3. 由鍵icon.png债鸡,選擇show in Finder,發(fā)現(xiàn)在en.Iproj文件中多了一個(gè)名為icon.png的圖片江滨,如下圖

      image
    4. 查看zh-Hans.lproj中沒有icon.png圖片,如下圖

      image
    5. 這時(shí)我們需要向zh-Hans.lproj文件中添加一個(gè)與icon.png相同命名的圖片厌均;

    6. 然后把zh-Hans.Iproj中的icon.png拖到Xcode中,放在原來icon.png圖片下面唬滑,如下圖;

      QQ20211116-145559

      左側(cè)文件顯示:

      QQ20211116-145644
    7. 最終的代碼使用:

      #import "ViewController.h"
      @interface ViewController ()
      @property (nonatomic, weak) IBOutlet UILabel *lblInfo;
      @property (nonatomic, weak) IBOutlet UIImageView *imageView;
      @end
      @implementation ViewController
      
      - (void)viewDidLoad {
          [super viewDidLoad];
          NSString *imageName = NSLocalizedString(@"icon", nil);
          UIImage *image = [UIImage imageNamed:imageName];
          self.imageView.image = image;
      }
      @end
      
    8. 結(jié)果展示:

      簡體中文
      英文

五、Storyboard/Xib本地化

  1. 選中需要的本地化的Storyboard文件晶密,在Xcode右側(cè)配置列表中的loaclize配置本地?fù)Q語言擒悬;

    image

    注:創(chuàng)建新工程時(shí)默認(rèn)選中Use Base Internationalization 默認(rèn)被選中,所以Localization中默認(rèn)選中Base稻艰。所以Main.storyboardLaunchScreen.storyboard默認(rèn)在Base.lproj文件夾中懂牧。

  2. Localization中勾選EnglishChinese,Simplified,表示項(xiàng)目支持英文和簡體中文本地化語言尊勿。此時(shí)文件列表的樣式僧凤,如下圖;

    image
  3. 此時(shí)本地化配置完成运怖,可以進(jìn)行差異化處理拼弃。

六、其他技巧

  • Use Base Internationalization的作用:

    作用:把文本從.storyboard.xib文件中分離出來

    1. 如果不選中Use Base Internationalization摇展,那么在添加本地化語言的時(shí)候吻氧,會創(chuàng)建多個(gè)相應(yīng)語言的storyboardxib咏连,那么我們還可以調(diào)整不同語言下的界面布局及顯示內(nèi)容盯孙。
    1. 如果選中Use Base Internationalization,那么在添加語言的時(shí)候祟滴,會把當(dāng)前的storyboard振惰、xib中的文本提取出來放入Base.lproj文件夾中,我們只需要在相應(yīng)的新增的.strings文件中改變對應(yīng)的文本即可垄懂。
  • 如何讓系統(tǒng)加載自定義的本地化文件而非系統(tǒng)默認(rèn)的Localizable.strings呢骑晶?
    1. 需要使用的宏定義:
    #define NSLocalizedStringFromTable(key, tbl, comment) [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
    
    1. 創(chuàng)建自定義的strings文件:創(chuàng)建過程同上面的流程。

      image

      使用代碼:

      @interface ViewController ()
      @property (nonatomic, weak) IBOutlet UILabel *lblInfo;
      @end
      @implementation ViewController
      - (void)viewDidLoad {
          [super viewDidLoad];
          // Do any additional setup after loading the view.
          NSString *_title = NSLocalizedString(@"click", nil);
          self.title = _title;
          NSLog(@"Title:%@",_title);
          _lblInfo.text = NSLocalizedStringFromTable(@"title", @"custom", nil);
      }
      @end
      

      運(yùn)行效果:

      簡體中文
      英文
  • 通過project.pbxproj修改默認(rèn)開發(fā)語言:
    1. 在Xcode中右鍵.xcodeproj文件草慧,選擇Show in Finder桶蛔,打開文件夾,右鍵文件夾中.xcodeproj漫谷,選擇”顯示包內(nèi)容“仔雷,雙擊打開project.pbxproj文件,找到developmentRegion變量并修改其值舔示,修改development Language 默認(rèn)配置碟婆。將en修改為zh-Hans,則會將開發(fā)語言配置為簡體中文。

      image
  • 查看惕稻,切換本地語言:
     // 切換語言前
     NSArray *languages = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"];
    NSString *currentLanguage = languages.firstObject;
    NSLog(@"模擬器當(dāng)前語言:%@",currentLanguage);
        
    // 切換語言
    NSArray *lans = @[@"en"];
    [[NSUserDefaults standardUserDefaults] setObject:lans forKey:@"AppleLanguages"];
       
    // 切換語言后
    NSArray *langArr2 = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"];
    NSString *language2 = langArr2.firstObject;
    NSLog(@"模擬器語言切換之后:%@",language2);
    

    輸出結(jié)果:

    2021-11-16 15:16:01.855872+0800 LocalizationsDemo[3344:198537] 模擬器當(dāng)前語言:zh-Hans-CN
    2021-11-16 15:16:01.864635+0800 LocalizationsDemo[3344:198537] 模擬器語言切換之后:en
    

七竖共、參考文獻(xiàn)

3分鐘實(shí)現(xiàn)iOS語言本地化/國際化
iOS 本地化(IB篇)
App Store介紹頁中顯示的語言列表如何設(shè)置

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市俺祠,隨后出現(xiàn)的幾起案子肘迎,更是在濱河造成了極大的恐慌甥温,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妓布,死亡現(xiàn)場離奇詭異姻蚓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)匣沼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門狰挡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人释涛,你說我怎么就攤上這事加叁。” “怎么了唇撬?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵它匕,是天一觀的道長。 經(jīng)常有香客問我窖认,道長豫柬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任扑浸,我火速辦了婚禮烧给,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喝噪。我一直安慰自己础嫡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布酝惧。 她就那樣靜靜地躺著榴鼎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晚唇。 梳的紋絲不亂的頭發(fā)上勋乾,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天茶鉴,我揣著相機(jī)與錄音塑娇,去河邊找鬼晚吞。 笑死桥言,一個(gè)胖子當(dāng)著我的面吹牛萌踱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播号阿,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼并鸵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扔涧?” 一聲冷哼從身側(cè)響起园担,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤届谈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后弯汰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艰山,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年咏闪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了曙搬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸽嫂,死狀恐怖纵装,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情据某,我是刑警寧澤橡娄,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站癣籽,受9級特大地震影響挽唉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜才避,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一橱夭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桑逝,春花似錦棘劣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寡喝,卻和暖如春糙俗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背预鬓。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工巧骚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人格二。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓劈彪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顶猜。 傳聞我的和親對象是個(gè)殘疾皇子沧奴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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