瞭解Cocoa使用者介面中字串代碼使用

來源:互聯網
上載者:User

瞭解Cocoa使用者介面字串代碼使用方法是本文要介紹的內容,iOS的介面前台的展示,有字元和映像都是通過編碼來實現的,新的Cocoa的開發人員應該通過多看蘋果開發文檔,熟悉函數及各個事件靈活的使用方法,就能快速提高自己的iOS開發的技能.

在這篇文章中,我將提到在iPhone使用者介面上管理和使用的文本字串的最好程式. 這是一個相當簡單的技術主題,但是Cocoa建立作為處理使用者介面字串的最好的程式例子,新的Cocoa的開發人員應該會注意到這點.由於它不可避免會提及,我也提到在你的應用程式使用字元的步驟,但請記住:你應該按好的程式來練習字串處理技能,儘管你沒有打算調整你的應用程式.

 
  1. Introduction (the wrong way) 

簡述(錯誤的方法)

在一定的技術水平下給使用者的介面添加文字字串並不是難事.在原始碼裡面填充代碼就像添加文字一樣簡單.

可能就是一個

UI標籤

實現字元的

這段代碼是iOS的UI的標籤代碼​

在Mac OS X,你應該設定為

stingValue的屬性​

可能是一個

NSTexField的屬性

另外的這個步驟是一樣的.

雖然這個可以實現功能,但你你不應該用這種方法來設定使用者介面的字串.

B---用字面字串設定標籤(正確的方法)

最完整的把字元添加到你的Cocoa應用程式的使用者介面是如下的方法:

 
  1. someUserInterfaceLabel.text =  
  2. NSLocalizedStringFromTable(  
  3. @"Text to display", // the native language string  
  4. @"SomePageLabels", // the category  
  5. @"Label display string"); // a comment describing context 

這個是相當的繁雜的.它也可以如下的用法:

 
  1. someUserInterfaceLabel.text = NSLocalizedString(@"Text to display", nil); 

如果你沒有做其它的步驟,這個代碼也會產生同樣錯誤.

你可以

一直使用這個(NSLocalizedString)

每個使用者介面的宏程式都有字串在你的代碼中

但是這個有點不一樣

NSLocalizedString這樣的代碼需要很多的輸入,除非你已經做了另外更多的步驟並且程式不需要什麼不同的功能?如果我現在不考慮轉換我的程式,它們是不是完全無用的呢?

為什麼NSLocaliedString是重要的,儘管你不想來使用

