2026年5月のある火曜の午後、iOS 壁紙アプリの新規機能で追加した文字列が、また8言語ぶんの翻訳待ち状態になっていました。Localizable.xcstrings を開くと、まだ翻訳されていないキーが横一列のカラムで並んでいて、英語・中国語(簡体/繁体)・韓国語・スペイン語・フランス語・ドイツ語・ポルトガル語のそれぞれをひとつずつ埋めていく必要があります。1リリースで増える新規キーは平均8〜12個ほどですが、これに8言語ぶんを掛け合わせると、いつのまにか1時間が消えていきます。
2014年から個人開発でアプリを運営してきて、累計5,000万ダウンロードまで育った壁紙・癒し・引き寄せ系のアプリ群は、海外比率が高めです。英語圏ユーザーが多いのはもちろんですが、ドイツ・ブラジル・台湾といった国々のレビューも毎週届きます。だからこそ、機械的なローカライズで終わらせず、ニュアンスを揃えた言い回しにしておきたい気持ちがずっとありました。
Antigravity にこの翻訳作業を2週間任せてみたのが、ちょうど2週間前のことです。完全自動化が目的ではなく、「自分が xcstrings エディタで1セル1セル埋めていた作業を、AI に下書きさせて自分は最終調整だけ行う」体制への移行が狙いでした。以下、2週間で組み上がった運用と、想定外だった挙動、既訳資産との突き合わせで見えてきたことを書き残しておきます。
始めた動機 — 翻訳の「機械的な部分」と「判断する部分」を分けたかった
17歳のころにオンラインで出会ったメンターから「芸術とは全ての人に開かれた自然な言語だ」と教わった記憶が、ローカライズの作業をするときに必ず頭をよぎります。アプリの文言ひとつでも、その言語を話す方々に自然に届くものでなければ、その教えを実装できていない気がするのです。
ただ、xcstrings に新規キーを追加するたびに、"Continue" を "Fortsetzen" か "Weiter" のどちらにするか、"You're all set" を韓国語でどう自然に言うかをゼロから考え直す作業は、判断というより辞書の往復に近いものでした。Apple の公式ガイドラインや過去のリリースで使ってきた言い回しを覚えていれば一瞬で済むはずなのに、毎リリースで思い出し作業が発生してしまう。これが「機械的な部分」だと感じはじめたのが今年の春先からです。
両祖父が宮大工だったこともあり、手を動かす作業そのものを軽く見たくはありません。けれども宮大工の祖父たちも、墨付けと彫り込みは別の段取りでやっていたはずで、ここを一緒くたにしている自分の方が雑だったのだと思います。
Antigravity に任せた範囲・残した範囲
最初に決めたのは、Antigravity 側に渡す責務の境界線です。Localizable.xcstrings は JSON ベースのファイルなので、Antigravity は読み書き両方ができます。ただ、すべてを AI に任せると過去のリリースで使ってきた言い回しと矛盾する翻訳が混ざってしまうので、以下のように分けました。
- AI に任せた範囲: 新規追加キーの初稿翻訳(8言語ぶん)、文脈コメントの自動生成、過去
xcstrings内で似たキーを検索して言い回しを揃える提案、Localizable.xcstrings内のstateをtranslatedに書き換える操作 - 自分の判断に残した範囲: ブランド色の強い文言(アプリ名・モード名・有料機能の名称)、Apple のレビューに引っかかりそうなアラート系文言、初訳の最終承認、リリースノートの翻訳
- 両者で半々の範囲: 既訳と新訳のニュアンスがずれる場合に、過去の訳を踏襲するか新しい訳に揃え直すかの判断
要するに、AI には「初稿と整合性チェック」までを任せ、「最終的にユーザーに届く文字」は人間が承認する形にしました。最初の数日は何度か境界を引き直しましたが、2週目の中頃には自然に落ち着きました。
2週間で組み上がった運用フロー
実際に運用に乗ったフローは、新規キーを追加したタイミングで走らせます。
- Xcode 上で
Localizable.xcstringsに新規キーを追加し、Source(英語)に確定文を書く - Antigravity のチャットに
xcstringsファイルをドラッグし、「新規追加キーの未翻訳セルだけを8言語に翻訳してください。過去キーで似た言い回しがあれば踏襲してください」と依頼する - Antigravity が
xcstringsを読み、stateがnewのキーだけを抽出して、各言語の訳を生成する - 既訳と矛盾しそうな箇所について、Antigravity 側から「この言い回しは過去キー XXX と揃えますか?それとも別表現にしますか?」と質問が返ってくることがある
- 私が方針を返事すると、Antigravity が
xcstringsファイルを差分付きで書き換える(git のステージング前の状態) - 私は Xcode の
xcstringsエディタで生成された訳を1セルずつ目視確認し、違和感のあるものだけ手動で直す - ビルドして実機で文字切れ・崩れがないかを確認してコミットする
このフローを回した最初の日は、8キー × 8言語=64セルの翻訳が、初稿生成から最終確認まで含めて20分で終わりました。2週目には10〜15分前後で安定しています。同じ作業を従来は45〜60分かけていたので、空いた時間はそのまま実装に回せるようになりました。
想定外だった挙動と、対処したこと
すべてが順調だったわけではありません。xcstrings を実プロジェクトで使うときに引っかかった点を、3つに絞って書き残しておきます。
1つめは、複数形の Plural Variations の扱いです。xcstrings の複数形対応は単純な Localizable.strings の .stringsdict よりだいぶ整理されたとはいえ、one/other 以外に zero/two/few/many を要求する言語があります。Antigravity に最初に依頼したときは other だけが埋まっていて、ロシア語などで few が空欄のまま残ったことがありました。プロンプトに「対象言語が zero two few many カテゴリを必要とする場合は、それも自動で埋めてください」と明示してから、抜けが出なくなりました。
2つめは、文字列補間(%@ や %lld)のプレースホルダの扱いです。"Welcome back, %@!" のような文字列を翻訳するとき、AI が %@ の位置を言語の自然な語順に合わせて動かしてくれるのは助かりますが、たまに %@ が %s に書き換わってしまうケースが初期にありました。これはコンパイル時にエラーになるので致命的ではありませんが、CI で気づくと地味に時間を取られます。プロンプトに「フォーマット指定子(%@・%lld・%.2f など)は1文字も変えないでください。位置だけは語順に合わせて移動可能です」を追加して解消しました。
3つめは、既訳との整合性チェックの精度です。これは数を重ねるごとに改善しますが、最初は同じ意味のキーが過去リリースで "閉じる"/"閉じる"/"とじる" のように揺れていて、Antigravity が「どれに合わせるべきか」を判断できないことがありました。プロジェクトの言い回しガイドを Antigravity の _documents/style_glossary.md に置き、毎回のプロンプトでこれを参照させる形にしてから、揺れがほぼなくなりました。
既訳資産との突き合わせ方
ここが一番、運用に乗せる前に時間をかけた部分です。Localizable.xcstrings 自体が「過去訳の DB」として機能するので、AI に「既訳と矛盾しないか」を毎回確認させたかったのです。
実装としてはシンプルで、Antigravity に渡すプロンプトに、xcstrings 全文を毎回貼るようにしました。コンテキストは膨らみますが、xcstrings は通常そこまで大きくなく、4本のアプリすべてで3〜8KB の範囲に収まっていたので、コンテキスト圧迫の問題にはなりませんでした。
それでも xcstrings が大きく育ってきた場合に備えて、Antigravity の Workspace 機能で「過去キーから関連語を検索して引用するだけ」のサブエージェントを別途用意してあります。これは現時点では出番が少ないですが、将来的にキーが数百を超えたときに切り替える想定です。
2週間で空いた時間で見えてきたこと
正味で稼げた時間は、新規キー追加1回あたり30〜40分ほどです。月に4〜6リリースあるので、合計2〜4時間の余裕が生まれました。たいした時間ではないように見えますが、この余裕は「翻訳作業をするかしないかでリリースを先延ばしする」という判断を消してくれたのが一番大きい変化でした。
これまでは「機能追加はできているが、ローカライズが追いついていないから来週リリースにしよう」という先送りが月に2〜3回ありました。それがほぼゼロになり、機能ができたらその日のうちにリリースできる体制に近づきました。
副次効果として、xcstrings 内の「文脈コメント」が前より丁寧に書かれるようになりました。AI に翻訳させるためのコンテキストとして自分で書き加えるので、結果として将来の自分が見たときの読みやすさも上がっています。離れて暮らす子どもたちにも、いつか自分の作ったアプリを通じて何かが伝わってほしいと願っているので、その「未来の読み手」のひとりが将来の自分でもあるのだなと、しみじみ感じています。
これから取り組むこと
短期的には、対象言語をさらに2〜3言語追加する予定です。トルコ語とアラビア語のリクエストが最近のレビューで増えており、Antigravity に下書きを任せられる体制が整ったぶん、対応コストの心配が小さくなりました。アラビア語は RTL レイアウトの調整が別途必要なので、そちらの作業をどう Antigravity と分けるかを次の2週間で詰めます。
中長期的には、xcstrings の翻訳と同じやり方を App Store Connect 側の説明文・キーワード・スクリーンショットキャプションにも広げたいと考えています。xcstrings でうまくいった「初稿は AI、最終確認は人間」のリズムを ASC のメタデータにも持ち込めれば、リリース1回ぶんの所要時間がもう一段落ちるはずです。
実装の参考になれば幸いです。同じように個人開発で多言語対応に悩まれている方の参考になればうれしいです。