《Effective Objective-C 2.0》內容討論及勘誤

請各位讀者將本書內容討論、勘誤、意見及建議發表於此,以便集中瀏覽,謝謝!


更新記錄:

2014年3月6日00:27添加勘誤條目
2014年3月7日00:10添加勘誤條目
2014年3月13日00:27添加爭議條目
2014年3月19日22:17添加爭議條目
2014年4月15日14:16添加勘誤條目
2014年4月15日14:22添加翻譯說明
2014年4月15日14:49添加爭議條目
2014年4月15日22:16添加對爭議條目之答辯
2014年5月1日1:20修改「關於本書暨計算機術語翻譯的幾點說明」
2014年5月1日1:20添加對「保留環」、「大中樞派發」這兩個爭議條目之答辯,補充新觀點、新證據
2014年5月1日23:52添加對「保留環」這一爭議條目的兩條新證據
2014年5月2日23:44為本帖添加按語
2014年5月16日21:16添加勘誤條目
2014年7月20日01:33添加回報者信息
2014年7月20日11:37添加數條勘誤
2016年5月25日18:32添加勘誤條目
2016年5月27日08:06添加兩條勘誤
2016年6月3日12:11添加勘誤並完善category一詞的翻譯
2016年6月24日09:06添加勘誤
2016年6月27日09:08添加建議
2017年1月19日18:48添加勘誤
2017年7月8日01:55添加勘誤


翔按:自本書出版以來,我與身邊部分友人及網上部分讀者就某些術語的翻譯問題產生了一些分歧。這些分歧雖然不屬於「勘誤」,但卻對我很有啓發,也促使我對坊間流行的某些譯法產生了重新考量之心。所以,小愛將其彙總於此,並附上自己對這些問題的總體看法以及對單項問題的答辯,僅供大家參考。特此感謝提出爭議的諸位朋友。

對計算機術語翻譯的幾點看法

我覺得技術書籍中的專業術語是否應該譯為英文,的確是個有些棘手的問題。另外,「日常技術交流」、「技術手冊」與「正式出版物」這三者的行文措辭,似乎有微妙區別。對於前兩者來說,適當保留英文,我也是比較贊同的,但對於正式出版物來說,尚需稍加謹慎。

對於「正式出版物裡的英文術語是否應該翻譯」,以及「如何看待多種譯法並存的現象」這兩個問題,我目前的看法是:

  1. 程序代碼、編程語言的關鍵字和保留字、程序命令等,不用翻譯。這一點通過字符的印刷樣貌就能分辨出來。一般來說代碼及命令會用等寬字型印刷,而正文會用普通字型印刷。
  2. 由類名派生出來的普通單詞或短語,譯與不譯均可。例如由Collection接口派生出來的collection一詞,譯成「集合」或保留「collection」原樣都可以,又如從AbstractList類派生出來的abstract list一詞,譯成「抽象列表」或保留「abstract list」原樣都可以。
  3. 全小寫形式的單個英文單詞,例如call、method、class、key、value等,似乎仍以譯為中文為佳。只有極個別詞語可以例外,如bug、cookie等。
  4. 以普通短語形式出現的術語,例如thread safety、method dispatch、retain cycle等,似乎也可譯為中文。為了保持中文句子連貫,我把中文放在了正文中,而把英文放在了括號裡。
  5. 以全英文大寫字母形式出現的術語,如果是眾所周知的詞,如API、ARC等等,則可保留不譯,但如KVO等小衆詞彙,甚至是GCD這樣有歧義的詞彙(是Greatest Common Divisor還是Grand Central Dispatch?),則需考量。暫時覺得可以採用折中辦法,也就是在句中保留KVO原樣不譯,但在後面加括號註明中文「鍵值觀測」。
  6. 以首字母大寫形式出現的短語,則要分兩種情況。如果是Core Data這樣的框架名稱,則可保留不譯,但如果是Grand Central Dispatch這樣的所謂「技術」,則似乎應該翻譯。
  7. 軟件界面中出現的單詞和短語可以不譯。例如「Create」按鈕、「Help」菜單等等。
  8. 對於一詞多譯的現象,應當求同存異,不宜強行要求一致。很多不同的譯法都是從某個側面概括了英文術語的一部分樣貌,它們之間可能有「比較準確」與「特別準確」之分,但似乎沒有「絕對準確」的譯法。例如「模式」和「綱要」都是從一個側面概括了schema一詞的樣貌,前者強調了它的「模板性質」,後者則強調了它的「輪廓性質」。兩者都可接受,也應該並存。
  9. 對於坊間流傳甚廣但卻有可商榷之處的那些譯法,則應稍加辨析,以釐清問題。比如常見的context及font兩詞。前者通譯「上下文」,但我認為有時可譯成「環境」或「情境」;後者通譯「字體」,我譯為「字型」。又如爭議表中提到的retain cycle,常見說法是「循環引用」,我譯為「保留環」。再如衆說紛紜的handle,常見譯法是「句柄」,我認為可以試譯為「控制器」、「描述符」等。

