亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS 應用程序內部國際化,不跟隨系統語言

發布時間:2020-07-23 22:37:02 來源:網絡 閱讀:626 作者:xiaobo0134 欄目:移動開發

iOS 應用程序內部國際化,不跟隨系統語言

分類: IOS開發工作筆記 1161人閱讀 評論(0) 收藏 舉報

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

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



一、總則:

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

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



二、應用內的國際化

1、新建工程

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

                                                      iOS 應用程序內部國際化,不跟隨系統語言



2、添加多語言文件

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

在Resource中添加新的Strings File:

                                                            iOS 應用程序內部國際化,不跟隨系統語言


       

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

                                                                 iOS 應用程序內部國際化,不跟隨系統語言


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



3、配置hello.string國際化

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

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

                                                                             iOS 應用程序內部國際化,不跟隨系統語言


    

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

                                                                iOS 應用程序內部國際化,不跟隨系統語言


4、配置項目國際化

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

                                                     iOS 應用程序內部國際化,不跟隨系統語言



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

                                                      iOS 應用程序內部國際化,不跟隨系統語言

      

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

                                                                                 iOS 應用程序內部國際化,不跟隨系統語言


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


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、看看流程

                                                     iOS 應用程序內部國際化,不跟隨系統語言


【實現思路:】

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

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


7、新建工具類InternationalControl

                           iOS 應用程序內部國際化,不跟隨系統語言


InternationalControl.h

[cpp] view plaincopy

  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)。


[cpp] view plaincopy

  1. static NSBundle *bundle = nil;  

  2.   

  3. + ( NSBundle * )bundle{  

  4.       

  5.     return bundle;  

  6.   

  7. }  



2)初始化方法:

 userLanguage儲存在NSUserDefaults中,首次加載時要檢測是否存在,如果不存在的話讀AppleLanguages,并賦值給userLanguage。

[cpp] view plaincopy

  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)獲得當前語言方法

[cpp] view plaincopy

  1. +(NSString *)userLanguage{  

  2.       

  3.     NSUserDefaults *def = [NSUserDefaults standardUserDefaults];  

  4.       

  5.     NSString *language = [def valueForKey:@"userLanguage"];  

  6.       

  7.     return language;  

  8. }  


4)設置語言方法

[cpp] view plaincopy

  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用于顯示信息。

                                                                        iOS 應用程序內部國際化,不跟隨系統語言



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

YGViewController.h

[cpp] view plaincopy

  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)加載:

[cpp] view plaincopy

  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)點擊修改語言方法

[cpp] view plaincopy

  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)接收到通知執行方法,刷新界面

[cpp] view plaincopy

  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、運行界面

                                                                             iOS 應用程序內部國際化,不跟隨系統語言


                                                                             iOS 應用程序內部國際化,不跟隨系統語言


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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

闸北区| 介休市| 嫩江县| 阳山县| 淮安市| 邢台县| 布拖县| 万州区| 图们市| 新民市| 陇川县| 武乡县| 延长县| 静海县| 栾川县| 曲周县| 丰城市| 白玉县| 长武县| 博客| 阿拉善右旗| 洛隆县| 马关县| 台南县| 教育| 郯城县| 慈利县| 广宁县| 巨野县| 十堰市| 长葛市| 潞西市| 临安市| 同德县| 灵川县| 阜新市| 习水县| 东乌珠穆沁旗| 林口县| 布拖县| 视频|