日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3分钟实现iOS语言本地化/国际化(图文详解)

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3分钟实现iOS语言本地化/国际化(图文详解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

原文

前言

語言本地化,又叫做語言國際化。是指根據用戶操作系統的語言設置,自動將應用程序的語言設置為和用戶操作系統語言一致的語言。往往一些應用程序需要提供給多個國家的人群使用,或者一個國家有多種語言,這就要求應用程序所展示的文字、圖片等信息,能夠讓講不同語言的用戶讀懂、看懂。進而提出為同一個應用程序適配多種語言,也即是國際化。語言國際化之所以又叫做語言本地化,這是站在每個用戶的角度而言的,是指能夠讓用戶本地、本土人群能夠看懂的語言信息,顧名思義,語言本地化。其實語言本地化 == 語言國際化!

本文將分如下7個主要章節一步一步講解如何完全本地化一個App。

  • 配置需要國際化的語言(國際化的準備工作)

  • App名稱本地化

  • 代碼中字符串本地化

  • 多人開發情況下的字符串本地化

  • 圖片本地化(兩種方式兩種方式)

  • 查看/切換本地語言

  • storyboard/xib本地化

配置需要國際化的語言

配置需要國際化的語言,這也是國際化之前的準備工作,無論我們是國際化App名稱、代碼中的字符串、圖片、還是storyboard和xib,都需要進行這一步的準備工作(一個項目中需要且僅需要配置一次)。

選中project->Info->Localizations,然后點擊"+",添加需要國際化/本地化的語言,如下圖(默認需要勾選Use Base Internationalization):

此處以添加法語為例,如下圖:

彈出如下對話框,直接點擊finish,如下圖:

同理,添加簡體中文、繁體中文、韓語,最終結果如下圖:

備注: “zh-Hans”和“zh-Hant”是簡體中文和繁體中文的縮寫。這是標準的縮寫。H可大寫也可小寫。"en"是英語的縮寫。ko是韓語的縮寫,fr是法語的縮寫。其他語言請百度各國語言縮寫即可查詢。

(一)應用名稱本地化/國際化

應用名稱本地化,是指同一個App的名稱,在不同的語言環境下(也就是手機設備的語言設置)顯示不同的名稱。比如,微信在簡體中文環境下App名稱顯示為“微信”,在英語環境下顯示為“weChat”。下面就開始進行應用名稱本地化。

選中Info.plist,按下鍵盤上的command + N,選擇Strings File(iOS->Resource->Strings File)

文件名字命名為InfoPlist,且必須是這個名字(因每個人電腦設置差異,此處本人電腦沒有顯示strings后綴名):

點擊create后,Xcode左側導航列表就會出現名為InfoPlist.strings的文件,如下圖:

選中InfoPlist.strings,在Xcode的File inspection(Xcode右側文件檢查器)中點擊Localize,目的是選擇我們需要本地化的語言,如下圖:

注意:在點擊Localize之前,一定要保證我們已經添加了需要本地化的語言,也就是上面配置需要國際化的語言那一步(步驟:project->Info->Localizations,然后點擊"+",添加需要國際化/本地化的語言)。

點擊Localize后,會彈出一個對話框,展開對話框列表,發現下拉列表所展示的語言正是我們在上面配置的需要國際化的語言,選擇我們需要本地化的語言,然后點擊對話框的Localize按鈕,如下圖:

注意:如果我們沒有在 PROJECT 中配置需要國際化的語言(project->Info->Localizations,然后點擊"+"),上圖下拉列表中將只會出現"Base"和"English"選項,English語言是系統默認的語言,其他需要國際化的語言(例如中文簡體、法語)必須通過上面的配置本地化語言那一步手動添加。

然后我們發現Xcode右側的File inspection變成了下圖的樣式:

接下來,勾選French、Chinese(zh-Hans)、Chinese(zh-Hant)、Korean,如下圖:

此時,Xcode左側的InfoPlist.stirings左側多了一個箭頭,點擊箭頭可以展開,如下圖所示:

從上圖可以看出,InfoPlist.strings文件下包含了English、French、Chinese(Simplified)、Chinese(Traditional)、Korean這五種語言的文件。

原理:程序啟動時,會根據操作系統設置的語言,自動加載InfoPlist.strings文件下對應的語言文件,然后顯示應用程序的名字。

接下來,我們分別用不同的語言給InfoPlist.strings下的文件設置對應的名字。

(1)在InfoPlist.strings(english)中加入如下代碼:

1

2

//?Localizable?App?Name是App在英語環境環境下顯示的名稱

CFBundleDisplayName?=?"Localizable?App?Name";

備注:CFBundleDisplayName可以使用雙引號,也可以不使用雙引號!

(2)在InfoPlist.strings(French)中加入如下代碼:

1

CFBundleDisplayName?=?"Le?nom?de?la?localisation?de?l'App";

(3)在InfoPlist.strings(Chinese(Simplified))中加入如下代碼:

1

CFBundleDisplayName?=?"國際化App名稱";

(4)在InfoPlist.strings(Chinese(Traditional))中加入如下代碼:

1

CFBundleDisplayName?=?"國際化App名稱";

(5)在InfoPlist.strings(Korean)中加入如下代碼:

修改模擬器語言環境為English。App名稱如下圖:

修改模擬器語言環境為Chinese(Simplified)。App名稱如下圖:

修改模擬器語言環境為Chinese(Traditional)。App名稱如下圖:

修改模擬器語言環境為Franch。App名稱如下圖:

修改模擬器語言環境為Korean。App名稱如下圖:

備注:過去本地化App名稱,需要在Info.plist文件中增加一個名為“Application has localized display name”的BOOL類型的Key,并且需要將其值設置為YES(如下圖)。目的是讓App支持本地化App名稱。但現在可以忽略這一步。

至此,本地化App名稱已經演示完畢,其步驟就是:

  • 在Project的設置中通過點擊"+"添加需要本地化的語言。

  • 然后在Xcode右側的File inspection中點擊Localize,選中需要本地化App名稱的語言。

  • 最后在每個語言對應的文件中以key = value(CFBundleDisplayName = "App名稱";);的形式設置App的名稱。

  • (二)代碼中字符串的本地化

    所謂字符串本地化,就是指App內的字符串在不同的語言環境下顯示不同的內容。比如,"主頁"這個字符串在中文語言環境下顯示“主頁”,在英語環境下顯示“home”。下面就開始進行字符串本地化。

    其實字符本地化和App名稱本地化過程如出一轍,只是創建的文件名成不一樣(連同后綴一起,文件名必須是Localizable.strings),其他步驟完全相同。為了能夠讓大家徹底了解,此處還是會把步驟一一貼出來。

    和應用名稱本地化一樣,首先需要command + N,選擇iOS -> Resource -> Strings File

    文件名必須命名為Localizable

    備注:因本人電腦取消隱藏文件后綴名,所以會自動補全.strings后綴名。

    文件創建成功,查看Xcode左側導航列表,發現多了一個名為Localizable.strings的文件,如下圖:

    選中Localizable.strings文件,在Xcode的File inspection中點擊Localize,目的是選擇我們需要本地化的語言(和本地化App名稱同理),如下圖:

    依次選擇English->Localize,如下圖:

    然后我們發現Xcode右側的File inspection變成了下圖的樣式:

    然后勾選French、Chinese(zh-Hans)、Chinese(zh-Hant)、Korean,如下圖:

    此時,Xcode左側的Localizable.stirings左側多了一個箭頭,展開后,如下圖所示:

    然后我們只需要在Localizable.strings下對應的文件中,分別以Key-Value的形式,為代碼中每一個需要本地化的字符串賦值,如下圖:

    本地化代碼中的字符串,如下圖:

    我們只需要使用Foundation框架自帶的NSLocalizedString(key, comment)這個宏根據Key獲取對應的字符串,然后賦值給代碼中的字符串。

    1

    2

    3

    //?NSLocalizedString(key,?comment)?本質

    //?NSlocalizeString?第一個參數是內容,根據第一個參數去對應語言的文件中取對應的字符串,第二個參數將會轉化為字符串文件里的注釋,可以傳nil,也可以傳空字符串@""。

    #define?NSLocalizedString(key,?comment)?[[NSBundle?mainBundle]?localizedStringForKey:(key)?value:@""?table:nil]

    不同語言環境下運行效果,如下圖:

    英語環境下:

    法語環境下:

    簡體中文環境下:

    繁體中文環境下:

    韓語環境下:

    如此一來,我們就實現了代碼中字符串的本地化。

    技巧

    • 其實,我們不需要給Localizable.strings(English)文件添加Key-Value。原因如下:系統根據某個key去獲取對應的字符串時,如果沒有找到,那么就會以key作為value返回。所以如果我們在Localizable.strings(English)文件中沒有添加 click = "hit";那么在english環境下btn最終顯示的title會是click.

    • 切換語言無需在模擬器中設置,只需要在Xcode中進行如下設置: Edit->Scheme->Run->Arguments Passed On Launch ->-AppleLanguages (語言代碼)。例如,我們模擬器此時雖然是韓語,如果通過上述步驟設置為zh-Hans,那么語言環境將會變為漢語,如下圖:

    運行效果:

    如此一來,切換語言變得更加簡單,無需在模擬器的設置中進行繁瑣的語言切換。

    (三)多人開發情況下的字符串本地化

    項目開發中,獨立開發的還是少數。經常會有多人開發的情況,這種情況,如果多人同時操作本地化文件,極有可能會存在沖突。另一方面,我們又不希望自己的本地化文件受到對方的污染,也就是說,我們不希望對方操作我們的本地化文件。但是上面介紹的代碼中字符串的本地化是使用的是默認的文件名"Localizable",因為啟動程序時,系統將根據語言加載相應的文件得到其對應的字符串文件,這個字符串可以通過系統將NSLocalizedString中的宏生成名為“Localizable.strings”的文件。那么如何讓系統加載我們自己命名的本地化文件而非系統默認的Localizable.strings呢?這就是 NSLocalizedStringFromTable(<#key#>, <#tbl#>, <#comment#>)的用處。

    也就是說,如果你的strings文件名字不是Localizable而是自定義的話,如VVS.strings,那么你就得使用NSLocalizedStringFromTable這個宏來讀取本地化字符串。

    1

    2

    3

    4

    //?key:系統根據key取字符串

    //?tbl:自定義strings文件的名字

    //?comment:可以不傳

    ????NSLocalizedStringFromTable(,?,?)

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    #import?"ViewController.h"

    ?

    @interface?ViewController?()

    @property?(weak,?nonatomic)?IBOutlet?UIButton?*btn;

    ?

    @end

    ?

    @implementation?ViewController

    ?

    -?(void)viewDidLoad?{

    ????[super?viewDidLoad];

    ?

    ????NSString?*title?=?NSLocalizedStringFromTable(@"click",?@"VVS",?nil);

    ????[self.btn?setTitle:title?forState:UIControlStateNormal];

    }

    ?

    @end

    運行效果,如下圖:

    如此一來,我們就可以掙脫別人的strings文件和系統默認的Localizable.strings文件,自己另起爐灶。

    (四)圖片本地化

    本地化圖片,有兩種方式,第一種方式和本地化代碼中的字符串一樣,通過NSLocalizedString(key,comment)來獲取相應的字符串,然后根據這個字符串再獲取圖片。

    • 方式一

    1

    2

    3

    NSString?*imageName?=?NSLocalizedString(@"icon",?nil);

    UIImage?*image?=?[UIImage?imageNamed:imageName];

    self.imageView.image?=?image;

    • 方式二

    首先需要添加需要本地化的語言,具體步驟參考第一章配置需要國際化的語言。因為我演示的demo中在本地化App名稱時已經添加了需要國際化的語言。所以不需要再設置。

    將圖片拖入工程中,例如“icon.png”,然后選中icon.png,展開Xcode右側的file Inspection,點擊Localize,如下圖:

    然后,右擊icon.png->show in Finder,我們發現在en.Iproj文件中多了一個名為icon.png的圖片,如下圖:

    當然,zh-Hans.Iproj文件夾下并沒有圖片,如下圖:

    我們只需給zh-Hans.Iproj添加一個名字也為icon.png的圖片。如下圖:

    然后把zh-Hans.Iproj中的icon.png拖到Xcode中,如下圖:

    然后發現,icon.png左邊出現了一個可以展開的三角形。如下圖:

    展開后發現里面包含兩張圖片,如下圖:

    然后控制器中添加如下代碼:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    #import?"ViewController.h"

    ?

    @interface?ViewController?()

    @property?(weak,?nonatomic)?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

    english環境下運行效果如下:

    中文環境改下運行效果如下:

    其他語言環境,例如法語、中文繁體、韓語,操作步驟完全和上面相同。都是在對應的.Iproj文件夾下添加同名的圖片,然后把圖片拖放到Xcode中,不再贅述。

    (五)查看/切換本地語言

    原理:應用啟動時,首先會讀取NSUserDefaults中的key為AppleLanguages對應的value,該value是一個String數組,也就是說,我們訪問這個名為AppleLanguages的key可以返回一個string數組,該數組存儲著APP支持的語言列表,數組的第一項為APP當前默認的語言。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    #import?"ViewController.h"

    ?

    @interface?ViewController?()

    ?

    @end

    ?

    @implementation?ViewController

    ?

    -?(void)viewDidLoad?{

    ????[super?viewDidLoad];

    ?

    ????NSArray?*languages?=?[[NSUserDefaults?standardUserDefaults]?valueForKey:@"AppleLanguages"];

    ????NSString?*currentLanguage?=?languages.firstObject;

    ????NSLog(@"模擬器當前語言:%@",currentLanguage);

    }

    @end

    -控制臺打印結果:

    同理,既然我們可以通過AppleLanguages這個key從NSUserDefaults中取出語言數組,那么我們也可以給AppleLanguages這個key賦值來達到切換本地語言的效果,從此以后,我們就無需頻繁的去模擬器的設置->通用->語言與地區 中切換語言。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    #import?"ViewController.h"

    ?

    @interface?ViewController?()

    ?

    @end

    ?

    @implementation?ViewController

    ?

    -?(void)viewDidLoad?{

    ????[super?viewDidLoad];

    ?

    ????//?切換語言前

    ????NSArray?*langArr1?=?[[NSUserDefaults?standardUserDefaults]?valueForKey:@"AppleLanguages"];

    ????NSString?*language1?=?langArr1.firstObject;

    ????NSLog(@"模擬器語言切換之前:%@",language1);

    ?

    ????//?切換語言

    ????NSArray?*lans?=?@[@"en"];

    ????[[NSUserDefaults?standardUserDefaults]?setObject:lans?forKey:@"AppleLanguages"];

    ?

    ????//?切換語言后

    ????NSArray?*langArr2?=?[[NSUserDefaults?standardUserDefaults]?valueForKey:@"AppleLanguages"];

    ????NSString?*language2?=?langArr2.firstObject;

    ????NSLog(@"模擬器語言切換之后:%@",language2);

    }

    @end

    回想一下,我在上面的技巧一節中提過:切換語言無需在模擬器中設置,只需要在Xcode中進行如下設置: Edit->Scheme->Run->Arguments Passed On Launch ->-AppleLanguages (語言代碼)。其實本質上就是給NSUserDefaults中名為AppleLanguages的key賦值。

    轉載于:https://my.oschina.net/huqiji/blog/831419

    總結

    以上是生活随笔為你收集整理的3分钟实现iOS语言本地化/国际化(图文详解)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。