使用Xcode6實現應用「國際化」

1、什麼是國際化?測試

  應用國際化簡單來講就是使用你的應用可以讓世界各國的用戶使用。既然須要使各個國家的用戶可以正常的使用,則必然咱們應用必然符合各國用戶所使用的語言。那麼咱們在應用如何去實現這個功能呢?可以使應用基於系統所設置的語言而進行相應的語言變化,符合用戶的須要。下面就來簡單總結一下,如何在項目中實現國際化。優化

2、如何在Xcode6中實現應用國際化?spa

1. 要對應用實現國際化,首先咱們得先設置該項目支持哪幾種語言,默認只支持英語。按下圖所示進行設置(當咱們添加了一種語言後,在 storyboard 文件中會本身添加一個該語言的國際化文件,以.strings結尾):3d

   

2. 對 storyboard 或 xib 文件 實現國際化:code

  a. 首先注意:通常咱們進行國際化操做時,最好是在項目完成以後來作此操做,由於當咱們添加其它語言到項目中的時候,Xcode會自動爲storyboard文件生成該語言對應的國際化文件,且只會對現有的控件進行相關描述。若是後面咱們再添加一些其它的控件的話,Xcode不會自動更新對這些控件的國際化支持,須要咱們手動去操做,因此建議在項目開發完成後再作此操做,會方便不少。orm

  b. 因爲在 storyboard 中,在添加其它語言後Xcode會自動生成相應的國際化文件,因此 針對 storyboard 中的控件的國際化相對比較簡單。咱們只須要在對應語言的國際化文件中將對應key的值改爲相應語言的描述便可。以下圖所示(左圖所示是修改後的中文、右圖爲英文):blog

   

  在上圖中須要注意的一點是,若是在文件中存在相同名稱的控件描述,如在兩個不一樣的控制器中都有一個取消按鈕的狀況,那麼咱們如何區別哪一個按鈕在國際化文件中對應的key是哪一個呢?這個咱們能夠在 storyboard 中當咱們選中某個控件的時候,在下圖所示位置能夠就看到對應控件key的名稱:ci

  c. 對 storyboard 文件實現國際化就只須要上面幾個步驟,很簡單。但對於xib文件就不適用了。緣由是當咱們初次建立xib文件的時候,Xcode不會自動爲該xib文件實現國際化,不會生成相應的國際化文件(即便你是在建立xib文件以後再添加其它語言)。在xib中咱們須要手動進行設置國際化,步驟也很簡單,以下所示(選中xib文件,點擊localize,默認選中Base後,在Localization下面就會生成相應支持國際化語言的選項,勾選後,在xib文件前面會出現一個三角形按鈕,展開會看到已經生成了相應的國際化文件,一樣建議國際化操做最好在項目完成以後進行,以後的操做同上面storyboard同樣,編寫相應key的國際化描述便可):開發

3. 對項目中的動態文本(即須要在程序中設置的內容,非靜態內容)進行國際化字符串

  a. 使用宏(NSLocalizedStringFromTable),宏只針對字符串字面量纔有用。

  例如,我須要在程序中設置某個UILabel的值,正常狀況下咱們會這樣:

self.titleName.text = @"標題名稱";  

  但在國際化中,不該該這樣寫,要否則就沒法實現所謂的國際化。應該寫成以下的形式:

self.titleName.text = NSLocalizedStringFromTable(@"標題名稱", @"Tab1ViewController", @"此字符串用來顯示標題名稱");

 在國際化版本中應該這樣寫。(參數對應(key, table, comment))。對於全部須要顯示在UI界面上的文本,都須要這樣寫。

 而後咱們須要使用終端命令來生成.strings國際化文件。方法以下:

 打開終端 -》進行項目所在文件夾 -》 輸入命令"genstrings *.m" 回車(能夠看到在項目所在文件夾下面生成了一個以.strings結尾的文件,且該文件的文件名將是上面宏中的table的名稱,這樣不一樣的table會對應一個不一樣的文件,便於管理,固然也能夠放到同一個table裏面,若是內容較少的話) -》 將.strings文件拖到工程裏面。

      

 只生成文件還不夠,接下來還須要對該文件進行「本地化」操做。方法與上面提到的將 xib 文件進行國際化的方法同樣:選中該.strings文件 -》 點擊「localized」 -》 勾選全部須要支持的語言項 -》自動生成對應的語言文件 -》在各自的語言文件中修改相應的key對應的該語言的描述便可。

 b. 若是咱們想將某個變量或某個方法的返回值看成key的話,此時使用宏來完成國際化操做將會不可行,那怎麼辦呢?

  如須要將變量或方法的返回值做爲key的話,咱們就須要使用NSBundle中的方法來進行國際化操做,實際上,在上面的宏中,封裝的就是NSBundle的方法,宏只是讓咱們操做更方便而已,但對於變量或方法宏就沒法支持,須要咱們手動操做。以下所示:

