ソートリーダーシップ//8 読了時間

i18n技術的負債の隠れたコスト

Eray Gündoğmuş
共有

エンジニアの生産性が低いわけでも、プロダクトが複雑すぎるわけでもありません。新市場への展開に1ロケールあたり6ヶ月かかっているのは、3年前に誰かが"Welcome back, {name}!"をJSXに直接ハードコードし、その後1000人が同じことをしたからです。


どのエンジニアリングチームも技術的負債を追跡しています。コードの複雑性指標、依存関係の更新バックログ、テストカバレッジのギャップ。SonarQubeのスコアを暗記しているチームも多いでしょう。

しかし、ほとんどのCTOにi18n負債について聞くと、キョトンとした顔が返ってきます。追跡されておらず、測定もされておらず、どのダッシュボードにも表示されません。そして、技術的負債のスプレッドシートにある大半の項目よりも、静かにコストを生み出し続けています。

この記事では、そのコストを数字で示します。仮説の数字ではなく、午後の時間で自分のコードベースに対して計算できる数字を。

i18n技術的負債の実態

技術的負債には明確な定義があります:今、手軽な解決策を選ぶことで生じる将来の手直しコストです。i18nにおける手軽な解決策は、ほぼ常に同じです:翻訳インフラを省略し、文字列をハードコードし、「後で国際化しよう」と先送りすること。

明白な負債:ハードコードされた文字列

JSX内の<p>Submit</p>はすべて、翻訳前に手動で抽出が必要な文字列です。alert('Are you sure?')はすべて、翻訳システムの外に存在するユーザー向けメッセージです。

最初からi18nを考慮して構築されていない5万行のReactコードベースに文字列抽出ツールを実行してみてください。一般的に3,000〜8,000個のハードコードされた翻訳可能な文字列が見つかります。それぞれについて以下が必要です:

  1. 特定(ユーザー向けか?)
  2. 翻訳キーへの抽出
  3. t()呼び出しへのラッピング
  4. 翻訳ファイルへの追加
  5. 各ターゲットロケールへの翻訳
  6. レイアウトと文字切れのテスト

完全な抽出サイクルで1文字列あたり10〜15分とすると、5,000文字列は800〜1,250エンジニア時間。1人の開発者の5〜8ヶ月分です。コード記述時に外部化すれば無料だった文字列のために。

見えない負債:構造的な問題

ハードコードされた文字列は明白な負債です。構造的な問題はさらに悪く、複利で積み重なります:

キー構造がない。 キーが"submit_button""submit_button_2"のようなフラットな文字列です。階層も、名前空間の規則も、機能エリアごとに一括翻訳する方法もありません。チェックアウトフローを翻訳したい場合、分類がないためチェックアウト関連のキーでフィルタリングできません。

文字列のコンテキストがない。 翻訳者には"Total"とだけ見えて、推測するしかありません:テーブルのヘッダーか、ボタンのラベルか、請求書の明細か?ドイツ語では、これらは3つの異なる単語です。各キーにコンテキストメタデータがなければ、翻訳者は15〜25%の確率で誤った選択をします。

翻訳メモリがない。 「本当に削除しますか?」というフレーズがアプリ全体で12回登場します。翻訳メモリがなければ、12回別々に翻訳され、翻訳者によって12通りの異なる表現になる可能性があります。

自動化がない。 翻訳の更新には、開発者がJSONを手動でエクスポートし、翻訳者にメールで送り、ファイルが返ってくるのを待ち、手動でインポートし、PRを作成する工程が必要です。各往復に3〜5営業日かかります。

組織的な負債

i18n負債の最も根深い形態は、コードにありません。組織図にあります。

オーナーシップの欠如。 エンジニアリングは翻訳を所有しない——「それはコンテンツの仕事だ」。マーケティングは技術システムを理解しない。プロダクトマネージャーは翻訳カバレッジを指標として追跡しない。誰もそのギャップを所有していません。

翻訳更新のSLAがない。 新機能は英語でリリースされ、誰かが翻訳を開始するまで2〜4週間、英語のみの状態が続きます。国際ユーザーは、すべてのリリース後数週間、半分翻訳されたインターフェース——英語のボタンとドイツ語のラベルが混在——を目にします。

知識の欠如が連鎖する。 新しいエンジニアは見たパターンをコピーします。コードベースにハードコードされた文字列があれば、彼らもハードコードします。負債はヘッドカウントに比例して増加します。

