import {computed, onMounted, ref} from 'vue'; /** * Popup 多语言(仅影响 Popup 文案,不改平台配置/爬取数据)。 * 中文备注:用户要求把切换入口放在 Popup 底部版本号附近,因此这里提供一个轻量的本地 i18n。 */ /** chrome.storage.local 中保存语言的 key */ const POPUP_UI_LANG_KEY = 'popupUiLang'; /** 目前仅提供中英两种,后续可在这里继续扩展 */ export type PopupUiLang = 'zh-CN' | 'en'; /** 文案字典:key 统一用英文标识,方便维护 */ const DICT: Record> = { 'zh-CN': { please_login: '请先登录后再开始爬取', sign_in: '登录', sign_out: '退出登录', platform_select: '平台选择', scan_now: '立即扫描', opening: '正在打开…', scanning: '扫描中', paused: '已暂停', done: '已完成', failed: '失败', show_tab: '显示页面', continue_now: '继续', cancel: '取消', step_done: '已完成', step_failed: '失败', step_running: '进行中', step_pending: '等待中', language: '语言', lang_zh: '中文', lang_en: 'English', }, en: { please_login: 'Please sign in before scanning.', sign_in: 'Sign in', sign_out: 'Sign out', platform_select: 'Platform', scan_now: 'Scan now', opening: 'Opening…', scanning: 'Scanning', paused: 'Paused', done: 'Done', failed: 'Failed', show_tab: 'Show tab', continue_now: 'Continue now', cancel: 'Cancel', step_done: 'Completed', step_failed: 'Failed', step_running: 'Running', step_pending: 'Pending', language: 'Language', lang_zh: '中文', lang_en: 'English', }, }; /** * Popup 内使用的 i18n composable */ export function useI18n() { const uiLang = ref('zh-CN'); // 中文备注:从本地存储恢复用户上次选择 onMounted(async () => { try { if (typeof chrome === 'undefined' || !chrome.storage?.local) return; const res = await chrome.storage.local.get(POPUP_UI_LANG_KEY); const stored = res?.[POPUP_UI_LANG_KEY]; if (stored === 'zh-CN' || stored === 'en') { uiLang.value = stored; } } catch { // ignore } }); const t = computed(() => { return (key: string) => { return DICT[uiLang.value]?.[key] ?? DICT.en[key] ?? key; }; }); /** * 设置语言并持久化 */ async function setUiLang(lang: PopupUiLang) { uiLang.value = lang; try { if (typeof chrome === 'undefined' || !chrome.storage?.local) return; await chrome.storage.local.set({[POPUP_UI_LANG_KEY]: lang}); } catch { // ignore } } return { uiLang, t: t.value, setUiLang, // 中文备注:给 template 直接使用的语言选项 langOptions: [ {value: 'zh-CN' as const, labelKey: 'lang_zh'}, {value: 'en' as const, labelKey: 'lang_en'}, ], }; }