了解Cocoa用戶界面中字符串代碼使用
了解Cocoa用戶界面中字符串代碼使用方法是本文要介紹的內容,iOS的界面前臺的展示,有字符和圖像都是通過編碼來實現的,新的Cocoa的開發者應該通過多看蘋果開發文檔,熟悉函數及各個事件靈活的使用方法,就能快速提高自己的iOS開發的技能.
在這篇文章中,我將提到在iPhone用戶界面上管理和使用的文本字符串的最好程序. 這是一個相當簡單的技術主題,但是Cocoa建立作為處理用戶界面的字符串的最好的程序例子,新的Cocoa的開發者應該會注意到這點.由于它不可避免會提及,我也提到在你的應用程序使用字符的步驟,但請記住:你應該按好的程序來練習字符串處理技能,盡管你沒有打算調整你的應用程序.
- Introduction (the wrong way)
簡述(錯誤的方法)
在一定的技術水平下給用戶的界面添加文字字符串并不是難事.在源代碼里面填充代碼就像添加文字一樣簡單.
可能就是一個
UI標簽
實現字符的
這段代碼是iOS的UI的標簽代碼
在Mac OS X,你應該設置為
stingValue的屬性
可能是一個
NSTexField的屬性
另外的這個步驟是一樣的.
雖然這個可以實現功能,但你你不應該用這種方法來設置用戶界面的字符串.
B---用字面字符串設置標簽(正確的方法)
最完整的把字符添加到你的Cocoa應用程序的用戶界面是如下的方法:
- someUserInterfaceLabel.text =
- NSLocalizedStringFromTable(
- @"Text to display", // the native language string
- @"SomePageLabels", // the category
- @"Label display string"); // a comment describing context
這個是相當的繁雜的.它也可以如下的用法:
- someUserInterfaceLabel.text = NSLocalizedString(@"Text to display", nil);
如果你沒有做其它的步驟,這個代碼也會產生同樣錯誤.
你可以
一直使用這個(NSLocalizedString)
每個用戶界面的宏程序都有字符串在你的代碼中
但是這個有點不一樣
NSLocalizedString這樣的代碼需要很多的輸入,除非你已經做了另外更多的步驟并且程序不需要什么不同的功能?如果我現在不考慮轉換我的程序,它們是不是完全無用的呢?
為什么NSLocaliedString是重要的,盡管你不想來使用
明顯地,
- NSLocalizedString
- [...] functions (and the less common
- [...]功能(比通常
- CFCopyLocalizedString
- CFCopylocalizedString
[...] 變體的值是讓所有的個功能本地話語言(i.e 讓你的程序顯示為不同的語言)
從技術上說,他們甚至不是一種功能——它們只是宏程序的請求
- -[NSBundle localizedStringForKey:value:table:]
- -[NSBundle localizedStringForKey:value:table:]
方法-你可以用宏程序,并且因為很多的理由你不用調用什么方法.我會在下部分來討論語言變換的機制.
然而,盡管你不想讓你的程序可以顯示更多的語言,你也得使用NSLocalizedString
一直用NSLocalizedString這有幾個理由:
1.未來改變的基礎 :NSLocalizedString
2.模型視圖控制設計模式:它保持了你的模型層/表示層的詳細記錄,其中至少有一個不正確的地位從你的控制器源碼里面撤出.在某種情況下,你可以簡單的該表.strings的文件來為你的程序更新來調整用戶的界面,而不用單獨去修改代碼
3.關注點分離:它清晰地顯示了在用戶表示層字符串,作為對應字符只供編程使用的.
4.優化冗繁的程序:從你的控制器獨立用戶界面字符,你不會愿意從用戶界面去返回去閱讀字符串,或者程序員已經放置好在用戶界面上面的放好的字符
未來是很難預測的.你不知道你在以后會想把轉化成別的語言.到時候你要通過你的全部的代碼和找出有所有的字符串的目錄是很費時間,而且會導致錯誤.相反得,應該把所有的事情通過使用NSLocalizedString來轉化的語言的習慣.
這很容易實現,甚至當你在解碼的時候,你就能使用它了.
分離關注點
分離關注點在瀏覽代碼是很有用,并且可以知道動向.考慮下面單獨的代碼段
- [someDictionary setObject:@"value" forKey:SomeKeyNameString];
- [someDictionary setObject:NSLocalizedString(@"value", nil) forKey:SomeOtherKeyNameString];
不用知道
什么是someDictionary屬性
或者是someKeyNameString和SomeOtherkeyName的作用是什么
- SomeKeyNameString
- and
- SomeOtherKeyNameString
屬性的含義是,我們知道第二個字符串的是用來在第一個字符串不能直接實現的一個值來表現用戶界面的.
這個獨立使用的這個屬性,對用戶界面的顯示是很有幫助的,相對someKeyNameString,它在程序當中有更多的用法.
- Discourages other bad practices
優化冗繁的代碼
如果你認為NSLocalizedString就像它們的輸出是個黑盒子,這個可以幫助你在管理用戶界面的元素的時候避免極差的控制器的設計.它可以作為一個概念的工具,讓你通過有效的方法來設計,不是以個愚蠢的設計.
你的控制器代碼會把用戶界面的字符串當作可以被寫,但是不會被讀.從你的用戶界面閱讀基本的字符串是很不好受.
在上面的分離關注點的那個例子中,你可以能會認為SomeKeyNameString和SomeOtherKeyNameString
是在這個例子中被定義為全局變量,就是你可以用來定義本地語言的一個變量.在多數情況下,使用國際化的變量的并不好.
我們在全局變量中定義了字典的鍵,因為有個程序的不同的位置需要使用同樣的屬性,在多處信息交換的時候就會出現錯誤.在用戶界面的字符串的值,你不應該有另外的變量需要和其中的另一個完全一樣的值:你不應該從你的用戶界面去回讀代碼或者與用戶界面的協助.一般來說,如果的相同的用戶界面需要多次使用,才可以有同樣字符串在程序里面.(例如.你在繪制同樣的對象),但是在這種的情況下,代碼都是公用的,而這個字符串也只能在代碼中出現一次.
如果您需要唯一標識標簽或文本顯示的類型,測試它所包含的文本是錯誤的方法.一個更好的方法是使用UIView的標簽 /NSActionCell
tag
- value of any
- UIView
- /
- NSActionCell
- and then map the
然后描述對象的角色和功能的屬性值
tag
- value onto the object's role or function (
tag它是一個指針的值,所以你可以存儲非保留對象,而不僅僅是整數.
標簽的屬性值不保存任何的其它的值,它是由控制器它是由控制器來跟蹤用戶界面項目和它們的狀態。
轉化的過程
最終,你可能要翻譯你的外文的程序.讓我們看看所涉及的步驟.
建立你的.strings的文件
你的程序包含的“.strings"的文件是你所需要翻譯的,在默認的情況下,不會有任何”.strings“的文件(除了InfoPlist.strings文件,該文件是為翻譯您的Info.plist文件中的字符串)
第一步是確保你有一個指定的目錄(可能是你項目文件夾資源子目錄).如果是在處理的英文的字符才一個指定的目錄應該命名為"en.lproj",否則你應該用ISO639-1和ISO639-2 替代”en“的標記.如果需要的話,你可以可以使用腳本和區域標識符作為描述蘋果的開發的語言和區域標識符.
一個文件夾名稱的備注:這是很容易見到用“English.Ipoj”代替“en.Iproj”,事實上,如果你獲取文件的信息并且選擇了生成本地化文件,Xcode3就會自動生成用這個名字生成的那個名字的文件夾.蘋果公司表示這些命名已經老了,從MacOSX 10.4以上的版本就傾向于ISO639-1和ISO639-2代號.不要使用舊的“English.proj”類型的名字,用“en.lproj”來替代,如果是自動創建的(是的,如果你改了文件夾的名字需要更新的你Xcode的路徑)
現在我們在程序里面,我們能從NSLocalizedString函數自動創建“.strings”文件
NSLocalizedString實現這個功能,他開你的項目的根目錄運行終端,然后輸入下面的命令:
- find -E . -iregex '.*\.(m|h|mm)$' -print0 | xargs -0 genstrings -a -o Resources/en.lproj
- find -E . -iregex '.*\.(m|h|mm)$' -print0 | xargs -0 genstrings -a -o Resources/en.lproj
這些命令會處理你的程序目錄層次結構的的所有.m .h .mm的文件和在en.lpoj中創建“.strings”文件(注意,en.lproj的目錄必須是已經存在) 這是假定你創建本地化資源目錄位于“資源/ en.proj“,相對于你的項目的根目錄,很明顯,你需要改變這目錄位置,如果你把它放在別處。
“.strings”的代碼可能會有很多的條目就像下面的代碼:
- "Some UI string %@ to translate %@" = "Some UI string %1$@ to translate %2$@";
- "Some UI string %@ to translate %@" = "Some UI string %1$@ to translate %2$@";
你的程序翻譯功能僅需要對應翻印同樣的描述就可以.注意你的字符串的占位符已經給出的次序,這樣可以是轉換的時候改換原來的占位符,如果如果你使用占位符,您應該包括注釋,解釋他們要去秩序.
本土化與國際化:
1.國際版本:你從原來的程序轉化過來的
2.原始版本:你翻譯程序和轉化新的版本
通過那個幾個術語,NSLocalizedString的作用
創建和打包“.strings”的文件是國際化的窗口.
一般來說,創建新的語言的轉化版被稱為本地化的過程.實際上,它包括了兩個步驟:
genstrings只能處理靜態NSLocalizedString和CFCopyLocalizedString字符串
可以被自動提取的字符是在NSlocalizedString函數里面的:
- NSLocalizedString
- [...] and
- CFCopyLocalizedString
[...]宏指令顯然,所有的用戶界面文本需要被包含到上面的函數(CFCopyLocalizedString),也得記住底層的樣子
- [NSBundle localizedStringForKey:value:table:]
的方法是不會自動被處理的
為什么你會直接用-[NSBundle localizedStringForKey:value:table:]?它的原因是他會自動生成所需的字符串.
如果程序檢測到在本地化的宏程序中有其它的靜態的字符串,這個genstrings的命令就會出現錯誤. 這是恰當的,因為你不希望你的變量名被轉化和函數調用(它們只需要轉化這些調用的結果)。
你會使用-[NSBundle localizedStringForKey:value:table:]的原因是:那些被轉化成本地語言的字符串是那些在代碼里面的(或在一個文件不是從代碼生成的“.string “),你只需要去尋找它們的變化。
編碼的問題
從Mac OS X10.5開始,你可以把任何UTF- 8字符在你的NSLocalizedString函數。在這之前, 他們必須是用Unicode轉義\\ Uxxxx風格的純粹的7位的ASCII碼的另外方式或者你可以使用帶- macRoman命令行選項MacRoman使用MacRoman高ASCII字符。
小結:了解Cocoa用戶界面中字符串代碼使用方法的內容介紹完了,希望本文對你有所幫助!