GEMINI LABJP
NANOLITE — Nano Banana 2 Lite is here: Google's fastest and most cost-efficient Gemini Image model, made for running lightweight image generation cheaplyOMNIFLASH — Gemini Omni Flash is in public preview, a natively multimodal model that lets enterprises and developers build custom, dynamic video workflowsAGENTS — Managed Agents expand with background: true for async server-side runs and polling, remote MCP server integration, and refreshing credentials across interactionsMEMORY — The Memory Bank IngestEvents API is generally available, decoupling event ingestion from memory generation so you can stream content continuouslyTHROUGHPUT — Provisioned Throughput now lets you submit up to seven pending orders for the same model and regionDEPRECATE — Image generation models shut down on August 17, and the Grok 4.1 family on the Gemini Enterprise Agent Platform on August 20NANOLITE — Nano Banana 2 Lite is here: Google's fastest and most cost-efficient Gemini Image model, made for running lightweight image generation cheaplyOMNIFLASH — Gemini Omni Flash is in public preview, a natively multimodal model that lets enterprises and developers build custom, dynamic video workflowsAGENTS — Managed Agents expand with background: true for async server-side runs and polling, remote MCP server integration, and refreshing credentials across interactionsMEMORY — The Memory Bank IngestEvents API is generally available, decoupling event ingestion from memory generation so you can stream content continuouslyTHROUGHPUT — Provisioned Throughput now lets you submit up to seven pending orders for the same model and regionDEPRECATE — Image generation models shut down on August 17, and the Grok 4.1 family on the Gemini Enterprise Agent Platform on August 20
Articles/API / SDK
API / SDK/2026-05-25Intermediate

Running In-App Help Translation on Gemini 2.5 Flash for Three Months — An Indie Developer's Notes

After three months running my iOS and Android in-app help through a Gemini 2.5 Flash translation pipeline, here are the operational notes — when to fall back to Pro, how glossaries help, and the small lift it added to AdMob revenue.

gemini-api277gemini-flash6translation2indie-dev43ios12android7admob4

The in-app help that an indie shop kept putting off

I have been shipping iOS and Android apps as Dolice since 2014, and the wallpaper and relaxation titles in that catalog have grown into a cumulative 50 million downloads. AdMob is the main revenue line for those older apps, and more than half of that revenue comes from users outside Japan.

Despite that, the in-app help — the FAQ, the first-run tutorial, the self-service guide users see before they email me — stayed frozen in Japanese and English for years. The reason was simple: every time I added a feature, the translation chore felt heavier than the feature itself, so it kept slipping.

In February 2026 I finally sat down, wired a Gemini 2.5 Flash pipeline into the build, and pushed help maintenance up to five locales: Japanese, English, Spanish, German, and Portuguese. These are my honest notes after three months of running it.

The shape of the pipeline

The source help lives as one Markdown file per topic, 38 files in total. Whenever CI runs, the script below builds the localized JSON the apps read at boot.

# scripts/translate_help.py (excerpt)
from google import genai
 
MODEL_FAST = "gemini-2.5-flash"
MODEL_REVIEW = "gemini-2.5-pro"
 
