多言語ウェブサイト開発: 5言語以上での構築
3番目の言語をリリースするとルーティング設定が崩壊します。コンテンツエディタがCMSを開いても、何が翻訳済みで、何がドラフト、何がドイツ語では公開済みだが日本語では不足しているのか判断できません。すべてのロケールがすべてのページで読み込まれるため、バンドルサイズは800KBに達します。hreflangタグはというと、木曜日にクライアントへステージングリンクを送るまで誰も覚えていません。5言語以上でサイトを構築している場合、これらのアーキテクチャの決定は1つのルートを書く前にロックインする必要があります。翻訳者から最初の請求書が来たときにパッチを当てるのではなく。ここに、実際に翻訳者との接触に耐えるルーティング戦略、CMS構造、バンドル戦略があります。
私たちはfintech、ヘルスケア、eコマースの顧客向けに8~14言語をサポートする多言語サイトをリリースしてきました。これを何度も実行してわかったこと:2言語をサポートするサイトと12言語をサポートするサイトの違いは複雑さではなく、適切な抽象化を持つことです。このガイドはURL戦略とi18nルーティングからCMSモデリング、翻訳ワークフロー、パフォーマンス最適化までのすべてをカバーしています。
目次
- ほとんどの多言語実装がスケールで失敗する理由
- URL戦略: サブドメイン vs サブディレクトリ vs TLD
- 多言語サイト向けフレームワークの選択
- i18nルーティングアーキテクチャ
- 多言語コンテンツ向けヘッドレスCMSモデリング
- 翻訳ワークフロー自動化
- 多言語サイトのSEO
- ロケール全体でのパフォーマンス最適化
- 右から左への(RTL)言語サポート
- 多言語サイトのテストとQA
- よくある質問
ほとんどの多言語実装がスケールで失敗する理由
毎回同じ話です。チームが英語でサイトを構築し、誰かがスペイン語を追加するよう求め、翻訳ライブラリをドロップインし、ロケール切り替えロジックをハードコードしてシップします。その後、フランス語がリクエストされます。その後、ドイツ語。その後、日本語。5言語目までに、彼らは以下に沈んでいます:
- ルーティングスパゲッティ: ロケールプリフィックスが動的ルート導入の瞬間に爆発
- コンテンツドリフト: 翻訳がソース言語から数週間遅れている - 正直なところ、数ヶ月遅れることもあります
- バンドル肥大化: ユーザーが実際に必要とするロケールに関わらず、すべての翻訳文字列がロード
- SEOの盲点: 失われたまたは壊れたhreflangアノテーション、重複コンテンツペナルティがランキングを絶対に下げている
- レイアウトの破損: ドイツ語テキストが英語より40%長く実行される、日本語には完全に異なるフォントスタックが必要
根本原因?チームは多言語を機能として扱っています。それは機能ではありません。5言語以上をサポートしている場合、ローカライゼーションはルーティング、データモデリング、ビルドパイプライン、CDN設定、デプロイ戦略に触れます。金曜日の午後にnpm installして完了と呼ぶことはできません。それは基本的です - またはそれはめちゃくちゃです。
URL戦略: サブドメイン vs サブディレクトリ vs TLD
あなたのURL構造は多言語SEOにおいて最も重大な決定です。そしてローンチ後に変更することはほぼ不可能で、ランキングが失われます。テーブルの上には3つの本当のオプションがあります:
| 戦略 | 例 | SEO権限 | 実装の複雑さ | コスト |
|---|---|---|---|---|
| サブディレクトリ | example.com/fr/about | 統合(単一ドメイン) | 低 | 低 |
| サブドメイン | fr.example.com/about | 分割(別サイトとして扱われる) | 中 | 低 |
| ccTLD | example.fr/about | 国ごとに独立 | 高 | 高($10-50/ドメイン/年 × n) |
| クエリパラメータ | example.com/about?lang=fr | 低(推奨されない) | 低 | 低 |
5言語以上の場合の推奨: サブディレクトリ。 理由は以下の通りです:
- ドメイン権限の統合: すべてのバックリンクがすべての言語版に利益をもたらします。8言語のサブドメインでは、基本的に8つの別々のサイトに対して権限を構築しています。それは非常に厳しい - そして完全に不要です。
- 単純化されたインフラストラクチャ: 1つのデプロイ、1つのSSL証明書、1つのCDN設定。完了です。
- より簡単な分析: クロスドメイントラッキングの悪夢 vs. 単一のGA4プロパティとロケールディメンション。クロスドメインGA設定のデバッグで木曜日の午後を過ごしたことがあれば、あなたは正確に何を知っています。
- 低コスト: ロケールごとのドメイン登録はありません。
例外は?本当に異なるコンテンツが国ごとに必要な場合 - 言語だけではなく。ドイツ向けドイツ語サイト vs. スイス向けドイツ語サイトで異なる価格、法的条件、製品可用性?それは本当の区別です。ccTLDまたはサブドメインと国別コンテンツモデルが実際に意味を持つようになります。
# 推奨サブディレクトリ構造
example.com/ → 英語(デフォルト)
example.com/fr/ → フランス語
example.com/de/ → ドイツ語
example.com/ja/ → 日本語
example.com/ar/ → アラビア語
example.com/pt-br/ → ブラジルポルトガル語
pt-brに注目してください。5言語以上をサポートする場合、言語とロケールの区別に必然的に遭遇します。ブラジルポルトガル語とヨーロッパポルトガル語は十分に異なるため、ユーザーはそれに気付きます - そして信頼してください、彼らはあなたにそれについて知らせます。BCP 47タグを使用して、language-regionコードから最初の日から計画してください。これを後で改装するのは、実際に経験するまで完全に伝えることができないような方法で苦痛です。
多言語サイト向けフレームワークの選択
すべてのフレームワークがi18nを等しく処理しているわけではありません。2026年現在、5言語以上のサポートに対する主要なプレイヤーの立場は以下の通りです:
| フレームワーク | 組み込みi18nルーティング | 静的+動的 | ロケール別バンドル分割 | RTLサポート | 最適用途 |
|---|---|---|---|---|---|
| Next.js 15 | ✅(App Router) | ✅ | ✅(設定有り) | 手動 | フルスタックアプリ、動的コンテンツ |
| Astro 5 | ✅(手動+Starlight) | ✅ | ✅(ページごと自動) | 手動 | コンテンツ豊富、マーケティングサイト |
| Nuxt 3 | ✅(@nuxtjs/i18n) | ✅ | ✅ | 手動 | Vueエコシステムプロジェクト |
| Remix / React Router 7 | ❌(手動) | ✅ | 手動 | 手動 | 複雑なインタラクティブアプリ |
| SvelteKit | ❌(手動) | ✅ | 手動 | 手動 | パフォーマンス重視のアプリ |
Next.js 15 多言語アーキテクチャ
Next.jsは現在最も成熟したi18nストーリーを持っています。主にApp Routerのおかげです。[locale]動的セグメントパターンは、ミドルウェアハックなしにクリーンなルーティングを提供します:
// app/[locale]/layout.tsx
import { notFound } from 'next/navigation';
const locales = ['en', 'fr', 'de', 'ja', 'ar', 'pt-br', 'es', 'ko'];
export function generateStaticParams() {
return locales.map((locale) => ({ locale }));
}
export default function LocaleLayout({
children,
params: { locale },
}: {
children: React.ReactNode;
params: { locale: string };
}) {
if (!locales.includes(locale)) notFound();
return (
<html lang={locale} dir={locale === 'ar' ? 'rtl' : 'ltr'}>
<body>{children}</body>
</html>
);
}
翻訳文字列管理については、next-intlが基本的に標準になっています。ICU MessageFormatをサポートしているため、サーバーコンポーネント、そして - これは大きなもの - あなたの日本語ユーザーがドイツ語翻訳をダウンロードしないように、ロケール別バンドル分割。これは、ほとんどの人が考えるよりもはるかに重要です。
// i18n/request.ts
import { getRequestConfig } from 'next-intl/server';
export default getRequestConfig(async ({ locale }) => ({
messages: (await import(`../messages/${locale}.json`)).default,
}));
私たちはNext.js開発機能でこのアーキテクチャを詳しくカバーしています。
コンテンツ豊富な多言語サイト向けAstro
Astroのコンテンツコレクションは、多言語マーケティングサイトとドキュメントに非常に適しています。各コンテンツはロケール別に整理され、JavaScriptオーバーヘッドはありません:
src/content/
blog/
en/
getting-started.md
pricing-guide.md
fr/
getting-started.md
pricing-guide.md
de/
getting-started.md
Astro 5のコンテンツレイヤーAPIは、ロケール別にコンテンツをクエリし、ビルド時にすべての言語の静的ページを生成することを非常に簡単にします。8言語で200ページのサイトの場合、Astroは30秒以内に1,600の静的HTMLページを生成します - 明示的に相互作用を追加しない限り、JavaScriptランタイムなしで各ページが完全に最適化されています。少し考えてみてください。それはかなり狂っています。
詳しくはAstro開発スキルを参照してください。
i18nルーティングアーキテクチャ
ミドルウェアベースのロケール検出
最高のUXのために、最初のアクセスでユーザーの優先言語を検出してリダイレクトする必要があります。Next.jsミドルウェアで:
// middleware.ts
import createMiddleware from 'next-intl/middleware';
export default createMiddleware({
locales: ['en', 'fr', 'de', 'ja', 'ar', 'pt-br', 'es', 'ko'],
defaultLocale: 'en',
localeDetection: true, // Accept-Languageヘッダーを使用
localePrefix: 'as-needed', // デフォルトロケールの/en/プリフィックスなし
});
export const config = {
matcher: ['/((?!api|_next|_vercel|.*\..*).*)'],
};
検出優先度は次のようになるべきです:
- 明示的なURLロケール(
/fr/about) — 常に優先、例外なし - Cookie(
NEXT_LOCALE) — ユーザーの以前の選択を尊重 - Accept-Languageヘッダー — ブラウザ設定
- GeoIP — 慎重に使用; 多くの海外駐在員と旅行者が彼らの場所と一致しない言語でブラウズします
- デフォルトロケール — フォールバック
ページ全体をリロードせずにロケールを切り替える
ここで私たちが絶えず見ている間違い:ロケール切り替えを全ナビゲーションとして実装します。誰かが/en/aboutから英語をフランス語に切り替えると、/fr/aboutにランディングするはずです - /fr/ではありません。誰もホームページに戻ることを望みません。ロケール間でパスマッピングが必要です:
// components/LocaleSwitcher.tsx
'use client';
import { usePathname, useRouter } from 'next/navigation';
export function LocaleSwitcher({ currentLocale, locales }) {
const pathname = usePathname();
const router = useRouter();
const switchLocale = (newLocale: string) => {
// 現在のロケールセグメントを新しいものに置き換える
const newPath = pathname.replace(`/${currentLocale}`, `/${newLocale}`);
router.push(newPath);
};
return (
<select
value={currentLocale}
onChange={(e) => switchLocale(e.target.value)}
>
{locales.map((locale) => (
<option key={locale} value={locale}>
{new Intl.DisplayNames([locale], { type: 'language' }).of(locale)}
</option>
))}
</select>
);
}
簡単なコツ:Intl.DisplayNamesを使用して言語名を独自のスクリプトで表示します(Français、Deutsch、日本語)英語ではなく。小さな詳細。ユーザーは絶対に気付きますが。
多言語コンテンツ向けヘッドレスCMSモデリング
ヘッドレスCMSは5言語以上に対して必須です。WordPressとWPMLは3ロケールを超えるとメンテナンスの悪夢に変わります - 何度もそれが起こるのを見てきました。主要なヘッドレスプラットフォームがここでどのように機能するかは以下の通りです:
| CMS | ローカライゼーションモデル | 翻訳ワークフロー | APIクエリパターン | 価格への影響 |
|---|---|---|---|---|
| Contentful | フィールドレベルロケール | 組み込み+外部統合 | ?locale=fr |
各ロケールはエントリ制限にカウント |
| Sanity | ドキュメントレベル(推奨) | プラグインベース(Sanity Translate) | GROQ言語でフィルター | ロケール別価格への影響なし |
| Storyblok | フィールドレベル(フォルダベース付き) | 組み込み翻訳UI | Dimension API | すべてのプランに含まれる |
| Hygraph | フィールドレベルロケール | ステージベースワークフロー | GraphQL内のlocales: [fr] |
ロケールはプラン制限にカウント |
| Payload CMS | フィールドレベルまたはコレクションレベル | カスタムワークフロー | ロケールフィールドでフィルター | 自己ホスト、ロケール別コストなし |
フィールドレベル vs ドキュメントレベルのローカライゼーション
これは多言語サイトの最も重要なCMSアーキテクチャ決定です。ほとんどの代理店がこれを間違えます。
フィールドレベルのローカライゼーション(Contentful、Storyblok): コンテンツエントリ内の各フィールドは、すべてのロケールの値を保持します。単一のブログ投稿エントリに、英語タイトル、フランス語タイトル、ドイツ語タイトルなどが含まれています - すべて1か所に詰め込まれています。
ドキュメントレベルのローカライゼーション(Sanityの推奨パターン): 各ロケールは独自のドキュメントを取得し、共有参照IDでリンクされます。
5言語以上の場合、長編コンテンツに対してドキュメントレベルのローカライゼーションと構造化データに対してフィールドレベルのローカライゼーションを強く推奨します。その理由:
- フィールドレベルのローカライゼーションで8言語全体で、ブログ投稿を編集するということは、必要なフィールドを見つけるために7つの他の言語のコンテンツを過ぎてスクロールすることを意味します。コンテンツエディタはこれを本当に嫌います。本当に、心から嫌います。
- ドキュメントレベルはエディタUIをきれいに保つ - あなたのフランス語エディタはフランス語コンテンツのみを見る
- 翻訳ステータストラッキングはドキュメント別(ドラフト、レビュー中、ロケールごとに公開)ははるかに簡単になります
- ロケール別にコンテンツが異なる場合に異なるコンテンツが可能です - 異なるヒーロー画像、異なる市場向けの異なるCTA
Sanityでは、これは次のようになります:
// schemas/blogPost.ts
export default defineType({
name: 'blogPost',
type: 'document',
fields: [
defineField({
name: 'language',
type: 'string',
options: {
list: [
{ title: 'English', value: 'en' },
{ title: 'French', value: 'fr' },
{ title: 'German', value: 'de' },
// ...
],
},
}),
defineField({
name: 'translationGroup',
type: 'string', // この投稿のすべての翻訳で共有されるUUID
hidden: true,
}),
defineField({ name: 'title', type: 'string' }),
defineField({ name: 'body', type: 'portableText' }),
],
});
私たちがヘッドレスCMSプロジェクトをどのように構造化するかについて詳しくは、CMS開発ページを参照してください。
翻訳ワークフロー自動化
手動翻訳は3言語を超えてスケールしません。期間。8言語では、単一のブログ投稿が7つの翻訳タスクを生成します - コンテンツチームが週に4つの投稿を公開する場合、それは毎週28翻訳です。数学は醜くなります速く。
最初のドラフトとしての機械翻訳
2026年のアプローチが実際に機能します:最初のドラフトにはAI/機械翻訳を使用し、その後人間の翻訳者が磨きます。DeepL Pro($25/月)とGoogle Cloud Translation V3は、ヨーロッパ言語で85-92%の精度を提供しますが、CJK言語では精度が著しく低下します。
// scripts/auto-translate.ts
import * as deepl from 'deepl-node';
const translator = new deepl.Translator(process.env.DEEPL_API_KEY);
async function translateContent(
text: string,
sourceLang: deepl.SourceLanguageCode,
targetLang: deepl.TargetLanguageCode
): Promise<string> {
const result = await translator.translateText(text, sourceLang, targetLang, {
preserveFormatting: true,
formality: 'more', // ビジネス適切なトーン
tagHandling: 'html', // HTML/markdown構造を保持
});
return result.text;
}
翻訳管理システム(TMS)
エンタープライズグレードのワークフローについては、専用TMSが必要になります:
- Phrase(以前のMemsource): $25/月から、ほとんどのヘッドレスCMSと統合
- Crowdin: $40/月から、GitHub/GitLabシンク搭載の優れた開発者体験
- Lokalise: $120/月から、最高のFigma統合、デザインから翻訳ワークフロー向け
- Transifex: $150/月から、強いAPI優先アプローチ
ほとんどのクライアントで着陸したワークフロー:
- コンテンツ作成者がソース言語(通常は英語)で公開
- Webhookはテストシステム内の翻訳ジョブ作成をトリガー
- 機械翻訳は最初のドラフトを生成
- 人間の翻訳者がレビューして承認
- 承認された翻訳はAPIを介してCMSにプッシュバック
- Webhookは影響を受けたページのリビルド/再検証をトリガー
それは多くの移動部分です - それがそうではないふりはしません。しかし、一度配線されると、コンテンツチームはほぼその下の機械に気付きます。彼らは書いて発行するだけです。
多言語サイトのSEO
Hreflang実装
Hreflangタグは検索エンジンにどの言語版をどの市場で提供するかを指示します。これらを間違えるとGoogleはあなたのドイツページをフランス語ユーザーに表示します。クライアントとその会話を持っていました。楽しくありませんでした。
すべてのページには、そのすべての言語バリアントを指すhreflangアノテーションが必要です:
<!-- /fr/aboutで -->
<link rel="alternate" hreflang="en" href="https://example.com/about" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/about" />
<link rel="alternate" hreflang="de" href="https://example.com/de/about" />
<link rel="alternate" hreflang="ja" href="https://example.com/ja/about" />
<link rel="alternate" hreflang="ar" href="https://example.com/ar/about" />
<link rel="alternate" hreflang="x-default" href="https://example.com/about" />
x-defaultタグは重要です - ロケールがマッチしない場合に表示するバージョンを検索エンジンに指示します。スキップしないでください。
自動化はスケールで必須です。 200ページ × 8言語で、各ページが9つのhreflangタグを必要とする1,600ページを管理しています(8言語+x-default)。これは14,400hreflangアノテーションです。これを手で行っていません。プログラムで生成してください:
// lib/generateHreflang.ts
export function generateHreflangTags(
path: string,
currentLocale: string,
locales: string[],
baseUrl: string
) {
return locales.map((locale) => ({
rel: 'alternate',
hreflang: locale,
href: `${baseUrl}${locale === 'en' ? '' : `/${locale}`}${path}`,
})).concat({
rel: 'alternate',
hreflang: 'x-default',
href: `${baseUrl}${path}`,
});
}
多言語サイトマップ
5言語以上のサイトについては、サイトマップインデックスファイルを使用してロケール別サイトマップを指す:
<!-- sitemap-index.xml -->
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>https://example.com/sitemap-en.xml</loc></sitemap>
<sitemap><loc>https://example.com/sitemap-fr.xml</loc></sitemap>
<sitemap><loc>https://example.com/sitemap-de.xml</loc></sitemap>
<!-- ... -->
</sitemapindex>
各ロケールサイトマップには、hreflang相互参照用のxhtml:link要素が含まれるべきです。GoogleのJohn Muellerはこれが最も信頼できるhreflang実装方法であることを確認しています。これだけしてください。
ロケール全体でのパフォーマンス最適化
翻訳バンドル分割
すべてのロケール文字列をすべてのユーザーに送信しないでください。8言語のサイトで、ロケールあたり2,000翻訳キーの典型的な例は、圧縮されていないJSONで~400KBを生成します。アクティブなロケールに必要なもののみをロードしてください:
// 翻訳を動的にロード
const messages = await import(`@/messages/${locale}.json`);
Next.js 15とnext-intlを使用すると、これはサーバーコンポーネントで自動的に発生します - 翻訳文字列はサーバー側でレンダリングされ、JavaScriptとしてクライアントに送信されません。問題解決しました。
CJK言語用フォント読み込み
中国語、日本語、韓国語フォントは巨大です。Noto Sans JPは完全な文字カバレッジで5.7MBです。コアウェブバイタルを気をつけなければ絶対に破壊します。ここで機能します:
unicode-rangeサブセットを使用: 各ページで使用される文字のみをロードdisplay=swapによるGoogle Fonts: CJK自動サブセット- 可能な場合の可変フォント: 単一ファイル、複数の太さ
/* 日本語ロケールに対してのみ日本語フォントをロード */
@font-face {
font-family: 'NotoSansJP';
src: url('/fonts/NotoSansJP-subset.woff2') format('woff2');
unicode-range: U+3000-9FFF, U+F900-FAFF; /* CJKサブセット */
font-display: swap;
}
CDNおよびエッジキャッシング
ロケール別にキャッシュするようにCDNを設定してください。Vercelでは、これは[locale]セグメントで自動的に発生します。Cloudflareで:
Cache-Key: ${URI}-${Accept-Language}
Vary: Accept-Language
しかしVary: Accept-Languageには注意してください - 醜い方法でキャッシュを断片化することができます。明示的なロケールURLパス(サブディレクトリ)を使用する方が良いため、各ロケールはヘッダーベースの変動なしにクリーンなキャッシュエントリを取得します。サブディレクトリがもう一度勝つ別の理由。
右から左へのRTL言語サポート
5言語以上にアラビア語、ヘブライ語、ペルシア語、またはウルドゥー語のいずれかが含まれている場合、RTLサポートはオプションではありません。すべてに触れます:
- ドキュメント方向:
<html dir="rtl"> - CSSレイアウト: FlexboxとGridは方向を自動的に処理します。
margin-leftではありません - 代わりに論理プロパティを使用してください。 - アイコン: 方向性アイコン(矢印、ナビゲーションシェブロン)をミラーリング必要
/* CSSロジカルプロパティを使用 - LTRとRTLの両方で機能 */
.card {
margin-inline-start: 1rem; /* margin-leftに置き換え */
padding-inline-end: 2rem; /* padding-rightに置き換え */
border-inline-start: 3px solid blue; /* border-leftに置き換え */
}
Tailwind CSS 3.4+はボックスの外RTLバリアントをサポートしています:
<div class="ml-4 rtl:mr-4 rtl:ml-0">
<!-- または良い方で、論理ユーティリティを使用 -->
<div class="ms-4"> <!-- margin-inline-start -->
実際のアラビア語翻訳が来る前に疑似ローカライゼーションでRTLレイアウトをテストしてください。pseudolocalizeのようなツールは、あなたの英語テキストをミラー化してレイアウト問題を公開することができます - クライアントQAの間に奇妙な会話になる前に。どのように私が知っているか尋ねてください。
多言語サイトのテストとQA
自動化テスト戦略
// e2e/multilingual.spec.ts (Playwright)
import { test, expect } from '@playwright/test';
const locales = ['en', 'fr', 'de', 'ja', 'ar', 'pt-br', 'es', 'ko'];
for (const locale of locales) {
test(`${locale}でホームページが正しく読み込まれます`, async ({ page }) => {
await page.goto(`/${locale}`);
// HTML lang属性を検証
const lang = await page.getAttribute('html', 'lang');
expect(lang).toBe(locale);
// すべてのロケールのhreflangタグが存在することを確認
for (const l of locales) {
const hreflang = page.locator(`link[hreflang="${l}"]`);
await expect(hreflang).toHaveCount(1);
}
// x-defaultが存在することを確認
await expect(page.locator('link[hreflang="x-default"]')).toHaveCount(1);
// 翻訳されていない文字列がないことを確認(英語が非ENページに表示)
if (locale !== 'en') {
const h1 = await page.textContent('h1');
expect(h1).not.toBe('Welcome'); // 英語フォールバック検出
}
});
}
視覚的回帰テスト
ドイツ語テキストは平均で英語より30~40%長いです。日本語は短いことがありますが、異なるline-heightが必要です。Percyまたはクロマティックを使用して、すべてのサポート言語でレイアウト破損をキャッチします - デスクトップとモバイルの両方のブレークポイントで各サポート言語のスナップショットを設定してください。
多言語テストインフラストラクチャへの投資は2番目のコンテンツ更新後に自分自身の支払いを行います。そして、3つのロケールを静かに破壊していたでしょう。そして2番目のコンテンツ更新があります。常にあります。
これがすべて調整するようにたくさん聞こえるなら - それはそうです。しかし、それは定期的に行う工学的な仕事です。多言語プロジェクトについて議論するにはお問い合わせいただくか、見積もりについて価格設定をご確認ください。
よくある質問
5言語以上の多言語ウェブサイトを構築するのにどのくらいの費用がかかりますか? ヘッドレスセットアップ(Next.js or Astro + ヘッドレスCMS)では、ページ数と複雑さに応じて、初期構築で$30,000~$80,000を予想してください。その上に、翻訳管理ツーリングで月$500~$2,000、専門の人間翻訳の継続中翻訳コストで単語あたり$0.08~$0.20を予算してください。人間レビュー付き機械翻訳は、単語あたりのコストを40~60%削減できます。
翻訳プラグインまたはカスタムi18nを使用すべきですか? 3言語未満のWordPressサイトについては、WPML($79/年)やPolylangなどのプラグインが正常に機能します。5言語を超えると、モノリシックCMSでのプラグインベース翻訳のオーバーヘッドは管理不可能になります。ヘッドレスCMSと専用TMS統合がスケーラブルパス - CMSはコンテンツモデリングを処理し、TMSはワークフロー、フロントエンドフレームワークはルーティングとレンダリングを処理します。関心の明確な分離。
多言語ウェブサイトに最適なヘッドレスCMSは何ですか? あなたが何を最適化しているかによって完全に異なります。Storyblokは視覚エディタとフィールドレベルのローカライゼーションで最も磨かれた多言語編集体験を持っています。Sanityはドキュメントレベルのローカライゼーションとカスタムワークフローを通じて最も柔軟性を提供します - コンテンツモデルが複雑になるときに理想的です。ContentfulはTMS統合が強いエンタープライズピックですが、価格設定をチェック - 各ロケールはエントリ制限に対してカウントします。普遍的な答えはありません。
多言語ウェブサイトのSEOをどのように処理しますか?
3つの要求される要件:すべての言語バリアントを指すすべてのページの正しいhreflangタグ、相互参照を備えたロケール別XMLサイトマップ、および正規/デフォルト言語バージョンを指すx-default hreflen。統合されたドメイン権限の場合はサブディレクトリURL構造(/fr/、/de/)を使用してください。Google Search ConsoleとBing Webmaster Toolsでロケール固有のサイトマップを送信してください。そして最初の3ヶ月間、ロケール別のインデックス作成を週単位で監視 - 有機トラフィックが失われてから問題を発見するのではなく早期にキャッチします。
Google翻訳またはAIを使用してウェブサイトを翻訳できますか? 人間レビューなしで本番翻訳として使用できません。Google Cloud Translation V3とDeepLはヨーロッパ言語ペアで85~92%の精度に達しますが、CJK言語では70~80%に低下します。実際に機能するワークフロー:最初のドラフトについて機械翻訳、翻訳者がレビューして修正し、その後発行。このハイブリッドアプローチは翻訳コストを40~60%削減しながら品質を維持します。そして、人間の専門家レビューなしに、法律、医学、または財務コンテンツを自動翻訳しないでください。ただしません。
異なる言語でURLスラッグをどのように処理しますか?
翻訳されたURLスラッグ(/fr/a-propos代わりに/fr/about)はSEOとユーザー体験を改善しますが、実際の複雑さを加えます。CMSでスラッグマッピングテーブルが必要で、ルーティング中に双方向ルックアップが必要です。5言語以上については、トップレベルページと主要なランディングページについてはスラッグを翻訳することをお勧めしますが、ブログ投稿スラッグを元の言語または音訳バージョンで保つでください。ダース地域全体で数百の翻訳URLを保守することは、急速に複合するの負担です。
多くの言語をサポートするのはパフォーマンスにどのような影響を与えますか? 適切なアーキテクチャでは?ほぼゼロ。AstroまたはNext.jsを使用した静的サイト生成は、各ロケールを独立したHTMLページとしてプリレンダリングします - サーバーとCDNはフランス語ページを英語ページと同じくらい速く提供します。主なパフォーマンスリスクは一度にすべてのロケール翻訳バンドルを読み込む(ロケール別コード分割で解決)、CJK フォント読み込み(サブセットで解決)、CDNレイヤーでのキャッシュ断片化(ヘッダーベースのロケールルーティングの代わりにURLベースで解決)です。
既存の多言語サイトに新しい言語を追加するのにどのくらい時間がかかりますか? 既に配置されている適切なアーキテクチャで、8言語サイトに9番目の言語を追加するのに1~2日のエンジニアリング作業がかかります:ルーティング設定にロケールを追加、CMSロケール/ディメンションを作成、新言語用にTMSを設定、hreflang生成を更新します。ボトルネックはエンジニアリングではなく、常にコンテンツ翻訳です。200翻訳キーを持つ50ページのサイトは、専門翻訳とレビューに大体2~3週間かかります。