iOS開發那些事-iOS應用本地化-文本信息本地化
文本信息本地化在本地化工作中占有很大的比例。包括了:應用名稱本地化、係統按鈕和信息本地化,以及靜態文本信息本地化。
係統按鈕和信息本地化
還記得天氣預報應用背後的“完成”按鈕嗎,它在中文環境下是“完成”,在英語環境下是“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中的構造方法:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = NSLocalizedString(@"Second", @"Second");
self.tabBarItem.image = [UIImage imageNamed:@"second"];
}
return self;
}
在這個兩個構造方法中設置標題屬性的時候使用了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 */
"First" = "第一";
/* Second */
"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參數,然後在文件中進行修改。
最後更新:2017-04-03 18:52:17