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 のメール件名と本文はそのリクエストの言語を使用します。これを省略する既存クライアントには英語が送られます。確認コードは変わりません。保留中のコードの再利用とレート制限は言語を変更しても適用されます。独立したドキュメントサイトは、すべてのガイドとプライバシーポリシーを同じ 7 言語で提供します。言語を切り替えても、文書と現在のセクションは維持されます。

Flutter

mobile/l10n.yaml は Flutter 公式のローカライズ生成器を設定します。mobile/lib/l10n/app_en.arb にメッセージを追加し、ほかの 4 つの ARB ファイルで同じキーを翻訳します。メッセージ全体に説明的なキーと名前付きプレースホルダーを使い、件数によって表現が変わる場合は ICU の複数形を使用してください。英語テンプレートでプレースホルダーの型を宣言します。リソースの編集後に flutter gen-l10n を実行してください。

ウィジェットは 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

秘密情報ではない設定は、--home / MEMORIES_HOME(または既定の memories データディレクトリー)内の language.txt に保存されます。保存にはアトミックなファイル置換を使用します。初期化前やデーモンが動作していない状態でも使えます。システム言語の検出だけでは設定ファイルを作成しません。設定が存在しない、読めない、無効な場合はシステムにフォールバックし、書き込み失敗はエラーを報告します。一時的な --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 テストはカタログの一致、5 つすべてのシステムロケール、未対応ロケールのフォールバック、設定の永続化、セッションの保持、電話画面幅での翻訳済みダイアログ、マスクされた保護カードのプレビューを対象とします。

HTTP プロキシを使うホストでは、ウィジェットテスト実行中に localhost、127.0.0.1、::1 をプロキシの対象から除外してください。Flutter のローカルテスト WebSocket は直接接続する必要があります。プラットフォームのフォントのフォールバック、ネイティブのファイル選択、OS またはプロバイダーが言語を管理する OAuth ブラウザー UI の確認には、引き続き端末テストが必要です。