feat: i18n 11 languages + website update + fix #139 #140 #141

i18n:
- Add 9 new locale files (ja/ko/de/es/fr/pt/ru/vi/zh-TW)
- Add multilingual README files for all 11 languages
- Add locale helper, index, and modular translation system
- Add translation generation scripts

Website (docs/index.html):
- Replace 公益AI接口 branding with 晴辰云AI接口
- Remove OpenClaw 独立安装包 promotion block
- Update SEO meta tags (description, keywords, OG, Twitter, JSON-LD)
- Add 11-language README links to footer
- Update 元宝派 link to new URL

Bug fixes:
- fix(cron): delivery format mode:'push' → mode:'announce', remove invalid 'to' field (fixes #141)
- fix(cron): allow single-channel users to select delivery channel
- fix(cron): preserve delivery field in job state for editing
- fix(models): add 'ollama' as recognized API type, prevent overwriting native ollama config (fixes #140)
- fix(models): skip /v1 append for ollama native API baseUrl
- fix(assistant): normalize 'google-generative-ai' consistently, add ollama hints
- fix(version): use CLI path classification for source detection on Windows (fixes #139)
- fix(version): default to 'official' instead of 'chinese' when source unknown
- fix(version): reorder npm global package check based on active CLI
This commit is contained in:
晴天
2026-03-24 22:31:11 +08:00
parent f8af3bea4a
commit 985d263dc6
261 changed files with 26760 additions and 175 deletions

View File

@@ -1,16 +1,15 @@
/**
* i18n 国际化核心模块
* 支持中文(zh-CN)和英文(en),按需扩展
* 模块化多语言架构,支持 zh-CN / en / zh-TW / ja / ko
*/
import zhCN from '../locales/zh-CN.json'
import en from '../locales/en.json'
import { buildLocales } from '../locales/index.js'
const LANGS = { 'zh-CN': zhCN, en }
const LANGS = buildLocales()
const LANG_KEY = 'clawpanel_lang'
const FALLBACK = 'zh-CN'
let _lang = FALLBACK
let _dict = zhCN
let _dict = LANGS[FALLBACK]
let _listeners = []
/**
@@ -23,7 +22,7 @@ export function t(key, params) {
let val = _resolve(_dict, key)
if (val === undefined) {
// fallback 到中文
val = _resolve(zhCN, key)
val = _resolve(LANGS[FALLBACK], key)
}
if (val === undefined) return key
if (params) {
@@ -51,7 +50,16 @@ export function getLang() { return _lang }
export function getAvailableLangs() {
return [
{ code: 'zh-CN', label: '简体中文' },
{ code: 'zh-TW', label: '繁體中文' },
{ code: 'en', label: 'English' },
{ code: 'ja', label: '日本語' },
{ code: 'ko', label: '한국어' },
{ code: 'vi', label: 'Tiếng Việt' },
{ code: 'es', label: 'Español' },
{ code: 'pt', label: 'Português' },
{ code: 'ru', label: 'Русский' },
{ code: 'fr', label: 'Français' },
{ code: 'de', label: 'Deutsch' },
]
}
@@ -80,10 +88,28 @@ export function initI18n() {
}
// 自动检测浏览器语言
const nav = navigator.language || navigator.languages?.[0] || ''
if (nav.startsWith('zh')) {
if (nav === 'zh-TW' || nav === 'zh-HK') {
_lang = 'zh-TW'
} else if (nav.startsWith('zh')) {
_lang = 'zh-CN'
} else if (nav.startsWith('ja')) {
_lang = 'ja'
} else if (nav.startsWith('ko')) {
_lang = 'ko'
} else if (nav.startsWith('vi')) {
_lang = 'vi'
} else if (nav.startsWith('es')) {
_lang = 'es'
} else if (nav.startsWith('pt')) {
_lang = 'pt'
} else if (nav.startsWith('ru')) {
_lang = 'ru'
} else if (nav.startsWith('fr')) {
_lang = 'fr'
} else if (nav.startsWith('de')) {
_lang = 'de'
} else if (nav.startsWith('en')) {
_lang = 'en'
}
_dict = LANGS[_lang] || zhCN
_dict = LANGS[_lang] || LANGS[FALLBACK]
}

View File

@@ -9,6 +9,7 @@ export const API_TYPES = [
{ value: 'anthropic-messages', label: 'Anthropic 原生' },
{ value: 'openai-responses', label: 'OpenAI Responses' },
{ value: 'google-generative-ai', label: 'Google Gemini' },
{ value: 'ollama', label: 'Ollama 原生' },
]
// 服务商快捷预设