ブログ

Astro Starlight + LunariaJS:完璧な多言語ドキュメントサイトを構築

LunariaJSをAstro Starlightドキュメントサイトに統合する方法をステップバイステップで解説。インストール設定からダッシュボード埋め込みまで、多言語対応で翻訳進捗を可視化追跡できるプロフェッショナルなドキュメントサイトを構築します。

LibDoc Team 2026年3月6日 LunariaJS 連載 69 分で読める
#LunariaJS #Astro #Starlight #ドキュメントサイト #多言語

Astro Starlight + LunariaJS:完璧な多言語ドキュメントサイトを構築

これまでの記事で、LunariaJSのコア機能とGitワークフロー統合を学びました。今日は、LunariaJSとAstro Starlightの完璧な組み合わせについて解説し、プロフェッショナルな多言語ドキュメントサイトをゼロから構築する方法をステップバイステップで学びましょう。

💡 公式ドキュメントLunariaJS 日本語ドキュメント - Starlight統合

Starlightとは?

Astro Starlightの概要

Astro StarlightはAstroフレームワークをベースに構築されたモダンなドキュメントテーマで、以下を提供:

特徴説明
🚀 最高のパフォーマンスAstroのパーシャルハイドレーションで、ページ読み込みが超高速
🎨 美しいデザインそのまま使えるプロフェッショナルなドキュメントUI
📱 レスポンシブデスクトップとモバイルデバイスに完璧に対応
🔍 組み込み検索Pagefindによる全文検索
🌙 ダークモードシステム設定を自動検出
🌐 国際化ネイティブ多言語サポート

なぜLunariaJSが必要?

Starlightは国際化(i18n)サポートを提供しますが、翻訳管理機能は含まれていません

要件Starlight+ LunariaJS
多言語ルーティング
言語切り替え
翻訳UIコンポーネント
翻訳状態追跡
可視化ダッシュボード
Gitワークフロー統合

LunariaJSはStarlightの翻訳管理における空白を埋めます

@lunariajs/starlightのインストール

前提条件

プロジェクトが以下の条件を満たしていることを確認:

  • Astro 4.0+ または 5.0+
  • Starlightがインストール済み
  • プロジェクトがGitでバージョン管理されている

インストール手順

1. 依存関係をインストール

# npmを使用
npm install @lunariajs/starlight

# yarnを使用
yarn add @lunariajs/starlight

# pnpmを使用
pnpm add @lunariajs/starlight

2. バージョンの互換性を確認

# インストール済みバージョンを確認
npm list @astrojs/starlight @lunariajs/starlight

バージョンの互換性を確保:

@astrojs/starlight@lunariajs/starlight
0.25.x0.4.x
0.26.x+0.5.x+

Starlight設定との統合

基本設定

astro.config.mjsでLunariaJS統合を追加:

// astro.config.mjs
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
import lunaria from '@lunariajs/starlight';

export default defineConfig({
  integrations: [
    starlight({
      title: 'My Documentation',
      defaultLocale: 'en',
      locales: {
        en: { label: 'English' },
        'zh-cn': { label: '简体中文' },
        ja: { label: '日本語' },
        ko: { label: '한국어' },
      },
      sidebar: [
        { label: 'Guide', link: '/guide/' },
        { label: 'Reference', link: '/reference/' },
      ],
    }),
    lunaria({
      // LunariaJS設定
      sourceLanguage: 'en',
      languages: ['en', 'zh-cn', 'ja', 'ko'],
    }),
  ],
});

i18n設定とLunariaJSの同期

Starlightのi18n設定とLunariaJSを一貫させる:

// astro.config.mjs
const languages = ['en', 'zh-cn', 'ja', 'ko'];
const sourceLanguage = 'en';

export default defineConfig({
  integrations: [
    starlight({
      title: 'My Documentation',
      defaultLocale: sourceLanguage,
      locales: Object.fromEntries(
        languages.map(lang => [
          lang,
          { label: getLanguageLabel(lang) }
        ])
      ),
    }),
    lunaria({
      sourceLanguage,
      languages,
    }),
  ],
});

