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名稱?,F(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容