Skip to content

feat: add Russian translation - #31

Merged
BenGlut merged 1 commit into
TigerTag-Project:mainfrom
Ptitlouis6012:feat/add-russian-locale
Sep 17, 2026
Merged

BenGlut merged 1 commit into
TigerTag-Project:mainfrom
Ptitlouis6012:feat/add-russian-locale

Conversation

@Ptitlouis6012

Copy link
Copy Markdown
Contributor

Adds ru.json (1523 keys, full parity with en.json) and wires it into the language selector, onboarding, i18n:add/i18n:check scripts, the doc-drift checker (which previously hardcoded 9 locales), and the docs that restate the locale count.

Why Russian: it is one of the most widely spoken languages in the world, with a large maker / 3D-printing community across Russia, Ukraine, Belarus, Kazakhstan and other Russian-speaking countries who currently only get the app in English.

Adds ru.json (1523 keys, full parity with en.json) and wires it into the
language selector, onboarding, i18n:add/i18n:check scripts, the doc-drift
checker (which previously hardcoded 9 locales), and the docs that restate
the locale count.
@BenGlut
BenGlut merged commit d1f6a70 into TigerTag-Project:main Sep 17, 2026
BenGlut added a commit that referenced this pull request Sep 17, 2026
… found running it

Follow-up to #31 (Russian contributed by @Ptitlouis6012, merged as theirs).

- What's New tooling knows about locales that arrived late. Adding "ru" to the
  three scripts alone would have failed the whole back-catalogue: the check
  demands that an item carrying ANY non-English locale carries them all, and
  the 507 items written before Russian existed carry none. A LOCALE_SINCE map
  ({ ru: "2.27.4" }) says which version a locale shipped in, and each version
  block is held to the locales that existed then. whatsnew:add scaffolds 10,
  and whatsnew:import recognises a Russian entry as hand-localised.
- Seven Russian plurals corrected, in the contributor's own style: Russian has
  three plural forms where the engine has two, so "{{n}} материалов" is wrong
  for 2-4. Counts read "Материалов: {{n}}" -- the impersonal form the file
  already uses elsewhere -- durations use the invariant "сек" / "мин", and the
  rack tile's label, which sits under its own number, is "стеллажи".
- The printer speed dropdown sizes itself to its own label: a fixed width tuned
  to the English "Standard" clipped "Сбалансированная". Floored at the old
  width so no other locale moves, capped so a long one cannot push the card.
- Locale counts updated wherever a doc or comment still said nine. The dated
  CHANGELOG / DEVLOG / ROADMAP entries are left alone -- they were true then.

Verified by running the app in Russian: the picker offers Русский, every view
renders translated, and the only clipped string was the one fixed above.
@BenGlut

BenGlut commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator

Merged — thank you! Russian is the 10th locale and ships in the next release.

The translation held up to review: same key set as en.json, no empty value, every {{param}} preserved, plural objects and arrays kept as such, and the tone is right. Making check-docs-drift.mjs COUNT the locale files instead of holding "9" as a constant is the part that outlives this PR — it makes the next locale cheap.

We finished the rest on top (c42e60e): the three scripts/whatsnew-*.mjs now know about locales that arrive late, via a LOCALE_SINCE map, so the back-catalogue stays valid while everything from v2.27.4 on must be complete in all 10; a handful of plural strings use the impersonal form your file already uses elsewhere, since the engine has two plural forms where Russian has three; and the printer speed dropdown now sizes to its own label — running the app in Russian showed it clipping Сбалансированная, a width that had been tuned to the English "Standard" and would have bitten any long locale.

Thanks again — genuinely useful, and well made.

@Ptitlouis6012
Ptitlouis6012 deleted the feat/add-russian-locale branch September 17, 2026 23:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants