
這個(gè)問(wèn)題我被問(wèn)過(guò)很多次了。說(shuō)實(shí)話,第一次接觸本地化的時(shí)候,我也以為翻譯就是找?guī)讉€(gè)譯者,把界面上的文字翻成目標(biāo)語(yǔ)言就完事了。但真正入行之后才發(fā)現(xiàn),這里面的水比我想象的要深得多。
記得前幾年有個(gè)朋友跟我吐槽,說(shuō)他找人本地化了一個(gè)國(guó)外的小軟件,結(jié)果翻譯出來(lái)的版本要么顯示亂碼,要么按鈕被截掉一半能用。來(lái)找我訴苦的時(shí)候一臉郁悶:明明翻譯都看過(guò)了,怎么還會(huì)出這種問(wèn)題?我看了看他的安裝包,一眼就發(fā)現(xiàn)了問(wèn)題——那些譯者只改了文本文件,根本沒(méi)動(dòng)程序里硬編碼的文字,更別說(shuō)考慮中文字符比英文寬一半這個(gè)基本問(wèn)題了。
所以今天我想聊聊這個(gè)話題:軟件本地化翻譯,到底會(huì)不會(huì)涉及到代碼修改?
在說(shuō)代碼修改之前,咱們得先明確一個(gè)概念。很多人在說(shuō)"本地化"的時(shí)候,其實(shí)心里想的是"翻譯",但這兩者還真不是一回事。
本地化(Localization,簡(jiǎn)稱(chēng)L10N)是一個(gè)系統(tǒng)工程,目標(biāo)是把一個(gè)軟件徹底改造成能夠適應(yīng)特定地區(qū)市場(chǎng)使用的產(chǎn)品。這個(gè)過(guò)程除了翻譯文本之外,還要考慮當(dāng)?shù)氐拈喿x習(xí)慣、貨幣符號(hào)、日期格式、鍵盤(pán)布局、顏色偏好、文化禁忌等等一系列因素。打個(gè)比方,如果軟件要進(jìn)入阿拉伯市場(chǎng),界面可能要從右向左排列;如果面向日本市場(chǎng),可能需要加入漢字假名混排的支持;而面向中國(guó)內(nèi)地市場(chǎng),人民幣符號(hào)、簡(jiǎn)體中文界面、中文輸入法這些都得考慮進(jìn)去。
翻譯(Translation)只是本地化這個(gè)大工程里的一部分工作。它要解決的是"把文字從一種語(yǔ)言轉(zhuǎn)成另一種語(yǔ)言"這個(gè)問(wèn)題,但本地化要解決的問(wèn)題遠(yuǎn)比這個(gè)復(fù)雜——它要確保軟件在當(dāng)?shù)啬軌?strong>正常、舒適、合規(guī)地使用。
這就好比裝修房子。翻譯是換家具,把美式沙發(fā)換成中式紅木椅;但本地化是整套設(shè)計(jì)方案都要重新考慮——采光怎么調(diào)整,插座位置夠不夠用,廚房要不要改成開(kāi)放式。都是改動(dòng),程度完全不同。

這個(gè)問(wèn)題要分情況來(lái)看。
先說(shuō)最理想的情況。一個(gè)設(shè)計(jì)良好的軟件,在開(kāi)發(fā)階段就已經(jīng)考慮了國(guó)際化(Internationalization,簡(jiǎn)稱(chēng)I18N)的問(wèn)題。什么叫國(guó)際化做得好?就是把所有需要翻譯的文字都集中放在外部資源文件里,比如常見(jiàn)的.resx、.po、.json、.strings這些格式的文件。程序運(yùn)行時(shí)根據(jù)用戶(hù)選擇的語(yǔ)言去加載對(duì)應(yīng)的資源文件,界面文字自然就切換了。這種情況下,譯者只需要翻譯資源文件里的內(nèi)容,根本不用碰任何代碼。軟件的行為邏輯、界面布局、核心功能都不會(huì)因?yàn)榉g而改變。
但現(xiàn)實(shí)往往沒(méi)那么美好。我在工作中見(jiàn)過(guò)太多軟件,因?yàn)闅v史原因或者開(kāi)發(fā)團(tuán)隊(duì)國(guó)際化意識(shí)不足,把文字直接寫(xiě)在代碼里。比如按鈕上的文字是 `btn.Text = "確定"`,下拉菜單的選項(xiàng)是硬編碼在代碼中的數(shù)組里,甚至還有把提示信息寫(xiě)在異常處理分支里的。這種情況下,如果只改資源文件,根本找不到要翻譯的內(nèi)容。
這時(shí)候問(wèn)題就來(lái)了:這些硬編碼在代碼里的文字需不需要改?
我的回答是:需要改,但這個(gè)改法要慎重。
首先,把代碼里的文字提取到資源文件里,這本身確實(shí)是一次代碼層面的改動(dòng)。但這次改動(dòng)屬于"代碼重構(gòu)",目的是為后續(xù)的本地化工作打基礎(chǔ)。重構(gòu)完成之后,以后的翻譯工作就不再需要碰代碼了。所以很多成熟的做法是在本地化項(xiàng)目初期先做一輪"國(guó)際化審計(jì)",把代碼里所有需要本地化的內(nèi)容都找出來(lái),提取到統(tǒng)一的資源文件中。這次改動(dòng)之后,后續(xù)的翻譯工作就純粹是文本層面的了。
不過(guò),這里有個(gè)關(guān)鍵點(diǎn)需要說(shuō)明:這種代碼改動(dòng)通常由開(kāi)發(fā)人員來(lái)完成,而不是翻譯人員。翻譯人員的核心能力是語(yǔ)言轉(zhuǎn)換,不是編程。讓譯者去改代碼,就像讓程序員自己寫(xiě)產(chǎn)品文案一樣,有點(diǎn)強(qiáng)人所難。專(zhuān)業(yè)的事情交給專(zhuān)業(yè)的人來(lái)做,這是靠譜的項(xiàng)目管理方式。

