Audamir

part 16

Five languages, one gender and the H key that did not work

Translating a game is not just swapping words. Plural forms, gender in the past tense, Cyrillic, the keyboard layout and machine translation, which is a rough draft until somebody checks it.

· 12 min read

Why is translation interesting for a blog about a game with dice? Because it shows how much a game relies on things that seemed obvious to it. For example, on the fact that one can say vyhral si, "you won".

Audamir speaks nine languages today (Serbian comes in Latin and in Cyrillic). This article keeps to the first five, on which the rules showed themselves: Slovak, English, Czech, Serbian and Russian. Slovak and English are finished. I have read the whole of the Czech (6 November 2026) and its beta label is gone. Serbian and Russian are complete machine drafts marked beta: each has all 4,196 texts of the English model (at the time of the translation there were 2,588), but nobody has read them yet as a native speaker. The game says so openly: the language picker shows "(beta)" next to them and the settings have a note. The four languages of the first wave (Spanish, Brazilian Portuguese, French and German) were added on 22 October as the same kind of machine drafts.

More languages: four waves

The order is not accidental. According to the plan of the extensions the further languages are added in four waves. What decides is the reach, not the number of speakers:

WaveLanguagesNote from the plan
1Spanish, Brazilian Portuguese, French, GermanLatin script and the largest reach for the least work; French readers in Africa often have expensive data, where a small page matters
2Turkish, Indonesian, Polish, Italiancheap and large mobile audience; Polish has three forms of the plural, like Russian
3Japanese, Chinese (two packs), Korean, HindiHindi: Ludo is a phenomenon there; Japanese resonates with the original Dice Wars
4Arabic and other languages written from right to lefta chapter of its own: the mirrored layout and six forms of the plural

The first wave has been in the game since 22 October; the others are a plan.

Two links deserve attention. Hindi: about the Indian Ludo and its mobile version there is a separate article. Japanese: the original Dice Wars is a Japanese game and its developer GAMEDESIGN is Japanese (the introduction).

Why "5 dice" is different from "2 dice"

English has two forms: 1 die, 2 dice. Slovak and Czech have three: 1 kocka, 2 to 4 kocky, 5 and more kociek. In Serbian and Russian the rule is more complicated, because what decides is the end of the number, not the whole number. The game looks at the last two digits:

  • the number ends in 1, but not in 11 (1, 21, 31, 101…): the first form,
  • the number ends in 2, 3 or 4, but not in 12, 13 or 14 (2, 3, 4, 22, 23, 24, 102…): the second form,
  • everything else (0, 5 to 20, 25 to 30, 111 to 114…): the third form.

In Russian it looks like this: 1 кубик, 2 кубика, 5 кубиков, 11 кубиков, 12 кубиков, 21 кубик, 22 кубика, 25 кубиков. The numbers 11 and 12 "end" in 1 and 2 and yet belong to the third form, and 21 behaves like 1. In Slovak, on the other hand, 21 is already "5 and more": 21 kociek.

