Resource Programming Guide (二)

字符串資源

本地化過程的一個(gè)重要部分是本地化應(yīng)用程序顯示的所有文本字符串。根據(jù)其性質(zhì),位于nib文件中的字符串可以隨其他的nib文件內(nèi)容一起容易定位兰珍。然而锉矢,嵌入在代碼中的字符串必須被提取梯嗽,本地化,然后重新插入到代碼中沽损。為了簡(jiǎn)化此過程灯节,并且使代碼維護(hù)變得更簡(jiǎn)單 - OS X和iOS提供了將代碼分離字符串所需的基礎(chǔ)架構(gòu),并將它們放置在可以輕松進(jìn)行本地化的資源文件中。

包含可本地化字符串的資源文件被稱為字符串文件炎疆,因?yàn)樗鼈兊奈募U(kuò)展名是.strings卡骂。您可以根據(jù)需要手動(dòng)或編程創(chuàng)建字符串文件。標(biāo)準(zhǔn)字符串文件格式由一個(gè)或多個(gè)鍵值對(duì)以及可選注釋組成形入。給定對(duì)中的鍵和值是以雙引號(hào)括起來并以等號(hào)分隔的文本字符串全跨。 (您還可以使用字符串文件的屬性列表格式,在這種情況下亿遂,頂級(jí)節(jié)點(diǎn)是字典浓若,該字典的每個(gè)鍵值對(duì)都是字符串條目。)

清單2-1顯示了一個(gè)簡(jiǎn)單的字符串文件蛇数,其中包含默認(rèn)語言的非本地化條目挪钓。當(dāng)您需要顯示一個(gè)字符串時(shí),將左側(cè)的字符串傳遞給可用的字符串加載例程之一耳舅。您所得到的是包含最適合當(dāng)前用戶的文本轉(zhuǎn)換的匹配值字符串碌上。對(duì)于開發(fā)語言,通常對(duì)鍵和值使用相同的字符串浦徊,但這不是必需的。

清單2-1一個(gè)簡(jiǎn)單的字符串文件

/* Insert Element menu item */
"Insert Element" = "Insert Element";
/* Error string used for unknown error types. */
"ErrorString_1" = "An unknown error occurred.";

典型的應(yīng)用程序每個(gè)定位至少有一個(gè)字符串文件辑畦,也就是每個(gè)bundle的.lproj子目錄中的一個(gè)字符串文件。默認(rèn)字符串文件的名稱為L(zhǎng)ocalizable.strings蚯妇,但您可以使用您選擇的任何文件名創(chuàng)建字符串文件暂筝。創(chuàng)建字符串文件將在“創(chuàng)建字符串資源文件”中進(jìn)行更深入的討論。

注意:建議使用UTF-8編碼保存字符串文件陨收,這是標(biāo)準(zhǔn)字符串文件的默認(rèn)編碼鸵赖。當(dāng)將字符串文件復(fù)制到產(chǎn)品中時(shí),Xcode會(huì)將字符串文件自動(dòng)轉(zhuǎn)碼為UTF-8到UTF-16它褪。有關(guān)標(biāo)準(zhǔn)字符串文件格式的更多信息,請(qǐng)參閱創(chuàng)建字符串資源文件茫打。有關(guān)Unicode及其文本編碼的更多信息居触,請(qǐng)?jiān)L問http://www.unicode.org/http://en.wikipedia.org/wiki/Unicode妖混。
字符串資源(本地化和非本地化)的加載最終依賴于在OS X和iOS中發(fā)現(xiàn)的捆綁和國(guó)際化支持。有關(guān)軟件包的信息轮洋,請(qǐng)參閱捆綁編程指南制市。有關(guān)國(guó)際化和本地化的更多信息,請(qǐng)參閱國(guó)際化和本地化指南弊予。

創(chuàng)建字符串資源文件

雖然您可以手動(dòng)創(chuàng)建字符串文件祥楣,但很少需要這樣做。如果您使用適當(dāng)?shù)淖址虞d宏編寫代碼汉柒,則可以使用genstrings命令行工具來提取這些字符串并為您創(chuàng)建字符串文件荣堰。

