App的國際化和本地化(四) —— 國際化代碼(一)

版本記錄

版本號 時間
V1.0 2018.05.09

前言

很多APP都有國際化版本,常見于一些大公司的產(chǎn)品峡懈,比如Facebook查辩、Wechat等,那么國際化需要我們APP做哪些更改呢眠副,接下來這幾篇就一起來看一下APP的國際化和本地化画切。感興趣的可以看上面幾篇。
1. App的國際化和本地化(一) —— 簡單介紹(一)
2. App的國際化和本地化(二) —— 查看語言和區(qū)域設(shè)置(一)
3. App的國際化和本地化(三) —— 國際化用戶界面(一)

回顧

上一篇主要介紹國際化用戶界面囱怕,本篇主要介紹國際化代碼霍弹。


Internationalizing Your Code - 國際化代碼

除了國際化您的用戶界面之外毫别,編寫處理多種語言文本的代碼。 首先將國際文本存儲在字符串文件中庞萍,類似于Internationalizing the User Interfacebase internationalization使用的字符串文件拧烦。 還可以使用語言和區(qū)域設(shè)置敏感的API來枚舉,搜索和排序代碼中的文本钝计。 使用標(biāo)準(zhǔn)文本視圖來顯示和解析文本輸入恋博。 讓這些API為您處理不同編寫和輸入系統(tǒng)的復(fù)雜性。


Separating User-Facing Text from Your Code - 從代碼中分離出面向用戶的文本

應(yīng)用程序所提供的所有面向用戶的文本都需要進行本地化 - 也就是說私恬,不包含在.storyboard.xib文件中的面向用戶的文本(如錯誤消息)需要在呈現(xiàn)之前被翻譯成當(dāng)前語言給用戶债沮。 iOS和OS X提供了一種在運行時從字符串文件中檢索本地化文本的機制。 在您的代碼中本鸣,將包含面向用戶的文本的字符串替換為NSLocalizedString宏的返回值疫衩。 當(dāng)您導(dǎo)出本地化版本時,Xcode將搜索您的代碼以查找宏荣德,并在導(dǎo)出的本地化文件中包含字符串文件以進行翻譯闷煤。 當(dāng)您導(dǎo)入本地化時,Xcode會將代碼使用的字符串文件添加到您的Xcode項目中涮瞻。

例如鲤拿,代替在代碼中使用@“26.22 miles”字符串,請使用:

NSLocalizedString(@"RunningDistance", @"distance for a marathon")

其中署咽,@“RunningDistance”是從本地化字符串文件中檢索的文本的key近顷。 @“distance for a marathon”參數(shù)是一個關(guān)于存儲在字符串文件中的鍵值對的注釋,作為本地化器的一個提示宁否。 如果您需要不同的行為窒升,請使用Foundation Functions Reference中介紹的采用更多參數(shù)的其他NSLocalizedString宏之一。

提示:請勿覆蓋key或從多個key組成短語慕匠。 一些語言具有性別文章饱须,形容詞結(jié)尾和完全不同的詞序。 相反台谊,將單獨的鍵值對添加到字符串文件中所有唯一的短語冤寿。

例如,替換這些鍵值對:

/* Go to next page/chapter */
"GoToNext" = "Go to next %@";
"chapter" = "chapter";
"page" = "page";

每個短語具有不同的鍵值對:

/* Go to next chapter */
"GoToNextChapter" = "Go to next chapter";
 
/* Go to next page */
"GoToNextPage" = "Go to next page";

不要將數(shù)字放在可本地化的字符串中青伤,因為不同地區(qū)可以使用不同的數(shù)字督怜。

您不需要將所有鍵值對存儲在相同的字符串文件中。您可以使用其他NSLocalizedString宏來創(chuàng)建單獨的字符串文件狠角,也可以將它們存儲在不同的包中号杠。有關(guān)NSLocalizedString宏的更多信息,請閱讀 Resource Programming Guide中的String Resources

