История коммитов

.
i18n: normalize language names in locale ini files
Use native endonyms in short form consistently:
- ar: Arabic -> العربية
- az: Azərbaycan dili -> Azərbaycanca
- id: Indonesia (country) -> Bahasa Indonesia
- kk: Қазақ тілі -> Қазақша
- ky: Кыргыз тили -> Кыргызча
- lt: Lietuvos (country, genitive) -> Lietuvių
- ro: Romana -> Română (restore diacritics)
- uz: O'zbek tili -> Oʻzbekcha
- vi: Việt Nam (country) -> Tiếng Việt
.
i18n(ky): add draft Kyrgyz translations for untranslated strings
Fill all 351 untranslated Kyrgyz strings across 14 locale files.

- 279 machine-drafted strings are marked fuzzy: gettext keeps them out of the runtime and Crowdin receives them as unconfirmed suggestions, so a native speaker reviews them before they go live.
- 72 strings reuse existing human translations of the same msgid from other locale files, so they are added as confirmed.
- Terminology follows the existing translations (Өчүрүү, Оңдоо, Бөлүк, Колдонуучу, Китепкана).
- Also fixes broken placeholders in ky: %value% in the flood validator message, and spaced % s / % d specifiers.
- Adds the locale files for the collections and consent modules; the non-Kyrgyz ones are empty templates for Crowdin.
.
fix(i18n): repair broken placeholders in translations
Fix placeholders that were corrupted by translators across ar, az, id, lt, pl, ro, uk and uz locales.

- Flood validator: restore %value% (replaced by Laminas via str_replace, not sprintf) where it had been rewritten as %d, so the wait time is substituted instead of printed literally (ar, ro, uk, uz).
- Remove stray %s/%d placeholders absent from the msgid: Comments.php concatenates the flood delay after the string, so these were rendered literally (az, ro, ar).
- Restore literal macro tokens #user_name#, #name#, #description# that had been translated, which broke code-side substitution (az, id).
- Fix spaced (% s) and dropped placeholders, restoring the file size limit and wait time in messages (lt, pl, uz).
- Retranslate "You have a ban" in az and ar, where the existing text belonged to a different string; marked fuzzy for review.
.
i18n: update translations
.
docs: bump docs submodule with manual Crowdin sync clarification
.
docs(agents): document manual Crowdin workflow for translations
- Remove the claim about automatic two-way Crowdin sync; syncing is CLI-only

- Add Crowdin makefile commands and the sources-before-translations rule

- Require registering a new module domain in both translate.xml.dist and crowdin.yml

- Warn against reformatting .po files when editing msgstr
.
chore(crowdin): add makefile targets for uploading translations
- crowdin-upload now uploads sources explicitly

- Add crowdin-upload-translations and crowdin-upload-all targets
.
i18n(uk): translate remaining Ukrainian strings; add consent and collections locales
- Translate 228 untranslated msgids across module and system uk.po files

- Add missing uk.po for the consent module

- Register collections domain in translate.xml.dist and crowdin.yml; add collections.pot and uk/ru locales

- Regenerate all .lng.php dictionaries
.
chore(i18n): sync homepage translations from Crowdin
.
chore(crowdin): remove legacy git-integration config