前端多語系設計該注意的事項

慎用固定尺寸

金天
jkopay@frontend
8 min readJun 30, 2022

--

固定寬度 vs 自動

並非全部固定尺寸都是不好的,在設計中需要理解,此物件的寬高是必要元素嗎?但在大多數情況下,都可以忽略實際設計上的高度。例如以下設計

深紫色的區塊實際上不寫入高度,高度應該隨內容決定,如果想要保持設計的還原度,使用 min-height or min-width 讓物件保持至少該有的樣貌。

可以參考某韓國網站,當我們換成別的語系,固定寬高的元素會馬上呈現內容移除或錯亂。

別將文字放在圖片上

第二種最常遇到的設計元素,就是帶有文字解釋的圖片,例如google 的 Android 開發 doc.

圖片中的文字非常難處理,除了它無法被辨識以外,還包含了其他設計元素(平面設計),就算要做一個一模一樣的圖,也並非直接把翻譯的字貼到圖上就好。而需要設計師重新排版,例如netlifx官網banner

TW-en
TW-zh

在code大概可以是如下

import zhBanner from '...';
import enBanner from '...';
const banner = {
zh: zhBanner,
en: enBanner
}
<img src={banner[lang]} />

語法 & UI & 字體排序

即便我們處理以上兩個重點,雖然畫面沒有壞,我們還是有可能出現問題,就是翻譯無法完全顯示.

source: https://simpleen.io/blog/optimize-i18n-workflow

盡量簡化資訊更利於頁面的呈現,如果需要在畫面上實現「補充」文法的概念設計,可以改成以下的範例:

source: https://meetup.github.io/swarm-design-system/design/usability/i18n/

但必須承認,要做到每個語言都盡善盡美,那是不太可能的顧慮到全部語系的文法,那就把「文法」這個概念從設計中抽離,如上圖顯示的。

如果的翻譯是設計元素的一部分,typography vs CJK

CJK (Chinese–Japanese–Korean)和拉丁字母語系的差異較大,在多數形象網站設計中(英文),字體排版(typography)佔據相當重要的角色,例如以下設計。

source: https://www.welcometothehouseofgucci.com/
source: https://wagasi-sakasita.jp/

如果那個文字排版是非常重要的設計元素 > 內容呈現,建議換成圖,但是這就和第二點說法有衝突,所以什麼情景要用什麼方式,需要視情況而定。

所以如果設計圖中含有特殊的文字排版,也務必考量進去,以免再語言轉換時導致設計變形。

也可以多利用 Web font 來完成設計,參考 google 的設計文章

如果需要使用font-face,也要將文字檔案的尺寸考量進去,以免導致網速過慢時,無法顯示文字的窘境。

針對這個話題,網路上有很多相關的文章可以參考.

Critical render path delay when loading font stylesheet and font file, Credit: web.dev under Creative Commons Attribution 4.0 License

所以假設有一個多語系網站,要兼顧到字體的種類,這方面的優化必不可少。

格式

早在10年前,LUKE WROBLEWSKI 就在一篇關於地址格式的文章探討到這個話題,如今我們習以為常的地址設計欄位,在過去可不是那樣的。

我們從那篇文章中,可以感知到一件事,通用比客製化來的平易近人,針對某個國家或文化(事件)設計特有的規範,往往只會增加使用者的學習曲線,因為你無法統一全部和你做一樣事情的人,都用同一套(複雜)的流程。

但通用的流程是大家喜愛的,套用在各種情境也合適,流通性大,所以在設計網路表單、介面、流程的時候,要理解哪一些設計元素是「通用」,哪一些設計元素是「特定」

除了地址這類型沒有嚴格定義的範例以外,還有一些有標準定義的格式,例如

  1. 貨幣
  2. 時間/日期/相對時間(文字敘述,例如三天前)
  3. 數字
  4. 稱呼

方向

用中文或英文語系的網站,大部分習慣是上到下,左到右,但在其他國家或語系下,可能不是這樣子,這和我們有什麼關係呢?

有。

並非只是替換字串,就完成多語系,css寫錯,也可能導致很多不必要的髒修改。

在google的web dev網站中就提出很典型的例子,有興趣可以到官網把這篇好文想賭一番。

https://web.dev/learn/design/internationalization/
https://web.dev/learn/design/internationalization/

lang=

<html lang="zh">

這個神奇的語法,會讓瀏覽器自動幫你完成許多事,例如斷行

.element { hyphens: none | manual | auto }
<article lang=”en”>
<article lang=”jp”>

頁面加了lang,也會對搜尋引擎更加友善,讓機器人知道這也頁面的資訊是屬於什麼語系。

當然你可以還可以利用:lang 來控制

em:lang(zh) {  text-weight: 700; }

writing-mode

LTDR, 顧名思義,書寫方式,這裡就不針對這個項目細說,有興趣請查看:W3C 說明

其中有一個比較有可能會遇到的就是,中文/日文的直下排版方式。

https://css-tricks.com/almanac/properties/t/text-combine-upright/

辨識

翻譯檔的Key必須簡單易懂,直觀,避免過度細化 key。

// bad
general.users.savedata (更新)
// good
general.update (更新)

key 必須是有辦法被聯想到的,例如:

// bad
doc.data.first
// good
doc.description

model/domain base 命名,對應了 第一個的過度細化,會發現有很多翻譯其實都是重複的,例如。

// bad
doc.description.error(錯誤)
page.description.error(錯誤)
// good
validation.error (錯誤)

過度描述,為了避免重複key,我們很常會採用「詳細」的key name去 避免這事情的發生,這反而出現了這種情況.

// bad
doc.form.section_1.block_1.title_with_login_member(稱呼)
// good
login.title(稱呼)

namespace

在大部分i18n的工具中,都會有 namespace的概念,這樣可以大大減少翻譯檔案的大小,因為你可以針對特定的命名撈取翻譯資料,例如在 react.i18nex 中,也建議了採用的方式如下.

// not recommended with ns prefix when used in combination with natural language keys
i18next.t('common:look.deep');
// better use the ns option
i18next.t('look.deep', { ns: 'common' })

參考資料

  1. https://www.w3.org/International/questions/qa-lang-why.en
  2. https://design.google/library/choosing-web-fonts-beginners-guide/

--

--

金天
jkopay@frontend

台積電副理|Ex-街口 Web Lead | 作者 | 大馬人,現居台北。愛邏輯推理,行動派,複雜的事簡單做,簡單的事仔細做,喜歡講故事。