コンテンツにスキップ

Astro: はじめに

ターミナルウィンドウ
vp add @lingui/core lingui-for-astro
vp add -D @lingui/cli @lingui/conf unplugin-lingui-macro
astro.config.ts
import { defineConfig } from "astro/config";
import linguiForAstro from "lingui-for-astro/integration";
import linguiMacro from "unplugin-lingui-macro/vite";
export default defineConfig({
integrations: [linguiForAstro()],
vite: {
plugins: [linguiMacro()],
},
});
lingui.config.ts
import babelExtractor from "@lingui/cli/api/extractors/babel";
import { defineConfig } from "lingui-for-astro/config";
import { astroExtractor } from "lingui-for-astro/extractor";
export default defineConfig({
locales: ["en", "ja"],
sourceLocale: "en",
catalogs: [{ path: "src/lib/i18n/locales/{locale}" }],
extractors: [astroExtractor, babelExtractor],
});

カスタムのマクロパッケージ名、空白処理、実行時警告の切り替えなど、Astro 固有のオプションが必要な場合は、framework.astro フィールドを設定してください。 詳細は フレームワーク設定 を参照してください。

serverhybrid 出力では、ページが描画される前にミドルウェアから setLinguiContext を呼びます。 ここで、そのリクエスト向けのコンパイル済みカタログを読み込みます。

src/middleware.ts
import { defineMiddleware } from "astro:middleware";
import { setupI18n } from "@lingui/core";
import { setLinguiContext } from "lingui-for-astro";
import { catalog } from "./lib/i18n/catalog";
export const onRequest = defineMiddleware((context, next) => {
const locale = resolveLocale(context); // 独自のロケール解決ロジック
const i18n = setupI18n({ locale, messages: catalog });
setLinguiContext(context.locals, i18n);
return next();
});
src/pages/index.astro
---
import { Trans, t } from "lingui-for-astro/macro";
---
<h1>{t`Hello from Astro`}</h1>
<p><Trans>Macro-first translation in Astro</Trans></p>
  • Astro.locals が i18n インスタンスをどう保持するか、静的サイトとリクエスト依存の初期化がどう違うか、手動でどうアクセスするかは i18n コンテキスト を参照してください。
  • クライアントフレームワークのアイランドで翻訳が必要なら アイランドを使う を参照してください。
  • サーバーと実行時の境界については Astro の注意点 を参照してください。