【iOS】國際化(對一些有用資源的彙總)

在做iOS的國際化時候遇到一些問題,現在已經解決了。本篇博客用於記錄我使用過程中參考的一些幫助。

【1】原文地址:http://blog.csdn.net/xwren362922604/article/details/17190061

前言:網絡上關於iOS國際化的文章很多,但基本上都是基於跟隨系統語言的國際化,筆者就不贅述了-0 –

今天要講的是不跟隨系統的切換語言版本方案,即程序內部的切換語言版本方案。


一、總則:

       應用內部語言不跟隨系統語言,由應用自己進行控制,通過配置多個語言文件,根據用戶的選擇動態獲取不同文件夾下的語言文件,顯示在界面上。

       最後把用戶選擇的語言持久化到本地,下次運行時讀取。


二、應用內的國際化

1、新建工程

      新建Single View Application工程,取名爲MyInternational。

                                                      


2、添加多語言文件

      我們選擇使用自己的語言文件,而不是系統的localizable.string,因爲在項目開發使用svn時,多人操作同一文件可能會造成衝突。

在Resource中添加新的Strings File:

                                                            

       

      取名爲hello(記得Targets要勾選項目)

                                                                 


      新建完成之後會生成hello.string文件,把它拖進Supporting Files裏。


3、配置hello.string國際化

      首先配置剛纔的hello.string文件。

      點擊hello.strings文件,點擊圈中的Make localized(本地化)。

                                                                             

    

      只有English,沒關係點擊確定。

                                                                


4、配置項目國際化

      網絡上很多配置方法不靠譜,因爲新版的Xcode位置“+”號的位置換了,這裏教大家正確的方法,點擊項目—>選擇Project—>選擇Info—>點擊“+”號。

                                                     


      點擊“+”號後,添加中文,當然也可以添加其他的語言,彈出對話框,infoPlist是配置系統的國際化文件,可以配置圖標之類的多語言環境,不屬於本文範圍,nib文件看需要配,這裏選擇不配。

                                                      

      

      配置完成之後,再看hello.string便分成了兩個文件。

                                                                                 

      完成上面的四步便完成了項目內的多語言環境配置,下面來看看代碼怎麼寫。


5、添加需要的字符串

      分別在hello.strings(English)與hello.strings(Chinese)裏面添加對應語言的字符串。

      字符串的格式爲“key”=“value”;鍵值對(別忘記分號!)

      接下來配置項目需要的字符串,一個用於lable的顯示,一個用於button的顯示。

 

    hello.strings(English)

    "invite" ="hello atany,come to join in us!";

   "buttonInfo" ="change Language";

 

    hello.strings(Chinese)

    "invite" ="你好 atany,快來加入我們吧!";

    "buttonInfo" ="切換語言";

 

6、看看流程

                                                     

【實現思路:】

      在初始化首個Controller的時候,進行應用語言的加載。首次加載因爲userLanguage(應用內語言)不存在,則使用系統當前的語言,保存到userlanguage,下次直接讀。讀出來之後,獲取到對應文件路徑,得到文件的索引,儲存到工具類InternationalControl的靜態變量bundle中。

其他地方需要用字符串時,用工具類獲得bundle即可讀取相應文件中的字符串。


7、新建工具類InternationalControl

                           

InternationalControl.h

  1. #import <Foundation/Foundation.h>  
  2.   
  3. #import <UIKit/UIKit.h>  
  4.   
  5. @interface InternationalControl : NSObject  
  6.   
  7. +(NSBundle *)bundle;//獲取當前資源文件  
  8.   
  9. +(void)initUserLanguage;//初始化語言文件  
  10.   
  11. +(NSString *)userLanguage;//獲取應用當前語言  
  12.   
  13. +(void)setUserlanguage:(NSString *)language;//設置當前語言  
  14.   
  15. @end  

InternationalControl.m

1)創建靜態變量bundle,以及獲取方法bundle(注:此處不要使用getBundle)。

  1. static NSBundle *bundle = nil;  
  2.   
  3. + ( NSBundle * )bundle{  
  4.       
  5.     return bundle;  
  6.   
  7. }  

2)初始化方法:

 userLanguage儲存在NSUserDefaults中,首次加載時要檢測是否存在,如果不存在的話讀AppleLanguages,並賦值給userLanguage。
  1. +(void)initUserLanguage{  
  2.       
  3.     NSUserDefaults *def = [NSUserDefaults standardUserDefaults];  
  4.       
  5.     NSString *string = [def valueForKey:@"userLanguage"];  
  6.        
  7.     if(string.length == 0){  
  8.           
  9.         //獲取系統當前語言版本(中文zh-Hans,英文en)  
  10.   
  11.         NSArray* languages = [def objectForKey:@"AppleLanguages"];  
  12.           
  13. <pre class="cpp" name="code">        NSString *current = [languages objectAtIndex:0];  
  14.           
  15.         string = current;  
  16.           
  17.         [def setValue:current forKey:@"userLanguage"];  
  18.           
  19.         [def synchronize];//持久化,不加的話不會保存  
  20. }  
  21.   
  22.     //獲取文件路徑  
  23.     NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@"lproj"];  
  24.       
  25.     bundle = [NSBundle bundleWithPath:path];//生成bundle  
  26. }  
  27. </pre>  

3)獲得當前語言方法

  1. +(NSString *)userLanguage{  
  2.       
  3.     NSUserDefaults *def = [NSUserDefaults standardUserDefaults];  
  4.       
  5.     NSString *language = [def valueForKey:@"userLanguage"];  
  6.       
  7.     return language;  
  8. }  

