渲染zh-Hant

Reader locales

Reader locale#

讀者語系是 Faber 用來以讀者的人類語言呈現原始碼、編譯器診斷與語言關鍵字的系統,不會分叉語意。泰語程式設計師可以使用泰語讀寫 Faber 原始碼、接收泰語編譯器錯誤,並透過與拉丁文或中文使用者相同的 HIR 協作。將程式碼從拉丁文在地化為泰語的機制,與將程式碼輸出為 Rust 的機制相同:HIR → surface,兩者都不具特權。

問題#

大型語言模型已將程式設計周遭的對話在地化——泰國電腦科學家可以用泰語向 LLM 尋求協助——但持久存在的成品仍未被在地化。產生的程式碼、API、編譯器錯誤與文件仍然以英文為形狀。英文能力因此成為進入電腦科學的門檻,而不只是對話的門檻。

讀者語系是對此問題的設計回應:人類用來理解 Faber 的語言——原始碼、診斷,以及可選的標準函式庫拼寫——不以英文為前提。它不是應用程式國際化(完整的字串矩陣涵蓋),而是讀者方言支援:可選用、部分涵蓋的套件,建立在不分叉的語意核心之上。

產品論點: 英文不應成為審查軟體意圖時的必要語言。LLM 已將程式設計周遭的對話在地化;讀者語系則將持久存在的成品在地化。

運作方式#

讀者語系套件會將 Faber 關鍵字、原始型別拼寫與診斷範本對映到目標語言。套件是包含三個表格的 TOML 檔案:

  • [keywords] — 將關鍵字名稱對映為其在地化拼寫
  • [types] — 將原始型別名稱對映為其在地化拼寫
  • [diagnostics.*] — 將診斷碼對映為在地化訊息範本
  • [llm] — 用於 LLM 產生程式碼的系統提示片段與範例

編譯器會根據產生的拉丁文基準檢查套件——每個關鍵字與型別都必須有定義的拼寫,或明確繼承自拉丁文。缺少的列會產生可見的回退,而不是靜默遺漏。

在命令列或 faber.toml 中選取語系:

faber check --reader-locale th-TH program.fab
# faber.toml
[reader]
locale = "zh-Hans"

哪些內容會在地化,哪些不會#

層級位於 HIR 中?行為
關鍵字、型別、成對片語在所有呈現形式之間無損轉換
符號 ← → ∴ ≡ ∪ ⇥是(不變)在每種呈現形式中都相同
型別優先結構在每種呈現形式中都相同
數字所有語系一律只接受 ASCII
註解不在編譯器範圍內;由 LLM 媒介處理,可選用
識別碼名稱逐位元組保留
標準函式庫拼寫每個語系各自覆寫

關鍵的架構保證是:任何語系表面形式都可以隨時轉換為其他形式,包括拉丁文。已在地化的 Faber 檔案永遠不是陷阱,因為程式碼永遠不只存在一種形式。faber format --canonicalfaber format --reader-locale=la 完全相同。

已提供的套件#

Radix 目前隨附七個套件:

代碼語言文字系統狀態
la拉丁文拉丁字母規範形式
th-TH泰語泰文參考驗證
zh-Hans簡體中文簡化漢字覆蓋驗證
zh-Hant繁體中文繁體漢字覆蓋驗證
ar阿拉伯文阿拉伯字母覆蓋驗證
hi印地語天城文覆蓋驗證
vi越南語越南文(拉丁字母)覆蓋驗證

五個參考語系是依據集體架構壓力選定的——它們共同迫使基礎層處理所有必須承受的 Unicode 與輸出問題。四個語系使用非拉丁文字;越南語則是拉丁文字控制案例:

語系取用程度架構壓力
th-TH無空格文字——分詞器壓力測試
zh-Hans / zh-Hant非常高成對關鍵字;同級套件繼承;NFKC 寬度折疊
ar由右至左;診斷中的雙向隔離
hi非常高母音符號/隱形母音叢集;印度文字數字
vi拉丁文字上的大量附加符號;NFKC 邊界案例