要從字符串文件中檢索本地化字符串姨蟋,不是將其添加到字符串文件屉凯,請在NSBundle類中使用localizedStringForKey:value:table:方法。當(dāng)對應(yīng)于指定表的字符串文件不在您的項目中時眼溶,NSLocalizedString宏和localizedStringForKey:value:table:方法返回值參數(shù)作為本地化字符串悠砚。

稍后,在導(dǎo)入本地化時堂飞,如Importing Localizations中所述灌旧,本地化的字符串文件將添加到您的項目中。 (或者绰筛,您可以直接從NSLocalizedString宏中生成開發(fā)語言字符串文件枢泰,如Creating Strings Files for User-Facing Text in Your Code中所述。)

如果您的字符串包含復(fù)數(shù)名詞或度量單位铝噩,請閱讀Handling Noun Plurals and Units of Measurement以了解如何為具有不同復(fù)數(shù)規(guī)則的語言擴展此機制衡蚂。


Using Unicode Strings - 使用Unicode字符串

對于所有面向用戶的文本,請使用支持Unicode的字符串對象 - NSString骏庸,NSAttributedString及其子類的實例毛甲。 Unicode是編碼世界所有書寫系統(tǒng)字符的標(biāo)準(zhǔn)。 字符串對象封裝以UTF-16格式編碼的Unicode字符串具被。 用戶看到的字符可以表示為Unicode字符串中的多個字符并進行編碼玻募。 因此,請使用處理組合字符序列的字符串方法硬猫,而不是字符串中的單個字符补箍。 使用適當(dāng)?shù)淖址瓵PI進行迭代改执,搜索和排序啸蜜。 使用正確顯示Unicode字符串對象的標(biāo)準(zhǔn)視圖和控件。

有關(guān)字符串對象的全面文檔辈挂,請閱讀String Programming Guide衬横。

1. Accessing Characters in Strings - 獲取字符串中的字符

NSString類通過允許您訪問字符集群或ranges來處理字符編碼的復(fù)雜性。 使用rangeOfComposedCharacterSequenceAtIndex:rangeOfComposedCharacterSequencesForRange:方法確保您不會拆分字符串中的用戶字符并打算文本终蒂。 這些方法在表示用戶字符的字符串內(nèi)返回一個range蜂林。

例如,表3-1顯示了UTF-16和UTF-32編碼中用戶字符的數(shù)字表示形式拇泣。 請注意噪叙,無論使用何種編碼格式,用戶字符的長度都不相同霉翔。

Table 3-1 Unicode Encoding of User Characters

視頻:WWDC 2013 Making Your App World-Ready: International Text > Composed Character Sequences

2. Enumerating Strings - 枚舉字符串

通過組合字符序列睁蕾,單詞,句子或段落來枚舉字符串,而不是字符串中的單個字符子眶。 要通過組合字符序列來枚舉字符串瀑凝,請使用enumerateSubstringsInRange:options:usingBlock:方法并傳遞NSStringEnumerationByComposedCharacterSequences作為選項參數(shù)。 要逐個枚舉字符串(跳過標(biāo)點符號)臭杰,請傳遞NSStringEnumerationByWords作為options參數(shù)粤咪。

例如,如果將NSStringEnumerationByComposedCharacterSequences傳遞給enumerateSubstringsInRange:options:usingBlock:方法渴杆,它將返回用戶字符寥枝,如同組合字符序列中一樣:

如果字符串是:

你傳遞NSStringEnumerationByWords作為options參數(shù),返回下面的詞語:

注意空格和標(biāo)點符號不包含在單詞中将塑。

視頻:WWDC 2013 Making Your App World-Ready: International Text > String APIs: Iteration

3. Searching Strings - 搜索字符串

