CDN Delivery: better-i18n のエッジキャッシュ翻訳をワールドワイドに配信
Cloudflare R2 から 300 以上のエッジロケーション経由で翻訳を配信します。Merge、プレビュー、バッチアップロード、重複排除を行い、アプリを再デプロイすることなく全世界に届けましょう。
CDN Delivery: better-i18n のエッジキャッシュ翻訳をワールドワイドに配信
better-i18n で公開した翻訳はすべて、Cloudflare のグローバルエッジネットワークにデプロイされます。アプリケーションは最寄りのエッジノードから翻訳を取得します。オリジンサーバーへのラウンドトリップも、翻訳更新のためのアプリ再デプロイも不要です。
CDN URL 構造
翻訳は、組織・プロジェクト・ロケール・ネームスペースを基にした予測可能な URL パターンに従います。
https://cdn.better-i18n.com/{org}/{project}/{locale}/{namespace}.json
例:
# 英語の common ネームスペース
https://cdn.better-i18n.com/acme/web-app/en/common.json
# トルコ語の auth ネームスペース
https://cdn.better-i18n.com/acme/web-app/tr/auth.json
# フランス語の navigation ネームスペース
https://cdn.better-i18n.com/acme/web-app/fr/nav.json
ネームスペースとロケールの組み合わせごとに個別の JSON ファイルが作成されるため、アプリは必要な翻訳だけを読み込めます。この URL 構造は安定しており、キャッシュ可能です。CDN エッジノード、ブラウザキャッシュ、Service Worker のいずれでも活用できます。
プロジェクトマニフェスト
CDN はプロジェクトの言語設定を含むマニフェストファイルも提供します。
https://cdn.better-i18n.com/{org}/{project}/manifest.json
プロジェクト内のすべてのロケールを含む languages 配列を返します。Expo SDK はこれを使って実行時に利用可能な言語を自動検出します。
CDN 操作
better-i18n は、CLI・REST API・MCP ツールを通じて CDN 管理操作の完全なセットを提供します。
セットアップとティアダウン
| 操作 | 説明 |
|---|---|
cdn.setup | プロジェクトの CDN デリバリーを初期化します。R2 バケット構造を作成し、エッジルーティングを設定します。 |
cdn.uninstall | CDN デリバリーを削除します。R2 ストレージとエッジ設定をクリーンアップします。 |
アップロード操作
シングルアップロード(cdn.upload)
単一のネームスペース・ロケールファイルを CDN にアップロードします。
# 英語の common 翻訳をアップロード
better-i18n cdn upload --locale en --namespace common
この操作はファイルを R2 に書き込み、その特定パスのエッジキャッシュを無効化します。変更は数秒以内に 300 以上のエッジノードすべてに伝播します。
バッチアップロード(cdn.uploadBatch)
複数のネームスペース・ロケールの組み合わせを一度の操作でアップロードします。
# 英語とトルコ語のすべてのネームスペースをアップロード
better-i18n cdn upload-batch --locales en,tr --namespaces common,auth,dashboard
バッチアップロードは複数ファイルを公開する際、個別アップロードより大幅に高速です。R2 への書き込みとキャッシュ無効化をまとめて処理し、全体の伝播時間を短縮します。
Merge 操作
Merge を使うと、ファイル全体を差し替えることなく、既存の CDN ファイル内の特定のキーだけを更新できます。これは増分翻訳更新に不可欠です。
Merge(cdn.merge)
# 英語の common ネームスペースに更新されたキーをマージ
better-i18n cdn merge --locale en --namespace common --keys "welcome,nav.home"
Merge は R2 から既存ファイルを読み込み、キーレベルの変更を適用し、結果を書き戻します。Merge に含まれないキーは変更されません。これにより、複数のチームメンバーや自動化パイプラインが同時に公開する際の意図しない上書きを防ぎます。
Merge プレビュー(cdn.mergePreview)
Merge 操作を実行する前に、その結果をプレビューします。
# 適用せずにマージ結果をプレビュー
better-i18n cdn merge-preview --locale en --namespace common --keys "welcome"
追加・更新・変更なしのキーを示す差分を返します。CI パイプラインやレビューワークフローで、変更が本番に反映される前に確認するために活用できます。
ファイル管理
| 操作 | 説明 |
|---|---|
cdn.listFiles | プロジェクトの CDN に現在デプロイされているすべてのファイルを一覧表示します。各ファイルのロケール、ネームスペース、サイズ、最終更新日時を返します。 |
cdn.deleteFile | CDN から特定のネームスペース・ロケールファイルを削除します。ネームスペースを廃止したり、ロケールを削除したりする際に使用します。 |
重複検出とクリーンアップ
翻訳プロジェクトは時間の経過とともに重複が蓄積されます。特にネームスペースを再編成したり、キーをネームスペース間で移動したりした場合に顕著です。
重複検出(cdn.detectDuplicates)
プロジェクト内のすべての CDN ファイルをスキャンし、ネームスペース間で重複する翻訳値を特定します。
better-i18n cdn detect-duplicates
異なるネームスペース間で同一の値を持つキーを示すレポートを返します。これにより、翻訳を共有ネームスペースに統合し、CDN のペイロードサイズ全体を削減できます。
重複クリーンアップ(cdn.cleanupDuplicates)
統合の設定に基づいて、検出された重複を自動的に解決します。
# 重複を common ネームスペースに移動
better-i18n cdn cleanup-duplicates --target-namespace common
これは破壊的な操作です。変更内容を確認するために必ず先に cdn.detectDuplicates を実行し、cdn.mergePreview でターゲットネームスペースの結果を確認してください。
更新の仕組み
- ダッシュボード、REST API、または MCP ツールで翻訳を編集します
publishTranslationsを使って公開します。これによりcdn_uploadSync ジョブがトリガーされます- 数秒以内に CDN が更新されます。Cloudflare がすべてのエッジノードに変更を伝播します
- 次の翻訳フェッチ時にアプリが変更を取得します。再デプロイは不要です
細かい制御が必要な場合は、フルアップロードの代わりに cdn.merge を使用して、変更されたキーのみを更新してください。CI パイプラインで cdn.mergePreview と組み合わせることで、CDN デプロイをレビューステップで制御できます。
フレームワーク連携
Web: Next.js、TanStack Start、Vite
Web SDK(@better-i18n/next、@better-i18n/use-intl)は、i18n.config.ts の設定に基づいて CDN フェッチを自動的に処理します。
// i18n.config.ts
export const project = "acme/web-app";
export const defaultLocale = "en";
SDK はプロジェクト識別子から CDN URL を解決し、実行時に適切なネームスペース・ロケールファイルを取得します。
モバイル: Expo / React Native
@better-i18n/expo は CDN デリバリーの上にオフラインファーストキャッシュを追加します。
import { initBetterI18n, storageAdapter } from '@better-i18n/expo';
import { MMKV } from 'react-native-mmkv';
const mmkv = new MMKV({ id: 'translations' });
await initBetterI18n({
project: 'acme/mobile-app',
i18n,
defaultLocale: 'en',
storage: storageAdapter(mmkv),
});
ネットワークファーストストラテジー:
- CDN からフェッチ(最新の翻訳を取得)
- 永続キャッシュにフォールバック(MMKV または AsyncStorage)
- バンドルされた静的データにフォールバック(オプション)
ユーザーがネットワーク接続のある状態でアプリを開くと、翻訳はローカルにキャッシュされます。それ以降はオフラインでも完全に動作します。
任意の HTTP クライアント
CDN はプレーンな HTTPS エンドポイントです。SDK は不要です。
curl https://cdn.better-i18n.com/acme/web-app/en/common.json
{
"welcome": "Welcome to our app",
"nav.home": "Home",
"nav.settings": "Settings"
}
Swift、Kotlin、Go、Python、Ruby など、HTTP リクエストを送信できる任意の言語やプラットフォームから使用できます。
インフラストラクチャ
- Cloudflare Workers — 世界 300 以上のロケーションにまたがるエッジコンピューティング
- Cloudflare R2 — 翻訳ファイルのエグレス費用ゼロのオブジェクトストレージ
- 自動伝播 — 変更は数秒以内にすべてのエッジノードに到達
- DDoS プロテクション — Cloudflare のネットワークに組み込み済み
- TLS 1.3 — すべての CDN リクエストは暗号化されています
- エグレスコストゼロ — R2 はトラフィック量に関わらず帯域幅費用を排除します
ネームスペースの整理
翻訳をネームスペースに整理して、読み込む内容を制御します。
acme/web-app/
├── en/
│ ├── common.json → 共有 UI 文字列
│ ├── auth.json → ログイン、サインアップ、パスワードリセット
│ ├── dashboard.json → ダッシュボード固有の文字列
│ └── marketing.json → ランディングページのコピー
├── tr/
│ ├── common.json
│ ├── auth.json
│ └── ...
└── manifest.json → プロジェクトの言語設定
アプリは現在のページや機能に必要なネームスペースのみを読み込みます。ログインページは auth.json を、ダッシュボードは dashboard.json を読み込みます。これによりバンドルサイズを小さく保ち、ページ読み込みを高速化します。
定期的に cdn.detectDuplicates を使用して、複数のネームスペースに同一の値で現れるキーを特定し、cdn.cleanupDuplicates を使って common.json に統合してください。
公開コントロール
CDN は公開済みの翻訳のみを提供します。公開パイプラインを使用して、何を本番に反映するかを制御してください。
getPendingChanges— CDN にデプロイされる内容をプレビューpublishTranslations— 変更をデプロイ(すべてまたは特定の翻訳)cdn.mergePreview— 適用前にキーレベルのマージ結果をプレビューcdn.merge— ファイル全体を差し替えずに増分キー更新を適用getSyncs/getSync— デプロイ状況を追跡
これにより、段階的なワークフローが実現できます。保留中の変更をプレビューし、マージ結果を確認し、公開し、デプロイを監視する — すべてアプリケーションコードに触れることなく実現できます。
はじめ方
- dash.better-i18n.com でプロジェクトを作成します
cdn.setupで CDN を初期化し、R2 ストレージとエッジルーティングを設定します- ダッシュボード、REST API、または MCP ツールで翻訳を追加します
- CDN にデプロイするために公開します
@better-i18n/next、@better-i18n/use-intl、@better-i18n/expo、または直接 HTTP を使ってインテグレーションします
翻訳は無料プランを含むすべてのプランで CDN から提供されます。