參考集合是為架構覆蓋率而選定,而不是依人口選定。單靠人口無法證明基礎層尚未處理的任何事項。

在地化原始碼範例#

六個非規範語系各自在 examples/reader-locale/ 下提供完整的 Faber 套件,包含在地化原始碼、診斷測試案例與 faber.toml 清單。同一個 greet 程式會在所有已提供的語系中呈現:

拉丁文 la規範形式

函式 salve(文字 nomen)  文字 {
    定值 文字 msg  "Salve, §!"(nomen)
    傳回 msg
}

入口 {
    定值 文字 m  salve("munde")
    註記 m
}

規範呈現形式。faber format --canonicalfaber format --reader-locale=la 完全相同。拉丁文關鍵字對映到自身;型別名稱使用規範拼寫。

泰語 th-TH參考驗證

ฟังก์ชัน salve(ข้อความ nomen) → ข้อความ {
    ค่าคงที่ ข้อความ msg ← "Salve, §!"(nomen)
    คืนค่า msg
}

เริ่มต้น {
    ค่าคงที่ ข้อความ m ← salve("มุนเด")
    แจ้ง m
}

存取楔形驗證。泰語是無空格文字——詞語之間沒有空格邊界——因此成為分詞器壓力測試,也是讀者語系系統最初的架構驅動因素。詞法分析器必須僅透過關鍵字比對來解析每個 token 邊界。

簡體中文 zh-Hans

函数 问候(文本 名字) → 文本 {
    常量 文本 问候语 ← "你好,§!"(名字)
    返回 问候语
}

入口 {
    常量 文本 消息 ← 问候("世界")
    显示 消息
}

成對關鍵字(如果否則 對應 sisecus),需要套件關鍵字群組;全形/半形標點;在詞法進入點進行 NFKC 寬度折疊。由於 CJK 分詞器的邊界問題,這是最困難的 LLM 輸出案例。繁體中文(zh-Hant)的同級套件會繼承並覆寫 zh-Hans 的詞根。

阿拉伯文 ar

دالة salve(نص nomen) → نص {
    ثابت نص msg ← "مرحبا، §!"(nomen)
    أعد msg
}

بداية {
    ثابت نص m ← salve("عالم")
    اعرض m
}

由右至左的文字嵌入邏輯順序的由左至右程式碼區塊中。編譯器的 HTML 診斷輸出會以 <bdi> 包覆關鍵字,進行雙向隔離,以防止 RFO(右側跟隨左側)扭曲。原始來源以邏輯順序使用阿拉伯文字;顯示層負責雙向文字呈現。

印地語 hi

फलन salve(पाठ nomen) → पाठ {
    स्थिर पाठ msg ← "Salve, §!"(nomen)
    लौटा msg
}

आरंभ {
    स्थिर पाठ m ← salve("जगत")
    दिखा m
}

使用母音符號/隱形母音子音叢集的天城文字。這證明了更廣泛印度文字家族的路徑——孟加拉文、泰米爾文與泰盧固文都繼承相同的字形塑造基礎設施——但各自的套件編寫仍是獨立工作。印度文字數字符號(०-९)不接受於數字常值中;所有語系都保留 ASCII 數字。

越南語 vi

hàm chào(vănbản tên) → vănbản {
    hằng vănbản lời_chào ← "Xin chào, §!"(tên)
    trả lời_chào
}

bắtđầu {
    hằng vănbản thông_điệp ← chào("thế giới")
    in thông_điệp
}

控制案例:使用拉丁文字但不是英文。大量附加符號(ế)會對詞法分析器中的 NFKC 邊界案例施加壓力。這可避免建立只在特殊文字系統上運作、卻未經拉丁附加符號驗證的架構。識別碼使用越南語詞彙(chàotênlời_chàothông_điệp),並由編譯器逐位元組保留。

