コンテンツへスキップ
Hono

Hono の国際化

1 つのミドルウェアがリクエストのロケールを判定し、各ルートハンドラーに翻訳関数を渡します。メッセージは CDN から配信されるため、再デプロイなしで新しい文言を公開できます。

Setup

Hono を Better I18N で設定する

パッケージをインストール

Hono とサーバーアダプターを追加します。ほかに必要なものはありません。

terminal
npm install hono @better-i18n/server

i18n シングルトンを作成

モジュールスコープで一度だけ生成します。メッセージキャッシュはすべてのリクエストで共有されます。

src/i18n.ts
import { createServerI18n } from '@better-i18n/server';

// Module scope, not per request: the TtlCache is shared across requests.
export const i18n = createServerI18n({
  project: 'your-org/your-project',
  defaultLocale: 'en',
});

ミドルウェアを組み込む

app.use の後は、すべてのハンドラーがコンテキストから locale と t を読み取れます。

src/index.ts
import { Hono } from 'hono';
import { betterI18n } from '@better-i18n/server/hono';
import type { Translator } from '@better-i18n/server';
import { i18n } from './i18n';

const app = new Hono<{
  Variables: { locale: string; t: Translator };
}>();

app.use('*', betterI18n(i18n));

app.get('/users/:id', (c) => {
  const t = c.get('t');
  return c.json({ error: t('errors.notFound') }, 404);
});

export default app;
Capabilities

Hono チームが Better I18N を選ぶ理由

設定は 1 行: app.use('*', betterI18n(i18n))
Web 標準ベース — リクエストヘッダーを直接読み取り、アダプター層は不要
Hono が動く場所ならどこでも: Cloudflare Workers、Bun、Deno、Node
モジュールスコープのインスタンスがリクエスト間でメッセージキャッシュを共有
新しいメッセージは約 60 秒で CDN から届き、再デプロイは不要
locale と t の型付きコンテキスト変数
Example

ローカライズされた Hono ルート

ミドルウェアが先に実行されるので、ハンドラーは必要なものだけを読みます。

import { OpenAPIHono } from '@hono/zod-openapi';
import { betterI18n } from '@better-i18n/server/hono';
import type { Translator } from '@better-i18n/server';
import { i18n } from './i18n';

const app = new OpenAPIHono<{
  Variables: { locale: string; t: Translator };
}>();

// Detect locale + inject `locale` and `t` into every request context
app.use('*', betterI18n(i18n));

app.get('/greeting', (c) => {
  const t = c.get('t');
  const locale = c.get('locale');

  return c.json({
    locale,
    message: t('greeting.hello'),
  });
});

export default app;

その他のフレームワーク

Get started

Hono API をすべての言語で届ける

プロジェクトを接続し、ミドルウェアを追加すれば、デプロイパイプラインに触れずに翻訳できます。