除了提取硬編碼文字之外,確實(shí)還有一些場(chǎng)景是需要對(duì)代碼本身進(jìn)行修改的。我來(lái)列幾個(gè)比較常見(jiàn)的情況。
字符編碼問(wèn)題是最典型的。早期的軟件很多默認(rèn)使用ANSI編碼,比如西歐語(yǔ)言的ISO-8859-1。這種編碼存中文就會(huì)亂碼。解決的辦法通常是把程序內(nèi)部處理字符串的部分改成支持UTF-8或者Unicode。這看起來(lái)是"改代碼",但實(shí)際上是為了讓程序能夠正確處理多語(yǔ)言文字。
字體渲染也是常見(jiàn)問(wèn)題。很多軟件內(nèi)置了幾款西文字體,界面設(shè)計(jì)也是按照西文字符的寬度來(lái)做的。換成中文之后,字符寬度差不多翻倍,原來(lái)預(yù)留的空間就不夠了,按鈕上的字可能只顯示一半。這時(shí)候可能需要調(diào)整界面布局的代碼,比如允許標(biāo)簽自動(dòng)換行,或者根據(jù)文字長(zhǎng)度動(dòng)態(tài)調(diào)整控件尺寸。
雙向文字支持是另一個(gè)典型場(chǎng)景。當(dāng)軟件要適配阿拉伯語(yǔ)或者希伯來(lái)語(yǔ)時(shí),文字方向要從右向左,但數(shù)字和英文又要保持從左向右的顯示順序。這不是簡(jiǎn)單地把界面鏡像就能解決的,需要程序能夠正確處理雙向文字的顯示邏輯。
日期、數(shù)字、貨幣格式的本地化有時(shí)也需要代碼配合。比如美國(guó)人習(xí)慣月/日/年,中國(guó)人習(xí)慣年/月/日;歐洲人用逗號(hào)做小數(shù)點(diǎn)而美國(guó)人用點(diǎn)。這些格式轉(zhuǎn)換看起來(lái)是"設(shè)置問(wèn)題",但在底層可能需要程序根據(jù)用戶(hù)的Locale設(shè)置來(lái)調(diào)用不同的格式化函數(shù)。如果原來(lái)的代碼里全是硬編碼的格式,那真得改。
說(shuō)了這么多,我想強(qiáng)調(diào)的是:這些代碼改動(dòng)并不是"翻譯的一部分",而是"本地化的配套技術(shù)工作"。翻譯人員負(fù)責(zé)文字轉(zhuǎn)換,技術(shù)團(tuán)隊(duì)負(fù)責(zé)實(shí)現(xiàn)層面的適配。兩邊配合好了,才能交付一個(gè)真正可用的本地化產(chǎn)品。
去年我們團(tuán)隊(duì)接了一個(gè)企業(yè)級(jí)軟件本地化的項(xiàng)目,目標(biāo)是出德語(yǔ)和日語(yǔ)兩個(gè)版本。客戶(hù)一開(kāi)始覺(jué)得這就是翻譯的事情,預(yù)算也按翻譯量報(bào)的。結(jié)果我們技術(shù)評(píng)估之后發(fā)現(xiàn),這款軟件的國(guó)際化程度相當(dāng)一般,大概有百分之三十的界面文字是硬編碼在代碼里的,而且日期格式、貨幣符號(hào)都是直接寫(xiě)在業(yè)務(wù)邏輯里的。
我們把評(píng)估報(bào)告發(fā)給客戶(hù),說(shuō)明了情況。最后達(dá)成的方案是:我們先幫客戶(hù)做一輪代碼審計(jì)和技術(shù)重構(gòu),把所有需要本地化的內(nèi)容提取到資源文件里,調(diào)整好字符處理和格式化的底層邏輯。這個(gè)階段完成之后,后面的翻譯工作就很順暢了——譯者對(duì)著資源文件翻,技術(shù)人員做適配測(cè)試,各司其職。
客戶(hù)后來(lái)反饋說(shuō),雖然前期多花了些時(shí)間,但整個(gè)本地化流程比他們以前做過(guò)的項(xiàng)目都要順,以后的版本迭代也不會(huì)因?yàn)楸镜鼗瘑?wèn)題卡住。這筆投入是值得的。
從這個(gè)例子就能看出來(lái),專(zhuān)業(yè)的本地化服務(wù)商比如康茂峰這樣的團(tuán)隊(duì),在項(xiàng)目啟動(dòng)前都會(huì)做詳細(xì)的技術(shù)評(píng)估,把需要改動(dòng)的地方和客戶(hù)溝通清楚,而不是悶頭就開(kāi)始翻。這樣既能避免后期扯皮,也能確保交付質(zhì)量。
這是個(gè)好問(wèn)題。理論上有沒(méi)有辦法讓本地化完全不需要改動(dòng)代碼?
答案是一半一半。
如果軟件在開(kāi)發(fā)時(shí)就把國(guó)際化考慮得很周全,所有文字、格式、圖片、音頻這些資源都外部化了,那確實(shí)可以做到只改資源文件不動(dòng)代碼。但現(xiàn)實(shí)是,大部分軟件在設(shè)計(jì)初期都沒(méi)有這個(gè)意識(shí),特別是一些歷史悠久的產(chǎn)品,經(jīng)過(guò)好幾代開(kāi)發(fā)人員的維護(hù),國(guó)際化程度往往參差不齊。
另一個(gè)思路是"換皮",比如通過(guò)補(bǔ)丁包或者配置文件來(lái)覆蓋原有資源。這種方式在一些簡(jiǎn)單場(chǎng)景下是可行的,但局限性很大——它解決不了硬編碼文字的問(wèn)題,也處理不了界面布局需要適配的情況。
所以我的建議是:別把"不碰代碼"作為硬性指標(biāo)。更務(wù)實(shí)的做法是在項(xiàng)目初期做評(píng)估,看看現(xiàn)有軟件的國(guó)際化做得怎么樣,然后根據(jù)實(shí)際情況決定是"只翻資源文件"還是"先做國(guó)際化重構(gòu)再加翻譯"。
有時(shí)候?yàn)榱碎L(zhǎng)期的維護(hù)便利性,前期多投入一些資源做技術(shù)適配,反而是更經(jīng)濟(jì)的選擇。畢竟本地化不是做一次就完了,后面的版本更新、功能迭代都需要持續(xù)本地化。如果基礎(chǔ)沒(méi)打好,每次更新都是一場(chǎng)噩夢(mèng)。
軟件本地化翻譯本身不一定要碰代碼,但本地化這個(gè)工程有時(shí)候確實(shí)需要配合一些代碼層面的改動(dòng)。這些改動(dòng)通常包括:提取硬編碼文字、調(diào)整字符編碼支持、優(yōu)化雙向文字渲染、適配日期數(shù)字格式等等。
關(guān)鍵是怎么處理這些改動(dòng)。我的經(jīng)驗(yàn)是分成兩步走:第一步由技術(shù)團(tuán)隊(duì)把"需要本地化的內(nèi)容"從代碼里剝離出來(lái),或者把"阻礙本地化的技術(shù)障礙"清除掉;第二步翻譯團(tuán)隊(duì)專(zhuān)注于文字轉(zhuǎn)換本身。最后再由測(cè)試團(tuán)隊(duì)驗(yàn)證兩邊配合的效果。這樣分工明確,各司其職,質(zhì)量和效率都有保障。
如果你正在規(guī)劃軟件本地化項(xiàng)目,建議在啟動(dòng)前先做一輪技術(shù)評(píng)估。找個(gè)有經(jīng)驗(yàn)的本地化服務(wù)商,把你的軟件情況說(shuō)清楚,讓他們幫你判斷需要做哪些準(zhǔn)備。這樣既能少走彎路,也能避免做到一半發(fā)現(xiàn)卡住了返工。
| 情況描述 | 是否需要改動(dòng)代碼 | 建議處理方式 |
| 文字全部在資源文件中,格式處理已適配多語(yǔ)言 | 否 | 直接翻譯資源文件即可 |
| 部分文字硬編碼在代碼里 | 是 | 先提取到資源文件,再進(jìn)行翻譯 |
| 字符編碼不支持目標(biāo)語(yǔ)言 | 是 | 升級(jí)為Unicode或UTF-8編碼 |
| 界面布局按西文字符寬度設(shè)計(jì) | 是 | 調(diào)整布局代碼,支持文字長(zhǎng)度變化 |
| 需要支持從右向左的文字方向 | 是 | 啟用雙向文字支持,鏡像界面 |
| 日期數(shù)字格式硬編碼 | 是 | 改用Locale感知的格式化函數(shù) |
好了,關(guān)于軟件本地化翻譯和代碼修改的關(guān)系,我就聊到這里。如果你正在考慮把自己的軟件做本地化,建議先把技術(shù)現(xiàn)狀摸清楚,然后找個(gè)靠譜的團(tuán)隊(duì)幫你規(guī)劃流程。好的開(kāi)始是成功的一半,前期準(zhǔn)備工作做扎實(shí)了,后面的執(zhí)行就會(huì)順利很多。
