國際化(Internationalization)和本地化(Localization)

根據(jù)用戶的本地語言,處理文本的輸入和輸出。

處理不同的日期,時(shí)間,數(shù)字顯示格式

利用合適的日歷和時(shí)區(qū)處理日期。

把不同國家的文字放在app的bundle中的分開的不同的文件中

iOS使用 .strings 文件擴(kuò)展名的文件來存儲所有的本地化字符串,每種支持的語言都有一個或多個。使用一個函數(shù)調(diào)用根據(jù)設(shè)備上使用的當(dāng)前語言檢索請求的字符串。

選擇菜單欄中的 File\New\File ,選擇 iOS\Resource\Strings File 并點(diǎn)擊 Next

命名為 Localizable 點(diǎn)擊CreateLocalizable.strings 是iOS默認(rèn)的用作本地化文字的文件名稱。除非在引入時(shí)每次輸入.strings文件,否則不要命名成其他名字。

.strings 文件中包含鍵值對的文本內(nèi)容,像字典一樣。

"KEY" = "Content";

Localizable.strings 文件中添加以下內(nèi)容

"工作時(shí)長" = "work hours";
"你已經(jīng)工作了 %.1f 小時(shí)" = "You have been working for %.1f hours";

NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment)是訪問這些本地化字符串的主要工具。其中tbl, bundle等參數(shù)有默認(rèn)值,所以只需要指定 key 和 comment 就可以了。 comment 參數(shù)是用來提示翻譯者這個字符串在APP中哪個地方使用的。

最長使用的是 NSLocalizedString(@"KEY", @"comment") 方法。

self.workTimeLabel.text = [NSString stringWithFormat: NSLocalizedString(@"你已經(jīng)工作了 %.1f 小時(shí)", nil), self.duration];

添加其他語言

點(diǎn)擊 project 找到 Info 標(biāo)簽, 在 Localizations 處點(diǎn)擊左下角的+ 按鈕,添加在中文語言,下一步選中要國際化的文件,點(diǎn)擊確定。

在Xcode的右側(cè)面板中點(diǎn)擊 Localize... 。此時(shí) Xcode 會生成一些文件,lproj 結(jié)尾的文件夾,每一種語言對應(yīng)一個文件夾。App在尋找對應(yīng)的語言文件夾中的資源時(shí),如果沒找到,或者資源不存在,iOS會從 Base.lproj 中獲取資源。

Localizable.strings(Simplified) 文件中,添加中文

"工作時(shí)長" = "工作時(shí)長";
"你已經(jīng)工作了 %.1f 小時(shí)" = "你已經(jīng)工作了 %.1f 小時(shí)";
"過了半小時(shí)" = "過了半小時(shí)";

Edit scheme… 中選擇中文語言,運(yùn)行。

國際化 Storyboards

可以把 Storyboards 中的所有UI控件通過IBOut連線到對應(yīng)的控制器中,在控制器中使用NSLocalizedString(_:tableName:bundle:value:comment:)方法對屬性賦值,可以達(dá)到國際化Storyboards的目的。

這種方法比較麻煩,因?yàn)橛行︰I控件的文字是不變的,不需要連線到控制器中。有一種簡便的方式,點(diǎn)擊Xocde左邊的Main.storyboard左側(cè)的三角符號并展開折疊,在 Main.strings(Simplified) 中替換要國際化的文字。

/* Class = "UIButton"; normalTitle = "過了半小時(shí)"; ObjectID = "MJk-Y7-jXL"; */
"MJk-Y7-jXL.normalTitle" = "過了半小時(shí)";

/* Class = "UILabel"; text = "你已經(jīng)工作了5小時(shí)"; ObjectID = "dLk-5u-xPE"; */
"dLk-5u-xPE.text" = "你已經(jīng)工作了5小時(shí)";

/* Class = "UILabel"; text = "工作時(shí)長"; ObjectID = "m31-Xi-Gp2"; */
"m31-Xi-Gp2.text" = "工作時(shí)長";

Demo

要實(shí)現(xiàn)的效果如下

點(diǎn)擊下方的按鈕,第二行的文字會動態(tài)變化


添加要國際化的語言

確保要國際化的文件都選中,點(diǎn)擊 Finish

展開Main.storyboard文件,配置storyboard文字信息
新建Localizable.strings文件,并點(diǎn)擊右側(cè)的Localize...

在右側(cè)的Localize...區(qū)域,選中對應(yīng)的語言

編寫對應(yīng)的代碼
#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *workTimeLabel;
@property (nonatomic, assign) CGFloat duration;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.duration = 5.0;
}

- (IBAction)timeButton:(UIButton *)sender {
    self.duration += 0.5;
    self.workTimeLabel.text = [NSString stringWithFormat: NSLocalizedString(@"你已經(jīng)工作了 %.1f 小時(shí)", nil), self.duration];
    [self.workTimeLabel setHidden:NO];
}

@end
選擇對應(yīng)的語言進(jìn)行測試

demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。