支払っているコストを定量化する方法

i18n負債は測定可能です。以下にコストのカテゴリと計算方法を示します。

エンジニアリング時間の税

Stripeの2023年エンジニアリング調査によると、開発者は23%の時間を技術的負債のタスクに費やしています。McKinseyの試算では、新たな価値が生み出される前に、ITバジェットの20〜40%が負債の管理に充てられます。

i18nに特化して、1スプリントでこれらを追跡します:

文字列抽出時間。 開発者がハードコードされた文字列をt()呼び出しでラッピングするのに何時間費やしたか?i18nを後から適用するほとんどの企業では、移行中に開発者1人あたりスプリントごとに4〜8時間です。

マージコンフリクトの解決。 翻訳がリポジトリにJSONファイルとして存在する場合、ロケールファイルに関わるマージコンフリクトは何件か?各コンフリクトの解決に15〜30分(JSONの構文の再検証、キー順序の再確認、翻訳CIの再実行)かかります。6人の開発者がいれば、スプリントごとに1〜2件:30〜60分

コンテキストスイッチのコスト。 開発者が翻訳者にUIのコンテキストを説明するSlackスレッドは何件か?各スレッドは開発者にとって15分のコンテキストスイッチ:スプリントごとに1〜2時間

デプロイのオーバーヘッド。 デプロイの何%が翻訳のみの変更によるものか?翻訳がリポジトリにある場合、すべてのコピー修正が完全なCI/CDパイプラインをトリガーします。1ヶ月追跡してみてください。通常、総デプロイ数の15〜25%です。

リリース遅延の乗数効果

ここで数字が不快になります。

プロダクトには5つのターゲットロケールがあります。各ロケールで、新機能の新しい文字列を翻訳するのに平均2週間かかります(手動エクスポート→翻訳→インポート→QAのサイクルを考慮)。年間12の機能をリリースします。

5ロケール × 2週間の遅延 × 12リリース = 120ロケール週の遅延。

これは、国際ユーザーが不完全なプロダクトを見ている120週間です。国際収益が40%のSaaSプロダクトの場合、ユーザーベースの40%がすべてのリリース後2週間、劣化したプロダクトを経験しています。

複利効果は残酷です。各機能が新しい文字列を追加します。前の機能の翻訳が次のリリース時に完了していなければ、翻訳者は2つのバックログを同時に処理することになります。遅延が増加し、品質が低下し、チームはショートカットを始めます——「とりあえず英語でリリースして、後で翻訳しよう」。負債が増加します。

市場機会のコスト

CSA Researchによると、オンライン消費者の87%が英語のみのウェブサイトからは購入しないと報告しています。グローバルソフトウェアローカリゼーション市場は2025年に62.7億ドルと評価され、12.4%のCAGRで成長しています(Meticulous Research)。

あなたより3ヶ月早くフランス語翻訳をリリースした競合他社は、フランス語ユーザーを3ヶ月間獲得するだけではありません。口コミ、アプリストアのレビュー、フランス語検索結果でのSEOランキングを獲得します。3ヶ月分の収益を失っているのではなく、市場全体のファーストムーバーアドバンテージを譲渡しているのです。

ARR 1,000万ドル、国際成長ポテンシャル30%のSaaSプロダクトの場合、新ロケールのローンチが3ヶ月遅延すると、ロケールあたり約75万ドルの収益繰延が発生します。スライドに載せる価値のある数字です。

なぜi18n負債は通常の技術的負債より速く複利で増えるのか

ほとんどの技術的負債は線形です。乱雑な関数はそれに触れる開発者を遅らせます。古い依存関係はそれを使用するサービスに影響します。影響範囲は限られています。

i18n負債は乗数的です。その理由を説明します。

悪いアーキテクチャのネットワーク効果

共有コンポーネントに1つの翻訳キーが欠落すると、すべてのロケールで1つのページが壊れます。1つの誤訳はそれを使用するすべての画面に伝播します。1つの不適切に構造化された名前空間は、すべての新しいキーの作成に余分な時間をかけさせます。

乗数は:影響を受ける文字列数 × ロケール数 × ロケールあたりのユーザー数

「名前空間なしでフラットキーを使おう」という1つのアーキテクチャ上の決定が、数千の文字列、数十のロケール、翻訳コードに触れるすべての開発者に摩擦を生み出します。

