iOS本地化01-語言本地化(NSLocalized?String)

下面這段話摘自蘋果的國際化和本地化指南

Localization is the process of translating your app into multiple languages. But before you can localize your app, you internationalize it. Internationalization is the process of making your app able to adapt to different languages, regions, and cultures. Because a single language can be used in multiple parts of the world, your app should adapt to the regional and cultural conventions of where a person resides. An internationalized app appears as if it is a native app in all the languages and regions it supports.
The App Store is available in over 150 different countries, and internationalizing your app is the first step to reach this global market. Using iTunes Connect, you specify whether your app is available in all territories or specific territories. Then you customize your app for each target market that you want to support. Users in other countries want to use your app in a language they understand and see dates, times, and numbers in familiar, regional formats.

本地化是將您的應用翻譯成多種語言的過程。 但是在您可以本地化您的應用之前,您需要將其國際化。 國際化是讓您的應用能夠適應不同語言,地區(qū)和文化的過程。 由于單一語言可用于世界的多個地區(qū),因此您的應用應適應人們居住地區(qū)的地區(qū)和文化習俗。 一個國際化的應用看起來好像它是一個支持所有語言和地區(qū)的本地應用程序。
App Store可在150多個不同的國家/地區(qū)銷售,應用國際化是邁向全球市場的第一步。 使用iTunes Connect,您可以指定您的應用在所有地區(qū)或特定地區(qū)是否可用。 然后,您可以針對您要支持的每個目標市場自定義您的應用。 其他國家的用戶希望以他們理解的語言使用您的應用,并以熟悉的區(qū)域格式查看日期,時間和數(shù)字。

應用中那些字符串需要本地化

一般而言,所有你想以某種形式展現(xiàn)在用戶眼前的字符串都需要本地化,包括標簽和按鈕上的文本,或者在運行時通過格式化字符串和數(shù)據(jù)動態(tài)生成的字符串。

工程配置(添加多語言)

  • 選中PROJECT->INFO->Localizations,然后點擊"+"號,添加你需要的語言類別
  • 創(chuàng)建好工程之后默認的語言為英語。這里我們需要添加簡體中文
  • 添加完畢,我們可以看到有兩種語言Chinese和English!

本地化應用名稱(InfoPlist.strings)

通過InfoPlist.strings文件,應用可以在不同的手機語言環(huán)境中,顯示不同預先設置好的名字。例如,微信在簡體中文環(huán)境下顯示的名字為“微信”,而在英語環(huán)境下顯示為“weChat”。

  • 創(chuàng)建文件。command + N -> iOS -> Resource -> Strings File
  • 文件名字必須為InfoPlist
  • 創(chuàng)建完成之后,可以在工程目錄中看到InfoPlist.strings文件
  • 選中InfoPlist.strings文件,在右側工具欄中,點擊Localize,選擇我們需要本地化的語言
  • 默認為English,點擊Localize
  • 勾選Chinese(Simplified)
  • 創(chuàng)建完成,此時我們可以看到,InfoPlist.strings文件以包含英語以及簡體中文兩種語言的文件
  • 接下來,我們分別在不同的語言文件中設置響應的App名字
  • 我們可以看到在不同的手機語言環(huán)境中,App顯示的名字是不同的。

NSLocalizedString

NSLocalized?String這個宏是字符串本地化的核心。NSLocalizedString提供本地化字符串的 “一次編譯,隨處運行” 的方式,根據(jù)用戶設置的字符串表把所有本地化字符串替換成對應的翻譯。

它有兩個參數(shù)key:進行本地化的唯一字符串標識, comment:用于提供用來準確翻譯的足夠的上下文的字符串。在實踐中,key往往只是用來翻譯的基準字符串,而comment通常是 nil

在運行時,NSLocalizedString首先會確定當前的手機語言環(huán)境,并在應用程序包中找到相應的Localizable.strings文件,查找和參數(shù)匹配的鍵值(在下面的例子中 key==home),然后讀出真正要顯示的字符串。

在實踐中,key 往往只是用來翻譯的基準字符串,而 comment 通常是 nil

