I'm a solo developer from South Korea. I started coding about seven months ago. I can read English, but making sentences is difficult without a translator. I used a translator and AI to help write this post too.
My app, Party Picker, supports 10 languages: Korean, English, Japanese, Simplified Chinese, Traditional Chinese, Spanish, Brazilian Portuguese, German, French, and Indonesian. Korean is the only one I can check properly.
I briefly mentioned translation in my first post. I wanted to write more about how I did it and what I still can't check.
Why I added 10 languages
Party Picker is a party game app. Friends use one phone to pick who buys coffee. It has luck games like roulette and skill games like stopping a timer at exactly five seconds.
I didn't have a big plan for a global launch. I was going to use AI for translation anyway. I thought an app would be easier to use if it was in the user's own language, so I added more languages.
I set up the translation structure and had AI translate eight additional languages. Each had about 670 strings.
The translation setup
The app uses a function called tr() for text. The English text itself is the key.
String tr(String english) => L10n.translate(english);
The English strings are collected in one source file. AI translates that file into each language. A small script checks for missing strings and placeholders like {0} that were removed or changed.
The first result had zero missing strings and zero broken placeholders. That told me the entries were there. It didn't tell me if the translations were correct.
During translation, AI pointed out a problem with The chosen one(s)!. The singular and plural forms in other languages may need more changes than adding an s. I split it into The chosen one! and The chosen ones!.
Checking the screens
There are some things I can check without understanding the language.
One is a marker test. It replaces every translation with text wrapped in « », like «Start». I open the screens and look for English without those marks. That text hasn't gone through tr(), so it would stay in English when the language changes.
final marked = {for (final key in source.keys) key: '«$key»'};
I also checked whether the text fit on a small screen. I tested German, French, Indonesian, and Japanese at 360×640 with text scaled to 1.6×. There was no overflow on the 26 screens I checked.
For the store listings, I wrote another script to check the character limits for the nine additional languages.
No native speakers have reviewed the translations. These checks help with missing text and layout, but I still need a way to check the wording.
I can't be sure about the meaning
I ask several AIs to check the translations. I also try reading them myself as much as I can. Even after that, it's hard to know if they are right.
The hardest part is checking whether the translation says what I meant. I also don't know whether people actually use those words. A word might be correct in a dictionary but strange in an app.
I had this problem even in English. My first English store description said "Pick a forfeit." I meant picking a person, but it could be read as choosing the penalty. I can read English and still missed that. Similar problems in the other languages would be harder for me to find.
Adding a feature means more translation
I underestimated the work after the first translation.
Every new feature needs text in 10 languages. Recently I added one game with 23 new strings. For the eight additional languages, that was 184 translations. Then I had to run the checks again.
It isn't especially difficult work, but I have to keep doing it whenever I add something.
Indifference is harder than criticism
So far, there are no installs from outside Korea. There are no reviews in other languages or reports about translation mistakes either.
There are few users, so I get indifference rather than criticism. I find that harder. Without feedback, I don't know whether the translations are okay, whether they have problems, or whether anyone has even seen them.
If I started again
I'd start with Korean and English. I would add more languages when people from other countries started using the app.
The translation structure and tests are still useful. But with so few users, it's hard to know how much the extra languages helped. They already add work whenever I change the app.
If you try it in one of these languages and find wording that sounds strange, please let me know. That's something I can't check well on my own.
You can find Party Picker on Google Play.



Top comments (6)
Seven months in and shipping in 10 languages is a real result.
One thing to plan for if you ever add Arabic or Hebrew: the words are the easy part. The whole layout flips right to left. Back arrows, progress bars and a timer that counts left to right all need checking, and Flutter's Directionality handles most of it if you avoid hard-coded left and right paddings.
How do you catch German strings that are too long for a button? Do you test the longest translation on each screen?
Thank you, this means a lot! And thanks for the RTL tip. I don't have any RTL languages yet, but I added it to my translation notes.
Your German question helped too. My overflow test (26 screens, 360×640, 1.6× text) only covered four languages. Spanish and Brazilian Portuguese had just as many long labels but weren't tested. I added them and both Chinese files, and all eight now pass. Thanks for asking!
Your « » marker test is a good one. Android has the same idea built in as pseudo-locales, and yours works on every platform.
For the meaning problem, two things work better than asking several AIs to check the same text.
Give each string a short note, like "button on the result screen; picks a person, not a penalty" or "max 12 characters". Flutter's ARB files have a @description field for exactly this, and a translator (human or AI) does much better with it than with a bare string. It also shows one limit of using the English text as the key: if "Start" means two different things on two screens, both get the same translation.
Translate back into Korean. Ask a different AI to translate each language back into Korean, without showing it your English. You read Korean properly, so a back-translation that says "choose the penalty" shows you exactly where "Pick a forfeit" went wrong. It won't catch wording that is correct but unnatural, but it catches meaning errors.
For plurals, splitting "The chosen one(s)!" works. If a number is ever part of the sentence ("3 players left"), ICU plural messages in intl handle it per language.
And your "If I started again" section is what I'd do too: two languages first, more when real users from those countries show up.
Thanks, Ahmed! Translating back into Korean sounds especially useful. That gives me something I can actually judge myself, instead of relying on another AI saying the translation looks fine.
Your point about “Start” meaning different things on different screens makes sense too. I’ll keep that in mind and add more context when I revisit the translations. Thanks for taking the time to write this!
Native Chinese speaker here, two quick checks for your zh files.
Traditional isn't just Simplified in another font. If zh-Hant is meant for Taiwan, the words change too: 设置 becomes 設定, 默认 becomes 預設, 视频 becomes 影片. Running the Simplified file through OpenCC with the s2twp config gives you a baseline to diff against what the AI wrote.
Also grep the zh-Hant file for Simplified-only characters like 设, 认, 视. If any show up, a string slipped through unconverted.
Bonus: "The chosen one(s)!" has no plural issue in Chinese. 天选之人! works for one person or five, and it's a meme, so a party crowd will get it.
Thank you so much for the helpful suggestions! I ran both checks. There were no Simplified-only characters, and most of the 124 OpenCC differences were already Taiwan wording.
I still fixed 32 strings, like 提交 → 送出 and a balloon line that said "poke" (戳破) when you actually inflate it. The character check is now in my script too.
天选之人!/天選之人! is now the heading for one person or many. Thanks again!