採用の乗数効果

新しいエンジニアは既存のパターンをコピーします。コードベースに500個のハードコードされた文字列があれば、新入社員もハードコードします。i18nシステムが存在することを知らないのは、誰もオンボーディングで教えなかったからです。負債はすべての採用とともに増加します。

重大な技術的負債を抱えるエンジニアリングチームは25〜35%高い離職率を報告しています(Haystack Analytics 2024)。理由:開発者は文字列の抽出やマージコンフリクトの解決に時間を費やしたくありません。機能を構築したいのです。i18nのオーバーヘッドによりすべての機能に30%多くの時間がかかるコードベースであれば、優秀なエンジニアはそうでないコードベースを見つけるでしょう。

「拡張前に修正しよう」の罠

これが最も一般的な意思決定パターンであり、最もコストがかかります:

  1. 1年目:プロダクトが英語でローンチ。「拡張前にi18nを追加しよう。」
  2. 2年目:プロダクトが成長。i18nは後回しにされ続ける。コードベースに5,000個のハードコードされた文字列が積み重なる。
  3. 3年目:営業チームがドイツでリードを獲得。リーダーシップが言う:「ドイツ語でどれくらい早くローンチできる?」
  4. エンジニアリングの答え:「すべての文字列の抽出、翻訳パイプラインのセットアップ、翻訳、QAに6ヶ月。」
  5. リーダーシップ:「遅すぎる。最も目立つページだけ手動で翻訳して。」
  6. 結果:半分翻訳されたプロダクト。一貫性のない品質。「本物の」i18n移行は先送りされ続ける。

3年目までに、適切な国際化のコストは、1年目に実施していれば「2週間のセットアップ」だったものが、「6ヶ月の移行」(成熟したコードベースの後付け)に膨れ上がりました。技術的負債は蓄積しただけでなく、複利で増加したのです。

監査:i18n負債スコアを見つける

1スプリントでi18n負債を定量化できます。その方法を説明します。

ステップバイステップの監査プロセス

1. 未追跡の翻訳可能な文字列を数える。

コードベースでASTベースの文字列抽出ツールを実行します:

# Better i18n CLIを使用
npx @better-i18n/cli scan

# またはi18nextプロジェクトでi18next-parserを使用
npx i18next-parser

出力は、翻訳システムの外に存在するユーザー向け文字列の数を教えてくれます。これが生の抽出バックログです。

2. 翻訳ファイルの構造を監査する。

以下の質問に答えます:

  • キーは機能/コンポーネントごとに整理されているか、フラットか?
  • 最大の単一ロケールファイルは何個のキーを持つか?(1ファイルに500以上あれば名前空間の問題です)
  • キーにはコンテキストの説明があるか?
  • 用語集はあるか?

3. 型安全性を確認する。

# 偽のキーを追加してビルドが検出するか確認
t('this.key.definitely.does.not.exist');

ビルドが通過すれば、コンパイル時のキー安全性がありません。すべてのキー参照は実行時の賭けです。

4. 翻訳ラグを測定する。

「開発者が新しい文字列を含むPRをマージ」から「すべてのロケールの本番環境で翻訳が有効」までの時間を追跡します。ベンチマーク:

  • グリーン:24時間未満(自動化パイプライン、CDNデリバリー)
  • イエロー:1〜5日(一部自動化、バッチ処理)
  • レッド:1週間以上(手動ワークフロー、デプロイメント連動)

負債レベルをスコアリングする

カテゴリグリーンイエローレッド
ハードコードされた文字列文字列の1%未満1〜10%10%以上
キー構造機能別に名前空間化部分的に整理フラットまたは混乱
型安全性コンパイル時チェック実行時警告チェックなし
翻訳ラグ24時間未満1〜5日1週間以上
コンテキストメタデータすべてのキーに一部のキーになし
自動化完全なCI/CDパイプライン部分的手動エクスポート/インポート

主にグリーン:i18nインフラは堅固です。最適化に集中しましょう。 主にイエロー:負債が蓄積しています。ロケールを追加する前に構造的な問題を修正しましょう。 主にレッド:停止してください。拡張する前にこれを修正してください。コストはこれから上がる一方です。

見返り:i18n負債を解消することで得られるもの

エンジニアリング速度の回復