NSString *title = @"標題名稱2";
self.titleName.text = [[NSBundle mainBundle] localizedStringForKey:title value:@"國際化測試" table:@"TabBarCustom"];

  這樣咱們就能當變量或方法的返回值看成key,生成國際化文件。說到國際化文件,若是咱們不是使用宏的話,當咱們使用命令genstrings的時候,並不會自動生成國際化文件,此命令只會掃描應用中用宏聲明的值。因此咱們這裏須要去手動建立.strings文件。建立.strings文件的步驟是:新建文件 -》 選擇"Resource" -》strings file 便可,但注意這裏的文件名應該與上面的table名稱一致,若是table有值的話。建立好strings文件後,接下來的操做就跟前面xib中國際化差很少了。也是選中文件 -》選擇localize -》勾選須要支持的語言 -》在生成的相應文件中給對應的key實現相應語言的描述便可。

4.對 Setting Bundle 的國際化

  應用程序的 Setting Bundle是提供給用戶在系統的「設置」程序中給應用程序作一些快捷設置或默認設置的功能。因爲展現在「設置」程序中的內容是由咱們本身去配置的,而在用戶更改系統語言時,也並不會自動去更改這裏的語言,因此咱們也應該對此進行國際化設置。針對 Setting Bundle 的國際化比較簡單。咱們只須要在 Setting Bundle裏面增長一個語言文件,並修改相應語言的描述便可。具體操做見下圖:

首先咱們能夠看到在 Setting.bundle 文件展現下面已經有一個用於語言描述的國際化文件夾,只不過默認是英文的。

而後選中Setting.bundle文件,右鍵點擊 Show in Finder

接着在Finder中選中Setting.bundle文件,右鍵點擊 顯示包內容

在包內容中咱們會看到最初只有一個en.lproj的文件夾,此時咱們須要再添加一個您須要支持的語言的文件夾,但此處命名是有規範的,不能隨便亂寫。以下面我增長的是中文語言支持的文件夾,其中Root.plist能夠從en.lproj中copy,但copy後須要修改對應key的相應語言描述便可。(固然你也能夠直接copy整個文件夾,修改一下名稱便可)這樣,當系統切換到相應語言時,設置中對應該應用的描述也會作相應的改變,實現國際化操做。

5.對數字的國際化

咱們都知道,世界上並非每一個國家的數字表示的方式都徹底同樣的,可能每一個國家都有各自的特色,因此當咱們在界面上顯示某一個數字的時候,也須要符合該用戶所使用語言的特色,而不是一個固定的格式。如最爲明顯的貨幣符號。

咱們以前的寫法是:

CGFloat f = 10002.2;   NSString *str = [NSString stringWithFormat:@「%g」, f]; //將一個CGFloat轉換成NSString

上面的形式f是什麼就是什麼,沒有任何格式可言。但在國際化中咱們須要根據用戶的習慣來實現。

國際化中的寫法:

NSString *str = [NSNumberFormatter localizedStringFromNumber:@(10002.2) numberStyle:NSNumberFormatterDecimalStyle]; //numberStyle也能夠是其它值

同時,咱們在將一個字符串解析成一個數字時,也須要對其它轉換後的格式進行優化:

以前可能的寫法:

NSString *str = @"22000";   int value = [str intValue];

國際化中的寫法:

NSString *userInputtedString = @"22223.2";//變量或字面量
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber *parsedNumber = [formatter numberFromString:userInputtedString];

6. 對日期的國際化

對於日期,這個咱們接觸到的可能更明顯,各個國家的日期顯示格式也是不盡相同的,有的年在前,有的年在後,因此當咱們在界面上顯示一個日期的時候,也須要根據當前用戶所使用的系統語言來決定顯示什麼格式,而不是一個固定的格式。

方法以下:

NSString *dateStr = [NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle]; //返回一個將日期「本地化」後並按指定樣式格式化的字符串

7. 總結

關於國際化的內容目前主要的就這麼些,後續發現再作補充。

相關文章
相關標籤/搜索