[iOS] 國際化詳解

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);

圖 1
圖 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亿鲜,名稱自定義!(需要幾個語言版本就新建幾個)

新建 Launch Screen

然后冤吨,和設(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 可查看:

默認語言環(huán)境

對的鄙煤,你沒看錯,默認的是 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"];
    }


參考文章:
iOS開發(fā)技巧-國際化(Localization),只看一篇就夠了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奇唤,一起剝皮案震驚了整個濱河市幸斥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咬扇,老刑警劉巖甲葬,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異懈贺,居然都是意外死亡经窖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門隅居,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钠至,“玉大人,你說我怎么就攤上這事胎源。” “怎么了屿脐?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵涕蚤,是天一觀的道長宪卿。 經(jīng)常有香客問我,道長万栅,這世上最難降的妖魔是什么佑钾? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮烦粒,結(jié)果婚禮上休溶,老公的妹妹穿的比我還像新娘。我一直安慰自己扰她,他們只是感情好兽掰,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徒役,像睡著了一般孽尽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忧勿,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天杉女,我揣著相機與錄音,去河邊找鬼鸳吸。 笑死熏挎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晌砾。 我是一名探鬼主播坎拐,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贡羔!你這毒婦竟也來了廉白?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤乖寒,失蹤者是張志新(化名)和其女友劉穎猴蹂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楣嘁,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡磅轻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逐虚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聋溜。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叭爱,靈堂內(nèi)的尸體忽然破棺而出撮躁,到底是詐尸還是另有隱情,我是刑警寧澤买雾,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布把曼,位于F島的核電站杨帽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嗤军。R本人自食惡果不足惜注盈,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叙赚。 院中可真熱鬧老客,春花似錦、人聲如沸震叮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冤荆。三九已至朴则,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钓简,已是汗流浹背乌妒。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留外邓,地道東北人撤蚊。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像损话,于是被迫代替她去往敵國和親侦啸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353