以下部分介紹如何設(shè)置源文件以便于使用genstrings工具的過程。有關(guān)該工具的詳細(xì)信息竭翠,請(qǐng)參閱genstrings手冊(cè)頁。

選擇哪個(gè)字符串進(jìn)行本地化

當(dāng)涉及本地化應(yīng)用程序的界面時(shí)薇搁,本地化應(yīng)用程序使用的每個(gè)字符串并不總是適當(dāng)?shù)恼拧7g是一個(gè)昂貴的過程,翻譯用戶永遠(yuǎn)不會(huì)看到的字符串是浪費(fèi)時(shí)間和金錢啃洋。不向用戶顯示的字符串传货,例如您的應(yīng)用程序內(nèi)部使用的通知名稱,不需要翻譯宏娄。請(qǐng)考慮以下示例:

if(CFStringHasPrefix(value问裕,CFSTR(“ - ”)){CFArrayAppendValue(myArray,value);};

在這個(gè)例子中孵坚,字符串“ - ”在內(nèi)部使用粮宛,用戶永遠(yuǎn)不會(huì)看到;因此,它不需要放在字符串文件中卖宠。

以下代碼顯示了用戶看不到的字符串的另一個(gè)示例扛伍。字符串“%d%d%s”不需要本地化鳖宾,因?yàn)橛脩粲肋h(yuǎn)不會(huì)看到它鼎文,并且對(duì)用戶看不到的任何內(nèi)容都沒有影響漂问。

matches = sscanf(s栏饮,“%d%d%s”袍嬉,&first伺通,&last,&other);

因?yàn)閚ib文件是單獨(dú)本地化的弓柱,所以您不需要包含已經(jīng)位于nib文件內(nèi)部的字符串矢空。但是屁药,您應(yīng)該本地化的一些字符串包括以下內(nèi)容:

以編程方式添加到窗口酿箭,面板,視圖或控件中并隨后顯示給用戶的字符串械巡。這包括傳入標(biāo)準(zhǔn)例程的字符串讥耗,例如顯示警告框的字符串古程。
如果這些字符串以編程方式添加挣磨,則菜單項(xiàng)標(biāo)題字符串茁裙。例如掉蔬,如果您為“撤消”菜單項(xiàng)使用自定義字符串女轿,則這些字符串應(yīng)位于字符串文件中蛉迹。
向用戶顯示的錯(cuò)誤消息婿禽。
任何向用戶顯示的樣板文本淀零。
應(yīng)用程序的信息屬性列表(Info.plist)文件中的一些字符串;請(qǐng)參閱運(yùn)行時(shí)配置指南驾中。
新的文件和文檔名稱唠亚。
關(guān)于字符串加載宏
基礎(chǔ)和核心基礎(chǔ)框架定義了以下宏灶搜,使得從字符串文件加載字符串變得更容易:

CoreFoundation宏:
CFCopyLocalizedString
CFCopyLocalizedStringFromTable
CFCopyLocalizedStringFromTableInBundle
CFCopyLocalizedStringWithDefaultValue
基礎(chǔ)宏:
NSLocalizedString
NSLocalizedStringFromTable
NSLocalizedStringFromTableInBundle
NSLocalizedStringWithDefaultValue

您在源代碼中使用這些宏來從您應(yīng)用程序的一個(gè)字符串文件中加載字符串割卖。當(dāng)檢索到實(shí)際的字符串值時(shí),宏會(huì)考慮用戶當(dāng)前的語言偏好丙挽。此外颜阐,genstrings工具搜索這些宏初婆,并使用它們包含的信息來構(gòu)建應(yīng)用程序的初始字符串文件集磅叛。

有關(guān)如何使用這些宏的其他信息弊琴,請(qǐng)參閱將字符串資源加載到代碼中敲董。

使用genstrings工具創(chuàng)建字符串文件

