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

多言語化対応における TypeScript の型定義を通して開発のしやすさについて考えた / TSKaigi TypeScript Multilingualization

多言語化対応における TypeScript の型定義を通して開発のしやすさについて考えた / TSKaigi TypeScript Multilingualization

アプリケーションの多言語化対応をする中で起きた問題として、マークアップから日本語がなくなってしまいエンジニア以外がコードを触る際にどこをいじれば良いかがわかりづらくなってしまうということがありました。
この問題を型定義で解決した話を通して、TypeScript を使ってバグを減らすだけでなく、チームの開発体験も向上できるということを伝えたいと思います。

nabeliwo

May 10, 2024
Tweet

More Decks by nabeliwo

Other Decks in Technology

Transcript

  1. 問題1 存在しない id を FormattedMessage に渡してしまう可能性がある • 存在しない id を渡しても

    defaultMessage によって日本語は表示されるの で、日本語でしか動作確認をしていないと翻訳できないことに気づかずリリ ースしてしまう可能性がある 翻訳オブジェクトに存在しない Key を渡しちゃってる!! フォールバックで 「キャンセル」が表示される
  2. 問題2 日本語の翻訳ファイルと FormattedMessage の defaultMessage とで日本語 が二重管理になる • 文言変更時の修正箇所が2箇所になる •

    翻訳ファイルと defaultMessage の日本語で乖離が起きてしまう可能性 同じ日本語を2箇所で管理してる〜〜
  3. 結果 Messages に存在しない key は FormattedMessage の id として渡せなくなっ た

    翻訳オブジェクトに存在しない keyを 渡すとエラーが出る!!
  4. なぜ defaultMessage を残すべきなのか • 前提として、フィードバックはコードを書くデザイナーから来ている • コンポーネントから日本語が消えることで直感的に検討ができなくなる • 例えば、見出し・ボタンのラベル・説明文など、主な表示言語である日本 語の文字量を考慮してコンポーネントを選定したり、レイアウトを調整し

    ており、これらが近接する場合は、その組み合わせ全体で文字量が多くな りすぎないようにバランスを調整することもあるため、これらがコード上 から読みづらくなってしまう • id で検索すればそこに入る日本語はわかるが、その1ステップの影響は少な くない
  5. 対応1 as const satis fi es を使う • 値が string

    ではなく文字列リテラル型になる
  6. 対応2 ジェネリック型を使う • FormattedMessage に渡された id props の値を元に defaultMessage の型

    を絞れるようになる 日本語の翻訳オブジェクトから 文字列リテラル型を取り出す