iOS 語言切換、本地化,國際化,ios本地化
什麼是本地化處理?
本地化處理就是我們的應用程式有可能發布到世界的很多國家去,因為每個國家應用的語言是不一樣的,所以我們要把我們的應用程式的語言要進行本地化處理一下。
本地化處理需要處理那些檔案?
(1):本地化應用程式名稱(我的的項目名稱)
(2):本地化字串處理(項目中所涉及的字串)
(3):本地化圖片
(4):XIB檔案本地化處理
(5):其他檔案
下面進行本地化處理:
1 . 設定我們的工程支援多語言
為什麼:因為只有設定成支援多語言了,我們才能在展示項目名稱和項目中的字串等將語言進行切換
(1): 首先建立一個項目,以“蘋果”為項目名做測試
(2):為工程添加可支援的語言,只有項目具有我們想要用的語言,我們才能講項目切換成這種語言
:
2:設定項目名稱本地化處理
(1):InfoPlist.strings檔案是對我們應用程式的名字進行管理的
(2):設定InfoPlist.strings其實很簡單,就是藉助我們上一步設定的語言環境,將我們想要支援的語言添加到InfoPlist.strings檔案之下就可以了
(3):添加過程:
(4)接下來我們只需要將CFBundleDisplayName屬性和它所對應的值分別寫在我們在InfoPlist下建立的檔案中
例如:
在InfoPlist.strings(English)中我們寫入:CFBundleDisplayName = "apple";
在InfoPlist.strings(Chinese(Simplified))中我們寫入:CFBundleDisplayName = "蘋果";
在InfoPlist.strings(English)中我們寫入:CFBundleDisplayName = "リンゴ";
注意:後面的“”前面不加@
(5):在Info.Plist檔案中添加一個屬性Application has localized display name然後設定成Boolean類型的Yes就可以了
(6):在模擬器中更改模擬器的語言就會看到以下三種效果:
3:本地化字串處理(項目中所涉及的字串)
提示:本地化字串處理和2中講的項目名本地化處理基本上是一樣的,只不過我們需要在建立一個像Info.Plist檔案一樣的檔案來管理我們的本地化字串
就是建立一個Localizable.strings檔案,然後同樣是在這個檔案夾下建立多種支援語言
在Xcode項目中,在你想要的位置建立檔案
然後選中當前檔案,屬性中 點擊 "Localiztion"->"Localize..." ->勾選語言
(1):建立Localizable.strings檔案的方式和上面建立Info.Plist的方式是一樣的,只是檔案名稱不一樣
(2):在Localizable.strings檔案下添加支援的語言
:
(3):然後我們在Localizable.strings下得各個檔案添加類似於如下的內容:
例如:
Localizable.strings(English)中 “Login”=“Login”;
Localizable.strings(Chinese(Simplified)) 中 “Login” = “登陸”;
Localizable.strings(Japanese) 中 “Login” = “登録”;
然後有人可能問了我們每個等號前的"Login"是怎麼確定的? :往下看
然後我們怎麼用呢?
就是每次我們在用到我們設定的字串的時候不用NSString了,我們需要用到一個函數代替它:NSLocalizedString(key, comment)
例如我們要再一個Button上設定主題:button.title = NSLocalizedString(@“Login”, nil);
這個裡面的@“Login”就會自動檢索於裝置相同語言的Localizable.strings下得檔案夾,然後在裡面找到與@“Login”相同的Key值,然後就輸出出來
其實我們在Localizable.strings下得檔案夾中設定的內容就像一個字典一樣,前面是Key值後面是對應的值,然後就是通過NSLocalizedString(@“Login”, nil);函數進行檢索,將key對應的值返回過來。
有人會文NSLocalizedString(key, comment)中的comment是什麼,很明顯根據字義判斷是注釋的意思
:
總結:
其實很簡單,就是我們把Localizable.strings下面設定好我們所需要的語言,然後我們在將我們在項目中用到的字串都用"Three"="3";的形式整理到各個對應的檔案裡面,然後我們要是用到我們需要的字串的時候我們就通過NSLocalizedString(key, comment)函數以key值的形式找裡面的值,然後將我們自己設定的語言對應的值展現出來,這就是本地化處理
文/深山老林飛(簡書作者)
原文連結:http://www.jianshu.com/p/b053bbd8c339
【自己的補充】
如果是自己的應用本地需要做語言切換的話,實現邏輯如下
1.配置的語言
#define lang_en @"en"#define lang_zh_hans @"zh-Hans"#define lang_zh_hant @"zh-Hant"
下面的方法中languageCode: 就是這幾個值, 其他語言的不做闡述
2.通過當前選擇的語言調用相應語言字串
/** * 擷取國際化字串值 * * @param key <#key description#> */- (NSString*)localeStringWithKey:(NSString*)key{ // Get the language code. NSString *languageCode = self.language; // Get the relevant language bundle. NSString *bundlePath = [[NSBundle mainBundle] pathForResource:languageCode ofType:@"lproj"]; NSBundle *languageBundle = [NSBundle bundleWithPath:bundlePath]; // Get the translated string using the language bundle. NSString *translatedString = [languageBundle localizedStringForKey:key value:@"" table:nil]; if (translatedString.length < 1) { // There is no localizable strings file for the selected language. translatedString = NSLocalizedStringWithDefaultValue(key, nil, [NSBundle mainBundle], key, key); } return translatedString;}
Swift:
//擷取國際化enum AppLanguage:String{ case en = "en" case zh_Hans = "zh-Hans" case zh_Hant = "zh-Hant"}func localString(key:String) -> String{ // Get the language code. let languageCode = XPApplication.shareInstance.language // Get the relevant language bundle. let bundlePath = NSBundle.mainBundle().pathForResource(languageCode, ofType: "lproj") let languageBundle = NSBundle.init(path: bundlePath!) // Get the translated string using the language bundle. var translatedString = languageBundle?.localizedStringForKey(key, value: "", table: nil) if translatedString?.length < 1 { // There is no localizable strings file for the selected language. translatedString = NSLocalizedString(key, tableName: nil, bundle: NSBundle.mainBundle(), value: key, comment: key) } return translatedString!;}