在開發(fā)過程中的某個(gè)時(shí)刻腋寨,您需要?jiǎng)?chuàng)建代碼所需的字符串文件萄窜。如果您使用Core Foundation和Foundation宏編寫代碼,創(chuàng)建字符串文件的最簡(jiǎn)單方法就是使用genstrings命令行工具穗泵。您可以使用此工具生成一組新的字符串文件佃延,或根據(jù)源代碼更新一組現(xiàn)有文件苇侵。

要使用genstrings工具,通常至少提供兩個(gè)參數(shù):

源文件列表

可選的輸出目錄

genstrings工具可以使用.c烘浦,.m或.java文件擴(kuò)展名解析C闷叉,Objective-C和Java代碼文件。雖然不是嚴(yán)格要求品擎,但是建議指定輸出目錄萄传,并且是genstrings放置結(jié)果字符串文件的位置秀菱。在大多數(shù)情況下,您需要指定包含開發(fā)語言的項(xiàng)目資源的目錄梦碗。

以下示例顯示了運(yùn)行g(shù)enstrings工具的簡(jiǎn)單命令。此命令使工具解析當(dāng)前目錄中的所有Objective-C源文件循捺,并將生成的字符串文件放在必須已經(jīng)存在的en.lproj子目錄中。

genstrings -o en.lproj *.m

首次運(yùn)行g(shù)enstrings工具時(shí)恰力,它會(huì)為您創(chuàng)建一組新的字符串文件。隨后的運(yùn)行將使用源代碼中找到的當(dāng)前字符串條目替換這些字符串文件的內(nèi)容香府。對(duì)于后續(xù)運(yùn)行,最好在運(yùn)行g(shù)enstrings之前保存當(dāng)前字符串文件的副本勿璃。然后歧沪,您可以區(qū)分新舊版本槽畔,以確定哪些字符串添加到(或更改)您的項(xiàng)目嬉橙。然后市框,您可以使用此信息來更新任何已經(jīng)本地化的字符串文件的版本枫振,而不是替換這些文件并再次本地化喻圃。

在單個(gè)字符串文件中,每個(gè)鍵都必須是唯一的粪滤。幸運(yùn)的是斧拍,genstrings工具足夠聰明,可以合并其找到的任何重復(fù)條目杖小。當(dāng)它在單個(gè)文件夾文件中發(fā)現(xiàn)一次使用多次的密鑰字符串時(shí)肆汹,該工具將來自各個(gè)條目的注釋合并到一個(gè)注釋字符串中,并生成警告予权。 (您可以使用-q選項(xiàng)來禁止重復(fù)條目警告。)如果將相同的鍵字符串分配給不同字符串文件中的字符串籍救,則不會(huì)生成警告。

有關(guān)使用genstrings工具的更多信息,請(qǐng)參閱genstrings手冊(cè)頁赊时。

手動(dòng)創(chuàng)建字符串文件

盡管genstrings工具是最方便的創(chuàng)建字符串文件的方法房维,但您也可以手動(dòng)創(chuàng)建它們晓锻。要手動(dòng)創(chuàng)建字符串文件纷铣,請(qǐng)?jiān)赥extEdit(或您首選的文本編輯應(yīng)用程序)中創(chuàng)建一個(gè)新文件刁标,并使用Unicode UTF-8編碼進(jìn)行保存启搂。 (保存文件時(shí),TextEdit通常默認(rèn)選擇適當(dāng)?shù)木幋a)要強(qiáng)制執(zhí)行特定編碼乡小,必須更改應(yīng)用程序首選項(xiàng)中的保存選項(xiàng)吠撮。)該文件的內(nèi)容包含一組鍵值對(duì)以及可選注釋描述每個(gè)鍵值對(duì)的目的。鍵和值字符串用等號(hào)分隔糕篇,整個(gè)條目必須以分號(hào)字符終止鹦筹。按照慣例虚青,注釋被包含在C風(fēng)格的注釋分隔符(/ /)中,并且緊接在它們描述的條目之前搂妻。

