diff --git a/src/config/i18n.js b/src/config/i18n.js index f41e5f0..81613a3 100644 --- a/src/config/i18n.js +++ b/src/config/i18n.js @@ -149,8 +149,8 @@ export const I18N = { en: `Multiple URLs can be separated by English commas ","`, }, selector_helper: { - zh: `遵循CSS选择器规则,但不同浏览器,有些不同的写法。`, - en: `Follow the CSS selector rules, but different browsers have some different ways of writing.`, + zh: `1、遵循CSS选择器规则,但不同浏览器,支持写法不尽相同。2、留空表示采用全局设置。`, + en: `1. Follow CSS selector rules, but different browsers support different writing methods. 2. Leave blank to adopt the global setting.`, }, translate_switch: { zh: `开启翻译`, diff --git a/src/config/index.js b/src/config/index.js index 58b92f2..2cc85eb 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -10,6 +10,8 @@ export const STOKEY_SETTING = `${APP_NAME}_setting`; export const STOKEY_RULES = `${APP_NAME}_rules`; export const STOKEY_SYNC = `${APP_NAME}_sync`; +export const GLOBAL_KEY = "*"; + export const CLIENT_WEB = "web"; export const CLIENT_CHROME = "chrome"; export const CLIENT_EDGE = "edge"; @@ -125,14 +127,26 @@ export const DEFAULT_FETCH_INTERVAL = 100; // 默认任务间隔时间 export const PROMPT_PLACE_FROM = "{{from}}"; // 占位符 export const PROMPT_PLACE_TO = "{{to}}"; // 占位符 -export const DEFAULT_RULE = { +// 全局规则 +export const GLOBLA_RULE = { pattern: "*", selector: DEFAULT_SELECTOR, translator: OPT_TRANS_MICROSOFT, fromLang: "auto", toLang: "zh-CN", textStyle: OPT_STYLE_DASHLINE, - transOpen: false, + transOpen: "false", +}; + +// 默认规则 +export const DEFAULT_RULE = { + pattern: "", + selector: "", + translator: GLOBAL_KEY, + fromLang: GLOBAL_KEY, + toLang: GLOBAL_KEY, + textStyle: GLOBAL_KEY, + transOpen: GLOBAL_KEY, }; export const DEFAULT_SETTING = { @@ -152,9 +166,9 @@ export const DEFAULT_RULES = [ ...RULES.map((item) => ({ ...DEFAULT_RULE, ...item, - transOpen: true, + transOpen: "true", })), - DEFAULT_RULE, + GLOBLA_RULE, ]; export const TRANS_MIN_LENGTH = 5; // 最短翻译长度 diff --git a/src/hooks/Rules.js b/src/hooks/Rules.js index 8fb77da..480a12f 100644 --- a/src/hooks/Rules.js +++ b/src/hooks/Rules.js @@ -4,6 +4,7 @@ import { OPT_STYLE_ALL, OPT_LANGS_FROM, OPT_LANGS_TO, + GLOBAL_KEY, } from "../config"; import storage from "../libs/storage"; import { useStorages } from "./Storage"; @@ -67,13 +68,7 @@ export function useRules() { const fromLangs = OPT_LANGS_FROM.map((item) => item[0]); const toLangs = OPT_LANGS_TO.map((item) => item[0]); newRules - .filter( - ({ pattern, selector }) => - pattern && - selector && - typeof pattern === "string" && - typeof selector === "string" - ) + .filter(({ pattern }) => pattern && typeof pattern === "string") .map( ({ pattern, @@ -85,12 +80,12 @@ export function useRules() { transOpen, }) => ({ pattern, - selector, - translator: matchValue(OPT_TRANS_ALL, translator), - fromLang: matchValue(fromLangs, fromLang), - toLang: matchValue(toLangs, toLang), - textStyle: matchValue(OPT_STYLE_ALL, textStyle), - transOpen: matchValue([true, false], transOpen), + selector: typeof selector === "string" ? selector : "", + translator: matchValue([GLOBAL_KEY, ...OPT_TRANS_ALL], translator), + fromLang: matchValue([GLOBAL_KEY, ...fromLangs], fromLang), + toLang: matchValue([GLOBAL_KEY, ...toLangs], toLang), + textStyle: matchValue([GLOBAL_KEY, ...OPT_STYLE_ALL], textStyle), + transOpen: matchValue([GLOBAL_KEY, "true", "false"], transOpen), }) ) .forEach((newRule) => { diff --git a/src/libs/browser.js b/src/libs/browser.js index c8ea7a6..bfb0fd0 100644 --- a/src/libs/browser.js +++ b/src/libs/browser.js @@ -8,7 +8,7 @@ function _browser() { try { return require("webextension-polyfill"); } catch (err) { - console.log("[browser]", err.message); + // console.log("[browser]", err.message); } } diff --git a/src/libs/index.js b/src/libs/index.js index 5c9f01b..a6a5cd9 100644 --- a/src/libs/index.js +++ b/src/libs/index.js @@ -3,7 +3,8 @@ import { DEFAULT_SETTING, STOKEY_SETTING, STOKEY_RULES, - DEFAULT_RULE, + GLOBLA_RULE, + GLOBAL_KEY, } from "../config"; import { browser } from "./browser"; @@ -38,12 +39,31 @@ export const getRules = async () => (await storage.getObj(STOKEY_RULES)) || []; * @param {string} href * @returns */ -export const matchRule = (rules, href) => - rules.find((rule) => +export const matchRule = (rules, href) => { + const rule = rules.find((rule) => rule.pattern .split(",") .some((p) => p.trim() === "*" || href.includes(p.trim())) - ) || DEFAULT_RULE; + ); + + if (!rule) { + return GLOBLA_RULE; + } + + if (!rule?.selector?.trim()) { + rule.selector = GLOBLA_RULE.selector; + } + + ["translator", "fromLang", "toLang", "textStyle", "transOpen"].forEach( + (key) => { + if (rule[key] === GLOBAL_KEY) { + rule[key] = GLOBLA_RULE[key]; + } + } + ); + + return rule; +}; /** * 本地语言识别 diff --git a/src/libs/translator.js b/src/libs/translator.js index ed61249..cf3dfd9 100644 --- a/src/libs/translator.js +++ b/src/libs/translator.js @@ -40,7 +40,7 @@ export class Translator { constructor(rule) { this._rule = rule; - if (rule.transOpen) { + if (rule.transOpen === "true") { this._register(); } } @@ -54,11 +54,11 @@ export class Translator { }; toggle = () => { - if (this._rule.transOpen) { - this._rule.transOpen = false; + if (this._rule.transOpen === "true") { + this._rule.transOpen = "false"; this._unRegister(); } else { - this._rule.transOpen = true; + this._rule.transOpen = "true"; this._register(); } }; diff --git a/src/views/Options/Rules.js b/src/views/Options/Rules.js index 19bef3f..5c706e7 100644 --- a/src/views/Options/Rules.js +++ b/src/views/Options/Rules.js @@ -3,6 +3,7 @@ import Stack from "@mui/material/Stack"; import TextField from "@mui/material/TextField"; import Button from "@mui/material/Button"; import { + GLOBAL_KEY, DEFAULT_RULE, OPT_LANGS_FROM, OPT_LANGS_TO, @@ -23,11 +24,7 @@ import FileDownloadIcon from "@mui/icons-material/FileDownload"; import FileUploadIcon from "@mui/icons-material/FileUpload"; function RuleFields({ rule, rules, setShow }) { - const initFormValues = rule || { - ...DEFAULT_RULE, - pattern: "", - transOpen: true, - }; + const initFormValues = rule || DEFAULT_RULE; const editMode = !!rule; const i18n = useI18n(); @@ -82,9 +79,9 @@ function RuleFields({ rule, rules, setShow }) { if (!pattern.trim()) { errors.pattern = i18n("error_cant_be_blank"); } - if (!selector.trim()) { - errors.selector = i18n("error_cant_be_blank"); - } + // if (!selector.trim()) { + // errors.selector = i18n("error_cant_be_blank"); + // } if (hasSamePattern(pattern)) { errors.pattern = i18n("error_duplicate_values"); } @@ -105,6 +102,12 @@ function RuleFields({ rule, rules, setShow }) { } }; + const globalItem = rule?.pattern !== "*" && ( + + ); + return (