PROMPT = """Translate the following Markdown into {target}.
- Keep proper nouns, brand names, and emoji as-is.
- Do not translate these UI labels: {ui_terms}.
- Match the punctuation conventions of the target language.
- Do not split paragraphs longer than 200 characters.
 
Source:
---
{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

The translations stay in Markdown until the build converts them into platform-native resources — .strings on iOS, strings.xml on Android, JSON for the web help. Flash answers fast enough that 38 topics across four target locales finish in about thirty seconds on the Mac mini that runs my nightly job.

Why I ended up routing through Pro as well

For the first few weeks I tried to live with Flash alone, but longer FAQ topics — anything above roughly 800 source characters — exposed two recurring weaknesses. Proper nouns occasionally went missing, and UI labels drifted into unexpected verbs. "壁紙を保存" once landed as "壁紙を残す," for example, which no longer matched the actual button in the app.

The fix was to add Gemini 2.5 Pro as a second-pass reviewer. Pro receives the Flash output, the original Markdown, and the UI glossary, and only flags the topics where something diverged. Re-translating just those flagged files kept Pro's share of the calls to about 15% of total volume.

Across the three months the entire bill landed around 720 yen per month. For the three topics where Pro's diff was largest, I still glance at the file myself before committing. The Flash and Pro split has been a workable way to keep cost low without letting quality bottom out.

The small habits that paid off

Three quiet habits did most of the work over the quarter.

The first was to keep UI terms and proper nouns in a separate glossary.json and inject them into every prompt. Gemini is unusually obedient about respecting the vocabulary a prompt hands it, and the dictionary made the drift on those words largely disappear.

The second was pinning the temperature at 0.2. Help text rewards consistency over creativity. I tested 0.7 for a stretch and lost a lot of review time to suffix drift — the same sentence translated three different ways across re-runs — until the reviews started piling up.

The third was maintaining a "forbidden phrasings" list per locale. The Spanish output kept oscillating between "fondo de pantalla" and "imagen de fondo" for the word "wallpaper," and once I added one of them to the forbidden list the drift settled inside a week. Telling Gemini what to avoid turned out to be just as load-bearing as telling it what to prefer.

What the AdMob and review numbers showed

After the five-locale help shipped, the type of reviews arriving in App Store country pages shifted in a small but visible way. One-star reviews of the "I cannot tell what this menu does" variety quieted down, and three- and four-star reviews started saying things like "easy to read in my language" and "thoughtful localization."

AdMob eCPM has always been noisy across regions, so it is hard to isolate the help update from everything else, but in the three months since the rewrite German-speaking users have stretched their average session by roughly 15%. Longer sessions tend to translate into more impressions from higher-eCPM regions, and monthly AdMob revenue ticked up by a little under 10%. The help is certainly not the only reason, yet the comfort of reading the UI in your own language matters more for an indie wallpaper app than I had given it credit for.

A 1997 homework that I had been carrying

A short personal aside. I first touched the internet in 1997 when I was 16, teaching myself to code, and the surprise of being able to argue about software with someone on the other side of the ocean is still the emotional bedrock of my development practice. Three decades later, my apps were reaching people worldwide while the help screens stayed locked in two languages — a contradiction the 1997 version of me would have found odd.

Letting Gemini handle the routine of translation is what finally made five locales a sustainable workload. The joy of words crossing borders that I tasted back then is something I want to keep handing back to today's readers.

What is next on the list

Three follow-up items emerged from the quarter.

First, I want to A/B Gemini 3 Flash against 2.5 Flash on the same prompt set. Early small-scale runs suggest 3 Flash is more steady with proper nouns inside long passages, which would let me drop Pro's share even further. Second, I plan to extend the pipeline to App Store and Google Play release-note bodies, which still get hand-translated each release. Third, I want Flash to draft replies to support email in the user's locale so that I can hand-finish them instead of writing from scratch.

For indie development, what you decide to hand off determines how much time you actually have for the app itself. Gemini 2.5 Flash, with Pro standing behind it as a reviewer, has turned out to be a reliable partner for handing off translation — quietly, at a price that fits a personal developer's budget. Thank you for reading. If you are wrestling with the same question for your own app, I hope these notes help.

Share

Thank You for Reading

Gemini Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

API / SDK2026-06-23
Integrating Gemini 3.2 Pro Function Calling into iOS/Android Apps: Production Design Patterns
A practical guide to integrating Gemini 3.2 Pro Function Calling into iOS and Android apps. Includes working SwiftUI, Kotlin, and Python code, plus production patterns proven in a real indie wallpaper app — cost, latency, staged rollout, and regression testing.
API / SDK2026-05-31
Localizing App Store Keyword Fields with Gemini 2.5 Flash — A Month of Notes Across 40 Apps
Operational notes from a month of using Gemini 2.5 Flash to draft the 100-character App Store keyword field across 40 wallpaper apps and several locales — CJK byte counting, deduping against the title, prohibited terms, and what actually moved the needle.
API / SDK2026-05-30
Two Months of Turning App Store Connect Daily Sales into a Slack Digest with Gemini 2.5 Flash
Notes from two months of running App Store Connect Sales/Trends data through Gemini 2.5 Flash and posting a short morning digest to Slack. Why Flash beat Pro for this job, how AdMob and store revenue stopped colliding, and what a single 'normal/check' label changed.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →