
你有沒有遇到過這種情況:明明是同一個(gè)軟件,中文界面顯示"1,234.56",切換到德語界面卻變成了"1.234,56"?別懷疑自己眼花了,也別急著罵程序員——這就是數(shù)字分隔符在不同地區(qū)習(xí)慣差異造成的"視覺混亂"。
在軟件本地化翻譯這個(gè)行當(dāng)里,數(shù)字格式處理絕對(duì)是個(gè)看著簡(jiǎn)單、實(shí)則暗藏玄機(jī)的活兒。今天咱們就聊聊這個(gè)話題,拆解一下這里面的門道。
說白了,數(shù)字分隔符就是幫人們把大數(shù)讀明白的那幾個(gè)符號(hào)。你可能覺得"1000000"和"1,000,000"差別不大,但放到財(cái)務(wù)報(bào)表、科學(xué)計(jì)算或者電商價(jià)格顯示里,差一個(gè)符號(hào)可能就意味著差出去幾十萬。國(guó)際期刊《本地化行業(yè)報(bào)告》曾經(jīng)統(tǒng)計(jì)過,數(shù)字格式錯(cuò)誤是軟件本地化測(cè)試中最常見的問題類型之一,占比能到15%左右。
對(duì)于終端用戶來說,看到不符合習(xí)慣的數(shù)字格式,第一反應(yīng)通常是"這軟件是不是有問題"而不是"哦這邊用逗號(hào)那邊用句號(hào)"。這種體驗(yàn)上的斷裂感,很可能會(huì)直接影響用戶對(duì)產(chǎn)品的信任度。所以專業(yè)做本地化的團(tuán)隊(duì),都會(huì)把數(shù)字格式處理當(dāng)作優(yōu)先級(jí)很高的任務(wù)來抓。
別看全世界人民都要數(shù)數(shù),但表示"一千"這個(gè)概念的方式可謂五花八門。咱們來盤點(diǎn)幾個(gè)主要的流派。

這個(gè)流派相信大多數(shù)人都不陌生,就是用逗號(hào)做千位分隔符,用小數(shù)點(diǎn)做小數(shù)分隔符。比如"1,234,567.89"這種寫法,在中國(guó)、美國(guó)、英國(guó)、澳大利亞、新加坡等國(guó)家和地區(qū)都是默認(rèn)配置。它的好處是簡(jiǎn)單直觀,一眼就能看出數(shù)值量級(jí)。
德國(guó)、法國(guó)、意大利、西班牙這些歐洲國(guó)家,以及巴西、印尼等發(fā)展中國(guó)家,用的是另一種方案:千位用句號(hào)分隔,小數(shù)用逗號(hào)。比如德國(guó)人寫"1.234.567,89",法國(guó)人寫同樣的格式但稱呼它".point de mille"(千位點(diǎn))。這個(gè)流派的歷史其實(shí)比美式寫法更悠久,只是隨著美國(guó)在經(jīng)濟(jì)和科技領(lǐng)域的主導(dǎo)地位不斷提升,美式寫法在數(shù)字化場(chǎng)景中變得更為普及。
法國(guó)、瑞士、俄羅斯等地區(qū)更傾向于使用空格來分隔千位,同時(shí)用逗號(hào)或空格來表示小數(shù)。寫法可能是"1 234 567,89"或者"1 234 567 89"。這種寫法在排版上看起來確實(shí)比較清爽,但空格在編程環(huán)境下容易引發(fā)各種解析問題,算是美觀和實(shí)用之間的妥協(xié)。
說到特殊,不得不提印度的計(jì)數(shù)法。這個(gè)系統(tǒng)把千、萬、十萬、百萬這些單位重新排列組合,形成了獨(dú)特的兩位、三位混合分隔模式。比如"12,34,56,789"這種寫法,對(duì)應(yīng)的是十二億三千四百五十六千七百八十九。印度本地化測(cè)試工程師曾分享過經(jīng)驗(yàn),說這個(gè)計(jì)數(shù)法是測(cè)試用例設(shè)計(jì)中的重點(diǎn)關(guān)照對(duì)象,稍不留神就會(huì)中招。
了解了全球差異,接下來問題就變成了:軟件本地化翻譯過程中,到底該怎么處理這些分隔符?

