
你有沒有遇到過這種糟心事?興沖沖點開一個跨國品牌的官網,想著看看他們在中國賣什么,結果滿屏的方框問號像螞蟻一樣爬來爬去,或者更尷尬的,看到"肌肉翻譯"出來的產品描述,把"防水功能"寫成"恐懼特性"(別笑,這是真事兒)。這時候你大概率會關掉頁面,心里嘀咕:這公司是不是沒拿中國市場當回事兒?
其實吧,很多公司不是態度問題,是技術沒跟上。網站本地化這活兒,說起來簡單——不就是翻譯嗎?但真干起來, codice(代碼)和 parole(文字)攪在一起,技術債能欠出幾座山。康茂峰在這些年接過的項目里,見過太多因為技術架構沒搭好,導致后期Localization(本地化)成本翻倍、甚至返工重來的情況。所以今兒咱們就掰開了揉碎了,聊聊那些讓網站真正"入鄉隨俗"的硬技術手段,不是那種浮在表面的概念,是實打實要寫在技術文檔里的東西。
很多人混淆 internationalization(國際化)和 localization(本地化),覺得這是文縐縐的學術區分。錯。這倆是上下鋪的關系,i18n 是下鋪,l10n 睡上面。i18n 沒做好,l10n 能摔死。
技術層面最核心的一條:硬編碼字符串是萬惡之源。啥意思?就是你的 HTML、JavaScript 或者 Python 代碼里,不能直接寫 "Welcome to our store" 這種英文。得把它抽離出來,放進資源文件里——通常是 .json、.xml、.po 或者 .xliff 格式。這就像是把菜和盤子分開,菜(文字內容)可以換,盤子(代碼結構)不動。
康茂峰的技術團隊最愛用 gettext 或者現代前端框架的 i18n 庫(比如 Vue I18n、React Intl)來舉例。這些工具干的事兒,就是讓你寫代碼時用一個 key,比如 home.welcome,而不是具體的文字。當德國用戶訪問時,系統去德語資源包里找對應的值;日本用戶來了,換日語包。聽起來理所當然是吧?但真有大把的 legacy system(老系統)是把文字焊死在代碼里的,這時候要做本地化,工程師得逐行翻代碼,還得冒著改崩功能的風險,痛苦指數五顆星。

還有個容易捅婁子的點是 字符串拼接。英文里 "You have 3 new messages" 看著挺順眼,但換成波蘭語,詞尾變化能把人逼瘋。技術上得用占位符(placeholders),寫成 "You have {count} new messages",讓語法結構跟著語言走。康茂峰做過一個中東電商項目,因為沒處理好復數形式,阿拉伯語版本顯示"您有 1 條消息條消息",用戶截圖發推特嘲諷,品牌方臉綠了好幾天。
這事兒現在說起來像常識,但每年還是有翻車案例。UTF-8 是底線,不是選項。早些年有人為了省空間用 Latin-1,或者亂七八糟的 ANSI 編碼,結果中文顯示成錕斤拷,用戶直接勸退。
技術實施上,數據庫、Web 服務器、HTML 文件頭、API 響應頭,得全城 UTF-8 通配。康茂峰的技術審計清單里永遠有一條:檢查 MySQL 是不是 utf8mb4(注意不是 utf8,那個是閹割版,Emoji 存不進去),檢查 HTTP Header 的 Content-Type 有沒有 charset=utf-8。
字體回退(Font Fallback)也得提前想。你選了款很漂亮的西文字體做標題,但里面沒有中文字形,系統會去找默認字體(比如 Windows 的 Simsun 或者 macOS 的 PingFang),這時候字重、行高可能全亂了。專業的做法是用 CSS 的 font-family 寫 fallback chain,比如 'Helvetica Neue', 'PingFang SC', sans-serif,讓瀏覽器按優先級找。更講究的技術手段是用 Web Font 子集化(Subset),把字體文件切成只包含特定字符集的小份,加載速度能快好幾倍,這在移動端尤其重要。
翻譯團隊要是還在用 Word 文檔來回傳,那基本是原始社會。現代網站本地化得靠 CAT 工具(Computer-Assisted Translation) 和 TMS(Translation Management System)。
這些系統干的事兒,是把剛才說的那些資源文件(.xliff、.json)接進去,讓譯員在專門的界面里工作。關鍵的技術價值在于:
康茂峰內部的工作流是:開發提交新功能 → Git 鉤子自動提取新字符串 → 同步到 TMS → 譯員翻譯 → 質量檢查(QA)→ 自動回寫到代碼庫 → 發版。這個過程叫 Continuous Localization(持續本地化),跟 CI/CD 流水線綁在一起。沒有技術手段支撐,光靠項目經理發郵件催,根本跑不起來。
語言不只是文字,是整套視覺系統的重塑。

