APP語言本地化炮叶,即語言國際化哥遮。指的是根據(jù)用戶操作系統(tǒng)的語言設(shè)置笨使,自動將APP的語言設(shè)置為和操作系統(tǒng)一致的語言環(huán)境。開發(fā)過程中包括以下本地化設(shè)置:
- App名稱本地化
- App中文字內(nèi)容本地化
- 圖片本地化
- Storyboard/Xib本地化
一竞阐、本地化基本設(shè)置:
- 通過Project→Info→Localizations缴饭,點(diǎn)擊“+”添加需要本地化/國際化的語言。Xcode默認(rèn)需要勾選Use Base Internationalization(使用基本國際化),如下圖:
注:如果勾選Use Base Internationalization馁菜,則如果未特別設(shè)置本地化語言茴扁,就使用Base選項(xiàng)配置。
-
下圖為選擇添加本地化語言:
Xcode創(chuàng)建工程汪疮,默認(rèn)開發(fā)語言為English,并選中Base選項(xiàng)峭火,下面手動添加Chinese語言。
-
彈出如下對話框智嚷,直接點(diǎn)擊finish卖丸,如下圖:
注:由下圖可見,我們將Main.Stroyboard和LaunchScreen.Storyboard添加進(jìn)Chinese語言配置文件中
二盏道、App名稱本地化:
應(yīng)用名稱本地化稍浆,是指同一個(gè)App的名稱,在手機(jī)不同的語言環(huán)境下顯示不同的名稱猜嘱。比如衅枫,微信在簡體中文環(huán)境下App名稱顯示為“微信”,在英語環(huán)境下顯示為“weChat”朗伶。
-
選中info.plist文件弦撩。按Command+N。創(chuàng)建文件窗口论皆,找到Strings File創(chuàng)建選項(xiàng)益楼,并創(chuàng)建名稱為InfoPlist.strings文件。
-
創(chuàng)建InfoPlist.strings文件后点晴,在左側(cè)工程文件列表中感凤,如下圖:
-
然后選中InfoPlist.strings,在Xcode右側(cè)文件檢查器中點(diǎn)擊Localize粒督,選擇需要本地化的語言陪竿。
-
然后再右側(cè)Localization中勾選所有本地化語言,并查看左側(cè)文件列表坠陈,可發(fā)現(xiàn)InfoPlist.stirings左側(cè)多了一個(gè)箭頭萨惑,點(diǎn)擊箭頭可以展開,顯示支持的本地化語言仇矾。
接下來庸蔼,我們分別用不同的語言給InfoPlist.strings下的文件設(shè)置對應(yīng)的名字
- InfoPlist.strings(English)中添加代碼
// App在英語環(huán)境環(huán)境下顯示的名稱
CFBundleDisplayName = "TestDemo";
- InfoPlist.strings(Chinese,simplified)中添加代碼
// App在中文環(huán)境環(huán)境下顯示的名稱
CFBundleDisplayName = "測試";
- 最終效果:
- 系統(tǒng)語言為英語:
- 系統(tǒng)語言為簡體中文:
注:以前本地化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è)置本地化。
同樣需要添加strings類型文件馒疹,和設(shè)值displayName本地化相同按鍵 Command + N,創(chuàng)建名稱為
Localizable.strings
文件佳簸;-
文件創(chuàng)建成功,查看Xcode左側(cè)文件列表颖变,就會發(fā)現(xiàn)多了一個(gè)名為Localizable.strings的文件生均;
-
選中
Localizable.strings
文件,在Xcode右側(cè)點(diǎn)擊Localize腥刹,來選擇設(shè)置我們需要本地化的語言 -
然后我們發(fā)現(xiàn)Xcode的右側(cè)配置列表如下圖马胧;
-
然后Xcode左側(cè)的
Localizable.stirings
左側(cè)多了一個(gè)箭頭,展開后衔峰,如下圖所示佩脊; -
在
Localizable.stirings
中設(shè)置本地化詳細(xì)顯示內(nèi)容;-
Localizable.strings(English)中添加代碼:
"click" = "click";
-
Localizable.strings(Chinese,simplified)中添加代碼:
"click" = "點(diǎn)擊";
-
-
在使用時(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)]
-
不同語言環(huán)境下的運(yùn)行結(jié)果:
-
系統(tǒng)語言為英語:
-
系統(tǒng)語言為簡體中文:
-
四、圖片本地化
圖片本地化現(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";
-
方式二:添加需要本地化的語言
將圖片拖入工程鱼响,例如將圖片命名為"icon.png";
選中圖片,展開Xcode右側(cè)配置列表组底,點(diǎn)擊
Localize
丈积,配置本地語言為English
;-
由鍵
icon.png
债鸡,選擇show in Finder
,發(fā)現(xiàn)在en.Iproj文件中多了一個(gè)名為icon.png的圖片江滨,如下圖 -
查看
zh-Hans.lproj
中沒有icon.png
圖片,如下圖 這時(shí)我們需要向
zh-Hans.lproj
文件中添加一個(gè)與icon.png
相同命名的圖片厌均;-
然后把
zh-Hans.Iproj
中的icon.png
拖到Xcode中,放在原來icon.png
圖片下面唬滑,如下圖;左側(cè)文件顯示:
-
最終的代碼使用:
#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
-
結(jié)果展示:
五、Storyboard/Xib本地化
-
選中需要的本地化的
Storyboard
文件晶密,在Xcode右側(cè)配置列表中的loaclize
配置本地?fù)Q語言擒悬;注:創(chuàng)建新工程時(shí)默認(rèn)選中
Use Base Internationalization
默認(rèn)被選中,所以Localization
中默認(rèn)選中Base
稻艰。所以Main.storyboard
和LaunchScreen.storyboard
默認(rèn)在Base.lproj
文件夾中懂牧。 -
在
Localization
中勾選English
和Chinese,Simplified
,表示項(xiàng)目支持英文和簡體中文本地化語言尊勿。此時(shí)文件列表的樣式僧凤,如下圖; 此時(shí)本地化配置完成运怖,可以進(jìn)行差異化處理拼弃。
六、其他技巧
-
Use Base Internationalization的作用:
作用:把文本從
.storyboard
和.xib
文件中分離出來- 如果不選中
Use Base Internationalization
摇展,那么在添加本地化語言的時(shí)候吻氧,會創(chuàng)建多個(gè)相應(yīng)語言的storyboard
、xib
咏连,那么我們還可以調(diào)整不同語言下的界面布局及顯示內(nèi)容盯孙。
- 如果選中
Use Base Internationalization
,那么在添加語言的時(shí)候祟滴,會把當(dāng)前的storyboard
振惰、xib
中的文本提取出來放入Base.lproj
文件夾中,我們只需要在相應(yīng)的新增的.strings
文件中改變對應(yīng)的文本即可垄懂。
- 如果不選中
-
如何讓系統(tǒng)加載自定義的本地化文件而非系統(tǒng)默認(rèn)的Localizable.strings呢骑晶?
- 需要使用的宏定義:
#define NSLocalizedStringFromTable(key, tbl, comment) [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
-
創(chuàng)建自定義的strings文件:創(chuàng)建過程同上面的流程。
使用代碼:
@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ā)語言:
-
在Xcode中右鍵
.xcodeproj
文件草慧,選擇Show in Finder
桶蛔,打開文件夾,右鍵文件夾中.xcodeproj
漫谷,選擇”顯示包內(nèi)容“仔雷,雙擊打開project.pbxproj
文件,找到developmentRegion
變量并修改其值舔示,修改development Language 默認(rèn)配置碟婆。將en
修改為zh-Hans
,則會將開發(fā)語言配置為簡體中文。
-
-
查看惕稻,切換本地語言:
// 切換語言前 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è)置