function getLanguageLabel(lang) {
  const labels = {
    en: 'English',
    'zh-cn': '简体中文',
    ja: '日本語',
    ko: '한국어',
  };
  return labels[lang] || lang;
}

ルーティング構造設計

Starlight + LunariaJSの推奨ディレクトリ構造:

src/
└── content/
    └── docs/
        ├── en/                    # 英語(ソース言語)
        │   ├── index.md
        │   ├── guide.md
        │   └── reference.md
        ├── zh-cn/                 # 中国語翻訳
        │   ├── index.md
        │   ├── guide.md
        │   └── reference.md
        ├── ja/                    # 日本語翻訳
        │   └── ...
        └── ko/                    # 韓国語翻訳
            └── ...

完全設定例

// astro.config.mjs
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
import lunaria from '@lunariajs/starlight';

// 言語設定
const config = {
  sourceLanguage: 'en',
  languages: ['en', 'zh-cn', 'ja', 'ko'],
  languageLabels: {
    en: 'English',
    'zh-cn': '简体中文',
    ja: '日本語',
    ko: '한국어',
  },
};

export default defineConfig({
  site: 'https://docs.example.com',
  integrations: [
    starlight({
      title: 'My Project',
      defaultLocale: config.sourceLanguage,
      locales: Object.fromEntries(
        config.languages.map(lang => [
          lang,
          { label: config.languageLabels[lang] }
        ])
      ),
      sidebar: {
        en: [
          { label: 'Home', link: '/' },
          { label: 'Guide', link: '/guide/' },
          { label: 'API Reference', link: '/reference/' },
        ],
        'zh-cn': [
          { label: '首页', link: '/' },
          { label: '指南', link: '/guide/' },
          { label: 'API 参考', link: '/reference/' },
        ],
        ja: [
          { label: 'ホーム', link: '/' },
          { label: 'ガイド', link: '/guide/' },
          { label: 'API リファレンス', link: '/reference/' },
        ],
        ko: [
          { label: '홈', link: '/' },
          { label: '가이드', link: '/guide/' },
          { label: 'API 참조', link: '/reference/' },
        ],
      },
      social: {
        github: 'https://github.com/your-org/your-repo',
      },
    }),
    lunaria({
      sourceLanguage: config.sourceLanguage,
      languages: config.languages,
      files: [
        {
          sourcePath: 'src/content/docs/{lang}/{slug}.md',
          localizationPath: 'src/content/docs/{lang}/{slug}.md',
        },
      ],
      dashboard: {
        outputDir: 'public/i18n-status',
        title: 'My Project - Translation Status',
      },
    }),
  ],
});

ダッシュボードの埋め込み

方法1:独立パスとして

LunariaJSダッシュボードを/i18n-status/パスに配置:

// astro.config.mjs
lunaria({
  dashboard: {
    outputDir: 'public/i18n-status',
  },
})

ビルド後、/i18n-status/にアクセスしてダッシュボードを確認できます。

方法2:ナビゲーションメニューに追加

Starlightナビゲーションにダッシュボードリンクを追加:

// astro.config.mjs
starlight({
  title: 'My Documentation',
  sidebar: [
    { label: 'Guide', link: '/guide/' },
    { label: 'Reference', link: '/reference/' },
    {
      label: 'Translation Status',
      link: '/i18n-status/',
      badge: 'New',
    },
  ],
})

方法3:カスタムナビゲーションコンポーネント

翻訳進捗を表示するカスタムナビゲーションコンポーネントを作成:

---
// src/components/I18nStatus.astro
---
<a href="/i18n-status/" class="i18n-status-link">
  <span class="icon">🌐</span>
  <span>Translation Status</span>
</a>

<style>
  .i18n-status-link {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 1rem;
    background: var(--sl-color-bg);
    border-radius: 0.5rem;
    text-decoration: none;
    color: var(--sl-color-text);
    transition: background 0.2s;
  }

  .i18n-status-link:hover {
    background: var(--sl-color-bg-hover);
  }
</style>

スタイルのカスタマイズ

