多言語ヘルプを置き去りにしていた個人開発アプリの事情
2014年から続けている iOS / Android の個人開発では、累計5,000万ダウンロードに育った壁紙系と癒し系のアプリを運営しています。AdMob 収益の柱はそれらの古参アプリで、収益のうち半分以上は日本国外のユーザーから生まれています。
それなのに、アプリ内ヘルプ(FAQ・初回起動チュートリアル・問い合わせ前の自己解決ガイド)は長らく日本語と英語の2言語だけで凍結されていました。理由はシンプルで、翻訳の更新コストがアプリ機能の追加コストを上回り、つい後回しになっていたからです。
2026年の2月に重い腰を上げ、Gemini 2.5 Flash を中心にした翻訳パイプラインを組んで、5言語(日本語・英語・スペイン語・ドイツ語・ポルトガル語)まで自動更新する仕組みに切り替えました。本記事は3ヶ月運用して残ったログと所感の整理です。
翻訳パイプラインの全体像
ヘルプの原稿は Markdown で1ファイル1トピック、合計38本を維持しています。CI が走るたびに以下の流れで多言語 JSON を生成しています。
# scripts/translate_help.py(抜粋)
from google import genai
MODEL_FAST = "gemini-2.5-flash"
MODEL_REVIEW = "gemini-2.5-pro"
PROMPT = """以下の Markdown を {target} に翻訳してください。
- 固有名詞・ブランド名・絵文字はそのまま残す
- アプリ内 UI ラベル {ui_terms} は翻訳しない
- 文末記号は対象言語の慣習に合わせる
- 200字を超える段落は分割しない
原文:
---
{source}
---"""
def translate(source: str, target: str, ui_terms: list[str]) -> str:
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
resp = client.models.generate_content(
model=MODEL_FAST,
contents=PROMPT.format(
target=target,
ui_terms=", ".join(ui_terms),
source=source,
),
config={"temperature": 0.2, "max_output_tokens": 4096},
)
return resp.text訳文は Markdown のまま保存し、ビルド時に各 OS のリソース形式(iOS は .strings、Android は strings.xml、Web ヘルプは JSON)へ変換しています。Flash の応答は速く、38本×4言語の更新が手元の Mac mini で30秒前後に収まりました。
Flash と Pro の役割を分けるまでの試行錯誤
最初の数週間は Flash 単独で運用していたのですが、長めのトピック(おおむね800字を超える FAQ)で固有名詞の取りこぼしや、UI 用語が思わぬ動詞に置き換わるケースが目立ちました。たとえば「壁紙を保存」が「壁紙を残す」と訳されてしまい、アプリの実際のボタン文言とずれてしまう。
そこで採用したのが、Pro を「校正係」として後段に挟む構成です。Pro には Flash の出力と元の Markdown、UI 用語辞書を一緒に渡して、差分があるトピックだけを差し戻してもらう。Pro が手を入れたファイルだけ再変換するルールにしておくと、Pro の呼び出し数は全体の15%程度に収まりました。
3ヶ月の通算で API 利用料はおよそ月 720 円。校正後の差分が大きかった上位3トピックは、人間(私)の目でも見てから commit しています。Flash と Pro の使い分けで、コストは抑えつつ品質の底が抜けないように調整できる感触です。
訳文ドリフトと固有名詞の扱いで効いた小さな工夫
3ヶ月運用して、地味だけれど一番効いた工夫は次の3つでした。
まずひとつ目は、UI 用語と固有名詞を別ファイル(glossary.json)で管理し、プロンプトに毎回展開していること。Gemini はプロンプトに置かれた語彙の扱いに素直で、辞書に登録した語の取りこぼしは明確に減りました。
ふたつ目は、temperature を 0.2 に固定したこと。ヘルプ文章は創造性より一貫性が大事です。0.7 で試した期間は、同じ原文を再翻訳するたびに語尾が揺れて差分レビューがつらく、結果的にコミットが滞りました。
みっつ目は、ロケールごとに「禁止訳語リスト」を持たせたこと。たとえばスペイン語訳で出やすかった「fondo de pantalla(壁紙)」と「imagen de fondo(背景画像)」の混在は、片方を禁止語に登録するだけで翌週には収束しました。Gemini に「これだけは避けて」と伝えると、案外素直に守ってくれる印象です。
AdMob 収益と App Store のレビュー文面に出た変化
ヘルプを5言語に揃えてから、App Store の各国ロケールに届くレビューの種類が少しだけ変わりました。「メニューの意味がわからない」「設定の場所がわからない」といった、ヘルプを読めば解決するタイプの低評価が目に見えて減り、星3〜4のレビューに「丁寧」「日本語以外でも読みやすい」と書かれることが増えました。
AdMob の eCPM はもともと地域差が大きく、ヘルプ翻訳の効果だけを取り出すのは難しいのですが、ヘルプ刷新後の3ヶ月で、ドイツ語圏ユーザーの平均セッション時間が15%ほど伸びました。長く滞在してもらえれば eCPM の高い地域からのインプレッションも増えるため、月次の AdMob 収益は1割弱の押し上げ効果として現れています。数字が動いた理由はヘルプだけではないはずですが、UI の言葉が地続きに読める安心感は、個人開発アプリでも軽視できないと感じました。
1997年からの「国境を越えた言語」という宿題
少し個人的な話を添えると、私が初めてインターネットに触れたのは1997年、16歳のころでした。独学でプログラミングを学びながら、海の向こうの誰かと英語のフォーラムで議論できることに本気で驚いて、その体験が今でも開発の根っこにあります。それから30年近く経って、自分の作ったアプリが世界中に届いているのに、ヘルプだけが日本語と英語に閉じ込められていたのは、当時の自分から見れば矛盾だったはずです。
Gemini で翻訳を回すようになって、5言語までは「サボらず更新できる」量にようやく落ち着きました。あの頃に出会った「言葉の壁を越える楽しさ」を、いまの読者にも返していけたらと思っています。
これから取り組むこと
3ヶ月の運用で、次に手をつけたい課題が3つ見えてきました。
ひとつは Gemini 3 Flash への移行検証です。手元の小規模ベンチでは、長文の固有名詞保持が一段安定している感触があり、Pro 校正の比率をさらに下げられそうです。ふたつ目は、ヘルプ本文だけでなく App Store / Google Play の更新履歴文面も同じパイプラインに巻き取ること。みっつ目は、ユーザーからの問い合わせメールに添える定型返信の自動下書きを Gemini Flash で生成し、私が手を入れて送る形に整理することです。
個人開発の現場では、翻訳のような「やった方がいいけれど後回しになる仕事」をどう手放すかで、開発に使える時間が決まってきます。Gemini 2.5 Flash と Pro の組み合わせは、その手放しを現実的な価格で支えてくれる相棒になりました。お読みいただきありがとうございました。同じようにアプリの多言語化で悩んでいる方の判断材料になれば嬉しいです。