文本資訊本地化在本地化工作中占有很大的比例。包括了:應用名稱本地化、系統按鈕和資訊本地化,以及靜态文本資訊本地化。
系統按鈕和資訊本地化
還記得天氣預報應用背後的“完成”按鈕嗎,它在中文環境下是“完成”,在英語環境下是“done”。
還有一些系統給我們的提示資訊,連接配接藍牙裝置時的系統提示。它在中文環境下是中文提示,在英語環境下是英文提示。
系統按鈕上的文本和系統提示資訊的文字我們都是不能修改的,但是如果我們不進行本地化的設定,即便是這些基本資訊也一直都是英文顯示。我們可以嘗試在故事闆中建立畫面,在導航欄中放置兩個系統按鈕done和edit。然後分别在英文和中文環境下運作看看是否有變化。
事實上,它們一直都沒有變化,這是什麼原因?原因在于我們沒有對工程本進行地化設定,打開工程中的project選擇l10n,點選localizations下面“+”,彈出菜單選擇“chinese(zh-hans)”,這樣就添加了簡體中文本地化檔案。
這樣我們的工程就同時支援中文和英文的本地化了,系統按鈕和提示資訊等也都已經實作本地化了,這個過程不需要編寫代碼。
應用名稱本地化
應用程式名稱本地化是一個很重要的問題,左圖是中文語言環境下的ipod touch桌面,右圖是英文語言環境下的ipod touch桌面。我們會看到月曆、地圖、股市等幾個應用名稱都有本地化。
我們要編寫一個應用它的英文名是:“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鍵配置的名字。
程式代碼輸出的靜态文本本地化
應用中的靜态文本都應該實作本地化,但是它們可能是通過程式代碼輸出,也可能是通過ib在nib或故事闆設計輸出的。采用“tabbed application”工程模闆建立的标簽應用程式,它的兩個标簽上的标題first和second,以及畫面中的文字都屬于靜态文本。
同樣都是這個工程如果在建立過程中分别建立基于故事闆和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”。
選擇檔案localizable.strings打開檔案顯示檢查器,點選localization中的“make localized”按鈕,這可以幫助我們建立本地化的localizable.strings檔案。
點選“make localized”按鈕彈出一個選擇本地化語言的對話框。我們可以選擇english,然後點選localize按鈕。
然後再按照事實上,添加簡體中文本地化檔案
英文版中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參數,然後在檔案中進行修改。