設定
scribe.config.tsの全オプション解説:プロジェクト設定、コンテンツタイプ、フィールドマーカー、ロケールルーティングなどを網羅。
View as Markdownすべての設定は単一のファイル scribe.config.ts に集約され、defineConfig({...}) をエクスポートします。ランタイム (createScribe) とCLI(作業ディレクトリ内の scribe.config.ts を自動検出)の両方が、この同じファイルを参照します。
プロジェクト設定
export default defineConfig({
rootDir: ".",
contentDir: "content", // default
store: ".scribe/store.sqlite", // default
assetsDir: "public", // optional
locales: ["en", "fr", "de"],
defaultLocale: "en", // default
localeRouting: { strategy: "path-prefix", prefixDefaultLocale: false },
localeFallbacks: true, // default
localePresets: { active: ["fr"] },
translate: { /* 翻訳ページを参照 */ },
types: [ /* defineContentType(...) */ ],
});
| オプション | デフォルト | 概要 |
|---|---|---|
rootDir | - (必須) | プロジェクトのルートディレクトリ。通常は "." のように相対パスを指定してください。CLIは設定ファイルのあるディレクトリを基準とし、createScribe は process.cwd() を基準にパスを解決します。import.meta.url を使ってパスを組み立てないでください。バンドラーがビルド時にパスをインライン化するため、Vercelのようなサーバーレス環境でエラーが発生します。 |
contentDir | "content" | 各コンテンツタイプのフォルダを格納するディレクトリ。 |
store | ".scribe/store.sqlite" | SQLiteの翻訳ストア。.scribe/ をgitignoreに追加せず、必ずコミットしてください。 |
assetsDir | - | 静的アセットのルートディレクトリ(例: "public")。設定すると、フロントマターや本文で指定された画像パスが実際にディスク上に存在しない場合、scribe validate が警告を出します。 |
locales | - (必須) | デフォルトを含む、サポート対象の全ロケール。 |
defaultLocale | "en" | 正規のソースロケール。locales に含まれている必要があります。 |
localeRouting | path-prefix, unprefixed default | 生成されるURLにおけるロケールマーカーの表示方法。path-prefix はURLの先頭にロケールを付与します(prefixDefaultLocale がtrueでない限り、デフォルトロケールは省略されます)。search-param は、デフォルト以外のロケールに対し ?param=locale を付与します。 |
localeFallbacks | true | ロケールタグからフォールバックのチェーンを導き出します。ドキュメントの翻訳が存在しない地域バリアントには、デフォルトロケールのフォールバックが適用される前に、最も近いベース言語の翻訳が提供されます(例: pt-BR は pt にフォールバックします)。無効にする場合は false を設定します。詳細はロケールフォールバックチェーンをご覧ください。 |
localePresets | - | scribe translate --preset name コマンド用の名前付きロケールグループ。 |
translate | - | プロジェクト全体の翻訳のデフォルト設定(翻訳)。 |
types | - (必須) | コンテンツタイプの定義。 |
設定内容は事前に検証されます。未知の defaultLocale、タイプIDの重複、あるいは不正な path テンプレートがある場合は、明確なメッセージとともに即座にエラーがスローされます。
コンテンツタイプ設定
defineContentType({
id: "blog",
schema: blogSchema,
path: "/blog/{slug}",
contentDir: "blog", // default: the id
slugStrategy: "localized", // default: "fixed"
indexFallback: "en", // default: "en" if path is set, else "none"
orderBy: "-publishedAt", // default: "slug"
label: "Blog", // default: capitalized id (studio UI only)
crossValidate: (data, ctx) => [],
translate: { /* タイプごとのオーバーライド */ },
})
| オプション | 概要 |
|---|---|
id | 一意のID。型付けされたアクセサー(scribe.blog)およびデフォルトの contentDir になります。 |
schema | フロントマター用のZodオブジェクトスキーマ。フィールドマーカー(後述)を使用します。 |
path | 1つの {slug} を含むURLテンプレート(例: /blog/{slug})。独自のページを持たない参照専用のタイプ(著者、カテゴリなど)の場合は省略します。 |
contentDir | プロジェクトの contentDir 内にある、このタイプの .mdx ファイルを格納するフォルダ。 |
slugStrategy | "fixed" を指定すると、すべてのロケールで英語のslugが使用されます。"localized" を指定すると、翻訳者がロケールごとのslugを生成します(/fr/blog/bonjour-le-monde)。 |
indexFallback | ロケールに翻訳がない場合に resolve() が返す内容。"en" を指定すると英語のドキュメント(actualLocale: "en")を提供し、"none" の場合は何も返しません。 |
orderBy | list() のデフォルトのソート順。"slug"、"publishedAt"、"-publishedAt"、"updatedAt"、"-updatedAt"、または完全な型付けが施されたドキュメントに対する比較関数 (a, b) => number を指定します。 |
crossValidate | パース済みの(型付けされた)フロントマターを受け取り、scribe validate が実行する追加の検証。{ field, message, level }[] を返します。 |
translate | コンテンツタイプごとの翻訳プロンプト、ルール、またはモデル(翻訳)。 |
フィールドマーカー
すべてのスキーマフィールドは3つのうちいずれかの種類に分類されます。マーカーが付いていないフィールドは、デフォルトで structural と見なされます。
import { field } from "scribe-cms";
const schema = z.object({
// 翻訳者に送信され、ロケールごとに保存されます:
title: field.translatable(z.string().min(1)),
// 英語専用。英語のドキュメントからすべてのロケールにコピーされます:
heroImage: field.structural(z.string().optional()),
// 別のコンテンツタイプへの英語のslugによる参照:
author: field.relation("author"),
relatedPosts: field.relation("blog", { multiple: true, max: 4, optional: true }),
});
翻訳可能なマーカーは、通常の配列やオブジェクト内にネストされたフィールド(例: sections.*.title)にも適用できます。ただし、包含する配列を field.structural でラップしないようにしてください。ラップすると、サブツリー全体が英語専用になってしまいます。
field.relation(typeId, options?)
| オプション | デフォルト | 概要 |
|---|---|---|
multiple | false | フィールドがslugの配列になります。 |
optional | false | フィールドの省略を許可します。その場合、related() は null を返すか(単一の場合)、存在しないアイテムをスキップします(複数の場合)。 |
min / max | - | アイテム数の制限(multiple: true の場合のみ)。 |
制約事項は、Zodのメソッドチェーンではなくオプションオブジェクト内で設定します。メソッドチェーン(.max(8) や .optional() など)を使うとスキーマが複製され、リレーションのメタデータが欠落してしまいます。
リレーションは常に英語のslugを保存し、scribe validate によってチェックされます(必須リレーションのリンク切れはビルドをブロックするエラーとなり、任意リレーションのリンク切れは警告となります)。実行時には related() によって参照が解決されます。詳細はランタイムAPIをご覧ください。
ロケールフォールバックチェーン
デフォルトでは、ドキュメントの翻訳が存在しない地域ロケールに対しては、デフォルトロケールよりも先にベース言語が提供されます。各ロケールは、自身のタグのプレフィックスを短い順に locales から探し出します。したがって、fr-CA は fr にフォールバックし、zh-Hant-TW は zh-Hant、そして zh の順にフォールバックを試みます。この機能を無効にするには localeFallbacks: false を設定してください。デフォルトロケールは決してチェーンの一部にはならず、タイプの indexFallback によって管理される最終的なフォールバック先として機能します。
フォールバックは resolve() (提供されたロケールは actualLocale で報告され、slugのリダイレクトにはフォールバックロケールのslugが使用されます)および staticParams() (事前レンダリングされるslugは resolve() が提供するものと一致します)に適用されます。一方で、get()、list()、translation()、alternates()、およびサイトマップにはあえて適用されず、これらは完全一致を維持します。
クライアント型の定義
アプリ側で使用する型エイリアスについては、以下のようにすべて設定ファイルから導出します。
import type { ScribeClient, ScribeDocs } from "scribe-cms/runtime";
import config from "./scribe.config";
type MyScribe = ScribeClient<typeof config>;
type BlogDoc = ScribeDocs<typeof config>["blog"];