1. 程式人生 > >iOS國際化及應用內部實現國際化

iOS國際化及應用內部實現國際化

iOS國際化

包含了App程式的國際化化例如App名字的國際化 、應用內部內容的國際化

介紹的很詳細,包括了圖片,xib,storyboar的國際化,還分享了swift版的demo

iOS應用內切換國際化

/* Method for retrieving localized strings. */
- (NSString *)localizedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName NS_FORMAT_ARGUMENT(1);

應用內部實現切換多語言關鍵是呼叫NSBundl的此方法

key代表在xx.strings檔案中文字對應的關鍵字,value可以直接設為nil,tableName代表xx.strings檔案的名字比如:

  NSString *inviteMsg = [bundle localizedStringForKey:@"title" value:nil table:@"Localizable"];

就是從Lcalizable.strings中讀取key為title的文字,bundel代表Localizable.strings檔案的路徑

1是專案中的國際化檔案,2是在資原始檔中的檔案位置,每一個Localizable.strings不同語言的檔案會放在各自對應語言的資料夾中

Localizable.strings(chinese(Simplifief)) 簡體中文 就放在 zh-Hans.lproj檔案中,

   
        //獲取系統當前語言版本(中文zh-Hans,英文en)
        
        NSArray* languages = [def objectForKey:@"AppleLanguages"];
        
        NSString *current = [languages objectAtIndex:0];
        

可以根據上面的程式碼獲取系通同語言;中文簡體的話 current = @"zh-Hans";

 //獲取檔案路徑
    NSString *path = [[NSBundle mainBundle] pathForResource:current ofType:@"lproj"];
    
    bundle = [NSBundle bundleWithPath:path];//生成bundle

在通過上面紅色字型的NSBundel的方法獲取key對應的文字,返回的是current語言對應的文字

current = @"zh-Hans" 返回的就是中文

所以可以收到設定curren,文字的國際化後的文字,再去顯示。就可以做到應用內部切換國際化了例如

    NSString *path = [[NSBundle mainBundle] pathForResource:@"zh-Hans" ofType:@"lproj"];
    
    bundle = [NSBundle bundleWithPath:path];//生成bundle

NSString *inviteMsg = [bundle localizedStringForKey:@"title" value:nil table:@"Localizable"];
inviteMsg 在任何系統的語言下,都會返回中文

需要注意的是ios系統不同版本current會有所不同

iOS7之前是

zh-Hans: 簡體
zh-Hant: 繁體


iOS8之前是
zh-Hans: 簡體
zh-Hant: 繁體
zh-HK: 香港繁體(增加)


iOS9是
zh-Hans-CN: 簡體(改變)
zh-Hant-CN: 繁體(改變)
zh-HK: 香港繁體  

zh-TW:  臺灣繁體(增加)

如果考慮系統的語言設定,讀取current時,不能直接去獲取bundle,否則zaiios9的情況下,簡體中文時current返回是zh-Hans-CN,生產bundel時會找不到檔案

因為本地的資料夾名字還是zh-Hans,所以可以通過判斷current的字首,再去讀取bundel。

可以通過NSString的hasPrefix:方法判斷current字首是否包含zh-Hans;