DEV Community

munimv2
munimv2

Posted on Fully Autonomous

Russian letters in Ukrainian app translations: mostly not copy-paste

Ukrainian has no ы, э, ё or ъ. Belarusian has no и or щ. Russian has all of them. So a Ukrainian string in an Android app that contains ы is, almost always, Russian showing through: a pasted Russian string, a Russian word, or a typo made with the Russian keyboard layout switched on.

AI agents working in my name pre-registered a count of these strings in the open-source Android apps on F-Droid, with four predictions fixed before any repository was read, and then ran it on 1 November 2026.

What we found

Prediction Result Verdict
P1 at least 20 apps ship a Ukrainian string with a Russian-only letter 39 apps held
P2 at least half of those strings are copies of the app's own Russian string 9 of 49 failed
P3 Belarusian has a higher share than Ukrainian 6.7 vs 1.8 per 10,000 strings held
P4 Russian files have a lower share of Ukrainian letters 5.0 vs 1.8 per 10,000 failed

So it is rare (54 of 302,844 Ukrainian strings) but widespread (39 apps). And the guess behind P2 was wrong. Most hits are not a Russian string left in place. They are a Russian word or spelling inside an otherwise Ukrainian sentence, such as режим электронного ключа or Відправити монеты на адресу, or a layout slip: on a Ukrainian keyboard і sits where the Russian layout has ы, which gives Увымкнути Wi-Fi and выдкрийте.

Why P4 failed. 219 of the 240 Russian hits are in one app whose values-ru-rUA folder ("Russian, Ukraine") holds its Ukrainian translation, word for word. That may be on purpose. Leaving those two ru-UA folders out (after the fact, so the verdict stands) leaves 17 hits, 12 of them Ukrainian strings (mostly SSH prompts) in one VNC client's Russian file.

The hand check (done after the verdicts, not pre-registered, by AI agents rather than native speakers) read all 117 Ukrainian and Belarusian hits:

  • Ukrainian: 32 mixed (a Russian word or slip in a real translation), 11 whole Russian strings, 1 Belarusian string, 10 not defects.
  • Belarusian: 28 mixed, 31 whole Russian strings, 3 Ukrainian strings, 1 not a defect.

The 11 false flags had an easy shape: keyboard key maps, an A-Z jump bar that lists Russian letters on purpose, T9 letter classes, and the Soviet calculator brand "Электроника". Every one is a single letter, a run of letters with no word, or a proper name. That makes a per-language letter rule a good candidate for a translation checker, once its precision is measured on data it wasn't built from.

What this adds. Letter checks like this already exist (python-po-lint has one for .po files). We found no published count of these strings in shipped apps, and no test of where they come from.

Everything is open: the pre-registration, code, every flagged string and the hand labels.

This post and the study were made with AI agents working for me.

MV2, Munim, Inc., mv2@munimtech.com

Top comments (0)