ブログ
LunariaJS究極の実践:エンタープライズレベルの多言語ドキュメントプラットフォームを構築
本シリーズで学んだ知識を総合的に活用し、ゼロから完全なエンタープライズレベルの多言語ドキュメントプラットフォームを構築します。プロジェクト計画、アーキテクチャ設計、完全な設定、CI/CD統合、チームコラボレーションなど、すべての工程を網羅します。
LibDoc Team 2026年3月6日 LunariaJS 連載 113 分で読める
#LunariaJS
#エンタープライズ
#実践
#多言語ドキュメント
#完全ガイド
LunariaJS究極の実践:エンタープライズレベルの多言語ドキュメントプラットフォームを構築
LunariaJSシリーズの9つの記事を完走おめでとうございます!今日は、学んだすべての知識を総合的に活用し、ゼロから完全なエンタープライズレベルの多言語ドキュメントプラットフォームを構築します。これは本シリーズの最終章であり、あなたの学習成果を検証する最高の実践です。
💡 公式ドキュメント:LunariaJS 日本語ドキュメント
プロジェクト計画
要件分析
プロジェクト背景:オープンソースプロジェクト用の多言語ドキュメントサイトを構築する必要があり、以下の要件があります:
| 要件 | 説明 | 優先度 |
|---|---|---|
| 多言語サポート | 中国語、日本語、韓国語の4言語をサポート | 高 |
| 翻訳状態の可視化 | 翻訳進捗をリアルタイムで追跡 | 高 |
| チームコラボレーション | コミュニティ貢献者が翻訳に参加可能 | 高 |
| 自動化 | CI/CDで自動ビルドとデプロイ | 中 |
| パフォーマンス最適化 | 高速な読み込みと応答 | 中 |
| SEO最適化 | 検索エンジンフレンドリー | 中 |
技術選定
要件分析に基づき、以下の技術スタックを選択:
| 技術 | 用途 | 選択理由 |
|---|---|---|
| Astro 5.0 | フレームワーク | 高パフォーマンス、SEOフレンドリー |
| Starlight | ドキュメントテーマ | すぐに使えるドキュメントソリューション |
| LunariaJS | 翻訳管理 | Gitベースのワークフロー、可視化ダッシュボード |
| GitHub Actions | CI/CD | GitHubとの深い統合 |
| Vercel | ホスティング | 高速デプロイ、エッジネットワーク |
アーキテクチャ設計
┌─────────────────────────────────────────────────────────────────────┐
│ ユーザー層 │
│ (開発者/貢献者/読者) │
├─────────────────────────────────────────────────────────────────────┤
│ アクセス層 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ ドキュメント │ │ 翻訳ダッシュ │ │ GitHub Repo │ │
│ │ サイト │ │ ボード │ │ │ │
│ │ (Vercel) │ │ (Vercel) │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────────────────┤
│ アプリケーション層 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Astro + Starlight │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ コンテンツ │ │ i18nルート │ │ 検索機能 │ │ │
│ │ │ 管理 │ │ │ │ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ LunariaJS │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ 状態追跡 │ │ ダッシュ │ │ Git統合 │ │ │
│ │ │ │ │ ボード生成 │ │ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────────┤
│ インフラストラクチャ層 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Git │ │ GitHub │ │ CI/CD │ │
│ │ (バージョン │ │ (コードホスト│ │ (自動化) │ │
│ │ 管理) │ │ ) │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
技術スタックの構築
ステップ1:プロジェクトの初期化
# Starlightテンプレートでプロジェクトを作成
npm create astro@latest my-docs -- --template starlight
# プロジェクトディレクトリに移動
cd my-docs
# LunariaJSをインストール
npm install @lunariajs/starlight
# Gitを初期化(まだの場合)
git init
git add .
git commit -m "Initial commit"
ステップ2:Astroを設定
// astro.config.mjs
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
import lunaria from '@lunariajs/starlight';
// 言語設定
const languages = ['en', 'zh-cn', 'ja', 'ko'];
const sourceLanguage = 'en';
const languageLabels = {
en: 'English',
'zh-cn': '简体中文',
ja: '日本語',
ko: '한국어',
};
export default defineConfig({
site: 'https://docs.example.com',
integrations: [
starlight({
title: 'My Project Documentation',
defaultLocale: sourceLanguage,
locales: Object.fromEntries(
languages.map(lang => [
lang,
{ label: languageLabels[lang], lang }
])
),
sidebar: {
en: [
{ label: 'Home', link: '/' },
{
label: 'Getting Started',
items: [
{ label: 'Introduction', link: '/introduction/' },
{ label: 'Installation', link: '/installation/' },
{ label: 'Quick Start', link: '/quick-start/' },
],
},
{
label: 'Guides',
items: [
{ label: 'Configuration', link: '/guides/configuration/' },
{ label: 'Deployment', link: '/guides/deployment/' },
],
},
{
label: 'Reference',
items: [
{ label: 'API', link: '/reference/api/' },
{ label: 'CLI', link: '/reference/cli/' },
],
},
],
'zh-cn': [
{ label: '首页', link: '/' },
{
label: '快速开始',
items: [
{ label: '简介', link: '/introduction/' },
{ label: '安装', link: '/installation/' },
{ label: '快速上手', link: '/quick-start/' },
],
},
{
label: '指南',
items: [
{ label: '配置', link: '/guides/configuration/' },
{ label: '部署', link: '/guides/deployment/' },
],
},
{
label: '参考',
items: [
{ label: 'API', link: '/reference/api/' },
{ label: 'CLI', link: '/reference/cli/' },
],
},
],
ja: [
{ label: 'ホーム', link: '/' },
{
label: 'はじめに',
items: [
{ label: '概要', link: '/introduction/' },
{ label: 'インストール', link: '/installation/' },
{ label: 'クイックスタート', link: '/quick-start/' },
],
},
{
label: 'ガイド',
items: [
{ label: '設定', link: '/guides/configuration/' },
{ label: 'デプロイ', link: '/guides/deployment/' },
],
},
{
label: 'リファレンス',
items: [
{ label: 'API', link: '/reference/api/' },
{ label: 'CLI', link: '/reference/cli/' },
],
},
],
ko: [
{ label: '홈', link: '/' },
{
label: '시작하기',
items: [
{ label: '소개', link: '/introduction/' },
{ label: '설치', link: '/installation/' },
{ label: '빠른 시작', link: '/quick-start/' },
],
},
{
label: '가이드',
items: [
{ label: '설정', link: '/guides/configuration/' },
{ label: '배포', link: '/guides/deployment/' },
],
},
{
label: '참조',
items: [
{ label: 'API', link: '/reference/api/' },
{ label: 'CLI', link: '/reference/cli/' },
],
},
],
},
social: {
github: 'https://github.com/your-org/your-repo',
},
head: [
{ tag: 'meta', attrs: { name: 'theme-color', content: '#6366f1' } },
],
}),
lunaria({
sourceLanguage,
languages,
files: [
{
sourcePath: 'src/content/docs/{lang}/{slug}.md',
localizationPath: 'src/content/docs/{lang}/{slug}.md',
},
],
dashboard: {
outputDir: 'public/i18n-status',
title: 'Translation Status',
description: 'Track the progress of documentation translations',
},
}),
],
});
多言語コンテンツの組織化
ディレクトリ構造
src/content/docs/
├── en/ # 英語(ソース言語)
│ ├── index.md
│ ├── introduction.md
│ ├── installation.md
│ ├── quick-start.md
│ ├── guides/
│ │ ├── configuration.md
│ │ └── deployment.md
│ └── reference/
│ ├── api.md
│ └── cli.md
├── zh-cn/ # 中国語翻訳
│ ├── index.md
│ ├── introduction.md
│ ├── installation.md
│ ├── quick-start.md
│ ├── guides/
│ │ └── configuration.md # deployment.mdはまだ翻訳されていないと仮定
│ └── reference/
│ └── api.md
├── ja/ # 日本語翻訳
│ ├── index.md
│ ├── introduction.md
│ └── installation.md
└── ko/ # 韓国語翻訳
└── index.md
コンテンツテンプレート
---
# src/content/docs/en/introduction.md
title: Introduction
description: Get started with My Project and learn about its core concepts.
---
# Introduction
Welcome to **My Project**! This guide will help you understand the fundamentals.
## What is My Project?
My Project is a powerful tool that helps you...
## Key Features
- **Feature 1**: Description of feature 1
- **Feature 2**: Description of feature 2
- **Feature 3**: Description of feature 3
## Who Should Use This?
My Project is perfect for:
1. Developers building modern applications
2. Teams working on large-scale projects
3. Anyone who values performance and DX
## Next Steps
Ready to get started? Check out our [Installation Guide](/installation/).
翻訳版の例:
---
# src/content/docs/ja/introduction.md
title: 概要
description: My Projectを始め、そのコア概念を学びましょう。
---
# 概要
**My Project**へようこそ!このガイドでは基本を理解するのにお手伝いします。
## My Projectとは?
My Projectは、...を助ける強力なツールです。
## 主な機能
- **機能1**: 機能1の説明
- **機能2**: 機能2の説明
- **機能3**: 機能3の説明
## 誰が使うべき?
My Projectは以下の方に最適です:
1. モダンなアプリケーションを構築する開発者
2. 大規模プロジェクトに取り組むチーム
3. パフォーマンスとDXを重視するすべての人
## 次のステップ
始める準備はできましたか?[インストールガイド](/installation/)をご覧ください。
CI/CD完全パイプライン
GitHub Actionsワークフロー
# .github/workflows/ci.yml
name: CI/CD Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:
env:
NODE_VERSION: '20'
jobs:
# ジョブ1: コードチェック
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run linters
run: npm run lint
- name: Check formatting
run: npm run format:check
# ジョブ2: ビルドチェック
build:
name: Build
runs-on: ubuntu-latest
needs: lint
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0 # LunariaJS用に完全な履歴を取得
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build Astro site
run: npm run build
- name: Build Lunaria dashboard
run: npx lunaria build
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: build-output
path: dist/
retention-days: 7
# ジョブ3: 翻訳状態チェック
i18n-check:
name: Translation Check
runs-on: ubuntu-latest
needs: lint
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Check translation status
id: i18n
run: |
npx lunaria build --silent
# 状態レポートを生成
REPORT=$(node scripts/i18n-report.js)
echo "report<<EOF" >> $GITHUB_OUTPUT
echo "$REPORT" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Comment on PR
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const report = `${{ steps.i18n.outputs.report }}`;
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `## 🌙 翻訳状態\n\n${report}`
});
# ジョブ4: デプロイ(mainブランチのみ)
deploy:
name: Deploy
runs-on: ubuntu-latest
needs: [build, i18n-check]
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
permissions:
contents: read
deployments: write
steps:
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
name: build-output
path: dist
- name: Deploy to Vercel
uses: amondnet/vercel-action@v25
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
vercel-args: '--prod'
working-directory: ./
- name: Send deployment notification
if: success()
run: |
curl -X POST "${{ secrets.SLACK_WEBHOOK_URL }}" \
-H 'Content-type: application/json' \
-d '{
"text": "✅ ドキュメントが正常にデプロイされました!",
"attachments": [{
"fields": [
{ "title": "ブランチ", "value": "${{ github.ref_name }}", "short": true },
{ "title": "コミット", "value": "${{ github.sha }}", "short": true }
]
}]
}'
翻訳状態レポートスクリプト
// scripts/i18n-report.js
const fs = require('fs');
const path = require('path');
function generateReport() {
const statusPath = path.join('public', 'i18n-status', 'data', 'status.json');
if (!fs.existsSync(statusPath)) {
return 'No translation status data available.';
}
const status = JSON.parse(fs.readFileSync(statusPath, 'utf8'));
let report = '| 言語 | 完了 | 古い | 欠落 | 進捗 |\n';
report += '|----------|------|----------|---------|----------|\n';
const languages = Object.entries(status.languages);
for (const [lang, data] of languages) {
if (lang === status.sourceLanguage) continue;
const progress = Math.round((data.done / data.total) * 100);
const emoji = progress >= 90 ? '✅' : progress >= 70 ? '⚠️' : '❌';
report += `| ${lang} | ${data.done} | ${data.outdated} | ${data.missing} | ${emoji} ${progress}% |\n`;
}
report += '\n📊 [全ダッシュボードを見る](/i18n-status/)';
return report;
}
console.log(generateReport());
チームコラボレーションワークフロー
翻訳貢献ガイド
TRANSLATING.mdファイルを作成:
# 翻訳ガイド
私たちのドキュメントの翻訳に興味を持っていただきありがとうございます!
## 貢献方法
### 1. 現在の状態を確認
[翻訳状態ダッシュボード](/i18n-status/)で翻訳が必要なファイルを確認してください。
### 2. ファイルをクレーム
開始する前に、誰かが既にそのファイルに取り組んでいないか確認してください:
1. 既存の[Pull Requests](https://github.com/your-org/your-repo/pulls)を検索
2. 誰も作業していない場合は、Issueを作成するかダッシュボードにコメント
### 3. 翻訳
1. リポジトリをFork
2. ブランチを作成:`git checkout -b translate/zh-cn/introduction`
3. ソースファイルをコピー:`cp src/content/docs/en/introduction.md src/content/docs/zh-cn/introduction.md`
4. 内容を翻訳
5. ローカルでテスト:`npm run dev`
### 4. 提出
1. 変更をコミット:`git commit -m "Translate introduction to Chinese"`
2. Forkにプッシュ:`git push origin translate/zh-cn/introduction`
3. Pull Requestを作成
## 翻訳ガイドライン
- **フォーマットを保持**:Markdown構文をそのまま維持
- **コード例を維持**:通常、コードは翻訳不要
- **一貫性**:一貫した用語を使用
- **コンテキストを追加**:難しい用語にはコメントを追加
## ヘルプが必要?
[Discord](https://discord.gg/example)に参加し、#translationsチャンネルで質問してください。
PRテンプレート
.github/pull_request_template.mdを作成:
## 説明
<!-- 変更内容を記述してください -->
## 変更タイプ
- [ ] 📝 ドキュメント更新
- [ ] 🌐 翻訳
- [ ] ✨ 新機能
- [ ] 🐛 バグ修正
## 翻訳チェックリスト(該当する場合)
- [ ] [翻訳状態ダッシュボード](/i18n-status/)を確認
- [ ] 元のMarkdownフォーマットを保持
- [ ] 翻訳をローカルでテスト
- [ ] 用語の一貫性をレビュー
## スクリーンショット(該当する場合)
<!-- 変更を説明するのに役立つスクリーンショットを追加 -->
## 追加メモ
<!-- レビュアーが知っておくべき追加情報 -->
監視とメンテナンス
ヘルスチェックスクリプト
// scripts/health-check.js
const fs = require('fs');
const path = require('path');
async function healthCheck() {
const issues = [];
// 1. 設定ファイルをチェック
const configPath = 'lunaria.config.json';
if (!fs.existsSync(configPath)) {
issues.push('❌ lunaria.config.jsonが見つかりません');
}
// 2. 言語ディレクトリをチェック
const languages = ['en', 'zh-cn', 'ja', 'ko'];
for (const lang of languages) {
const langDir = `src/content/docs/${lang}`;
if (!fs.existsSync(langDir)) {
issues.push(`❌ 言語ディレクトリが見つかりません: ${langDir}`);
}
}
// 3. 翻訳状態をチェック
const statusPath = 'public/i18n-status/data/status.json';
if (fs.existsSync(statusPath)) {
const status = JSON.parse(fs.readFileSync(statusPath, 'utf8'));
for (const [lang, data] of Object.entries(status.languages)) {
if (lang === status.sourceLanguage) continue;
const progress = (data.done / data.total) * 100;
if (progress < 50) {
issues.push(`⚠️ ${lang}の翻訳進捗が低いです: ${progress.toFixed(0)}%`);
}
}
}
// 4. 孤立ファイルをチェック
const files = fs.readdirSync('src/content/docs', { recursive: true });
// ... チェックロジック
// 結果を出力
if (issues.length === 0) {
console.log('✅ すべてのヘルスチェックが合格しました!');
} else {
console.log('⚠️ ヘルスチェックで問題が見つかりました:\n');
issues.forEach(issue => console.log(issue));
process.exit(1);
}
}
healthCheck();
定期メンテナンスタスク
# .github/workflows/maintenance.yml
name: Maintenance Tasks
on:
schedule:
# 毎週月曜日の午前9時
- cron: '0 9 * * 1'
workflow_dispatch:
jobs:
report:
name: Generate Weekly Report
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run health check
run: node scripts/health-check.js
- name: Generate weekly report
id: report
run: |
REPORT=$(node scripts/weekly-report.js)
echo "report<<EOF" >> $GITHUB_OUTPUT
echo "$REPORT" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Create issue
uses: actions/github-script@v7
with:
script: |
github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: 'Weekly i18n Report - ' + new Date().toISOString().split('T')[0],
body: `${{ steps.report.outputs.report }}`,
labels: ['i18n', 'weekly-report']
});
デプロイとリリース
Vercel設定
// vercel.json
{
"buildCommand": "npm run build",
"outputDirectory": "dist",
"framework": "astro",
"trailingSlash": false,
"headers": [
{
"source": "/(.*)",
"headers": [
{
"key": "X-Content-Type-Options",
"value": "nosniff"
},
{
"key": "X-Frame-Options",
"value": "DENY"
},
{
"key": "X-XSS-Protection",
"value": "1; mode=block"
}
]
}
]
}
package.json完全設定
{
"name": "my-docs",
"type": "module",
"version": "1.0.0",
"scripts": {
"dev": "astro dev",
"start": "astro dev",
"build": "astro build && npm run lunaria:build",
"preview": "astro preview",
"astro": "astro",
"lint": "eslint src/",
"format": "prettier --write .",
"format:check": "prettier --check .",
"lunaria:build": "lunaria build",
"lunaria:preview": "lunaria preview",
"i18n:check": "node scripts/health-check.js",
"i18n:report": "node scripts/weekly-report.js"
},
"dependencies": {
"@astrojs/starlight": "^0.26.0",
"@lunariajs/starlight": "^0.4.0",
"astro": "^5.0.0"
},
"devDependencies": {
"@types/node": "^20.0.0",
"eslint": "^8.57.0",
"prettier": "^3.2.0",
"typescript": "^5.3.0"
}
}
プロジェクトメンテナンスガイド
バージョンアップグレード戦略
# 古い依存関係をチェック
npm outdated
# LunariaJSをアップグレード
npm install @lunariajs/starlight@latest
# アップグレード後の互換性をテスト
npm run build
npm run preview
# 問題がある場合、ロールバック
npm install @lunariajs/starlight@previous-version
依存関係管理のベストプラクティス
- 定期的に更新:毎月依存関係の更新をチェック
- バージョンをロック:
package-lock.jsonを使用 - 変更をテスト:アップグレード後、完全なテストを実行
- ドキュメントを同期:CHANGELOGを更新
シリーズ総括と展望
LunariaJS能力概要
| 能力 | 説明 | 章節 |
|---|---|---|
| インストール設定 | プロジェクトの素早い初期化 | 第2回 |
| CLI操作 | コマンドラインツールの使用 | 第3回 |
| ダッシュボード | 翻訳状態の可視化 | 第4回 |
| Git統合 | バージョンベースの翻訳追跡 | 第5回 |
| Starlight統合 | ドキュメントサイトの統合 | 第6回 |
| CI/CD統合 | 自動化ワークフロー | 第7回 |
| コアアーキテクチャ | ソースレベルの理解 | 第8回 |
| 高度な設定 | エンタープライズカスタマイズ | 第9回 |
| 完全実践 | エンドツーエンド実践 | 第10回 |
学習パスの振り返り
入門段階
│
├── 第1回:LunariaJSとは何かを理解
├── 第2回:インストールと設定を習得
├── 第3回:CLIコマンドを習得
├── 第4回:ダッシュボードを使用
├── 第5回:Gitワークフローを理解
├── 第6回:Starlightを統合
└── 第7回:CI/CDを設定
│
▼
深掘り段階
│
├── 第8回:ソースコードアーキテクチャを深掘り
├── 第9回:エンタープライズ設定
└── 第10回:完全実践
│
▼
LunariaJSエクスパートに!
今後の発展方向
LunariaJSはアクティブなオープンソースプロジェクトとして、今後以下の機能が追加される可能性があります:
- より多くのファイル形式サポート:Excel、POファイルなど
- より深いCMS統合:Headless CMSサポート
- AIアシスト翻訳:機械翻訳サービスとの統合
- リアルタイムコラボレーション:複数人による同時編集
- 高度な分析:翻訳品質の評価
コミュニティリソース推奨
| リソース | リンク |
|---|---|
| 公式ドキュメント | https://lunaria.libdoc.top/ |
| 日本語ドキュメント | https://lunaria.libdoc.top/ja/ |
| GitHubリポジトリ | https://github.com/withastro/lunaria |
| Discordコミュニティ | https://discord.gg/astro |
| Astro公式ドキュメント | https://docs.astro.build/ |
おわりに
LunariaJSの入門から精通までの完全な学習旅程を完走おめでとうございます!
この10記事のシリーズを通じて、あなたは以下を習得しました:
- ✅ LunariaJSのコア概念とインストール設定
- ✅ CLIコマンドとダッシュボードの使用
- ✅ Gitワークフローとチームコラボレーション
- ✅ Astro Starlight統合
- ✅ CI/CD自動デプロイ
- ✅ コアアーキテクチャとソース理解
- ✅ エンタープライズレベルの高度な設定
- ✅ 完全なプロジェクト実践
これで、LunariaJSを使ってプロフェッショナルレベルの多言語ドキュメントプラットフォームを構築する能力が身につきました。次のプロジェクトを始めましょう!
このシリーズが役に立ったと感じたら、より多くの開発者と共有し、より多くの人にLunariaJSという強力なローカライズ管理ツールを知ってもらいましょう。
💡 おすすめ読書: