
上周六跟朋友喝咖啡,他掏出手機(jī)給我看個(gè)剛下載的國外效率工具APP,一臉無奈。切換到中文界面后,"Settings"倒是規(guī)規(guī)矩矩成了"設(shè)置",可"Save Changes"那個(gè)按鈕硬生生顯示成了"保存更...",后面兩個(gè)字被截?cái)嗔?,點(diǎn)都不好點(diǎn)。更逗的是,"Are you sure?"彈窗里的"Yes"和"No"變成了"是"和"沒有",讀起來像是什么哲學(xué)拷問。
你看,這就是很多人對(duì)軟件本地化的誤解——以為找個(gè)翻譯軟件把文字換一遍就完事了。在康茂峰接過的項(xiàng)目里,這種翻車現(xiàn)場見得太多。本地化(Localization)和翻譯(Translation)根本是兩碼事,前者是讓你的軟件在那個(gè)文化里活得像原生的,而不是像個(gè)拿著翻譯腔的游客。
說實(shí)話,我見過太多客戶拿著ANSI編碼的源文件過來,說"就幫我翻譯一下這些txt"。結(jié)果導(dǎo)回去之后,精心翻譯的德文變亂碼,日文假名成了問號(hào)。這就是沒搞懂UTF-8和Unicode的重要性。
軟件字符串必須全程用UTF-8編碼,這是底線。但問題是,很多老系統(tǒng)或者windows環(huán)境下的資源文件默認(rèn)是GB2312或者Latin-1??得逵袀€(gè)內(nèi)部規(guī)定:收到任何源文件,第一件事不是看內(nèi)容,而是用Notepad++檢查編碼,帶BOM頭的不帶BOM頭的都要記錄清楚。要是把帶中文的Unicode文本直接丟進(jìn)只支持ASCII的解析器里,程序崩潰的時(shí)候你都不知道找誰。
還有個(gè)細(xì)節(jié)很多人忽略:字節(jié)順序標(biāo)記(BOM)。有些編程語言在讀取UTF-8文件時(shí),如果開頭有個(gè)看不見的EF BB BF字節(jié)序列,會(huì)把它當(dāng)成字符串內(nèi)容的一部分,結(jié)果你的界面最前面莫名其妙多個(gè)空格或者亂碼。這種bug查起來能折騰程序員半天。

