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!;
}

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章