字符串的本地化
本地化用到的宏
//接收一個 key, 返回對應(yīng)的 value, comment是對鍵值對的評注 一般傳 nil
NSLocalizedString(key, comment)
//通過指定的 xxxx.string 文件名, 取出對應(yīng)的value
NSLocalizedStringFromTable(key, tbl, comment)
//可以指定 budle 的名稱加載對應(yīng)的Localizable.string 文件 (或者其他 xxxx.string 文件)
NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment)
//傳入各個參數(shù), 如果都找不到對應(yīng)的 value, 就用你傳入的 val 參數(shù)的值作為返回值
NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment)
這四個宏全部是對這個方法的 #define,直接在蘋果官方文檔搜索這個 API,會有詳細(xì)的解釋
localizedStringForKey:key value:value table:table
創(chuàng)建一個新工程,作為測試本地化的 test 工程
Command + N 創(chuàng)建,指定 .string文件名稱為Localizable.string 文件

在文件中寫上需要本地化的字符串

對字符串進(jìn)行行本地化處理,點(diǎn)擊右邊的Localize 按鈕對Localizable.string
進(jìn)行本地化。這里一般會有兩個選項(xiàng),Base 和 English,English 就是當(dāng)系統(tǒng)語言是英文的時候展示的字符串。那么 Base 是什么呢? 官方文檔中有一篇Enabling Base Internationalization 的 Guide 詳細(xì)說了 Base 的本地化是為了 Xib 和 SB 準(zhǔn)備的,有興趣可以去查閱。

可以先選擇 English 選項(xiàng), 然后

默認(rèn)只有English 和 Base 兩個選項(xiàng),這里可以本地化成多少種語言取決于你在項(xiàng)目配置中添加了多少種語言,如下圖

這里再添加一個簡體中文,Chinese(Simplified) 那么Localizable.string 下就會多了一個簡體中文的選項(xiàng)

同樣一個 "hello" 的鍵,在簡體中文中對應(yīng) "你好", 在英文中對應(yīng)"hello",至于要在對應(yīng)的Localizable.string 里編寫鍵值對就 OK了。
"hello" = "hello"; Localizable.strings (English)
"hello" = "你好"; Localizable.strings (Chinese Simplified)
這個時候 SB 中也會多了一個簡體中文的選項(xiàng),和 Base 選項(xiàng),Base對應(yīng)的就是 SB 本身,就是當(dāng)找不到對應(yīng)本地化語言的時候就默認(rèn)顯示成 Base 的文字。這個下面再說。
這個時候你在 SB 中隨便拖一個 Label,把手機(jī)語言設(shè)置成英語和簡體中文,那么對應(yīng) label 就會顯示為 "hello" 和 "你好"。
self.Label.text = NSLocalizedString(@"hello", nil);
SB 中的本地化
剛才在對Localizable.strings 進(jìn)行多語言本地化的時候,SB 的選擇項(xiàng)下也會出現(xiàn)對應(yīng)多個語言的選項(xiàng), 如果沒有的話, 你可以選擇本地化 SB

如果 SB 中有相應(yīng)的 Label 控件,那么在本地化的 string 文件里應(yīng)該會有類似這種格式的文字,如果沒有的話, 那就隨便再多加一種語言,勾選 SB 的Localization,就會根據(jù)最新的空間情況生成以下信息:
/* Class = "UILabel"; text = "我是 label"; ObjectID = "r36-3S-eeu"; */
"r36-3S-eeu.text" = "我是 label";
那么,我以后每添加一次控件, string 文件并不會主動刷新, 那我怎么控制控件的本地化文字呢?看了下圖你應(yīng)該明白,SB 就是 xml 文件嘛, 他要的就是一個ObjectID,我們都知道這個 ID 了,那前面的格式照搬就 OK 了。

本地化 app 名稱
同理,,創(chuàng)建InfoPlist.string 文件, 然后點(diǎn)擊Localize 按鈕
CFBundleDisplayName="中文名稱"; InfoPlist.strings (Chinese simplified)
CFBundleDisplayName="English Name"; InfoPlist.strings (English)
同樣我們還可以有很多的 key 可以設(shè)置, 這些 key 在官方文檔里搜索 cocoa keys 就可以查詢得到, 這樣你就可以對這些 key 進(jìn)行本地化
NSCameraUsageDescription //打開相機(jī)的描述信息
NSPhotoLibraryUsageDescription //使用相冊的描述信息
NSLocationUsageDescription
......
神奇的Localization native development region
這個 info.plist 里的 key 一開始是很疑惑,覺得他好像沒什么用,region 寫在哪,也和我的 app 語言好像沒什么影響,后來在這篇文章里找到了答案, 他解釋了 app 應(yīng)用哪種語言的優(yōu)先級,寫得很不錯!