Beautiful HD Wallpapers を App Store に登録したとき、最初に対応した言語は日本語と英語の2つだけでした。それでも十分と思っていましたが、ダウンロード数が増えるにつれてアプリのダッシュボードに変化が起きました。韓国、台湾、インドからのユーザーが増え始め、ストアページのローカライズが収益に直結することを数字で実感しはじめたのです。
2014年から個人でアプリ開発を続けてきた中で、累計5,000万DLを超えた現在も一人で5本のアプリを運営しています。App Storeのメタデータを30以上の言語に翻訳することは、以前なら翻訳代理店に外注するか諦めるかの二択でした。それが Gemini API の登場で変わりました。実際の実装コードと、3ヶ月間使い続けてわかったことを正直に書き残します。
なぜ通常の翻訳ツールでは足りないのか
Google 翻訳や DeepL で十分では、と最初は思いました。短い文章なら問題ありません。しかし App Store のキャッチコピー(30文字制限)や説明文(4,000文字制限)に求められるのは、単純な翻訳より「その言語圏のユーザーに刺さるコピー」です。
たとえば "Beautiful wallpapers that calm your mind" を直訳すれば「心を落ち着かせる美しい壁紙」になります。でも日本語の App Store で響くのは「毎日変わる、心が整う壁紙」のような表現です。翻訳ではなく、各言語圏の読者心理に合わせた意訳——これが Gemini API を選んだ理由です。
Gemini 2.5 Flash は「App Store 向けの魅力的なコピーを書く」という意図を高精度に読み取ります。system instruction でコンテキストを固定しておけば、言語が変わっても安定した品質が出ます。
実際の実装コード(Python)
google-genai SDK を使った基本的な構成です。
import google.generativeai as genai
import os
import time
# APIキーは環境変数から取得する
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
model = genai.GenerativeModel(
model_name="gemini-2.5-flash",
system_instruction="""あなたはApp Store/Google Playのメタデータ専門のコピーライターです。
以下の原則に従って翻訳・意訳してください:
- 直訳ではなく、対象言語のユーザーに自然に響く表現を選ぶ
- 文字数制限を厳守する(超過した場合は短縮してください)
- ブランド名(Beautiful HD Wallpapers等)は変更しない
- 検索されやすいキーワードを自然に含める
"""
)
def translate_app_metadata(source_text: str, target_language: str,
field_type: str) -> str:
"""
アプリのメタデータを指定言語に翻訳する
Args:
source_text: 翻訳元テキスト(英語または日本語)
target_language: 翻訳先言語(例: "Korean", "French")
field_type: "subtitle" | "description" | "short_description" | "keywords"
Returns:
翻訳済みテキスト
"""
# プラットフォームごとの文字数制限
limits = {
"subtitle": 30, # App Store キャッチコピー
"short_description": 80, # Google Play ショート説明
"description": 4000, # 共通
"keywords": 100 # App Store のみ
}
char_limit = limits.get(field_type, 4000)
prompt = f"""以下のApp Storeの{field_type}を{target_language}にローカライズしてください。
制約:
- 最大文字数: {char_limit}文字(厳守)
- 翻訳結果のみ出力(説明や注記は不要)
元のテキスト:
{source_text}
"""
response = model.generate_content(prompt)
result = response.text.strip()
return result
# 使用例: 30言語に翻訳
languages = [
"Korean", "Chinese (Traditional)", "Chinese (Simplified)",
"French", "German", "Spanish", "Portuguese (Brazil)",
"Italian", "Russian", "Arabic", "Hindi", "Turkish",
"Dutch", "Swedish", "Polish", "Thai", "Vietnamese",
"Indonesian", "Malay", "Greek", "Czech", "Romanian",
"Hungarian", "Finnish", "Danish", "Norwegian", "Hebrew",
"Ukrainian", "Filipino", "Bengali"
]
source_subtitle = "Calm your mind with beautiful wallpapers"
translations = {}
for lang in languages:
translations[lang] = translate_app_metadata(
source_subtitle, lang, "subtitle"
)
print(f"{lang}: {translations[lang]}")
time.sleep(0.5) # レート制限対策実際の運用では asyncio を使って並列処理にすることで、30言語の変換を数分で完了させています。asyncio を使った並列処理の実装例も合わせて読んでいただくと、より実践的な構成がわかります。
プロンプト設計で品質を上げる3つのポイント
3ヶ月使い続けてわかったのは、出力品質の差がほぼプロンプトの差だということです。
1. system instruction でコンテキストを固定する
generate_content を呼ぶたびにコンテキストを渡すより、GenerativeModel の初期化時に system_instruction として設定する方が安定します。「何のアプリか」「どのストア向けか」「どんなユーザーを想定しているか」は一度 system instruction に書いておけば、個別のプロンプトはシンプルに保てます。
2.「翻訳」ではなく「ローカライズ」と指示する
プロンプトに "translate" や "翻訳" と書くと直訳が返ってくることがあります。"localize for [country] App Store users" のように書くと、現地感のある表現になりやすい傾向があります。同じ英語のキャッチコピーでも "Wallpapers for a peaceful mind"(直訳調)と "Find your calm. Beautiful wallpapers, daily."(英語App Storeのトーン)では受け取られ方が全然違います。
3. 精度が必要な言語は few-shot で例示する
アラビア語やヘブライ語など、自分では品質を確認しにくいRTL(右から左)言語には、良い例を1セット添えておくと出力が安定します。
prompt = f"""
App Storeのキャッチコピーをアラビア語にローカライズしてください。
良い例:
入力: "Beautiful wallpapers for your phone"
出力: "خلفيات رائعة تضيء شاشتك"(最大30文字)
翻訳対象(最大30文字):
{source_text}
"""App Store の文字数制限への対処
最も苦労したのが文字数制限のハンドリングです。キャッチコピーの30文字制限は、ドイツ語やフィンランド語のように単語が長い言語では特にタイトです。
以下の関数を用意して、制限内に収まるまで再生成を試みています。
def ensure_char_limit(text: str, limit: int,
language: str) -> tuple[str, bool]:
"""
文字数制限を守るまで再生成を試みる
Returns:
(テキスト, 制限内に収まったかどうか)
"""
if len(text) <= limit:
return text, True
max_retries = 3
current = text
for attempt in range(max_retries):
response = model.generate_content(
f"以下のテキストを{limit}文字以内に短くしてください"
f"({language}の意味を保ちながら):\n\n{current}"
)
current = response.text.strip()
if len(current) <= limit:
return current, True
# 3回試行しても収まらない場合は警告フラグ付きで返す
return current, False制限内に収まらなかった言語は CSV にフラグを書き出して、後で手動確認しています。実際には30言語のうち制限超過が起きるのは2〜3言語程度で、これは許容範囲と判断しました。
Google Play と App Store の仕様の違い
Google Play と App Store ではメタデータの仕様が異なります。コードでは platform パラメータで切り替えています。
主な違いは次の通りです。タイトルは App Store が30文字、Google Play が50文字です。キャッチコピーは App Store にしかなく、Google Play には代わりに "Short description"(80文字)があります。説明文はどちらも最大4,000文字です。
なお、キーワードフィールドは App Store 専用です(100文字・コンマ区切り)。Google Play はキーワードフィールドがなく、説明文中のキーワード密度がランキングに影響するため、説明文生成時のプロンプトで自然なキーワード配置を意識しています。
3ヶ月使い続けてわかったこと
品質面では Gemini 2.5 Flash で十分なレベルが出ています。英語・韓国語・中国語(繁体字・簡体字)は、ネイティブに見せても「問題ない」と言ってもらえる水準でした。一方、アラビア語・ヒンディー語・ベンガル語は私自身が検証できないため、Google Play Console の A/B テスト(ストアの掲載情報実験)を使って翻訳前後のインストール転換率を地域別に比較しています。
Beautiful HD Wallpapers の実例として、インドのヒンディー語版を追加した後に該当地域からのインストール数が約15%増加しました。この数字だけでメタデータ翻訳の効果とは言い切れませんが、少なくとも悪影響はありませんでした。
コスト面は Gemini 2.5 Flash の安価なトークン単価が効いています。30言語 × 4フィールド(タイトル・キャッチコピー・説明文・キーワード)で1アプリあたりAPI費用は数円程度。5本のアプリを対象にしても月の費用は数百円に収まっています。どのモデルを使うかの判断基準は、モデル選定ガイドに詳しくまとめています。
メタデータの多言語化と並行してスクリーンショットのASO最適化も進めると、相乗効果が出やすいです。
個人開発を続けてきた中で実感するのは、「一人では絶対に手が届かなかった作業」が Gemini によって現実的になったということです。30言語への対応はかつてなら代理店に外注するか諦めるかの二択でした。それが今、週に1時間のメンテナンスで動き続けています。同じ状況にある個人開発者の方の参考になれば幸いです。
次のステップ
実装を試してみる場合の手順をまとめます。まず Google AI Studio でアカウントを作成し、API キーを取得してください。次に、今回紹介したコードをローカルで動かして、1〜2言語のキャッチコピーから試してみると感覚がつかみやすいです。数言語で品質に納得できたら、対応言語を段階的に増やしていく形が、失敗のリスクが少ないやり方です。
App Store Connect の「ローカライズ」タブから各言語のメタデータを登録できます。Gemini が生成したテキストをそのまま貼り付ける前に、Google 翻訳や DeepL で逆翻訳して意味がずれていないかを確認するひと手間が、品質担保の最終ステップになります。