本文へスキップ

テキストと t!

このページは英語から翻訳されています。 英語のページを読む

ユーザーに見えるすべてのテキストは、t! を通してロケールファイルから取得されます。すべてのロケールファイルにそのキーがあること、引数がプレースホルダーに一致することをコンパイラが検査するため、翻訳の欠落は空白のラベルではなくビルドエラーになります。

ロケールファイル

locales/<lang>.json は入れ子のキーを持ちます。すべてのファイルが同じキーを持つ必要があります。

{
  "stock": {
    "products": "Products",
    "saved": "Product {code} saved."
  }
}

t!

Screen::new(t!("stock.products"))
ui.toast(t!("stock.saved", code = p.code));

t! は Text を返します。キーと引数の組で、ページのレンダリング時にユーザーの言語で解決されます。タイプミスはコンパイル時に失敗します。

error: t!: key `stock.prodcts` is missing in locales/tr.json
  = help: add it to every file in locales/

フィールドと選択肢のラベル

フィールドのラベルには Product.code のように <Model>.<field> のキーを使います。選択肢のラベルには <Choice>.<Variant> を使います。キーがない場合、ラベルは #[label("...")] か、名前を読みやすくした形にフォールバックします。zeyn check は、ある言語にあって別の言語にないキーを報告します。

{
  "Product": { "code": "Code", "name": "Product name" },
  "Unit": { "Piece": "Piece", "Kg": "Kilogram" }
}

言語の登録

let i18n = I18n::new("en")
    .catalog("en", include_str!("../locales/en.json"))
    .and_then(|i| i.catalog("tr", include_str!("../locales/tr.json")))?;
App::new(t!("app.name")).i18n(i18n)

I18n::new の最初の引数が既定の言語です。カタログが複数あると、シェルに言語ピッカーが表示されます。フレームワーク自身のテキスト(グリッド、フォーム、シェル)は、英語とトルコ語で提供されます。

ほかの言語のフレームワークテキスト

フレームワーク自身のテキストは、中国語、ロシア語、スペイン語、韓国語、日本語、ヒンディー語、アラビア語でも用意されています。言語ごとに Cargo feature があり、アプリは有効にした言語の分だけを負担します(1 言語あたりバイナリに 35 から 60 KB のテキストが加わります)。

zeyn = { version = "0.0", features = ["lang-ru", "lang-ar"] }

lang-all はすべての言語を有効にします。アプリがその言語を提供するのは、上のように自分のカタログを登録したときだけです。feature がない場合、フレームワークのテキストは既定の言語で表示されます。

画面の外でのテキスト

  • ctx.t(&text) は、メールなどのために Text をユーザーの言語の String に変換します。
  • Text::english() は、ログとテスト向けに英語のテキストを返します。
  • Text::from("literal") は、商品コードのように、決して翻訳されないテキストです。

言語がどのように選ばれ、数値、金額、日付がどのように書式化されるかは、時刻と言語 を参照してください。