天天看點

iOS開發那些事-iOS應用本地化-文本資訊本地化

文本資訊本地化在本地化工作中占有很大的比例。包括了:應用名稱本地化、系統按鈕和資訊本地化,以及靜态文本資訊本地化。

系統按鈕和資訊本地化

還記得天氣預報應用背後的“完成”按鈕嗎,它在中文環境下是“完成”,在英語環境下是“done”。

iOS開發那些事-iOS應用本地化-文本資訊本地化

還有一些系統給我們的提示資訊,連接配接藍牙裝置時的系統提示。它在中文環境下是中文提示,在英語環境下是英文提示。

iOS開發那些事-iOS應用本地化-文本資訊本地化

系統按鈕上的文本和系統提示資訊的文字我們都是不能修改的,但是如果我們不進行本地化的設定,即便是這些基本資訊也一直都是英文顯示。我們可以嘗試在故事闆中建立畫面,在導航欄中放置兩個系統按鈕done和edit。然後分别在英文和中文環境下運作看看是否有變化。

iOS開發那些事-iOS應用本地化-文本資訊本地化

事實上,它們一直都沒有變化,這是什麼原因?原因在于我們沒有對工程本進行地化設定,打開工程中的project選擇l10n,點選localizations下面“+”,彈出菜單選擇“chinese(zh-hans)”,這樣就添加了簡體中文本地化檔案。

iOS開發那些事-iOS應用本地化-文本資訊本地化

這樣我們的工程就同時支援中文和英文的本地化了,系統按鈕和提示資訊等也都已經實作本地化了,這個過程不需要編寫代碼。

應用名稱本地化

應用程式名稱本地化是一個很重要的問題,左圖是中文語言環境下的ipod touch桌面,右圖是英文語言環境下的ipod touch桌面。我們會看到月曆、地圖、股市等幾個應用名稱都有本地化。

iOS開發那些事-iOS應用本地化-文本資訊本地化

我們要編寫一個應用它的英文名是:“localization”,中文名是:“本地化”。打開工程l10n應用,找到工程中的l10n-info.plist檔案,該檔案是工程屬性檔案,應用程式名稱就是在這個檔案中定義的,但是我們不能在這裡本地化,要想本地化必須借助于另一個檔案infoplist.strings,infoplist.strings是可以本地化的。在上一節系統按鈕和資訊本地化後,infoplist.strings下面會有兩個檔案:infoplist.strings(english)和infoplist.strings(chinese)。打開finder看到en.lproj和zh-hans.lproj,它們的目錄結構如下:

├── en.lproj

│   ├── infoplist.strings

│   └── mainstoryboard.storyboard

└── zh-hans.lproj

    ├── infoplist.strings

    └── mainstoryboard.storyboard

cfbundledisplayname和cfbundlename的鍵能夠配置應用名字,cfbundledisplayname鍵配置應用顯示的名字。cfbundlename配置應用短名字,不超過16字元,顯示菜單欄和應用視窗資訊中。

infoplist.strings(chinese)檔案的内容如下:

cfbundledisplayname="本地化";

cfbundlename="本地化"; 

infoplist.strings(english)檔案的内容如下:

cfbundledisplayname="localization";

cfbundlename="l10n";

運作結果,圖示下文字顯示的是cfbundledisplayname鍵配置的名字。

iOS開發那些事-iOS應用本地化-文本資訊本地化

程式代碼輸出的靜态文本本地化

應用中的靜态文本都應該實作本地化,但是它們可能是通過程式代碼輸出,也可能是通過ib在nib或故事闆設計輸出的。采用“tabbed application”工程模闆建立的标簽應用程式,它的兩個标簽上的标題first和second,以及畫面中的文字都屬于靜态文本。

iOS開發那些事-iOS應用本地化-文本資訊本地化

同樣都是這個工程如果在建立過程中分别建立基于故事闆和nib技術的兩個版本,故事闆版本的兩個标簽上的标題是通過ib在編寫在故事闆檔案中的(關于故事闆和nib中靜态文本的本地化我們會在下一節介紹)。但在nib版本中兩個标簽上的标題通過程式代碼輸出的。firstviewcontroller.m中的構造方法:

- (id)initwithnibname:(nsstring *)nibnameornil bundle:(nsbundle *)nibbundleornil

{

    self = [super initwithnibname:nibnameornil bundle:nibbundleornil];

    if (self) {

        self.title = nslocalizedstring(@"first", @"first");

        self.tabbaritem.image = [uiimage imagenamed:@"first"];

    }

    return self;

}

secondviewcontroller.m中的構造方法:

        self.title = nslocalizedstring(@"second", @"second");

        self.tabbaritem.image = [uiimage imagenamed:@"second"];

在這個兩個構造方法中設定标題屬性的時候使用了nslocalizedstring宏,nslocalizedstring宏本質上是調用nsbundle的localizedstringforkey:value:table:方法,nslocalizedstring是從預設字元串資源檔案(localizable.strings)中取出本地化的字元串。

字元串資源檔案預設命名為localizable.strings,檔案采用utf-16編碼。如果靜态文本不是很多可以自己建立localizable.strings檔案。選擇“supporting files”組,打開菜單file→new→file…,選擇ios→resource→string file,輸入檔案名“localizable.strings”。

iOS開發那些事-iOS應用本地化-文本資訊本地化

選擇檔案localizable.strings打開檔案顯示檢查器,點選localization中的“make localized”按鈕,這可以幫助我們建立本地化的localizable.strings檔案。

iOS開發那些事-iOS應用本地化-文本資訊本地化

點選“make localized”按鈕彈出一個選擇本地化語言的對話框。我們可以選擇english,然後點選localize按鈕。

iOS開發那些事-iOS應用本地化-文本資訊本地化

然後再按照事實上,添加簡體中文本地化檔案

iOS開發那些事-iOS應用本地化-文本資訊本地化

英文版中localizable.strings檔案中添加内容:

/* first */

"first" = "first";

/* second */

"second" = "second";

中文版中localizable.strings檔案中添加内容:

"first" = "第一";

"second" = "第二";

使用genstring工具

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

cfcopylocalizedstring

cfcopylocalizedstringfromtable

cfcopylocalizedstringfromtableinbundle

cfcopylocalizedstringwithdefaultvalue

nslocalizedstring

nslocalizedstringfromtable

nslocalizedstringfromtableinbundle

nslocalizedstringwithdefaultvalue

cf開頭宏和ns開頭宏兩兩對應,ns開頭宏是foundation 架構是基于objective-c語言的,cf開頭宏是core foundation 架構是基于c語言的。nslocalizedstringfromtable和nslocalizedstringfromtableinbundle函數是在自定義字元串資源檔案名時使用。

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

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

其中參數:

-a  在存在的檔案後面追加内容

-q  關閉多個鍵/值對的警告

-o  指定輸出目錄

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

genstrings -o en.lproj  *.m

這樣就在en.lproj目錄下面産生了localizable.strings檔案,需要注意的是上面的指令每次運作的時候都會覆寫localizable.strings檔案,如果内容不想覆寫可以使用-a參數,然後在檔案中進行修改。

繼續閱讀