Repository navigation
Conversation
Keep related cards, Cron output and Regex explanations localized. Supply missing CIDR runtime keys rather than regress callsites to English literals. Ultraworked with [omo](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: sisyphus-dev-ai <sisyphus-dev-ai@users.noreply.github.com>
There was a problem hiding this comment.
1 issue found across 38 files
Confidence score: 5/5
src/i18n/catalog-parity.test.jschecks locale leaf-key paths but not their values, so English fallbacks or empty translations could go undetected; add assertions that verify translated string values.
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="src/i18n/catalog-parity.test.js">
<violation number="1" location="src/i18n/catalog-parity.test.js:66">
P3: The "keeps exact nested leaf-key parity" test compares only leaf key paths, never the string values beneath them. A locale whose `tools.*`/`nav`/`common` values regressed to English (or to empty strings) would still pass as long as the key structure matches English, so the full catalog can ship untranslated without this test failing. Value-level (untranslated/empty) checking exists only for the four embedded tools in `embedded-tools.test.js`; the 48 active tools get no such coverage. Add a per-locale check that every non-English leaf value differs from the English value (with an allowlist for shared literals like standards names), mirroring the untranslated detection already used for the embedded tools.</violation>
</file>
Shadow auto-approve: would not auto-approve because issues were found.
Re-trigger cubic
| @@ -0,0 +1,93 @@ | |||
| // @vitest-environment node | |||
There was a problem hiding this comment.
P3: The "keeps exact nested leaf-key parity" test compares only leaf key paths, never the string values beneath them. A locale whose tools.*/nav/common values regressed to English (or to empty strings) would still pass as long as the key structure matches English, so the full catalog can ship untranslated without this test failing. Value-level (untranslated/empty) checking exists only for the four embedded tools in embedded-tools.test.js; the 48 active tools get no such coverage. Add a per-locale check that every non-English leaf value differs from the English value (with an allowlist for shared literals like standards names), mirroring the untranslated detection already used for the embedded tools.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/i18n/catalog-parity.test.js, line 66:
<comment>The "keeps exact nested leaf-key parity" test compares only leaf key paths, never the string values beneath them. A locale whose `tools.*`/`nav`/`common` values regressed to English (or to empty strings) would still pass as long as the key structure matches English, so the full catalog can ship untranslated without this test failing. Value-level (untranslated/empty) checking exists only for the four embedded tools in `embedded-tools.test.js`; the 48 active tools get no such coverage. Add a per-locale check that every non-English leaf value differs from the English value (with an allowlist for shared literals like standards names), mirroring the untranslated detection already used for the embedded tools.</comment>
<file context>
@@ -0,0 +1,93 @@
+ expect(englishLeaves.length).toBeGreaterThan(2500);
+
+ for (const [locale, catalog] of Object.entries(CATALOGS)) {
+ expect(leafPaths(catalog).sort(), `${locale} leaf keys`).toEqual(
+ englishLeaves,
+ );
</file context>
- pass the route language to every related-tools section (server render)
- insert cron field text literally in the runtime translator
- compare backfill placeholders as an order-independent multiset
- resolve prefixed _t helper call keys in the rendered-keys guard
- test cron runtime i18n via parsed scripts and a non-English render
- replace not-equal-to-English checks with empty/placeholder parity
- fix fr 1er janvier, ja バイト and ja {{logs}} example
- report locale, pattern, observed and expected on e2e mutation timeout
There was a problem hiding this comment.
1 issue found across 59 files (changes from recent commits).
Confidence score: 5/5
- In
src/i18n/rendered-keys.test.js, theif (related)gate can silently skip the related-tools locale assertion when markup differs from the regex’s expected<section>-to-<h2>adjacency, leaving that label unchecked; make the match robust and ensure the assertion runs.
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="src/i18n/rendered-keys.test.js">
<violation number="1" location="src/i18n/rendered-keys.test.js:126">
P3: The related-tools locale assertion at the bottom of the test is gated by `if (related)` on a regex that requires `<section ... aria-label="Related tools">` to be directly followed by `<h2>`. If the shared section markup ever changes shape (h2 wrapped in a `<header>`/`<div>`, heading element renamed, extra attributes before `aria-label`), the regex stops matching and the check silently no-ops for every tool — the exact route-language regression this fix targets would no longer be detected. Consider asserting on the section's presence for tools that declare related tools (e.g., from the `relatedTools` registry data) rather than only comparing when the regex happens to match.</violation>
</file>
Shadow auto-approve: would not auto-approve because issues were found.
Re-trigger cubic
| const related = html.match( | ||
| /<section[^>]*aria-label="Related tools"[^>]*>\s*<h2[^>]*>([^<]*)<\/h2>/, | ||
| ); | ||
| if (related) { |
There was a problem hiding this comment.
P3: The related-tools locale assertion at the bottom of the test is gated by if (related) on a regex that requires <section ... aria-label="Related tools"> to be directly followed by <h2>. If the shared section markup ever changes shape (h2 wrapped in a <header>/<div>, heading element renamed, extra attributes before aria-label), the regex stops matching and the check silently no-ops for every tool — the exact route-language regression this fix targets would no longer be detected. Consider asserting on the section's presence for tools that declare related tools (e.g., from the relatedTools registry data) rather than only comparing when the regex happens to match.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/i18n/rendered-keys.test.js, line 126:
<comment>The related-tools locale assertion at the bottom of the test is gated by `if (related)` on a regex that requires `<section ... aria-label="Related tools">` to be directly followed by `<h2>`. If the shared section markup ever changes shape (h2 wrapped in a `<header>`/`<div>`, heading element renamed, extra attributes before `aria-label`), the regex stops matching and the check silently no-ops for every tool — the exact route-language regression this fix targets would no longer be detected. Consider asserting on the section's presence for tools that declare related tools (e.g., from the `relatedTools` registry data) rather than only comparing when the regex happens to match.</comment>
<file context>
@@ -92,6 +118,16 @@ describe("rendered translation keys", () => {
+ const related = html.match(
+ /<section[^>]*aria-label="Related tools"[^>]*>\s*<h2[^>]*>([^<]*)<\/h2>/,
+ );
+ if (related) {
+ expect(related[1], `${tool.id} ${locale} related tools heading`).toBe(
+ resolveKey(catalog, "content.relatedTools"),
</file context>
- build related card hrefs with withLanguageQuery(tool.path, lang) - assert every rendered related section (no silent skip) and its link lang
There was a problem hiding this comment.
All reported issues were addressed across 4 files (changes from recent commits).
Shadow auto-approve: would not auto-approve because issues were found.
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
There was a problem hiding this comment.
0 issues found across 1 file (changes from recent commits).
Confidence score: 5/5
- Automated review surfaced no issues in the provided summaries.
- No files require special attention.
Shadow auto-approve: would not auto-approve. Auto-approval blocked by 2 unresolved issues from previous reviews.
Re-trigger cubic
…-value-20260912-04 Resolve conflicts in 7 route files by keeping the base's layout fix (related-tools section inside the content wrapper, oauth-debugger's empty mt-8 div dropped) together with this branch's currentLang argument for createRelatedToolsSection.
tools.public-repos-yml-builder.ui.placeholder2 is a YAML code sample that scripts/i18n-embedded-tools.mjs keeps as 'name: Public repos audit' in every locale. es/de carried a translated literal from the bulk catalog translation, so regenerating the catalogs reverted it and generated-catalog parity was 8/10. Align both to the generator; all ten locales now deep-equal the regenerated output.
There was a problem hiding this comment.
0 issues found across 2 files (changes from recent commits).
Confidence score: 5/5
- Automated review surfaced no issues in the provided summaries.
- No files require special attention.
Shadow auto-approve: would not auto-approve. Auto-approval blocked by 2 unresolved issues from previous reviews.
Re-trigger cubic
Summary
feat(i18n): complete catalog parity and runtime localization. This is logical change 4/11 in the dependency-ordered product-audit release stack.
Refs #969
What changed
dd3135661e3d728152724f807d6d8d1c2a2e4f49; validated tree:9f71693e7667635c7a4eed1d96bf8d8eafa50652.Why
Make related tools, Cron output, Regex explanations, and CIDR messages consistent across ten supported locales.
Verification
bun run buildpassed on this exact candidate tree.npm test -- --maxWorkers=2passed on this exact candidate tree.Three browser tests traversed all ten locales; 247 backfill keys per locale checked and generators were byte-stable.
Final combined tree additionally passed 801 unit tests and all 293 Playwright tests with retries disabled, plus all 48 primary tool workflows at desktop and mobile. The exploratory Color Converter exact-HEX boundary remains a documented pre-existing defect; its runtime is unchanged by this stack.
Risk & rollback
Summary by cubic
Completes catalog parity across all 10 locales and localizes Cron builder, Regex explanations, CIDR messages, and related-tool cards at runtime so those surfaces no longer fall back to English. Refs #969. This PR is part of a dependency-ordered release stack; merge after its preceding PR.
Runtime localization
withLanguageQuery.oauth-debugger's emptymt-8div dropped) with thecurrentLangargument.Catalog tooling and tests
i18n-tool-backfill.mjsandi18n-catalog-additions.mjswith per-locale JSON backfill files to keep the 10 catalogs in sync; pinsacornat 8.16.0 and compares backfill placeholders as an order-independent multiset._thelper call keys, and new tests assert every related-tools section renders, keeps the language on its links, and a concrete?lang=link contract.Written for commit fb798fa. Summary will update on new commits.