i18nインフラが堅固な場合:

  • 新ロケールの追加はエンジニアリングプロジェクトではなく、コンテンツタスクになります。2,000の翻訳済み英語キーを持つプロダクトへの日本語追加:数ヶ月(移行時間)ではなく、数日(翻訳時間)。
  • 翻訳ファイルのマージコンフリクトがゼロ。キーはリポジトリのJSONファイルではなく、プラットフォームに存在します。
  • 実行時の欠落キーバグがゼロ。TypeScriptがビルド時にすべてのタイポをキャッチします。
  • 30秒で翻訳修正。1語の修正がデプロイなしでCDNに公開されます。

市場投入時間の短縮

i18n負債を抱えるチームと抱えないチームの違い:

シナリオ負債あり負債なし
新ロケールでのローンチ3〜6ヶ月1〜2週間
すべてのロケールに機能をリリース英語リリースから2〜4週間後同日
翻訳エラーの修正15〜45分(デプロイ)30秒(CDN公開)
新チームメンバーの追加i18nパターンの習得に数週間標準オンボーディング

チームのモラル

これは測定が難しく、過小評価しやすいものです。時間の20%を翻訳の配管作業に費やすエンジニアは、仕事を楽しんでいません。コンテキストなしで作業する翻訳者は品質が低下し、燃え尽き症候群になりやすいです。

インフラを修正すると:

  • 開発者はt('checkout.submit')と書くだけで、翻訳のロジスティクスについて考えることはありません。
  • 翻訳者はすべての文字列のUIコンテキストを確認し、初回から正確な翻訳を作成します。
  • プロダクトマネージャーはスプレッドシートではなく、ダッシュボードで翻訳カバレッジを追跡します。

90日間のi18n負債返済計画

月1:監査と測定(コード変更なし)

  • 文字列抽出監査を実行します。数字を記録します。
  • 4スプリントの翻訳ラグを追跡します。平均を記録します。
  • ロケールファイルに関わるマージコンフリクトを数えます。頻度を記録します。
  • 上記の計算式を使ってコストを計算します。リーダーシップに数字を提示します。

この月は可視化についてです。測定できないものは修正できません。

月2:出血を止める

  • PRで新しいハードコードされた文字列をブロックするESLintルールを追加します。新しい負債は作らない。
  • CIでASTスキャンを設定します。すべてのPRが新規/未使用キーを報告します。
  • 最も変更頻度の高い5つのファイルを適切なi18nキー構造に移行します。パターンが機能することを証明します。
  • 最も重要な40のドメイン用語で用語集を始めます。

この月は封じ込めについてです。移行を計画しながら、新しい負債の蓄積を止めます。

月3:加速と自動化

  • コードベースをCDNデリバリーを持つ翻訳プラットフォームに接続します。翻訳をリポジトリから移動させます。
  • Tier 1コンテンツ(UIの文字列、エラーメッセージ、システム通知)にAI翻訳を有効にします。これで翻訳ボリュームの60〜70%が自動的に処理されます。
  • CIで翻訳カバレッジレポートを設定します。すべてのPRが表示します:「この変更は15ロケール中12ロケールで翻訳されています。」
  • 抽出バックログを開始します。ページトラフィックで優先順位付け:最も高トラフィックのページから。

月3の終わりには以下が達成されているはずです:

  • コードベースに新しいハードコードされた文字列がゼロ
  • 新しい文字列の翻訳ラグが24時間未満
  • 抽出バックログの明確なバーンダウンチャート
  • 移行継続を正当化するコストデータ

数字は明確です

i18n技術的負債は、測定するまで見えません。測定すれば、明白です。

初日にi18nインフラをセットアップするチームは、週に2時間のメンテナンスを費やします。2年間の成長後にi18nを後付けするチームは、移行に6ヶ月かかります——そして、アーキテクチャが機能ではなく制約を中心に設計されているため、継続的なメンテナンスも依然として高いままです。

コードベースに1,000以上のユーザー向け文字列があり、2つ以上のロケールにサービスを提供している(または予定している)場合、i18n負債の修正のROIは数ヶ月ではなく数週間で測定されます。

待てば待つほど、負債は複利で増え続けます。


Better i18nはエンジニアリングチームにi18n負債の蓄積を止めるインフラを提供します:ASTキースキャン、CDNデリバリーの翻訳、型安全なSDK、用語集適用付きのAI翻訳。無料ティアには、現在の負債を監査して返済を開始するために必要なすべてが含まれています。10分で始める

Comments

Loading comments...