diff --git a/src/config/i18n.js b/src/config/i18n.js index 9db49cc..a0cfe85 100644 --- a/src/config/i18n.js +++ b/src/config/i18n.js @@ -577,6 +577,14 @@ export const I18N = { }, shortcut_press_count: { zh: `快捷键连击次数`, - en: `Shortcut Press Nunber`, + en: `Shortcut Press Number`, + }, + input_trans_start_sign: { + zh: `翻译起始标识`, + en: `Translation Start Sign`, + }, + input_trans_start_sign_help: { + zh: `标识后面可以加目标语言代码,如: “/en 你好”、“/zh hello”`, + en: `The target language code can be added after the sign, such as: "/en 你好", "/zh hello"`, }, }; diff --git a/src/config/index.js b/src/config/index.js index a4cd3ed..a748525 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -137,6 +137,7 @@ export const OPT_LANGS_SPECIAL = { ), [OPT_TRANS_CUSTOMIZE]: new Map([["auto", ""]]), }; +export const OPT_LANGS_LIST = OPT_LANGS_TO.map(([lang]) => lang); export const OPT_STYLE_NONE = "style_none"; // 无 export const OPT_STYLE_LINE = "under_line"; // 下划线 @@ -200,6 +201,7 @@ export const GLOBLA_RULE = { }; // 输入框翻译 +export const OPT_INPUT_TRANS_SIGNS = ["/", "//", "\\", "\\\\", ">", ">>"]; export const DEFAULT_INPUT_SHORTCUT = ["Alt", "i"]; export const DEFAULT_INPUT_RULE = { transOpen: true, @@ -208,6 +210,7 @@ export const DEFAULT_INPUT_RULE = { toLang: "en", triggerShortcut: DEFAULT_INPUT_SHORTCUT, triggerCount: 1, + transSign: OPT_INPUT_TRANS_SIGNS[0], }; // 订阅列表 diff --git a/src/libs/translator.js b/src/libs/translator.js index 59ffddf..e7846d9 100644 --- a/src/libs/translator.js +++ b/src/libs/translator.js @@ -12,10 +12,11 @@ import { DEFAULT_INPUT_RULE, DEFAULT_TRANS_APIS, DEFAULT_INPUT_SHORTCUT, + OPT_LANGS_LIST, } from "../config"; import Content from "../views/Content"; import { updateFetchPool, clearFetchPool } from "./fetch"; -import { debounce, genEventName, removeEndchar } from "./utils"; +import { debounce, genEventName, removeEndchar, matchInputStr } from "./utils"; import { stepShortcutRegister } from "./shortcut"; import { apiTranslate } from "../apis"; import { tryDetectLang } from "."; @@ -265,6 +266,7 @@ export class Translator { toLang, triggerCount, selector, + transSign, } = this._inputRule; const apiSetting = (this._setting.transApis || DEFAULT_TRANS_APIS)[ translator @@ -298,6 +300,22 @@ export class Translator { return; } + if (transSign) { + const res = matchInputStr(text, transSign); + if (res) { + let lang = res[1]; + if (lang === "zh" || lang === "cn") { + lang = "zh-CN"; + } else if (lang === "tw" || lang === "hk") { + lang = "zh-TW"; + } + if (lang && OPT_LANGS_LIST.includes(lang)) { + toLang = lang; + } + text = res[2]; + } + } + // console.log("input -->", text); try { diff --git a/src/libs/utils.js b/src/libs/utils.js index 94bd318..efdb1d8 100644 --- a/src/libs/utils.js +++ b/src/libs/utils.js @@ -194,3 +194,32 @@ export const removeEndchar = (s, c, count = 1) => { } return s.slice(0, i); }; + +/** + * 匹配字符串及语言标识 + * @param {*} str + * @param {*} sign + * @returns + */ +export const matchInputStr = (str, sign) => { + let reg = /\/([\w-]+)\s+([^]+)/; + switch (sign) { + case "//": + reg = /\/\/([\w-]+)\s+([^]+)/; + break; + case "\\": + reg = /\\([\w-]+)\s+([^]+)/; + break; + case "\\\\": + reg = /\\\\([\w-]+)\s+([^]+)/; + break; + case ">": + reg = />([\w-]+)\s+([^]+)/; + break; + case ">>": + reg = />>([\w-]+)\s+([^]+)/; + break; + default: + } + return str.match(reg); +}; diff --git a/src/views/Options/InputSetting.js b/src/views/Options/InputSetting.js index 76392d4..1c9a31a 100644 --- a/src/views/Options/InputSetting.js +++ b/src/views/Options/InputSetting.js @@ -2,9 +2,13 @@ import Box from "@mui/material/Box"; import Stack from "@mui/material/Stack"; import TextField from "@mui/material/TextField"; import MenuItem from "@mui/material/MenuItem"; -import { limitNumber } from "../../libs/utils"; import { useI18n } from "../../hooks/I18n"; -import { OPT_TRANS_ALL, OPT_LANGS_FROM, OPT_LANGS_TO } from "../../config"; +import { + OPT_TRANS_ALL, + OPT_LANGS_FROM, + OPT_LANGS_TO, + OPT_INPUT_TRANS_SIGNS, +} from "../../config"; import ShortcutInput from "./ShortcutInput"; import FormControlLabel from "@mui/material/FormControlLabel"; import Switch from "@mui/material/Switch"; @@ -20,13 +24,12 @@ export default function InputSetting() { const handleChange = (e) => { e.preventDefault(); let { name, value } = e.target; - console.log({ name, value }); - switch (name) { - case "triggerCount": - value = limitNumber(value, 1, 3); - break; - default: - } + // switch (name) { + // case "triggerCount": + // value = limitNumber(value, 1, 5); + // break; + // default: + // } updateInputRule({ [name]: value, }); @@ -46,6 +49,7 @@ export default function InputSetting() { toLang, triggerShortcut, triggerCount, + transSign, } = inputRule; return ( @@ -112,6 +116,23 @@ export default function InputSetting() { ))} + + {i18n("style_none")} + {OPT_INPUT_TRANS_SIGNS.map((item) => ( + + {item} + + ))} + +