LunariaJSダッシュボードのデフォルトスタイルを上書き:

/* src/styles/lunaria-custom.css */
:root {
  /* Starlightのカラー変数を使用 */
  --lunaria-color-primary: var(--sl-color-accent);
  --lunaria-color-success: var(--sl-color-green);
  --lunaria-color-warning: var(--sl-color-orange);
  --lunaria-color-danger: var(--sl-color-red);

  /* 背景色 */
  --lunaria-bg-primary: var(--sl-color-bg);
  --lunaria-bg-secondary: var(--sl-color-bg-sidebar);
}

設定で参照:

// astro.config.mjs
lunaria({
  dashboard: {
    customCss: './src/styles/lunaria-custom.css',
  },
})

実践:3言語ドキュメントサイトの構築

完全な実践例で、中国語、日本語、韓国語をサポートする3言語ドキュメントサイトを構築します。

ステップ1:Starlightプロジェクトを作成

# テンプレートでプロジェクトを作成
npm create astro@latest -- --template starlight

# プロジェクトディレクトリに移動
cd my-docs

# 依存関係をインストール
npm install

ステップ2:LunariaJSをインストール

npm install @lunariajs/starlight

ステップ3:多言語を設定

astro.config.mjsを編集:

import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
import lunaria from '@lunariajs/starlight';

export default defineConfig({
  integrations: [
    starlight({
      title: 'My Project Docs',
      defaultLocale: 'en',
      locales: {
        en: { label: 'English', lang: 'en' },
        'zh-cn': { label: '简体中文', lang: 'zh-CN' },
        ja: { label: '日本語', lang: 'ja' },
        ko: { label: '한국어', lang: 'ko' },
      },
      sidebar: {
        en: [
          { label: 'Home', link: '/' },
          { label: 'Getting Started', items: [
            { label: 'Introduction', link: '/getting-started/' },
            { label: 'Installation', link: '/installation/' },
          ]},
        ],
        'zh-cn': [
          { label: '首页', link: '/' },
          { label: '快速开始', items: [
            { label: '简介', link: '/getting-started/' },
            { label: '安装', link: '/installation/' },
          ]},
        ],
        ja: [
          { label: 'ホーム', link: '/' },
          { label: 'はじめに', items: [
            { label: '概要', link: '/getting-started/' },
            { label: 'インストール', link: '/installation/' },
          ]},
        ],
        ko: [
          { label: '홈', link: '/' },
          { label: '시작하기', items: [
            { label: '소개', link: '/getting-started/' },
            { label: '설치', link: '/installation/' },
          ]},
        ],
      },
    }),
    lunaria({
      sourceLanguage: 'en',
      languages: ['en', 'zh-cn', 'ja', 'ko'],
    }),
  ],
});

ステップ4:コンテンツファイルを作成

src/content/docs/
├── en/
│   ├── index.md
│   ├── getting-started.md
│   └── installation.md
├── zh-cn/
│   ├── index.md
│   └── getting-started.md      # インストールドキュメントはまだ翻訳されていないと仮定
├── ja/
│   ├── index.md
│   └── getting-started.md
└── ko/
    └── index.md                 # 他のドキュメントはまだ翻訳されていない

ステップ5:翻訳メタデータを追加

各Markdownファイルにはfrontmatterを含める:

---
title: Getting Started
description: Learn how to get started with our project.
---

# Getting Started

Welcome to our project! This guide will help you...

ステップ6:ビルドしてプレビュー

# サイトとダッシュボードをビルド
npm run build

# プレビュー
npm run preview

アクセス:

  • ドキュメントサイト:http://localhost:4321/
  • 翻訳ダッシュボード:http://localhost:4321/i18n-status/

ステップ7:翻訳状態を確認

ダッシュボードを開くと、以下のような表示が見られます:

Translation Status
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Language         Progress    Status
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🇺🇸 English       100%        Source
🇨🇳 简体中文       67%         2/3 done, 1 missing
🇯🇵 日本語         67%         2/3 done, 1 missing
🇰🇷 한국어          33%         1/3 done, 2 missing
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

よくある問題と解決策