明顯地,

 
  1. NSLocalizedString  
  2. [...] functions (and the less common  
  3. [...]功能(比通常​  
  4. CFCopyLocalizedString  
  5. CFCopylocalizedString​​ 

[...] 變體​的值是讓所有的個功能本地話語言(i.e 讓你的程式顯示為不同的語言)​

從技術上說,他們甚至不是一種功能——它們只是宏程式的請求

 
  1. -[NSBundle localizedStringForKey:value:table:]  
  2. -[NSBundle localizedStringForKey:value:table:] 

方法-​你可以用宏程式,並且因為很多的理由你不用調用什麼方法​.我會在下部分來討論語言變換的機制.

然而,儘管你不想讓你的程式可以顯示更多的語言,你也得使用NSLocalizedString

一直用NSLocalizedString這有幾個理由:

1.未來改變的基礎 :NSLocalizedString

2.模型視圖控制設計模式:它保持了你的模型層/展示層的詳細記錄,其中至少有一個不正確的地位從你的控制器源碼裡面撤出.在某種情況下,你可以簡單的該表.strings的檔案來為你的程式更新來調整使用者的介面,而不用單獨去修改代碼

3.關注點分離:它清晰地顯示了在使用者展示層字串,作為對應字元只供編程使用的.

4.最佳化冗繁的程式:從你的控制器獨立使用者介面字元,你不會願意從使用者介面去返回去閱讀字串,或者程式員已經放置好在使用者介面上面的放好的字元

未來是很難預測的.你不知道你在以後會想把轉化成別的語言.​到時候你要通過你的全部的代碼和找出有所有的字串的目錄是很費時間,而且會導致錯誤.相反得,應該把所有的事情通過使用NSLocalizedString來轉化的語言的習慣.​​

這很容易實現,甚至當你在​解碼的時候,你就能使用它了.​

分離關注點

分離關注點在瀏覽代碼是很有用,並且可以知道動向.考慮下面單獨的程式碼片段

 
  1. [someDictionary setObject:@"value" forKey:SomeKeyNameString];  
  2. [someDictionary setObject:NSLocalizedString(@"value", nil) forKey:SomeOtherKeyNameString]; 

不用知道

什麼是someDictionary屬性​​

或者是someKeyNameString和SomeOtherkeyName的作用是什麼

 
  1. SomeKeyNameString  
  2. and  
  3. SomeOtherKeyNameString 

屬性的含義是,我們知道第二個字串的是用來在第一個字串不能直接實現的一個值來表現使用者介面的.

這個獨立使用的這個屬性,對使用者介面的顯示是很有協助的,相對someKeyNameString,它在程式當中有更多的用法.

 
  1. Discourages other bad practices 

最佳化冗繁的代碼

如果你認為NSLocalizedString就像它們的輸出是個黑盒子,這個可以協助你在系統管理使用者介面的元素的時候避免極差的控制器的設計.它可以作為一個概念的工具,讓你通過有效方法來設計,不是以個愚蠢的設計.

你的控制器代碼會把使用者介面的字串當作可以被寫,但是不會被讀.從你的使用者介面閱讀基本的字串是很不好受.

在上面的分離關注點的那個例子中,你可以能會認為SomeKeyNameString和SomeOtherKeyNameString

是在這個例子中被定義為全域變數,就是你可以用來定義本地語言的一個變數.在多數情況下,使用國際化的變數的並不好.

我們在全域變數中定義了字典的鍵,因為有個程式的不同的位置需要使用同樣的屬性,在多處資訊交換的時候就會出現錯誤.在使用者介面的字串的值,你不應該有另外的變數需要和其中的另一個完全一樣的值:你不應該從你的使用者介面去回讀代碼或者與使用者介面的協助.一般來說,如果的相同的使用者介面需要多次使用,才可以有同樣字串在程式裡面.(例如.你在繪製同樣的對象),但是在這種的情況下,代碼都是公用的,而這個字串也只能在代碼中出現一次.

如果您需要唯一標識標籤或文本顯示的類型,測試它所包含的文本是錯誤的方法.一個更好的方法是使用UIView的標籤 /NSActionCell​

tag

 
  1. value of any  
  2. UIView  
  3. /  
  4. NSActionCell  
  5. and then map the 

然後描述對象的角色和功能的屬性值

tag

 
  1. 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實現這個功能,他開你的項目的根目錄運行終端,然後輸入下面的命令:

 
  1. find -E . -iregex '.*\.(m|h|mm)$' -print0 | xargs -0 genstrings -a -o Resources/en.lproj  
  2.  
  3. 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”的代碼可能會有很多的條目就像下面的代碼:

 
  1. "Some UI string %@ to translate %@" = "Some UI string %1$@ to translate %2$@";  
  2.  
  3. "Some UI string %@ to translate %@" = "Some UI string %1$@ to translate %2$@"; 

你的程式翻譯功能僅需要對應翻印同樣的描述就可以.​注意你的字串的預留位置​已經給出的​次序,這樣可以是轉換的時候改換原來的預留位置,如果​如果你使用預留位置,您應該包括注釋,解釋他們要去秩序.

本土化與國際化:

1.國際版本:你從原來的程式轉化過來的

2.原始版本:你翻譯程式和轉化新的版本

通過那個幾個術語,NSLocalizedString的作用

建立和打包“.strings”的檔案是國際化的視窗.

一般來說,​建立新的語言的轉化版​被稱為本地化的過程.實際上,它包括了兩個步驟:​

genstrings只能處理靜態NSLocalizedString和CFCopyLocalizedString字串

可以被自動提取的字元是在NSlocalizedString函數裡面的:

 
  1. NSLocalizedString  
  2. [...] and  
  3. CFCopyLocalizedString 

[...]巨集指令顯然,所有的使用者介面文本需要被包含到上面的函數(CFCopyLocalizedString),也得記住底層的樣子

 
  1. [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使用者介面字串代碼使用方法的內容介紹完了,希望本文對你有所協助!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.