現(xiàn)代軟件開發(fā)基本都會(huì)集成國(guó)際化框架,i18n(internationalization的縮寫)相關(guān)庫和API已經(jīng)是標(biāo)配。這些框架提供的數(shù)字格式化功能,能夠根據(jù)用戶所在地區(qū)的locale設(shè)置自動(dòng)選擇合適的分隔符樣式。開發(fā)者只需要調(diào)用API傳入數(shù)字和地區(qū)信息,框架就能返回正確格式化的字符串。
主流技術(shù)棧都有成熟的i18n解決方案。比如Java有NumberFormat類,Python有locale模塊,JavaScript有Intl.NumberFormat原生支持,.NET生態(tài)有CultureInfo類等等。使用這些標(biāo)準(zhǔn)方案的好處是,經(jīng)過了大量實(shí)際驗(yàn)證,可靠性有保障。
很多人以為數(shù)字格式處理是程序員的事,跟翻譯沒什么關(guān)系。其實(shí)不完全是。專業(yè)本地化團(tuán)隊(duì)中,翻譯人員需要承擔(dān)幾項(xiàng)關(guān)鍵任務(wù)。
首先是確認(rèn)目標(biāo)語言的正確格式規(guī)范。這需要查找目標(biāo)地區(qū)的官方標(biāo)準(zhǔn)或者行業(yè)慣例。比如做瑞士法語本地化,就要知道那邊雖然屬于法語圈,但數(shù)字格式更接近德語區(qū),用句號(hào)做千位分隔符而不是空格。翻譯人員如果不確定,應(yīng)該查閱資料或者請(qǐng)教母語審校,而不是憑直覺猜測(cè)。
其次是處理特殊場(chǎng)景的文案中的數(shù)字。比如界面提示語里有"最多支持999,999.99個(gè)文件",翻譯成德語時(shí)就必須相應(yīng)調(diào)整成"最多支持999.999,99個(gè)文件"。這種嵌入在句子里的數(shù)字格式轉(zhuǎn)換,比純數(shù)字轉(zhuǎn)換更容易被忽視。
最后是標(biāo)注需要特殊處理的數(shù)字字段。有些本地化項(xiàng)目會(huì)要求翻譯人員標(biāo)注哪些數(shù)字是需要?jiǎng)討B(tài)格式化的,哪些是固定顯示的靜態(tài)文本,以便開發(fā)人員在實(shí)現(xiàn)時(shí)做區(qū)分處理。
在本地化工程實(shí)踐中,數(shù)字格式相關(guān)的配置通常會(huì)集中管理在資源文件或者配置表里。一個(gè)常見做法是創(chuàng)建 locale-specific 的配置文件,里面預(yù)先定義好該地區(qū)使用的數(shù)字格式模板。
以JSON格式為例,可能長(zhǎng)這樣:
| locale | thousandsSeparator | decimalSeparator | decimalPlaces |
| zh-CN | , | . | 2 |
| de-DE | . | , | 2 |
| fr-FR | ? | , | 2 |
這種集中管理的方式好處很明顯:修改時(shí)不用滿世界找代碼,測(cè)試時(shí)也有明確的驗(yàn)證依據(jù)。我們?cè)诳得宓捻?xiàng)目管理流程中,一直強(qiáng)調(diào)配置文件的規(guī)范化和可追溯性,這能避免很多低級(jí)錯(cuò)誤。
理論和框架說完了,再聊幾個(gè)實(shí)際項(xiàng)目中經(jīng)常遇到的問題。吃過虧的人都知道,這些細(xì)節(jié)處理不好,后期返工成本可高了。
數(shù)字格式只是開始,貨幣金額的格式才是進(jìn)階挑戰(zhàn)。不同地區(qū)不僅分隔符用法不同,貨幣符號(hào)的位置也千差萬別。美元通常寫$1,234.56,歐元在德國(guó)是1.234,56€,在法國(guó)卻是1 234,56 €。有些貨幣符號(hào)還會(huì)和數(shù)字緊貼,有些則要加空格。這些細(xì)節(jié)都要在本地化規(guī)范里明確約定。
負(fù)數(shù)的顯示同樣有地區(qū)差異。有的地方用"-123"這樣的前置減號(hào),有的地方用括號(hào)表示"(123)",還有的可能用特殊字體顏色來區(qū)分。正規(guī)的國(guó)際化框架一般都會(huì)處理這些情況,但如果你家產(chǎn)品的本地化代碼里有硬編碼的負(fù)數(shù)格式邏輯,那可得好好查查了。
這兩類特殊編號(hào)雖然不算"數(shù)字",但因?yàn)楦袷絾栴}經(jīng)常被混進(jìn)來。中國(guó)的手機(jī)號(hào)習(xí)慣用空格分組,比如"138 1234 5678",日本手機(jī)號(hào)可能是"090-1234-5678",美國(guó)手機(jī)號(hào)是"(123) 456-7890"。本地化測(cè)試時(shí)一定要覆蓋這些場(chǎng)景,因?yàn)橛脩籼铄e(cuò)格式可能導(dǎo)致短信驗(yàn)證碼發(fā)不出去。
如果你的軟件支持CSV或者Excel數(shù)據(jù)導(dǎo)入導(dǎo)出,那數(shù)字格式問題就更復(fù)雜了。用戶用德語系統(tǒng)導(dǎo)出的文件,打開時(shí)小數(shù)點(diǎn)會(huì)變成逗號(hào),直接導(dǎo)入到中文系統(tǒng)可能就解析錯(cuò)了。解決方案通常是強(qiáng)制使用標(biāo)準(zhǔn)化的數(shù)字格式進(jìn)行數(shù)據(jù)交換,或者在導(dǎo)入時(shí)自動(dòng)識(shí)別并轉(zhuǎn)換格式。
數(shù)字格式的測(cè)試容易被低估。以為點(diǎn)點(diǎn)鼠標(biāo)看看界面顯示沒問題就完了,其實(shí)遠(yuǎn)遠(yuǎn)不夠。完整的測(cè)試應(yīng)該覆蓋以下幾個(gè)維度。
康茂峰的本地化質(zhì)量保障體系里,數(shù)字格式測(cè)試用例是作為獨(dú)立檢查項(xiàng)存在的,有專門的測(cè)試矩陣和預(yù)期結(jié)果對(duì)照表。這樣既能保證覆蓋面,也能提高執(zhí)行效率。
說了這么多理論,最后分享幾個(gè)實(shí)戰(zhàn)中的小建議。
第一,本地化規(guī)范文檔一定要在項(xiàng)目啟動(dòng)階段就完成,而不是做到一半再補(bǔ)。規(guī)范里應(yīng)該明確規(guī)定目標(biāo)語言使用的數(shù)字、日期、貨幣格式標(biāo)準(zhǔn),以及需要特殊處理的字段清單。
第二,資源文件里的數(shù)字占位符要設(shè)計(jì)得足夠清晰。比如用{amount, number, currency}這樣的格式明確告訴開發(fā)人員和翻譯人員,這里需要的是貨幣格式的數(shù)字,而不是普通整數(shù)。
第三,自動(dòng)化測(cè)試能省很多事。把數(shù)字格式驗(yàn)證寫成自動(dòng)化用例,每次構(gòu)建都跑一遍,既能及時(shí)發(fā)現(xiàn)問題,也減輕了手工測(cè)試的壓力。
第四,保持和目標(biāo)地區(qū)用戶的溝通。沒有什么比真實(shí)用戶的反饋更能驗(yàn)證本地化效果了。如果有機(jī)會(huì),定期收集用戶對(duì)數(shù)字顯示格式的使用體驗(yàn),迭代優(yōu)化。
數(shù)字分隔符這事兒,說大不大,說小不小。處理得當(dāng),用戶覺得產(chǎn)品專業(yè)用心;處理不當(dāng),就會(huì)留下"這軟件本地化沒做好"的印象。希望這篇文章能給正在做本地化相關(guān)工作的朋友一點(diǎn)參考。如果還有具體問題,咱們可以繼續(xù)交流。
