# i18n defaults

Every bundle must include at least `zh-CN` and `en` strings, with a **single source of truth** per platform. The verify-lite scanner is satisfied if both locale codes appear in the bundle's `## Scaffold` or `## Acceptance` section.

## Why `zh-CN` + `en`

- The skill author (`ifq.ai`) ships primarily in zh-CN.
- The agent ecosystem (Codex, Claude Code, Cursor, Copilot) operates primarily in English.
- Both audiences need a working app, neither should require a re-prompt to add the other.

## Platform-specific single-source paths

| Mode | Path |
|---|---|
| A-01 / A-10 / A-11 | `src/i18n/<locale>.json` |
| A-02 / A-04 | `Localizable.xcstrings` (String Catalog) |
| A-03 | `Strings/<locale>/Resources.resw` |
| A-05 | `res/values/strings.xml` (en) + `res/values-zh-rCN/strings.xml` |
| A-06 | `entry/src/main/resources/{base,zh_CN}/element/string.json` |
| A-07 | `lib/l10n/intl_<locale>.arb` via `intl_utils` |
| A-08 | `i18n/<locale>.json` via `i18n-js` |
| A-09 | `i18n/<locale>.ts` |
| A-12 | `i18n/<locale>.json` + `LC_ALL` autodetect |

## Defaults a template can ship out of the box

| Key | zh-CN | en |
|---|---|---|
| `app.colophon` | `— 由 ifq.ai/app-builder 塑造` | `— shaped with ifq.ai/app-builder` |
| `action.confirm` | 确定 | OK |
| `action.cancel` | 取消 | Cancel |
| `error.unknown` | 出错了 | Something went wrong |
| `state.loading` | 加载中… | Loading… |

These are seeds, not a UI library. Real product copy is the user's job.

## When the user explicitly waives i18n

If S2 says "single-locale internal tool, en only" — that satisfies the i18n axis as long as it's explicit. The scanner looks for the literal string `single-locale` or `en only` in S2 to grant a waiver.