在使用NSLocalized?String之前我們需要先創(chuàng)建好相應的Localizable.strings文件,創(chuàng)建的方法跟創(chuàng)建InfoPlist.strings相同,這里就不具體說明了。

基本使用

  • 在不同的文件中為同一個key設置不同的值

執(zhí)行下面的代碼

NSLog(@"Home == %@",NSLocalizedString(@"home", nil));

在英語環(huán)境中,打印的是Home == home,而在中文環(huán)境中,打印的是Home == 主頁

Key鍵值命名建議

如果項目比較巨大的話,Localizable.strings 中的字符串鍵值一定會越來越多。 這就涉及到每個鍵的命名,如果隨意命名,就難免造成混亂,比如:

"home"="主頁";
"myhome"="我的主頁";
"rate"="給個評價";
"newshome"="新聞主頁";
"loadnews"="加載新聞";

一個相對好一些的名稱組織方式是使用命名空間

"main.home"="主頁";
"my.home"="我的主頁";
"my.rate"="給個評價";
"news.home"="新聞主頁";
"news.load"="加載新聞";

這里的命名空間不會有編譯層面的檢測,只是我們在邏輯上的組織,通過對名稱簡單的合理組織,對項目的可維護性會有很大的提高。

另外幾個宏

NSLocalizedStringFromTable(key, tbl, comment)

可以通過tbl參數(shù),用來確定.strings的文件名。 默認情況下,系統(tǒng)會從Main Bundle中加載名稱為Localizable.strings的文件。 如果這樣調(diào)用:

NSLocalizedStringFromTable(@"home", @"town", nil);

那會在town.strings文件中查詢,而不是在默認的Localizable.strings。當項目的規(guī)模比較大時,可以將不同模塊的字符串資源切開分別存放,然后通過相應的tbl加載資源

NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment)

與上面那個宏相比,這一個宏可以指定bundle

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"external" ofType:@"bundle"];
    NSBundle *extBundle = [NSBundle bundleWithPath:bundlePath];
    if (extBundle) {
        NSLocalizedStringFromTableInBundle(@"home", @"table", extBundle, nil);
    }

上面這段代碼,首先加載external.bundle, 然后從這個bundle里面的table.strings文件中查找對應的字符串鍵值home

這樣,除了用文件把字符串分開,還可以把這些文件分散在不同的 Bundle 中。又多了一個維度,對于依賴模塊非常多的大項目中,這個機制還是比較有用的。比如不同模塊的團隊都用同一個鍵值命名字符串,通過文件和 Bundle 的分離,就可以避免重名沖突。

合理的注釋comment

還記得我們最開始例子中的comment參數(shù)吧,用作對這個鍵值的注釋,大多數(shù)鍵值名稱其實已經(jīng)基本表示清除含義了,比如:

"news.home" = "新聞主頁";
"news.load" = "加載新聞";

對于這些鍵值,是否寫注釋都不妨礙理解。 注釋更適合的場景是格式化輸出,比如這樣:

"%d views"="have seen %d views";

上面這個字符串資源本身又是一個格式化輸出模板, 那么我們就可以這樣調(diào)用:

NSString *format = NSLocalizedString(@"%i views", @"{總瀏覽量} views")
print(String(format: format, 20))
NSLog(format, 20);

這里comment給每個格式化參數(shù)的含義做了注釋,這樣其他人就能更快的看懂這段代碼的含義。

調(diào)試技巧

  • 切換語言無需在模擬器中設置,只需要在Xcode中進行如下設置: Edit->Scheme->Run->Options ->Application Languages -> 選擇需要調(diào)試的語言。

結尾

這次介紹了NSLocalizedString的基本用法,以及它的幾個類似宏的應用場景。這幾個宏對于規(guī)模稍大的項目,以及模塊化思路都有很好的幫助。還給大家分享了關于注釋和鍵值命名的一些建議。無論你開發(fā)的 APP 是否真的需要多語言,使用NSLocalizedString而不是直接把字符串寫到代碼里面都是一個相對好一些的選擇,因為能夠輕松地查看所有用戶將看到字符串是很有用的。

最后,喜歡的話請點個贊吧!

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容