列表2-2顯示了一個(gè)字符串文件的基本格式敞掘。此示例中的條目來自TextEdit應(yīng)用程序的英文版本的Localizable.strings文件。每個(gè)等號(hào)左側(cè)的字符串表示鍵,右側(cè)的字符串表示該值乌企。開發(fā)應(yīng)用程序時(shí)的常見約定是使用與用于開發(fā)應(yīng)用程序的語言的值相等的鍵名。因此亚亲,因?yàn)門extEdit是使用英文開發(fā)的臼寄,所以Localizable.strings文件的英文版具有匹配的鍵和值拭宁。

列表2-2為英文本地化的字符串

/* Menu item to make the current document plain text */
"Make Plain Text" = "Make Plain Text";
/* Menu item to make the current document rich text */
"Make Rich Text" = "Make Rich Text";

清單2-3顯示了相同條目的德文翻譯。 這些條目也位于名為L(zhǎng)ocalizable.strings的文件中瓣俯,但該文件的該版本位于TextEdit應(yīng)用程序的德語項(xiàng)目目錄中杰标。 請(qǐng)注意,這些鍵仍然是英文彩匕,但分配給這些鍵的值是德語腔剂。 這是因?yàn)樽罱K用戶永遠(yuǎn)不會(huì)看到關(guān)鍵字符串。 代碼使用它們來檢索相應(yīng)的值字符串驼仪,在這種情況下掸犬,它是德文袜漩。

列表2-3為德語本地化的字符串

/* Menu item to make the current document plain text */
"Make Plain Text" = "In reinen Text umwandeln";
/* Menu item to make the current document rich text */
"Make Rich Text" = "In formatierten Text umwandeln";

檢測(cè)非本地化字符串

基于AppKit的應(yīng)用程序可以利用內(nèi)置的支持來檢測(cè)不需要本地化的字符串,而不需要本地化的字符串湾碎。要使用此內(nèi)置支持噪服,請(qǐng)?jiān)谶\(yùn)行應(yīng)用程序時(shí)設(shè)置用戶默認(rèn)值或添加啟動(dòng)參數(shù)。指定布爾值以指示是否啟用或禁用用戶默認(rèn)值胜茧。可用的用戶默認(rèn)值如下所示:

NSShowNonLocalizableStrings用戶默認(rèn)標(biāo)識(shí)不可本地化的字符串仇味。字符串大寫記錄到shell呻顽。此選項(xiàng)偶爾會(huì)產(chǎn)生一些誤報(bào),但總體上仍然有用丹墨。
NSShowNonLocalizedStrings用戶默認(rèn)定位旨在本地化但在應(yīng)用程序的現(xiàn)有字符串文件中找不到的字符串廊遍。您可以使用此用戶默認(rèn)值來捕獲過期本地化的問題。
例如贩挣,要使用帶有TextEdit應(yīng)用程序的NSShowNonLocalizedStrings用戶默認(rèn)值喉前,請(qǐng)?jiān)诮K端中輸入以下內(nèi)容:

/Applications/TextEdit.app/Contents/MacOS/TextEdit -NSShowNonLocalizedStrings YES

將字符串資源加載到代碼中

Core Foundation和Foundation框架提供了用于檢索存儲(chǔ)在字符串文件中的本地化和非本地化字符串的宏。 盡管這些宏的主要目的是在運(yùn)行時(shí)加載字符串王财,但它們也可以作為生成器工具可用來定位應(yīng)用程序字符串資源的標(biāo)記來進(jìn)行次要目的卵迂。 這是第二個(gè)目的,它解釋了為什么許多宏讓您指定比通常需要加載字符串更多的信息绒净。 genstrings工具使用您提供的信息自動(dòng)創(chuàng)建或更新應(yīng)用程序的字符串文件见咒。 表2-1列出了可以為這些例程指定的信息類型,并介紹了genstrings工具如何使用該信息挂疆。

表2-1字符串加載例程中的常見參數(shù)

