Compare commits

...

10 Commits

Author SHA1 Message Date
Gabe Yuan
5c5a35d3bb v1.6.6 2023-09-03 21:47:38 +08:00
Gabe Yuan
2c24214f48 fix Violentmonkey --> .connect 2023-09-03 21:45:06 +08:00
Gabe Yuan
67d9e70b3c v1,6,5 2023-09-03 21:10:35 +08:00
Gabe Yuan
000a55f43b modify content.html 2023-09-03 21:08:45 +08:00
Gabe Yuan
4096a6976c add clear cache & api test button 2023-09-03 13:11:04 +08:00
Gabe Yuan
df4c4ebd50 fix i18n text 2023-09-03 00:26:57 +08:00
Gabe Yuan
b43bd4e0e2 add deepl @connect 2023-09-03 00:10:07 +08:00
Gabe Yuan
2660dbf866 update readme 2023-09-02 23:45:40 +08:00
Gabe Yuan
e0b7c60099 v1.6.4 2023-09-02 20:07:24 +08:00
Gabe Yuan
536b58bf67 fix fuzzy style hover bug 2023-09-02 19:55:26 +08:00
14 changed files with 211 additions and 39 deletions

2
.env
View File

@@ -2,7 +2,7 @@ GENERATE_SOURCEMAP=false
REACT_APP_NAME=KISS Translator REACT_APP_NAME=KISS Translator
REACT_APP_NAME_CN=简约翻译 REACT_APP_NAME_CN=简约翻译
REACT_APP_VERSION=1.6.3 REACT_APP_VERSION=1.6.6
REACT_APP_HOMEPAGE=https://github.com/fishjar/kiss-translator REACT_APP_HOMEPAGE=https://github.com/fishjar/kiss-translator

View File

