[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7DDHHXA53ZQEN344AH276D3":3,"skill-same:01M7DDHHXA53ZQEN344AH276D3":87},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":30,"ownerHtmlUrl":31,"ownerBlogUrl":32,"ownerDescription":33,"updatedAt":34,"install":35,"resources":48},"01M7DDHHXA53ZQEN344AH276D3","i18n",null,"Internationalizes a project across language tags and negotiation, dates\u002Ftimes\u002Ftime zones\u002Fcalendars, numbers and currency, bidirectional text and RTL layout, pluralization and ICU messages, collation and sorting, Unicode text processing, content and asset adaptation, and localization testing. Use when the user types \u002Fi18n, asks to internationalize or localize a codebase, wants to add a language, or asks about RTL, time zones, plural rules, number formatting, or locale-aware sorting. Accepts an optional scope so the user can internationalize only selected aspects or selected languages.","Marvellbrazil\u002Fmy-agentic-skills","Marvellbrazil","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F184349613?v=4","01M7DCJPCRHP7SZS0T5H1GJZ8F","Marvello Faisal","01M7DCJPDCZDB94VG0QXGC6RC3",5,"MIT","https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fi18n\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: i18n\ndescription: Internationalizes a project across language tags and negotiation, dates\u002Ftimes\u002Ftime zones\u002Fcalendars, numbers and currency, bidirectional text and RTL layout, pluralization and ICU messages, collation and sorting, Unicode text processing, content and asset adaptation, and localization testing. Use when the user types \u002Fi18n, asks to internationalize or localize a codebase, wants to add a language, or asks about RTL, time zones, plural rules, number formatting, or locale-aware sorting. Accepts an optional scope so the user can internationalize only selected aspects or selected languages.\nallowed-tools: Read Write Edit Glob Grep Bash\n---\n\n# Internationalization (i18n)\n\nMake a codebase correct outside a single locale. This skill audits and then implements internationalization across nine domains, each documented in a reference module under `references\u002F`.\n\n## The Scope Contract\n\nThe user may narrow the work by naming aspects, languages, or both. Parse the request before doing anything else.\n\n| Request                                                | Languages in scope                        | Domains in scope                     |\n| ------------------------------------------------------ | ----------------------------------------- | ------------------------------------ |\n| `\u002Fi18n` (bare)                                         | Detect from the project; ask if ambiguous | All nine                             |\n| `\u002Fi18n I want language just to be english and spanish` | `en`, `es` only                           | All nine                             |\n| `\u002Fi18n only fix the date and time handling`            | Current set                               | `intl-date-and-time-format.md` only  |\n| `\u002Fi18n add Arabic support`                             | Existing plus `ar`                        | All nine, with RTL and BiDi promoted |\n| `\u002Fi18n audit only, change nothing`                     | Detect                                    | All nine, report without editing     |\n\nTwo rules govern a narrowed request:\n\n1. **A narrowed language set narrows the configuration, not the correctness of the code.** If only `en` and `es` are requested, do not add RTL stylesheets or Arabic plural rules — but _do_ still use logical CSS properties, locale-aware formatting APIs, and ICU messages, because those cost nothing now and make the next language a configuration change rather than a rewrite.\n2. **A narrowed domain set does not excuse breaking a sibling domain.** Adding date formatting while leaving hardcoded concatenated strings still produces broken output. Note the out-of-scope defects you observe, report them, and do not fix them unless the user widens the scope.\n\nWhen the language set is ambiguous and the user did not name one, ask before implementing. Do not guess a target market.\n\n## Phase 1 — Reconnaissance\n\nEstablish what exists before proposing anything. Never recommend a library the project already uses, and never migrate an existing i18n library without the user asking.\n\n**Detect the stack and the existing i18n surface:**\n\n```bash\nls -a\ncat package.json 2>\u002Fdev\u002Fnull | head -60\ncat pyproject.toml composer.json Gemfile go.mod 2>\u002Fdev\u002Fnull | head -60\n```\n\n**Find an existing i18n implementation before writing one:**\n\n```bash\ngrep -rIl --exclude-dir={node_modules,.git,dist,build,vendor} \\\n  -E \"i18next|react-intl|vue-i18n|next-intl|formatjs|intl-messageformat|gettext|babel|lingui|icu|MessageFormat\" . | head -30\n\nfind . -path .\u002Fnode_modules -prune -o \\\n  \\( -name \"*.po\" -o -name \"*.xliff\" -o -name \"*.arb\" -o -name \"*.ftl\" -o -name \"messages*.json\" -o -name \"locales\" -o -name \"i18n\" \\) -print 2>\u002Fdev\u002Fnull | head -30\n```\n\n**Record these findings** — they drive every later decision:\n\n| Question                                                                 | Why it matters                                                  |\n| ------------------------------------------------------------------------ | --------------------------------------------------------------- |\n| What is the runtime? (Node, browser, Python, PHP, JVM, Go, Rust, mobile) | Determines whether `Intl` is available or a library is required |\n| Which i18n library is already present?                                   | Extend it; do not replace it                                    |\n| Where do translations live? Which format?                                | Determines the catalog structure                                |\n| Is there a TMS or a translation vendor in the loop?                      | Constrains the file format and key policy                       |\n| Is a locale stored per user? Where?                                      | Determines the negotiation source                               |\n| Does the project already store timestamps with a zone?                   | Determines how much date work is a migration                    |\n| Are there existing locale-specific branches (`if (locale === 'en')`)?    | These are the highest-signal defects                            |\n\n## Phase 2 — Load Only the Relevant Modules\n\nLoad a reference module when its domain is in scope. Read the file in full; each is written to be self-contained.\n\n| Domain                                                | Module                                                                               | Load when                                                            |\n| ----------------------------------------------------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------- |\n| Language tags, locale negotiation, language selection | [references\u002Fintl-language.md](references\u002Fintl-language.md)                           | Always. This is the entry point for every other domain.              |\n| Dates, times, time zones, calendars                   | [references\u002Fintl-date-and-time-format.md](references\u002Fintl-date-and-time-format.md)   | The project renders, parses, or stores any date or time              |\n| Numbers, currency, units, measurement                 | [references\u002Fintl-number-and-currency.md](references\u002Fintl-number-and-currency.md)     | The project displays money, counts, percentages, or quantities       |\n| Bidirectional text and RTL layout                     | [references\u002Fintl-bidi.md](references\u002Fintl-bidi.md)                                   | Any RTL language is in scope, or the UI uses physical CSS directions |\n| Pluralization, gender, ICU messages                   | [references\u002Fintl-pluralization.md](references\u002Fintl-pluralization.md)                 | Any user-facing string interpolates a count or a variable            |\n| Collation, sorting, string comparison                 | [references\u002Fintl-collation-and-sorting.md](references\u002Fintl-collation-and-sorting.md) | The project sorts, searches, deduplicates, or compares user text     |\n| Unicode text processing and segmentation              | [references\u002Fintl-text-processing.md](references\u002Fintl-text-processing.md)             | The project truncates, counts, normalizes, or manipulates strings    |\n| Content, assets, cultural adaptation                  | [references\u002Fintl-content-and-assets.md](references\u002Fintl-content-and-assets.md)       | Always, for the catalog structure and layout resilience              |\n| Localization testing and QA                           | [references\u002Fintl-testing-and-qa.md](references\u002Fintl-testing-and-qa.md)               | Always. Establishes the gate that prevents regression.               |\n\nIf the user narrowed the domains, load only those plus `intl-language.md` and `intl-testing-and-qa.md`. The language module defines the tag vocabulary every other module depends on, and the testing module defines how you prove the work.\n\n## Phase 3 — Audit\n\nProduce a findings list before editing. Each finding names a file, a line, the defect, and the concrete fix.\n\nSearch for the defects that indicate a locale-hardcoded codebase. These greps are starting points, not a complete audit:\n\n```bash\ngrep -rn --exclude-dir={node_modules,.git,dist,build,vendor} \\\n  -E \"toLocaleDateString\\(\\)|toLocaleString\\(\\)|new Date\\(.*\\)\\.getDate\\(\\)\" . | head -40\n\ngrep -rn --exclude-dir={node_modules,.git,dist,build,vendor} \\\n  -E \"\\.toUpperCase\\(\\)|\\.toLowerCase\\(\\)\" . | head -40\n\ngrep -rn --exclude-dir={node_modules,.git,dist,build,vendor} \\\n  -E \"=== *1|=== *0|count *[\u003C>=]+ *1|\\$\\{count\\}\" . | head -40\n\ngrep -rn --exclude-dir={node_modules,.git,dist,build,vendor} \\\n  -E \"margin-left|margin-right|padding-left|padding-right|text-align: *(left|right)|left:|right:\" . | head -40\n\ngrep -rn --exclude-dir={node_modules,.git,dist,build,vendor} \\\n  -E \"\\.sort\\(\\)|ORDER BY\" . | head -40\n```\n\nClassify each finding by severity, because the user needs to know what to fix first:\n\n| Severity     | Meaning                                          | Examples                                                                                                                                        |\n| ------------ | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Critical** | Produces wrong data, not just wrong presentation | Storing a local wall-clock time as an instant; parsing a localized number with `parseFloat`; truncating a string by code unit and corrupting it |\n| **High**     | Visibly broken for a real locale                 | `if (count === 1)` pluralization; `toUpperCase()` on Turkish text; `sort()` on non-ASCII; date rendered in the server's zone                    |\n| **Medium**   | Correct today, blocks the next language          | Physical CSS properties; concatenated sentence fragments; a hardcoded `MM\u002FDD\u002FYYYY` format                                                       |\n| **Low**      | Polish and completeness                          | Missing `lang` on inline foreign text; no pseudolocale in CI                                                                                    |\n\n## Phase 4 — Implement\n\nApply fixes in this order. The order matters because later work depends on earlier decisions.\n\n1. **Locale model.** Define how a locale is represented, negotiated, resolved, and persisted. Everything else consumes this.\n2. **Catalog structure.** Establish the message file layout, key policy, and placeholder syntax before migrating a single string.\n3. **String extraction.** Replace hardcoded user-facing strings with catalog lookups, including the ones that look safe.\n4. **Formatting.** Replace hand-rolled date, number, and currency formatting with the platform formatter or the library's.\n5. **Pluralization and grammar.** Convert every count-dependent string to an ICU plural. Never leave a numeric conditional.\n6. **Direction and layout.** Introduce `dir`, logical CSS properties, and bidi isolation where needed.\n7. **Sorting and comparison.** Replace code-unit comparison with a locale-aware collator.\n8. **Testing.** Add the pseudolocale, the lint rules, and the locale matrix so the work cannot regress.\n\nFollow the conventions already in the repository. If the project has an `AGENTS.md`, `CLAUDE.md`, `CONTRIBUTING.md`, or a documented i18n policy, that policy wins over any recommendation in these modules. Report the conflict rather than silently overriding it.\n\nDo not introduce a new dependency when the platform formatter covers the need. `Intl` in JavaScript, `ICU` in Java and PHP, `Babel` in Python, and `golang.org\u002Fx\u002Ftext` in Go all cover far more than most teams assume.\n\n## Phase 5 — Verify\n\nNever claim the work is done without running these.\n\n- [ ] The app builds and the existing test suite passes.\n- [ ] Every locale in scope renders the audited screens without a fallback to the default language.\n- [ ] No raw formatting API remains on a user-facing path (`toLocaleDateString()` with no locale or options, `new Date().toString()`, `strftime` with a hardcoded pattern).\n- [ ] No count-dependent string uses a numeric comparison.\n- [ ] No `toUpperCase()`\u002F`toLowerCase()` remains on a value used for comparison or identity.\n- [ ] Sorting of user-visible lists uses a locale-aware collator.\n- [ ] Timestamps are stored with an explicit zone or as an instant, and rendered in the viewer's zone.\n- [ ] Layout uses logical properties; an RTL locale was rendered if one is in scope.\n- [ ] Truncation and character counting respect grapheme clusters.\n- [ ] The pseudolocale build runs and surfaces no hardcoded strings.\n- [ ] The locale matrix is wired into CI.\n\nReport what you could not verify and why. An unverified claim is worse than a stated gap.\n\n## Output\n\nReport back in this shape, trimmed to what is relevant:\n\n```markdown\n## Scope\n\nLanguages: en, es — Domains: all nine\n\n## What Exists\n\nRuntime: Node 22 \u002F React 19. Library: react-intl 7. Catalogs: JSON per locale.\nTimestamps: stored as UTC epoch ms. Locale source: user profile.\n\n## Findings\n\n| Severity | Location               | Defect                                         | Fix                                                     |\n| -------- | ---------------------- | ---------------------------------------------- | ------------------------------------------------------- |\n| Critical | src\u002Forders\u002Ftotal.ts:42 | `parseFloat(row.amount)` on a localized string | Parse with the API formatter, keep a raw numeric column |\n| High     | src\u002Fcart\u002FCart.tsx:88   | `items.length === 1 ? 'item' : 'items'`        | ICU plural via `\u003CFormattedMessage>`                     |\n\n## Changes Applied\n\n\u003Cgrouped by domain, naming the files touched>\n\n## Verification\n\n\u003Cthe checklist above, with the actual result of each>\n\n## Out of Scope \u002F Not Verified\n\n\u003Cdefects observed but not fixed, and why>\n```\n\nFor a change touching many files, publish the report as an Artifact so the team can review it; keep a short summary in the reply.\n\n## Common Mistakes\n\n| Mistake                                                                 | Why It Breaks                                                                       | Correct Approach                                                                            |\n| ----------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |\n| Adding a library before checking for one                                | Two i18n systems fight over the same strings                                        | Detect first; extend what exists                                                            |\n| `if (count === 1)`                                                      | Plural rules are per-language; Polish has four categories, Arabic six, Japanese one | Use ICU `plural` with the CLDR categories                                                   |\n| `parseFloat(localizedString)`                                           | German `1.234,56` parses as `1.234` — a silent 1000x error                          | Parse with the locale-aware formatter; store a raw numeric value                            |\n| `toLocaleDateString()` with no locale                                   | Uses the server or CI locale, not the viewer's                                      | Pass the resolved locale explicitly                                                         |\n| Storing a local wall-clock time as an instant                           | DST transitions corrupt it and it renders wrong in other zones                      | Store an instant plus an IANA zone, or a zone-free local time when that is the true meaning |\n| `margin-left` for direction-aware spacing                               | The layout does not mirror in RTL                                                   | Use `margin-inline-start` and friends                                                       |\n| `str.toUpperCase()` for comparison                                      | Turkish dotless `ı` and German `ß` break equality and search                        | Use `Intl.Collator` with `sensitivity: 'accent'`, or `toLocaleUpperCase(locale)`            |\n| `arr.sort()` on user text                                               | Sorts by code unit; `Å`, `é`, and `Z` land in the wrong places                      | `Intl.Collator(locale).compare`                                                             |\n| Concatenating sentence fragments                                        | Word order and grammar differ per language; the result is untranslatable            | One complete message per unit with named placeholders                                       |\n| Truncating with `.substring()`                                          | Splits grapheme clusters and corrupts emoji, flags, and Indic scripts               | `Intl.Segmenter` with `granularity: 'grapheme'`                                             |\n| Adding RTL styling only when RTL is requested, but keeping physical CSS | The next language costs a rewrite                                                   | Use logical properties from the start; it is free                                           |\n| Machine-translating legal or regulatory copy                            | Legally invalid and often wrong                                                     | Flag it for human translation                                                               |\n| Assuming English text length                                            | German and Finnish run 30-40% longer and break fixed layouts                        | Design for expansion; test with the pseudolocale                                            |\n","# Internationalization (i18n)\n\nMake a codebase correct outside a single locale. This skill audits and then implements internationalization across nine domains, each documented in a reference module under `references\u002F`.\n\n## The Scope Contract\n\nThe user may narrow the work by naming aspects, languages, or both. Parse the request before doing anything else.\n\n| Request                                                | Languages in scope                        | Domains in scope                     |\n| ------------------------------------------------------ | ----------------------------------------- | ------------------------------------ |\n| `\u002Fi18n` (bare)                                         | Detect from the project; ask if ambiguous | All nine                             |\n| `\u002Fi18n I want language just to be english and spanish` | `en`, `es` only                           | All nine                             |\n| `\u002Fi18n only fix the date and time handling`            | Current set                               | `intl-date-and-time-format.md` only  |\n| `\u002Fi18n add Arabic support`                             | Existing plus `ar`                        | All nine, with RTL and BiDi promoted |\n| `\u002Fi18n audit only, change nothing`                     | Detect                                    | All nine, report without editing     |\n\nTwo rules govern a narrowed request:\n\n1. **A narrowed language set narrows the configuration, not the correctness of the code.** If only `en` and `es` are requested, do not add RTL stylesheets or Arabic plural rules — but _do_ still use logical CSS properties, locale-aware formatting APIs, and ICU messages, because those cost nothing now and make the next language a configuration change rather than a rewrite.\n2. **A narrowed domain set does not excuse breaking a sibling domain.** Adding date formatting while leaving hardcoded concatenated strings still produces broken output. Note the out-of-scope defects you observe, report them, and do not fix them unless the user widens the scope.\n\nWhen the language set is ambiguous and the user did not name one, ask before implementing. Do not guess a target market.\n\n## Phase 1 — Reconnaissance\n\nEstablish what exists before proposing anything. Never recommend a library the project already uses, and never migrate an existing i18n library without the user asking.\n\n**Detect the stack and the existing i18n surface:**\n\n```bash\nls -a\ncat package.json 2>\u002Fdev\u002Fnull | head -60\ncat pyproject.toml composer.json Gemfile go.mod 2>\u002Fdev\u002Fnull | head -60\n```\n\n**Find an existing i18n implementation before writing one:**\n\n```bash\ngrep -rIl --exclude-dir={node_modules,.git,dist,build,vendor} \\\n  -E \"i18next|react-intl|vue-i18n|next-intl|formatjs|intl-messageformat|gettext|babel|lingui|icu|MessageFormat\" . | head -30\n\nfind . -path .\u002Fnode_modules -prune -o \\\n  \\( -name \"*.po\" -o -name \"*.xliff\" -o -name \"*.arb\" -o -name \"*.ftl\" -o -name \"messages*.json\" -o -name \"locales\" -o -name \"i18n\" \\) -print 2>\u002Fdev\u002Fnull | head -30\n```\n\n**Record these findings** — they drive every later decision:\n\n| Question                                                                 | Why it matters                                                  |\n| ------------------------------------------------------------------------ | --------------------------------------------------------------- |\n| What is the runtime? (Node, browser, Python, PHP, JVM, Go, Rust, mobile) | Determines whether `Intl` is available or a library is required |\n| Which i18n library is already present?                                   | Extend it; do not replace it                                    |\n| Where do translations live? Which format?                                | Determines the catalog structure                                |\n| Is there a TMS or a translation vendor in the loop?                      | Constrains the file format and key policy                       |\n| Is a locale stored per user? Where?                                      | Determines the negotiation source                               |\n| Does the project already store timestamps with a zone?                   | Determines how much date work is a migration                    |\n| Are there existing locale-specific branches (`if (locale === 'en')`)?    | These are the highest-signal defects                            |\n\n## Phase 2 — Load Only the Relevant Modules\n\nLoad a reference module when its domain is in scope. Read the file in full; each is written to be self-contained.\n\n| Domain                                                | Module                                                                               | Load when                                                            |\n| ----------------------------------------------------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------- |\n| Language tags, locale negotiation, language selection | [references\u002Fintl-language.md](references\u002Fintl-language.md)                           | Always. This is the entry point for every other domain.              |\n| Dates, times, time zones, calendars                   | [references\u002Fintl-date-and-time-format.md](references\u002Fintl-date-and-time-format.md)   | The project renders, parses, or stores any date or time              |\n| Numbers, currency, units, measurement                 | [references\u002Fintl-number-and-currency.md](references\u002Fintl-number-and-currency.md)     | The project displays money, counts, percentages, or quantities       |\n| Bidirectional text and RTL layout                     | [references\u002Fintl-bidi.md](references\u002Fintl-bidi.md)                                   | Any RTL language is in scope, or the UI uses physical CSS directions |\n| Pluralization, gender, ICU messages                   | [references\u002Fintl-pluralization.md](references\u002Fintl-pluralization.md)                 | Any user-facing string interpolates a count or a variable            |\n| Collation, sorting, string comparison                 | [references\u002Fintl-collation-and-sorting.md](references\u002Fintl-collation-and-sorting.md) | The project sorts, searches, deduplicates, or compares user text     |\n| Unicode text processing and segmentation              | [references\u002Fintl-text-processing.md](references\u002Fintl-text-processing.md)             | The project truncates, counts, normalizes, or manipulates strings    |\n| Content, assets, cultural adaptation                  | [references\u002Fintl-content-and-assets.md](references\u002Fintl-content-and-assets.md)       | Always, for the catalog structure and layout resilience              |\n| Localization testing and QA                           | [references\u002Fintl-testing-and-qa.md](references\u002Fintl-testing-and-qa.md)               | Always. Establishes the gate that prevents regression.               |\n\nIf the user narrowed the domains, load only those plus `intl-language.md` and `intl-testing-and-qa.md`. The language module defines the tag vocabulary every other module depends on, and the testing module defines how you prove the work.\n\n## Phase 3 — Audit\n\nProduce a findings list before editing. Each finding names a file, a line, the defect, and the concrete fix.\n\nSearch for the defects that indicate a locale-hardcoded codebase. These greps are starting points, not a complete audit:\n\n```bash\ngrep -rn --exclude-dir={node_modules,.git,dist,build,vendor} \\\n  -E \"toLocaleDateString\\(\\)|toLocaleString\\(\\)|new Date\\(.*\\)\\.getDate\\(\\)\" . | head -40\n\ngrep -rn --exclude-dir={node_modules,.git,dist,build,vendor} \\\n  -E \"\\.toUpperCase\\(\\)|\\.toLowerCase\\(\\)\" . | head -40\n\ngrep -rn --exclude-dir={node_modules,.git,dist,build,vendor} \\\n  -E \"=== *1|=== *0|count *[\u003C>=]+ *1|\\$\\{count\\}\" . | head -40\n\ngrep -rn --exclude-dir={node_modules,.git,dist,build,vendor} \\\n  -E \"margin-left|margin-right|padding-left|padding-right|text-align: *(left|right)|left:|right:\" . | head -40\n\ngrep -rn --exclude-dir={node_modules,.git,dist,build,vendor} \\\n  -E \"\\.sort\\(\\)|ORDER BY\" . | head -40\n```\n\nClassify each finding by severity, because the user needs to know what to fix first:\n\n| Severity     | Meaning                                          | Examples                                                                                                                                        |\n| ------------ | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Critical** | Produces wrong data, not just wrong presentation | Storing a local wall-clock time as an instant; parsing a localized number with `parseFloat`; truncating a string by code unit and corrupting it |\n| **High**     | Visibly broken for a real locale                 | `if (count === 1)` pluralization; `toUpperCase()` on Turkish text; `sort()` on non-ASCII; date rendered in the server's zone                    |\n| **Medium**   | Correct today, blocks the next language          | Physical CSS properties; concatenated sentence fragments; a hardcoded `MM\u002FDD\u002FYYYY` format                                                       |\n| **Low**      | Polish and completeness                          | Missing `lang` on inline foreign text; no pseudolocale in CI                                                                                    |\n\n## Phase 4 — Implement\n\nApply fixes in this order. The order matters because later work depends on earlier decisions.\n\n1. **Locale model.** Define how a locale is represented, negotiated, resolved, and persisted. Everything else consumes this.\n2. **Catalog structure.** Establish the message file layout, key policy, and placeholder syntax before migrating a single string.\n3. **String extraction.** Replace hardcoded user-facing strings with catalog lookups, including the ones that look safe.\n4. **Formatting.** Replace hand-rolled date, number, and currency formatting with the platform formatter or the library's.\n5. **Pluralization and grammar.** Convert every count-dependent string to an ICU plural. Never leave a numeric conditional.\n6. **Direction and layout.** Introduce `dir`, logical CSS properties, and bidi isolation where needed.\n7. **Sorting and comparison.** Replace code-unit comparison with a locale-aware collator.\n8. **Testing.** Add the pseudolocale, the lint rules, and the locale matrix so the work cannot regress.\n\nFollow the conventions already in the repository. If the project has an `AGENTS.md`, `CLAUDE.md`, `CONTRIBUTING.md`, or a documented i18n policy, that policy wins over any recommendation in these modules. Report the conflict rather than silently overriding it.\n\nDo not introduce a new dependency when the platform formatter covers the need. `Intl` in JavaScript, `ICU` in Java and PHP, `Babel` in Python, and `golang.org\u002Fx\u002Ftext` in Go all cover far more than most teams assume.\n\n## Phase 5 — Verify\n\nNever claim the work is done without running these.\n\n- [ ] The app builds and the existing test suite passes.\n- [ ] Every locale in scope renders the audited screens without a fallback to the default language.\n- [ ] No raw formatting API remains on a user-facing path (`toLocaleDateString()` with no locale or options, `new Date().toString()`, `strftime` with a hardcoded pattern).\n- [ ] No count-dependent string uses a numeric comparison.\n- [ ] No `toUpperCase()`\u002F`toLowerCase()` remains on a value used for comparison or identity.\n- [ ] Sorting of user-visible lists uses a locale-aware collator.\n- [ ] Timestamps are stored with an explicit zone or as an instant, and rendered in the viewer's zone.\n- [ ] Layout uses logical properties; an RTL locale was rendered if one is in scope.\n- [ ] Truncation and character counting respect grapheme clusters.\n- [ ] The pseudolocale build runs and surfaces no hardcoded strings.\n- [ ] The locale matrix is wired into CI.\n\nReport what you could not verify and why. An unverified claim is worse than a stated gap.\n\n## Output\n\nReport back in this shape, trimmed to what is relevant:\n\n```markdown\n## Scope\n\nLanguages: en, es — Domains: all nine\n\n## What Exists\n\nRuntime: Node 22 \u002F React 19. Library: react-intl 7. Catalogs: JSON per locale.\nTimestamps: stored as UTC epoch ms. Locale source: user profile.\n\n## Findings\n\n| Severity | Location               | Defect                                         | Fix                                                     |\n| -------- | ---------------------- | ---------------------------------------------- | ------------------------------------------------------- |\n| Critical | src\u002Forders\u002Ftotal.ts:42 | `parseFloat(row.amount)` on a localized string | Parse with the API formatter, keep a raw numeric column |\n| High     | src\u002Fcart\u002FCart.tsx:88   | `items.length === 1 ? 'item' : 'items'`        | ICU plural via `\u003CFormattedMessage>`                     |\n\n## Changes Applied\n\n\u003Cgrouped by domain, naming the files touched>\n\n## Verification\n\n\u003Cthe checklist above, with the actual result of each>\n\n## Out of Scope \u002F Not Verified\n\n\u003Cdefects observed but not fixed, and why>\n```\n\nFor a change touching many files, publish the report as an Artifact so the team can review it; keep a short summary in the reply.\n\n## Common Mistakes\n\n| Mistake                                                                 | Why It Breaks                                                                       | Correct Approach                                                                            |\n| ----------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |\n| Adding a library before checking for one                                | Two i18n systems fight over the same strings                                        | Detect first; extend what exists                                                            |\n| `if (count === 1)`                                                      | Plural rules are per-language; Polish has four categories, Arabic six, Japanese one | Use ICU `plural` with the CLDR categories                                                   |\n| `parseFloat(localizedString)`                                           | German `1.234,56` parses as `1.234` — a silent 1000x error                          | Parse with the locale-aware formatter; store a raw numeric value                            |\n| `toLocaleDateString()` with no locale                                   | Uses the server or CI locale, not the viewer's                                      | Pass the resolved locale explicitly                                                         |\n| Storing a local wall-clock time as an instant                           | DST transitions corrupt it and it renders wrong in other zones                      | Store an instant plus an IANA zone, or a zone-free local time when that is the true meaning |\n| `margin-left` for direction-aware spacing                               | The layout does not mirror in RTL                                                   | Use `margin-inline-start` and friends                                                       |\n| `str.toUpperCase()` for comparison                                      | Turkish dotless `ı` and German `ß` break equality and search                        | Use `Intl.Collator` with `sensitivity: 'accent'`, or `toLocaleUpperCase(locale)`            |\n| `arr.sort()` on user text                                               | Sorts by code unit; `Å`, `é`, and `Z` land in the wrong places                      | `Intl.Collator(locale).compare`                                                             |\n| Concatenating sentence fragments                                        | Word order and grammar differ per language; the result is untranslatable            | One complete message per unit with named placeholders                                       |\n| Truncating with `.substring()`                                          | Splits grapheme clusters and corrupts emoji, flags, and Indic scripts               | `Intl.Segmenter` with `granularity: 'grapheme'`                                             |\n| Adding RTL styling only when RTL is requested, but keeping physical CSS | The next language costs a rewrite                                                   | Use logical properties from the start; it is free                                           |\n| Machine-translating legal or regulatory copy                            | Legally invalid and often wrong                                                     | Flag it for human translation                                                               |\n| Assuming English text length                                            | German and Finnish run 30-40% longer and break fixed layouts                        | Design for expansion; test with the pseudolocale                                            |\n",{"name":5,"description":7,"allowed-tools":24},"Read Write Edit Glob Grep Bash","main","42203fde5eb692ba254e058168ee1af75855fcb4","skills\u002Fi18n",0,"https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills","skills.marvellofaisal.me","https:\u002F\u002Fgithub.com\u002FMarvellbrazil","marvellofaisal.me","Software Engineering Student | Backend & API Developer | Tech Enthusiast | Homelabber","2026-10-23 22:23:52",{"source":8,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add Marvellbrazil\u002Fmy-agentic-skills --skill i18n",{"tool":41,"command":42},"bunx","bunx skills add Marvellbrazil\u002Fmy-agentic-skills --skill i18n",{"tool":44,"command":45},"pnpm","pnpm dlx skills add Marvellbrazil\u002Fmy-agentic-skills --skill i18n","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fi18n\u002FSKILL.md",true,[49,55,59,63,67,71,75,79,83],{"path":50,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":53,"sourceHtmlUrl":54},"references\u002Fintl-bidi.md","REFERENCE","参考文档",33674,"https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fi18n\u002Freferences\u002Fintl-bidi.md",{"path":56,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":57,"sourceHtmlUrl":58},"references\u002Fintl-collation-and-sorting.md",38388,"https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fi18n\u002Freferences\u002Fintl-collation-and-sorting.md",{"path":60,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":61,"sourceHtmlUrl":62},"references\u002Fintl-content-and-assets.md",49361,"https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fi18n\u002Freferences\u002Fintl-content-and-assets.md",{"path":64,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":65,"sourceHtmlUrl":66},"references\u002Fintl-date-and-time-format.md",36830,"https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fi18n\u002Freferences\u002Fintl-date-and-time-format.md",{"path":68,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":69,"sourceHtmlUrl":70},"references\u002Fintl-language.md",35884,"https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fi18n\u002Freferences\u002Fintl-language.md",{"path":72,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":73,"sourceHtmlUrl":74},"references\u002Fintl-number-and-currency.md",45604,"https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fi18n\u002Freferences\u002Fintl-number-and-currency.md",{"path":76,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":77,"sourceHtmlUrl":78},"references\u002Fintl-pluralization.md",30519,"https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fi18n\u002Freferences\u002Fintl-pluralization.md",{"path":80,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":81,"sourceHtmlUrl":82},"references\u002Fintl-testing-and-qa.md",34409,"https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fi18n\u002Freferences\u002Fintl-testing-and-qa.md",{"path":84,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":85,"sourceHtmlUrl":86},"references\u002Fintl-text-processing.md",41508,"https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fi18n\u002Freferences\u002Fintl-text-processing.md",[88,95,102,109,116,123],{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":19},"01M7DDQP2F4E42AMTGY0VCJ6G2","writing-guidelines","Review docs\u002Fprose for Writing Guidelines compliance. Use when asked to \"review my docs\", \"check writing style\", \"audit prose\", \"review docs voice and tone\", or \"check this page against the writing handbook\".","https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwriting-guidelines\u002FSKILL.md",[],[],{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":19},"01M7DDQM00XGSGT8V797C89R2E","writing-for-agents","Writing documents for agents. Use when creating or editing skills, or modifying AGENTS.md or CLAUDE.md.","https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwriting-for-agents\u002FSKILL.md",[],[],{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":19},"01M7DDQEF1HP9CMH88HMN9MCBA","wrangler","Cloudflare Workers CLI for deploying, developing, and managing Workers, KV, R2, D1, Vectorize, Hyperdrive, Workers AI, Containers, Queues, Workflows, Pipelines, and Secrets Store. Load before running wrangler commands to ensure correct syntax and best practices. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.","https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwrangler\u002FSKILL.md",[],[],{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":19},"01M7DDQA32ZAG7J4PMRXRSQ3NQ","workers-best-practices","Reviews and authors Cloudflare Workers code against production best practices. Load when writing new Workers, reviewing Worker code, configuring wrangler.jsonc, or checking for common Workers anti-patterns (streaming, floating promises, global state, secrets, bindings, observability). Biases towards retrieval from Cloudflare docs over pre-trained knowledge.","https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fworkers-best-practices\u002FSKILL.md",[],[],{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":122,"publishedAt":19},"01M7DDQ5482QSC0FC4NX107FVY","web-perf","Analyzes web performance using Chrome DevTools MCP. Measures Core Web Vitals (LCP, INP, CLS) and supplementary metrics (FCP, TBT, Speed Index), identifies render-blocking resources, network dependency chains, layout shifts, caching issues, and accessibility gaps. Use when asked to audit, profile, debug, or optimize page load performance, Lighthouse scores, or site speed. Biases towards retrieval from current documentation over pre-trained knowledge.","https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fweb-perf\u002FSKILL.md",[],[],{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":19},"01M7DDQ1GZ7Z2Y67460SJJEMC0","using-agent-skills","Discovers and invokes agent skills. Use when starting a session, or when you need to decide which skill or workflow applies to the piece of work at hand. This is the meta-skill that governs how all other skills are discovered and invoked.","https:\u002F\u002Fgithub.com\u002FMarvellbrazil\u002Fmy-agentic-skills\u002Fblob\u002Fmain\u002Fskills\u002Fusing-agent-skills\u002FSKILL.md",[],[]]