can set global value to rules
This commit is contained in:
@@ -149,8 +149,8 @@ export const I18N = {
|
|||||||
en: `Multiple URLs can be separated by English commas ","`,
|
en: `Multiple URLs can be separated by English commas ","`,
|
||||||
},
|
},
|
||||||
selector_helper: {
|
selector_helper: {
|
||||||
zh: `遵循CSS选择器规则,但不同浏览器,有些不同的写法。`,
|
zh: `1、遵循CSS选择器规则,但不同浏览器,支持写法不尽相同。2、留空表示采用全局设置。`,
|
||||||
en: `Follow the CSS selector rules, but different browsers have some different ways of writing.`,
|
en: `1. Follow CSS selector rules, but different browsers support different writing methods. 2. Leave blank to adopt the global setting.`,
|
||||||
},
|
},
|
||||||
translate_switch: {
|
translate_switch: {
|
||||||
zh: `开启翻译`,
|
zh: `开启翻译`,
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ export const STOKEY_SETTING = `${APP_NAME}_setting`;
|
|||||||
export const STOKEY_RULES = `${APP_NAME}_rules`;
|
export const STOKEY_RULES = `${APP_NAME}_rules`;
|
||||||
export const STOKEY_SYNC = `${APP_NAME}_sync`;
|
export const STOKEY_SYNC = `${APP_NAME}_sync`;
|
||||||
|
|
||||||
|
export const GLOBAL_KEY = "*";
|
||||||
|
|
||||||
export const CLIENT_WEB = "web";
|
export const CLIENT_WEB = "web";
|
||||||
export const CLIENT_CHROME = "chrome";
|
export const CLIENT_CHROME = "chrome";
|
||||||
export const CLIENT_EDGE = "edge";
|
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_FROM = "{{from}}"; // 占位符
|
||||||
export const PROMPT_PLACE_TO = "{{to}}"; // 占位符
|
export const PROMPT_PLACE_TO = "{{to}}"; // 占位符
|
||||||
|
|
||||||
export const DEFAULT_RULE = {
|
// 全局规则
|
||||||
|
export const GLOBLA_RULE = {
|
||||||
pattern: "*",
|
pattern: "*",
|
||||||
selector: DEFAULT_SELECTOR,
|
selector: DEFAULT_SELECTOR,
|
||||||
translator: OPT_TRANS_MICROSOFT,
|
translator: OPT_TRANS_MICROSOFT,
|
||||||
fromLang: "auto",
|
fromLang: "auto",
|
||||||
toLang: "zh-CN",
|
toLang: "zh-CN",
|
||||||
textStyle: OPT_STYLE_DASHLINE,
|
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 = {
|
export const DEFAULT_SETTING = {
|
||||||
@@ -152,9 +166,9 @@ export const DEFAULT_RULES = [
|
|||||||
...RULES.map((item) => ({
|
...RULES.map((item) => ({
|
||||||
...DEFAULT_RULE,
|
...DEFAULT_RULE,
|
||||||
...item,
|
...item,
|
||||||
transOpen: true,
|
transOpen: "true",
|
||||||
})),
|
})),
|
||||||
DEFAULT_RULE,
|
GLOBLA_RULE,
|
||||||
];
|
];
|
||||||
|
|
||||||
export const TRANS_MIN_LENGTH = 5; // 最短翻译长度
|
export const TRANS_MIN_LENGTH = 5; // 最短翻译长度
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {
|
|||||||
OPT_STYLE_ALL,
|
OPT_STYLE_ALL,
|
||||||
OPT_LANGS_FROM,
|
OPT_LANGS_FROM,
|
||||||
OPT_LANGS_TO,
|
OPT_LANGS_TO,
|
||||||
|
GLOBAL_KEY,
|
||||||
} from "../config";
|
} from "../config";
|
||||||
import storage from "../libs/storage";
|
import storage from "../libs/storage";
|
||||||
import { useStorages } from "./Storage";
|
import { useStorages } from "./Storage";
|
||||||
@@ -67,13 +68,7 @@ export function useRules() {
|
|||||||
const fromLangs = OPT_LANGS_FROM.map((item) => item[0]);
|
const fromLangs = OPT_LANGS_FROM.map((item) => item[0]);
|
||||||
const toLangs = OPT_LANGS_TO.map((item) => item[0]);
|
const toLangs = OPT_LANGS_TO.map((item) => item[0]);
|
||||||
newRules
|
newRules
|
||||||
.filter(
|
.filter(({ pattern }) => pattern && typeof pattern === "string")
|
||||||
({ pattern, selector }) =>
|
|
||||||
pattern &&
|
|
||||||
selector &&
|
|
||||||
typeof pattern === "string" &&
|
|
||||||
typeof selector === "string"
|
|
||||||
)
|
|
||||||
.map(
|
.map(
|
||||||
({
|
({
|
||||||
pattern,
|
pattern,
|
||||||
@@ -85,12 +80,12 @@ export function useRules() {
|
|||||||
transOpen,
|
transOpen,
|
||||||
}) => ({
|
}) => ({
|
||||||
pattern,
|
pattern,
|
||||||
selector,
|
selector: typeof selector === "string" ? selector : "",
|
||||||
translator: matchValue(OPT_TRANS_ALL, translator),
|
translator: matchValue([GLOBAL_KEY, ...OPT_TRANS_ALL], translator),
|
||||||
fromLang: matchValue(fromLangs, fromLang),
|
fromLang: matchValue([GLOBAL_KEY, ...fromLangs], fromLang),
|
||||||
toLang: matchValue(toLangs, toLang),
|
toLang: matchValue([GLOBAL_KEY, ...toLangs], toLang),
|
||||||
textStyle: matchValue(OPT_STYLE_ALL, textStyle),
|
textStyle: matchValue([GLOBAL_KEY, ...OPT_STYLE_ALL], textStyle),
|
||||||
transOpen: matchValue([true, false], transOpen),
|
transOpen: matchValue([GLOBAL_KEY, "true", "false"], transOpen),
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
.forEach((newRule) => {
|
.forEach((newRule) => {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ function _browser() {
|
|||||||
try {
|
try {
|
||||||
return require("webextension-polyfill");
|
return require("webextension-polyfill");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log("[browser]", err.message);
|
// console.log("[browser]", err.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ import {
|
|||||||
DEFAULT_SETTING,
|
DEFAULT_SETTING,
|
||||||
STOKEY_SETTING,
|
STOKEY_SETTING,
|
||||||
STOKEY_RULES,
|
STOKEY_RULES,
|
||||||
DEFAULT_RULE,
|
GLOBLA_RULE,
|
||||||
|
GLOBAL_KEY,
|
||||||
} from "../config";
|
} from "../config";
|
||||||
import { browser } from "./browser";
|
import { browser } from "./browser";
|
||||||
|
|
||||||
@@ -38,12 +39,31 @@ export const getRules = async () => (await storage.getObj(STOKEY_RULES)) || [];
|
|||||||
* @param {string} href
|
* @param {string} href
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export const matchRule = (rules, href) =>
|
export const matchRule = (rules, href) => {
|
||||||
rules.find((rule) =>
|
const rule = rules.find((rule) =>
|
||||||
rule.pattern
|
rule.pattern
|
||||||
.split(",")
|
.split(",")
|
||||||
.some((p) => p.trim() === "*" || href.includes(p.trim()))
|
.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;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 本地语言识别
|
* 本地语言识别
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ export class Translator {
|
|||||||
|
|
||||||
constructor(rule) {
|
constructor(rule) {
|
||||||
this._rule = rule;
|
this._rule = rule;
|
||||||
if (rule.transOpen) {
|
if (rule.transOpen === "true") {
|
||||||
this._register();
|
this._register();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -54,11 +54,11 @@ export class Translator {
|
|||||||
};
|
};
|
||||||
|
|
||||||
toggle = () => {
|
toggle = () => {
|
||||||
if (this._rule.transOpen) {
|
if (this._rule.transOpen === "true") {
|
||||||
this._rule.transOpen = false;
|
this._rule.transOpen = "false";
|
||||||
this._unRegister();
|
this._unRegister();
|
||||||
} else {
|
} else {
|
||||||
this._rule.transOpen = true;
|
this._rule.transOpen = "true";
|
||||||
this._register();
|
this._register();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import Stack from "@mui/material/Stack";
|
|||||||
import TextField from "@mui/material/TextField";
|
import TextField from "@mui/material/TextField";
|
||||||
import Button from "@mui/material/Button";
|
import Button from "@mui/material/Button";
|
||||||
import {
|
import {
|
||||||
|
GLOBAL_KEY,
|
||||||
DEFAULT_RULE,
|
DEFAULT_RULE,
|
||||||
OPT_LANGS_FROM,
|
OPT_LANGS_FROM,
|
||||||
OPT_LANGS_TO,
|
OPT_LANGS_TO,
|
||||||
@@ -23,11 +24,7 @@ import FileDownloadIcon from "@mui/icons-material/FileDownload";
|
|||||||
import FileUploadIcon from "@mui/icons-material/FileUpload";
|
import FileUploadIcon from "@mui/icons-material/FileUpload";
|
||||||
|
|
||||||
function RuleFields({ rule, rules, setShow }) {
|
function RuleFields({ rule, rules, setShow }) {
|
||||||
const initFormValues = rule || {
|
const initFormValues = rule || DEFAULT_RULE;
|
||||||
...DEFAULT_RULE,
|
|
||||||
pattern: "",
|
|
||||||
transOpen: true,
|
|
||||||
};
|
|
||||||
const editMode = !!rule;
|
const editMode = !!rule;
|
||||||
|
|
||||||
const i18n = useI18n();
|
const i18n = useI18n();
|
||||||
@@ -82,9 +79,9 @@ function RuleFields({ rule, rules, setShow }) {
|
|||||||
if (!pattern.trim()) {
|
if (!pattern.trim()) {
|
||||||
errors.pattern = i18n("error_cant_be_blank");
|
errors.pattern = i18n("error_cant_be_blank");
|
||||||
}
|
}
|
||||||
if (!selector.trim()) {
|
// if (!selector.trim()) {
|
||||||
errors.selector = i18n("error_cant_be_blank");
|
// errors.selector = i18n("error_cant_be_blank");
|
||||||
}
|
// }
|
||||||
if (hasSamePattern(pattern)) {
|
if (hasSamePattern(pattern)) {
|
||||||
errors.pattern = i18n("error_duplicate_values");
|
errors.pattern = i18n("error_duplicate_values");
|
||||||
}
|
}
|
||||||
@@ -105,6 +102,12 @@ function RuleFields({ rule, rules, setShow }) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const globalItem = rule?.pattern !== "*" && (
|
||||||
|
<MenuItem key={GLOBAL_KEY} value={GLOBAL_KEY}>
|
||||||
|
{GLOBAL_KEY}
|
||||||
|
</MenuItem>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form onSubmit={handleSubmit}>
|
<form onSubmit={handleSubmit}>
|
||||||
<Stack spacing={2}>
|
<Stack spacing={2}>
|
||||||
@@ -147,8 +150,9 @@ function RuleFields({ rule, rules, setShow }) {
|
|||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
>
|
>
|
||||||
<MenuItem value={true}>{i18n("default_enabled")}</MenuItem>
|
{globalItem}
|
||||||
<MenuItem value={false}>{i18n("default_disabled")}</MenuItem>
|
<MenuItem value={"true"}>{i18n("default_enabled")}</MenuItem>
|
||||||
|
<MenuItem value={"false"}>{i18n("default_disabled")}</MenuItem>
|
||||||
</TextField>
|
</TextField>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid item xs={10} md={4}>
|
<Grid item xs={10} md={4}>
|
||||||
@@ -162,6 +166,7 @@ function RuleFields({ rule, rules, setShow }) {
|
|||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
>
|
>
|
||||||
|
{globalItem}
|
||||||
{OPT_TRANS_ALL.map((item) => (
|
{OPT_TRANS_ALL.map((item) => (
|
||||||
<MenuItem key={item} value={item}>
|
<MenuItem key={item} value={item}>
|
||||||
{item}
|
{item}
|
||||||
@@ -180,8 +185,11 @@ function RuleFields({ rule, rules, setShow }) {
|
|||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
>
|
>
|
||||||
|
{globalItem}
|
||||||
{OPT_LANGS_FROM.map(([lang, name]) => (
|
{OPT_LANGS_FROM.map(([lang, name]) => (
|
||||||
<MenuItem key={lang} value={lang}>{name}</MenuItem>
|
<MenuItem key={lang} value={lang}>
|
||||||
|
{name}
|
||||||
|
</MenuItem>
|
||||||
))}
|
))}
|
||||||
</TextField>
|
</TextField>
|
||||||
</Grid>
|
</Grid>
|
||||||
@@ -196,8 +204,11 @@ function RuleFields({ rule, rules, setShow }) {
|
|||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
>
|
>
|
||||||
|
{globalItem}
|
||||||
{OPT_LANGS_TO.map(([lang, name]) => (
|
{OPT_LANGS_TO.map(([lang, name]) => (
|
||||||
<MenuItem key={lang} value={lang}>{name}</MenuItem>
|
<MenuItem key={lang} value={lang}>
|
||||||
|
{name}
|
||||||
|
</MenuItem>
|
||||||
))}
|
))}
|
||||||
</TextField>
|
</TextField>
|
||||||
</Grid>
|
</Grid>
|
||||||
@@ -212,8 +223,11 @@ function RuleFields({ rule, rules, setShow }) {
|
|||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
>
|
>
|
||||||
|
{globalItem}
|
||||||
{OPT_STYLE_ALL.map((item) => (
|
{OPT_STYLE_ALL.map((item) => (
|
||||||
<MenuItem key={item} value={item}>{i18n(item)}</MenuItem>
|
<MenuItem key={item} value={item}>
|
||||||
|
{i18n(item)}
|
||||||
|
</MenuItem>
|
||||||
))}
|
))}
|
||||||
</TextField>
|
</TextField>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ export default function Popup() {
|
|||||||
|
|
||||||
const handleTransToggle = async (e) => {
|
const handleTransToggle = async (e) => {
|
||||||
try {
|
try {
|
||||||
setRule({ ...rule, transOpen: e.target.checked });
|
setRule({ ...rule, transOpen: e.target.checked ? "true" : "false" });
|
||||||
|
|
||||||
if (isExt) {
|
if (isExt) {
|
||||||
await sendTabMsg(MSG_TRANS_TOGGLE);
|
await sendTabMsg(MSG_TRANS_TOGGLE);
|
||||||
@@ -83,7 +83,7 @@ export default function Popup() {
|
|||||||
setRule(args);
|
setRule(args);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// console.log(`[popup] kissEvent action skip: ${action}`);
|
// console.log(`[popup] kissEvent action skip: ${action}`);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -131,7 +131,12 @@ export default function Popup() {
|
|||||||
<Box minWidth={300} sx={{ p: 2 }}>
|
<Box minWidth={300} sx={{ p: 2 }}>
|
||||||
<Stack spacing={2}>
|
<Stack spacing={2}>
|
||||||
<FormControlLabel
|
<FormControlLabel
|
||||||
control={<Switch checked={transOpen} onChange={handleTransToggle} />}
|
control={
|
||||||
|
<Switch
|
||||||
|
checked={transOpen === "true"}
|
||||||
|
onChange={handleTransToggle}
|
||||||
|
/>
|
||||||
|
}
|
||||||
label={i18n("translate")}
|
label={i18n("translate")}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user