4)設置語言方法

  1. +(void)setUserlanguage:(NSString *)language{  
  2.       
  3.     NSUserDefaults *def = [NSUserDefaults standardUserDefaults];  
  4.       
  5.     //1.第一步改變bundle的值  
  6.     NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj" ];  
  7.       
  8.     bundle = [NSBundle bundleWithPath:path];  
  9.       
  10.     //2.持久化  
  11.     [def setValue:language forKey:@"userLanguage"];  
  12.       
  13.     [def synchronize];  
  14. }  

8、拖nib,配置點擊事件

一個button,一個label,button用於切換語言,label用於顯示信息。

                                                                        


9、配置加載的第一個Controller,這裏是YGViewController

YGViewController.h

  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface YGViewController : UIViewController  
  4.   
  5. @property (retain, nonatomic) IBOutlet UILabel *inviteLabel;//label  
  6.   
  7. - (IBAction)changeLanguage:(id)sender;//點擊事件  
  8.   
  9. @property (retain, nonatomic) IBOutlet UIButton *btChange;//button  
  10.   
  11. @end  


YGViewController.m

1)加載:

  1. - (void)viewDidLoad  
  2. {  
  3.     //註冊通知,用於接收改變語言的通知  
  4.     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLanguage) name:@"changeLanguage" object:nil];  
  5.   
  6.     [InternationalControl initUserLanguage];//初始化應用語言  
  7.       
  8.     NSBundle *bundle = [InternationalControl bundle];  
  9.       
  10.     NSString *inviteMsg = [bundle localizedStringForKey:@"invite" value:nil table:@"hello"];  
  11.   
  12.     NSString *buttonInfo = [bundle localizedStringForKey:@"buttonInfo" value:nil table:@"hello"];//table爲hello.string的文件名  
  13.       
  14.     [_btChange setTitle:buttonInfo forState:UIControlStateNormal];  
  15.       
  16.     _inviteLabel.text = inviteMsg;  
  17.       
  18.     [super viewDidLoad];  
  19. }  

2)點擊修改語言方法

  1. - (IBAction)changeLanguage:(id)sender {  
  2.       
  3.     NSString *lan = [InternationalControl userLanguage];  
  4.       
  5.     if([lan isEqualToString:@"en"]){//判斷當前的語言,進行改變  
  6.       
  7.         [InternationalControl setUserlanguage:@"zh-Hans"];  
  8.       
  9.     }else{  
  10.       
  11.         [InternationalControl setUserlanguage:@"en"];  
  12. }  
  13.       
  14.     //改變完成之後發送通知,告訴其他頁面修改完成,提示刷新界面  
  15.     [[NSNotificationCenter defaultCenter] postNotificationName:@"changeLanguage" object:nil];  
  16. }  

3)接收到通知執行方法,刷新界面

  1. -(void)changeLanguage{  
  2.       
  3.     [_btChange setTitle:[[InternationalControl bundle] localizedStringForKey:@"buttonInfo" value:nil table:@"hello"] forState:UIControlStateNormal];  
  4.       
  5.     _inviteLabel.text =[[InternationalControl bundle] localizedStringForKey:@"invite" value:nil table:@"hello"];  
  6. }  

如果有多個界面的話,需要每個界面都配置接收通知,用於修改界面。


10、運行界面

                                                                             


                                                                             

可以看到點擊切換語言之後,語言切換成功。

退出程序再次進入,保留了上次選擇的語言。

 

atany原創,轉載請註明博主與博文鏈接,3Q吐舌頭

 http://blog.csdn.net/yang8456211/article/details/12031667

 —— by atany



【2】原文地址:http://www.cocoachina.com/bbs/read.php?tid=149950

需求描述:應用內部有一按鈕,點擊切換語言(如中英文切換)。
說起來這個是好久以前做的一個功能點了,剛開始也是沒有頭緒,後來解決了發現很簡單,把方法分享一下。
1.原理。
查看NSLocalizedString(@"abc",nil);的定義。

#define NSLocalizedString(key, comment) \
        [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

然後思考,爲什麼這個定義會定位到當前系統默認的語言對應的strings文件呢?
如果這點想通了,那問題就迎刃而解了不是?

2.具體解析
重定義NSLocalizedstring。

?
1
2
3
#define AppLanguage @"appLanguage"
#define CustomLocalizedString(key, comment) \
[[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]] localizedStringForKey:(key) value:@"" table:nil]

不用解釋了吧?查找對應的strings文件。

3.用法
?
1
2
3
4
     if (![[NSUserDefaults standardUserDefaults]objectForKey:AppLanguage]) {
            [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:AppLanguage];
        }
label.text= CustomLocalizedString(@"sub_menu_download", nil);//@"離線下載";


4.切換
點擊中英文切換按鈕時,
?
1
2
3
4
5
6
7
8
NSString *currentLanguage = [[NSUserDefaults standardUserDefaults]objectForKey:AppLanguage];
        if ([currentLanguage isEqualToString: @"en"]) {
            [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:AppLanguage];
        }else
        {
            [[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:AppLanguage];
        }
        [[NSUserDefaults standardUserDefaults] synchronize];

程序還要再做進一步的界面相關的處理,如是tabbar則重新初始化等等 


【3】http://www.cnblogs.com/tangbinblog/p/3898046.html  

IOS APP 國際化(實現不跟隨系統語言,不用重啓應用,代碼切換stroyboard ,xib ,圖片,其他資源)

(具體內容就不貼了)




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