29 languages, none translated.

A string catalogue that arrives after the screens costs a rewrite of every screen. Kickgeist built the catalogue first and shipped 29 languages on one set of rails.

29languagesthe app ships
across 35 locale filesRepository, 5 August 2026
1,313stringstranslatable strings in the app
the landing page carries 896 moreRepository, 5 August 2026

Most products get their second language after they have their first ten screens, and the bill arrives as a rewrite of all ten. That bill is avoidable. Avoiding it costs one rule, applied from the first commit: no string is ever written directly into a view.

Kickgeist ships 29 languages across 35 locale files. The app carries 1,313 translatable strings and the landing page 896 more. The store presence moves with them: 41 App Store locales, 34 Play Store locales, 33 of them with automated screenshots. Those figures were counted from the repository on 5 August 2026.

The catalogue comes first

The rule is boring, and it is the whole trick. A string lives in the catalogue and a screen references it. A review that finds a literal in a widget sends the change back.

Retrofitting that order later means editing every screen that exists. Establishing it first means the cost is paid once, in the first week, by nobody in particular. What it buys is not the ability to add a language. It is the ability to add one without opening the view layer, which turns a locale into a data change rather than a release risk.

Local, not translated

A translation reads like English wearing another language’s clothes, and players notice within one screen. So the standard was written as a rule rather than as an aspiration: every string reads as if a local fan wrote it. In practice that is four separate disciplines, and none of them is machine translation.

  • The first is terminology. A prediction is a Tipp in German, a pronóstico in Spanish, a prono in French. It is a palpite in Portuguese, a typ in Polish, a prediksi in Indonesian. Each language gets its own table, and the table is a contract rather than a suggestion.
  • The second is register. Every language that distinguishes formal from informal uses the informal one, everywhere: du, tu, kamu, never the polite form. A prediction game that addresses a player the way a bank does has already lost the room.
  • The third is regional voice rather than regional spelling. Brazilian Portuguese is not European Portuguese with different vocabulary. The pt-BR file rewrites pronouns and verb forms, country-name spellings and the tonal register together. The same holds for Spanish across Spain and Mexico, and for English across Britain and the United States.
  • The fourth is legal, and it has no room for taste. The product is a prediction game. The vocabulary that would make it something else is forbidden in every language, in all 35 files, and checked in review. That is the product’s legal position rather than a style preference, so it is enforced by the same pipeline that enforces placeholder integrity.

Right-to-left is not a text direction

Arabic and Hebrew are not a mirrored stylesheet. They are a mirrored stylesheet, plus store screenshots generated with per-locale frame files, plus a font that actually covers the script. The app and the landing page both set Noto Sans for that last reason. Arabic, Hebrew, Devanagari, Thai, CJK, Cyrillic and Greek all render from one family, so a new script is not a font procurement exercise.

Which language, and when, was a business decision

Twenty-nine languages did not arrive at once, and the order was modelled rather than guessed. A language expansion analysis in March 2026 scored candidate locales on a composite index. The inputs were smartphone reach, football engagement and regional advertising benchmarks, taken from published ad network, analytics and qualification data.

Indonesian scored highest, with Brazilian Portuguese behind it. Both shipped first, on the same day. Neither was chosen because it was easy, and one of them would not have been chosen at all by a team ranking locales on familiarity.

That is worth separating from the craft argument above, because they are different claims. Local voice is a quality position. Locale order is a commercial one. Mixing the two is how a localisation programme ends up with five European languages and a plan.

What holds it together

Translation is not a hand-edit task on this project. The voice, the per-language terminology tables, the regional style guide, the placeholder rules and the validator sequence are encoded as a repository skill. So the same constraints apply on every locale and on every pass, rather than on the ones somebody remembered.

Two automated gates then check the result. One validates completeness and placeholder integrity across all 35 files; another does the same for the landing page. Both run before a change can reach review.

The concession

This is the largest single investment in the product, and it is not free to carry. Every new user-facing string is a change in 35 files. Every new screen is 33 screenshot locales.

The next tournament added twelve more languages, and the ones the pipeline could not yet assure at native quality did not ship at all. They went to a backlog instead. A sub-native string is worse than an English one, because a player can at least recognise English as a fallback.

We would make the same trade again for a consumer product with a global audience. We would not make it for an internal tool serving three markets. The reason to write the rule down is so that the choice gets made on purpose, rather than discovered in month nine.

Tell us what is in the way.

Say what you're building and where it stopped.

hello@beevelop.com

Copy it into your mail client if that is easier.

The draft opens with

  1. What you are building
  2. What is in the way
  3. The stack
  4. When you want to start

The contact page says who answers, and what the reply contains.