符號(← → ∴ ≡ ∪ ⇥)、 結構位置與識別碼名稱在上述六種呈現形式中都完全相同。只有關鍵字與型別名稱會改變。HIR 正是同一個程式——編譯器將六者視為等價。將 Faber 呈現為泰語,與呈現為 Rust 是相同的編譯器操作: HIR → surface,兩者都不具特權。

在地化診斷#

診斷首先是結構化事實,其次才是散文。每個診斷都包含穩定的代碼(LEX###PARSE###SEM###WARN###)與具名引數;套件負責擁有呈現後的範本文字。這表示診斷呈現器可以在不變更診斷基礎設施的情況下,以任何語系輸出訊息。

讀者語系範例套件包含診斷測試案例——型別不相容、未定義變數、非 ASCII 數字——以證明整條流程都具備語系感知能力:

  • examples/reader-locale/vi/src/type-mismatch.fab
  • examples/reader-locale/vi/src/undefined-variable.fab
  • examples/reader-locale/vi/src/non-ascii-number.fab
  • examples/reader-locale/vi/src/keyword-suggestion.fab
  • examples/reader-locale/vi/src/keyword-edit-distance.fab

系統內建雙向隔離:邏輯順序的由左至右程式碼區塊中的阿拉伯文關鍵字,會在 HTML 輸出中包覆於 <bdi> 元素內,以防止 RFO(右側跟隨左側)扭曲,否則由右至左文字執行序會難以閱讀。

狀態#

層級狀態
套件結構描述、別名、繼承、驗證、診斷、LLM 成品已提供
套件感知詞法分析、型別解析、清單/CLI 選取、可見回退已提供
套件擁有的診斷呈現、faber explain、雙向隔離顯示已提供
規範 Faber 格式化已提供
在地化 Faber 重新輸出(format --reader-locale部分完成
標準函式庫術語覆寫、可測量的 LLM 輸出正確度、完整語系覆蓋延後
多語言文件產生提議中

基礎層的先決條件——在詞法進入點進行 NFKC 正規化——已經完成。關鍵字表、診斷具名引數、呈現器與套件交付都已提供。北極星層級(在地化重新輸出、標準函式庫術語、LLM 輸出基準測試、產生多語言文件)仍明確處於部分完成或延後狀態。

參考資料#

  1. radix/docs/design/reader-locale.md — 完整設計文件(69 KB)
  2. examples/reader-locale/ — 6 個包含在地化原始碼的語系套件
  3. stdlib/reader/*/pack.toml — 7 個已安裝的套件定義
  4. radix/crates/radix/src/reader_locale.rs — 執行階段實作
  5. radix/docs/design/faber-canonical-surface.md — 規範模式與 faber format
  6. radix/docs/factory/lex-nfkc-normalization/ — NFKC 先決條件交付

Reader-locale packages#

每個非拉丁字母讀者地區都在 examples/reader-locale/ 下擁有完整的 Faber 套件,其中包含在地化原始碼、診斷測試案例,以及 faber.toml manifest。

可用套件#

地區路徑原始碼範例
th-THexamples/reader-locale/th-TH/ฟังก์ชัน salve(ข้อความ nomen) → ข้อความ
zh-Hansexamples/reader-locale/zh-Hans/函数 问候(文本 名字) → 文本
zh-Hantexamples/reader-locale/zh-Hant/函式 問候(文字 名字) → 文字
arexamples/reader-locale/ar/دالة تحية(نص اسم) → نص
hiexamples/reader-locale/hi/फलन नमस्कार(पाठ नाम) → पाठ
viexamples/reader-locale/vi/hàm chào(vănbản tên) → vănbản

診斷測試案例#

每個套件都包含測試案例,用來證明完整的編譯器管線具備地區感知能力:

  • type-mismatch.fab — 在地化的型別錯誤診斷
  • undefined-variable.fab — 在地化的名稱解析錯誤
  • non-ascii-number.fab — NFKC 處理
  • keyword-suggestion.fab — 在地化的「你是不是要找?」提示