IT產(chǎn)品的國際化,絕不是“支持英文”就足夠

10 評論 6521 瀏覽 37 收藏 12 分鐘

編輯導(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)類似下面這樣:

IT產(chǎn)品的國際化,絕不是“支持英文”就足夠

這種辦法有問題嗎?看起來很直觀,沒問題對吧?

其實(shí)有問題,問題不在文字的內(nèi)容,而在文本的長度。大部分情況下,中文和對應(yīng)英文的文本長度是差不多的,所以顯示時(shí)占據(jù)的空間差不多,并不會影響原有的UI元素。但是有些時(shí)候,中文和英文的長度相差很大,在一些緊密排版的情況下,顯示就會有問題。

IT產(chǎn)品的國際化,絕不是“支持英文”就足夠

這還不是最麻煩的。如果長度不夠,可以在空格處換行,一般都還可以應(yīng)付,只是高度會變化。但是對于其它語言,比如德語,情況就復(fù)雜多了。德語經(jīng)常會把不同的單詞拼起來,排版時(shí)如果沒有考慮,最終的效果可能特別糟糕。

比如“新天鵝堡”的德文是Neueswanstein,直接替換的話就會是下面的樣子:

IT產(chǎn)品的國際化,絕不是“支持英文”就足夠

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)的說明。

IT產(chǎn)品的國際化,絕不是“支持英文”就足夠

三、例子三:標(biāo)點(diǎn)

許多開發(fā)人員都知道,系統(tǒng)里有個(gè)重要的變量叫l(wèi)ocale,它代表了與本地化有關(guān)的一組設(shè)置。

最常見的,比如中日韓文字中有許多“看起來一樣”的文字,其實(shí)有細(xì)微差別。但是,為了節(jié)省Unicode中的空間,給它們指定了同樣的Code Point,顯示的時(shí)候就靠locale來區(qū)分。

IT產(chǎn)品的國際化,絕不是“支持英文”就足夠

但是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作為分隔符,就省去了這種煩惱。

IT產(chǎn)品的國際化,絕不是“支持英文”就足夠

更讓人意想不到的是,常見的CSV文件,也就是“逗號分隔值文件Comma Separated Value”,在德國也會有完全不一樣的規(guī)定。

因?yàn)榈抡Z里comma是小數(shù)點(diǎn),所以即便CSV叫“逗號分隔值”,它也不能用逗號(comma)來分隔,而應(yīng)當(dāng)用分號(semicolon)來分隔。

IT產(chǎn)品的國際化,絕不是“支持英文”就足夠

所以,如果你的CSV處理程序本來跑得好好的,忽然報(bào)了一大堆錯(cuò),沒準(zhǔn)就是這里出的問題。

不要為這一點(diǎn)“意想不到”吃驚,還有更加“意想不到”的情況:Excel的函數(shù)里,我們會用逗號來分隔多個(gè)參數(shù),但是在德語版Excel里,逗號必須替換為分號,否則一定會報(bào)錯(cuò)。

IT產(chǎn)品的國際化,絕不是“支持英文”就足夠

上面這些例子,說穿了平淡無奇,但沒有說穿的時(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é)議

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 那產(chǎn)品層面要如何做呢

    來自廣東 回復(fù)
  2. 所以還是表層語言的問題嘛

    來自廣東 回復(fù)
  3. 所以解決方案是什么呢

    來自山東 回復(fù)
  4. 所以解決方案是什么呢

    來自山東 回復(fù)
  5. – -!,這不過就是些明面上的規(guī)范吧了,和產(chǎn)品有啥關(guān)系?就拿最基本的時(shí)區(qū)舉例子,沒有程序員會去自己寫邏輯,有組件不可能自己寫,還有什么字符長短就更不用說一個(gè)響應(yīng)式就搞定了。你說你說說中西方的一些操作習(xí)慣或者畫像的差異還行,,,,

    來自浙江 回復(fù)
    1. 這個(gè)響應(yīng)式是什么意思啊 ?大佬能幫忙回答一下嗎 正好在做德國的產(chǎn)品。。。

      來自山東 回復(fù)
  6. 這不還是語言么 還以為講產(chǎn)品層面

    回復(fù)
    1. 你做產(chǎn)品設(shè)計(jì)時(shí)候不考慮么?

      來自江蘇 回復(fù)
  7. ??

    回復(fù)
  8. 這就可以了?

    回復(fù)