IT產(chǎn)品的國際化,絕不是“支持英文”就足夠
編輯導(dǎo)語:TI產(chǎn)品的國際化是一大趨勢,但是在轉(zhuǎn)向國際化的過程中,往往會出現(xiàn)不少的問題,導(dǎo)致走了一些歪路。本文作者總結(jié)了自己做IT產(chǎn)品國際化的經(jīng)驗(yàn),對“國際化”和“支持英文”這兩個(gè)完全不同的概念進(jìn)行了區(qū)分,并且列舉了一些例子,希望看后能夠?qū)δ阌兴鶈l(fā)。
幾年前在紐倫堡見了個(gè)朋友,吃飯間問起他太太在德國做什么,答曰“國際化”,細(xì)問之下,才發(fā)現(xiàn)光是“中文化”就有一整個(gè)團(tuán)隊(duì)。這個(gè)消息讓我挺吃驚,按照我們之前的理解,“國際化”主要就是要配備好對應(yīng)的資源文件,針對不同語言的客戶,顯示不同的語言即可。
按照這種思路,“國際化”里最重要的就是要把所有的文字都抽離出來作為可配置資源,千萬不要寫死??梢哉f,一旦你的產(chǎn)品可以同時(shí)支持中英兩種語言,就邁過了國際化最大的障礙。增加其它語言的支持,就像“多來個(gè)人吃飯,無非多添一雙筷子”。
這幾年自己開始做IT產(chǎn)品的國際化,才深深感覺到,“國際化”和“支持英文”之間相差了十萬八千里,甚至可以說,兩者完全是風(fēng)馬牛的關(guān)系。如果你覺得無法想象,看完下面這些例子就會明白。
一、例子一:文字
文字大概是許多人提到“國際化”時(shí)最早想到,也唯一能想到的因素了。
沒錯(cuò),國際化的第一步就是要支持多種文字的顯示。業(yè)界通常的辦法是做一份資源文件,包含了各種語言的統(tǒng)一映射。在需要顯示的時(shí)候,直接在資源文件里檢索對應(yīng)語言的資源,就可以得到對應(yīng)的文字。
資源文件的結(jié)構(gòu)類似下面這樣:
這種辦法有問題嗎?看起來很直觀,沒問題對吧?
其實(shí)有問題,問題不在文字的內(nèi)容,而在文本的長度。大部分情況下,中文和對應(yīng)英文的文本長度是差不多的,所以顯示時(shí)占據(jù)的空間差不多,并不會影響原有的UI元素。但是有些時(shí)候,中文和英文的長度相差很大,在一些緊密排版的情況下,顯示就會有問題。
這還不是最麻煩的。如果長度不夠,可以在空格處換行,一般都還可以應(yīng)付,只是高度會變化。但是對于其它語言,比如德語,情況就復(fù)雜多了。德語經(jīng)常會把不同的單詞拼起來,排版時(shí)如果沒有考慮,最終的效果可能特別糟糕。
比如“新天鵝堡”的德文是Neueswanstein,直接替換的話就會是下面的樣子:
Neueswanstein的長度在德語里其實(shí)不算什么,隨便可以找到更長的,比如下面這個(gè)(不要怕,其實(shí)它的意思只是數(shù)字1532而已):Eintausendfünfhundertzweiunddrei?ig。
所以,如果你只翻譯文字,不在UI布局上考慮,就可能吃大虧。如今流行“出海“,我在德國看到了不少國內(nèi)的電子產(chǎn)品也提供了德文界面,但是實(shí)話說,不少界面堪稱慘不忍睹。
文字方面的問題,除了顯示,查找也會有問題。英語之外的語言,尤其是歐洲國家的語言,經(jīng)常會有一些字母看起來有特殊符號。比如德語中的ü、ü、?、?、?、?(上面的兩點(diǎn)叫Umlaut)。
我們以ü來舉例,看起來它“應(yīng)該是一個(gè)字母”,確實(shí)對應(yīng)鍵盤上的一個(gè)鍵,而且在Unicode規(guī)范中也確實(shí)分配了對應(yīng)的Code Point(U+00DC)。那么,如果你在“查找”框里輸入ü,能找到所有出現(xiàn)的ü嗎?
答案是:也許能,也許不能。
什么情況下不能呢?因?yàn)閁nicode規(guī)范中還有許多特殊字符,比如U+0308,這個(gè)字符叫COMBINING DIAERESIS,說白了就是那“兩點(diǎn)”。它可以和元音字母結(jié)合,顯示為一個(gè)字符。
所以你看到一模一樣的ü,既可能是U+00DC,也可能是U+0055 U+0308(U+0055就是大寫的U)。如果開發(fā)軟件時(shí)不考慮這一點(diǎn),就可能被用戶痛罵:明明看到文本里有ü,在搜索框里怎么也搜不到,這是什么破軟件!
二、例子二:時(shí)間
中國的時(shí)區(qū)是非常規(guī)整的,全國統(tǒng)一用北京時(shí)間,所以對許多程序員來說,時(shí)間“天然”就是統(tǒng)一的,簡單的。如果要換到其它時(shí)區(qū),那也只是增減幾個(gè)小時(shí),多算一個(gè)偏移量就可以。
比如德國使用的是柏林時(shí)間,柏林時(shí)間目前和北京時(shí)間相差6小時(shí),那么如果要在系統(tǒng)里支持柏林時(shí)間,每次存取的時(shí)候都“以北京時(shí)間-6小時(shí)”即可。北京時(shí)間早上6點(diǎn),柏林時(shí)間0點(diǎn);北京時(shí)間下午3點(diǎn),柏林時(shí)間早上9點(diǎn)……
這樣就足夠了嗎?顯然不是。
要知道,許多國家都有“夏令時(shí)”的規(guī)定(其實(shí)中國以前也有)。也就是說,在一年中的不同時(shí)段,柏林時(shí)間和北京時(shí)間的差距是會變化的。有時(shí)候是7小時(shí)(冬令時(shí)),有時(shí)候是6小時(shí)(夏令時(shí))!
而且,冬令時(shí)和夏令時(shí)的切換日期并不固定。冬令時(shí)是每年10月的最后一個(gè)周日,凌晨3時(shí)將時(shí)鐘撥回去1小時(shí);夏令時(shí)是每年3月的最后一個(gè)周日,凌晨2時(shí)將始終撥快1小時(shí)。
如果自己寫程序處理這種變化,估計(jì)要煩死,還不一定能保證正確。
所以不少系統(tǒng)都內(nèi)置了“時(shí)區(qū)”的設(shè)置和相關(guān)函數(shù),自動幫用戶換算時(shí)間??上?,有不少程序員似乎不理解為何“時(shí)區(qū)”的設(shè)置很重要,還是習(xí)慣自己算偏移值,這可真是不折不扣的“拿金飯碗要飯”。
如果你仔細(xì)觀察上面的例子,還會發(fā)現(xiàn)一個(gè)問題:在某些系統(tǒng)里,時(shí)間不是連續(xù)的。
比如在冬令時(shí)切換夏令時(shí)的那一刻,其實(shí)有個(gè)空缺,也就是“不存在的一小時(shí)”。具體到今年(2021年),柏林時(shí)間的3月28日,凌晨02:00:00到02:59:59,都是不存在的。所以,盡管2021-03-28 02:30:21看起來是一個(gè)完全正常的時(shí)刻,但是如果時(shí)區(qū)選擇了柏林時(shí)間,它就是非法的。
這種情況不只在德國存在,其實(shí)廣泛存在著。如果你留意的話,各種語言里都有對應(yīng)的說明。
三、例子三:標(biāo)點(diǎn)
許多開發(fā)人員都知道,系統(tǒng)里有個(gè)重要的變量叫l(wèi)ocale,它代表了與本地化有關(guān)的一組設(shè)置。
最常見的,比如中日韓文字中有許多“看起來一樣”的文字,其實(shí)有細(xì)微差別。但是,為了節(jié)省Unicode中的空間,給它們指定了同樣的Code Point,顯示的時(shí)候就靠locale來區(qū)分。
但是locale的作用不止于此。同樣的標(biāo)點(diǎn)符號,在不同的語言中,作用也是不同的。
比如半角逗號“,”,在英文里表示逗號,但是在德語和法語里,它表示小數(shù)點(diǎn),所以3.14在德語里應(yīng)當(dāng)寫作3,14,而7.99在德語里應(yīng)當(dāng)寫作7,99。如果你仍然用半角逗號來切分句子,多半要碰得頭破血流。
相反,如果你懂得locale,能從系統(tǒng)變量里讀取line.separator作為分隔符,就省去了這種煩惱。
更讓人意想不到的是,常見的CSV文件,也就是“逗號分隔值文件Comma Separated Value”,在德國也會有完全不一樣的規(guī)定。
因?yàn)榈抡Z里comma是小數(shù)點(diǎn),所以即便CSV叫“逗號分隔值”,它也不能用逗號(comma)來分隔,而應(yīng)當(dāng)用分號(semicolon)來分隔。
所以,如果你的CSV處理程序本來跑得好好的,忽然報(bào)了一大堆錯(cuò),沒準(zhǔn)就是這里出的問題。
不要為這一點(diǎn)“意想不到”吃驚,還有更加“意想不到”的情況:Excel的函數(shù)里,我們會用逗號來分隔多個(gè)參數(shù),但是在德語版Excel里,逗號必須替換為分號,否則一定會報(bào)錯(cuò)。
上面這些例子,說穿了平淡無奇,但沒有說穿的時(shí)候,往往讓人絞盡腦汁,所以不要問我怎么知道的,這是血淚的教訓(xùn)。
也恰恰是在積累了許多血淚教訓(xùn)之后,我才發(fā)現(xiàn),微軟的國際化真的做得很好,各種情況都考慮到了,甚至可以說是業(yè)界的翹楚——不過,那估計(jì)也是積累了無數(shù)血淚教訓(xùn)的結(jié)果吧。
作者:余晟;公眾號:余晟以為(ID:yurii-says)
原文鏈接:https://mp.weixin.qq.com/s/ExkdJuc6zJchtXpYX7Q1Eg
本文由 @余晟以為 授權(quán)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)作者許可,禁止轉(zhuǎn)載。
題圖來自Unsplash,基于CC0協(xié)議
那產(chǎn)品層面要如何做呢
所以還是表層語言的問題嘛
所以解決方案是什么呢
所以解決方案是什么呢
– -!,這不過就是些明面上的規(guī)范吧了,和產(chǎn)品有啥關(guān)系?就拿最基本的時(shí)區(qū)舉例子,沒有程序員會去自己寫邏輯,有組件不可能自己寫,還有什么字符長短就更不用說一個(gè)響應(yīng)式就搞定了。你說你說說中西方的一些操作習(xí)慣或者畫像的差異還行,,,,
這個(gè)響應(yīng)式是什么意思啊 ?大佬能幫忙回答一下嗎 正好在做德國的產(chǎn)品。。。
這不還是語言么 還以為講產(chǎn)品層面
你做產(chǎn)品設(shè)計(jì)時(shí)候不考慮么?
??
這就可以了?