感謝ChenGe同學對此問題提出意見。


勘誤表

錯誤位置 原文 訂正 錯誤原因或備註 回報者
28、30、32、70、86頁 [NSStringstringWithFormat… [NSString stringWithFormat… 印刷錯誤
翔按:修改後,NSString右側應有英文半角空格
久沏新茶rui
29頁,第2章,第7節,setLastName第6行代碼 self.lastName = lastname; super.lastName = lastname; 代碼錯誤 Gemini
36頁,譯者註 也叫做「類別方法」。 由於class一詞還可以譯為「類別」,所以class method一詞也可以譯為「類別方法」。 原註釋易引發混淆 ChenGe
36頁,譯者註的序號 印刷錯誤 愛飛翔
42頁,第8行代碼 O BJC_ASSOCIATION_COPY OBJC_ASSOCIATION_COPY 印刷錯誤 jerry19672501
46頁,倒數第4行 NSFCNumber NSCFNumber 譯文有誤 Zhongliang Zhang
50頁,第1段代碼,第3行 //YES //NO 原書有誤
譯文沿襲
嘿o大远
52頁,
第2段代碼,
第1行代碼
[EOCAutoDictionarynew] [EOCAutoDictionary new] 印刷錯誤 Helen
久沏新茶rui
52頁,
第2段代碼,
第2行代碼
[NSDatedate… [NSDate date… 印刷錯誤 久沏新茶rui
54頁,
第3段代碼,
第2行代碼
[NSStringclass… [NSString class… 印刷錯誤 西安 汪先生
57頁,第8行,第一個和第三個「is a」 is a isa
備註:第一個和第三個「is a」,可以去掉其中的空格。但為了與英文原書第68頁第6行保持一致,譯文中的第二個「is a」,暫時保留原樣。
gaolingfeng
58頁,
第2段代碼,
第2行代碼
[NSMutableStringnew] [NSMutableString new] 印刷錯誤 久沏新茶rui
58頁,
第2段代碼,
第4行代碼
[NSStringclass… [NSString class… 印刷錯誤 西安 汪先生
58頁,
第2段代碼,
第6行代碼
[NSNumberclass… [NSNumber class… 印刷錯誤 西安 汪先生
58頁,
第2段代碼,
第8行代碼
[NSDateclass… [NSDate class… 印刷錯誤 西安 汪先生
59頁,
第1段代碼,
第2行代碼
[EOCSomeClassclass… [EOCSomeClass class… 印刷錯誤 西安 汪先生
70頁,
initWithFirstName方法的代碼
returnself return self 印刷錯誤 gaolingfeng
71頁,
第1行代碼
EOCPersonalloc EOCPerson alloc 印刷錯誤 gaolingfeng
80頁,
第2段代碼,
第1行代碼
[EOCRectanglealloc] [EOCRectangle alloc] 印刷錯誤 久沏新茶rui
101頁,
第2段
第3行
“分類”機制 category(範疇、分類)機制 西安 汪先生
151頁,
第1段
第2行
numerateObjectsUsingBlock enumerateObjectsUsingBlock 印刷錯誤 GavinZhou
180頁,sharedInstance第3行代碼 stat icdispatch_once_t static dispatch_once_t 印刷錯誤
翔按:修改之後,應對「static」一詞運用粗體印刷。
Helen
久沏新茶rui
201頁,
第2段代碼,
倒数第4行代碼
[EOCClassAnew] [EOCClassA new] 印刷錯誤 久沏新茶rui

意見表

原文 建議 提議原因 提議者
class-continuation分類 類擴展 與蘋果的說法保持一致 Zhongliang Zhang

爭議表


  • 爭議:「retain cycle」是譯為「保留環」還是「循環引用」?
  • 提交者:Helen
  • 答辯:
    第一種譯法是直譯,第二種譯法表面看起來是意譯,但卻有若干疑點。本書採用第一種譯法。原因如下。

    1. 在維基百科中,「循環引用」一詞對應的英文是「Circular reference」,這個名詞性短語的中心詞是「reference」,該詞譯回中文,纔是真正的「循環引用」。「循環引用」與「circular reference」之間是一一對應關係;而「retain cycle」與「保留環」之間也是一一對應關係。真正應該譯為「循環引用」的英文詞是「circular reference」或「cyclic reference」,而不是「retain cycle」。
    2. 如果把「retain cycle」譯成「循環引用」,那麼兩個短語的中心詞將會不符。前者是英文裡的名詞性短語,其中心詞是「cycle」(環),而後者則是漢語裡的偏正短語,其中心詞為「引用」。
    3. 如果把「retain cycle」譯成「循環引用」,那麼「retain cycle」裡的「retain」(保留)一詞不見了,中文卻憑空多出來了「引用」二字。
    4. 補充一條新證據,《IOS中的block和retain cycle》(http://justsee.iteye.com/blog/1775245)一文第八段第一句話,「Retain cycle,翻譯成中文大概叫保留環吧」。
    5. 再補充一條直接證據。《Effective Objective-C 2.0》英文版Item 33,第169頁第4段第1句話:「The best way to avoid retain cycles is to make use of weak references.」如果逐字對譯為中文,那就是「避免retain cycle的最佳方式是利用weak reference」。假如把「retain cycle」譯為「循環引用」,那麼由於「weak reference」通譯為「弱引用」,所以全句就變為「避免循環引用的最佳方式是利用弱引用」。由此則引發尷尬:同一句裡的同一個中文詞語「引用」出現了兩次,第二次出現的「引用」一詞可以和「weak reference」中的「reference」相對應,但第一次出現的那個「引用」,卻無法和原句中的英文單詞相對應。
    6. 再有原書第170頁圖5.5的題註「Retain cycle being leaked when …」就明確地指出了「遭泄漏」的是「retain cycle」。若譯為「循環引用」,就成了「當……的時候,循環引用被泄漏了」。「循環引用」怎麼能「被泄漏」呢?真正被泄漏的是由四個循環引用所導致的這個保留環中的四個對象

    綜上所述,這種坊間流行的譯法有「中心詞不符」、「減詞」及「增詞」等問題,而上述第5、6兩條更是表明至少在本書語境中,不便把retain cycle譯成「循環引用」。特此辨析,以期引起各位朋友重視。


  • 爭議:「selector」是譯為「選擇子」、「選擇器」,還是保留英文原樣不譯?
  • 提交者:Helen
  • 答辯:此問題業界尚未形成統一意見,歡迎大家繼續爭論。本書採用第一種譯法。翔按:與友人goldlion討論時,我又分別發現了2010年的一篇PDF文檔《調度與回調》
    http://www.wiyun.com/site_media/wiki/attachments/scheduler_callback.pdf
    和一篇博客文章《Objective-C Selector》
    http://zhiwei.li/text/2010/11/objective-c-selector/
    ,前者在目錄第二行寫有「什麼是選擇子」,後者在倒數第四行出現了「方法和選擇子」的說法。

  • 爭議:「block」一詞是否應該保留英文原樣不翻譯?
  • 提交者:leafduo
  • 答辯:全小寫形式的單個英文單詞似以翻譯為佳。本書暫且將其譯為「塊」。

  • 爭議:「Grand Central Dispatch」一詞是否應該保留英文原樣不翻譯?
  • 提交者:leafduo
  • 答辯:

    本書暫且將其譯為「大中樞派發」。翔按:poolo所著《[ios] GCD-Grand Central Dispatch》一文,曾將其稱為「大中樞派發」。請參考:http://poolo.iteye.com/blog/1701080 第三行。

    從語源學角度來講,Grand Central Dispatch與英文中的固有詞彙「Grand Central Terminal」同構,都是「Grand Central+名詞中心語」。

    關於此一論述之證據,請參看Ben Jakuben所做題為《Getting Images Using Grand Central Dispatch》(http://teamtreehouse.com/library/implementing-designs-for-iphone/finishing-the-user-interface/getting-images-using-grand-central-dispatch)的電子講稿。

    該講稿中提到:The name, which is in reference to Grand Central Terminal in New York, suggests that Grand Central Dispatch, or GCD for short, is a hub that manages a bunch of different activities。這明確指出了兩詞之間的延遞關係。

    既然二者之英文構造相同,那麼其中文譯法也應具備同構性。查「Grand Central Terminal」一詞已有固定譯法,中文叫做「大中央車站」(參見:https://zh.wikipedia.org/wiki/%E5%A4%A7%E4%B8%AD%E5%A4%AE%E8%BB%8A%E7%AB%99),所以,將「Grand Central Dispatch」譯為「大中樞派發」或「大中央派發」,是與之同構的,這保持了翻譯的連貫性。


  • 爭議:「key」一詞是否應該保留英文原樣不翻譯?
  • 提交者:ChenGe
  • 答辯:全小寫形式的單個英文單詞似以翻譯為佳。本書暫且將其譯為「鍵」。

  • 爭議:「method dispatch」一詞出現在正文裡的時候,是以中文為主,括號內輔以英文,還是以英文為主,括號內輔以中文?
  • 提交者:ChenGe
  • 答辯:為求印刷效果順暢,本書暫且將其譯為中文,並在括號內輔以英文。

  • 爭議:「KVO」一詞是否應該保留英文原樣不翻譯?
  • 提交者:ChenGe
  • 答辯:由於是比較小衆的術語,所以本書暫且將其譯為中文。當然了,也可以像ChenGe同學說的那樣,將KVO均保留英文原樣不譯,但是在每次出現時均於後方加上括號,其內寫上「鍵值觀測」四個字。

豆瓣信息頁面:
http://book.douban.com/subject/25829244/
china-pub信息頁面:
http://product.china-pub.com/3769387
卓越亞馬遜信息頁面:
http://www.amazon.cn/Effective-Objective-C-2-0-编写高质量iOS与OS-X代码的52个有效方法-Matt-Galloway/dp/B00IDSGY06/ref=sr_1_1
當當網信息頁面:
http://product.dangdang.com/23416852.html
京東信息頁面:
http://item.jd.com/11402853.html


英文原版书相關信息:
名稱:《Effective Objective-C 2.0: 52 Specific Ways to Improve Your iOS and OS X Programs》
作者:Matt Galloway
出版社:Addison-Wesley Professional

Amazon信息頁面:http://www.amazon.com/Effective-Objective-C-2-0-Specific-Development/dp/0321917014/
豆瓣信息頁面:http://book.douban.com/subject/7952514/

《Effective Objective-C 2.0》內容討論及勘誤 有 “ 9 則迴響 ”

  1. 对于这种翻译的让人看不懂了,缺依然找各种理由狡辩的译者真是无语了。翻译的目的,是为了让无法看懂原文的人,“能看懂”这本书。我最烦的一个解释就是,因为别人这么翻译的所以我也这么翻译。别人翻译的就一定对吗?别人翻译的就一定能让人看懂吗?至于KVO和GCD、循环引用,我就给你一个理由为什么不翻译或这么翻译:这本书的面向人群不是初级读者,应该是有至少1、2年以上的Object-C编程经验的中高级读者,所以根本就不存在你说的什么小众词汇的问题,因为需要读这本书或者说能读懂这本书的人,对这些词汇早已熟悉了。如果你作为一个译者觉得这些词很生疏,那就说明你不适合翻译这本面向中高级读者的书。最后再补充一句:技术书籍不是小说,是要翻译的能看懂,不需要你翻译的多么有诗意,所以不用你去顾忌什么翻译的连贯性。

    1. 我也是最近入手这本书,对你的看法深表认同。译作本身的作用就是降低我们阅读原著的时间成本,倘若大家还需要花费精力去理解你译作当中所谓的那些“选择子”“保留环”,那我们还不如搬着原著逐字逐句加入自己的理解。译者一口一个“坊间”的译法,虽然译者的翻译确实正确无误,无从辩驳。但是译者你需要知道的是,你口中的所谓“坊间译法”却是国内多年来培养IT人才的养分。

      还望在下一版中译者能够对诸多读者的期望有所回复。

  2. 勘误提交:

    151页第一行第二句, 传给“numerateObject
    sUsingBlock:” 方法的块并未先赋给局部变量。

    这个方法不对应上面代码的enumeraterObjectsUsingBlock, 少了一个"e"在开始

  3. 您好 书中第58页(2015年10月第1版第7次印刷) [dict isMemberOfClass:[NSMutableDictionary class]] 书中表明返回为YES 实际返回为NO,个人分析是因为 类族 的原因.

發表留言