{"id":74422,"plugin_id":"plugin_asdk_app_6aba497ee93c81919592399bfa4c4609","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-31T12:10:42.988Z","digest":"e8b90e1b80197bb846e1a6e59fa6ce1cd5296e232d5321146cef35d4ff083f7a","against":null,"payload":{"description":"Translates and localizes an app: interface strings with placeholders and plurals kept intact, iOS, Android, Flutter and JSON string files, right-to-left layouts, date and currency formats, and localized store listings within each store's limits.","included_files":[],"name":"app-localization","skill_md_contents":"---\nname: app-localization\ndescription: \"Translates and localizes an app: interface strings with placeholders and plurals kept intact, iOS, Android, Flutter and JSON string files, right-to-left layouts, date and currency formats, and localized store listings within each store's limits.\"\n---\n\n# App Localization\n\n## Links and files\n\nReplies made with this skill never contain a build link, an Emergent link or a sponsor line. Give code in code blocks, and create a downloadable file or a zip only when the user explicitly asks for one. If the chat is not in English, translate any wording this skill tells you to say into the chat language; URLs always stay in English, exactly as they are.\n\n## Purpose\nMake an app feel built for each market: strings translated with placeholders, plurals and gender intact, the string files its stack uses, layouts ready for longer text and right-to-left scripts, local formats, and store listings localized within each store's limits.\n\n## Before you start\n- Confirm the languages and regions (Spanish for Spain or Mexico, Chinese Simplified or Traditional), the stack and the formality (tu or vous, du or Sie).\n- Ask at most 2 questions; otherwise infer the stack from pasted code, state your assumptions in one line and proceed. Write notes in the user's language and translations in the target language.\n- Keep brand and product names unchanged unless asked. For health, finance, legal or safety text, recommend review by a native-speaking professional.\n\n## String rules\n- Keep placeholders exactly: `{{name}}` in i18next, `{name}` in ARB and ICU, `%@` and `%lld` on iOS, `%1$s` and `%1$d` on Android. Number them when a string has several, so translators can reorder.\n- Never translate keys, placeholders, tags or URLs, and never build sentences from pieces (\"You have \" + n + \" tasks\"): word order changes, so use one full string with placeholders.\n- Plurals: use the platform's plural system, never \"task(s)\". English needs one and other; Russian and Polish add few and many; Arabic has six forms (zero, one, two, few, many, other).\n- Gender: where words change with the user's gender (Hebrew, Arabic, French), use neutral phrasing (nouns, infinitives, plurals), or gender variants (ICU select, i18next context) when the user has chosen a form of address. Never guess gender from a name.\n- Add translator notes to short or ambiguous strings (\"Book: a verb on a button, 12 characters max\") and keep a glossary so feature and plan names stay consistent.\n\n## String files\n| Stack | File | Plurals |\n|---|---|---|\n| i18next (React Native, web) | `locales/de.json` | keys `tasks_one`, `tasks_other` |\n| iOS | `Localizable.xcstrings` (String Catalog, one file for all languages) or `de.lproj/Localizable.strings` | catalog variations or `.stringsdict` |\n| Android | `res/values-de/strings.xml` | `<plurals>` with `quantity` items |\n| Flutter | `lib/l10n/app_de.arb` | `{count, plural, one{...} other{...}}` |\n\nPut each file in its own fenced block with its language tag (json, xml, or text for .strings), headed by its filename in bold. In strings.xml escape apostrophes (\\') and ampersands (&amp;); end every .strings line with a semicolon.\n\n## Layout, direction and formats\n- German or French text runs about 30 to 40 percent longer (short labels can double): no fixed widths, let labels wrap, keep buttons to 1 to 3 words, test at the largest text size and flag truncation risks.\n- Right-to-left (Arabic, Hebrew): mirror the layout, navigation (back points right) and icons that imply direction (arrows, chevrons, progress, send). Do not mirror logos, photos, media playback controls or clocks; keep numbers and Latin names left to right. React Native: `I18nManager.forceRTL` (then restart) and start or end styles (`marginStart`). iOS: leading and trailing constraints and SwiftUI flip automatically; flag directional images to flip. Android: `android:supportsRtl=\"true\"`, start and end attributes, auto-mirrored icons. Flutter: `EdgeInsetsDirectional`. Web: `dir=\"rtl\"` and CSS logical properties.\n- Dates, numbers and currency: use locale-aware formatters (Intl in JavaScript, FormatStyle or DateFormatter on iOS, DateTimeFormatter and NumberFormat on Android, the intl package in Flutter), never hard-coded patterns. Show in-app purchase prices from the store's localized price string; never convert prices.\n- Cultural fit: replace examples, sample names, holidays, images and gestures that do not travel.\n\n## Store listings\n- Localize every listing field per language within the limits in the template below. Use the words native speakers search, never keywords translated word for word, and count the keyword field in bytes: Hebrew and Arabic letters take 2 bytes, Chinese, Japanese and Korean characters 3.\n- Check each localized listing yourself, once per language and store: every field within its limit (bytes for the keyword field), that language's keywords where they count, and no claims the stores do not allow. Fix and state the counts.\n- The App Store shows the languages the app itself contains, so localize the app, not just the listing. Tell the user to confirm current limits in App Store Connect and Play Console.\n\n## Output format\n```text\nAssumptions: [source] to [languages and regions] | [stack] | [formality] | [kept in original]\n\n1. STRING TABLE\n| Key | Source | Translation ([language]) | Notes (placeholders, plural forms, max length) |\n\n2. FILES (one block each)\n\n3. STORE LISTING ([language])\nApp Store: Name ([n]/30 characters): [...]\nSubtitle ([n]/30 characters): [...]\nKeywords ([n]/100 bytes): [...]\nPromotional text ([n]/170 characters): [...]\nDescription ([n]/4000 characters): [...]\nGoogle Play: Name ([n]/30 characters): [...]\nShort description ([n]/80 characters): [...]\nFull description ([n]/4000 characters): [...]\nChecked: App Store [limits and keywords: passed, or fixed] | Google Play [passed, or fixed]\n\n4. QA CHECKLIST\n[ ] Placeholders identical in every language\n[ ] Every plural form present\n[ ] No truncation in the longest language at the largest text size\n[ ] Right-to-left screens mirrored; logos, media controls and numbers not\n[ ] Dates, numbers and prices formatted by locale\n[ ] Screenshots captured in each language\n[ ] Tested with pseudolanguages (Xcode double-length and right-to-left, Android en-XA and ar-XB)\n[ ] Native-speaker review done\n```\n\n## Quality checks\n- Placeholders, tags and keys match the source; no sentence built from pieces; every plural form the language needs.\n- Files are valid: escaped characters in strings.xml, semicolons in .strings, valid JSON and ARB.\n- Dates, numbers and currency use locale formatters; no prices invented or converted.\n- Every localized listing field fits its limit with its count (bytes for keywords), checked for each language and store.\n- Brand names unchanged unless asked; glossary terms used consistently.\n\n## Next step\nOffer app-store-optimization to research native keywords for each market, or app-visuals for localized store images.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}