溫馨提示×

溫馨提示×

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

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

iOS開發(fā)那些事-iOS應(yīng)用本地化-文本信息本地化

發(fā)布時間:2020-06-21 18:01:39 來源:網(wǎng)絡(luò) 閱讀:722 作者:tony關(guān)東升 欄目:移動開發(fā)

文本信息本地化在本地化工作中占有很大的比例。包括了:應(yīng)用名稱本地化、系統(tǒng)按鈕和信息本地化,以及靜態(tài)文本信息本地化。

系統(tǒng)按鈕和信息本地化

還記得天氣預(yù)報應(yīng)用背后的“完成”按鈕嗎,它在中文環(huán)境下是“完成”,在英語環(huán)境下是“Done”。

iOS開發(fā)那些事-iOS應(yīng)用本地化-文本信息本地化

還有一些系統(tǒng)給我們的提示信息,連接藍牙設(shè)備時的系統(tǒng)提示。它在中文環(huán)境下是中文提示,在英語環(huán)境下是英文提示。

iOS開發(fā)那些事-iOS應(yīng)用本地化-文本信息本地化

系統(tǒng)按鈕上的文本和系統(tǒng)提示信息的文字我們都是不能修改的,但是如果我們不進行本地化的設(shè)置,即便是這些基本信息也一直都是英文顯示。我們可以嘗試在故事板中創(chuàng)建畫面,在導(dǎo)航欄中放置兩個系統(tǒng)按鈕Done和Edit。然后分別在英文和中文環(huán)境下運行看看是否有變化。

iOS開發(fā)那些事-iOS應(yīng)用本地化-文本信息本地化

事實上,它們一直都沒有變化,這是什么原因?原因在于我們沒有對工程本進行地化設(shè)置,打開工程中的PROJECT選擇L10N,點擊Localizations下面“+”,彈出菜單選擇“Chinese(zh-Hans)”,這樣就添加了簡體中文本地化文件。

iOS開發(fā)那些事-iOS應(yīng)用本地化-文本信息本地化

這樣我們的工程就同時支持中文和英文的本地化了,系統(tǒng)按鈕和提示信息等也都已經(jīng)實現(xiàn)本地化了,這個過程不需要編寫代碼。

應(yīng)用名稱本地化

應(yīng)用程序名稱本地化是一個很重要的問題,左圖是中文語言環(huán)境下的iPod touch桌面,右圖是英文語言環(huán)境下的iPod touch桌面。我們會看到日歷、地圖、股市等幾個應(yīng)用名稱都有本地化。

iOS開發(fā)那些事-iOS應(yīng)用本地化-文本信息本地化

我們要編寫一個應(yīng)用它的英文名是:“Localization”,中文名是:“本地化”。打開工程L10N應(yīng)用,找到工程中的L10N-Info.plist文件,該文件是工程屬性文件,應(yīng)用程序名稱就是在這個文件中定義的,但是我們不能在這里本地化,要想本地化必須借助于另一個文件InfoPlist.strings,InfoPlist.strings是可以本地化的。在上一節(jié)系統(tǒng)按鈕和信息本地化后,InfoPlist.strings下面會有兩個文件:InfoPlist.strings(English)和InfoPlist.strings(Chinese)。打開Finder看到en.lproj和zh-Hans.lproj,它們的目錄結(jié)構(gòu)如下:

├── en.lproj

│   ├── InfoPlist.strings

│   └── MainStoryboard.storyboard

└── zh-Hans.lproj

   ├── InfoPlist.strings

   └── MainStoryboard.storyboard

CFBundleDisplayName和CFBundleName的鍵能夠配置應(yīng)用名字,CFBundleDisplayName鍵配置應(yīng)用顯示的名字。CFBundleName配置應(yīng)用短名字,不超過16字符,顯示菜單欄和應(yīng)用窗口信息中。

InfoPlist.strings(Chinese)文件的內(nèi)容如下:

CFBundleDisplayName="本地化";

CFBundleName="本地化";

InfoPlist.strings(English)文件的內(nèi)容如下:

CFBundleDisplayName="Localization";

CFBundleName="L10N";

運行結(jié)果,圖標下文字顯示的是CFBundleDisplayName鍵配置的名字。

iOS開發(fā)那些事-iOS應(yīng)用本地化-文本信息本地化

程序代碼輸出的靜態(tài)文本本地化

