開發紀錄
stable ID、slug 和翻譯文章各自解決什麼問題
用本站實際存在的三語文章,區分內容項目的 ID、跨語言身份與公開網址,並說明改標題、改 slug 和補譯時各自需要保留什麼。
- 內容工程
- 多語網站
- Astro
- 資料契約
英文標題和繁中標題不同,網址卻沿用同一段英文名稱。只比較標題或網址,都不足以說明兩份文章的翻譯關係。
本站用三種資料回答三個問題:collection entry ID 辨識載入的檔案,stableId 連起同篇文章的不同語言,locale 和 slug 決定讀者打開的網址。它們目前可能長得很像,但不能因此當成同一個欄位。
從一篇已經有三語版本的文章看起
〈和 AI 一起改網站〉已有繁中、英文和日文版本。三份檔案的標題各自使用自然的語言,身份欄位則是:
| 語言 | collection entry ID | stableId |
公開路由 |
|---|---|---|---|
| 繁中 | zh-TW/ai-collaboration-and-acceptance |
ai-collaboration-and-acceptance |
/notes/ai-collaboration-and-acceptance |
| 英文 | en/ai-collaboration-and-acceptance |
ai-collaboration-and-acceptance |
/en/notes/ai-collaboration-and-acceptance |
| 日文 | ja/ai-collaboration-and-acceptance |
ai-collaboration-and-acceptance |
/ja/notes/ai-collaboration-and-acceptance |
這裡三份版本的 slug 都是 ai-collaboration-and-acceptance。表格看起來重複,是因為目前的命名剛好一致;程式仍把「哪個項目」「哪一篇文章」和「哪個網址」分開處理。
如果靠標題配對,翻譯標題只要重新措辭,就可能找不到原文。如果靠相同 slug 配對,則會把網址命名變成翻譯關係的必要條件。stableId 讓這兩件事不必綁在一起。
entry ID 先讓三份檔案都能被讀到
Astro 的 glob() loader 會替內容項目產生唯一 ID,也允許客製 ID 的產生方式。[1] 本站選擇保留語言與檔名的組合,移除 .md 副檔名後作為 entry ID。
所以繁中與英文即使有相同檔名,仍是兩個不同的項目:zh-TW/ai-collaboration-and-acceptance 和 en/ai-collaboration-and-acceptance。
這一層處理的是載入身份。它不決定哪一份是原文,也不表示文章已經可以公開。草稿同樣需要唯一 ID,才能在校稿時被找到。
stableId 是本站自己定義的欄位,不是 Astro 自動替所有多語網站建立的翻譯系統。想採用相同方法,還需要自行定義 schema、唯一性規則與配對查詢。
stableId 連起同篇版本,slug 保留網址責任
文章頁取得正式集合後,會找出 stableId 相同的版本,再用各自的 locale 和 slug 產生語言連結及 hreflang。
身份驗證則以語言為範圍。同一語言不能有兩篇文章共用 slug,也不能有兩份版本共用 stableId;不同語言可以共用同篇文章的 stableId。這能攔下重複身份,卻不能證明兩份正文真的互為翻譯,內容仍要校對。
網址的規則比較單純:繁中使用 /notes/{slug},英文與日文再加上語言前綴。標題和分類不參與網址計算。改寫摘要、調整標題,並不會因而產生新的文章網址。
目前三語版本沿用相同 slug,這是命名選擇,不是配對函式的必要條件。假設未來某個語言需要不同的 slug,配對仍可以沿用原本的 stableId;但新網址與舊連結如何處理,會變成另一項需要明確決定的工作。
改名時,先知道自己在改哪種身份
我會把幾種修改分開看:
- 改標題:改的是讀者看到的名稱,通常保留
stableId和slug。 - 補翻譯:新增一份不同
locale的內容,共用同篇stableId,並記錄該語言版本自己的完成與發布時間。 - 改
slug:改的是公開網址,需要盤點站內連結、canonical 和既有外部連結的影響。 - 改
stableId:改的是跨版本的配對依據,不能只修改其中一種語言。
這不是一套自動遷移功能。本站沒有把任意 slug 改名、舊網址轉址或身份遷移做成通用工具;保留 stableId 也不會自動修好指向舊網址的連結。
有時候一篇文章已經改到主要問題完全不同,是否還算同篇內容,需要編輯判斷。不能只因為沿用同一個檔案,就認定所有既有翻譯仍然有效。
有共同身份,也要各自符合發布條件
如果繁中版本已公開,英文版本仍是草稿,兩者可以共用 stableId,但正式文章頁只會配對符合發布條件的版本。英文草稿不會因為找得到繁中原文,就自動成為可點的語言入口。
這也讓翻譯進度不必追求三語篇數完全相同。身份資料記錄「它們屬於同篇文章」,發布資料回答「這一份版本現在能不能被讀到」。
要檢查這套契約,可以先選一篇真實的三語文章,逐份核對 entry ID、stableId、locale 和 slug,再打開生成的文章頁確認語言連結。不要只看檔名相同,就當成配對已經成立。
紀錄範圍
本文使用本站已存在的三語文章、內容 loader、身份驗證與文章路由整理。不同語言採用不同 slug 的情境是規則說明,不是已完成的改址案例;本文不涵蓋自動轉址、內容版本差異偵測或翻譯品質評分。
延伸閱讀:沒有翻譯,就不應該生成一個假的語言頁。
Sources
[1] https://docs.astro.build/en/guides/content-collections — Astro — Content collections