版本記錄
| 版本號 | 時間 |
|---|---|
| V1.0 | 2018.05.07 |
前言
iOS中的視圖加載可以有兩種方式,一種是通過xib加載,另外一種就是通過純代碼加載。它們各有優(yōu)點和好處,xib比較直觀簡單,代碼比較靈活但是看著很多很亂,上一家公司主要風(fēng)格就是用純代碼,這一家用的就是xib用的比較多。這幾篇我們就詳細(xì)的介紹一個xib相關(guān)知識。感興趣的可以看上面寫的幾篇。
1. xib相關(guān)(一) —— 基本知識(一)
2. xib相關(guān)(二) —— 文件沖突問題(一)
3. xib相關(guān)(三) —— xib右側(cè)標(biāo)簽介紹(一)
4. xib相關(guān)(四) —— 連線問題(一)
5. xib相關(guān)(五) —— 利用layout進(jìn)行約束之界面(一)
6. xib相關(guān)(六) —— 利用layout進(jìn)行約束之說明和注意事項(二)
7. xib相關(guān)(七) —— Storyboard中的segue (一)
8. xib相關(guān)(八) —— Size Classes(一)
9. xib相關(guān)(九) —— 幾個IB修飾符(一)
10. xib相關(guān)(十) —— xib的國際化(一)
11. xib相關(guān)(十一) —— xib的高冷用法之修改視圖的圓角半徑、邊框?qū)挾群皖伾ㄒ唬?/a>
12. xib相關(guān)(十二) —— UIStackView之基本介紹(一)
13. xib相關(guān)(十三) —— UIStackView之枚舉UIStackViewDistribution使用(二)
14. xib相關(guān)(十四) —— UIStackView之UIStackViewAlignment使用(三)
15. xib相關(guān)(十五) —— UIStackView之工程實踐(四)
16. xib相關(guān)(十六) —— UINib之基本介紹(一)
17. xib相關(guān)(十七) —— UINib之Introduction(二)
18. xib相關(guān)(十八) —— UINib之Nib文件(三)
19. xib相關(guān)(十九) —— UINib之Nib文件(四)
回顧
上一篇主要講述了UINib之Nib文件,這一篇講述字符串資源。
String Resources - 字符串資源
本地化過程的一個重要部分是本地化您的應(yīng)用程序顯示的所有文本字符串。根據(jù)它們的性質(zhì),位于nib文件中的字符串可以很容易地與nib文件內(nèi)容的其余部分一起定位。但是,嵌入代碼中的字符串必須被提取,本地化,然后重新插入代碼。為了簡化這一過程并簡化維護(hù)代碼,OS X和iOS提供了將字符串與代碼分離并將它們放入資源文件中這種基礎(chǔ)結(jié)構(gòu),以便輕松進(jìn)行本地化。
包含可本地化字符串的資源文件由于文件擴(kuò)展名為.strings,因此稱為字符串文件。您可以根據(jù)需要手動或編程創(chuàng)建字符串文件。標(biāo)準(zhǔn)字符串文件格式由一個或多個鍵值對和可選注釋組成。給定對中的鍵和值是用雙引號括起來并用等號分隔的文本字符串。 (您也可以使用字符串文件的屬性列表格式,在這種情況下,頂級節(jié)點是一個字典,并且該字典的每個鍵值對都是一個字符串條目。)
Listing 2-1顯示了一個簡單的字符串文件,其中包含默認(rèn)語言的非本地化條目。當(dāng)你需要顯示一個字符串時,你將左邊的字符串傳遞給一個可用的字符串加載例程。你得到的是包含最適合當(dāng)前用戶的文本翻譯的匹配值字符串。對于開發(fā)語言,通常對鍵和值使用相同的字符串,但這樣做不是必需的。
Listing 2-1 A simple strings file
/* Insert Element menu item */
"Insert Element" = "Insert Element";
/* Error string used for unknown error types. */
"ErrorString_1" = "An unknown error occurred.";
一個典型的應(yīng)用程序每個本地化至少有一個字符串文件,也就是每個包的.lproj子目錄中的一個字符串文件。默認(rèn)字符串文件的名稱是Localizable.strings,但您可以使用您選擇的任何文件名創(chuàng)建字符串文件。創(chuàng)建字符串文件在Creating Strings Resource Files中有更深入的討論。
注意:建議您使用UTF-8編碼保存字符串文件,該編碼是標(biāo)準(zhǔn)字符串文件的默認(rèn)編碼。當(dāng)Xcode將字符串文件復(fù)制到產(chǎn)品中時,會自動將字符串文件從UTF-8轉(zhuǎn)換為UTF-16。有關(guān)標(biāo)準(zhǔn)字符串文件格式的更多信息,請參閱Creating Strings Resource Files。有關(guān)Unicode及其文本編碼的更多信息,請轉(zhuǎn)至 http://www.unicode.org/ or http://en.wikipedia.org/wiki/Unicode。
字符串資源(本地化和非本地化)的加載最終依賴于OS X和iOS中的bundle和國際化支持。有關(guān)bundle的信息,請參閱 Bundle Programming Guide。有關(guān)國際化和本地化的更多信息,請參閱Internationalization and Localization Guide。
Creating Strings Resource Files - 創(chuàng)建字符串資源文件
雖然您可以手動創(chuàng)建字符串文件,但很少需要這樣做。 如果使用適當(dāng)?shù)淖址虞d宏編寫代碼,則可以使用genstrings命令行工具來提取這些字符串并為您創(chuàng)建字符串文件。
以下各節(jié)介紹如何設(shè)置源文件以促進(jìn)使用genstrings工具的過程。 有關(guān)該工具的詳細(xì)信息,請參閱genstrings手冊頁。
1. Choosing Which Strings to Localize - 選擇本地化哪些字符串
當(dāng)涉及到本地化應(yīng)用程序的接口時,并不總是適用于本地化您的應(yīng)用程序使用的每個字符串。 翻譯是一個昂貴的過程,翻譯用戶從未看到的字符串是浪費時間和金錢。 不顯示給用戶的字符串(例如應(yīng)用程序內(nèi)部使用的通知名稱)不需要翻譯。 考慮下面的例子:
if (CFStringHasPrefix(value, CFSTR("-")) { CFArrayAppendValue(myArray, value);};
在這個例子中,字符串“ - ”在內(nèi)部使用,用戶永遠(yuǎn)不會看到; 因此,它不需要放在一個字符串文件中。
以下代碼顯示了用戶看不到的另一個字符串示例。 字符串%d%d%s不需要本地化,因為用戶永遠(yuǎn)不會看到它,并且它對用戶看到的任何內(nèi)容都沒有影響。
matches = sscanf(s, "%d %d %s", &first, &last, &other);
由于nib文件是分開定位的,因此不需要包含已位于nib文件內(nèi)部的字符串。 但是,您應(yīng)該本地化的一些字符串包括以下內(nèi)容:
- 以編程方式添加到窗口,面板,視圖或控件并隨后顯示給用戶的字符串。 這包括您傳入標(biāo)準(zhǔn)例程的字符串,例如顯示警告框的字符串。
- 菜單項標(biāo)題字符串,如果這些字符串以編程方式添加。 例如,如果您使用自定義字符串作為撤消菜單項,那些字符串應(yīng)該位于字符串文件中。
- 顯示給用戶的錯誤消息。
- 顯示給用戶的任何樣板文字。
- 應(yīng)用程序的信息屬性列表(Info.plist)文件中的一些字符串; 請參閱Runtime Configuration Guidelines*。
- 新的文件和文件名稱。
2. About the String-Loading Macros - 關(guān)于字符串加載宏
Foundation and Core Foundation框架定義了下面的加載宏,使從字符串文件中加載字符串更容易:
-
Core Foundation宏
-
Foundation宏
您可以在源代碼中使用這些宏來從應(yīng)用程序的某個字符串文件中加載字符串。 在檢索實際字符串值時,宏將用戶的當(dāng)前語言偏好設(shè)置考慮在內(nèi)。 另外,genstrings工具搜索這些宏,并使用它們包含的信息為應(yīng)用程序構(gòu)建最初的一組字符串文件。
有關(guān)如何使用這些宏的其他信息,請參閱Loading String Resources Into Your Code。
3. Using the genstrings Tool to Create Strings Files - 使用genstrings工具產(chǎn)生字符串文件
在開發(fā)過程中的某個時候,您需要通過代碼創(chuàng)建所需的字符串文件。如果您使用Core Foundation和Foundation宏編寫代碼,則創(chuàng)建字符串文件的最簡單方法是使用genstrings命令行工具。您可以使用此工具生成一組新的字符串文件或根據(jù)您的源代碼更新一組現(xiàn)有文件。
要使用genstrings工具,通常至少要提供兩個參數(shù):
- 源文件列表
- 一個可選的輸出目錄
genstrings工具可以用.c,.m或.java文件擴(kuò)展名解析C,Objective-C和Java代碼文件。雖然不是嚴(yán)格要求,但建議指定輸出目錄,并且是genstrings放置結(jié)果字符串文件的位置。在大多數(shù)情況下,您需要為開發(fā)語言指定包含項目資源的目錄。
以下示例顯示了一個用于運行genstrings工具的簡單命令。此命令使工具解析當(dāng)前目錄中的所有Objective-C源文件,并將生成的字符串文件放入必須已存在的en.lproj子目錄中。
genstrings -o en.lproj *.m
第一次運行genstrings工具時,它會為您創(chuàng)建一組新的字符串文件。后續(xù)運行將使用源代碼中的當(dāng)前字符串條目替換這些字符串文件的內(nèi)容。對于后續(xù)運行,在運行g(shù)enstrings之前保存當(dāng)前字符串文件的副本是個好主意。然后,您可以區(qū)分新舊版本,以確定哪些字符串已添加到(或已更改)您的項目。然后,您可以使用此信息來更新字符串文件的任何已經(jīng)本地化的版本,而不是替換這些文件并再次對其進(jìn)行本地化。
在單個字符串文件中,每個key必須是唯一的。幸運的是,genstrings工具足夠智能,可以合并找到的任何重復(fù)條目。當(dāng)它發(fā)現(xiàn)在單個字符串文件中多次使用的密鑰字符串時,該工具會將各個條目的注釋合并為一個注釋字符串并生成警告。 (可以使用-q選項禁止重復(fù)條目警告。)如果將相同的key字符串分配給不同字符串文件中的字符串,則不會生成警告。
有關(guān)使用genstrings工具的更多信息,請參閱genstrings手冊頁。
4. Creating Strings Files Manually - 手動創(chuàng)建字符串文件
雖然genstrings工具是創(chuàng)建字符串文件最方便的方法,但您也可以手動創(chuàng)建它們。要手動創(chuàng)建字符串文件,請在TextEdit(或您的首選文本編輯應(yīng)用程序)中創(chuàng)建一個新文件,并使用Unicode UTF-8編碼保存它。 (在保存文件時,TextEdit通常默認(rèn)選擇合適的編碼方式。要強(qiáng)制執(zhí)行特定編碼,必須在應(yīng)用程序首選項中更改保存選項。)此文件的內(nèi)容由一組鍵值對和可選注釋組成描述每個鍵值對的目的。鍵和值字符串由等號分隔,整個條目必須以分號字符結(jié)尾。按照慣例,注釋被包含在C風(fēng)格的注釋分隔符(/ 和 /)中,并且被放置在它們描述的條目之前。
Listing 2-2顯示了字符串文件的基本格式。本示例中的條目來自TextEdit應(yīng)用程序的Localizable.strings文件的英文版本。每個等號左側(cè)的字符串表示該鍵,右側(cè)的字符串表示該值。開發(fā)應(yīng)用程序時的一個常見約定是使用等于用于開發(fā)應(yīng)用程序的語言中的值的key名稱。因此,因為TextEdit是使用英語開發(fā)的,所以Localizable.strings文件的英文版具有匹配的鍵和值。
Listing 2-2 Strings localized for English
/* 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";
Listing 2-3顯示了相同條目的德語翻譯。 這些條目也位于名為Localizable.strings的文件中,但該文件版本位于TextEdit應(yīng)用程序的德語項目目錄中。 請注意,這些鍵仍然是英語,但分配給這些鍵的值是德語。 這是因為最終用戶從不會看到關(guān)鍵字符串。 它們被代碼用來檢索相應(yīng)的值字符串,在這個例子下,它是德語的。
Listing 2-3 Strings localized for German
/* 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"
5. Detecting Non-localizable Strings - 檢測非本地字符串
基于AppKit的應(yīng)用程序可以利用內(nèi)置的支持來檢測不需要本地化的字符串,以及那些需要本地化但目前不需要的字符串。要使用此內(nèi)置支持,請在運行應(yīng)用程序時設(shè)置用戶默認(rèn)值或添加啟動參數(shù)。指定一個布爾值來指示是啟用還是禁用用戶默認(rèn)值。可用的用戶默認(rèn)值如下:
-
NSShowNonLocalizableStrings用戶默認(rèn)標(biāo)識不可本地化的字符串。字符串以大寫形式記錄到shell中。此選項偶爾會產(chǎn)生一些誤報,但總體上仍然有用。 -
NSShowNonLocalizedStrings用戶默認(rèn)定位的字符串是本地化的,但在應(yīng)用程序的現(xiàn)有字符串文件中找不到。您可以使用此用戶默認(rèn)值來捕獲過時的本地化問題。
例如,要在TextEdit應(yīng)用程序中使用NSShowNonLocalizedStrings用戶默認(rèn)值,請在終端中輸入以下內(nèi)容:
/Applications/TextEdit.app/Contents/MacOS/TextEdit -NSShowNonLocalizedStrings YES
Loading String Resources Into Your Code - 加載字符串資源到代碼中
Core Foundation和Foundation框架提供了用于檢索存儲在字符串文件中的本地化和非本地化字符串的宏。 盡管這些宏的主要目的是在運行時加載字符串,但它們還可以充當(dāng)次要目的,作為genstrings工具可用于定位應(yīng)用程序的字符串資源的標(biāo)記。 這是第二個目的,它解釋了為什么許多宏允許您指定比加載字符串通常需要更多的信息。 genstrings工具使用您提供的信息自動創(chuàng)建或更新應(yīng)用程序的字符串文件。 表2-1列出了可以為這些例程指定的信息類型,并描述了如何使用genstrings工具使用該信息。
Table 2-1 Common parameters found in string-loading routines
| 參數(shù) | 描述 |
|---|---|
| Key | 該字符串用于查找相應(yīng)的值。 該字符串不得包含擴(kuò)展ASCII字符集中的任何字符,其中包括ASCII字符的重音版本。 如果您希望初始值字符串包含擴(kuò)展的ASCII字符,請使用允許您指定默認(rèn)值參數(shù)的例程。 (有關(guān)擴(kuò)展ASCII字符集的信息,請參閱相應(yīng)的Wikipedia entry。) |
| Table name | 指定key所在的字符串文件的名稱。 genstrings工具將此參數(shù)解釋為字符串應(yīng)放置在其中的字符串文件的名稱。 如果未提供表名,則字符串將放置在默認(rèn)的Localizable.strings文件中。 (為此參數(shù)指定一個值時,請包含不帶.strings擴(kuò)展名的文件名。)表名以.nocache結(jié)尾的.strings文件(例如ErrorNames.nocache.strings)不會通過NSBundle緩存其內(nèi)容。 |
| Default value | 與給定鍵相關(guān)聯(lián)的默認(rèn)值。 如果未指定默認(rèn)值,那么genstrings工具將使用key字符串作為初始值。 默認(rèn)值字符串可能包含擴(kuò)展的ASCII字符。 |
| Comment | 翻譯注釋以包含字符串。 您可以使用注釋向翻譯團(tuán)隊提供有關(guān)如何使用給定字符串的線索。 genstrings工具將這些注釋放入字符串文件中,并將它們放在相關(guān)條目正上方的C風(fēng)格注釋分隔符(/ 和 /)中。 |
| Bundle | 與包含字符串文件的包相對應(yīng)的NSBundle對象或CFBundleRef類型。 您可以使用它從不同于應(yīng)用程序主包的包中加載字符串。 例如,您可以使用它從框架或插件加載本地化的字符串。 |
當(dāng)您從字符串文件請求字符串時,返回的字符串取決于可用的本地化(如果有)。 Cocoa和Core Foundation宏使用內(nèi)置的bundle國際化支持來檢索其本地化符合用戶當(dāng)前語言首選項的字符串。 只要您的本地化資源文件放置在適當(dāng)?shù)奶囟ㄓ谡Z言的項目目錄中,使用這些宏加載字符串應(yīng)自動生成適當(dāng)?shù)淖址?如果找不到適當(dāng)?shù)谋镜鼗址Y源,則該包的加載代碼會自動選擇相應(yīng)的非本地化字符串。
有關(guān)一般國際化以及如何創(chuàng)建特定于語言的項目目錄的信息,請參閱Internationalization and Localization Guide。 有關(guān)bundle結(jié)構(gòu)以及如何從bundle目錄中選擇資源文件的信息,請參閱Bundle Programming Guide。
1. Using the Core Foundation Framework - 使用Core Foundation框架
Core Foundation框架定義了一個函數(shù)和幾個宏,用于從應(yīng)用程序包中加載本地化的字符串。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)點是它們可以被genstrings工具解析并用于創(chuàng)建應(yīng)用程序的字符串文件。 他們使用起來也更簡單,并讓您將翻譯評論與每個條目相關(guān)聯(lián)。
有關(guān)前面宏的語法的信息,請參閱Foundation Functions Reference。 用于加載字符串的其他方法也在NSBundle Class Reference中定義。
2. Examples of Getting Strings - 獲取字符串示例
以下示例演示了使用Foundation和Core Foundation宏來檢索字符串的基本技巧。 每個示例都假定當(dāng)前包中包含名稱為Custom.strings的字符串文件,該文件已被翻譯成法文。 該翻譯文件包含以下字符串:
/* A comment */
"Yes" = "Oui";
"The same text in English" = "Le même texte en anglais";
使用Foundation框架,你可以您可以使用NSLocalizedStringFromTable宏來獲取“YES”字符串的值,如以下示例所示:
NSString* theString;
theString = NSLocalizedStringFromTable (@"Yes", @"Custom", @"A comment");
使用Core Foundation框架,您可以使用CFCopyLocalizedStringFromTable宏獲取相同的字符串,如下例所示:
CFStringRef theString;
theString = CFCopyLocalizedStringFromTable(CFSTR("Yes"), CFSTR("Custom"), "A comment");
在這兩個示例中,代碼指定要檢索的key,即字符串“YES”。 它們還指定要在其中查找key的字符串文件(或表),在本例中為Custom.strings文件。 在字符串檢索期間,注釋字符串被忽略。
Advanced Strings File Tips - 高級字符串文件提示
以下各節(jié)提供了一些關(guān)于使用字符串文件和字符串資源的高級技巧。
1. Searching for Custom Functions With genstrings - 使用genstrings搜索自定義函數(shù)
genstrings工具默認(rèn)情況下搜索Core Foundation和Foundation字符串宏。它使用這些宏中的信息在項目的字符串文件中創(chuàng)建字符串條目。您還可以指導(dǎo)genstrings在您的代碼中查找自定義的字符串加載函數(shù),并使用除標(biāo)準(zhǔn)宏之外的那些函數(shù)。您可以使用自定義函數(shù)來封裝內(nèi)置的字符串加載例程并執(zhí)行一些額外的處理,或者您可以用您自己的自定義模型替換默認(rèn)的字符串處理行為。
如果要使用自定義函數(shù)使用genstrings,則函數(shù)必須使用Foundation宏使用的命名和格式約定。您的函數(shù)的參數(shù)必須完全匹配相應(yīng)宏的參數(shù)。當(dāng)你調(diào)用genstrings時,你需要指定-s選項,后跟與NSLocalizedString宏對應(yīng)的函數(shù)的名稱。您的其他函數(shù)名稱應(yīng)該從這個基本名稱構(gòu)建。例如,如果你指定的函數(shù)名稱MyStringFunction,你的其他函數(shù)名應(yīng)該是MyStringFunctionFromTable,MyStringFunctionFromTableInBundle和MyStringFunctionWithDefaultValue。genstrings工具查找這些函數(shù)并使用它們來構(gòu)建相應(yīng)的字符串文件。
2. Formatting String Resources - 格式化字符串資源
對于某些字符串,您可能不希望(或能夠)對字符串資源中的整個字符串進(jìn)行編碼,因為部分字符串可能在運行時發(fā)生更改。 例如,如果一個字符串包含用戶文檔的名稱,則需要能夠?qū)⒃撐臋n名稱動態(tài)插入到字符串中。 創(chuàng)建字符串資源時,可以使用通常用于處理Foundation和Core Foundation框架中的字符串替換的任何格式化字符。 Listing 2-4顯示了幾個使用基本格式化字符的字符串資源。
Listing 2-4 Strings with formatting characters
"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.";
要用實際值替換格式化字符,可以使用字符串資源作為格式字符串,使用NSString的stringWithFormat:方法或CFStringCreateWithFormat函數(shù)。 Foundation和Core Foundation支持printf語句中使用的大多數(shù)標(biāo)準(zhǔn)格式化字符。另外,可以使用前面示例中顯示的%@說明符來插入與任意Objective-C對象關(guān)聯(lián)的描述性文本。請參閱String Programming Guide中的Formatting String Objects以獲取說明符的完整列表。
翻譯過程中經(jīng)常出現(xiàn)的一個問題是,翻譯者可能需要對翻譯后的字符串中的參數(shù)進(jìn)行重新排序,以解決源語言和目標(biāo)語言的差異。如果一個字符串包含多個參數(shù),那么翻譯器可以在格式化字符之間插入n $格式的特殊標(biāo)簽(其中n指定原始參數(shù)的位置)。這些標(biāo)簽讓翻譯器重新排列出現(xiàn)在原始字符串中的參數(shù)。以下示例顯示了一個字符串,其兩個參數(shù)在翻譯的字符串中被反轉(zhuǎn):
/* Message in alert dialog when something fails */
"%@ Error! %@ failed!" = "%2$@ blah blah, %1$@ blah!";
3. Using Special Characters in String Resources - 在字符串資源中使用特殊字符
就像在C中一樣,一些字符必須以反斜杠作為前綴,然后才能將它們包含在字符串中。 這些字符包括雙引號,反斜杠字符本身以及特殊控制字符,如換行符(\ n)和回車符(\ r)。
"File \"%@\" cannot be opened" = " ... ";
"Type \"OK\" when done" = " ... ";
您可以通過指定\ U隨后最多四個十六進(jìn)制數(shù)字,將任意Unicode字符包含在值字符串中。 四位數(shù)字表示所需的Unicode字符的條目; 例如,空格字符由十六進(jìn)制20表示,因此當(dāng)指定為Unicode字符時將是\ U0020。 如果字符串必須包含出于某種原因不能輸入的Unicode字符,則此選項非常有用。 如果使用此選項,則還必須將-u選項傳遞給genstrings,以便在結(jié)果字符串文件中正確解釋十六進(jìn)制數(shù)字。 如果指定了-u選項,那么genstrings會默認(rèn)您的字符串為低位ASCII,并且僅解釋反斜杠序列。
注意:如果您自己生成字符串文件(例如使用
genstrings),請確保這些字符串文件在添加到項目中之前以UTF-8編碼結(jié)尾。
4. Debugging Strings Files - 調(diào)試字符串文件
如果在測試過程中遇到問題,并發(fā)現(xiàn)檢索字符串的函數(shù)和宏始終返回相同的key(與翻譯的值相反),請在字符串文件上運行/ usr / bin / plutil工具。 字符串文件本質(zhì)上是一種以特殊方式格式化的屬性列表文件。 使用-lint選項運行plutil可以發(fā)現(xiàn)隱藏的字符或其他錯誤,以防止阻止字符串被正確檢索。
后記
本篇主要講述了字符串資源,感興趣的給個贊或者關(guān)注,謝謝~~~~
