在地化
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 呈現說明前決定語言。優先順序如下:
--lang en|zh|ja|de|fr,頂層與子命令均支援。- 非空的
MEMORIES_LANG。 - 所選 Memories 主目錄中已儲存的偏好設定。
- 第一個非空的
LC_ALL、LC_MESSAGES或LANG。 - 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 或供應商管理。