戻る

gt-sanity@2.1.0

Brian Lou avatarBrian Lou
gt-sanityv2.1.0sanitycmstranslationminor

概要

gt-sanity v2.1 では、フィールドレベルのローカライゼーション が追加されました。ロケールごとに別のドキュメントを作成する代わりに、国際化配列を使って各言語の値を同じドキュメント内に保存できるようになりました。このプラグインはスキーマ型を自動生成し、ロケールごとにインラインで編集できる UI を提供します。さらに、翻訳はすでに使っている GT ワークフローをそのまま通り、翻訳済みの値は元のドキュメントに直接マージされます。

データ構造は sanity-plugin-internationalized-array ([{ _key, _type, language, value }]) と同じなので、既存の国際化配列コンテンツも移行なしでそのまま使えます。


新機能

フィールドレベル (国際化配列) のローカライゼーション

ドキュメントレベルの翻訳は引き続きデフォルトです。各ロケールごとに独自のドキュメントがあり、それらは @sanity/document-internationalization を介して関連付けられます。このモデルは、すべての内容が言語ごとに異なるドキュメントに適しています。

新しいフィールドレベルのモデルでは、1 つのドキュメントを維持したまま、個々のフィールドをインプレースでローカライズします。

{
  _id: 'post-123',
  _type: 'post',
  title: [
    { _key: 'x1', _type: 'internationalizedArrayStringValue', language: 'en', value: 'Hello' },
    { _key: 'x2', _type: 'internationalizedArrayStringValue', language: 'es', value: 'Hola' },
  ],
}

新しい internationalizedArray オプション (またはその説明的なエイリアスである fieldLevelLocalization) を使用して有効にします。

import { defineConfig } from 'sanity';
import { gtPlugin } from 'gt-sanity';

export default defineConfig({
  plugins: [
    gtPlugin({
      sourceLocale: 'en',
      locales: ['es', 'fr', 'ja'],
      translateDocuments: [{ type: 'post' }],
      internationalizedArray: { enabled: true },
      translationLevel: 'internationalizedArray',
    }),
  ],
});

生成されるスキーマ型

有効にすると、このプラグインは、すでに gtPlugin に渡している sourceLocale / locales と同じ設定に基づいて、internationalizedArray* スキーマ型 (例: internationalizedArrayStringinternationalizedArrayText) を生成します。ロケールの識別情報は一度だけ定義すれば済みます。これらは、他の型と同じようにスキーマ内で使用できます。

defineField({
  name: 'title',
  type: 'internationalizedArrayString',
});

fieldTypes は、生成する型の種類を制御します。デフォルトは ['string', 'text'] で、Portable Text には 'block' を指定でき、任意の値の形状にはカスタムオブジェクト定義を指定できます。

internationalizedArray: {
  enabled: true,
  fieldTypes: [
    'string',
    'text',
    'block',
    { name: 'seo', type: 'seoFields' }, // internationalizedArraySeo を生成
  ],
},

生成される型名は typePrefix で、Studio に表示されるロケールラベルは languageTitles または getLanguageTitle でカスタマイズできます (標準の internationalizedArray* 名に対する互換エイリアスはデフォルトで維持されます) 。

ロケールごとのインライン編集 UI

生成された型には、この用途に特化した Studio の入力 UI が付属します。各言語はラベル付きのインラインエディターとして表示され (折りたたまれたオブジェクト行や編集ダイアログはありません) 、ロケールごとの追加ボタンと削除ボタンが用意されています。ソース言語は削除できません。

独自の UI を使いたい場合は、components オプションで inputitemfield スロットをオーバーライドできます。あるいは false を渡して、Sanity のデフォルトのレンダリングに戻すこともできます。いずれの場合も、翻訳はコンポーネントではなく保存されたデータに対して行われるため、影響はありません。

translationLevel と mixed mode

スキーマ生成と翻訳ルーティングは独立しています。internationalizedArray を有効にしても、追加されるのは編集可能なフィールド型だけです。新しい translationLevel オプションは、対象のドキュメントをどのように翻訳するかを制御します。

  • 'document' (デフォルト) — ロケールごとにドキュメントを分ける、ドキュメント全体の翻訳です。v2.0 から変更ありません。
  • 'internationalizedArray' — 対象のすべてのドキュメントを、国際化配列 を使ってその場でローカライズします。
  • 'mixed'fieldLevelDocuments に列挙したドキュメント型は array 戦略を使用し、それ以外はすべてドキュメントレベルのままです。
gtPlugin({
  sourceLocale: 'en',
  locales: ['es', 'fr'],
  translateDocuments: [{ type: 'post' }, { type: 'siteSettings' }],
  internationalizedArray: { enabled: true },
  translationLevel: 'mixed',
  fieldLevelDocuments: [{ type: 'siteSettings' }], // インプレースでローカライズ
});

インプレースでローカライズされるドキュメントタイプは、自動的に @sanity/document-internationalization の対象外となるため、言語バッジやロケールごとのドキュメントテンプレートは付与されません。

インプレースでのインポート

フィールドレベルのドキュメントは、すでに利用しているのと同じ GT のワークフローをたどります。インポート時には、翻訳された値が同じドキュメントにマージされます。更新されるのは対象のロケールのみで、翻訳の実行中に加えられた編集を含む他のすべての言語はそのまま保持されます。

また、Studio の翻訳ステータスも、インプレースインポートやページの再読み込み後に正しく維持されるようになり、完了した翻訳が "not started" と表示されることはなくなりました。


関連リンク