@@ -18,6 +18,12 @@ If you also like a little more simplicity, welcome to pick it up.
- Keep it simple, smart - Keep it simple, smart
## Shortcut keys
- `Alt+Q` Toggle Translation
- `Alt+C` Toggle Styles
- `Alt+K` Open Menu
## Schedule ## Schedule
- [x] Provide trial installation package - [x] Provide trial installation package
@@ -30,8 +36,8 @@ If you also like a little more simplicity, welcome to pick it up.
- [x] Support translation services - [x] Support translation services
- [x] Google - [x] Google
- [x] Microsoft - [x] Microsoft
- [x] OpenAI
- [x] DeepL - [x] DeepL
- [x] OpenAI
- [x] Upload to app Store - [x] Upload to app Store
- [x] Chrome [Install Link](https://chrome.google.com/webstore/detail/kiss-translator/bdiifdefkgmcblbcghdlonllpjhhjgof) - [x] Chrome [Install Link](https://chrome.google.com/webstore/detail/kiss-translator/bdiifdefkgmcblbcghdlonllpjhhjgof)
- [x] Edge [Install Link](https://microsoftedge.microsoft.com/addons/detail/kiss-translator/jemckldkclkinpjighnoilpbldbdmmlh) - [x] Edge [Install Link](https://microsoftedge.microsoft.com/addons/detail/kiss-translator/jemckldkclkinpjighnoilpbldbdmmlh)

View File

@@ -18,6 +18,12 @@
- 保持简约 - 保持简约
## 快捷键
- `Alt+Q` 开启翻译
- `Alt+C` 切换样式
- `Alt+K` 打开菜单
## 进度 ## 进度
- [x] 提供试用安装包 - [x] 提供试用安装包
@@ -30,8 +36,8 @@
- [x] 支持翻译服务 - [x] 支持翻译服务
- [x] Google - [x] Google
- [x] Microsoft - [x] Microsoft
- [x] OpenAI
- [x] DeepL - [x] DeepL
- [x] OpenAI
- [x] 上架应用市场 - [x] 上架应用市场
- [x] Chrome [安装地址](https://chrome.google.com/webstore/detail/kiss-translator/bdiifdefkgmcblbcghdlonllpjhhjgof?hl=zh-CN) - [x] Chrome [安装地址](https://chrome.google.com/webstore/detail/kiss-translator/bdiifdefkgmcblbcghdlonllpjhhjgof?hl=zh-CN)
- [x] Edge [安装地址](https://microsoftedge.microsoft.com/addons/detail/%E7%AE%80%E7%BA%A6%E7%BF%BB%E8%AF%91/jemckldkclkinpjighnoilpbldbdmmlh?hl=zh-CN) - [x] Edge [安装地址](https://microsoftedge.microsoft.com/addons/detail/%E7%AE%80%E7%BA%A6%E7%BF%BB%E8%AF%91/jemckldkclkinpjighnoilpbldbdmmlh?hl=zh-CN)

View File

@@ -93,6 +93,8 @@ const userscriptWebpack = (config, env) => {
// @connect translate.googleapis.com // @connect translate.googleapis.com
// @connect api-edge.cognitive.microsofttranslator.com // @connect api-edge.cognitive.microsofttranslator.com
// @connect edge.microsoft.com // @connect edge.microsoft.com
// @connect api-free.deepl.com
// @connect api.deepl.com
// @connect api.openai.com // @connect api.openai.com
// @connect openai.azure.com // @connect openai.azure.com
// @connect workers.dev // @connect workers.dev
@@ -100,6 +102,7 @@ const userscriptWebpack = (config, env) => {
// @connect githubusercontent.com // @connect githubusercontent.com
// @connect kiss-translator.rayjar.com // @connect kiss-translator.rayjar.com
// @connect ghproxy.com // @connect ghproxy.com
// @connect localhost:3000
// @run-at document-end // @run-at document-end
// ==/UserScript== // ==/UserScript==

View File

@@ -1,7 +1,7 @@
{ {
"name": "kiss-translator", "name": "kiss-translator",
"description": "A minimalist bilingual translation Extension & Greasemonkey Script", "description": "A minimalist bilingual translation Extension & Greasemonkey Script",
"version": "1.6.3", "version": "1.6.6",
"author": "Gabe<yugang2002@gmail.com>", "author": "Gabe<yugang2002@gmail.com>",
"private": true, "private": true,
"dependencies": { "dependencies": {

View File

@@ -64,8 +64,25 @@
<body> <body>
<noscript>You need to enable JavaScript to run this app.</noscript> <noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"> <div id="root">
<div id="content">
<p>You need to enable JavaScript to run <span>this app.</span></p>
The <span>embargo</span> has just lifted to confirm that AmpereOne is
coming to Google Cloud with the C3A instances.
<br />
But these upcoming instances for now are only in private preview form.
<br />
<br />
Needless to say I also haven't had any AmpereOne access to check out the
performance and power efficiency of these new Arm server processors from
Ampere Computing.
<br />
</div>
<h2> <h2>
<p><span>React is a JavaScript library for building user interfaces.</span></p> <p>
<span
>React is a JavaScript library for building user interfaces.</span
>
</p>
</h2> </h2>
<div id="addtitle"></div> <div id="addtitle"></div>
<h2>Shadow 1</h2> <h2>Shadow 1</h2>

View File

@@ -2,7 +2,7 @@
"manifest_version": 2, "manifest_version": 2,
"name": "__MSG_app_name__", "name": "__MSG_app_name__",
"description": "__MSG_app_description__", "description": "__MSG_app_description__",
"version": "1.6.3", "version": "1.6.6",
"default_locale": "en", "default_locale": "en",
"author": "Gabe<yugang2002@gmail.com>", "author": "Gabe<yugang2002@gmail.com>",
"homepage_url": "https://github.com/fishjar/kiss-translator", "homepage_url": "https://github.com/fishjar/kiss-translator",

View File

@@ -2,7 +2,7 @@
"manifest_version": 3, "manifest_version": 3,
"name": "__MSG_app_name__", "name": "__MSG_app_name__",
"description": "__MSG_app_description__", "description": "__MSG_app_description__",
"version": "1.6.3", "version": "1.6.6",
"default_locale": "en", "default_locale": "en",
"author": "Gabe<yugang2002@gmail.com>", "author": "Gabe<yugang2002@gmail.com>",
"homepage_url": "https://github.com/fishjar/kiss-translator", "homepage_url": "https://github.com/fishjar/kiss-translator",

View File

@@ -284,9 +284,9 @@ export const I18N = {
zh: `OpenAI 提示词`, zh: `OpenAI 提示词`,
en: `OpenAI Prompt`, en: `OpenAI Prompt`,
}, },
clear_cache: { if_clear_cache: {
zh: `是否清除缓存`, zh: `是否清除缓存 (仅用于扩展)`,
en: `Whether clear cache`, en: `Whether clear cache (only for extension)`,
}, },
clear_cache_never: { clear_cache_never: {
zh: `不清除缓存`, zh: `不清除缓存`,
@@ -308,13 +308,13 @@ export const I18N = {
zh: `数据同步测试`, zh: `数据同步测试`,
en: `Data Sync Test`, en: `Data Sync Test`,
}, },
data_sync_success: { sync_success: {
zh: `数据同步成功!`, zh: `同步成功!`,
en: `Data Sync Success`, en: `Sync Success`,
}, },
data_sync_error: { sync_failed: {
zh: `数据同步失败!`, zh: `同步失败!`,
en: `Data Sync Error`, en: `Sync Error`,
}, },
error_got_some_wrong: { error_got_some_wrong: {
zh: `抱歉,出错了!`, zh: `抱歉,出错了!`,
@@ -324,4 +324,32 @@ export const I18N = {
zh: `您的同步设置未填写,无法在线分享。`, zh: `您的同步设置未填写,无法在线分享。`,
en: `Your sync settings are missing and cannot be shared online.`, en: `Your sync settings are missing and cannot be shared online.`,
}, },
click_test: {
zh: `点击测试`,
en: `Click Test`,
},
test_success: {
zh: `测试成功`,
en: `Test success`,
},
test_failed: {
zh: `测试失败`,
en: `Test failed`,
},
clear_all_cache_now: {
zh: `立即清除全部缓存`,
en: `Clear all cache now`,
},
clear_cache: {
zh: `清除缓存`,
en: `Clear Cache`,
},
clear_success: {
zh: `清除成功`,
en: `Clear success`,
},
clear_failed: {
zh: `清除失败`,
en: `Clear failed`,
},
}; };

View File

@@ -83,7 +83,9 @@ const fetchApi = async ({ input, init = {}, translator, token }) => {
} else { } else {
info = GM.info; info = GM.info;
} }
const connects = info?.script?.connects || []; // Tampermonkey --> .connects
// Violentmonkey --> .connect
const connects = info?.script?.connects || info?.script?.connect || [];
const url = new URL(input); const url = new URL(input);
const isSafe = connects.find((item) => url.hostname.endsWith(item)); const isSafe = connects.find((item) => url.hostname.endsWith(item));
if (isSafe) { if (isSafe) {

View File

@@ -17,6 +17,7 @@ import styled from "styled-components";
const LineSpan = styled.span` const LineSpan = styled.span`
opacity: 0.6; opacity: 0.6;
-webkit-opacity: 0.6;
text-decoration-line: underline; text-decoration-line: underline;
text-decoration-style: ${(props) => props.$lineStyle}; text-decoration-style: ${(props) => props.$lineStyle};
text-decoration-color: ${(props) => props.$lineColor}; text-decoration-color: ${(props) => props.$lineColor};
@@ -29,23 +30,22 @@ const LineSpan = styled.span`
-webkit-text-underline-offset: 0.3em; -webkit-text-underline-offset: 0.3em;
&:hover { &:hover {
opacity: 1; opacity: 1;
-webkit-opacity: 1;
} }
`; `;
const FuzzySpan = styled.span` const FuzzySpan = styled.span`
filter: blur(5px); filter: blur(5px);
transition: filter 0.2s ease-in-out; -webkit-filter: blur(5px);
&hover: { &:hover {
filter: none; filter: none;
-webkit-filter: none;
} }
`; `;
const HighlightSpan = styled.span` const HighlightSpan = styled.span`
color: #fff; color: #fff;
background-color: ${(props) => props.$bgColor}; background-color: ${(props) => props.$bgColor};
&hover: {
filter: none;
}
`; `;
const DiySpan = styled.span` const DiySpan = styled.span`

View File

@@ -6,14 +6,26 @@ import MenuItem from "@mui/material/MenuItem";
import FormControl from "@mui/material/FormControl"; import FormControl from "@mui/material/FormControl";
import Select from "@mui/material/Select"; import Select from "@mui/material/Select";
import Link from "@mui/material/Link"; import Link from "@mui/material/Link";
import FormHelperText from "@mui/material/FormHelperText";
import { useSetting } from "../../hooks/Setting"; import { useSetting } from "../../hooks/Setting";
import { limitNumber } from "../../libs/utils"; import { limitNumber } from "../../libs/utils";
import { useI18n } from "../../hooks/I18n"; import { useI18n } from "../../hooks/I18n";
import { UI_LANGS, URL_KISS_PROXY, TRANS_NEWLINE_LENGTH } from "../../config"; import { apiTranslate } from "../../apis";
import { useAlert } from "../../hooks/Alert";
import {
UI_LANGS,
URL_KISS_PROXY,
TRANS_NEWLINE_LENGTH,
CACHE_NAME,
OPT_TRANS_GOOGLE,
OPT_TRANS_DEEPL,
OPT_TRANS_OPENAI,
} from "../../config";
export default function Settings() { export default function Settings() {
const i18n = useI18n(); const i18n = useI18n();
const { setting, updateSetting } = useSetting(); const { setting, updateSetting } = useSetting();
const alert = useAlert();
const handleChange = (e) => { const handleChange = (e) => {
e.preventDefault(); e.preventDefault();
@@ -41,6 +53,33 @@ export default function Settings() {
}); });
}; };
const handleClearCache = () => {
try {
caches.delete(CACHE_NAME);
alert.success(i18n("clear_success"));
} catch (err) {
console.log("[clear cache]", err);
}
};
const handleApiTest = async (translator) => {
try {
const [text] = await apiTranslate({
translator,
q: "hello world",
fromLang: "en",
toLang: "zh-CN",
setting,
});
if (!text) {
throw new Error("empty reault");
}
alert.success(i18n("test_success"));
} catch (err) {
alert.error(`${i18n("test_failed")}: ${err.message}`);
}
};
const { const {
uiLang, uiLang,
googleUrl, googleUrl,
@@ -123,21 +162,41 @@ export default function Settings() {
/> />
<FormControl size="small"> <FormControl size="small">
<InputLabel>{i18n("clear_cache")}</InputLabel> <InputLabel>{i18n("if_clear_cache")}</InputLabel>
<Select <Select
name="clearCache" name="clearCache"
value={clearCache} value={clearCache}
label={i18n("clear_cache")} label={i18n("if_clear_cache")}
onChange={handleChange} onChange={handleChange}
> >
<MenuItem value={false}>{i18n("clear_cache_never")}</MenuItem> <MenuItem value={false}>{i18n("clear_cache_never")}</MenuItem>
<MenuItem value={true}>{i18n("clear_cache_restart")}</MenuItem> <MenuItem value={true}>{i18n("clear_cache_restart")}</MenuItem>
</Select> </Select>
<FormHelperText>
<Link component="button" onClick={handleClearCache}>
{i18n("clear_all_cache_now")}
</Link>
</FormHelperText>
</FormControl> </FormControl>
<TextField <TextField
size="small" size="small"
label={i18n("google_api")} label={
<>
{i18n("google_api")}
{googleUrl && (
<Link
sx={{ marginLeft: "1em" }}
component="button"
onClick={() => {
handleApiTest(OPT_TRANS_GOOGLE);
}}
>
{i18n("click_test")}
</Link>
)}
</>
}
name="googleUrl" name="googleUrl"
value={googleUrl} value={googleUrl}
onChange={handleChange} onChange={handleChange}
@@ -148,7 +207,22 @@ export default function Settings() {
<TextField <TextField
size="small" size="small"
label={i18n("deepl_api")} label={
<>
{i18n("deepl_api")}
{deeplUrl && (
<Link
sx={{ marginLeft: "1em" }}
component="button"
onClick={() => {
handleApiTest(OPT_TRANS_DEEPL);
}}
>
{i18n("click_test")}
</Link>
)}
</>
}
name="deeplUrl" name="deeplUrl"
value={deeplUrl} value={deeplUrl}
onChange={handleChange} onChange={handleChange}
@@ -164,7 +238,22 @@ export default function Settings() {
<TextField <TextField
size="small" size="small"
label={i18n("openai_api")} label={
<>
{i18n("openai_api")}
{openaiUrl && openaiPrompt && (
<Link
sx={{ marginLeft: "1em" }}
component="button"
onClick={() => {
handleApiTest(OPT_TRANS_OPENAI);
}}
>
{i18n("click_test")}
</Link>
)}
</>
}
name="openaiUrl" name="openaiUrl"
value={openaiUrl} value={openaiUrl}
onChange={handleChange} onChange={handleChange}

View File

@@ -35,10 +35,10 @@ export default function SyncSetting() {
setLoading(true); setLoading(true);
await syncSettingAndRules(); await syncSettingAndRules();
await reloadSetting(); await reloadSetting();
alert.success(i18n("data_sync_success")); alert.success(i18n("sync_success"));
} catch (err) { } catch (err) {
console.log("[sync all]", err); console.log("[sync all]", err);
alert.error(i18n("data_sync_error")); alert.error(i18n("sync_failed"));
} finally { } finally {
setLoading(false); setLoading(false);
} }

View File

@@ -19,6 +19,7 @@ import {
OPT_LANGS_TO, OPT_LANGS_TO,
OPT_STYLE_ALL, OPT_STYLE_ALL,
OPT_STYLE_USE_COLOR, OPT_STYLE_USE_COLOR,
CACHE_NAME,
} from "../../config"; } from "../../config";
import { sendIframeMsg } from "../../libs/iframe"; import { sendIframeMsg } from "../../libs/iframe";
@@ -66,6 +67,14 @@ export default function Popup({ setShowPopup, translator: tran }) {
} }
}; };
const handleClearCache = () => {
try {
caches.delete(CACHE_NAME);
} catch (err) {
console.log("[clear cache]", err);
}
};
useEffect(() => { useEffect(() => {
if (!isExt) { if (!isExt) {
return; return;
@@ -99,15 +108,27 @@ export default function Popup({ setShowPopup, translator: tran }) {
return ( return (
<Box minWidth={300} sx={{ p: 2 }}> <Box minWidth={300} sx={{ p: 2 }}>
<Stack spacing={2}> <Stack spacing={2}>
<FormControlLabel <Stack
control={ direction="row"
<Switch justifyContent="space-between"
checked={transOpen === "true"} alignItems="center"
onChange={handleTransToggle} spacing={2}
/> >
} <FormControlLabel
label={i18n("translate_alt")} control={
/> <Switch
checked={transOpen === "true"}
onChange={handleTransToggle}
/>
}
label={i18n("translate_alt")}
/>
{!isExt && (
<Button variant="text" onClick={handleClearCache}>
{i18n("clear_cache")}
</Button>
)}
</Stack>
<TextField <TextField
select select