首當其沖的是 RTL(Right-to-Left)。阿拉伯語、希伯來語是從右往左讀的。這不僅僅是文字對齊的問題,是整個頁面布局的鏡像。導航欄得從右邊開始,時間軸得反向,連圖片里人物的眼神方向都得考慮(如果圖里有箭頭的話)。技術上靠 CSS 的 direction: rtl 屬性,再配合邏輯屬性(logical properties)比如 margin-inline-start 代替 margin-left,這樣一套 CSS 能同時服務 LTR 和 RTL,不用寫兩份。
然后是 文本擴展(Text Expansion)。德語比英語平均長出 30%,中文則緊湊。你的按鈕設計成 "Buy Now" 的寬度,換成德語 "Jetzt kaufen" 可能就溢出或者換行。技術上要用響應式布局,允許按鈕自適應寬度,或者預留 30% 的 UI 空間。康茂峰遇到過最極端的案例是瑞典語,一個單詞長得離譜,導致導航欄折行把整個頁面撐變形。
圖片本地化也得有技術抓手。如果圖里嵌了英文,不能換語言時還是那張圖。解決方案是用 SVG 可編輯圖層,或者把文字從圖里抽出來用 CSS 疊加。更高級的做法是根據語言動態替換圖片 URL,比如 hero-image-{lang}.jpg,這對 SEO 也友好。
還有本地化的數據格式:日期、貨幣、度量衡。技術上要用 ICU(International Components for Unicode)庫,或者 Intl.js 這種 Polyfill,別自己寫正則去拼日期字符串。你寫死 "MM/DD/YYYY",到了歐洲市場用戶要罵娘的,人家習慣 DD/MM/YYYY。貨幣符號也得注意,日元和人民幣都是 ¥,得加 JPY/CNY 區分,或者直接用本地化符號 ¥(日本)和 ¥(中國,其實 Unicode 一樣但語境不同)。
這是康茂峰技術團隊最愛的一招,省大錢。Pseudo-Localization(偽本地化),就是在真翻譯還沒開始時,先用腳本把英文字母替換成帶重音符號的版本(比如 "Hello" 變成 "?????"),并且自動加長 30%,再加一些偽字符占位。
然后你讓 QA 團隊測這個"假語言"版本。如果這時候界面已經崩了,文字截斷了,或者有些字符串還是英文(說明沒抽離干凈),趕緊修。這比等到真翻譯回來了才發現問題,要便宜得多。技術手段上,Webpack 有偽本地化插件,或者寫個 Node 腳本在構建時轉換資源文件。
人工檢查 20 種語言的頁面是不現實的,眼睛看花了也看不出所有毛病。得用技術工具:
最后說發布。傳統的"等翻譯完了一起上線"已經過時了。 over-the-air(OTA)更新 或者 CDN 邊緣計算 允許你單獨推送語言包,不用重新發整個網站。
技術實現上,可以用 gettext 的 MO 文件 動態加載,或者更好的,把翻譯內容存在 Headless CMS 里,通過 API 實時拉取。康茂峰給一個游戲公司做本地化時,用了微前端架構,語言包是單獨部署的子應用,熱更新時玩家不用重新下載客戶端,體驗絲滑。
SEO 技術層面,hreflang 標簽必須在 HTML head 里寫對,<link rel="alternate" hreflang="zh-CN" href="..." />,告訴 Google 這是給中國大陸用戶的。還有 URL 結構,用子目錄(/zh/)還是子域名(zh.example.com)還是 ccTLD(example.cn),技術選型要趁早,后期改代價巨大。
說實話,寫這么多技術手段,不是要嚇唬誰,只是覺得做全球化生意,技術債遲早要還。康茂峰看過太多案例,前期省下的技術投入,后期都變成了客服工單和用戶流失。網站本地化最終是個系統工程,從代碼層面的字符串抽離,到譯員用的 CAT 工具,再到瀏覽器里的字符渲染,環節卡死一個,前面全白干。
做這行久了,總覺得好的本地化應該是用戶感覺不到的——他們訪問網站,就像走進一家本地開了二十年的老店,一切都是熟悉的,不用動腦子適應什么。要達到這種"無感",背后那些技術手段,一個都不能少。