要使用區(qū)域設(shè)置敏感的比較算法搜索字符串的內(nèi)容或驗證字符串中是否存在字符串脉顿,請使用rangeOfString:options:range:locale:,將當(dāng)前位置作為區(qū)域設(shè)置參數(shù)傳遞点寥。 您可以組合并傳遞的常量作為選項參數(shù):

例如仪糖,如果要在字符串中搜索用戶文本,請將NSCaseInsensitiveSearchNSDiacriticInsensitiveSearch常量作為options參數(shù)傳遞給rangeOfString:options:range:locale:方法迫肖。 通常情況下锅劝,搜索文本是一種大小寫和變音不敏感操作,但排序文本是大小寫和變音符號敏感蟆湖。

4. Sorting Strings - 排序字符串

對于向用戶顯示的文本故爵,請使用區(qū)域敏感的API進行排序和比較字符串。 不同的語言和地區(qū)有不同的排序順序標(biāo)準(zhǔn)隅津。 例如诬垂,法語中的變音符號很重要,而英語中則不是伦仍。 在某些語言中结窘,多個字母被組合并影響排序順序。

要使用區(qū)域敏感的比較算法充蓝,請使用與Finder產(chǎn)生相同結(jié)果的localizedStandardCompare:方法隧枫。

如果您不想獲得與Finder相同的結(jié)果,請使用compare:options:range:locale:方法,將當(dāng)前地區(qū)作為本地參數(shù)或localizedCompare:方法傳遞悠垛。

不要使用localizedCaseInsensitiveCompare:方法進行排序线定。

視頻:WWDC 2013 Making Your App World-Ready: International Text > String APIs: Sorting

5. Displaying Text - 展示文本

使用標(biāo)準(zhǔn)視圖和控件來處理Unicode文本布局和顯示的復(fù)雜性。字符串中的字符不直接對應(yīng)于屏幕上呈現(xiàn)的文本确买。屏幕上顯示的是一系列字形斤讥。字形是字體中最小的可顯示單位。字形可能代表一個字符湾趾,多個字符或字符的一部分芭商。字符到字形的映射并不簡單 - 它可以是多對多的。另外搀缠,一行中字形的順序和位置很復(fù)雜铛楣。標(biāo)準(zhǔn)視圖和控件甚至可以為您正確地設(shè)計雙向文本 - 例如,包含英文單詞和希伯來單詞的字符串中的字符順序與用于在視圖中放置文本的順序不同處理雙向文本艺普,如Handling Bidirectional Text中所示簸州。

如果您需要編寫自定義顯示代碼,請使用適當(dāng)?shù)牡桶姹疚谋続PI歧譬。要了解iOS的文本類岸浑,請閱讀Text Programming Guide for iOS和Mac,閱讀Text Layout Programming Guide瑰步。

6. Parsing Text Input - 解析輸入文本

用戶可以用任何語言和格式輸入文本矢洲。 iOS和OS X可識別用戶正在鍵入的語言并提供適當(dāng)?shù)逆I盤選項。 如果您在用戶輸入時解析文本缩焦,請記住读虏,鍵盤字符到語言字符之間存在多對多映射雏赦。

Parsing Language Characters - 解析語言字符

對于某些語言鳖链,用戶一次不會輸入一個字符离福。 也就是說雳灵,用戶在鍵盤上按下的鍵不一定對應(yīng)于該語言中的字符。 在法語中止剖,用戶通過從彈出式菜單中選擇插入點來添加重音。 在日語和漢語中,用戶輸入語音表示并從候選列表中選擇一個候選以確認(rèn)標(biāo)記的文本藐握。 在這兩種情況下,首先插入初步文本垃喊,然后在用戶確認(rèn)后將其轉(zhuǎn)換為最終文本猾普。

視頻:WWDC 2013 Making Your App World-Ready: International Text > Text Input

Determining When the User Confirms Marked Text (iOS Only) - 確定用戶確認(rèn)標(biāo)記文本的時間(僅限iOS)

