字符串的本地化
本地化用到的宏
//接收一個(gè) key, 返回對(duì)應(yīng)的 value, comment是對(duì)鍵值對(duì)的評(píng)注 一般傳 nil
NSLocalizedString(key, comment)
//通過(guò)指定的 xxxx.string 文件名, 取出對(duì)應(yīng)的value
NSLocalizedStringFromTable(key, tbl, comment)
//可以指定 budle 的名稱加載對(duì)應(yīng)的Localizable.string 文件 (或者其他 xxxx.string 文件)
NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment)
//傳入各個(gè)參數(shù), 如果都找不到對(duì)應(yīng)的 value, 就用你傳入的 val 參數(shù)的值作為返回值
NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment)
這四個(gè)宏全部是對(duì)這個(gè)方法的 #define盾致,直接在蘋果官方文檔搜索這個(gè) API顶瞒,會(huì)有詳細(xì)的解釋
localizedStringForKey:key value:value table:table
創(chuàng)建一個(gè)新工程,作為測(cè)試本地化的 test 工程
Command + N 創(chuàng)建办斑,指定 .string文件名稱為L(zhǎng)ocalizable.string 文件
在文件中寫上需要本地化的字符串
對(duì)字符串進(jìn)行行本地化處理增蹭,點(diǎn)擊右邊的Localize 按鈕對(duì)Localizable.string
進(jìn)行本地化。這里一般會(huì)有兩個(gè)選項(xiàng)午乓,Base 和 English站宗,English 就是當(dāng)系統(tǒng)語(yǔ)言是英文的時(shí)候展示的字符串。那么 Base 是什么呢益愈? 官方文檔中有一篇Enabling Base Internationalization 的 Guide 詳細(xì)說(shuō)了 Base 的本地化是為了 Xib 和 SB 準(zhǔn)備的梢灭,有興趣可以去查閱。
可以先選擇 English 選項(xiàng)蒸其, 然后
默認(rèn)只有English 和 Base 兩個(gè)選項(xiàng)敏释,這里可以本地化成多少種語(yǔ)言取決于你在項(xiàng)目配置中添加了多少種語(yǔ)言,如下圖
這里再添加一個(gè)簡(jiǎn)體中文摸袁,Chinese(Simplified) 那么Localizable.string 下就會(huì)多了一個(gè)簡(jiǎn)體中文的選項(xiàng)
同樣一個(gè) "hello" 的鍵钥顽,在簡(jiǎn)體中文中對(duì)應(yīng) "你好", 在英文中對(duì)應(yīng)"hello"靠汁,至于要在對(duì)應(yīng)的Localizable.string 里編寫鍵值對(duì)就 OK了蜂大。
"hello" = "hello"; Localizable.strings (English)
"hello" = "你好"; Localizable.strings (Chinese Simplified)
這個(gè)時(shí)候 SB 中也會(huì)多了一個(gè)簡(jiǎn)體中文的選項(xiàng),和 Base 選項(xiàng)蝶怔,Base對(duì)應(yīng)的就是 SB 本身奶浦,就是當(dāng)找不到對(duì)應(yīng)本地化語(yǔ)言的時(shí)候就默認(rèn)顯示成 Base 的文字。這個(gè)下面再說(shuō)踢星。
這個(gè)時(shí)候你在 SB 中隨便拖一個(gè) Label澳叉,把手機(jī)語(yǔ)言設(shè)置成英語(yǔ)和簡(jiǎn)體中文,那么對(duì)應(yīng) label 就會(huì)顯示為 "hello" 和 "你好"斩狱。
self.Label.text = NSLocalizedString(@"hello", nil);
SB 中的本地化
剛才在對(duì)Localizable.strings 進(jìn)行多語(yǔ)言本地化的時(shí)候耳高,SB 的選擇項(xiàng)下也會(huì)出現(xiàn)對(duì)應(yīng)多個(gè)語(yǔ)言的選項(xiàng)扎瓶, 如果沒(méi)有的話所踊, 你可以選擇本地化 SB
如果 SB 中有相應(yīng)的 Label 控件,那么在本地化的 string 文件里應(yīng)該會(huì)有類似這種格式的文字概荷,如果沒(méi)有的話, 那就隨便再多加一種語(yǔ)言秕岛,勾選 SB 的Localization,就會(huì)根據(jù)最新的空間情況生成以下信息:
/* Class = "UILabel"; text = "我是 label"; ObjectID = "r36-3S-eeu"; */
"r36-3S-eeu.text" = "我是 label";
那么,我以后每添加一次控件继薛, string 文件并不會(huì)主動(dòng)刷新修壕, 那我怎么控制控件的本地化文字呢?看了下圖你應(yīng)該明白遏考,SB 就是 xml 文件嘛慈鸠, 他要的就是一個(gè)ObjectID,我們都知道這個(gè) 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 就可以查詢得到, 這樣你就可以對(duì)這些 key 進(jìn)行本地化
NSCameraUsageDescription //打開相機(jī)的描述信息
NSPhotoLibraryUsageDescription //使用相冊(cè)的描述信息
NSLocationUsageDescription
......
神奇的Localization native development region
這個(gè) info.plist 里的 key 一開始是很疑惑诱贿,覺(jué)得他好像沒(méi)什么用娃肿,region 寫在哪,也和我的 app 語(yǔ)言好像沒(méi)什么影響珠十,后來(lái)在這篇文章里找到了答案, 他解釋了 app 應(yīng)用哪種語(yǔ)言的優(yōu)先級(jí),寫得很不錯(cuò)料扰!