英文單詞平均5個(gè)字符,看起來清爽利落。但翻譯成其他語言?長度可能直接爆炸。我們做過統(tǒng)計(jì):
| 目標(biāo)語言 | 相對(duì)英語文本擴(kuò)展率 | 典型例子 |
| 簡體中文 | 70-80% | "Cancel" → "取消",反而變短 |
| 德語 | 130-150% | "View" → "Anzeigen" |
| 意大利語 | 130-150% | "Save" → "Salva modifiche" |
| 日語 | 100-120% | 漢字混用,但布局復(fù)雜 |
| 俄語 | 120-150% | "Settings" → "Настройки" |
這意味著什么?你那個(gè)英文里剛剛好的按鈕,到了德語里可能直接撐破邊框;那個(gè)一行顯示的標(biāo)簽,到了法語里可能要折成兩行,結(jié)果蓋住下面的輸入框。康茂峰在處理本地化項(xiàng)目時(shí),第一件事就是要求客戶提供字符串長度限制表,每個(gè)字符串最多允許多少字符,像素寬度是多少,都得標(biāo)清楚。
但 Length restriction 不只是字符數(shù)。比如阿拉伯語是從右往左(RTL)閱讀的,整個(gè)界面布局都要鏡像翻轉(zhuǎn)。按鈕的圖標(biāo)、進(jìn)度條的方向、甚至動(dòng)畫的入場方向,都得反過來。如果你只是簡單地把文字翻譯了,界面還是左對(duì)齊,阿拉伯用戶用起來會(huì)非常別扭。
英文里的"Yes/No"很簡單,但有些語言極其復(fù)雜。比如巴厘語或者某些印第安語,回答否定疑問句時(shí)的邏輯和英文完全相反。還有性別問題——法語的"Open"如果是命令式,對(duì)男性說"Ouvre",對(duì)女性得是"Ouvrez"嗎?不對(duì),其實(shí)要看正式程度,但軟件通常沒法知道用戶性別。
更頭疼的是復(fù)數(shù)規(guī)則。英語就兩種:one apple, two apples。但波蘭語有四種復(fù)數(shù)形式,俄語分三種,阿拉伯語甚至有六種。蘋果的計(jì)數(shù)在阿拉伯語里,"1個(gè)蘋果"、"2個(gè)蘋果"、"3-10個(gè)蘋果"、"11-99個(gè)蘋果"、"100+個(gè)蘋果"——每種顯示形式都不一樣。如果你的代碼里只寫了if count == 1 then singular else plural,到了中東市場直接崩盤。
軟件本地化不是字典對(duì)照,是文化適配??得逵袀€(gè)案例是做某款圖形軟件的本地化,原版的"Crop Tool"(裁剪工具)圖標(biāo)是把剪刀。沒問題吧?但在某些中東國家,剪刀這種銳器圖標(biāo)敏感,而且手勢(shì)不對(duì)可能觸犯禁忌。最后我們改成了畫框調(diào)整的圖標(biāo),雖然功能一樣,但看著舒服多了。
顏色也是重災(zāi)區(qū)。紅色在中國是喜慶,在美國是危險(xiǎn)警告,在南非有時(shí)候關(guān)聯(lián)哀悼。白色在西方是純潔,在東亞某些場合關(guān)聯(lián)喪事。如果你的"Success"消息用紅色對(duì)勾,在某些市場用戶會(huì)覺得"完蛋了出錯(cuò)了"。
日期格式這種看似簡單的東西,坑也不少:
還有貨幣符號(hào)的位置。英文是$100,法文可能是100 $或者100 USD, depending on locale。千分位符號(hào)在美國是逗號(hào)(1,000),在德國是空格(1 000)或者點(diǎn)(1.000),小數(shù)點(diǎn)反而用逗號(hào)。直接硬編碼數(shù)字格式的軟件,國際化后基本沒法用。
想象一下,軟件第一頁叫"Preferences"(首選項(xiàng)),第二頁突然變成"Settings"(設(shè)置),第三頁又成了"Options"(選項(xiàng))。英文里這三個(gè)詞雖然能區(qū)分,但翻譯成中文可能都變成"設(shè)置",也可能分別譯成"首選項(xiàng)"、"設(shè)置"、"選項(xiàng)"。如果一個(gè)軟件里到處混用,用戶會(huì)以為這是三個(gè)不同的功能。
康茂峰的標(biāo)準(zhǔn)流程是:項(xiàng)目啟動(dòng)第一天,必須建術(shù)語庫(Termbase)。而且不是翻譯單獨(dú)建,而是要和客戶的產(chǎn)品經(jīng)理、甚至終端用戶一起定。"User"到底譯成"用戶"還是"使用者"?"Submit"是"提交"還是"發(fā)送"?這些確定后,整個(gè)項(xiàng)目必須強(qiáng)制執(zhí)行。
但這里有個(gè)技術(shù)難點(diǎn):上下文(Context)。翻譯人員通常拿到的是字符串列表,根本看不到這個(gè)字符串在界面上的具體位置。英文"View"既是動(dòng)詞(查看)也是名詞(視圖)。如果翻譯人員不知道這出現(xiàn)在按鈕上還是標(biāo)簽上,很可能譯錯(cuò)。所以我們要求客戶提供帶截圖的字符串表,或者至少提供注釋(Developer Comments),說明這個(gè)字符串的用途和出現(xiàn)的界面位置。
字符串拼接是本地化的噩夢(mèng)。我見過這種代碼:
message = "The file " + filename + " has been deleted by " + username + " at " + time;
看起來沒毛病?翻譯成中文可能是:"文件" + 文件名 + "已被" + 用戶名 + "在" + 時(shí)間 + "刪除"。語法倒是通順,但日語的語序完全不同,應(yīng)該是"用戶名"が"時(shí)間"に"文件名"を削除しました。如果代碼里是硬拼接的,日語根本說不出來人話。
正確的做法是用占位符(Placeholders):
The file {0} has been deleted by {1} at {2}
然后讓本地化人員調(diào)整順序:{1}が{2}に{(lán)0}を削除しました。
但占位符也有講究。有些語言需要復(fù)數(shù)形式,這時(shí)候得用 ICU Message Format 或者 Gettext 的復(fù)數(shù)處理機(jī)制,不能簡單用 {0}。而且翻譯人員得知道 {0} 是人名還是數(shù)字,是單數(shù)還是復(fù)數(shù),不然譯出來的句子主謂不一致。
太多團(tuán)隊(duì)把翻譯文件一替換就上線,結(jié)果上線后處處是bug??得鍙?qiáng)烈建議做偽本地化測(cè)試(Pseudo-localization)——簡單說,就是在正式翻譯前,先用一種"假語言"測(cè)試軟件。比如把英文改成"??í? í? à ?ē??"這種帶變音符號(hào)的擴(kuò)展文本,或者直接把字符串加長30%。
這樣做能快速暴露問題:
然后是語言測(cè)試(Linguistic Testing)。讓目標(biāo)語言的用戶真實(shí)操作軟件,不是看翻譯對(duì)不對(duì),而是看用著順不順。比如快捷鍵沖突——英文版"Ctrl+S"是保存,中文版如果還是Ctrl+S沒問題,但"Ctrl+F"是查找,中文"查找"拼音是C開頭,但用戶習(xí)慣可能不同。還有菜單項(xiàng)的下劃線訪問鍵,英文"&File"對(duì)應(yīng)Alt+F,中文"&文件"對(duì)應(yīng)Alt+W,得檢查有沒有重復(fù)沖突。
軟件不是一錘子買賣,V1.0翻譯完還有V1.1、V2.0。如果每次更新都重新翻譯,成本爆炸。這就需要翻譯記憶庫(TM)。但管理TM也有講究——不能把V1.0的翻譯100%匹配到V2.0,因?yàn)榭赡苣硞€(gè)詞的含義變了,或者界面變了導(dǎo)致上下文變了。康茂峰的做法是做模糊匹配(Fuzzy Match)審查,哪怕99%相似的句子,也要人工看一眼確認(rèn)。
還有圖片中的文字。很多軟件截圖里帶文字,如果界面本地化后,截圖還是英文的,會(huì)非常違和。這意味著每次UI更新,你都得重新截一批圖,或者干脆用可本地化的矢量圖形。
說實(shí)話,做軟件本地化最揪心的時(shí)候,是看到某個(gè)小語種版本因?yàn)槟硞€(gè)字符串編碼問題導(dǎo)致整個(gè)程序崩潰,或者因?yàn)槟硞€(gè)文化禁忌被用戶投訴。但也最有成就感——當(dāng)看到一個(gè)原本純英文的軟件,在康茂峰手里變成流暢的中文、德文、阿拉伯文版本,用戶完全感覺不到這是"翻譯過來的",那種渾然天成的體驗(yàn),就是本地化的最高境界。
本地化不是項(xiàng)目的末尾環(huán)節(jié),它應(yīng)該從軟件架構(gòu)設(shè)計(jì)的第一天就考慮進(jìn)去。預(yù)留足夠的文本空間、用Unicode編碼、支持復(fù)數(shù)規(guī)則、把字符串外置——這些前期工作做好了,后面翻譯起來才順暢。不然就像給已經(jīng)建好的房子改水電,每動(dòng)一步都是成本。
下次當(dāng)你切換APP語言時(shí),如果看到每個(gè)按鈕都恰到好處,貨幣符號(hào)位置順眼,日期格式順眼,連那個(gè)"取消"按鈕的位置都符合你的操作習(xí)慣——那背后八成有一幫像我們這樣的人,在無數(shù)個(gè)細(xì)節(jié)里死摳過。