Q1:ダッシュボード404エラー

問題/i18n-status/にアクセスすると404。

解決策

# LunariaJS設定の出力ディレクトリがpublic/ディレクトリ以下であることを確認
lunaria({
  dashboard: {
    outputDir: 'public/i18n-status',  // public/ディレクトリ以下である必要があります
  },
})

# 先にビルドを実行
npm run build

Q2:言語コードが一致しない

問題:Starlightはzh-CNを使用、LunariaJSはzh-cnを使用。

解決策

starlight({
  locales: {
    'zh-cn': { label: '简体中文', lang: 'zh-CN' },  // 注意して区別
  },
})

Q3:ダッシュボードスタイルの競合

問題:ダッシュボードスタイルがドキュメントサイトと一致しない。

解決策:カスタムCSSで統一スタイルを使用:

/* lunariaダッシュボードでStarlight変数を使用 */
:root {
  --lunaria-color-primary: var(--sl-color-accent);
  --lunaria-bg-primary: var(--sl-color-bg);
}

Q4:ビルド時のメモリ不足

問題:大規模ドキュメントサイトのビルド時にメモリ不足。

解決策

# Node.jsのメモリ制限を増加
NODE_OPTIONS="--max-old-space-size=4096" npm run build

Q5:ルーティング競合

問題:ダッシュボードパスがドキュメントパスと競合。

解決策:ドキュメントと競合しないパスを選択:

// /docs/、/guide/などの一般的なドキュメントパスを避ける
lunaria({
  dashboard: {
    outputDir: 'public/localization-status',  // ユニークなパスを使用
  },
})

ベストプラクティス

1. 言語設定を統一

共有設定ファイルを作成:

// src/i18n-config.js
export const languages = ['en', 'zh-cn', 'ja', 'ko'];
export const sourceLanguage = 'en';
export const languageLabels = {
  en: 'English',
  'zh-cn': '简体中文',
  ja: '日本語',
  ko: '한국어',
};

複数箇所で参照:

// astro.config.mjs
import { languages, sourceLanguage, languageLabels } from './src/i18n-config.js';

2. 翻訳チェックの自動化

package.jsonにスクリプトを追加:

{
  "scripts": {
    "dev": "astro dev",
    "build": "astro build",
    "preview": "astro preview",
    "i18n:check": "lunaria build",
    "i18n:preview": "lunaria preview"
  }
}

3. 翻訳ガイドを追加

ドキュメントに翻訳貢献ガイドを追加:

# Contributing Translations

We welcome translation contributions! Here's how to help:

1. Check the [Translation Status Dashboard](/i18n-status/)
2. Find a file marked as "missing" or "outdated"
3. Fork the repository and create a translation
4. Submit a pull request

Thank you for helping make our documentation accessible to everyone!

4. CI/CDチェックを設定

# .github/workflows/i18n-check.yml
name: i18n Status

on: [pull_request]

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: actions/setup-node@v4
        with:
          node-version: '20'

      - run: npm ci
      - run: npm run i18n:check

      - name: Upload Dashboard
        uses: actions/upload-artifact@v4
        with:
          name: i18n-dashboard
          path: public/i18n-status/

まとめ

LunariaJSとAstro Starlightの統合は完全な多言語ドキュメントソリューションを提供します:

機能Starlight+ LunariaJS
多言語ルーティング
言語切り替え
翻訳UI
翻訳状態追跡
可視化ダッシュボード
Gitワークフロー

重要なポイント

  • @lunariajs/starlightパッケージでシームレスな統合を実現
  • StarlightとLunariaJS間で言語コードを一貫させる
  • ダッシュボードをナビゲーションメニューに埋め込んでアクセスしやすく
  • 設定ファイルを統一して重複メンテナンスを回避

次のステップ

次の記事では、LunariaJSのCI/CD統合について解説し、以下を学びます:

  • GitHub Actions自動ビルドの設定
  • 翻訳状態チェックパイプラインの設計
  • 通知とレポートメカニズムの設定
  • 継続的ローカライズワークフローの実装

お楽しみに!


💡 おすすめ読書