參數(shù)
描述

字符串用來查找相應(yīng)的值改览。此字符串不能包含擴(kuò)展ASCII字符集中包含任何字符,其中包括ASCII字符的重音版本缤言。如果希望初始值字符串包含擴(kuò)展ASCII字符宝当,請(qǐng)使用允許您指定默認(rèn)值參數(shù)的例程。 (有關(guān)擴(kuò)展ASCII字符集的信息胆萧,請(qǐng)參閱相應(yīng)的維基百科條目庆揩。)
表名
指定鍵所在的字符串文件的名稱。 genstrings工具將此參數(shù)解釋為字符串應(yīng)放置在其中的字符串文件的名稱跌穗。如果沒有提供表名盾鳞,該字符串將放置在默認(rèn)的Localizable.strings文件中。 (當(dāng)指定此參數(shù)的值時(shí)瞻离,包括不帶.strings擴(kuò)展名的文件名腾仅。)
其名稱以.nocache結(jié)尾的.strings文件(例如ErrorNames.nocache.strings)將不會(huì)被NSBundle緩存其內(nèi)容。
默認(rèn)值
與給定鍵關(guān)聯(lián)的默認(rèn)值套利。如果未指定默認(rèn)值推励,則genstrings工具將使用鍵字符串作為初始值鹤耍。默認(rèn)值字符串可能包含擴(kuò)展ASCII字符。
評(píng)論
翻譯注釋包含與字符串验辞。您可以使用意見為翻譯團(tuán)隊(duì)提供有關(guān)如何使用給定字符串的線索稿黄。 genstrings工具將這些注釋放在字符串文件中,并將它們包圍在相關(guān)條目上方的C風(fēng)格的注釋分隔符(/ /)中跌造。

對(duì)應(yīng)于包含字符串文件的包的NSBundle對(duì)象或CFBundleRef類型杆怕。您可以使用它從除應(yīng)用程序的主包之外的捆綁包加載字符串。例如壳贪,您可以使用它從框架或插件加載本地化字符串陵珍。

當(dāng)您從字符串文件請(qǐng)求字符串時(shí),返回的字符串取決于可用的本地化(如果有)违施。 Cocoa和Core Foundation宏使用內(nèi)置的捆綁包國(guó)際化支持來檢索其本地化與用戶當(dāng)前語言偏好相匹配的字符串互纯。只要將本地化的資源文件放在適當(dāng)?shù)奶囟ㄓ谡Z言的項(xiàng)目目錄中,使用這些宏加載字符串就會(huì)自動(dòng)生成相應(yīng)的字符串磕蒲。如果沒有找到適當(dāng)?shù)谋镜鼗址Y源留潦,則該bundle的加載代碼會(huì)自動(dòng)選擇適當(dāng)?shù)姆潜镜鼗址?/p>

有關(guān)一般國(guó)際化和如何創(chuàng)建特定于語言的項(xiàng)目目錄的信息,請(qǐng)參閱國(guó)際化和本地化指南辣往。有關(guān)捆綁包結(jié)構(gòu)以及如何從捆綁包目錄中選擇資源文件的信息兔院,請(qǐng)參閱捆綁編程指南。

使用Core Foundation框架

Core Foundation框架定義了單個(gè)函數(shù)和幾個(gè)宏站削,用于從應(yīng)用程序包中加載本地化字符串秆乳。 CFBundleCopyLocalizedString函數(shù)提供了檢索字符串的基本實(shí)現(xiàn)。但是钻哩,建議您使用以下宏:

* CFCopyLocalizedString(key, comment)

* CFCopyLocalizedStringFromTable(key, tableName, comment)

* CFCopyLocalizedStringFromTableInBundle(key, tableName, bundle, comment)

* CFCopyLocalizedStringWithDefaultValue(key, tableName, bundle, value, comment)

