iOS 本地化 國際化 筆記

字符串的本地化

本地化用到的宏

//接收一個 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 文件

創(chuàng)建 Localizable string 文件.png

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

需要本地化的字符串.png

對字符串進(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)備的,有興趣可以去查閱。

本地化處理.png

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

本地化后的.string.png

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

為項(xiàng)目配置更多本地化語言選項(xiàng).png

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

多個語言選項(xiàng)的.string.png

同樣一個 "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 本地化.png

如果 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 了。

查看 Label 的屬性.png

本地化 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)先級,寫得很不錯!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容