多言語ポートフォリオ:グローバルな読者に届ける
6 言語を話すポートフォリオ。難しかったのは、何を訳さないかを決めることだった。
すべてを決めた判断
ブラジルの開発者が「data pipelines」について読むとき、期待しているのは data pipelines であって canalizações de dados ではありません。英語の用語こそが業界の用語です。訳してしまうと、よくても不自然、悪ければ見下した響きになります。
この一例がシステム全体の規則を決めました。仕事はポートフォリオを 6 言語に翻訳することではありません。用語ごとに、何を訳さず残すべきかを決め、その判断を再現可能にすることです。
システムがしていること
サイトは next-intl を localePrefix: 'always' で動かしているため、すべてのルートがロケールのセグメント配下に入ります。i18n/config.ts では 6 つを定義しています。
export const locales = ['en', 'pt-BR', 'es', 'ja', 'fr', 'de'] as const;
コンテンツはロケール接尾辞付きのファイルとして置かれます。 hello-world.mdx が英語のベースで、hello-world.pt-BR.mdx と hello-world.ja.mdx がその隣に並びます。lib/content.ts は要求されたロケールのファイルを探し、無ければ英語のベースにフォールバックします。
並び順のメタデータは常にベースファイルから読まれます。 日付、pinned、lastUpdated は、描画しているロケールに関わらず英語のソースから読まれます。そのため、ある記事が日本語の一覧と英語の一覧で違う位置に来ることはありません。
UI 文字列は deep merge でフォールバックします。 i18n/request.ts は messages/en.json をベースとして読み込み、その上にロケールのカタログをキー単位でマージします。キーが無ければ MISSING_MESSAGE エラーではなく英語の文字列が描画されるので、未完成のカタログでも安全に出せます。
フォールバックは明示され、黙って起きない
このページの以前の版では、英語へのフォールバックは「静かに」起きると書いていました。それは目標設定が間違っていましたし、実際のサイトの挙動とも違います。
フォールバックすると getContentLocaleStatus() が 'fallback' を返し、2 つのことが起きます。コンテンツ要素に lang="en" が付き、スクリーンリーダーや検索エンジンに実際の言語が伝わります。そしてコンテンツの上に翻訳に関する注意書きが表示されます。
/ja/ の URL で黙って英語を出すのは、読み手にもクローラーにも誤解を与えます。それを明示するコストは UI 1 行です。
2 つのパイプライン、別々の役割
DeepL は直訳を担当します。速くて一貫していますが、技術用語まで訳しすぎる傾向があります。Claude エージェントはトランスクリエーションを担当し、慣用表現を適応させ、自然な流れになるよう語順を組み替え、下記の規則に従って技術用語を英語のまま保ちます。
npm run translate # DeepL: messages/*.json
npm run translate:mdx # DeepL: MDX content
npm run i18n:mdx # Claude: transcreation
npm run i18n:sync # Claude: fill missing translations
どちらも英語のソースの隣にロケール接尾辞付きのファイルを書き出します。いずれも無条件には信用しません。公開前に出力を読み返し、frontmatter のキーが英語のままか、画像パスと URL が変わっていないか、コードブロックと表が壊れていないか、className の値が訳されていないかを確認します。
実際のローカライズ規則
必ず訳すもの: ナビゲーションと UI ラベル、記事本文、フォーム項目、CTA。
必ず英語のまま残すもの: 製品名(Next.js、TypeScript、Claude)、企業名(Nike、Meta)、そして各読者層がすでに英語で使っている技術語彙 — API、dashboard、data pipeline、template。
ロケールごと:
- pt-BR — 「painel」ではなく "dashboard"、「modelo」ではなく "template"、「comércio eletrônico」ではなく "e-commerce"
- es — 「panel de control」ではなく "dashboard"、「vendedores」ではなく "marketers"
- ja — 製品名はカタカナではなくラテン文字で。一般的な外来語はカタカナで
- fr — 「tableau de bord」ではなく "dashboard"。CTA は自然な表現で("Contactez-moi")
- de — くだけた "du"、技術用語は英語の借用語、名詞は大文字始まり
Projects
canalizações de dados
data pipelines
始めた頃の自分に言いたいこと
ローカライズは、技術的な装いをまとったプロダクトの判断です。パイプラインは簡単な部分でした。本当の仕事は「何に手を触れないか」の規則づくりで、しかもそれは書き残すべき部分です。翻訳ツールが毎回、気持ちよく間違える部分だからです。
成功の基準はサイトが 6 言語あることではありません。サンパウロや東京の読者が、自分なら使ったはずの語彙をそこに見つけることです。
翻訳についての注記
ここでの翻訳は機械で生成し、その後に上記の規則と突き合わせて確認しています。機械翻訳は出発点であって、完成品ではありません。
お使いの言語で不自然な箇所があれば、お問い合わせフォームからご指摘ください。自動化が取りこぼすものに、ネイティブスピーカーは気づきます。
成果
- 6 つのロケール:英語、ポルトガル語(ブラジル)、スペイン語、日本語、フランス語、ドイツ語
- 2 つのパイプライン:直訳は DeepL、トランスクリエーションは Claude エージェント
- ロケールごとの URL と、各言語の hreflang alternate
- 訳が無い場合は英語にフォールバックし、隠さず明示する
- ローカライズ規則が、各読者層の期待どおり技術用語を英語のまま保つ