Upgrade to Pro — share decks privately, control downloads, hide ads and more …

型で頑張るプロダクト国際化

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →

 型で頑張るプロダクト国際化

Avatar for Shotaro Ozawa

Shotaro Ozawa

May 22, 2026

Other Decks in Technology

Transcript

  1. 開発中の課題 1. t 関数のラップ (= i18n化) が漏れている文字列の検出問題 a. 日本語テキストを定数化しているパターン、など 2.

    辞書データ登録漏れ問題 a. 未登録な翻訳キーがあってもビルドできてしまう (型チェックが通ってしまう) 6 / 24
  2. 開発中の課題 1. t 関数のラップ (= i18n化) が漏れている文字列の検出問題 a. 日本語テキストを定数化しているパターン、など 2.

    辞書データ登録漏れ問題 a. 未登録な翻訳キーがあってもビルドできてしまう (型チェックが通ってしまう) 今回は時間の都合により課題2にフォーカスしてお話しします。 7 / 24
  3. strictKeyChecks オプション 設定方法↓ // i18next.d.ts import 'i18next' import type jaJson

    from './locales/ja.json' import type enJson from './locales/en.json' // パイプラインで繋ぐことで、キーが全ての辞書データに存在するかがチェックできます。 type Translation = typeof jaJson | typeof enJson declare module 'i18next' { interface CustomTypeOptions { defaultNS: 'translation' resources: { translation: Translation } strictKeyChecks: true } } ※ tsconfig.json で `compilerOptions.resolveJsonModule: true` を指定する必要があります。 11 / 24
  4. Selector API 設定方法↓ // i18next.d.ts ... declare module 'i18next' {

    interface CustomTypeOptions { defaultNS: 'translation' resources: { translation: Translation } enableSelector: true } } ※ パフォーマンスに支障をきたす環境では `enableSelector: 'optimize'` の指定が推奨されています。(トレー ドオフ機能あり) 17 / 24
  5. Selector API 翻訳キーの存在判定ロジックは strictKeyChecks 有効時とで以下のように異なります。 before: i. typeof 翻訳データ を再帰的に走査して文字列

    Union 型で結びつける ii. t(key) の引数の型として Union 型を注入 after: i. t($ => $.key) のコールバック引数の型として typeof 翻訳データ を ほぼそのまま注入 18 / 24
  6. Selector API プロパティアクセサーの形なので、キーから翻訳テキストを辿るのに エディターの「定義へ移動」機能 が利用できます。 ← これ地味に求めてたやつ strictKeyChecks 有効時から、型検査のパフォーマンスが最大で約1,700倍も向上す るようです。

    https://github.com/i18next/i18next/pull/2322 より また、APIに破壊的変更が加わることから、非Selector API環境で構築済みのコードベ ースのマイグレーション用に codemod が提供されています。 https://www.npmjs.com/package/i18next-selector-codemod 19 / 24
  7. Selector API 実践編 こうなった原因は以下の2つでした。 1. キーがほぼすべて日本語文字で並べられている 2. キーがすべてフラット なので、機能有効化と並行して辞書データの構造見直しも進めていこうと思います。 辞書データ構造の指針について説明されている記事

    (自分調べ) "Translation key naming conventions: 11 best practices for developers" - Ilya Krukowski氏 https://lokalise.com/blog/translation-keys-naming-and-organizing/ "TypeScriptで実現する型安全な多言語化(i18n)設計 - アーキテクチャから運用まで" - 日向 一樹氏 https://zenn.dev/nexx_hinata/articles/38635095faab70#翻訳キー設計のベストプラクティス 22 / 24
  8. まとめ 辞書データは適切に構造化しておくべし react-i18next をこれから導入するプロダクトでは Selector API 利用がおすすめ react-i18next 導入済みのプロダクトには、まずは strictKeyChecks:

    true 適用が おすすめ マイグレーションが可能な状況であれば Selector API 利用がおすすめ ご清聴ありがとうございました! 24 / 24