版本記錄
版本號 | 時間 |
---|---|
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 Interface中base 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ù)字表示形式拇泣。 請注意噪叙,無論使用何種編碼格式,用戶字符的長度都不相同霉翔。
視頻: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ù):
-
- 不區(qū)分大小寫的搜索艾疟。 例如,'B'與'b'相同敢辩。
-
- 忽略變音符號蔽莱。 例如,'?'等于'o'戚长。
-
- 向后搜索盗冷。 (默認(rèn)是向前。)
-
- 在起點搜索同廉。
例如仪糖,如果要在字符串中搜索用戶文本,請將NSCaseInsensitiveSearch
和NSDiacriticInsensitiveSearch
常量作為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)注~~~