That is why every text with a number has a group {n#kocka|kocky|kociek}: n is the number and after # come the forms from the first to the last. For Czech, Serbian and Russian a check verifies that it has exactly three forms. Here is one and the same sentence from the game (the key core.app.wear_spoils) in four languages:

en  After round {round} every captured tile brings {n} extra {n#die|dice}.
sk  Po {round}. kole prináša každé dobyté políčko {n} {n#kocku|kocky|kociek} navyše.
sr  Posle {round}. runde svako osvojeno polje donosi {n} {n#kocku|kocke|kocki} više.
ru  После {round}-го раунда каждая захваченная клетка приносит ещё {n} {n#кубик|кубика|кубиков}.

For n = 1 the game writes "1 кубик" in Russian, for 2 "2 кубика" and for 5 "5 кубиков". English has two forms, the other languages three. The rule of Russian and Serbian is one expression in the code (i is the number without the sign, the result is the order of the form counted from zero):

const m10 = i % 10, m100 = i % 100;
return m10 === 1 && m100 !== 11 ? 0 : m10 >= 2 && m10 <= 4 && (m100 < 12 || m100 > 14) ? 1 : 2;

Fractions have their own rule: they take the second form (the genitive singular: "1,5 kostky", "2,5 кубика"). It has never applied in the game so far, because all the parameters of the plural are whole numbers, but the first version of the rule was wrong (it took the last form) and a review found it.

Gender: the game does not know who is playing

The Slovak past tense has gender: vyhral si and vyhrala si ("you won", to a man and to a woman). The game does not know which of them is right. There are two solutions and the game uses both.

The first: write without gender. Commands, nouns, the present tense ("Defeat", "Look at the chance"). The four languages with gender (Slovak, Czech, Serbian, Russian) get the same rule and the regular expressions in the tests (several for each language) reject forms like "vyhrál jsi", "pobedio si", "ты победил". The narrator is a die (feminine in Slovak) and speaks in the first person, so its lines too either have no past forms or have gender groups.

The second: let the player say. There is a setting Grammatical gender[1] (Not specified, Masculine, Feminine) and a group {gender#…|…|…} with three forms. The unspecified form is the original text without gender: whoever sets nothing gets no sentence changed, and nobody says "vyhralo si". Of 318 candidate texts (the whole voice of the narrator, the end of a game, the lessons), after four translators read them, 26 Slovak, 24 Czech, 24 Serbian and 20 Russian ones changed. The number is deliberately small: most of the texts were free of gender from the start.

This is what the title of a lost game looks like (the key core.app.lost_title). English has no group, the other four languages have it in the order masculine | feminine | unspecified:

en  You lost
sk  {gender#Prehral si|Prehrala si|Prehra}
cs  {gender#Prohrál jsi|Prohrála jsi|Prohra}
sr  {gender#Izgubio si|Izgubila si|Poraz}
ru  {gender#Ты проиграл|Ты проиграла|Поражение}

Whoever sets nothing gets the third form, and that has no gender: "Prehra", "Poraz", "Поражение". The groups can be nested: the sentence about conquering the whole map (core.app.conquest_text) has a gender group and in each of its forms another group, of the plural, for the number of rounds:

sk  {gender#Dobyl si celú mapu za {round} {round#kolo|kolá|kôl}.|Dobyla si celú mapu za {round} {round#kolo|kolá|kôl}.|Celá mapa je dobytá za {round} {round#kolo|kolá|kôl}.}

An aside: this blog too is written so as to avoid the forms of the first person in the past tense that are marked for gender. You will find "my decision", "it was found" and "it came out" in it, but hardly anything like urobil som ("I did", in the masculine). It is not a stylistic accident, it is the same rule.

Cyrillic made from Latin

Serbian is written in both Latin and Cyrillic. The game does not store two catalogues. The Latin is stored and the Cyrillic is made from it at the first choice (translit-sr.js). It sounds simple: every letter has a corresponding letter. It does not. lj, nj and dž are always one letter, except for a few words where they are two (for example podžupan). The exceptions were too wide in the first version and the word odžak (a chimney) was written as "оджак" instead of "оџак". And what in the text is a mark, a placeholder or a name that stays in Latin (XP, AI, Hero Dice) must not be transliterated.

Transcribing the whole catalogue found two bugs that the unit tests did not catch: a placeholder inside an attribute (aria-label="{earned} od 3 zvezdice") was transcribed to {еарнед} and the abbreviation XP lost its X.

And then came the review.

The H key that does nothing

The keyboard shortcuts of the game (H hint, S statistics, L legend) compared the character that was typed with the Latin letters. On a Russian keyboard, the key that is H on a Latin keyboard carries the letter "р". The shortcut did not work. The fix uses the physical key (KeyH) when the typed character cannot be placed among the Latin letters. A Latin letter is taken as typed, so Dvorak works too.

And another bug of the same kind: in the Serbian Cyrillic <kbd>H</kbd> was transcribed to the Cyrillic "Х", which looks like the Latin X. The game advised the player to press a key that does nothing. Today the labels of the keys stay in Latin.

A machine draft and what is done with it

Czech, Serbian and Russian came from machine translation: the glossary in docs/I18N.md is the contract, the translators received it, and after the translation a terminology check went through the whole catalogue so that the same word means the same thing. Nobody says, however, that it is finished. Until a native speaker reads it, the beta label stays in the game; I have read the whole of the Czech (6 November 2026) and its label is gone.

What the review of a sample (87 texts per language and all the lines of the narrator) revealed:

  • Serbian: "beg" in the phrase Gvozdeni beg (the Iron Run, 109 texts) means rather an escape than a run in Serbian. The right word is "pohod". "Klasik" (30 texts) is a Slovak calque and means "classical author": the right word is "Klasika".
  • Russian: "перебросок" is not a noun (correctly "переброс", 10 texts). The looks are now called "облики" (18 texts). Five texts used "сам" as a form of address to the player, which is gendered.
  • Czech: "sám", "Zapnutý / Vypnutý" as a state (correctly "Zapnuto / Vypnuto").
  • Dashes: the Russian catalogue had 75 texts with a dash that did not match the others, and they were unified.

A mistake in one term is a mistake in a hundred texts. That is why the first thing that gets corrected after reading is the glossary.

So that the text does not overflow

A different language means different lengths of words. The overflow scanning tool (i18n-scan.js) goes through 15 screens at 375 and 1100 pixels and compares every language with English. While it was being made it turned out that the first version saw nothing at all: a word of three hundred letters in the rules left it cold, because a block does not grow for a word that cannot be broken, and everything inside a scrollable box was left out. So the tool was changed to see, and it was verified on a deliberately broken text. Only then did it find a real problem: the Russian name of the minigame Betrayal ("Предательство") did not fit on a card on the phone. Today it is "Измена".

It is the same procedure that is used in the mutation check: a check that never finds anything may be blind. First it has to be broken.

Packs and size

At first all the languages were in one pack, which cost 670 kB extra (raw, 185 kB after gzip). Today every language is a pack of its own: the page loads English and the one language that it shows. There are nine languages and the built game has them as nine files with texts (the Serbian Cyrillic is made from the Latin at the first use). For the texts the page needs 88 kB after gzip in English, 183 kB in Slovak and at most 199 kB (Russian); the numbers of today's files are in the article How the game Audamir is translated today (forthcoming article no. 55). The other packs are saved in the cache at the first use. The price: the first switch to another language needs the network; without it the game does not crash, but it speaks English.

In the language picker, since 22 October, there is a badge with the code of the language instead of a flag (EN English, SK Slovenčina, SR Srpski, SR Српски), because a flag is not a language. The decision was made on 19 October and it has been in place since 22 October; the test of the manifest of the languages (tests/i18n/packs.test.js) forbids a flag in the list.

What I take from it

  • Translation is a test of the rules of the game. Gender and the plural reveal assumptions that nobody knew about.
  • Translation opens bugs outside the texts. The keyboard shortcuts, the alphabets and the widths of words came out only with languages other than Slovak.
  • A draft is called a draft. The beta label is more honest than a continuing illusion.
  • The glossary is a contract. Correcting one term corrects hundreds of texts.
  • A scanner that sees nothing is not a scanner. Break it first.

Sources and notes

  • docs/DESIGN.md §29 (languages, verification, review) and §30.3 to §30.4 (packs and the gender of the player); docs/I18N.md; docs/ROADMAP.md, chapter 9 (the waves and the decision on the codes of the languages). Sizes: docs/DESIGN.md §30.3.
  • The examples of texts are from the catalogues js/i18n/{en,sk,cs,sr,ru}.js (the keys core.app.wear_spoils, core.app.lost_title, core.app.conquest_text) and the rules of the plural from js/i18n/i18n.js (pluralEastSlavic), all in game 0.123.1 (6 November 2026); the number of texts and the sizes of the built game are from game 0.124.0 (also 6 November) and are itemised in 055. The renaming of the setting: docs/DESIGN.md and the change log of the game (0.108.1).
  • The numbers of speakers in the plan (Spanish about 560 million, Brazilian Portuguese 260 million, French 330 million, German 130 million) are estimates from the ROADMAP, not my verified data, and I deliberately do not give them in the text.

Notes

  1. Until version 0.108.0 the setting was called Gender (Not specified, Man, Woman); since version 0.108.1 of 4 November 2026 it is called Grammatical gender (Not specified, Masculine, Feminine; in Slovak Rod). ↩︎