← CrowdinCONTENT HISTORY

Update to Crowdin

Snapshot Oct 28, 2026 · 13:09 UTC · version 1.8.0

Collection source: downloaded plugin package.

WHAT CHANGED

First saved snapshot

No earlier snapshot is available to establish a change.

Save Crowdin and check future changes in Following.

Up to 10 plugins free · no card required.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Writes meaningful ai_context values in Crowdin JSONL files for strings that need translator context. Use when extracting context, filling ai_context fields, adding context to ambiguous strings, or working with Crowdin JSONL context files.",
  "included_files": [],
  "name": "context-extraction",
  "skill_md_contents": "---\nname: context-extraction\ndescription: Writes meaningful ai_context values in Crowdin JSONL files for strings that need translator context. Use when extracting context, filling ai_context fields, adding context to ambiguous strings, or working with Crowdin JSONL context files.\n---\n\n# Context Extraction\n\n## Information sources (priority order)\n\nFor each string, use these JSONL fields in order - stop when you have enough to write a confident `ai_context`:\n\n1. `text` - the source string itself; always the primary signal\n2. `key` - often encodes structure (e.g. `button.save`, `modal.title.delete_user`, `error.network.timeout`)\n3. `context` - may contain a free-text description, a translator comment, a source file reference, or be empty; treat as supplementary and don't assume any specific format\n4. Source files - only if `context` contains a parseable file path + line number and the string is still ambiguous; read ±10–15 lines around the reference to identify UI element type, surrounding component, and props\n\n## Strings that need context\n\nPrioritize these - skip strings that are already clear from `text` + `key` alone:\n\n- Ambiguous short words - single verbs, nouns, or adjectives that change meaning depending on UI placement\n- Color / status names - words that name a color, state, or category; could be a label, badge, or filter\n- ICU / message format strings - strings with plural forms or named parameters whose meaning depends on what's being counted or substituted\n- Strings with inline tags - text containing markup tags where the role of the tagged portion isn't clear from the string alone\n- Short phrases with unclear scope - brief imperative or standalone phrases that could belong to multiple UI contexts\n\n## Writing good `ai_context` values\n\n- 1–3 sentences, written for a translator - not a developer\n- State the UI element type (button, label, tab, tooltip, modal title, dropdown option, etc.) and where it appears\n- For plurals: what entity is counted, what `#` is replaced with\n- For inline tags: what the tagged portion renders as (link, code, bold text, etc.)\n- For color/status names: whether it's a selectable option, badge, filter label, etc.\n- Avoid file names and variable names unless they clarify meaning\n\n### Examples\n\n| String | Key | Good `ai_context` |\n|--------|-----|-------------------|\n| `\"Red\"` | `color.red` | `\"Color option label in a color picker. Refers to the color red as a selectable choice.\"` |\n| `\"Blue\"` | *(none)* | `\"Color name used as a selectable option or status label. Clarify based on surrounding UI.\"` |\n| `\"{count, plural, one {# month} other {# months}}\"` | `duration.months` | `\"Displays a duration in months. '#' is replaced by the numeric count.\"` |\n| `\"Edit <0>src/App.tsx</0> and save to test HMR\"` | *(none)* | `\"Instructional UI message. The tagged portion is rendered as an inline code element highlighting a filename.\"` |\n| `\"New\"` | `button.new` | `\"Label for a button that creates a new item. The exact entity depends on the current page context.\"` |\n\n## Orchestrated inputs (optional)\n\nWhen another workflow invokes this skill with extra context, use it:\n\n- App domain - a one-line description of what the product is. Prefix or fold it into placement descriptions where it disambiguates (\"Button label in a coffee-brew logging app…\").\n- Source checkout - when the JSONL `context` field carries a `#: path:line` reference (PO uploads add these automatically) and the repo is available, read the surrounding code instead of guessing: identify the component type, the props, and what any placeholder is replaced with.\n\nNeither input changes the safety rules below - still edit only `ai_context`.\n\n## JSONL file safety rules\n\n**Only ever edit the `ai_context` field value.** Never touch `id`, `key`, `text`, `file`, or `context`.\n\n### Editing procedure\n\nSingle-string (1–5 lines): Use StrReplace scoped to the exact line. Target the `\"ai_context\":\"\"` substring (or the full current value if already set):\n\n```\nold: \"ai_context\":\"\"\nnew: \"ai_context\":\"Your context here.\"\n```\n\nBatch (many strings): When dozens or hundreds of lines need context, work in batches instead of one string at a time.\n\n- Read a portion of the file (or the whole file if manageable), identify lines that need `ai_context`, fill context for a batch of those lines (parse line as JSON, set `ai_context`, serialize back to a single line), then write or apply that batch of changes. Repeat for the next batch until done.\n- Prefer writing (or applying edits) in batches of lines rather than a single global read-then-write or hundreds of single-line replacements. Batch size is up to the implementer (e.g. tens or a hundred lines per batch).\n- When batching, still apply the validity checklist below to a sample of changed lines before saving.\n\n### Validity checklist (verify before saving)\n\n- [ ] The line is still a single valid JSON object\n- [ ] `ai_context` value is a quoted string\n- [ ] No unescaped double quotes inside the value - use `\\\"`\n- [ ] No literal newlines inside the value - keep it on one line\n- [ ] No fields added, removed, or reordered\n\n### Character escaping\n\n- `\"` → `\\\"`\n- `\\` → `\\\\`\n- Newline → avoid; use a space instead\n"
}

SHA-256 of public snapshot: 975b128c94e89ce9af07db376dccd76f5acabaad911d627e0fc1dde646db9899