Skip to main content

i18n-helper

Internationalization workflow: string extraction, translation, locale management, and validation

来源信息

仓库
modelscope/leapflow
最近来源活动
2026年9月22日 14:28
检测到的 SKILL.md 语言
英语
星标
10
分支
6

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
i18n_helper
description
Internationalization workflow: string extraction, translation, locale management, and validation
version
1.0.0
metadata
{"leapflow":{"category":"productivity","source":"builtin","confidence":1,"quality_score":1},"hermes":{"category":"productivity","tags":["i18n","internationalization","localization","translation","l10n","locale"],"requires_tools":["file_read","file_write","shell_run"]}}
platforms
[]
triggers
["internationalization","i18n","translate","localization","国际化","翻译","add language support","extract strings"]
# i18n Helper ## Purpose Manage the full internationalization lifecycle: extract user-facing strings from source code, organize them into locale files, produce translations, and validate completeness across all supported languages. This skill treats i18n as a structured engineering process — not an afterthought bolted onto finished code. ## Guiding Principles 1. **Extract, never hard-code** — Every user-visible string passes through the i18n system. Literal strings in templates, error messages, or UI code are defects. 2. **Key naming is API design** — Translation keys are the contract between code and translators. Use semantic, hierarchical keys (`auth.login.button_label`) not positional or arbitrary ones (`str_042`). 3. **Context for translators** — A key alone is not enough. Provide descriptions, character limits, and screenshots where the string appears. 4. **Pluralization is not optional** — Different languages have different plural rules (1 form for Chinese, 2 for English, 6 for Arabic). Use ICU MessageFormat or the framework's plural system. 5. **Validate continuously** — Missing keys, unused keys, and format-string mismatches must be caught in CI, not in production. ## Workflow ### Phase 1 — Audit the Current State 1. Identify the **i18n framework** in use: - JavaScript/TypeScript: `i18next`, `react-intl`, `vue-i18n`, `next-intl`. - Python: `gettext`, `babel`, `django.utils.translation`. - Mobile: `NSLocalizedString` (iOS), `strings.xml` (Android). - None: the project has no i18n yet — skip to Phase 2b. 2. Locate **locale files**: `locales/`, `src/i18n/`, `messages/`, `*.po`, `*.json`, `*.yaml`, `*.xliff`, `*.arb`. 3. Inventory **supported languages** and their completeness: ``` en: 342 keys (base) zh-CN: 338 keys (4 missing) ja: 312 keys (30 missing) fr: 280 keys (62 missing) ``` 4. Scan source code for **hard-coded strings** that should be extracted: - String literals in JSX/TSX, template files, error messages. - User-facing text in CLI output, log messages shown to users, email templates. ### Phase 2a — String Extraction (Existing i18n Setup) Extract new or changed strings: 1. Run the framework's extraction tool: - `i18next-parser`: scans source for `t('key')` calls. - `babel extract`: generates `.pot` files from Python source. - `formatjs extract`: extracts from `intl.formatMessage()` calls. 2. Compare extracted keys against current base locale file. 3. For each **new key**: - Verify the key name follows conventions. - Add a description/comment for translator context. - Set a default value in the base language. 4. For each **removed key** (no longer in source): - Mark as deprecated (do not delete immediately — other branches may reference it). - Remove in a separate cleanup pass after merge. ### Phase 2b — Bootstrap i18n (No Existing Setup) When the project has no i18n framework: 1. Choose a framework appropriate to the tech stack. 2. Set up the base configuration (locale detection, fallback chain, default namespace). 3. Create the directory structure: ``` src/i18n/ config.ts # framework initialization locales/ en/ common.json # shared keys auth.json # feature-specific keys zh-CN/ common.json auth.json ``` 4. Replace hard-coded strings in source code with i18n function calls, file by file. Prioritize: - UI text visible to end users. - Error messages and validation feedback. - Email and notification templates. - CLI output (if user-facing). ### Phase 3 — Translation For each target language: 1. Identify **missing keys** by diffing against the base locale. 2. Generate translations following these rules: - Preserve **placeholders** exactly (`{name}`, `{{count}}`, `%s`). - Respect **plural forms** for the target language. - Maintain **HTML tags** and **Markdown** formatting if present. - Keep translations **contextually appropriate** — do not translate technical terms, brand names, or code identifiers. - Respect **character limits** if specified (e.g., button labels). 3. For languages you cannot translate confidently, produce a draft and flag it for human review: ```json { "auth.mfa.prompt": { "value": "请输入验证码", "_review": true, "_note": "Machine-translated; needs native review" } } ``` ### Phase 4 — Validation Run comprehensive checks: 1. **Completeness**: every key in the base locale exists in all target locales. 2. **Placeholder integrity**: `{name}` in the base string must appear in every translation — missing or extra placeholders cause runtime errors. 3. **Format string safety**: `%d`, `%s` counts must match between base and translation. 4. **No untranslated base-language text**: detect translations that are identical to the English base (may be untranslated). 5. **ICU syntax validity**: if using MessageFormat, parse each translation string for syntax errors. 6. **Unused keys**: keys in locale files that no source code references (wasted translator effort and bundle size). 7. **Key sorting**: ensure locale files are sorted alphabetically for clean diffs. Produce a validation report: ``` i18n Validation Report: Base language: en (342 keys) Languages: zh-CN, ja, fr zh-CN: 4 missing keys, 0 placeholder mismatches Missing: auth.mfa.backup_codes_title, settings.theme.auto_label, ... ja: 30 missing keys, 2 placeholder mismatches Mismatch: errors.rate_limit — base has {seconds}, ja translation missing fr: 62 missing keys, 0 placeholder mismatches Unused keys across all locales: 3 legacy.old_feature_banner, onboarding.v1_welcome, ... ``` ### Phase 5 — Write Back 1. Write updated locale files with `file_write`. 2. Maintain consistent formatting: - JSON: 2-space indent, sorted keys, trailing newline. - YAML: 2-space indent, no document markers for single docs. - PO/POT: standard gettext format. 3. If the project uses a key namespace pattern, place new keys in the correct namespace file. ## Error Handling | Situation | Action | |---|---| | Unknown i18n framework | Inspect imports and config files; if unidentifiable, ask the user. | | Locale files use inconsistent formats (mix of JSON and YAML) | Standardize to the format used by the majority; migrate outliers. | | Right-to-left language requested (Arabic, Hebrew) | Generate translations; flag that RTL CSS/layout support must be verified separately. | | String contains complex ICU syntax (select, plural, nested) | Generate carefully; validate with a MessageFormat parser before writing. | ## Limitations - Translation quality depends on language pair complexity. East Asian, Arabic, and other structurally distant languages should be reviewed by native speakers. - This skill does not modify UI layout for text expansion (German text is ~30% longer than English) — that is a design/CSS concern. - Runtime locale detection and switching logic is framework-specific; this skill sets up the data layer, not the runtime behavior.
在 GitHub 查看