# swi18n **Repository Path**: snoware/swi18n ## Basic Information - **Project Name**: swi18n - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-30 - **Last Updated**: 2026-08-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # swi18n — 最小 i18n 系统语言识别 + 消息目录 + 回退链。跨领域可复用,独立 crate,**零依赖**。 - 仓库: - 许可:MulanPSL-2.0 ## 三件套 1. `detect_language()`:识别系统当前语言(BCP-47) 2. `Catalog`:消息目录(key × 语言 → 文本) 3. `Catalog::t(key, lang)`:按回退链取文本 ## 语言识别 | 平台 | 方式 | |---|---| | Windows | `GetUserDefaultUILanguage()`(LANGID → BCP-47,覆盖常见语言) | | macOS / Linux | `LANGUAGE` > `LC_ALL` > `LC_MESSAGES` > `LANG` 环境变量 | 识别失败回退 `en`。 ## 回退链 `Catalog::t` 依次尝试: 1. 首选语言精确匹配(`zh-CN`) 2. 主标签匹配(`zh` 裸标签) 3. 同主语言的任一地区条目(`zh-TW` 找不到 → 用 `zh-CN` 文本) 4. 默认语言(`en`) 5. 该 key 的首个条目 6. key 本身(保证永远有可显示内容,不 panic) ## 用法 ```rust use swi18n::{Catalog, detect_language}; let mut c = Catalog::new(); c.set_many("greet", &[("zh-CN", "你好"), ("en", "Hello"), ("ja", "こんにちは")]); let lang = detect_language(); // 如 "zh-CN" assert_eq!(c.t("greet", &lang), "你好"); assert_eq!(c.t("greet", "zh-TW"), "你好"); // 同主语言回退 assert_eq!(c.t("greet", "fr"), "Hello"); // 默认语言回退 assert_eq!(c.t("missing", "zh-CN"), "missing"); // key 兜底 // 翻译完整性检查 let missing = c.missing_for("fr"); // 缺少法语翻译的 key ``` ## 测试 ```bash cargo test # 10 项:匹配/回退/规范化/语言识别解析/LANGID 映射 ``` ## License MulanPSL-2.0