使用宏而不是CFBundleCopyLocalizedString函數(shù)有幾個(gè)原因屹堰。 首先,對(duì)于某些常見的情況街氢,宏更容易使用扯键。 其次,宏讓您將注釋字符串與字符串條目相關(guān)聯(lián)珊肃。 第三荣刑,這個(gè)宏由genstrings工具識(shí)別,但CFBundleCopyLocalizedString函數(shù)不是伦乔。

有關(guān)上述宏的語法的信息厉亏,請(qǐng)參閱CFBundle參考。

使用基礎(chǔ)框架

基礎(chǔ)框架定義了單個(gè)方法和幾個(gè)用于加載字符串資源的宏烈和。 NSBundle類的localizedStringForKey:value:table:方法從駐留在當(dāng)前包中的字符串文件加載指定的字符串資源爱只。 Cocoa還定義了以下用于獲取本地化字符串的宏:

* NSLocalizedString(key, comment)

* NSLocalizedStringFromTable(key, tableName, comment)

* NSLocalizedStringFromTableInBundle(key, tableName, bundle, comment)

* NSLocalizedStringWithDefaultValue(key, tableName, bundle, value, comment)

與Core Foundation一樣,Apple建議您使用Cocoa方便宏來加載字符串招刹。 這些宏的主要優(yōu)點(diǎn)是它們可以由genstrings工具解析恬试,用于創(chuàng)建應(yīng)用程序的字符串文件窝趣。 它們也更簡(jiǎn)單易用,讓您將翻譯注釋與每個(gè)條目相關(guān)聯(lián)训柴。

有關(guān)上述宏的語法的信息哑舒,請(qǐng)參閱Foundation函數(shù)參考。 NSBundle類參考中還定義了加載字符串的其他方法幻馁。

獲取字符串的示例

以下示例演示了使用Foundation和Core Foundation宏檢索字符串的基本技術(shù)洗鸵。 每個(gè)示例假定當(dāng)前的包包含一個(gè)名為Custom.strings的字符串文件,該文件已被翻譯成法語仗嗦。 此翻譯文件包含以下字符串:

/* A comment */
"Yes" = "Oui";
"The same text in English" = "Le même texte en anglais";

使用Foundation框架膘滨,您可以使用NSLocalizedStringFromTable宏獲取“是”字符串的值,如以下示例所示:

NSString* theString;
theString = NSLocalizedStringFromTable (@"Yes", @"Custom", @"A comment");

使用Core Foundation框架儒将,您可以使用CFCopyLocalizedStringFromTable宏獲取相同的字符串,如此示例所示:

CFStringRef theString;
theString = CFCopyLocalizedStringFromTable(CFSTR("Yes"), CFSTR("Custom"), "A comment");

在這兩個(gè)示例中对蒲,代碼指定要檢索的鍵钩蚊,即字符串“是”。他們還指定要在其中查找密鑰的字符串文件(或表)蹈矮,在這種情況下是Custom.strings文件砰逻。在字符串檢索期間,忽略注釋字符串泛鸟。

高級(jí)字符串文件提示

以下部分提供了一些額外的使用字符串文件和字符串資源的提示蝠咆。

用genstrings搜索自定義函數(shù)
genstrings工具默認(rèn)搜索Core Foundation和Foundation字符串宏。它使用這些宏中的信息在項(xiàng)目的字符串文件中創(chuàng)建字符串條目北滥。您還可以引導(dǎo)genstrings在代碼中查找自定義字符串加載函數(shù)刚操,并使用除標(biāo)準(zhǔn)宏之外的這些函數(shù)。您可以使用自定義函數(shù)來包裝內(nèi)置的字符串加載例程并執(zhí)行一些額外的處理再芋,或者您可以使用自己的自定義模型替換默認(rèn)的字符串處理行為菊霜。

