PS:修改設(shè)備系統(tǒng)語言方法
設(shè)置 -> 通用 -> 語言與地區(qū) -> iPhone 語言
Settings -> General -> Language & Region -> iPhone Language
1. 添加需要國際化的語言
首先,需要添加需要國際化的語言豁陆,在 項目 -> Info -> PROJECT -> Localizations 衰絮;點擊下方的 + 添加:
然后,會彈出選擇需要國際化的文件:
主要是選擇 storyboard 和我們創(chuàng)建的 .strings 文件(如圖1)鱼的,也可以不選脊岳,在需要的地方再勾選鸟款,這里是全選;一開始只有兩個storyboard文件削樊,是沒有.strings文件的(如圖2);
這里添加了 簡體中文 和 英文兔毒;
2. 國際化
2.1. App 名稱國際化
首先創(chuàng)建 InfoPlist.strings 文件:右鍵 -> New File... -> Resource -> Strings File
在下一步命名文件名稱的時候嫉父,一定要是 InfoPlist ;因為這個文件主要設(shè)置系統(tǒng)使用的文字的國際化眼刃,例如應(yīng)用名稱绕辖;是供系統(tǒng)使用的,如果換了其他的名稱擂红,系統(tǒng)是找不到的仪际;
完成后,在文件列表會多出個 InfoPlist.strings 文件昵骤,選中該文件后树碱,點擊右側(cè)文件屬性一欄 Localizations 中的 Localize... ,在彈出的選擇框中選擇一個待國際化的語言变秦,這時只能選擇一個成榜,完成后,再勾選其他的:
如果有多個語言需要國際化蹦玫,此處是可以展開的:
里面是各個語言對應(yīng)的國際化文本赎婚,在右側(cè)的文件屬性 Localization 下,可以選擇我們需要國際化的語言樱溉,不需要國際化的不勾選即可挣输;
然后在各個語言文件中添加需要國際化的字符:
應(yīng)用名稱對應(yīng)的key為:CFBundleDisplayName
這個可以在 Info.plist文件中進行查看,但是需要 Open As -> Source Code
然后切換設(shè)備語言環(huán)境測試一下即可福贞!
2.2. 本地文本/圖片國際化
如果是本地項目中使用的文本/圖片撩嚼,需要新建另一個 .strings 文件來進行國際化;同新建 InfoPlist.strings 一樣挖帘,只不過名稱修改為:Localizable完丽,這時會新建一個 Localizable.strings 文件,同樣拇舀,選中當(dāng)前文件后逻族,點擊右側(cè)文件屬性一欄 Localizations 中的 Localize... 添加/勾選需要國際化的語言種類,然后添加相應(yīng)的文本字符串:
這里也是 key-velue 的形式你稚,根據(jù)自己的需求編寫即可瓷耙;
在使用的時候朱躺,不能直接使用某個字符串或者圖片名稱了,需要系統(tǒng)提供的宏定義 NSLocalizedString(key, comment)
這里的 Key搁痛,即我們在多語言文本中定義key长搀;comment 說明,可以和key一樣鸡典,也可以傳nil源请;如果我們定義的 .strings 文件名稱不是 Localizable.strings ,而是其他的彻况,例如 myLoca.strings谁尸,那么在使用的時候就需要用:
NSLocalizedStringFromTable(key, tbl, comment)
,第二個參數(shù)就是我們的.strings 文件名稱纽甘。
按照上面的設(shè)置良蛮,我們在使用的時候如下所示,在不同的語言環(huán)境下悍赢,就會顯示不同的內(nèi)容:
UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(100, 100, 100, 100);
label.backgroundColor = [UIColor redColor];
label.text = NSLocalizedString(@"首頁", @"首頁");
[self.view addSubview:label];
UIImageView *image = [[UIImageView alloc]init];
image.frame = CGRectMake(100, 200, 300, 300);
image.image = [UIImage imageNamed:NSLocalizedString(@"mainImageName", @"mainImageName")];
[self.view addSubview:image];
2.3. 啟動圖國際化
啟動圖一般不需要國際化决瞳,設(shè)置一個通用的即可;但是如果有這個需求左权,可以按下面的方式進行
啟動圖的國際化要分兩種情況:使用 LaunchScreen.storyboard 和不使用皮胡;
使用 LaunchScreen.storyboard 的好處是只需要設(shè)置一個最大分辨率的啟動圖即可適配所有尺寸的設(shè)備;如果不使用 LaunchScreen.storyboard 赏迟,就需要添加各個設(shè)備分辨率的圖片屡贺,如果沒添加,在相應(yīng)設(shè)備上的適配會有很大的問題锌杀;所以甩栈,一般我們是使用 LaunchScreen.storyboard 來作為啟動圖的。
使用 LaunchScreen.storyboard
此種情況需要結(jié) InfoPlist.strings 文件抛丽,其創(chuàng)建參見第一個知識點谤职;
使用 LaunchScreen.storyboard 需要在 項目 - General - App Icons and Launch Images 中的 Launch Screen File 選擇 LaunchScreen.storyboard:
第一步:新建 Launch Screen
先新建兩個 Launch Screen 分別命名為:LaunchScreen_en、LaunchScreen_ch亿鲜,名稱自定義!(需要幾個語言版本就新建幾個)
然后冤吨,和設(shè)置 LaunchScreen.storyboard 一樣蒿柳,添加一個 UIImageView ,設(shè)置全屏顯示漩蟆,添加需要的啟動圖即可垒探!
第二步:配置 InfoPlist.strings 文件
在 InfoPlist.strings 相應(yīng)的國際化語言中添加相應(yīng)的 Launch Screen 名稱:
這里的 key:UILaunchStoryboardName 同樣可以在Info.plist 文件中 Open As.. -> Source Code 來查看;
然后,切換語言環(huán)境怠李,重新運行項目即可查看效果圾叼;
如果沒效果蛤克,需要將已安裝的刪除,再次運行即可夷蚊!
不使用 LaunchScreen.storyboard
如果不使用 LaunchScreen.storyboard构挤,就需要準(zhǔn)備各個設(shè)備尺寸的啟動圖,添加到項目中
這里需要說明一下惕鼓,因為不能適配到所有的語言筋现,為防止在使用未國際化的語言時,導(dǎo)致啟動圖異常箱歧,應(yīng)該設(shè)置一套通用的啟動圖矾飞,先將這套添加到項目中,在這套啟動圖的基礎(chǔ)上做下面的操作呀邢,然后按照下面的方法洒沦,將其他語言環(huán)境的啟動圖添加到相應(yīng)的文件夾,下面的 Base 選項就是適配所有語言環(huán)境的啟動圖
第一步:準(zhǔn)備圖片
圖片導(dǎo)入后价淌,選中其中一張圖片微谓,然后點擊右側(cè)屬性欄 Localizations 中的 Localize...,在彈出的語言選擇框中選擇 Base
然后输钩,選擇需要國際化的語言豺型,完成后大概是這個樣子:
最后給每個添加的圖片都做相同的操作,完成后大概是這個樣子:
然后买乃,選中任意一個展開后的選擇姻氨,右鍵 - Show In Finder
會看到下面這個目錄:
其中en.lproj 文件夾下是英文環(huán)境的啟動圖;zh-Hans.lproj 是簡體中文環(huán)境下的啟動圖剪验;
將相應(yīng)的啟動圖放入對應(yīng)的文件夾即可肴焊,需要注意啟動圖的名稱,一定要和上面添加的名稱一致功戚;
第二步:配置 Info.plist 文件
添加完成后娶眷,將 Info.plist 使用 Sounce Code 方式打開,添加以下的代碼:
<key>UILaunchImages</key>
<array>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>8.0</string>
<key>UILaunchImageName</key>
<string>launchImage_4</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{320,480}</string>
</dict>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>8.0</string>
<key>UILaunchImageName</key>
<string>launchImage_5</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{320,568}</string>
</dict>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>8.0</string>
<key>UILaunchImageName</key>
<string>launchImage_6</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{375,667}</string>
</dict>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>8.0</string>
<key>UILaunchImageName</key>
<string>launchImage_6p</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{414,736}</string>
</dict>
</array>
切換回 Perporty List啸臀,大概是這種結(jié)構(gòu):
添加了幾個啟動圖届宠,就需要添加幾個Item;每個 Item 的結(jié)構(gòu)一致乘粒;
最后豌注,修改設(shè)備的語言,重新啟動看下效果即可灯萍!
2.4. 其他國際化配置
這里的其他主要是指需要在Info.plist文件添加一些說明文字的情況轧铁,例如使用隱私權(quán)限:相機、相冊旦棉、定位等的描述文本的國際化齿风;同樣是配置在 InfoPlist.strings 文件中的药薯,這里以使用相機權(quán)限為例:
這里的 key 同樣可以在 Info.plist 文件中 Open As Source Code 來查看;
2.5. xib/storyboard 國際化
由于項目中一直使用純代碼救斑,很少使用 xib/storyboard童本,這里給一個xib/storyboard 國際化的文章以供參考 iOS國際化——通過腳本使storyboard,相關(guān)信息官方的文章也有介紹https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPInternational/LocalizingYourApp/LocalizingYourApp.html
3. 默認語言環(huán)境
在國際化的時候系谐,不可能覆蓋所有的語言環(huán)境巾陕,如果軟件安裝的設(shè)備所處的語言環(huán)境未在我們國際化的語言中,會默認顯示開發(fā)語言環(huán)境纪他,Xcode 默認開發(fā)語言環(huán)境在項目 -> Info -> PROJECT -> Localizations 可查看:
對的鄙煤,你沒看錯,默認的是 English茶袒,所以梯刚,如果所處的語言環(huán)境未在國際化的范疇,會顯示英文薪寓;
當(dāng)然亡资,我們可以強制設(shè)置自己軟件所處的語言環(huán)境,在app 啟動的時候向叉,判斷當(dāng)前語言環(huán)境是否在我們國際化的范圍內(nèi)锥腻,如果不在則設(shè)置當(dāng)前環(huán)境為簡體中文:
NSArray *languages = [NSLocale preferredLanguages];
// 數(shù)組中第一個即為當(dāng)前的語言
NSString *language = [languages objectAtIndex:0];
// 保存已國際化的語言名稱,
// 該值可以將設(shè)備切換到該語言環(huán)境母谎,然后輸出上面的值來獲取
NSArray *supportLanguages = @[@"zh-Hans-US", @"en", @"en-US"];
if ([supportLanguages containsObject:language] == NO) {
// 如果不在國際化的語言范圍內(nèi)瘦黑,則設(shè)置為簡體中文
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];
}