要確定用戶是否確認(rèn)了標(biāo)記的文本,請將markedTextRange發(fā)送到文本視圖本谜。 如果此方法返回空字符串初家,則用戶確認(rèn)了一些輸入的文本。

Determining the Typed Language (iOS Only) - 確定鍵入的語言(僅限iOS)

要獲取用戶當(dāng)前鍵入的語言,請使用UIResponder類中的textInputMode屬性溜在,如下所示:

NSString * languageID = [[[UIApplication sharedApplication] textInputMode] primaryLanguage];

返回的字符串是語言ID陌知,如Language and Locale IDs中所述,用于標(biāo)識書面語言或方言掖肋。

要獲取用戶啟用的一組語言仆葡,請執(zhí)行以下操作:

NSArray * languages = [[[UIApplication sharedApplication] textInputMode] activeInputModes];

返回的數(shù)組包含UITextInputMode類的實例。


Detecting Personal Names, Mailing Addresses, and Phone Numbers - 檢測個人姓名志笼,郵寄地址和電話號碼

在全球范圍內(nèi)沿盅,個人姓名,郵寄地址和電話號碼的格式差別很大纫溃。 個人名稱有很多不同的格式腰涧,包括組件的不同排序。 例如紊浩,在亞洲國家窖铡,姓氏后面跟著名字,兩者之間沒有空格坊谁。 郵寄地址的格式取決于國家万伤。 電話號碼在它們之間有不同的數(shù)字和標(biāo)點符號。 要在文本視圖中處理不同的輸入格式呜袁,請使用Interface Builder將數(shù)據(jù)檢測器添加到文本視圖敌买。 數(shù)據(jù)檢測器以許多不同的國際格式識別地址和電話號碼,并可選擇將其轉(zhuǎn)換為鏈接阶界。

要以編程方式在字符串中檢測此類數(shù)據(jù)虹钮,請閱讀NSDataDetector Class Reference


Getting the Current Language - 獲取當(dāng)前語言

要從應(yīng)用程序包獲取應(yīng)用程序使用的語言膘融,請使用NSBundle類中的preferredLocalizations方法

NSString *languageID = [[NSBundle mainBundle] preferredLocalizations].firstObject;

后記

本篇主要講述了國際化代碼芙粱,感興趣的給個贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市氧映,隨后出現(xiàn)的幾起案子春畔,更是在濱河造成了極大的恐慌,老刑警劉巖岛都,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件律姨,死亡現(xiàn)場離奇詭異,居然都是意外死亡臼疫,警方通過查閱死者的電腦和手機择份,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烫堤,“玉大人荣赶,你說我怎么就攤上這事凤价。” “怎么了拔创?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵利诺,是天一觀的道長。 經(jīng)常有香客問我剩燥,道長立轧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任躏吊,我火速辦了婚禮氛改,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘比伏。我一直安慰自己胜卤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布赁项。 她就那樣靜靜地躺著葛躏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悠菜。 梳的紋絲不亂的頭發(fā)上舰攒,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音悔醋,去河邊找鬼摩窃。 笑死,一個胖子當(dāng)著我的面吹牛芬骄,可吹牛的內(nèi)容都是我干的猾愿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼账阻,長吁一口氣:“原來是場噩夢啊……” “哼蒂秘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淘太,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤姻僧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蒲牧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撇贺,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年造成,在試婚紗的時候發(fā)現(xiàn)自己被綠了显熏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雄嚣。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡晒屎,死狀恐怖喘蟆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鼓鲁,我是刑警寧澤蕴轨,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站骇吭,受9級特大地震影響橙弱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜燥狰,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一棘脐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧龙致,春花似錦蛀缝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至榛了,卻和暖如春在讶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霜大。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工构哺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人战坤。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓遮婶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親湖笨。 傳聞我的和親對象是個殘疾皇子旗扑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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