如果要使用genstrings與您自己的自定義函數(shù),您的函數(shù)必須使用基礎(chǔ)宏使用的命名和格式化約定济赎。您的函數(shù)的參數(shù)必須匹配相應(yīng)宏的參數(shù)鉴逞。當(dāng)您調(diào)用genstrings時(shí),您可以指定-s選項(xiàng)司训,然后指定與NSLocalizedString宏對(duì)應(yīng)的函數(shù)的名稱构捡。您的其他函數(shù)名稱應(yīng)該從此基本名稱生成。例如壳猜,如果您指定了函數(shù)名MyStringFunction勾徽,其他函數(shù)名稱應(yīng)為MyStringFunctionFromTable,MyStringFunctionFromTableInBundle和MyStringFunctionWithDefaultValue统扳。 genstrings工具查找這些函數(shù)并使用它們來構(gòu)建相應(yīng)的字符串文件捂蕴。

格式化字符串資源

對(duì)于某些字符串譬涡,您可能不想(或能夠)對(duì)字符串資源中的整個(gè)字符串進(jìn)行編碼,因?yàn)樽址囊徊糠挚赡茉谶\(yùn)行時(shí)更改啥辨。例如涡匀,如果字符串包含用戶文檔的名稱,則需要能夠?qū)⒃撐臋n名稱動(dòng)態(tài)插入到該字符串中溉知。在創(chuàng)建字符串資源時(shí)陨瘩,您可以使用通常用于在Foundation和Core Foundation框架中處理字符串替換的格式化字符。清單2-4顯示了使用基本格式化字符的幾個(gè)字符串資源:

清單2-4帶有格式字符的字符串

"Windows must have at least %d columns and %d rows." =
"Les fenêtres doivent être composes au minimum de %d colonnes et %d lignes.";
"File %@ not found." = "Le fichier %@ n’existe pas.";

要使用實(shí)際值替換格式化字符级乍,可以使用字符串資源作為格式字符串舌劳,使用NSString的stringWithFormat:方法或CFStringCreateWithFormat函數(shù)。 Foundation和Core Foundation支持printf語句中使用的大多數(shù)標(biāo)準(zhǔn)格式化字符玫荣。此外甚淡,您可以使用上述示例中所示的%@說明符來插入與任意Objective-C對(duì)象關(guān)聯(lián)的描述性文本。有關(guān)說明符的完整列表捅厂,請(qǐng)參閱字符串編程指南中的格式化字符串對(duì)象贯卦。

在翻譯過程中經(jīng)常出現(xiàn)的一個(gè)問題是,翻譯者可能需要重新排序翻譯字符串中的參數(shù)焙贷,以解釋源語言和目標(biāo)語言的差異撵割。如果一個(gè)字符串包含多個(gè)參數(shù),則轉(zhuǎn)換器可以在格式化字符之間插入格式為n $(其中n指定原始參數(shù)的位置)的特殊標(biāo)簽辙芍。這些標(biāo)記讓翻譯器重新排序出現(xiàn)在原始字符串中的參數(shù)啡彬。以下示例顯示了一個(gè)在翻譯的字符串中兩個(gè)參數(shù)相反的字符串:

/* Message in alert dialog when something fails */
"%@ Error! %@ failed!" = "%2$@ blah blah, %1$@ blah!";

在字符串資源中使用特殊字符
與C一樣,一些字符必須帶有反斜杠前綴故硅,然后才能將它們包含在字符串中庶灿。 這些字符包括雙引號(hào),反斜杠字符本身以及特殊控制字符吃衅,如換行符(\ n)和回車符(\ r)跳仿。

"File \"%@\" cannot be opened" = " ... ";
"Type \"OK\" when done" = " ... ";

您可以通過指定\ U,然后立即加上最多四個(gè)十六進(jìn)制數(shù)字捐晶,將任意Unicode字符包含在值字符串中菲语。四位數(shù)表示所需Unicode字符的條目;例如,空格字符由十六進(jìn)制20表示惑灵,因此在指定為Unicode字符時(shí)為\ U0020山上。如果字符串必須包含由于某些原因無法鍵入的Unicode字符,則此選項(xiàng)很有用英支。如果使用此選項(xiàng)佩憾,還必須將-u選項(xiàng)傳遞給genstrings,以便在生成的字符串文件中正確解釋十六進(jìn)制數(shù)字。 genstrings工具假設(shè)您的字符串默認(rèn)為低ASCII妄帘,只有指定-u選項(xiàng)時(shí)才解釋反斜杠序列楞黄。

