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

來源:互聯網
上載者:User

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

系統按鈕和資訊本地化

還記得天氣預報應用背後的“完成”按鈕嗎,它在中文環境下是“完成”,在英語環境下是“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,從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參數,然後在檔案中進行修改。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.