コンテンツにスキップ
星罗
検索
言語を切り替え
戻る

国際化

2 分で読了 GitHub で編集

Xingluo は中英二カ国語の UI サポートを備え、prefixDefaultLocale: false ルーティング戦略を使用して、デフォルト言語に URL プレフィックスが付かないようにしています。

ルーティング戦略

Astro の i18n 設定(astro.config.ts を参照):

ts
i18n: { locales: ["zh-cn", "en"], defaultLocale: "zh-cn", routing: { prefixDefaultLocale: false }, }

重要:prefixDefaultLocale: false はローカライズされたページコピーを自動生成しません — [locale]/ ミラールートを手動で維持する必要があります。

Xingluo のアプローチ:

  • ルートページ = デフォルト言語(zh-cn)、URL プレフィックスなし(例:/posts/welcome/)
  • src/pages/[locale]/ が全ページをミラーリング。getStaticPaths は getLocaleParams() を使用して非デフォルトロケールのみを生成(例:/en/posts/welcome/)
  • ミラーページも薄いラッパーであり、同じ View コンポーネントをレンダリングロジックに再利用
/ → ホーム (zh-cn) /en/ → ホーム (en) /posts/welcome/ → 投稿 (zh-cn) /en/posts/welcome/ → 投稿 (en)

Locale 解決

View コンポーネントは Astro.currentLocale を自動解決に使用します:

  • ルートページ → zh-cn
  • [locale] セグメントページ → en(またはその他の非デフォルトロケール)

コンポーネント層でのパスチェックは不要です。useTranslations(locale) が対応する文字列を直接取得します。

i18n モジュール構造

src/i18n/:

ファイル責務
index.tsimport.meta.glob("./lang/*.ts", {eager:true}) が言語をロード。DEFAULT_LOCALE、LOCALES、useTranslations(locale)、tplStr をエクスポート
types.ts完全な UIStrings インターフェース(ローカライズする全文字列)
routing.tsgetLocalePrefix、withLocale(path, locale)、parseLocaleFromPath(pathname)
staticPaths.tsNON_DEFAULT_LOCALES、getLocaleParams()
format.tstplStr(template, vars) — {{key}} プレースホルダー置換
lang/zh-cn.ts簡体字中国語(デフォルト)
lang/en.ts英語

UIStrings 構造

UIStrings インターフェースは、ローカライズするすべての UI 文字列をグループ化して定義します:

  • nav: ナビゲーション(home/posts/tags/about/archives/search/rss)
  • post: 投稿(日付、共有、タグ、戻る、編集、目次、コードコピー、画像ライトボックスなど)
  • pagination: ページネーション
  • home: ホームページ(ソーシャルリンク、注目、最新)
  • archives: アーカイブ(カウント、月)
  • footer: フッター(著作権)
  • pages: ページタイトルと説明
  • a11y: アクセシビリティラベル
  • languageSwitcher: 言語切り替え
  • notFound: 404
  • comments: コメントセクション

テンプレート文字列

プレースホルダー付きの文字列は {{key}} を使用し、tplStr で置換されます:

ts
import { tplStr } from "@/i18n"; // archives.postCount = "{{count}} posts" tplStr(t.archives.postCount, { count: 5 }); // "5 posts"

SEO 多言語宣言

Layout.astro の head が出力:

  • 各言語の <link rel="alternate" hreflang="..." href="...">
  • x-default はデフォルト言語を指す
  • sitemap 統合が i18n 設定を有効にして hreflang を自動生成
  • 非デフォルトロケールの投稿は canonical がデフォルトロケールのオリジナルを指す(重複コンテンツペナルティを回避。詳細は SEO を参照)

言語の追加

例:日本語 ja を追加する場合:

  1. astro.config.ts:i18n.locales に "ja" を追加し、sitemap i18n.locales に "ja": "ja-JP" マッピングを追加
  2. src/i18n/lang/:完全な UIStrings をエクスポートする ja.ts を作成(en.ts をコピーして翻訳)
  3. src/i18n/staticPaths.ts:NON_DEFAULT_LOCALES が自動的に ja を含める(LOCALES から計算)
  4. src/pages/[locale]/:ミラーページが自動的に ja バージョンを生成(getLocaleParams がカバー)
  5. 言語切り替え:zh-cn.ts と en.ts の languageSwitcher.names に "ja": "日本語" を追加

コンテンツレベルの翻訳

Xingluo は locale と translationKey のフロントマターフィールドを介して、投稿の多言語コンテンツをサポートします。

基本的な使い方

  1. デフォルト言語の投稿:src/content/posts/<slug>.md に配置し、translationKey をグループ識別子として設定:
yaml
# src/content/posts/welcome.md --- title: "欢迎来到星罗" locale: zh-cn translationKey: welcome-to-xingluo tags: [公告, Astro] ---
  1. 翻訳:言語サブディレクトリ src/content/posts/<locale>/<slug>.md に配置し、同じ translationKey を使用:
yaml
# src/content/posts/en/welcome.md --- title: "Welcome to Xingluo" locale: en translationKey: welcome-to-xingluo tags: [announcement, Astro] ---

ディレクトリ構造

src/content/posts/ ├── welcome.md # デフォルト言語 (zh-cn) ├── en/ │ └── welcome.md # 英語翻訳 ├── ja/ │ └── welcome.md # 日本語翻訳 └── another-post.md # 独立した投稿 (translationKey なし)
  • 言語サブディレクトリ名は astro.config.ts の i18n.locales の言語コードと一致する必要があります
  • 言語サブディレクトリは URL スラッグからフィルタリングされます(例:/posts/welcome/、/posts/en/welcome/ ではありません)
  • translationKey のない投稿は独立しており、言語間でリンクされません

ルーティング動作

シナリオ動作
デフォルトロケールでの zh-cn 投稿へのアクセスデフォルト言語のオリジナルをレンダリング
翻訳がある非デフォルトロケール対応する翻訳をレンダリング
翻訳がない非デフォルトロケールデフォルト言語のオリジナルにフォールバック(同一コンテンツ、canonical が SEO を保護)

リストの重複排除

リストページ(ホーム、投稿リスト、タグ、アーカイブ、RSS)は getPostsForLocale を使用して言語ごとに代表投稿を選択します。各翻訳グループは対象言語のカードを1つだけ表示し、同じトピックの重複エントリを防ぎます。

canonical と SEO

  • 独立した翻訳がある場合:canonical は翻訳自身の URL を指し、検索エンジンが個別にインデックス可能
  • 翻訳がない場合(フォールバック):canonical はデフォルト言語のオリジナルを指し、重複コンテンツペナルティを回避
  • hreflang 宣言が全言語をカバーし、言語バージョン間の関係を検索エンジンに伝達

詳細は SEO を参照。


関連記事

  • デプロイ

    1 分で読了

    Xingluo デプロイガイド。静的ホスティングプラットフォーム(Netlify/Vercel/GitHub Pages)、Nginx セルフホスティング、Docker、環境変数をカバーします。

  • 検索

    1 分で読了

    Xingluo の検索ガイド。Flexsearch 全文検索の統合、インデックス生成、UI、多言語検索、パフォーマンスをカバーします。