Memories / 文件

本頁目錄

在地化

Flutter 用戶端與 CLI 支援英文(en)、簡體中文(zh)、 日文(ja)、德文(de)及法文(fr)。英文為備援語言。 中文系統變體會使用簡體中文翻譯。

Web 用戶端與註冊電子郵件

託管的 Web 用戶端與驗證電子郵件支援英文(en)、簡體中文(zh-CN)、 繁體中文(zh-TW)、日文(ja)、法文(fr)、德文(de)及西班牙文(es)。 這與原生用戶端支援的語言集合不同。Web 語言選擇器可在登入前使用, 且僅儲存語言偏好設定。沒有已儲存的偏好設定時,會使用瀏覽器地區設定; 不支援的語言則退回英文。zh-Hant、zh-HK 與 zh-MO 使用繁體中文; 明確指定的 zh-Hans 使用簡體中文。

Web 訊息位於 website/app/i18n.mjs。每個訊息目錄都必須加入相同的鍵。 註冊請求將 locale 傳送至 Center;crates/center/src/saas/accounts/email.rs 中的電子郵件主旨與內文使用該請求的語言。未傳送此欄位的既有用戶端會收到英文。 驗證碼保持不變。待處理驗證碼的重複使用與節流限制適用於跨語言變更。 獨立文件網站以相同的七種語言提供所有指南與隱私權政策。 切換語言時會保留目前文件與章節。

Flutter

mobile/l10n.yaml 設定 Flutter 官方在地化產生器。將訊息加入 mobile/lib/l10n/app_en.arb,並在其他四個 ARB 檔案翻譯相同的鍵。 為完整訊息使用具描述性的鍵與具名預留位置;數量影響措辭時, 使用 ICU 複數形式。在英文範本中宣告預留位置類型。 編輯資源後執行 flutter gen-l10n。

Widget 透過 context.l10n 取得字串。資料庫狀態會在 didChangeDependencies 更新在地化參照,使非同步作業可使用字串,而不必跨 await 保留 BuildContext。 flutter_localizations 提供 Material/Cupertino 標籤,intl 負責格式化日期與數量。 在 preferred-supported-locales 中將英文置於首位,使未知系統語言有確定的備援。 iOS 在 Runner/Info.plist 宣告支援的語言。

語言選單可在解鎖前使用。SharedPreferences 僅儲存非機密的 language 偏好設定;system 會移除此偏好設定。儲存失敗時保留既有選擇,並顯示在地化錯誤。 變更語言不會重建後端或變更已解鎖的工作階段。沒有已儲存的偏好設定時, 應用程式執行期間的系統語言變更會更新介面與字型備援。 已儲存的選擇會維持固定,直到使用者變更或重設為系統預設值。

本機錯誤會在顯示時翻譯,因此既有橫幅會隨語言變更。原生錯誤使用其穩定代碼 提供翻譯後的備援訊息。請勿翻譯通訊協定值、識別碼、URL、帳號中繼資料、 使用者標題、內文、標籤、關聯、已簽署的稽核記錄或機密值。 受保護預覽必須繼續使用 protected_cards.dart 中的明確欄位允許清單與固定遮罩。

CLI

crates/cli/src/i18n.rs 會在 Clap 呈現說明前決定語言。優先順序如下:

  1. --lang en|zh|ja|de|fr,頂層與子命令均支援。
  2. 非空的 MEMORIES_LANG。
  3. 所選 Memories 主目錄中已儲存的偏好設定。
  4. 第一個非空的 LC_ALL、LC_MESSAGES 或 LANG。
  5. Windows 使用者地區設定;其他平台沒有地區設定變數時使用英文。
memories language zh       # Save a language for subsequent commands
memories language          # Show the saved choice and effective language
memories language system   # Clear the choice and follow the system

非機密偏好設定儲存為 language.txt,位於 --home / MEMORIES_HOME(或預設 memories 資料目錄)下。儲存採用不可分割的檔案取代操作。 初始化前及 daemon 未執行時也可使用。單純偵測系統語言不會建立偏好設定檔。 偏好設定遺失、無法讀取或無效時會退回系統設定;寫入失敗會回報錯誤。 暫時性的 --lang 與 MEMORIES_LANG 覆寫不會修改檔案。

ja_JP.UTF-8 等地區設定變體會正規化為基礎語言。 不支援的環境/系統語言會退回英文。明確指定但無效的 --lang 值會遭 Clap 拒絕。 初始掃描在 -- 處停止,保留傳給擷取程式的類似語言參數。

crates/cli/locales/ 中的 UTF-8 訊息目錄會在編譯時內嵌; 已安裝的二進位檔不需要隨附資源檔案。目錄鍵為原始英文訊息。 保留 Clap 文件註解的完整版本與移除句點的版本,因為簡短說明會移除最後的句點。 翻譯簡短與詳細說明。每個新增的 CLI 自有錯誤與提示都必須加入目錄項目。

具名預留位置使用 i18n::format。替換只處理範本一次,因此含有大括號的使用者文字 不會變成另一個預留位置。密碼與機密擷取仍使用隱藏輸入。 USE 與 APPROVE 維持原樣的確認字詞,且必須在翻譯後的提示中原樣出現。

JSON 輸出保留既有版本、欄位名稱、錯誤代碼與結束狀態。只有供人閱讀的訊息會在地化。 未對應的原生/OS 診斷訊息會在在地化摘要後保留原始文字; Clap 解析診斷包含在地化引言與原始參數詳細資訊。 MCP 結構描述、工具名稱與通訊協定訊息維持穩定,不受 CLI 地區設定影響。

驗證

cargo test -p memories --locked
cd mobile
flutter gen-l10n
flutter analyze
flutter test

Rust 測試涵蓋所有訊息目錄、說明涵蓋率、預留位置保留、地區設定優先順序、 轉送參數、巢狀說明,以及具有穩定 JSON 欄位的在地化錯誤。 Flutter 測試涵蓋訊息目錄一致性、全部五種系統地區設定、不支援地區設定的備援、 偏好設定持久化、工作階段保留、手機寬度的在地化對話方塊,以及遮罩的受保護卡片預覽。

主機使用 HTTP Proxy 時,執行 widget 測試期間請將 localhost、127.0.0.1 與 ::1 排除於 Proxy 之外;Flutter 的本機測試 WebSocket 必須直接連線。 仍需裝置測試以驗證平台字型備援、原生檔案挑選器與 OAuth 瀏覽器介面, 其語言由 OS 或供應商管理。