From dae7a762c4ae2aab2183ceb8ff3677e1909d7aac Mon Sep 17 00:00:00 2001 From: Shikai Liu Date: Sat, 23 Dec 2023 17:19:03 +0800 Subject: [PATCH] Update the error regex expression. --- package.json | 6 +- pnpm-lock.yaml | 119 ++++++++++++++- src-tauri/Cargo.lock | 2 +- src-tauri/Cargo.toml | 2 +- src-tauri/src/common_tools/cmd.rs | 20 +++ src-tauri/src/common_tools/sql_lite.rs | 10 +- src-tauri/src/main.rs | 3 +- src/App.tsx | 1 + src/components/about-dialog.tsx | 18 ++- src/components/languageMenu.tsx | 42 ++++++ src/components/menu-mode-toggle.tsx | 10 +- src/components/menu.tsx | 22 +-- src/components/preferenceDialog.tsx | 67 +++++++++ src/dashboard/components/sidebar.tsx | 22 +-- src/dashboard/page.tsx | 156 ++++++++++---------- src/dashboard/page/base64ImagePage.tsx | 23 +-- src/dashboard/page/base64Page.tsx | 16 +- src/dashboard/page/base64TextPage.tsx | 24 ++- src/dashboard/page/colorPalettePage.tsx | 34 ++--- src/dashboard/page/diffViewerPage.tsx | 7 +- src/dashboard/page/digestPage.tsx | 24 +-- src/dashboard/page/formatJsonPage.tsx | 17 ++- src/dashboard/page/formatXmlPage.tsx | 16 +- src/dashboard/page/formatYamlPage.tsx | 16 +- src/dashboard/page/halfFullPage.tsx | 17 ++- src/dashboard/page/qrcodePage.tsx | 22 +-- src/dashboard/page/regexPage.tsx | 112 ++++++++++++++ src/dashboard/page/sm2Page.tsx | 70 ++++----- src/dashboard/page/sm3Page.tsx | 10 +- src/dashboard/page/sm4Page.tsx | 76 +++++----- src/dashboard/page/timestampPage.tsx | 18 ++- src/dashboard/page/urlencodePage.tsx | 16 +- src/i18n.ts | 24 +++ src/locales/en/main.json | 181 +++++++++++++++++++++++ src/locales/zh/main.json | 186 ++++++++++++++++++++++++ src/styles/globals.css | 8 +- tailwind.config.js | 4 + 37 files changed, 1106 insertions(+), 315 deletions(-) create mode 100644 src/components/languageMenu.tsx create mode 100644 src/components/preferenceDialog.tsx create mode 100644 src/dashboard/page/regexPage.tsx create mode 100644 src/i18n.ts create mode 100644 src/locales/en/main.json create mode 100644 src/locales/zh/main.json diff --git a/package.json b/package.json index d6f6e71..371ab08 100644 --- a/package.json +++ b/package.json @@ -47,14 +47,16 @@ "ace-builds": "^1.32.0", "cmdk": "^0.2.0", "date-fns": "^2.30.0", + "i18next": "^23.7.11", "lucide-react": "^0.263.1", "next-themes": "^0.2.1", "react": "^18.2.0", "react-ace": "^10.1.0", - "react-color-palette": "^7.1.0", + "react-color": "^2.19.3", "react-day-picker": "^8.8.0", "react-dom": "^18.2.0", "react-hook-form": "^7.45.2", + "react-i18next": "^13.5.0", "recharts": "^2.7.2", "tailwind-scrollbar": "^3.0.4", "tailwindcss-animate": "^1.0.6", @@ -65,6 +67,7 @@ "@tauri-apps/cli": "^1.4.0", "@types/node": "^20.4.6", "@types/react": "^18.2.18", + "@types/react-color": "^3.0.10", "@types/react-dom": "^18.2.7", "autoprefixer": "^10.4.14", "class-variance-authority": "^0.7.0", @@ -72,6 +75,7 @@ "postcss": "^8.4.27", "prettier": "^3.0.1", "prettier-plugin-tailwindcss": "^0.4.1", + "react-color": "^2.19.3", "tailwind-merge": "^1.14.0", "tailwindcss": "^3.3.3", "taze": "^0.11.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7dcd2ee..b07790d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -110,6 +110,9 @@ dependencies: date-fns: specifier: ^2.30.0 version: 2.30.0 + i18next: + specifier: ^23.7.11 + version: 23.7.11 lucide-react: specifier: ^0.263.1 version: 0.263.1(react@18.2.0) @@ -122,9 +125,9 @@ dependencies: react-ace: specifier: ^10.1.0 version: 10.1.0(react-dom@18.2.0)(react@18.2.0) - react-color-palette: - specifier: ^7.1.0 - version: 7.1.0(react@18.2.0) + react-color: + specifier: ^2.19.3 + version: 2.19.3(react@18.2.0) react-day-picker: specifier: ^8.8.0 version: 8.8.0(date-fns@2.30.0)(react@18.2.0) @@ -134,6 +137,9 @@ dependencies: react-hook-form: specifier: ^7.45.2 version: 7.45.2(react@18.2.0) + react-i18next: + specifier: ^13.5.0 + version: 13.5.0(i18next@23.7.11)(react-dom@18.2.0)(react@18.2.0) recharts: specifier: ^2.7.2 version: 2.7.2(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) @@ -160,6 +166,9 @@ devDependencies: '@types/react': specifier: ^18.2.18 version: 18.2.18 + '@types/react-color': + specifier: ^3.0.10 + version: 3.0.10 '@types/react-dom': specifier: ^18.2.7 version: 18.2.7 @@ -367,6 +376,13 @@ packages: regenerator-runtime: 0.13.11 dev: false + /@babel/runtime@7.23.6: + resolution: {integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: false + /@babel/template@7.21.9: resolution: {integrity: sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==} engines: {node: '>=6.9.0'} @@ -629,6 +645,14 @@ packages: - supports-color dev: true + /@icons/material@0.2.4(react@18.2.0): + resolution: {integrity: sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==} + peerDependencies: + react: '*' + dependencies: + react: 18.2.0 + dev: false + /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2628,6 +2652,13 @@ packages: /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + /@types/react-color@3.0.10: + resolution: {integrity: sha512-6K5BAn3zyd8lW8UbckIAVeXGxR82Za9jyGD2DBEynsa7fKaguLDVtjfypzs7fgEV7bULgs7uhds8A8v1wABTvQ==} + dependencies: + '@types/react': 18.2.18 + '@types/reactcss': 1.2.11 + dev: true + /@types/react-dom@18.2.7: resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} dependencies: @@ -2640,6 +2671,12 @@ packages: '@types/scheduler': 0.16.3 csstype: 3.1.2 + /@types/reactcss@1.2.11: + resolution: {integrity: sha512-0fFy0ubuPlhksId8r9V8nsLcxBAPQnn15g/ERAElgE9L6rOquMj2CapsxqfyBuHlkp0/ndEUVnkYI7MkTtkGpw==} + dependencies: + '@types/react': 18.2.18 + dev: true + /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} @@ -3403,6 +3440,12 @@ packages: lru-cache: 7.18.3 dev: true + /html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + dependencies: + void-elements: 3.1.0 + dev: false + /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: true @@ -3439,6 +3482,12 @@ packages: ms: 2.1.2 dev: true + /i18next@23.7.11: + resolution: {integrity: sha512-A/vOkw8vY99YHU9A1Td3I1dcTiYaPnwBWzrpVzfXUXSYgogK3cmBcmop/0cnXPc6QpUWIyqaugKNxRUEZVk9Nw==} + dependencies: + '@babel/runtime': 7.23.6 + dev: false + /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -3589,6 +3638,10 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: false @@ -3686,6 +3739,10 @@ packages: - supports-color dev: true + /material-colors@1.2.6: + resolution: {integrity: sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==} + dev: false + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -4315,13 +4372,19 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /react-color-palette@7.1.0(react@18.2.0): - resolution: {integrity: sha512-F5jMWOWh7FMkgm7aJfwNr5+TatvGKvQatuaDtw8trSU4yKk0bzcxOC7HFYVRs/9qEJ8kvatjWaUUrcQATYSXhw==} - engines: {node: '>=10'} + /react-color@2.19.3(react@18.2.0): + resolution: {integrity: sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==} peerDependencies: - react: '>=16.8' + react: '*' dependencies: + '@icons/material': 0.2.4(react@18.2.0) + lodash: 4.17.21 + lodash-es: 4.17.21 + material-colors: 1.2.6 + prop-types: 15.8.1 react: 18.2.0 + reactcss: 1.2.3(react@18.2.0) + tinycolor2: 1.6.0 dev: false /react-day-picker@8.8.0(date-fns@2.30.0)(react@18.2.0): @@ -4353,6 +4416,26 @@ packages: react: 18.2.0 dev: false + /react-i18next@13.5.0(i18next@23.7.11)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==} + peerDependencies: + i18next: '>= 23.2.3' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@babel/runtime': 7.23.6 + html-parse-stringify: 3.0.1 + i18next: 23.7.11 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false @@ -4478,6 +4561,15 @@ packages: loose-envify: 1.4.0 dev: false + /reactcss@1.2.3(react@18.2.0): + resolution: {integrity: sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==} + peerDependencies: + react: '*' + dependencies: + lodash: 4.17.21 + react: 18.2.0 + dev: false + /read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: @@ -4555,6 +4647,10 @@ packages: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} dev: false + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: false + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4910,6 +5006,10 @@ packages: dependencies: any-promise: 1.3.0 + /tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + dev: false + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -5095,6 +5195,11 @@ packages: optionalDependencies: fsevents: 2.3.2 + /void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + dev: false + /walk-up-path@3.0.1: resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} dev: true diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 086c01d..b9b8265 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -403,7 +403,7 @@ dependencies = [ [[package]] name = "code_magic" -version = "0.0.18" +version = "0.0.19" dependencies = [ "aes", "anyhow", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 4b9ef3e..d1e3645 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "code_magic" -version = "0.0.18" +version = "0.0.19" description = "A development tools" authors = ["lsk"] license = "MIT" diff --git a/src-tauri/src/common_tools/cmd.rs b/src-tauri/src/common_tools/cmd.rs index 3070a44..1783516 100644 --- a/src-tauri/src/common_tools/cmd.rs +++ b/src-tauri/src/common_tools/cmd.rs @@ -23,6 +23,7 @@ use crate::common_tools::qrcode::export_qrcode_with_error; use crate::common_tools::qrcode::get_barcode_with_error; use crate::common_tools::qrcode::get_qrcode_with_error; use crate::common_tools::sql_lite::get_menu_config_with_error; +use crate::common_tools::sql_lite::reset_menu_index_with_error; use crate::common_tools::sql_lite::set_menu_index_with_error; use crate::common_tools::sql_lite::GetMenuConfigReq; use crate::common_tools::timestamp::format_datetime_to_timestamp_with_error; @@ -557,6 +558,25 @@ pub fn get_menu_config( } } #[tauri::command] +pub fn reset_menu_index(state: State) -> String { + match reset_menu_index_with_error(state) { + Ok(item) => { + let res = BaseResponse { + response_code: 0, + response_msg: item, + }; + serde_json::to_string(&res).unwrap() + } + Err(e) => { + let res = BaseResponse { + response_code: 1, + response_msg: e.to_string(), + }; + serde_json::to_string(&res).unwrap() + } + } +} +#[tauri::command] pub fn set_menu_index( state: State, source_index: i32, diff --git a/src-tauri/src/common_tools/sql_lite.rs b/src-tauri/src/common_tools/sql_lite.rs index e38190a..930dcc4 100644 --- a/src-tauri/src/common_tools/sql_lite.rs +++ b/src-tauri/src/common_tools/sql_lite.rs @@ -136,8 +136,14 @@ pub fn set_menu_index_with_error( params![menu_config.menu_index, menu_config.source_index], )?; } - // 1 2 3 4 5 6 7 8 2->7 - // 1 2 3 4 5 6 7 8 7->2 Ok(()) } +pub fn reset_menu_index_with_error(state: State) -> Result<(), anyhow::Error> { + let sql_lite = state.0.lock().map_err(|e| anyhow!("lock error"))?; + + let connection = &sql_lite.connection; + let mut statement = + connection.execute("update menu_config set menu_index=source_index", params![])?; + Ok(()) +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 5d3070b..70aa54c 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -112,7 +112,8 @@ fn main() -> Result<(), anyhow::Error> { format_pretty_xml, get_about_version, get_menu_config, - set_menu_index + set_menu_index, + reset_menu_index ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); diff --git a/src/App.tsx b/src/App.tsx index d547427..ef95b6a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,6 @@ import { useState } from "react" import { invoke } from "@tauri-apps/api/tauri" +import './i18n'; import { Menu } from "@/components/menu" diff --git a/src/components/about-dialog.tsx b/src/components/about-dialog.tsx index ed5f49b..fa86246 100644 --- a/src/components/about-dialog.tsx +++ b/src/components/about-dialog.tsx @@ -19,23 +19,25 @@ import { DialogHeader, DialogTitle, } from "./ui/dialog" +import { useTranslation, Trans } from "react-i18next"; export function AboutDialog() { const [updateText, setUpdateText] = useState("") const [version, setVersion] = useState("") const [name, setName] = useState("") const [tauriVersion, setTauriVersion] = useState("") + const { t, i18n } = useTranslation(); useEffect(() => { loadVersion() }, []) - const loadVersion=async()=>{ + const loadVersion = async () => { const { response_code, response_msg } = JSON.parse(await invoke("get_about_version")); console.log(response_code); console.log(response_msg); if (response_code === 0) { - setVersion(response_msg); + setVersion(response_msg); } } return ( @@ -49,32 +51,32 @@ export function AboutDialog() { CodeMagic Version {version} - + - 本地离线小工具库。 + {t('aboutDialog.doc')} {updateText} - +
open("https://github.com/agmmnn/tauri-ui")} + onClick={() => open("https://github.com/lsk569937453/code-magic-public")} /> open("https://github.com/agmmnn/tauri-ui")} + onClick={() => open("https://github.com/lsk569937453/code-magic-public")} />
- + + {t('toolBar.language.name')} + + + i18n.changeLanguage("en")}> + {t('toolBar.language.english')} + + i18n.changeLanguage("zh")}> + {t('toolBar.language.chinese')} + + + + + ) +} diff --git a/src/components/menu-mode-toggle.tsx b/src/components/menu-mode-toggle.tsx index 789c0af..0111e49 100644 --- a/src/components/menu-mode-toggle.tsx +++ b/src/components/menu-mode-toggle.tsx @@ -19,26 +19,28 @@ import { MenubarTrigger, } from "@/components/ui/menubar" import { Icons } from "@/components/icons" +import { useTranslation, Trans } from "react-i18next"; export function MenuModeToggle() { const { setTheme, theme } = useTheme() + const { t, i18n } = useTranslation(); return ( - Theme + {t('toolBar.theme.name')} setTheme("light")}> - Light + {t('toolBar.theme.first_item')} setTheme("dark")}> - Dark + {t('toolBar.theme.second_item')} setTheme("system")}> - System + {t('toolBar.theme.third_item')} diff --git a/src/components/menu.tsx b/src/components/menu.tsx index 80fa46a..55cb847 100644 --- a/src/components/menu.tsx +++ b/src/components/menu.tsx @@ -23,13 +23,18 @@ import { } from "@/components/ui/menubar" import { AboutDialog } from "./about-dialog" +import { PreferenceDialog } from "./preferenceDialog" import { MenuModeToggle } from "./menu-mode-toggle" +import {LanguageMenu}from "./languageMenu" import { Dialog, DialogTrigger } from "./ui/dialog" +import { Separator } from "@/components/ui/separator" +import { useTranslation, Trans } from "react-i18next"; export function Menu() { const [showAboutDialog,setShowAboutDialog]=useState(false); const [showPreferenceDialog,setShowPreferenceDialog]=useState(false); + const { t, i18n } = useTranslation(); return (
+ - + - App + {t('toolBar.app.name')} - setShowAboutDialog(true)}>About App + setShowAboutDialog(true)}>{t('toolBar.app.first_item')} - setShowAboutDialog(true)}> - Preferences + setShowPreferenceDialog(true)}> + {t('toolBar.app.second_item')} - - - - - +
) diff --git a/src/components/preferenceDialog.tsx b/src/components/preferenceDialog.tsx new file mode 100644 index 0000000..f00fc3f --- /dev/null +++ b/src/components/preferenceDialog.tsx @@ -0,0 +1,67 @@ +import { useEffect, useState } from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { UpdateIcon } from "@radix-ui/react-icons" +import { invoke } from "@tauri-apps/api/tauri"; +import { Separator } from "@/components/ui/separator" + +import { + GithubIcon, + HomeIcon, + LinkIcon, + LucideArrowUpRight, +} from "lucide-react" + +import { Icons } from "./icons" +import { Button, buttonVariants } from "./ui/button" +import { + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "./ui/dialog" +import { useTranslation, Trans } from "react-i18next"; + +import { useToast } from "@/components/ui/use-toast" +const delay = (ms: number) => new Promise( + resolve => setTimeout(resolve, ms) +); +export function PreferenceDialog() { + const { toast } = useToast() + const { t, i18n } = useTranslation(); + + const handleResetButtonOnClick = async () => { + const { response_code, response_msg } = JSON.parse(await invoke("reset_menu_index")); + console.log(response_code); + console.log(response_msg); + if (response_code === 0) { + toast({ + title: "操作信息", + description: "菜单项已经重置成功。", + }); + await delay(2000); + + + window.location.reload(); + } + + } + return ( + + + + + + Setting + + + + + + + + + + + ) +} diff --git a/src/dashboard/components/sidebar.tsx b/src/dashboard/components/sidebar.tsx index 8af832e..1b95f60 100644 --- a/src/dashboard/components/sidebar.tsx +++ b/src/dashboard/components/sidebar.tsx @@ -32,6 +32,7 @@ import { ContextMenuTrigger, } from "@/components/ui/context-menu" import { useToast } from "@/components/ui/use-toast" +import { useTranslation, Trans } from "react-i18next"; interface MenuItem { label: string; @@ -48,6 +49,8 @@ const Sidebar = ({ menuList, onButtonClick }: SidebarProps) => { const [selectedIndex, setSelectedIndex] = useState(0); const [clickedSourceIndex, setClickedSourceIndex] = useState(0); const [changedMenuIndex, setChangedMenuIndex] = useState(""); + const { t, i18n } = useTranslation(); + const { toast } = useToast() useEffect(() => { @@ -88,23 +91,13 @@ const Sidebar = ({ menuList, onButtonClick }: SidebarProps) => { } } - const dialogGetSourceIndex = () => { - console.log("m:" + JSON.stringify(menuList)); - console.log("c:" + clickedSourceIndex); - const index = menuList.filter(item => item.sourceIndex === clickedSourceIndex)[0].menuIndex; - console.log("i:" + index); - - let res = (index === undefined) ? 0 : index; - console.log("r:" + res.toString()); - return res.toString(); - } return (

- 常用工具 + {t("menu.title")}

@@ -114,10 +107,10 @@ const Sidebar = ({ menuList, onButtonClick }: SidebarProps) => {
-
diff --git a/src/dashboard/page.tsx b/src/dashboard/page.tsx index 4cf1532..b5da23e 100644 --- a/src/dashboard/page.tsx +++ b/src/dashboard/page.tsx @@ -43,82 +43,88 @@ import FormatPage from "./page/formatPage" import ColorPalettePage from "./page/colorPalettePage" import DiffViewerPage from "./page/diffViewerPage" import CryptoPage from "./page/cryptoPage" -const constMenulist = [ - { - label: "转换工具", - menuIndex: 0, - sourceIndex: 0, - - render: - - }, - { - label: "格式化", - menuIndex: 1, - sourceIndex: 1, - render: - - }, { - label: "UrlEncode/UrlDecode", - menuIndex: 2, - sourceIndex: 2, - - render: - - }, - { - label: "摘要算法(MD5,SHA)", - menuIndex: 3, - sourceIndex: 3, - - render: - - }, - { - label: " 时间戳", - menuIndex: 4, - sourceIndex: 4, - render: - - }, - { - label: "二维码", - menuIndex: 5, - sourceIndex: 5, - - render: - - }, - { - label: "调色器", - menuIndex: 6, - sourceIndex: 6, - - render: - - }, { - label: "文本对比", - menuIndex: 7, - sourceIndex: 7, - render: - } - , { - label: "加密算法", - menuIndex: 8, - sourceIndex: 8, +import { useTranslation, Trans } from "react-i18next"; + - render: - } -]; export default function DashboardPage() { - const [selectedIndex, setSelectedIndex] = useState(1); - const [menulist, setMenulist] = useState(constMenulist); + const [selectedIndex, setSelectedIndex] = useState(0); + const { t, i18n } = useTranslation(); + + const [menulist, setMenulist] = useState([]); useEffect(() => { loadData(); }, []) + const constMenulist = () => { + return [ + { + label: "转换工具", + menuIndex: 0, + sourceIndex: 0, + + render: + + }, + { + label: "格式化", + menuIndex: 1, + sourceIndex: 1, + render: + + }, { + label: "UrlEncode/UrlDecode", + menuIndex: 2, + sourceIndex: 2, + + render: + + }, + { + label: "摘要算法(MD5,SHA)", + menuIndex: 3, + sourceIndex: 3, + + render: + + }, + { + label: " 时间戳", + menuIndex: 4, + sourceIndex: 4, + render: + + }, + { + label: "二维码", + menuIndex: 5, + sourceIndex: 5, + + render: + + }, + { + label: "调色器", + menuIndex: 6, + sourceIndex: 6, + + render: + + }, { + label: "文本对比", + menuIndex: 7, + sourceIndex: 7, + render: + } + , { + label: "加密算法", + menuIndex: 8, + sourceIndex: 8, + render: + } + ] + }; const loadData = async () => { - const getMenuConfigReqs = constMenulist.map(item => { + const getMenuConfigReqs = constMenulist().map(item => { return { menu_index: item.menuIndex, source_index: item.sourceIndex @@ -127,7 +133,7 @@ export default function DashboardPage() { const { response_code, response_msg } = JSON.parse(await invoke("get_menu_config", { getMenuConfigReqs: getMenuConfigReqs })); console.log(response_code); - console.log("get_menu_config:"+JSON.stringify(response_msg)); + console.log("get_menu_config:" + JSON.stringify(response_msg)); if (response_code == 0) { const contacts = new Map(); response_msg.forEach((item: { id: any, menu_index: any, source_index: any }) => { @@ -135,7 +141,7 @@ export default function DashboardPage() { contacts.set(source_index, menu_index); }); - const newMenulist = constMenulist.map(item => { + const newMenulist = constMenulist().map(item => { const menu_index = contacts.get(item.sourceIndex); return { ...item, @@ -144,9 +150,9 @@ export default function DashboardPage() { }); //sort 内部写法 newMenulist.sort(function (a, b) { //callback - const {menuIndex:menu_index}=a; - const {menuIndex: bmenu_index}=b; - + const { menuIndex: menu_index } = a; + const { menuIndex: bmenu_index } = b; + if (menu_index > bmenu_index) { // a b 分别是Arr中的 56 21 return 1 //返回正数 ,b排列在a之前 } else { @@ -163,7 +169,7 @@ export default function DashboardPage() { setSelectedIndex(index); } const renderComponent = (menuIndex: number) => { - const selectedMenu = menulist.find(item => item.menuIndex === menuIndex); + const selectedMenu = menulist.find((item:any) => item.menuIndex === menuIndex); return selectedMenu ? selectedMenu.render : null; }; return ( diff --git a/src/dashboard/page/base64ImagePage.tsx b/src/dashboard/page/base64ImagePage.tsx index 823fdfa..3c17f38 100644 --- a/src/dashboard/page/base64ImagePage.tsx +++ b/src/dashboard/page/base64ImagePage.tsx @@ -9,12 +9,15 @@ import { convertFileSrc } from '@tauri-apps/api/tauri'; import { invoke } from "@tauri-apps/api/tauri"; import { useToast } from "@/components/ui/use-toast" +import { useTranslation, Trans } from "react-i18next"; export function Base64ImagePage() { const [file, setFile] = useState(); const [text, setText] = useState(); const [imageStr, setImageStr] = useState(); const [imageSavePath, setImageSavePath] = useState(); + const { t, i18n } = useTranslation(); + const { toast } = useToast() const handleValueChange = (e: any) => { @@ -41,8 +44,8 @@ export function Base64ImagePage() { if (text === undefined || text === "") { toast({ variant: "destructive", - title: "错误信息", - description: "请先输入图像的base64字符串。", + title: t('toastMessage.errorMessageTile'), + description: t('base64ImagePage.base64ShouldNotEmptyMessageBody'), }) return; } @@ -52,8 +55,8 @@ export function Base64ImagePage() { if (file === undefined || file === "") { toast({ variant: "destructive", - title: "错误信息", - description: "请先选择图片。", + title: t('toastMessage.errorMessageTile'), + description: t('base64ImagePage.imageShouldNotEmptyMessageBody'), }) return; } @@ -69,8 +72,8 @@ export function Base64ImagePage() { if (text === undefined || text === "") { toast({ variant: "destructive", - title: "错误信息", - description: "请输入合法的base64字符串。", + title: t('toastMessage.errorMessageTile'), + description: t('base64ImagePage.base64ShouldValidMessageBody'), }) return; } @@ -88,7 +91,7 @@ export function Base64ImagePage() { return (
{imageStr ? : }
@@ -101,11 +104,11 @@ export function Base64ImagePage() {
- +
- - + +
{qrcodeResult && @@ -83,13 +85,13 @@ export default function QrcodePage() {
- {exportedFilePath &&

导出的文件路径:{exportedFilePath}

} +

{t('qrcodePage.exportButtonText')}

+ {exportedFilePath &&

{t('qrcodePage.filePathDivText')}{exportedFilePath}

}
}
-

条形码默认使用39条形码:包含有:0~9 的数字,大写 A~Z 的英文字母,「+」,「-」,「/」,「%」,「$」,「.」,以及空格符(Space)等,共44组编码。

+

{t('qrcodePage.barcodeTips')}

); diff --git a/src/dashboard/page/regexPage.tsx b/src/dashboard/page/regexPage.tsx new file mode 100644 index 0000000..0ce2313 --- /dev/null +++ b/src/dashboard/page/regexPage.tsx @@ -0,0 +1,112 @@ +import { Input } from "@/components/ui/input" +import { useState, useRef } from "react" +import { invoke } from "@tauri-apps/api/tauri"; +import { Button } from "@/components/ui/button" +import { useToast } from "@/components/ui/use-toast" +import { useTranslation, Trans } from "react-i18next"; +import AceEditor from "react-ace"; +import ReactAce from 'react-ace'; +import "ace-builds/src-noconflict/mode-html"; +import "ace-builds/src-noconflict/theme-github"; +import "ace-builds/src-noconflict/theme-monokai"; +import "ace-builds/src-noconflict/theme-kuroir"; + +import "ace-builds/src-noconflict/ext-searchbox"; + +import { useTheme } from "next-themes" + + + +export function RegexPage() { + const { t, i18n } = useTranslation(); + const [currentRegex, setCurrentRegex] = useState(); + const [currentInput, setCurrentInput] = useState(); + const { toast } = useToast() + const { setTheme, theme } = useTheme() + const aceEditorRef = useRef(null); + + + const handleRegexInputOnChange = (t: any) => { + // const e = require("ace-builds/src-noconflict/ext-searchbox"); + // e.Search(aceEditorRef.current?.editor, true); + setCurrentRegex(t.target.value); + console.log("t is:",t); + // const regex = new RegExp('([A-Z])\\w+', 'gm'); + // const regex2 = /([A-Z])\w+/gm; + const regex = new RegExp(t.target.value, 'gm'); + // regexpX.test(:'RegExr was created by gskinner.com'); + console.log(aceEditorRef.current); + // aceEditorRef.current?.editor.findAll(regexp,{ + + // regExp: true + // }); + aceEditorRef.current?.editor.$search.setOptions({ + needle: regex, + caseSensitive: true, + wholeWord: true, + regExp: true + }); + + + const prevMarkers = aceEditorRef.current?.editor.session.getMarkers(); + if (prevMarkers) { + const prevMarkersArr :any= Object.keys(prevMarkers); + for (let item of prevMarkersArr) { + aceEditorRef.current?.editor.session.removeMarker(prevMarkers[item].id); + } + } + var searchDatas = aceEditorRef.current?.editor.$search.findAll(aceEditorRef.current?.editor.session) + console.log(searchDatas.length, JSON.stringify(searchDatas)); + searchDatas.forEach((element: any) => { + aceEditorRef.current?.editor.getSession().addMarker(element, "searchMarker", "text"); + + }); + + } + + const handleValueChange = (e: any) => { + console.log(e); + setCurrentInput(e); + } + return ( + <> +
+
+ +
+
+ + +
+ +
+ + + ); +} \ No newline at end of file diff --git a/src/dashboard/page/sm2Page.tsx b/src/dashboard/page/sm2Page.tsx index 4ecde74..757f4b8 100644 --- a/src/dashboard/page/sm2Page.tsx +++ b/src/dashboard/page/sm2Page.tsx @@ -4,6 +4,7 @@ import { invoke } from "@tauri-apps/api/tauri"; import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input"; import { Card } from "@/components/ui/card"; +import { useTranslation, Trans } from "react-i18next"; import { useToast } from "@/components/ui/use-toast" import { @@ -41,13 +42,14 @@ export function Sm2Page() { const [publicKeyFormat,setPublicKeyFormat]=useState("hex"); const [privateKeyFormat,setPrivateKeyFormat]=useState("hex"); const { toast } = useToast() + const { t, i18n } = useTranslation(); const handleEncryptClick = async () => { if (currentInput === undefined || currentInput === "" || currentPublicKey === undefined || currentPublicKey === "") { toast({ variant: "destructive", - title: "错误信息", - description: "文本输入和公钥不能为空。", + title: t('toastMessage.errorMessageTile'), + description: t('encryptToolsPage.sm2Page.sourceAndPublicKeyNotEmptyMessageBody'), }) return; } @@ -68,7 +70,7 @@ export function Sm2Page() { } else { toast({ variant: "destructive", - title: "错误信息", + title: t('toastMessage.errorMessageTile'), description: response_msg, }) } @@ -77,8 +79,8 @@ export function Sm2Page() { if (currentInput === undefined || currentInput === "" || currentPrivateKey === undefined || currentPrivateKey === "") { toast({ variant: "destructive", - title: "错误信息", - description: "文本输入和私钥不能为空。", + title: t('toastMessage.errorMessageTile'), + description: t('encryptToolsPage.sm2Page.sourceAndPrivateKeyNotEmptyMessageBody'), }) return; } @@ -101,7 +103,7 @@ export function Sm2Page() { } else { toast({ variant: "destructive", - title: "错误信息", + title: "t('toastMessage.errorMessageTile')", description: response_msg, }) } @@ -130,53 +132,53 @@ export function Sm2Page() { <>
-