注意:如果您自己生成字符串文件,例如使用genstrings抡驼,請(qǐng)確保這些字符串文件最終以UTF-8編碼鬼廓,然后再將其添加到項(xiàng)目中。

調(diào)試字符串文件

如果您在測(cè)試過程中遇到的問題致盟,并找到檢索字符串的函數(shù)和宏總是返回相同的密鑰(而不是翻譯值)碎税,運(yùn)行在你的字符串的文件在/ usr / bin中/ plutil工具。字符串文件本質(zhì)上是以特殊方式格式化的屬性列表文件馏锡。使用-lint選項(xiàng)運(yùn)行plutil可以發(fā)現(xiàn)隱藏的字符或其他正在阻止字符串正確檢索的錯(cuò)誤雷蹂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市杯道,隨后出現(xiàn)的幾起案子匪煌,更是在濱河造成了極大的恐慌,老刑警劉巖党巾,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萎庭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡昧港,警方通過查閱死者的電腦和手機(jī)擎椰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門支子,熙熙樓的掌柜王于貴愁眉苦臉地迎上來创肥,“玉大人,你說我怎么就攤上這事值朋√局叮” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵昨登,是天一觀的道長(zhǎng)趾代。 經(jīng)常有香客問我,道長(zhǎng)丰辣,這世上最難降的妖魔是什么撒强? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮笙什,結(jié)果婚禮上飘哨,老公的妹妹穿的比我還像新娘。我一直安慰自己琐凭,他們只是感情好芽隆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般胚吁。 火紅的嫁衣襯著肌膚如雪牙躺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天腕扶,我揣著相機(jī)與錄音孽拷,去河邊找鬼。 笑死蕉毯,一個(gè)胖子當(dāng)著我的面吹牛乓搬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播代虾,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼进肯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了棉磨?” 一聲冷哼從身側(cè)響起江掩,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乘瓤,沒想到半個(gè)月后环形,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衙傀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年抬吟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片统抬。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡火本,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出聪建,到底是詐尸還是另有隱情钙畔,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布金麸,位于F島的核電站擎析,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏挥下。R本人自食惡果不足惜揍魂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棚瘟。 院中可真熱鬧现斋,春花似錦、人聲如沸解取。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蔓肯,卻和暖如春遂鹊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔗包。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工秉扑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人调限。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓舟陆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耻矮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秦躯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)裆装,斷路器踱承,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 介紹 捆綁是macOS和iOS中用于封裝代碼和資源的基礎(chǔ)技術(shù)。軟件包通過為所需資源提供已知位置來簡(jiǎn)化開發(fā)人員體驗(yàn)哨免,...
    nicedayCoco閱讀 1,222評(píng)論 0 1
  • 框架捆綁 框架是封裝動(dòng)態(tài)共享庫和支持該庫所需的資源文件的分層目錄茎活。框架比典型的動(dòng)態(tài)共享庫提供了一些優(yōu)勢(shì)琢唾,因?yàn)樗鼈優(yōu)?..
    nicedayCoco閱讀 1,608評(píng)論 0 2
  • 關(guān)于資源 適用于計(jì)算機(jī)程序的資源是與程序可執(zhí)行代碼相關(guān)的數(shù)據(jù)文件载荔。資源可以通過將代碼之外的復(fù)雜數(shù)據(jù)集或圖形內(nèi)容創(chuàng)建...
    nicedayCoco閱讀 631評(píng)論 0 0
  • 關(guān)于首選項(xiàng)和設(shè)置 首選項(xiàng)是您持久存儲(chǔ)的信息,并用于配置您的應(yīng)用程序采桃。應(yīng)用程序通常會(huì)向用戶公開偏好設(shè)置懒熙,以便他們自定...
    nicedayCoco閱讀 989評(píng)論 0 0