應(yīng)用中的靜態(tài)文本都應(yīng)該實現(xiàn)本地化,但是它們可能是通過程序代碼輸出,也可能是通過IB在nib或故事板設(shè)計輸出的。采用“Tabbed Application”工程模板創(chuàng)建的標簽應(yīng)用程序,它的兩個標簽上的標題First和Second,以及畫面中的文字都屬于靜態(tài)文本。

iOS開發(fā)那些事-iOS應(yīng)用本地化-文本信息本地化

同樣都是這個工程如果在創(chuàng)建過程中分別創(chuàng)建基于故事板和nib技術(shù)的兩個版本,故事板版本的兩個標簽上的標題是通過IB在編寫在故事板文件中的(關(guān)于故事板和nib中靜態(tài)文本的本地化我們會在下一節(jié)介紹)。但在nib版本中兩個標簽上的標題通過程序代碼輸出的。FirstViewController.m中的構(gòu)造方法:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

   self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

   if (self) {

       self.title = NSLocalizedString(@"First", @"First");

       self.tabBarItem.p_w_picpath = [UIImage p_w_picpathNamed:@"first"];

   }

   return self;

}

SecondViewController.m中的構(gòu)造方法:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

   self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

   if (self) {

       self.title = NSLocalizedString(@"Second", @"Second");

       self.tabBarItem.p_w_picpath = [UIImage p_w_picpathNamed:@"second"];

   }

   return self;

}

在這個兩個構(gòu)造方法中設(shè)置標題屬性的時候使用了NSLocalizedString宏,NSLocalizedString宏本質(zhì)上是調(diào)用NSBundle的localizedStringForKey:value:table:方法,NSLocalizedString是從默認字符串資源文件(Localizable.strings)中取出本地化的字符串。

字符串資源文件默認命名為Localizable.strings,文件采用UTF-16編碼。如果靜態(tài)文本不是很多可以自己創(chuàng)建Localizable.strings文件。選擇“Supporting Files”組,打開菜單File→New→File…,選擇iOS→Resource→String File,輸入文件名“Localizable.strings”。

iOS開發(fā)那些事-iOS應(yīng)用本地化-文本信息本地化

選擇文件Localizable.strings打開文件顯示檢查器,點擊Localization中的“Make localized”按鈕,這可以幫助我們創(chuàng)建本地化的Localizable.strings文件。

iOS開發(fā)那些事-iOS應(yīng)用本地化-文本信息本地化

點擊“Make localized”按鈕彈出一個選擇本地化語言的對話框。我們可以選擇English,然后點擊Localize按鈕。

iOS開發(fā)那些事-iOS應(yīng)用本地化-文本信息本地化

然后再按照事實上,添加簡體中文本地化文件

iOS開發(fā)那些事-iOS應(yīng)用本地化-文本信息本地化

英文版中Localizable.strings文件中添加內(nèi)容:

/* First */

"First" = "First";

/* Second */

"Second" = "Second";

中文版中Localizable.strings文件中添加內(nèi)容:

/* First */

"First" = "第一";

/* Second */

"Second" = "第二";

使用genstring工具

但是有的時候字符串很多,提取和編寫起來很麻煩,此時我們可以借助于命令行工具genstring,從m或mm文件中掃描下面宏,并取出字符串輸出到本地化文件中。

CFCopyLocalizedString

CFCopyLocalizedStringFromTable

CFCopyLocalizedStringFromTableInBundle

CFCopyLocalizedStringWithDefaultValue

NSLocalizedString

NSLocalizedStringFromTable

NSLocalizedStringFromTableInBundle

NSLocalizedStringWithDefaultValue

CF開頭宏和NS開頭宏兩兩對應(yīng),NS開頭宏是Foundation 框架是基于Objective-C語言的,CF開頭宏是Core Foundation 框架是基于c語言的。NSLocalizedStringFromTable和NSLocalizedStringFromTableInBundle函數(shù)是在自定義字符串資源文件名時使用。

下面是genstrings命名的基本語法:

genstrings [-a] [-q] [-o <outputDir>] sourcefile

其中參數(shù):

-a 在存在的文件后面追加內(nèi)容

-q 關(guān)閉多個鍵/值對的警告

-o 指定輸出目錄

因此如果我們想輸出到en.lproj目錄,則代碼如下:

genstrings -o en.lproj  *.m

這樣就在en.lproj目錄下面產(chǎn)生了Localizable.strings文件,需要注意的是上面的命令每次運行的時候都會覆蓋Localizable.strings文件,如果內(nèi)容不想覆蓋可以使用-a參數(shù),然后在文件中進行修改。


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI