[PR #4209] docs(i18n): add Gujarati translations #6130

Open
opened 2026-10-31 01:12:05 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/4209
Author: @adhenrique
Created: 10/15/2026
Status: 🔄 Open

Base: main ← Head: docs/gujarati-readme


📝 Commits (4)

  • 1c4ab10 docs(i18n): add Gujarati translations
  • 48e8ba2 docs(i18n): restore the Linux ps prerequisite in the Gujarati README
  • 932f7c8 docs(i18n): refresh the Gujarati edition for the current README
  • f836868 docs(i18n): apply native review feedback to the Gujarati edition

📊 Changes

70 files changed (+61986 additions, -47504 deletions)

View changed files

📝 README.md (+1 -1)
📝 docs/readme/README_ar.md (+1 -1)
📝 docs/readme/README_de.md (+1 -1)
📝 docs/readme/README_el.md (+1 -1)
📝 docs/readme/README_es.md (+1 -1)
📝 docs/readme/README_fa.md (+1 -1)
📝 docs/readme/README_fr.md (+1 -1)
➕ docs/readme/README_gu.md (+386 -0)
📝 docs/readme/README_id.md (+1 -1)
📝 docs/readme/README_it.md (+1 -1)
📝 docs/readme/README_ja.md (+1 -1)
📝 docs/readme/README_ko.md (+1 -1)
📝 docs/readme/README_ml.md (+1 -1)
📝 docs/readme/README_pl.md (+1 -1)
📝 docs/readme/README_pt-BR.md (+1 -1)
📝 docs/readme/README_ro.md (+1 -1)
📝 docs/readme/README_ru.md (+1 -1)
📝 docs/readme/README_th.md (+1 -1)
📝 docs/readme/README_tr.md (+1 -1)
📝 docs/readme/README_uk.md (+1 -1)

...and 50 more files

📄 Description

Summary

Adds a Gujarati (ગુજરાતી) edition of the README and registers the gu locale so the language selector, the documentation-fact checks and the website build all recognise it.

Gujarati-speaking developers had no localized entry point to the project. The repository already ships 19 translated editions, and a single inventory (website/locales/languages.json) drives the selector, the conformance checks and the website build, so a new edition has to be registered in all of them.

Closes #4132

Problem and expected behavior

Documentation-only. On the base revision there is no Gujarati edition, and the language selector offers 19 languages. Expected after this change: docs/readme/README_gu.md exists, every edition's selector links to it, and the locale is registered, so a Gujarati reader reaches the same overview, setup instructions and analysis-target table as the English README.

Adding the file alone is not sufficient: tests/conformance/readmeConsistency.test.ts asserts set equality between the translated editions listed in languages.json and the files in docs/readme/, so an unregistered edition fails the suite.

Change and scope

Authored:

  • docs/readme/README_gu.md — new edition, structured on the existing editions.
  • README.md + the 19 translated editions — one selector link each.
  • website/locales/languages.json — { "code": "gu", "name": "ગુજરાતી", "readme": "docs/readme/README_gu.md", "dir": "ltr" }.
  • tests/conformance/readmeConsistency.test.ts — pins the new edition in the
    inventory, following the precedent set when Greek was added (ddcdb3c37).

Generated by the project's own commands (see Validation):

  • website/locales/gu/messages.po — scripts/website.py translations extract.
  • website/locales/*/messages.po, website/locales/messages.pot — same command;
    these change only in their line references, because the synced shared HTML
    shifted line numbers. Translated-message counts are unchanged in all 19
    catalogs (verified per file, e.g. ja 1300 → 1300, zh-CN 1491 → 1491).
  • website/public/**/index.html — scripts/website.py sync, regenerating the
    shared language selector and its hreflang links.

Intentionally not included: translating the website catalog itself. The new catalog is registered but untranslated, so each page falls back to English and is marked noindex until its msgstr entries are filled in — which is how the build already handles a newly registered locale (website_i18n.py:611,642). No documentation content, structure or links were changed for any other language.

Contract and boundary impact

  • Semantic owner and earliest changed stage: documentation and the website i18n inventory. No runtime stage changed.
  • Contribution scope fit and linked maintainer decision: not applicable —
    documentation within existing boundaries; no new provider or capability.
  • CLI and MCP/tool-catalog contract: none.
  • Provider, bridge, target-format, or platform compatibility: none.
  • Evidence, artifact, provenance, or reconstruction contract: none.
  • Target selection, authority, upstream behavior, and cleanup details: not applicable.
  • Generated metadata, package, or installation impact: none. docs/public/product-catalog.json and skills/ are untouched; no build outputs are committed. The generated files in this diff are the tracked website i18n catalogs and synced shared HTML, produced by the commands listed under Validation.

Expected effects:

  • Read existing files or captured data.
  • Launch or attach to a process.
  • Inject instrumentation or run scripts/code.
  • Change process memory, registers, files, or configuration.
  • Contact network services.
  • Recover protected code or work around protections.
  • Documentation or usability only; no target interaction.
  • Not sure yet; investigation or maintainer guidance needed.

Evidence and regression coverage

  • Tests added or updated: tests/conformance/readmeConsistency.test.ts now pins docs/readme/README_gu.md in the language inventory. The pre-existing conformance and boundary checks already enforce, for every translated edition, that its resolved link targets and its bash examples match README.md exactly; the new edition is covered by them without further changes.
  • Base reproduction or other evidence: source-derived, not executed as a failing-base run. The enforcing assertions are the inventory/editions set equality in readmeConsistency.test.ts and the link-drift comparison in scripts/lib/docs-facts.mjs (documentationFactIssues), which reports <path>: documentation links differ from README.md when a translated edition's link multiset diverges from the English one.
  • User-visible CLI/MCP output: not applicable.
  • Remaining proof gaps:
    1. The translation was produced with AI assistance and has not been reviewed by a native Gujarati speaker. Review is requested, particularly for the analysis-target table, where technical terms are transliterated (સ્યુડોકોડ, ડિકમ્પાઇલ) to match the convention in the other editions.
    2. scripts/website.py check ends with 4 failures in scripts/test-website.py that reproduce on this macOS host independently of this change; see Compatibility below.
    3. The full npm run check / check:ci lanes were not run locally.

For evidence-bearing changes: not applicable — this change carries no analysis evidence, provenance or reconstruction claims.

Validation performed

  • npx vitest run tests/conformance/readmeConsistency.test.ts tests/boundary/filesystem/documentationFacts.test.ts — 2 files, 6 tests passed.

  • npx oxfmt --check docs/readme/README_gu.md — All matched files use the correct format.

  • npm run test:prepare — generated the ignored catalogs that documentationFacts reads.

  • python3 scripts/website.py sync — Synced shared HTML (19 pages changed).

  • python3 scripts/website.py translations extract — ran; the resulting catalog is
    website/locales/gu/messages.po with header Language: gu, 1729 messages, all
    msgstr empty.

  • python3 scripts/website.py check — the site verification passes:

    • Checked shared HTML (0 pages changed).
    • Checked 1728 source messages for 20 translation catalogs.
    • gu: 19 English fallback pages, marked noindex; run translations status.
    • Prepared 399 reading pages in 21 languages.
    • Verified 401 HTML pages, 27790 local references, SVG XML and the example ZIP.
    • Verified search/sharing metadata, robots.txt and the sitemap for 380 indexable pages.

    The same run then fails 4 tests in scripts/test-website.py, for a reason unrelated to this change (next section).

Compatibility, safety, and release

  • Breaking changes or migration steps: none.
  • Real Hopper/Ghidra, browser, or OS coverage: not applicable — documentation only, no target interaction. Validated on macOS (darwin arm64), Node.js 26.4.0, Python 3.14.8.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: no target interaction. The README's security-relevant guidance — official download sources, commercial tool licensing (IDA Pro / Hex-Rays, Hopper, JEB), and the responsible-use disclaimer — is translated with its meaning preserved and its links unchanged, so the translated edition resolves to the same LICENSE, SECURITY.md, DISCLAIMER.md and THIRD_PARTY_NOTICES.md targets as the English README.
  • Unrelated pre-existing failure observed while validating: scripts/test-website.py fails 4 tests on macOS. scripts/verify-website.py:76 compares a .resolve()d target against an unresolved root; macOS temp directories are /var/folders/... symlinked to /private/var/folders/..., so target.is_relative_to(root) is always false and every local reference is reported as missing or as "reference leaves the website". Reproduced in isolation (test_repository_links_reject_missing_files_and_old_markdown_anchors, 0.002s) on a synthetic fixture that creates its own files in a temp directory and reads nothing from the repository, which makes it independent of this PR. Happy to open a separate issue and a one-line fix if useful.

Author readiness

Human owner: @adhenrique

  • I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work.
  • I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps.
  • I declare this PR ready for initial maintainer review.

Before merge

  • This PR addresses a concrete problem or an agreed enhancement.
  • Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff.
  • The PR has one focused outcome and the title follows type(scope): outcome.
  • Related issue is linked, or the reason for not linking one is stated above.
  • Tests cover changed observable behavior and meaningful failure paths.
  • Owning docs, contracts, and generated metadata are updated where needed.
  • User-visible CLI/MCP changes include representative output.
  • I checked the final diff for secrets, unrelated cleanup, and unsupported claims.

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/morluto/rea/pull/4209 **Author:** [@adhenrique](https://github.com/adhenrique) **Created:** 10/15/2026 **Status:** 🔄 Open **Base:** `main` ← **Head:** `docs/gujarati-readme` --- ### 📝 Commits (4) - [`1c4ab10`](https://github.com/morluto/rea/commit/1c4ab10de0a59b8cd93bd9ea7ba22b4b8e9ea702) docs(i18n): add Gujarati translations - [`48e8ba2`](https://github.com/morluto/rea/commit/48e8ba2614af9b65a682f99a6b4991565bf36426) docs(i18n): restore the Linux ps prerequisite in the Gujarati README - [`932f7c8`](https://github.com/morluto/rea/commit/932f7c8db2e27e5a52d2a985bbd0acd74184ca31) docs(i18n): refresh the Gujarati edition for the current README - [`f836868`](https://github.com/morluto/rea/commit/f836868efa4e138c39305d212ef9c87d8ae9b21a) docs(i18n): apply native review feedback to the Gujarati edition ### 📊 Changes **70 files changed** (+61986 additions, -47504 deletions) <details> <summary>View changed files</summary> 📝 `README.md` (+1 -1) 📝 `docs/readme/README_ar.md` (+1 -1) 📝 `docs/readme/README_de.md` (+1 -1) 📝 `docs/readme/README_el.md` (+1 -1) 📝 `docs/readme/README_es.md` (+1 -1) 📝 `docs/readme/README_fa.md` (+1 -1) 📝 `docs/readme/README_fr.md` (+1 -1) ➕ `docs/readme/README_gu.md` (+386 -0) 📝 `docs/readme/README_id.md` (+1 -1) 📝 `docs/readme/README_it.md` (+1 -1) 📝 `docs/readme/README_ja.md` (+1 -1) 📝 `docs/readme/README_ko.md` (+1 -1) 📝 `docs/readme/README_ml.md` (+1 -1) 📝 `docs/readme/README_pl.md` (+1 -1) 📝 `docs/readme/README_pt-BR.md` (+1 -1) 📝 `docs/readme/README_ro.md` (+1 -1) 📝 `docs/readme/README_ru.md` (+1 -1) 📝 `docs/readme/README_th.md` (+1 -1) 📝 `docs/readme/README_tr.md` (+1 -1) 📝 `docs/readme/README_uk.md` (+1 -1) _...and 50 more files_ </details> ### 📄 Description ## Summary Adds a Gujarati (ગુજરાતી) edition of the README and registers the `gu` locale so the language selector, the documentation-fact checks and the website build all recognise it. Gujarati-speaking developers had no localized entry point to the project. The repository already ships 19 translated editions, and a single inventory (`website/locales/languages.json`) drives the selector, the conformance checks and the website build, so a new edition has to be registered in all of them. Closes #4132 ## Problem and expected behavior Documentation-only. On the base revision there is no Gujarati edition, and the language selector offers 19 languages. Expected after this change: `docs/readme/README_gu.md` exists, every edition's selector links to it, and the locale is registered, so a Gujarati reader reaches the same overview, setup instructions and analysis-target table as the English README. Adding the file alone is not sufficient: `tests/conformance/readmeConsistency.test.ts` asserts set equality between the translated editions listed in `languages.json` and the files in `docs/readme/`, so an unregistered edition fails the suite. ## Change and scope Authored: - `docs/readme/README_gu.md` — new edition, structured on the existing editions. - `README.md` + the 19 translated editions — one selector link each. - `website/locales/languages.json` — `{ "code": "gu", "name": "ગુજરાતી", "readme": "docs/readme/README_gu.md", "dir": "ltr" }`. - `tests/conformance/readmeConsistency.test.ts` — pins the new edition in the inventory, following the precedent set when Greek was added (ddcdb3c37). Generated by the project's own commands (see Validation): - `website/locales/gu/messages.po` — `scripts/website.py translations extract`. - `website/locales/*/messages.po`, `website/locales/messages.pot` — same command; these change **only** in their line references, because the synced shared HTML shifted line numbers. Translated-message counts are unchanged in all 19 catalogs (verified per file, e.g. `ja` 1300 → 1300, `zh-CN` 1491 → 1491). - `website/public/**/index.html` — `scripts/website.py sync`, regenerating the shared language selector and its `hreflang` links. Intentionally not included: translating the website catalog itself. The new catalog is registered but untranslated, so each page falls back to English and is marked `noindex` until its `msgstr` entries are filled in — which is how the build already handles a newly registered locale (`website_i18n.py:611,642`). No documentation content, structure or links were changed for any other language. ## Contract and boundary impact - Semantic owner and earliest changed stage: documentation and the website i18n inventory. No runtime stage changed. - Contribution scope fit and linked maintainer decision: not applicable — documentation within existing boundaries; no new provider or capability. - CLI and MCP/tool-catalog contract: none. - Provider, bridge, target-format, or platform compatibility: none. - Evidence, artifact, provenance, or reconstruction contract: none. - Target selection, authority, upstream behavior, and cleanup details: not applicable. - Generated metadata, package, or installation impact: none. `docs/public/product-catalog.json` and `skills/` are untouched; no build outputs are committed. The generated files in this diff are the tracked website i18n catalogs and synced shared HTML, produced by the commands listed under Validation. Expected effects: - [ ] Read existing files or captured data. - [ ] Launch or attach to a process. - [ ] Inject instrumentation or run scripts/code. - [ ] Change process memory, registers, files, or configuration. - [ ] Contact network services. - [ ] Recover protected code or work around protections. - [x] Documentation or usability only; no target interaction. - [ ] Not sure yet; investigation or maintainer guidance needed. ## Evidence and regression coverage - **Tests added or updated:** `tests/conformance/readmeConsistency.test.ts` now pins `docs/readme/README_gu.md` in the language inventory. The pre-existing conformance and boundary checks already enforce, for every translated edition, that its resolved link targets and its `bash` examples match `README.md` exactly; the new edition is covered by them without further changes. - **Base reproduction or other evidence:** source-derived, not executed as a failing-base run. The enforcing assertions are the inventory/editions set equality in `readmeConsistency.test.ts` and the link-drift comparison in `scripts/lib/docs-facts.mjs` (`documentationFactIssues`), which reports `<path>: documentation links differ from README.md` when a translated edition's link multiset diverges from the English one. - **User-visible CLI/MCP output:** not applicable. - **Remaining proof gaps:** 1. The translation was produced with AI assistance and has **not** been reviewed by a native Gujarati speaker. Review is requested, particularly for the analysis-target table, where technical terms are transliterated (સ્યુડોકોડ, ડિકમ્પાઇલ) to match the convention in the other editions. 2. `scripts/website.py check` ends with 4 failures in `scripts/test-website.py` that reproduce on this macOS host independently of this change; see Compatibility below. 3. The full `npm run check` / `check:ci` lanes were not run locally. For evidence-bearing changes: not applicable — this change carries no analysis evidence, provenance or reconstruction claims. ## Validation performed - `npx vitest run tests/conformance/readmeConsistency.test.ts tests/boundary/filesystem/documentationFacts.test.ts` — 2 files, **6 tests passed**. - `npx oxfmt --check docs/readme/README_gu.md` — `All matched files use the correct format.` - `npm run test:prepare` — generated the ignored catalogs that `documentationFacts` reads. - `python3 scripts/website.py sync` — `Synced shared HTML (19 pages changed).` - `python3 scripts/website.py translations extract` — ran; the resulting catalog is `website/locales/gu/messages.po` with header `Language: gu`, 1729 messages, all `msgstr` empty. - `python3 scripts/website.py check` — the site verification passes: - `Checked shared HTML (0 pages changed).` - `Checked 1728 source messages for 20 translation catalogs.` - `gu: 19 English fallback pages, marked noindex; run translations status.` - `Prepared 399 reading pages in 21 languages.` - `Verified 401 HTML pages, 27790 local references, SVG XML and the example ZIP.` - `Verified search/sharing metadata, robots.txt and the sitemap for 380 indexable pages.` The same run then fails 4 tests in `scripts/test-website.py`, for a reason unrelated to this change (next section). ## Compatibility, safety, and release - **Breaking changes or migration steps:** none. - **Real Hopper/Ghidra, browser, or OS coverage:** not applicable — documentation only, no target interaction. Validated on macOS (darwin arm64), Node.js 26.4.0, Python 3.14.8. - **Package or release metadata impact:** none. - **Security, privacy, process, or containment review:** no target interaction. The README's security-relevant guidance — official download sources, commercial tool licensing (IDA Pro / Hex-Rays, Hopper, JEB), and the responsible-use disclaimer — is translated with its meaning preserved and its links unchanged, so the translated edition resolves to the same `LICENSE`, `SECURITY.md`, `DISCLAIMER.md` and `THIRD_PARTY_NOTICES.md` targets as the English README. - **Unrelated pre-existing failure observed while validating:** `scripts/test-website.py` fails 4 tests on macOS. `scripts/verify-website.py:76` compares a `.resolve()`d target against an **unresolved** `root`; macOS temp directories are `/var/folders/...` symlinked to `/private/var/folders/...`, so `target.is_relative_to(root)` is always false and every local reference is reported as missing or as "reference leaves the website". Reproduced in isolation (`test_repository_links_reject_missing_files_and_old_markdown_anchors`, 0.002s) on a synthetic fixture that creates its own files in a temp directory and reads nothing from the repository, which makes it independent of this PR. Happy to open a separate issue and a one-line fix if useful. ## Author readiness <!-- Left unchecked deliberately: the template reserves these declarations for a human owner, and this PR was prepared with AI assistance. Please fill in your handle and tick these yourself after reviewing the diff. --> Human owner: @adhenrique - [x] I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work. - [x] I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps. - [x] I declare this PR ready for initial maintainer review. ## Before merge - [x] This PR addresses a concrete problem or an agreed enhancement. - [x] Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff. - [x] The PR has one focused outcome and the title follows `type(scope): outcome`. - [x] Related issue is linked, or the reason for not linking one is stated above. - [x] Tests cover changed observable behavior and meaningful failure paths. - [x] Owning docs, contracts, and generated metadata are updated where needed. - [ ] User-visible CLI/MCP changes include representative output. <!-- not applicable: no CLI/MCP change --> - [x] I checked the final diff for secrets, unrelated cleanup, and unsupported claims. <!-- left for the human owner --> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#6130
No description provided.