Showing preview only (5,208K chars total). Download the full file or copy to clipboard to get everything.
Repository: pot-app/pot-desktop
Branch: master
Commit: dad7b8044e30
Files: 271
Total size: 4.9 MB
Directory structure:
gitextract_7600kiul/
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yml
│ │ └── feature.yml
│ ├── actions/
│ │ ├── build-for-linux/
│ │ │ ├── Dockerfile
│ │ │ ├── action.yml
│ │ │ └── entrypoint.sh
│ │ └── build.sh
│ └── workflows/
│ └── package.yml
├── .gitignore
├── .node-version
├── .prettierignore
├── .prettierrc.json
├── .scripts/
│ ├── popclip/
│ │ ├── Config.plist
│ │ ├── Pot.sh
│ │ └── build.sh
│ └── snipdo/
│ ├── build.sh
│ ├── pot.json
│ └── pot.ps1
├── .vscode/
│ ├── extensions.json
│ ├── launch.json
│ └── tasks.json
├── CHANGELOG
├── LICENSE
├── README.md
├── README_EN.md
├── README_KR.md
├── com.pot_app.pot.metainfo.xml
├── daemon.html
├── index.html
├── package.json
├── patches/
│ └── hyprland.patch
├── postcss.config.js
├── public/
│ └── tesseract-core-simd-lstm.wasm.js
├── src/
│ ├── App.jsx
│ ├── components/
│ │ └── WindowControl/
│ │ ├── index.jsx
│ │ └── style.css
│ ├── hooks/
│ │ ├── index.jsx
│ │ ├── useConfig.jsx
│ │ ├── useGetState.jsx
│ │ ├── useSyncAtom.jsx
│ │ ├── useToastStyle.jsx
│ │ └── useVoice.jsx
│ ├── i18n/
│ │ ├── index.jsx
│ │ └── locales/
│ │ ├── ar_AE.json
│ │ ├── de_DE.json
│ │ ├── en_US.json
│ │ ├── es_ES.json
│ │ ├── fa_IR.json
│ │ ├── fr_FR.json
│ │ ├── he_IL.json
│ │ ├── it_IT.json
│ │ ├── ja_JP.json
│ │ ├── ko_KR.json
│ │ ├── nb_NO.json
│ │ ├── nn_NO.json
│ │ ├── pt_BR.json
│ │ ├── pt_PT.json
│ │ ├── ru_RU.json
│ │ ├── ta_IN.json
│ │ ├── tk_TM.json
│ │ ├── tr_TR.json
│ │ ├── uk_UA.json
│ │ ├── zh_CN.json
│ │ └── zh_TW.json
│ ├── main.jsx
│ ├── services/
│ │ ├── collection/
│ │ │ ├── anki/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── eudic/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ └── index.jsx
│ │ ├── recognize/
│ │ │ ├── baidu/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── baidu_accurate/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── baidu_img/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── iflytek/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── iflytek_intsig/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── iflytek_latex/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── index.jsx
│ │ │ ├── qrcode/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── simple_latex/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── system/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── tencent/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── tencent_accurate/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── tencent_img/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── tesseract/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── volcengine/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ └── volcengine_multi_lang/
│ │ │ ├── Config.jsx
│ │ │ ├── index.jsx
│ │ │ └── info.ts
│ │ ├── translate/
│ │ │ ├── alibaba/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── baidu/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── baidu_field/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── bing/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── bing_dict/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── caiyun/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── cambridge_dict/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── chatglm/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── deepl/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── ecdict/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── geminipro/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── google/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── index.jsx
│ │ │ ├── lingva/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── niutrans/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── ollama/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── openai/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── tencent/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── transmart/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── volcengine/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ ├── yandex/
│ │ │ │ ├── Config.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── info.ts
│ │ │ └── youdao/
│ │ │ ├── Config.jsx
│ │ │ ├── index.jsx
│ │ │ └── info.ts
│ │ └── tts/
│ │ ├── index.jsx
│ │ └── lingva/
│ │ ├── Config.jsx
│ │ ├── index.jsx
│ │ └── info.ts
│ ├── style.css
│ ├── utils/
│ │ ├── env.js
│ │ ├── index.js
│ │ ├── invoke_plugin.js
│ │ ├── lang_detect.js
│ │ ├── language.ts
│ │ ├── service_instance.ts
│ │ └── store.js
│ └── window/
│ ├── Config/
│ │ ├── components/
│ │ │ └── SideBar/
│ │ │ └── index.jsx
│ │ ├── index.jsx
│ │ ├── pages/
│ │ │ ├── About/
│ │ │ │ └── index.jsx
│ │ │ ├── Backup/
│ │ │ │ ├── AliyunModal/
│ │ │ │ │ └── index.jsx
│ │ │ │ ├── WebDavModal/
│ │ │ │ │ └── index.jsx
│ │ │ │ ├── index.jsx
│ │ │ │ └── utils/
│ │ │ │ ├── aliyun.jsx
│ │ │ │ ├── local.jsx
│ │ │ │ └── webdav.jsx
│ │ │ ├── General/
│ │ │ │ └── index.jsx
│ │ │ ├── History/
│ │ │ │ └── index.jsx
│ │ │ ├── Hotkey/
│ │ │ │ └── index.jsx
│ │ │ ├── Recognize/
│ │ │ │ └── index.jsx
│ │ │ ├── Service/
│ │ │ │ ├── Collection/
│ │ │ │ │ ├── ConfigModal/
│ │ │ │ │ │ └── index.jsx
│ │ │ │ │ ├── SelectModal/
│ │ │ │ │ │ └── index.jsx
│ │ │ │ │ ├── ServiceItem/
│ │ │ │ │ │ └── index.jsx
│ │ │ │ │ └── index.jsx
│ │ │ │ ├── PluginConfig/
│ │ │ │ │ └── index.jsx
│ │ │ │ ├── Recognize/
│ │ │ │ │ ├── ConfigModal/
│ │ │ │ │ │ └── index.jsx
│ │ │ │ │ ├── SelectModal/
│ │ │ │ │ │ └── index.jsx
│ │ │ │ │ ├── ServiceItem/
│ │ │ │ │ │ └── index.jsx
│ │ │ │ │ └── index.jsx
│ │ │ │ ├── SelectPluginModal/
│ │ │ │ │ └── index.jsx
│ │ │ │ ├── Translate/
│ │ │ │ │ ├── ConfigModal/
│ │ │ │ │ │ └── index.jsx
│ │ │ │ │ ├── SelectModal/
│ │ │ │ │ │ └── index.jsx
│ │ │ │ │ ├── ServiceItem/
│ │ │ │ │ │ └── index.jsx
│ │ │ │ │ └── index.jsx
│ │ │ │ ├── Tts/
│ │ │ │ │ ├── ConfigModal/
│ │ │ │ │ │ └── index.jsx
│ │ │ │ │ ├── SelectModal/
│ │ │ │ │ │ └── index.jsx
│ │ │ │ │ ├── ServiceItem/
│ │ │ │ │ │ └── index.jsx
│ │ │ │ │ └── index.jsx
│ │ │ │ └── index.jsx
│ │ │ └── Translate/
│ │ │ └── index.jsx
│ │ ├── routes/
│ │ │ └── index.jsx
│ │ └── style.css
│ ├── Recognize/
│ │ ├── ControlArea/
│ │ │ └── index.jsx
│ │ ├── ImageArea/
│ │ │ └── index.jsx
│ │ ├── TextArea/
│ │ │ └── index.jsx
│ │ └── index.jsx
│ ├── Screenshot/
│ │ └── index.jsx
│ ├── Translate/
│ │ ├── components/
│ │ │ ├── LanguageArea/
│ │ │ │ └── index.jsx
│ │ │ ├── SourceArea/
│ │ │ │ └── index.jsx
│ │ │ └── TargetArea/
│ │ │ └── index.jsx
│ │ └── index.jsx
│ └── Updater/
│ └── index.jsx
├── src-tauri/
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── build.rs
│ ├── icons/
│ │ └── icon.icns
│ ├── icons_mac/
│ │ └── icon.icns
│ ├── resources/
│ │ ├── ocr-aarch64-apple-darwin
│ │ └── ocr-x86_64-apple-darwin
│ ├── src/
│ │ ├── backup.rs
│ │ ├── clipboard.rs
│ │ ├── cmd.rs
│ │ ├── config.rs
│ │ ├── error.rs
│ │ ├── hotkey.rs
│ │ ├── lang_detect.rs
│ │ ├── main.rs
│ │ ├── screenshot.rs
│ │ ├── server.rs
│ │ ├── system_ocr.rs
│ │ ├── tray.rs
│ │ ├── updater.rs
│ │ └── window.rs
│ ├── tauri.conf.json
│ ├── tauri.linux.conf.json
│ ├── tauri.macos.conf.json
│ ├── tauri.windows.conf.json
│ ├── webview.arm64.json
│ ├── webview.x64.json
│ └── webview.x86.json
├── tailwind.config.cjs
├── updater/
│ ├── updater-for-fix-runtime.mjs
│ └── updater.mjs
└── vite.config.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: ['https://afdian.com/a/pylogmon'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
================================================
FILE: .github/ISSUE_TEMPLATE/bug.yml
================================================
name: 🐞 Bug Report
description: Report a bug
title: '[BUG]: title'
labels: ['type: bug']
body:
- type: markdown
attributes:
value: |
# ⬆️ Please give a concise and clear title ⬆️
## Thank you for your feedback, pot has become better because of it!
### Please confirm the following before submitting a new issue.
- I have carefully reviewed the official website's usage documentation.
- I have searched through the historical issues but could not find an answer.
- type: textarea
attributes:
label: Description
description: Simply describe the problem.
validations:
required: true
- type: textarea
attributes:
label: Reproduction
description: Steps to reproduce the behaviour.
validations:
required: true
- type: dropdown
attributes:
label: Platform
options:
- Windows
- Linux
- MacOS
validations:
required: true
- type: input
attributes:
label: System Version
placeholder: 'Eg: Windows 11 Home Edition 22621.1702'
validations:
required: true
- type: dropdown
attributes:
label: Window System (Linux Only)
options:
- X11
- Wayland
- type: input
attributes:
label: Software Version
placeholder: 'Eg: 2.0.0'
validations:
required: true
- type: textarea
attributes:
label: Log File
description: 'pot.log file content'
- type: textarea
attributes:
label: Additional Information
================================================
FILE: .github/ISSUE_TEMPLATE/feature.yml
================================================
name: 🌟 Feature Request
description: Suggest an idea
title: '[Feature]: title'
labels: ['type: enhancement']
body:
- type: markdown
attributes:
value: |
# ⬆️ Please give a concise and clear title ⬆️
## Thank you for your feedback, pot has become better because of it!
### Please confirm the following before submitting a new issue.
- I have carefully reviewed the official website's usage documentation.
- I have searched through the historical issues but could not find an answer.
- type: textarea
attributes:
label: Description
description: Simply describe your idea.
validations:
required: true
- type: textarea
attributes:
label: Application Scenario
description: Why is there such a demand?
validations:
required: true
- type: textarea
attributes:
label: References
description: Provide implementation ideas or reference documents when necessary.
================================================
FILE: .github/actions/build-for-linux/Dockerfile
================================================
FROM rust:bullseye
COPY entrypoint.sh /entrypoint.sh
RUN chmod a+x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
================================================
FILE: .github/actions/build-for-linux/action.yml
================================================
name: 'Build for Linux'
branding:
icon: user-check
color: gray-dark
inputs:
target:
required: true
description: 'Rust Target'
toolchain:
required: true
description: 'Rust Toolchain'
runs:
using: 'docker'
image: 'Dockerfile'
args:
- ${{ inputs.target }}
- ${{ inputs.toolchain }}
================================================
FILE: .github/actions/build-for-linux/entrypoint.sh
================================================
#!/bin/bash
wget https://nodejs.org/dist/v19.8.1/node-v19.8.1-linux-x64.tar.xz
tar -Jxvf ./node-v19.8.1-linux-x64.tar.xz
export PATH=$(pwd)/node-v19.8.1-linux-x64/bin:$PATH
npm install pnpm -g
rustup target add "$INPUT_TARGET"
rustup toolchain install --force-non-host "$INPUT_TOOLCHAIN"
if [ "$INPUT_TARGET" = "x86_64-unknown-linux-gnu" ]; then
apt-get update
apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libayatana-appindicator3-dev librsvg2-dev patchelf libxdo-dev libxcb1 libxrandr2 libdbus-1-3
elif [ "$INPUT_TARGET" = "i686-unknown-linux-gnu" ]; then
dpkg --add-architecture i386
apt-get update
apt-get install -y libstdc++6:i386 libgdk-pixbuf2.0-dev:i386 libatomic1:i386 gcc-multilib g++-multilib libwebkit2gtk-4.0-dev:i386 libssl-dev:i386 libgtk-3-dev:i386 librsvg2-dev:i386 patchelf:i386 libxdo-dev:i386 libxcb1:i386 libxrandr2:i386 libdbus-1-3:i386 libayatana-appindicator3-dev:i386
export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig/:$PKG_CONFIG_PATH
export PKG_CONFIG_SYSROOT_DIR=/
elif [ "$INPUT_TARGET" = "aarch64-unknown-linux-gnu" ]; then
dpkg --add-architecture arm64
apt-get update
apt-get install -y libncurses6:arm64 libtinfo6:arm64 linux-libc-dev:arm64 libncursesw6:arm64 libcups2:arm64
apt-get install -y --no-install-recommends g++-aarch64-linux-gnu libc6-dev-arm64-cross libssl-dev:arm64 libwebkit2gtk-4.0-dev:arm64 libgtk-3-dev:arm64 patchelf:arm64 librsvg2-dev:arm64 libxdo-dev:arm64 libxcb1:arm64 libxrandr2:arm64 libdbus-1-3:arm64 libayatana-appindicator3-dev:arm64
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc
export CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc
export CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++
export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig
export PKG_CONFIG_ALLOW_CROSS=1
elif [ "$INPUT_TARGET" = "armv7-unknown-linux-gnueabihf" ]; then
dpkg --add-architecture armhf
apt-get update
apt-get install -y libncurses6:armhf libtinfo6:armhf linux-libc-dev:armhf libncursesw6:armhf libcups2:armhf
apt-get install -y --no-install-recommends g++-arm-linux-gnueabihf libc6-dev-armhf-cross libssl-dev:armhf libwebkit2gtk-4.0-dev:armhf libgtk-3-dev:armhf patchelf:armhf librsvg2-dev:armhf libxdo-dev:armhf libxcb1:armhf libxrandr2:armhf libdbus-1-3:armhf libayatana-appindicator3-dev:armhf
export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc
export CC_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc
export CXX_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-g++
export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig
export PKG_CONFIG_ALLOW_CROSS=1
else
echo "Unknown target: $INPUT_TARGET" && exit 1
fi
bash .github/actions/build.sh
================================================
FILE: .github/actions/build.sh
================================================
# pnpm install --resolution-only
pnpm install
sed -i "s/#openssl/openssl={version=\"0.10\",features=[\"vendored\"]}/g" src-tauri/Cargo.toml
if [ "$INPUT_TARGET" = "x86_64-unknown-linux-gnu" ]; then
pnpm tauri build --target $INPUT_TARGET
else
pnpm tauri build --target $INPUT_TARGET -b deb rpm
fi
================================================
FILE: .github/workflows/package.yml
================================================
name: Package
on:
push:
branches: [master]
tags-ignore: [updater]
permissions: write-all
jobs:
change-version:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.outputstep.outputs.VERSION }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install git
run: |
sudo apt-get update
sudo apt-get install -y git
- id: outputstep
run: |
echo "VERSION=$(git describe --tags | sed 's/-[0-9]*-.*//g')" >> "$GITHUB_OUTPUT"
- name: Change Version for Windows
run: |
sed -i "s/\"version\":.*/\"version\": \"$(git describe --tags | sed 's/-[0-9]*-.*//g')\",/g" package.json
sed -i "s/\"version\":.*/\"version\": \"$(git describe --tags | sed 's/-[0-9]*-.*//g')\"/g" src-tauri/tauri.conf.json
sed -i "s/version = \"0.0.0\"/version = \"$(git describe --tags | sed 's/-[0-9]*-.*//g')\"/g" src-tauri/Cargo.toml
echo $(git describe --tags | sed 's/-[0-9]*-.*//g')
- name: Upload Artifacts for Windows
uses: actions/upload-artifact@v4
with:
name: source
path: ./*
include-hidden-files: true
if-no-files-found: error
build-extension:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Build Popclipext
run: |
cd .scripts/popclip
bash ./build.sh
cd ../..
- name: Build SnipDo
run: |
cd .scripts/snipdo
bash ./build.sh
cd ../..
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: Pot.popclipextz
path: .scripts/popclip/Pot.popclipextz
if-no-files-found: error
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: pot.pbar
path: .scripts/snipdo/pot.pbar
if-no-files-found: error
- name: Upload Release
if: startsWith(github.ref, 'refs/tags')
uses: softprops/action-gh-release@v1
with:
body_path: CHANGELOG
token: ${{ secrets.GITHUB_TOKEN }}
files: .scripts/popclip/Pot.popclipextz
- name: Upload Release
if: startsWith(github.ref, 'refs/tags')
uses: softprops/action-gh-release@v1
with:
body_path: CHANGELOG
token: ${{ secrets.GITHUB_TOKEN }}
files: .scripts/snipdo/pot.pbar
build-for-macos:
needs: change-version
strategy:
fail-fast: false
matrix:
platform: [macos-latest]
target: [aarch64-apple-darwin, x86_64-apple-darwin]
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/download-artifact@v4
with:
name: source
- name: Setup Nodejs
uses: actions/setup-node@v4
with:
node-version: 21
- name: Install Rust Stable
uses: dtolnay/rust-toolchain@stable
- name: install dependencies
run: |
rustup target add ${{ matrix.target }}
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Install Dependencies
run: pnpm install
- name: Code Format
run: pnpm prettier --write .
- name: Build and Package
run: |
export TAURI_PRIVATE_KEY="${{ secrets.TAURI_PRIVATE_KEY }}"
export TAURI_KEY_PASSWORD="${{ secrets.TAURI_KEY_PASSWORD }}"
export APPLE_SIGNING_IDENTITY="${{ secrets.APPLE_SIGNING_IDENTITY }}"
export APPLE_CERTIFICATE="${{ secrets.APPLE_CERTIFICATE }}"
export APPLE_CERTIFICATE_PASSWORD="${{ secrets.APPLE_CERTIFICATE_PASSWORD }}"
export APPLE_TEAM_ID="${{ secrets.APPLE_TEAM_ID }}"
export APPLE_API_ISSUER="${{ secrets.APPLE_API_ISSUER }}"
export APPLE_API_KEY="${{ secrets.APPLE_API_KEY }}"
export APPLE_ID="${{ secrets.APPLE_ID }}"
export APPLE_PASSWORD="${{ secrets.APPLE_PASSWORD }}"
pnpm tauri build --target ${{ matrix.target }}
sudo chmod +x src-tauri/resources/*
chmod +x src-tauri/resources/*
- name: Change File Name
if: matrix.target == 'aarch64-apple-darwin'
run: |
sudo mv src-tauri/target/aarch64-apple-darwin/release/bundle/macos/pot.app.tar.gz src-tauri/target/aarch64-apple-darwin/release/bundle/macos/pot_${{needs.change-version.outputs.version}}_aarch64.app.tar.gz
sudo mv src-tauri/target/aarch64-apple-darwin/release/bundle/macos/pot.app.tar.gz.sig src-tauri/target/aarch64-apple-darwin/release/bundle/macos/pot_${{needs.change-version.outputs.version}}_aarch64.app.tar.gz.sig
- name: Change File Name
if: matrix.target == 'x86_64-apple-darwin'
run: |
sudo mv src-tauri/target/x86_64-apple-darwin/release/bundle/macos/pot.app.tar.gz src-tauri/target/x86_64-apple-darwin/release/bundle/macos/pot_${{needs.change-version.outputs.version}}_x64.app.tar.gz
sudo mv src-tauri/target/x86_64-apple-darwin/release/bundle/macos/pot.app.tar.gz.sig src-tauri/target/x86_64-apple-darwin/release/bundle/macos/pot_${{needs.change-version.outputs.version}}_x64.app.tar.gz.sig
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: macos_${{ matrix.target }}_dmg
path: src-tauri/target/${{ matrix.target }}/release/bundle/dmg/*.dmg
if-no-files-found: error
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: macos_${{ matrix.target }}_updater
path: src-tauri/target/${{ matrix.target }}/release/bundle/macos/*.app*
if-no-files-found: error
- name: Upload Release
if: startsWith(github.ref, 'refs/tags')
uses: softprops/action-gh-release@v1
with:
body_path: CHANGELOG
token: ${{ secrets.GITHUB_TOKEN }}
files: src-tauri/target/${{ matrix.target }}/release/bundle/dmg/*.dmg
- name: Upload Release
if: startsWith(github.ref, 'refs/tags')
uses: softprops/action-gh-release@v1
with:
body_path: CHANGELOG
token: ${{ secrets.GITHUB_TOKEN }}
files: src-tauri/target/${{ matrix.target }}/release/bundle/macos/*.app*
build-for-windows:
needs: change-version
strategy:
fail-fast: false
matrix:
platform: [windows-latest]
target: [x86_64-pc-windows-msvc, i686-pc-windows-msvc, aarch64-pc-windows-msvc]
include:
- os: windows-latest
target: x86_64-pc-windows-msvc
toolchain: stable-x86_64-pc-windows-msvc
- os: windows-latest
target: i686-pc-windows-msvc
toolchain: stable-i686-pc-windows-msvc
- os: windows-latest
target: aarch64-pc-windows-msvc
toolchain: stable-aarch64-pc-windows-msvc
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/download-artifact@v4
with:
name: source
- name: Setup Nodejs
uses: actions/setup-node@v4
with:
node-version: 21
- name: Install Rust Stable
uses: dtolnay/rust-toolchain@stable
- name: install dependencies
run: |
rustup target add ${{ matrix.target }}
rustup toolchain install --force-non-host ${{ matrix.toolchain }}
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Install Dependencies
run: pnpm install
- name: Code Format
run: pnpm prettier --write .
- name: Build and Package
run: |
$env:TAURI_PRIVATE_KEY="${{ secrets.TAURI_PRIVATE_KEY }}"
$env:TAURI_KEY_PASSWORD="${{ secrets.TAURI_KEY_PASSWORD }}"
pnpm tauri build -b nsis,updater --target ${{ matrix.target }}
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: windows_${{ matrix.target }}
path: src-tauri/target/${{ matrix.target }}/release/bundle/nsis/*setup*
if-no-files-found: error
- name: Upload Release
if: startsWith(github.ref, 'refs/tags')
uses: softprops/action-gh-release@v1
with:
body_path: CHANGELOG
token: ${{ secrets.GITHUB_TOKEN }}
files: src-tauri/target/${{ matrix.target }}/release/bundle/nsis/*setup*
build-for-windows-fix-runtime:
needs: change-version
strategy:
fail-fast: false
matrix:
platform: [windows-latest]
target: [x86_64-pc-windows-msvc, i686-pc-windows-msvc, aarch64-pc-windows-msvc]
include:
- os: windows-latest
arch: x64
target: x86_64-pc-windows-msvc
toolchain: stable-x86_64-pc-windows-msvc
- os: windows-latest
arch: x86
target: i686-pc-windows-msvc
toolchain: stable-i686-pc-windows-msvc
- os: windows-latest
arch: arm64
target: aarch64-pc-windows-msvc
toolchain: stable-aarch64-pc-windows-msvc
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/download-artifact@v4
with:
name: source
- name: Setup Nodejs
uses: actions/setup-node@v4
with:
node-version: 21
- name: Install Rust Stable
uses: dtolnay/rust-toolchain@stable
- name: install dependencies
run: |
rustup target add ${{ matrix.target }}
rustup toolchain install --force-non-host ${{ matrix.toolchain }}
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Install Dependencies
run: pnpm install
- name: Code Format
run: pnpm prettier --write .
- name: Download WebView2 Runtime
run: |
invoke-webrequest -uri https://github.com/westinyang/WebView2RuntimeArchive/releases/download/109.0.1518.78/Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${{ matrix.arch }}.cab -outfile Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${{ matrix.arch }}.cab
Expand .\Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${{ matrix.arch }}.cab -F:* ./src-tauri
Remove-Item .\src-tauri\tauri.windows.conf.json
Rename-Item .\src-tauri\webview.${{ matrix.arch }}.json tauri.windows.conf.json
- name: Build and Package
run: |
$env:TAURI_PRIVATE_KEY="${{ secrets.TAURI_PRIVATE_KEY }}"
$env:TAURI_KEY_PASSWORD="${{ secrets.TAURI_KEY_PASSWORD }}"
pnpm tauri build -b nsis,updater --target ${{ matrix.target }}
Rename-Item .\src-tauri\target\${{ matrix.target }}\release\bundle\nsis\pot_${{needs.change-version.outputs.version}}_${{ matrix.arch }}-setup.exe pot_${{needs.change-version.outputs.version}}_${{ matrix.arch }}_fix_webview2_runtime-setup.exe
Rename-Item .\src-tauri\target\${{ matrix.target }}\release\bundle\nsis\pot_${{needs.change-version.outputs.version}}_${{ matrix.arch }}-setup.nsis.zip pot_${{needs.change-version.outputs.version}}_${{ matrix.arch }}_fix_webview2_runtime-setup.nsis.zip
Rename-Item .\src-tauri\target\${{ matrix.target }}\release\bundle\nsis\pot_${{needs.change-version.outputs.version}}_${{ matrix.arch }}-setup.nsis.zip.sig pot_${{needs.change-version.outputs.version}}_${{ matrix.arch }}_fix_webview2_runtime-setup.nsis.zip.sig
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: windows_fix_webview_runtime_${{ matrix.target }}
path: src-tauri/target/${{ matrix.target }}/release/bundle/nsis/*setup*
if-no-files-found: error
- name: Upload Release
if: startsWith(github.ref, 'refs/tags')
uses: softprops/action-gh-release@v1
with:
body_path: CHANGELOG
token: ${{ secrets.GITHUB_TOKEN }}
files: src-tauri/target/${{ matrix.target }}/release/bundle/nsis/*setup*
build-for-linux:
needs: change-version
strategy:
fail-fast: false
matrix:
platform: [ubuntu-latest]
target:
[
x86_64-unknown-linux-gnu,
i686-unknown-linux-gnu,
aarch64-unknown-linux-gnu,
armv7-unknown-linux-gnueabihf,
]
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
toolchain: stable-x86_64-unknown-linux-gnu
- os: ubuntu-latest
target: i686-unknown-linux-gnu
toolchain: stable-i686-unknown-linux-gnu
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
toolchain: stable-aarch64-unknown-linux-gnu
- os: ubuntu-latest
target: armv7-unknown-linux-gnueabihf
toolchain: stable-armv7-unknown-linux-gnueabihf
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/download-artifact@v4
with:
name: source
- name: Build for Linux
uses: ./.github/actions/build-for-linux
env:
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
with:
target: ${{ matrix.target }}
toolchain: ${{ matrix.toolchain }}
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: linux_${{ matrix.target }}_deb
path: src-tauri/target/${{ matrix.target }}/release/bundle/deb/*.deb
if-no-files-found: error
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: linux_${{ matrix.target }}_rpm
path: src-tauri/target/${{ matrix.target }}/release/bundle/rpm/*.rpm
if-no-files-found: error
- name: Upload Artifacts
if: matrix.target == 'x86_64-unknown-linux-gnu'
uses: actions/upload-artifact@v4
with:
name: linux_${{ matrix.target }}_appimage
path: src-tauri/target/${{ matrix.target }}/release/bundle/appimage/*.AppImage*
if-no-files-found: error
- name: Upload Release
if: startsWith(github.ref, 'refs/tags') && matrix.target == 'x86_64-unknown-linux-gnu'
uses: softprops/action-gh-release@v1
with:
body_path: CHANGELOG
token: ${{ secrets.GITHUB_TOKEN }}
files: src-tauri/target/${{ matrix.target }}/release/bundle/appimage/*.AppImage*
- name: Upload Release
if: startsWith(github.ref, 'refs/tags')
uses: softprops/action-gh-release@v1
with:
body_path: CHANGELOG
token: ${{ secrets.GITHUB_TOKEN }}
files: src-tauri/target/${{ matrix.target }}/release/bundle/deb/*.deb
- name: Upload Release
if: startsWith(github.ref, 'refs/tags')
uses: softprops/action-gh-release@v1
with:
body_path: CHANGELOG
token: ${{ secrets.GITHUB_TOKEN }}
files: src-tauri/target/${{ matrix.target }}/release/bundle/rpm/*.rpm
trigger-docs-update:
needs: [build-for-macos, build-for-windows, build-for-linux]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags')
steps:
- name: Trigger update
run: |
curl -X POST https://api.github.com/repos/pot-app/pot-docs/dispatches \
-H "Accept: application/vnd.github.everest-preview+json" \
-H "Authorization: token ${{ secrets.TOKEN }}" \
-d '{"event_type": "plugins-updated"}'
release-update:
needs: [build-for-macos, build-for-windows, build-for-linux, build-for-windows-fix-runtime]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags')
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install git
run: |
sudo apt-get update
sudo apt-get install -y git curl
- name: Get Tag Name
run: |
echo "VERSION=$(git describe --tags | sed 's/-[0-9]*-.*//g')" >> $GITHUB_ENV
echo "VERSION=$(git describe --tags | sed 's/-[0-9]*-.*//g')"
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: pnpm install
run: pnpm install
- name: Release updater file
run: |
pnpm run updater
pnpm run updater:fixRuntime
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload Release
uses: softprops/action-gh-release@v1
with:
body: ${{env.VERSION}}
tag_name: updater
token: ${{ secrets.GITHUB_TOKEN }}
files: |
update.json
update-fix-runtime.json
homebrew:
name: Update Homebrew cask
needs: build-for-macos
runs-on: macos-latest
if: startsWith(github.ref, 'refs/tags')
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get Tag Name
run: |
echo "VERSION=$(git describe --tags | sed 's/-[0-9]*-.*//g')" >> $GITHUB_ENV
echo "VERSION=$(git describe --tags | sed 's/-[0-9]*-.*//g')"
- name: Set up Homebrew
uses: Homebrew/actions/setup-homebrew@master
- name: Set up Git
run: |
# sudo apt-get install git -y
git config --global user.email support@pot-app.com
git config --global user.name pot-app
- name: Update Homebrew cask
env:
HOMEBREW_GITHUB_API_TOKEN: ${{ secrets.TOKEN }}
run: |
brew tap pot-app/homebrew-tap
brew update
brew bump-cask-pr pot --version ${{ env.VERSION }} --no-browse
winget:
name: Update WinGet Package
needs: build-for-windows
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags')
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install git
run: |
sudo apt-get update
sudo apt-get install -y git
- name: Get Tag Name
run: |
echo "VERSION=$(git describe --tags | sed 's/-[0-9]*-.*//g')" >> $GITHUB_ENV
echo "VERSION=$(git describe --tags | sed 's/-[0-9]*-.*//g')"
- name: Upload WinGet
if: startsWith(github.ref, 'refs/tags')
uses: vedantmgoyal2009/winget-releaser@v2
with:
identifier: Pylogmon.pot
version: ${{env.VERSION}}
installers-regex: '\.exe$'
token: ${{ secrets.TOKEN }}
fork-user: Pylogmon
continue-on-error: true
================================================
FILE: .gitignore
================================================
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
================================================
FILE: .node-version
================================================
21
================================================
FILE: .prettierignore
================================================
asset
dist
node_modules
public
target
*-lock*
================================================
FILE: .prettierrc.json
================================================
{
"arrowParens": "always",
"bracketSameLine": false,
"bracketSpacing": true,
"embeddedLanguageFormatting": "auto",
"htmlWhitespaceSensitivity": "css",
"insertPragma": false,
"jsxSingleQuote": true,
"printWidth": 120,
"proseWrap": "preserve",
"quoteProps": "as-needed",
"requirePragma": false,
"semi": true,
"singleAttributePerLine": true,
"singleQuote": true,
"tabWidth": 4,
"trailingComma": "es5",
"useTabs": false,
"vueIndentScriptAndStyle": false,
"endOfLine": "lf"
}
================================================
FILE: .scripts/popclip/Config.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Actions</key>
<array>
<dict>
<key>Shell Script File</key>
<string>Pot.sh</string>
<key>Image File</key>
<string>Pot.png</string>
<key>Title</key>
<string>Pot Translate</string>
</dict>
</array>
<key>Credits</key>
<array>
<dict>
<key>Link</key>
<string>https://pot-app.com/</string>
<key>Name</key>
<string>pot-app</string>
</dict>
</array>
<key>Extension Description</key>
<string>Translate text with Pot.</string>
<key>Extension Identifier</key>
<string>com.pot-app.popclip.extension.desktop</string>
<key>Extension Image File</key>
<string>Pot.png</string>
<key>Extension Name</key>
<string>Pot</string>
<key>Required OS Version</key>
<string>10.13</string>
</dict>
</plist>
================================================
FILE: .scripts/popclip/Pot.sh
================================================
curl -Lsd "$POPCLIP_TEXT" "127.0.0.1:60828"
if [ $? -eq 0 ]; then
exit 0
else
open -g -a pot
sleep 2
curl -Lsd "$POPCLIP_TEXT" "127.0.0.1:60828/translate"
fi
================================================
FILE: .scripts/popclip/build.sh
================================================
rm Pot.popclipextz
mkdir Pot.popclipext
cp Config.plist Pot.popclipext
cp Pot.png Pot.popclipext
cp Pot.sh Pot.popclipext
zip -r Pot.popclipextz Pot.popclipext
rm -r Pot.popclipext
================================================
FILE: .scripts/snipdo/build.sh
================================================
zip pot.pbar pot.json pot.png pot.ps1
================================================
FILE: .scripts/snipdo/pot.json
================================================
{
"name": "Pot Translation",
"identifier": "com.pot-app.snipdoext.desktop",
"icon": "pot.png",
"actions": [
{
"title": "Pot Translation",
"icon": "pot.png",
"powershellFile": "pot.ps1"
}
]
}
================================================
FILE: .scripts/snipdo/pot.ps1
================================================
param(
[string]$PLAIN_TEXT
)
$encode_text = [System.Text.Encoding]::UTF8.GetBytes($PLAIN_TEXT)
curl 127.0.0.1:60828/translate -Method POST -Body $encode_text -UseBasicParsing
================================================
FILE: .vscode/extensions.json
================================================
{
"recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer", "vadimcn.vscode-lldb"]
}
================================================
FILE: .vscode/launch.json
================================================
{
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Tauri Development Debug",
"cargo": {
"args": ["build", "--manifest-path=./src-tauri/Cargo.toml", "--no-default-features"]
},
"preLaunchTask": "ui:dev"
},
{
"type": "lldb",
"request": "launch",
"name": "Tauri Production Debug",
"cargo": {
"args": ["build", "--release", "--manifest-path=./src-tauri/Cargo.toml"]
},
"preLaunchTask": "ui:build"
}
]
}
================================================
FILE: .vscode/tasks.json
================================================
{
"version": "2.0.0",
"tasks": [
{
"label": "tauri:dev",
"type": "shell",
"command": "pnpm",
"args": ["tauri", "dev"]
},
{
"label": "tauri:build",
"type": "shell",
"command": "pnpm",
"args": ["tauri", "build"]
},
{
"label": "ui:dev",
"type": "shell",
"isBackground": true,
"command": "pnpm",
"args": ["dev"]
},
{
"label": "ui:build",
"type": "shell",
"command": "pnpm",
"args": ["build"]
}
]
}
================================================
FILE: CHANGELOG
================================================
## 3.0.7 (2025-5-10)
### New feature:
- signed macOS app
### Bugs fixed:
- fix screenshot on macOS
- rm tray click event on macOS
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
<img width="200px" src="public/icon.svg" align="left"/>
# Pot (派了个萌的翻译器)
> 🌈 一个跨平台的划词翻译软件 ([QQ 频道](https://pd.qq.com/s/akns94e1r))







<br/>
<hr/>
<div align="center">
<h3>中文 | <a href='./README_EN.md'>English</a> | <a href='./README_KR.md'> 한글 </a></h3>
<table>
<tr>
<td> <img src="asset/1.png">
<td> <img src="asset/2.png">
<td> <img src="asset/3.png">
</table>
# 目录
</div>
- [使用说明](#使用说明)
- [特色功能](#特色功能)
- [支持接口](#支持接口)
- [插件系统](#插件系统)
- [安装指南](#安装指南)
- [外部调用](#外部调用)
- [Wayland 支持](#wayland-支持)
- [国际化](#国际化weblate)
- [贡献者](#贡献者)
- [感谢](#感谢)
<div align="center">
# 使用说明
| 划词翻译 | 输入翻译 | 外部调用 |
| ---------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------------- |
| 鼠标选中需要翻译的文本,按下设置的划词翻译快捷键即可 | 按下输入翻译快捷键呼出翻译窗口,输入待翻译文本后按下 回车 翻译 | 通过被其他软件调用实现更加方便高效的功能, 详见 [外部调用](#外部调用) |
| <img src="asset/eg1.gif"/> | <img src="asset/eg2.gif"/> | <img src="asset/eg3.gif"/> |
| 剪切板监听模式 | 截图 OCR | 截图翻译 |
| ---------------------------------------------------------------------- | ------------------------------------------------- | ------------------------------------------------ |
| 在任意翻译面板上点击左上角图标启动剪切板监听默认,复制文字即可完成翻译 | 按下截图 OCR 快捷键后框选需要识别区域即可完成识别 | 按下截图翻译快捷键后框选需要识别区域即可完成翻译 |
| <img src="asset/eg4.gif"/> | <img src="asset/eg5.gif"/> | <img src="asset/eg6.gif"/> |
</div>
<div align="center">
# 特色功能
</div>
- [x] 多接口并行翻译 ([支持接口](#支持接口))
- [x] 多接口文字识别 ([支持接口](#支持接口))
- [x] 多接口语音合成 ([支持接口](#支持接口))
- [x] 导出到生词本 ([支持接口](#支持接口))
- [x] 外部调用 ([详情](#外部调用))
- [x] 支持插件系统 ([插件系统](#插件系统))
- [x] 支持所有 PC 平台 (Windows, macOS, Linux)
- [x] 支持 Wayland (在 KDE、Gnome 以及 Hyprland 上测试)
- [x] 多语言支持
<div align="center">
# 支持接口
</div>
## 翻译
- [x] [OpenAI](https://platform.openai.com/)
- [x] [智谱 AI](https://www.zhipuai.cn/)
- [x] [Gemini Pro](https://gemini.google.com/)
- [x] [Ollama](https://www.ollama.com/) (离线)
- [x] [阿里翻译](https://www.aliyun.com/product/ai/alimt)
- [x] [百度翻译](https://fanyi.baidu.com/)
- [x] [彩云小译](https://fanyi.caiyunapp.com/)
- [x] [腾讯翻译君](https://fanyi.qq.com/)
- [x] [腾讯交互翻译](https://transmart.qq.com/)
- [x] [火山翻译](https://translate.volcengine.com/)
- [x] [小牛翻译](https://niutrans.com/)
- [x] [Google](https://translate.google.com)
- [x] [Bing](https://learn.microsoft.com/zh-cn/azure/cognitive-services/translator/)
- [x] [Bing 词典](https://www.bing.com/dict)
- [x] [DeepL](https://www.deepl.com/)
- [x] [有道翻译](https://ai.youdao.com/)
- [x] [剑桥词典](https://dictionary.cambridge.org/)
- [x] [Yandex](https://translate.yandex.com/)
- [x] [Lingva](https://github.com/TheDavidDelta/lingva-translate) ([插件](https://github.com/pot-app/pot-app-translate-plugin-template))
- [x] [Tatoeba](https://tatoeba.org/) ([插件](https://github.com/pot-app/pot-app-translate-plugin-tatoeba))
- [x] [ECDICT](https://github.com/skywind3000/ECDICT) ([插件](https://github.com/pot-app/pot-app-translate-plugin-ecdict))
更多接口支持见 [插件系统](#插件系统)
## 文字识别
- [x] 系统 OCR (离线)
- [x] [Windows.Media.OCR](https://learn.microsoft.com/en-us/uwp/api/windows.media.ocr.ocrengine?view=winrt-22621) on Windows
- [x] [Apple Vision Framework](https://developer.apple.com/documentation/vision/recognizing_text_in_images) on MacOS
- [x] [Tesseract OCR](https://github.com/tesseract-ocr) on Linux
- [x] [Tesseract.js](https://tesseract.projectnaptha.com/) (离线)
- [x] [百度](https://ai.baidu.com/tech/ocr/general)
- [x] [腾讯](https://cloud.tencent.com/product/ocr-catalog)
- [x] [火山](https://www.volcengine.com/product/OCR)
- [x] [迅飞](https://www.xfyun.cn/services/common-ocr)
- [x] [腾讯图片翻译](https://cloud.tencent.com/document/product/551/17232)
- [x] [百度图片翻译](https://fanyi-api.baidu.com/product/22)
- [x] [Simple LaTeX](https://simpletex.cn/)
- [x] [OCRSpace](https://ocr.space/) ([插件](https://github.com/pot-app/pot-app-recognize-plugin-template))
- [x] [Rapid](https://github.com/RapidAI/RapidOcrOnnx) (离线 [插件](https://github.com/pot-app/pot-app-recognize-plugin-rapid))
- [x] [Paddle](https://github.com/hiroi-sora/PaddleOCR-json) (离线 [插件](https://github.com/pot-app/pot-app-recognize-plugin-paddle))
更多接口支持见 [插件系统](#插件系统)
## 语音合成
- [x] [Lingva](https://github.com/thedaviddelta/lingva-translate)
更多接口支持见 [插件系统](#插件系统)
## 生词本
- [x] [Anki](https://apps.ankiweb.net/)
- [x] [欧路词典](https://dict.eudic.net/)
- [x] [有道](https://www.youdao.com/) ([插件](https://github.com/pot-app/pot-app-collection-plugin-youdao))
- [x] [扇贝](https://web.shanbay.com/web/main) ([插件](https://github.com/pot-app/pot-app-collection-plugin-shanbay))
更多接口支持见 [插件系统](#插件系统)
<div align="center">
# 插件系统
</div>
软件内置接口数量有限,但是您可以通过插件系统来扩展软件的功能。
## 插件安装
你可以在 [Plugin List](https://pot-app.com/plugin.html) 查找你需要的插件,然后前往插件仓库下载插件。
pot 插件的扩展名为 `.potext`, 下载得到`.potext`文件之后, 在 偏好设置-服务设置-添加外部插件-安装外部插件 选择对应的 `.potext` 即可安装成功,添加到服务列表中即可像内置服务一样正常使用了。
### 故障排除
- 找不到指定的模块 (Windows)
出现类似这样的报错是因为系统缺少 C++库,前往[这里](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2015-2017-2019-and-2022)安装即可解决问题。
- 不是有效的 Win32 应用程序 (Windows)
出现类似这样的报错说明你没有下载对应系统或者架构的插件,前往插件仓库下载正确的插件即可解决问题。
## 插件开发
在 [Plugin List](https://pot-app.com/plugin.html) 中的 [模板](https://pot-app.com/plugin.html#%E6%A8%A1%E6%9D%BF) 章节提供了各种插件的开发模板,具体的开发文档请查看对应的模板仓库。
<div align="center">
# 安装指南
</div>
## Windows
### 通过 Winget 安装
```powershell
winget install Pylogmon.pot
```
### 手动安装
1. 在 [Release](https://github.com/pot-app/pot-desktop/releases/latest) 页面下载最新 `exe` 安装包。
- 64 位机器下载 `pot_{version}_x64-setup.exe`
- 32 位机器下载 `pot_{version}_x86-setup.exe`
- arm64 机器下载 `pot_{version}_arm64-setup.exe`
2. 双击安装包进行安装。
### 故障排除
- 启动后没有界面,点击托盘图标没有反应
检查是否卸载/禁用了 WebView2,如果卸载/禁用了 WebView2,请手动安装 WebView2 或将其恢复。
如果是企业版系统不方便安装或无法安装 WebView2,请尝试在 [Release](https://github.com/pot-app/pot-desktop/releases/latest) 下载内置 WebView2 的版本 `pot_{version}_{arch}_fix_webview2_runtime-setup.exe`
若问题仍然存在请尝试使用 Windows7 兼容模式启动。
## MacOS
### 通过 Brew 安装
1. 添加我们的 tap:
```bash
brew tap pot-app/homebrew-tap
```
2. 安装 pot:
```bash
brew install --cask pot
```
3. 更新 pot
```bash
brew upgrade --cask pot
```
### 手动安装
1. 从 [Release](https://github.com/pot-app/pot-desktop/releases/latest) 页面下载最新的 `dmg` 安装包。(如果您使用的是 M1 芯片,请下载名为`pot_{version}_aarch64.dmg`的安装包,否则请下载名为`pot_{version}_x64.dmg`的安装包)
2. 双击下载的文件后将 pot 拖入 Applications 文件夹即可完成安装。
### 故障排除
- 由于开发者无法验证,“pot”无法打开。
点击 取消 按钮,然后去 设置 -> 隐私与安全性 页面,点击 仍要打开 按钮,然后在弹出窗口里点击 打开 按钮即可,以后打开 pot 就再也不会有任何弹窗告警了
如果在 隐私与安全性 中找不到以上选项,或启动时提示文件损坏。打开 Terminal.app,并输入以下命令,然后重启 pot 即可:
```bash
sudo xattr -d com.apple.quarantine /Applications/pot.app
```
- 如果每次打开时都遇到辅助功能权限提示,或者无法进行划词翻译,请前往设置 -> 隐私与安全 -> 辅助功能,移除 “pot”,并重新添加 “pot”。
## Linux
### Debian/Ubuntu
1. 从 [Release](https://github.com/pot-app/pot-desktop/releases/latest) 页面下载最新的对应架构的 `deb` 安装包。
2. 使用 `apt-get` 进行安装
```bash
sudo apt-get install ./pot_{version}_amd64.deb
```
### Arch/Manjaro
> [!WARNING]
> 在最新版本的 [Webkit2Gtk](https://archlinux.org/packages/extra/x86_64/webkit2gtk) (2.42.0) 中,由于 Nvidia 专有驱动未完全实现 DMABUF,将导致无法启动和崩溃的情况发生。<br>
> 请降级或在 `/etc/environment` (或者其他设置环境变量的地方)中加入 `WEBKIT_DISABLE_DMABUF_RENDERER=1` 环境变量关闭 DMABUF 的使用。
1. 在 [AUR](https://aur.archlinux.org/packages?O=0&K=pot-translation) 查看
使用 `AUR helper` 安装:
```bash
yay -S pot-translation # 或 pot-translation-bin
# paru -S pot-translation # 或 pot-translation-bin
```
2. 如果你使用 `archlinuxcn` 源,可以直接使用 pacman 安装
```bash
sudo pacman -S pot-translation
```
### Flatpak
> [!WARNING]
> Flatpak 版本缺失托盘图标。
<a href='https://flathub.org/apps/com.pot_app.pot'>
<img width='240' alt='Download on Flathub' src='https://flathub.org/api/badge?locale=zh-Hans'/>
</a>
<div align="center">
# 外部调用
</div>
Pot 提供了完整的 HTTP 接口,以便可以被其他软件调用。您可以通过向 `127.0.0.1:port` 发送 HTTP 请求来调用 pot,其中的`port`是 pot 监听的端口号,默认为`60828`,可以在软件设置中进行更改。
## API 文档:
```bash
POST "/" => 翻译指定文本(body为需要翻译的文本),
GET "/config" => 打开设置,
POST "/translate" => 翻译指定文本(同"/"),
GET "/selection_translate" => 划词翻译,
GET "/input_translate" => 输入翻译,
GET "/ocr_recognize" => 截图OCR,
GET "/ocr_translate" => 截图翻译,
GET "/ocr_recognize?screenshot=false" => 截图OCR(不使用软件内截图),
GET "/ocr_translate?screenshot=false" => 截图翻译(不使用软件内截图),
GET "/ocr_recognize?screenshot=true" => 截图OCR,
GET "/ocr_translate?screenshot=true" => 截图翻译,
```
## 示例:
- 调用划词翻译:
如果想要调用 pot 划词翻译,只需向`127.0.0.1:port`发送请求即可。
例如通过 curl 发送请求:
```bash
curl "127.0.0.1:60828/selection_translate"
```
## 不使用软件内截图
这一功能可以让您在不使用软件内截图的情况下调用截图 OCR/截图翻译功能,这样您就可以使用您喜欢的截图工具来截图了,也可以解决在某些平台下 pot 自带的截图无法使用的问题。
### 调用流程
1. 使用其他截图工具截图
2. 将截图保存在 `$CACHE/com.pot-app.desktop/pot_screenshot_cut.png`
3. 向`127.0.0.1:port/ocr_recognize?screenshot=false`发送请求即可调用成功
> `$CACHE`为系统缓存目录,例如在 Windows 上为`C:\Users\{用户名}\AppData\Local\com.pot-app.desktop\pot_screenshot_cut.png`
### 示例
在 Linux 下调用 Flameshot 进行截图 OCR:
```bash
rm ~/.cache/com.pot-app.desktop/pot_screenshot_cut.png && flameshot gui -s -p ~/.cache/com.pot-app.desktop/pot_screenshot_cut.png && curl "127.0.0.1:60828/ocr_recognize?screenshot=false"
```
## 现有用法 (快捷划词翻译)
### SnipDo (Windows)
1. 从 [Microsoft Store](https://apps.microsoft.com/store/detail/snipdo/9NPZ2TVKJVT7) 下载安装 SnipDo。
2. 从 [Release](https://github.com/pot-app/pot-desktop/releases/latest) 下载 pot 的 SnipDo 扩展 (pot.pbar)
3. 双击下载的扩展文件完成安装。
4. 选中文字,可以看到弹出的 SnipDo 工具条,点击翻译按钮即可翻译。
### PopClip (MacOS)
1. 从 [App Store](https://apps.apple.com/us/app/popclip/id445189367?mt=12) 下载安装 PopClip
2. 从 [Release](https://github.com/pot-app/pot-desktop/releases/latest) 下载 pot 的 PopClip 扩展 (pot.popclipextz)
3. 双击下载的扩展文件完成安装。
4. 在 PopClip 的扩展中启用 pot 扩展,选中文本即可点击翻译。
### Starry (Linux)
> Starry 目前仍处于开发阶段,因此您只能手动编译它。
Github: [ccslykx/Starry](https://github.com/ccslykx/Starry)
<div align="center">
# Wayland 支持
</div>
由于各大发行版对于 Wayland 的支持程度不同,所以 pot 本身没法做到特别完美的支持,这里可以提供一些常见问题的解决方案,通过合理的设置之后,pot 也可以在 Wayland 下完美运行。
## 快捷键无法使用
由于 Tauri 的快捷键方案并没有支持 Wayland,所以 pot 应用内的快捷键设置在 Wayland 下无法使用。 您可以设置系统快捷用 curl 发送请求来触发 pot,详见[外部调用](#外部调用)
## 截图无法使用
在一些纯 Wayland 桌面环境/窗口管理器(如 Hyprland)上,pot 内置的截图无法使用,这时可以通过使用其他截图工具代替,详见 [不使用软件内截图](#不使用软件内截图)
下面给出在 Hyprland 下的配置示例(通过 grim 和 slurp 实现截图):
```conf
bind = ALT, X, exec, grim -g "$(slurp)" ~/.cache/com.pot-app.desktop/pot_screenshot_cut.png && curl "127.0.0.1:60828/ocr_recognize?screenshot=false"
bind = ALT, C, exec, grim -g "$(slurp)" ~/.cache/com.pot-app.desktop/pot_screenshot_cut.png && curl "127.0.0.1:60828/ocr_translate?screenshot=false"
```
其他桌面环境/窗口管理器也是类似的操作
## 划词翻译窗口跟随鼠标位置
由于目前 pot 在 Wayland 下还无法获取到正确的鼠标坐标,所以内部的实现无法工作。 对于某些桌面环境/窗口管理器,可以通过设置窗口规则来实现窗口跟随鼠标位置,这里以 Hyprland 为例:
```conf
windowrulev2 = float, class:(pot), title:(Translator|OCR|PopClip|Screenshot Translate) # Translation window floating
windowrulev2 = move cursor 0 0, class:(pot), title:(Translator|PopClip|Screenshot Translate) # Translation window follows the mouse position.
```
<div align="center">
# 国际化([Weblate](https://hosted.weblate.org/engage/pot-app/))
[](https://hosted.weblate.org/engage/pot-app/)
[](https://hosted.weblate.org/engage/pot-app/)
</div>
<div align="center">
# 贡献者
</div>
<img src="https://github.com/pot-app/.github/blob/master/pot-desktop-contributions.svg?raw=true" width="100%"/>
## 手动编译
### 环境要求
Node.js >= 18.0.0
pnpm >= 8.5.0
Rust >= 1.80.0
### 开始编译
1. Clone 仓库
```bash
git clone https://github.com/pot-app/pot-desktop.git
```
2. 安装依赖
```bash
cd pot-desktop
pnpm install
```
3. 安装依赖(仅 Linux 需要)
```bash
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libayatana-appindicator3-dev librsvg2-dev patchelf libxdo-dev libxcb1 libxrandr2 libdbus-1-3
```
4. 开发调试
```bash
pnpm tauri dev # Run the app in development mode
```
5. 打包构建
```bash
pnpm tauri build # Build into installation package
```
<div align="center">
# 感谢
</div>
- [Bob](https://github.com/ripperhe/Bob) 灵感来源
- [bob-plugin-openai-translator](https://github.com/yetone/bob-plugin-openai-translator) OpenAI 接口参考
- [@uiYzzi](https://github.com/uiYzzi) 实现思路
- [@Lichenkass](https://github.com/Lichenkass) 维护 Deepin 应用商店中的 pot
- [Tauri](https://github.com/tauri-apps/tauri) 好用的 GUI 框架
<div align="center">
================================================
FILE: README_EN.md
================================================
<img width="200px" src="public/icon.svg" align="left"/>
# Pot (A cute translator)
> A cross-platform translator application ([Telegram Group](https://t.me/pot_app))







<br/>
<hr/>
<div align="center">
<h3><a href='./README.md'>中文</a> | English | <a href='./README_KR.md'> 한글 </a></h3>
<table>
<tr>
<td> <img src="asset/1.png">
<td> <img src="asset/2.png">
<td> <img src="asset/3.png">
</table>
# Table of Contents
</div>
- [Usage](#usage)
- [Features](#features)
- [Supported Services](#supported-services)
- [Plugin System](#plugin-system)
- [Installation](#installation)
- [External Calls](#external-calls)
- [Wayland Support](#wayland-support)
- [Internationalization](#internationalizationweblate)
- [Contributors](#contributors)
- [Thanks](#thanks)
<div align="center">
# Usage
</div>
| Translation by selection | Translate by input | External calls |
| ----------------------------------------------- | --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| Select text and press the shortcut to translate | Press shortcut to open translation window, translate by hitting Enter | More efficient workflow by integrating other apps, see [External Calls](#external-calls) |
| <img src="asset/eg1.gif"/> | <img src="asset/eg2.gif"/> | <img src="asset/eg3.gif"/> |
| Clipboard Listening | Screenshot OCR | Screenshot Translation |
| ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | ---------------------------------------- |
| Click the top left icon on any translation panel to start clipboard listening. Copied text will be translated automatically. | Press shortcut, select area to OCR | Press shortcut, select area to translate |
| <img src="asset/eg4.gif"/> | <img src="asset/eg5.gif"/> | <img src="asset/eg6.gif"/> |
<div align="center">
# Features
</div>
- [x] Parallel translations with multiple services ([Supported Services](#supported-services))
- [x] OCR with multiple services ([Supported Services](#supported-services))
- [x] Text-to-Speech with multiple services ([Supported Services](#supported-services))
- [x] Export to vocabulary apps ([Supported Services](#supported-services))
- [x] External calls ([External Calls](#external-calls))
- [x] Plugin system ([Plugin System](#plugin-system))
- [x] Support Windows, macOS and Linux
- [x] Support Wayland (Tested on KDE, Gnome and Hyprland)
- [x] Multi-language support
<div align="center">
# Supported Services
</div>
## Translation
- [x] [OpenAI](https://platform.openai.com/)
- [x] [ChatGLM](https://www.zhipuai.cn/)
- [x] [Gemini Pro](https://gemini.google.com/)
- [x] [Ollama](https://www.ollama.com/) (Offline)
- [x] [Ali Translate](https://www.aliyun.com/product/ai/alimt)
- [x] [Baidu Translate](https://fanyi.baidu.com/)
- [x] [Caiyun](https://fanyi.caiyunapp.com/)
- [x] [Tencent Transmart](https://fanyi.qq.com/)
- [x] [Tencent Interactive Translate](https://transmart.qq.com/)
- [x] [Volcengine Translate](https://translate.volcengine.com/)
- [x] [NiuTrans](https://niutrans.com/)
- [x] [Google Translate](https://translate.google.com)
- [x] [Bing Translate](https://learn.microsoft.com/zh-cn/azure/cognitive-services/translator/)
- [x] [Bing Dictionary](https://www.bing.com/dict)
- [x] [DeepL](https://www.deepl.com/)
- [x] [Youdao](https://ai.youdao.com/)
- [x] [Cambridge Dictionary](https://dictionary.cambridge.org/)
- [x] [Yandex](https://translate.yandex.com/)
- [x] [Lingva](https://github.com/TheDavidDelta/lingva-translate) ([Plugin](https://github.com/pot-app/pot-app-translate-plugin-template))
- [x] [Tatoeba](https://tatoeba.org/) ([Plugin](https://github.com/pot-app/pot-app-translate-plugin-tatoeba))
- [x] [ECDICT](https://github.com/skywind3000/ECDICT) ([Plugin](https://github.com/pot-app/pot-app-translate-plugin-ecdict))
More Services see [Plugin System](#plugin-system)
## Text Recognize
- [x] System OCR (Offline)
- [x] [Windows.Media.OCR](https://learn.microsoft.com/en-us/uwp/api/windows.media.ocr.ocrengine?view=winrt-22621) on Windows
- [x] [Apple Vision Framework](https://developer.apple.com/documentation/vision/recognizing_text_in_images) on MacOS
- [x] [Tesseract OCR](https://github.com/tesseract-ocr) on Linux
- [x] [Tesseract.js](https://tesseract.projectnaptha.com/) (Offline)
- [x] [Baidu](https://ai.baidu.com/tech/ocr/general)
- [x] [Tencent](https://cloud.tencent.com/product/ocr-catalog)
- [x] [Volcengine](https://www.volcengine.com/product/OCR)
- [x] [iflytek](https://www.xfyun.cn/services/common-ocr)
- [x] [Tencent Image Translate](https://cloud.tencent.com/document/product/551/17232)
- [x] [Baidu Image Translate](https://fanyi-api.baidu.com/product/22)
- [x] [Simple LaTeX](https://simpletex.cn/)
- [x] [OCRSpace](https://ocr.space/) ([Plugin](https://github.com/pot-app/pot-app-recognize-plugin-template))
- [x] [Rapid](https://github.com/RapidAI/RapidOcrOnnx) (Offline [Plugin](https://github.com/pot-app/pot-app-recognize-plugin-rapid))
- [x] [Paddle](https://github.com/hiroi-sora/PaddleOCR-json) (Offline [Plugin](https://github.com/pot-app/pot-app-recognize-plugin-paddle))
More Services see [Plugin System](#plugin-system)
## Text-to-Speech
- [x] [Lingva](https://github.com/thedaviddelta/lingva-translate)
More Services see [Plugin System](#plugin-system)
## Collection
- [x] [Anki](https://apps.ankiweb.net/)
- [x] [Eudic](https://dict.eudic.net/)
- [x] [Youdao](https://www.youdao.com/) ([Plugin](https://github.com/pot-app/pot-app-collection-plugin-youdao))
- [x] [ShanBay](https://web.shanbay.com/web/main) ([Plugin](https://github.com/pot-app/pot-app-collection-plugin-shanbay))
More Services see [Plugin System](#plugin-system)
<div align="center">
# Plugin System
</div>
The built-in services are limited. But you can expand the app's functionality through the plugin system.
## Install Plugin
You can find plugins you need in the [Plugin List](https://pot-app.com/plugin.html), and then go to the plugin repo to download it.
The file extension of pot plugin is `.potext`. After downloading the `.potext` file, go to Preferences - Service Settings - Add External Plugin - Install External Plugin to select the corresponding `.potext` to install it. It will then be added to the service list and can be used like a built-in service.
### Troubleshooting
- The specified module could not be found (Windows)
Errors like this occur because the system lacks C++ libraries,Go to [here](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2015-2017-2019-and-2022) download and install it.
- Not a valid Win32 application (Windows)
An error like this indicates that you did not download the plugin for the corresponding system or architecture. Go to the plugin repository and download the correct plugin to solve the problem.
## Develop Plugin
The [Template](https://pot-app.com/en/plugin.html#template) section in the [Plugin List](https://pot-app.com/en/plugin.html) provides plugin development templates for various plugins. Please check the corresponding template repo for specific documentation.
<div align="center">
# Installation
</div>
## Windows
### Install via Winget
```powershell
winget install Pylogmon.pot
```
### Install Manually
1. Download the installation package ending in `.exe` from the Latest [Release](https://github.com/pot-app/pot-desktop/releases/latest) page.
- 64-bit machine download `pot_{version}_x64-setup.exe`
- 32-bit machine download `pot_{version}_x86-setup.exe`
- arm64 machine download `pot_{version}_arm64-setup.exe`
2. Double click the downloaded file to install it.
### 故障排除
- There is no interface after startup, and there is no response when clicking the tray icon.
Check if WebView2 is uninstalled/disabled, if so, install WebView2 manually or restore it.
If the enterprise edition system is inconvenient to install or cannot install WebView2, please try to download the fix WebView2 version `pot_{version} at [Release](https://github.com/pot-app/pot-desktop/releases/latest) _{arch}_fix_webview2_runtime-setup.exe`
If the issue persists, please try starting in Windows 7 compatibility mode.
## MacOS
### Install via Brew
1. Add our tap:
```bash
brew tap pot-app/homebrew-tap
```
2. Install pot:
```bash
brew install --cask pot
```
3. Upgrade pot
```bash
brew upgrade --cask pot
```
### Install Manually
1. Download the installation package ending in `.dmg` from the Latest [Release](https://github.com/pot-app/pot-desktop/releases/latest) page. (If you are using M1, please download the installation package named `pot_{version}_aarch64.dmg`, otherwise download the installation package named `pot_{version}_x64.dmg`)
2. Double click the downloaded file to install it.
### Troubleshooting
- "pot" can’t be opened because the developer cannot be verified.
Click the Cancel button, then go to the Settings -> Privacy and Security page, click the Still Open button, and then click the Open button in the pop-up window. After that, there will be no more pop-up warnings when opening pot.
If you cannot find the above options in Privacy & Security, or get error prompts such as broken files with Apple Silicon machines. Open Terminal.app and enter the following command (you may need to enter a password halfway through), then restart pot:
```bash
sudo xattr -d com.apple.quarantine /Applications/pot.app
```
- If you encounter a permission prompt every time you open it, or if you cannot perform a shortcut translation, please go to Settings -> Privacy & Security -> Supporting Features to remove pot, and then re-add pot.
## Linux
### Debian/Ubuntu
We provide `deb` packages for Linux.
Please note that: There are two deb package, `universal` is based on `glibc2.28` and `openssl-1.1`, If the regular deb package can't run on your machine due to dependency problems, please download the `universal` package, Due to its low version dependency, it can run on most systems.
### Arch/Manjaro
> [!WARNING]
> In newer version of [Webkit2Gtk](https://archlinux.org/packages/extra/x86_64/webkit2gtk) (2.42.0), Because Nvidia Proprietary drives are not fully implemented DMABUF, it will cause failure to start and crash.<br>
> Please downgrade or add the `WEBKIT_DISABLE_DMABUF_RENDERER=1` environment variable to `/etc/environment` (or other places where environment variables are set) to turn off the use of DMABUF.
1. View on [AUR](https://aur.archlinux.org/packages?O=0&K=pot-translation)
Use aur helper:
```bash
yay -S pot-translation # or pot-translation-bin or pot-translation-git
# or
paru -S pot-translation # or pot-translation-bin or pot-translation-git
```
2. If you are using `archlinuxcn`, you can install directly using pacman:
```bash
sudo pacman -S pot-translation
```
### Flatpak
> [!WARNING]
> The tray icon is missing in Flatpak version.
<a href='https://flathub.org/apps/com.pot_app.pot'>
<img width='240' alt='Download on Flathub' src='https://flathub.org/api/badge?locale=en'/>
</a>
<div align="center">
# External Calls
</div>
Pot provides a complete HTTP interface for integration with other software. You can call pot by sending HTTP requests to `127.0.0.1:port`, where `port` is the listening port of pot, default to `60828`, and can be changed in the app settings.
## API Docs:
```bash
POST "/" => Translate given text (body is text to translate)
GET "/config" => Open settings
POST "/translate" => Translate given text (same as "/")
GET "/selection_translate" => Translate selected text
GET "/input_translate" => Open input translation
GET "/ocr_recognize" => Perform OCR on screenshot
GET "/ocr_translate" => Perform translation on screenshot
GET "/ocr_recognize?screenshot=false" => OCR without taking screenshot
GET "/ocr_translate?screenshot=false" => Translate screenshot without taking screenshot
GET "/ocr_recognize?screenshot=true" => OCR with screenshot
GET "/ocr_translate?screenshot=true" => Translate screenshot
```
## Example:
- Call translation by selection:
To call pot's translation by selection, simply send a request to `127.0.0.1:port`:
E.g. using curl:
```bash
curl "127.0.0.1:60828/selection_translate"
```
## OCR without internal screenshot
This allows you to perform OCR/translation without using pot's internal screenshot, so you can use your own screenshot tools. It also solves the problem where pot's internal screenshot doesn't work on some platforms.
### Workflow:
1. Take screenshot using other tool
2. Save screenshot to `$CACHE/com.pot-app.desktop/pot_screenshot_cut.png`
3. Send request to `127.0.0.1:port/ocr_recognize?screenshot=false` to call
> `$CACHE` is the system cache dir, e.g. `C:\Users\{username}\AppData\Local\com.pot-app.desktop\pot_screenshot_cut.png` on Windows.
### Example
OCR using Flameshot on Linux:
```bash
rm ~/.cache/com.pot-app.desktop/pot_screenshot_cut.png && flameshot gui -s -p ~/.cache/com.pot-app.desktop/pot_screenshot_cut.png && curl "127.0.0.1:60828/ocr_recognize?screenshot=false"
```
## Existing Usages (Quick selection translation)
### SnipDo (Windows)
1. Download and install SnipDo in the [Microsoft Store](https://apps.microsoft.com/store/detail/snipdo/9NPZ2TVKJVT7)
2. Download the SnipDo extension of pot from the Latest [Release](https://github.com/pot-app/pot-desktop/releases/latest) (pot.pbar)
3. Double click the downloaded file to install it.
4. Selection some text, you can see the pot icon in the upper right corner of the selection, click the icon to translate.
### PopClip (MacOS)
1. Download and install PopClip in the [App Store](https://apps.apple.com/us/app/popclip/id445189367?mt=12)
2. Download the PopClip extension of pot from the Latest [Release](https://github.com/pot-app/pot-desktop/releases/latest) (pot.popclipextz)
3. Double click the downloaded file to install it.
4. Enable the pot extension in PopClip settings, and then you can translate by selecting text.
### Starry (Linux)
> Starry is still in the development stage, so you can only compile him manually
Github: [ccslykx/Starry](https://github.com/ccslykx/Starry)
<div align="center">
# Wayland Support
</div>
Due to the varying levels of support for Wayland among different distributions, pot itself cannot achieve perfect compatibility. However, here are some solutions to common issues that can be implemented through proper configuration, allowing pot to run flawlessly on Wayland.
## Shortcut key cannot be used
Due to Tauri's lack of support for Wayland, the shortcut key scheme in the pot application cannot be used under Wayland.
You can set the system shortcut and send a request with `curl` to call pot, see [External Calls](#external-calls) for details
## Screenshot doesn't work
In some pure Wayland desktop environments/window managers (such as Hyprland), the built-in screenshot feature of pot cannot be used. In this case, you can use other screenshot tools instead. For more details, please refer to the section [Not Using Built-in Screenshot](#not-using-built-in-screenshot).
Below is a configuration example for Hyprland using `grim` and `slurp` to achieve screenshot functionality:
```conf
bind = ALT, X, exec, grim -g "$(slurp)" ~/.cache/com.pot-app.desktop/pot_screenshot_cut.png && curl "127.0.0.1:60828/ocr_recognize?screenshot=false"
bind = ALT, C, exec, grim -g "$(slurp)" ~/.cache/com.pot-app.desktop/pot_screenshot_cut.png && curl "127.0.0.1:60828/ocr_translate?screenshot=false"
```
Other desktop environments/window managers also have similar operations.
## The translation window follows the mouse position.
Due to the current inability of pot to obtain accurate mouse coordinates under Wayland, its internal implementation cannot function properly.
For certain desktop environments/window managers, it is possible to achieve window following mouse position by setting window rules. Here we take Hyprland as an example:
```conf
windowrulev2 = float, class:(pot), title:(Translator|OCR|PopClip|Screenshot Translate) # Translation window floating
windowrulev2 = move cursor 0 0, class:(pot), title:(Translator|PopClip|Screenshot Translate) # Translation window follows the mouse position.
```
<div align="center">
# Internationalization([Weblate](https://hosted.weblate.org/engage/pot-app/))
[](https://hosted.weblate.org/engage/pot-app/)
[](https://hosted.weblate.org/engage/pot-app/)
</div>
<div align="center">
# Contributors
</div>
<img src="https://github.com/pot-app/.github/blob/master/pot-desktop-contributions.svg?raw=true" width="100%"/>
## Manual compilation
### Requirements
Node.js >= 18.0.0
pnpm >= 8.5.0
Rust >= 1.80.0
### Start compilation
1. Clone the repository
```bash
git clone https://github.com/pot-app/pot-desktop.git
```
2. Install dependencies
```bash
cd pot-desktop
pnpm install
```
3. Install dependencies(Only Linux)
```bash
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libayatana-appindicator3-dev librsvg2-dev patchelf libxdo-dev libxcb1 libxrandr2 libdbus-1-3
```
4. Development (Optional)
```bash
pnpm tauri dev # Run the app in development mode
```
5. Build
```bash
pnpm tauri build # Build into installation package
```
<div align="center">
# Acknowledgement
</div>
- [Bob](https://github.com/ripperhe/Bob) Inspiration
- [bob-plugin-openai-translator](https://github.com/yetone/bob-plugin-openai-translator) OpenAI API Reference
- [@uiYzzi](https://github.com/uiYzzi) Implementation ideas
- [@Lichenkass](https://github.com/Lichenkass) Maintaining the Deepin App Store.
- [Tauri](https://github.com/tauri-apps/tauri) A user-friendly GUI framework.
<div align="center">
================================================
FILE: README_KR.md
================================================
<img width="200px" src="public/icon.svg" align="left"/>
# Pot (간편 번역기)
> A cross-platform translator application ([Telegram Group](https://t.me/pot_app))







<br/>
<hr/>
<div align="center">
<h3><a href='./README.md'>中文</a> | <a href='./README_EN.md'> English </a> | 한글</h3>
<table>
<tr>
<td> <img src="asset/1.png">
<td> <img src="asset/2.png">
<td> <img src="asset/3.png">
</table>
# 목차
</div>
- [사용법](#usage)
- [기능](#features)
- [지원 서비스](#supported-services)
- [플러그인 시스템](#plugin-system)
- [설치](#installation)
- [외부호출](#external-calls)
- [Wayland 지원](#wayland-support)
- [다국어](#internationalizationweblate)
- [기여자](#contributors)
- [감사한 사람들](#thanks)
<div align="center">
# 사용법
</div>
| 선택영역 자동번역 | 입력단어 번역 | 외부호출 |
| --------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------ |
| 문장을 선택하고 *번역단축키*를 누릅니다 | 번역창을 열고, 번역할 문장을 입력합니다 | 다른 프로그램과 연동하여 효율적으로 사용가능합니다, [External Calls](#external-calls) 참고 |
| <img src="asset/eg1.gif"/> | <img src="asset/eg2.gif"/> | <img src="asset/eg3.gif"/> |
| 클립보드 자동인식 | 스크린샷 OCR언어인식 | 스크린샷 자동번역 |
| -------------------------------------------------------------------- | --------------------------------- | ---------------------------------------- |
| 클립보드 모니터링 옵션을 통해, 텍스트를 복사하면 자동으로 번역합니다 | 화면캡쳐를 통해 문자를 인식합니다 | 화면을 캡쳐하면 인식한 문장을 번역합니다 |
| <img src="asset/eg4.gif"/> | <img src="asset/eg5.gif"/> | <img src="asset/eg6.gif"/> |
<div align="center">
# 기능
</div>
- [x] 여러 번역 사이트를 사용한 동시번역 ([상세 페이지](#supported-services))
- [x] 문자인식 OCR ([상세 페이지](#supported-services))
- [x] 텍스트 음성 변환 ([상세 페이지](#supported-services))
- [x] 사전 앱에 내보내기 ([상세 페이지](#supported-services))
- [x] 외부호출 ([External Calls](#external-calls))
- [x] 플러그인 시스템 ([Plugin System](#plugin-system))
- [x] 운영체제 지원 - Windows, macOS and Linux
- [x] Wayland 지원 (Tested on KDE, Gnome and Hyprland)
- [x] 다중언어 지원
<div align="center">
# 상세 페이지
</div>
## 번역
- [x] [OpenAI](https://platform.openai.com/)
- [x] [ChatGLM](https://www.zhipuai.cn/)
- [x] [Gemini Pro](https://gemini.google.com/)
- [x] [Ollama](https://www.ollama.com/) (Offline)
- [x] [Ali Translate](https://www.aliyun.com/product/ai/alimt)
- [x] [Baidu Translate](https://fanyi.baidu.com/)
- [x] [Caiyun](https://fanyi.caiyunapp.com/)
- [x] [Tencent Transmart](https://fanyi.qq.com/)
- [x] [Tencent Interactive Translate](https://transmart.qq.com/)
- [x] [Volcengine Translate](https://translate.volcengine.com/)
- [x] [NiuTrans](https://niutrans.com/)
- [x] [Google Translate](https://translate.google.com)
- [x] [Bing Translate](https://learn.microsoft.com/zh-cn/azure/cognitive-services/translator/)
- [x] [Bing Dictionary](https://www.bing.com/dict)
- [x] [DeepL](https://www.deepl.com/)
- [x] [Youdao](https://ai.youdao.com/)
- [x] [Cambridge Dictionary](https://dictionary.cambridge.org/)
- [x] [Yandex](https://translate.yandex.com/)
- [x] [Lingva](https://github.com/TheDavidDelta/lingva-translate) ([Plugin](https://github.com/pot-app/pot-app-translate-plugin-template))
- [x] [Tatoeba](https://tatoeba.org/) ([Plugin](https://github.com/pot-app/pot-app-translate-plugin-tatoeba))
- [x] [ECDICT](https://github.com/skywind3000/ECDICT) ([Plugin](https://github.com/pot-app/pot-app-translate-plugin-ecdict))
추가항목은 다음을 참고 [Plugin System](#plugin-system)
## 문자인식
- [x] System OCR (Offline)
- [x] [Windows.Media.OCR](https://learn.microsoft.com/en-us/uwp/api/windows.media.ocr.ocrengine?view=winrt-22621) on Windows
- [x] [Apple Vision Framework](https://developer.apple.com/documentation/vision/recognizing_text_in_images) on MacOS
- [x] [Tesseract OCR](https://github.com/tesseract-ocr) on Linux
- [x] [Tesseract.js](https://tesseract.projectnaptha.com/) (Offline)
- [x] [Baidu](https://ai.baidu.com/tech/ocr/general)
- [x] [Tencent](https://cloud.tencent.com/product/ocr-catalog)
- [x] [Volcengine](https://www.volcengine.com/product/OCR)
- [x] [iflytek](https://www.xfyun.cn/services/common-ocr)
- [x] [Tencent Image Translate](https://cloud.tencent.com/document/product/551/17232)
- [x] [Baidu Image Translate](https://fanyi-api.baidu.com/product/22)
- [x] [Simple LaTeX](https://simpletex.cn/)
- [x] [OCRSpace](https://ocr.space/) ([Plugin](https://github.com/pot-app/pot-app-recognize-plugin-template))
- [x] [Rapid](https://github.com/RapidAI/RapidOcrOnnx) (Offline [Plugin](https://github.com/pot-app/pot-app-recognize-plugin-rapid))
- [x] [Paddle](https://github.com/hiroi-sora/PaddleOCR-json) (Offline [Plugin](https://github.com/pot-app/pot-app-recognize-plugin-paddle))
추가항목은 다음을 참고 [Plugin System](#plugin-system)
## 문자-음성변환
- [x] [Lingva](https://github.com/thedaviddelta/lingva-translate)
추가항목은 다음을 참고 [Plugin System](#plugin-system)
## 사전
- [x] [Anki](https://apps.ankiweb.net/)
- [x] [Eudic](https://dict.eudic.net/)
- [x] [Youdao](https://www.youdao.com/) ([Plugin](https://github.com/pot-app/pot-app-collection-plugin-youdao))
- [x] [ShanBay](https://web.shanbay.com/web/main) ([Plugin](https://github.com/pot-app/pot-app-collection-plugin-shanbay))
추가항목은 다음을 참고 [Plugin System](#plugin-system)
<div align="center">
# -플러그인- 시스템
</div>
정해진 기본 설정항목 외에, -플러그인 시스템-을 통해 사용자가 원하는 기능을 추가할 수 있습니다.
## -플러그인-의 설치
설치가능한 플러그인 항목은 다음을 참고하세요 [Plugin List](https://pot-app.com/plugin.html). 그리고 필요한 항목을 다운받으십시오.
플러그인의 확장자는 `.potext` 입니다. 다운받은 `.potext` 확장자 파일을 프로그램 설정메뉴 - 서비스 - Add External Plugin - Install External Plugin 메뉴에서 등록하여 설치합니다. 파일을 등록하면 해당 항목을 프로그램의 사용목록에 표시가 되어 사용이 가능해 집니다.
### 문제해결
- 특정모듈을 불러오지 못할 때 (Windows)
C++ 라이브러리가 없을 때 이러한 문제가 주로 발생합니다. 다음페이지를 방문하여 필요한 라이브러리를 설치합니다. [참고 페이지](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2015-2017-2019-and-2022)
- 유효하지 않은 Win32 프로그램 (Windows)
시스템 또는 프로그램과 호환되지 않는 플러그인을 다운받아 설치한 경우입니다. 플러그인에서 적절한 파일을 다운받았는지 확인하시고 재설치 하십시오.
## -플러그인-의 개발
템플릿 [Template](https://pot-app.com/en/plugin.html#template) 항목에서 다양한 항목을 플러그인들을 찾을 수 있습니다 [Plugin List](https://pot-app.com/en/plugin.html). 이 곳에서 필요한 문서를 참고하십시오.
<div align="center">
# 설치방법
</div>
## Windows 윈도우
### Winget 을 이용한 설치
```powershell
winget install Pylogmon.pot
```
### 수동 설치
1. 최신버전 다운로드 페이지 [Release](https://github.com/pot-app/pot-desktop/releases/latest)에서 `.exe` 파일을 다운받습니다.
- 64-bit 버전 사용시, `pot_{version}_x64-setup.exe`
- 32-bit 버전 사용시, `pot_{version}_x86-setup.exe`
- arm64 버전 사용시, `pot_{version}_arm64-setup.exe`
2. 더블클릭하여 설치를 합니다.
### 문제해결
- 설치 후 프로그램창이 보이지 않거나 오른쪽 하단 시스템 트레이 항목에 아이콘이 표시되지 않을 경우,
윈도우-브라우저에서 사용하는 WebView2 기능이 설치되지 않았거나 비활성화 된 경우 입니다. 이 때는 WebView2 를 설치하거나 기능을 재설정 하십시오.
회사/기업 사용자의 경우 WebView2 기능이 설치되지 않았거나 비활성화된 경우가 있습니다. 이 경우 다음을 설치하십시오. WebView2 version `pot_{version} at [Release](https://github.com/pot-app/pot-desktop/releases/latest) _{arch}_fix_webview2_runtime-setup.exe`
문제가 해결되지 않는 경우, Windows 7 compatibility mode에서 시도해 보십시오.
## MacOS 맥OS
### Brew를 통한 설치
1. 탭에 추가:
```bash
brew tap pot-app/homebrew-tap
```
2. 설치:
```bash
brew install --cask pot
```
3. 업데이트:
```bash
brew upgrade --cask pot
```
### 수동설치
1. 최신버전 다운로드 페이지 [Release](https://github.com/pot-app/pot-desktop/releases/latest)에서 `.dmg` 파일을 다운받습니다. (M1 사용자이면, 다음 파일명을 다운로드 합니다 `pot_{version}_aarch64.dmg`, 기타 사용자는 다음 파일을 다운로드 합니다. `pot_{version}_x64.dmg`)
2. 더블클릭하여 설치를 합니다.
### 문제해결
- "pot" 을 열 수 없는 경우는 개발자 인증이 되지 않아서 입니다.
취소 버튼을 누르고 설정 메뉴로 들어갑니다 -> 개인정보 및 보안 메뉴에서 설정을 합니다.
열기 버튼을 클릭한 다음 팝업 창에서 열기 버튼을 클릭합니다. 그 이후에는 포트를 열 때 더 이상 팝업 경고가 표시되지 않습니다.
개인정보 및 보안에서 위의 옵션을 찾을 수 없거나 Apple Silicon 컴퓨터에서 파일 손상과 같은 오류 메시지가 표시되는 경우. Terminal.app을 열고 다음 명령을 입력한 다음(중간에 비밀번호를 입력해야 할 수도 있음), pot을 다시 시작합니다:
```bash
sudo xattr -d com.apple.quarantine /Applications/pot.app
```
- 열 때마다 권한 프롬프트가 나타나거나 바로 가기 번역을 수행할 수 없는 경우 설정 -> 개인정보 및 보안 -> 지원 기능으로 이동하여 Pot을 제거한 다음 Pot을 다시 추가하세요..
## Linux
### Debian/Ubuntu 데비안/우분투
리눅스 환경을 위해 `deb` 파일이 제공됩니다
참고 : 두 가지 버전이 제공됩니다. `glibc2.28`기반의 `universal`과 `openssl-1.1` 버전입니다. 프로그램이 당신의 컴퓨터에서 정상적으로 실행되지 않는다면 dependency와 관련된 문제일 경우가 많습니다. `universal`버전을 사용하면 이전 버전의 dependency를 사용하여 실행하면 대부분 실행이 가능합니다.
### Arch/Manjaro
> [!WARNING]
> In newer version of [Webkit2Gtk](https://archlinux.org/packages/extra/x86_64/webkit2gtk) (2.42.0), Because Nvidia Proprietary drives are not fully implemented DMABUF, it will cause failure to start and crash.<br>
> Please downgrade or add the `WEBKIT_DISABLE_DMABUF_RENDERER=1` environment variable to `/etc/environment` (or other places where environment variables are set) to turn off the use of DMABUF.
1. View on [AUR](https://aur.archlinux.org/packages?O=0&K=pot-translation)
Use aur helper:
```bash
yay -S pot-translation # or pot-translation-bin or pot-translation-git
# or
paru -S pot-translation # or pot-translation-bin or pot-translation-git
```
2. If you are using `archlinuxcn`, you can install directly using pacman:
```bash
sudo pacman -S pot-translation
```
### Flatpak
> [!WARNING]
> 시스템 트레이 아이콘이 Flatpak을 통해 설치하면 표시되지 않습니다.
<a href='https://flathub.org/apps/com.pot_app.pot'>
<img width='240' alt='Download on Flathub' src='https://flathub.org/api/badge?locale=en'/>
</a>
<div align="center">
# 외부호출
</div>
Pot은 완벽한 HTTP 인터페이스를 제공합니다. 이를 통해 다른 프로그램과 연동해서 사용이 가능합니다. 타 프로그램은 HTTP requests를 `127.0.0.1:port` 주소로 보내어 활용할 수 있습니다. 기본 포트는 `60828`입니다. 이는 사용자 설정에서 변경이 가능합니다.
## API 상세:
```bash
POST "/" => Translate given text (body is text to translate)
GET "/config" => Open settings
POST "/translate" => Translate given text (same as "/")
GET "/selection_translate" => Translate selected text
GET "/input_translate" => Open input translation
GET "/ocr_recognize" => Perform OCR on screenshot
GET "/ocr_translate" => Perform translation on screenshot
GET "/ocr_recognize?screenshot=false" => OCR without taking screenshot
GET "/ocr_translate?screenshot=false" => Translate screenshot without taking screenshot
GET "/ocr_recognize?screenshot=true" => OCR with screenshot
GET "/ocr_translate?screenshot=true" => Translate screenshot
```
## 예제:
- 선택영역 자동번역:
"선택영역 자동번역"을 호출하려면 간단히 `127.0.0.1:port`에 호출요청을 합니다:
E.g. curl 사용시:
```bash
curl "127.0.0.1:60828/selection_translate"
```
## 자체스크린샷 미사용 OCR 기능
OCR 및 번역을 위해서 pot은 자체 스크린샷(화면캡쳐)기능을 사용하지 않을 수 있습니다. 자체 화면캡쳐 툴을 사용하면 특정환경에서 자체 스크린샷 기능이 정상적으로 동작하지 않는 것을 해결할 수 있습니다.
### Workflow:
1. 타 스크린샷 프로그램을 사용하여 화면을 캡쳐합니다
2. 캡쳐한 화면을 다음 위치에 저장합니다. `$CACHE/com.pot-app.desktop/pot_screenshot_cut.png`
3. 외부호출을 통해 번역요청을 요청합니다. `127.0.0.1:port/ocr_recognize?screenshot=false`
> `$CACHE` 는 시스템 캐시 폴더입니다. e.g. 윈도우는 다음경로를 확인하세요 `C:\Users\{username}\AppData\Local\com.pot-app.desktop\pot_screenshot_cut.png` .
### 예제
리눅스에서 Flameshot을 활용한 OCR:
```bash
rm ~/.cache/com.pot-app.desktop/pot_screenshot_cut.png && flameshot gui -s -p ~/.cache/com.pot-app.desktop/pot_screenshot_cut.png && curl "127.0.0.1:60828/ocr_recognize?screenshot=false"
```
## Existing Usages (Quick selection translation)
### SnipDo (Windows)
1. SnipDo를 [Microsoft Store](https://apps.microsoft.com/store/detail/snipdo/9NPZ2TVKJVT7) 에서 다운받아 설치합니다.
2. DSnipDo 확장팩을 최신버전 다운 경로에서 [Release](https://github.com/pot-app/pot-desktop/releases/latest) (pot.pbar) 다운받습니다.
3. 더블클릭하여 설치합니다.
4. 특정단어를 선택하게 되면, 선택영역의 오른쪽 윗 부분에 번역아이콘이 보이게 됩니다. 클릭하여 번역을 진행합니다.
### PopClip (MacOS)
1. PopClip를 [App Store](https://apps.apple.com/us/app/popclip/id445189367?mt=12) 에서 다운받아 설치합니다.
2. PopClip 확장팩을 최신버전 다운 경로에서 [Release](https://github.com/pot-app/pot-desktop/releases/latest) (pot.popclipextz) 다운받습니다.
3. 더블클릭하여 설치합니다.
4. PopClip settings에서 기능을 활성화 하면 선택영역의 번역을 할 수 있습니다.
### Starry (Linux)
> Starry는 아직 개발단계에 머물러 있습니다.따라서 사용자가 직업 컴파일해야 합니다.
Github: [ccslykx/Starry](https://github.com/ccslykx/Starry)
<div align="center">
# Wayland 지원
</div>
배포판마다 Wayland에 대한 지원 수준이 다르기 때문에 pot 자체로는 완벽한 호환성을 달성할 수 없습니다. 하지만 다음은 적절한 구성을 통해 구현할 수 있는 몇 가지 일반적인 문제에 대한 해결책으로, Wayland에서 pot을 완벽하게 실행할 수 있습니다.
## 단축키를 적용할 수 없을 때,
타우리Tauri는 웨이랜드Wayland를 지원하지 않기 때문에, pot의 단축키 기능은 웨이랜드Waylan에서 사용할 수 없습니다.
시스템 단축키를 설정하고 `curl`로 요청을 보내 팟을 호출할 수 있으며, 자세한 내용은[External Calls](#external-calls) 을 참조하세요.
## 단축키가 동작하지 않을 때,
일부 순수 웨이랜드Wayland 데스크톱 환경/창 관리자(예: 하이프랜드)에서는 pot의 기본 제공 스크린샷 기능을 사용할 수 없습니다. 이 경우 다른 스크린샷 도구를 대신 사용할 수 있습니다. 자세한 내용은 [Not Using Built-in Screenshot](#not-using-built-in-screenshot) 섹션을 참조하세요.
아래는 스크린샷 기능을 구현하기 위해 `grim`과 `slurp`를 사용하는 Hyprland의 구성 예시입니다:
```conf
bind = ALT, X, exec, grim -g "$(slurp)" ~/.cache/com.pot-app.desktop/pot_screenshot_cut.png && curl "127.0.0.1:60828/ocr_recognize?screenshot=false"
bind = ALT, C, exec, grim -g "$(slurp)" ~/.cache/com.pot-app.desktop/pot_screenshot_cut.png && curl "127.0.0.1:60828/ocr_translate?screenshot=false"
```
다른 데스크톱 환경/창 관리자도 비슷한 작업을 수행합니다.
## 번역창은 마우스 좌표를 따라갑니다.
현재 웨이랜드Wayland에서 정확한 마우스 좌표를 얻을 수 없기 때문에 내부 구현이 제대로 작동하지 않습니다. 특정 데스크톱 환경/창 관리자의 경우 창 규칙을 설정하여 마우스 위치에 따른 창을 구현할 수 있습니다. 여기서는 하이프랜드Hyprland를 예로 들어보겠습니다:
```conf
windowrulev2 = float, class:(pot), title:(Translator|OCR|PopClip|Screenshot Translate) # Translation window floating
windowrulev2 = move cursor 0 0, class:(pot), title:(Translator|PopClip|Screenshot Translate) # Translation window follows the mouse position.
```
<div align="center">
# 다중언어 지원([Weblate](https://hosted.weblate.org/engage/pot-app/))
[](https://hosted.weblate.org/engage/pot-app/)
[](https://hosted.weblate.org/engage/pot-app/)
</div>
<div align="center">
# 기여자
</div>
<img src="https://github.com/pot-app/.github/blob/master/pot-desktop-contributions.svg?raw=true" width="100%"/>
## 사용자 컴파일
### 요구사항
Node.js >= 18.0.0
pnpm >= 8.5.0
Rust >= 1.80.0
### 컴파일 방법
1. repository을 복사합니다
```bash
git clone https://github.com/pot-app/pot-desktop.git
```
2. dependencies를 설치합니다
```bash
cd pot-desktop
pnpm install
```
3. (Only Linux) dependencies를 설치합니다
```bash
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libayatana-appindicator3-dev librsvg2-dev patchelf libxdo-dev libxcb1 libxrandr2 libdbus-1-3
```
4. 개발모드 (Optional)
```bash
pnpm tauri dev # Run the app in development mode
```
5. 빌드
```bash
pnpm tauri build # Build into installation package
```
<div align="center">
# 관련사항
</div>
- [Bob](https://github.com/ripperhe/Bob) Inspiration
- [bob-plugin-openai-translator](https://github.com/yetone/bob-plugin-openai-translator) OpenAI API Reference
- [@uiYzzi](https://github.com/uiYzzi) Implementation ideas
- [@Lichenkass](https://github.com/Lichenkass) Maintaining the Deepin App Store.
- [Tauri](https://github.com/tauri-apps/tauri) A user-friendly GUI framework.
<div align="center">
================================================
FILE: com.pot_app.pot.metainfo.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>com.pot_app.pot</id>
<name>Pot</name>
<summary>A text translation and OCR app</summary>
<summary xml:lang="zh-Hans">一款跨平台的划词翻译和文字识别软件</summary>
<developer id="com.pot_app">
<name>Pylogmon</name>
</developer>
<url type="homepage">https://pot-app.com/</url>
<url type="bugtracker">https://github.com/pot-app/pot-desktop/issues</url>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-3.0-only</project_license>
<description>
<p>A cross-platform software for text translation and recognition.</p>
<p xml:lang="zh-Hans">一款跨平台的划词翻译和文字识别软件</p>
<p>Features</p>
<p xml:lang="zh-Hans">特色功能</p>
<ul>
<li>Parallel translations with multiple services</li>
<li xml:lang="zh-Hans">多接口并行翻译</li>
<li>OCR with multiple services</li>
<li xml:lang="zh-Hans">多接口文字识别</li>
<li>Text-to-speech with multiple services</li>
<li xml:lang="zh-Hans">多接口语音合成</li>
<li>Export to vocabulary apps</li>
<li xml:lang="zh-Hans">导出到生词本</li>
<li>External calls</li>
<li xml:lang="zh-Hans">外部调用</li>
<li>Plugin system</li>
<li xml:lang="zh-Hans">支持插件系统</li>
<li>Cross-platform support (Windows, macOS and Linux)</li>
<li xml:lang="zh-Hans">支持所有 PC 平台 (Windows, macOS, Linux)</li>
<li>Wayland support</li>
<li xml:lang="zh-Hans">支持 Wayland (在 KDE、Gnome 以及 Hyprland 上测试)</li>
<li>Multi-language support</li>
<li xml:lang="zh-Hans">多语言支持</li>
</ul>
</description>
<launchable type="desktop-id">com.pot_app.pot.desktop</launchable>
<screenshots>
<screenshot type="default">
<image>https://github.com/pot-app/pot-desktop/raw/2.7.10/asset/1.png</image>
<caption>Dark Mode</caption>
</screenshot>
<screenshot>
<image>https://github.com/pot-app/pot-desktop/raw/2.7.10/asset/2.png</image>
<caption>Dark/Light Mode</caption>
</screenshot>
<screenshot>
<image>https://github.com/pot-app/pot-desktop/raw/2.7.10/asset/3.png</image>
<caption>Light Mode</caption>
</screenshot>
</screenshots>
<releases>
<release version="3.0.7" date="2025-5-10">
<url type="details">https://github.com/pot-app/pot-desktop/releases/tag/3.0.7</url>
<description>
<p>New feature:</p>
<ul>
<li>Signed macOS app</li>
</ul>
<p>Bugs fixed:</p>
<ul>
<li>fix screenshot on macOS</li>
<li>rm tray click event on macOS</li>
</ul>
</description>
</release>
<release version="3.0.6" date="2024-10-29">
<url type="details">https://github.com/pot-app/pot-desktop/releases/tag/3.0.6</url>
<description>
<p>New feature:</p>
<ul>
<li>Add builtin lingva service</li>
<li>Add support for hebrew</li>
<li>Improve ui translation</li>
</ul>
<p>Bugs fixed:</p>
<ul>
<li>Builtin ecdict can not be save</li>
</ul>
</description>
</release>
<release version="3.0.5" date="2024-06-27">
<url type="details">https://github.com/pot-app/pot-desktop/releases/tag/3.0.5</url>
<description>
<p>Break Change:</p>
<ul>
<li>After version 3.x, old plugins will no longer be available. They will be automatically deleted upon upgrade. Please visit the plugin repository to download and install the new versions. If the plugin developers have not yet updated their plugins, please contact them to request an upgrade.</li>
<li xml:lang="zh-Hans">3.x版本之后旧版插件不再可用,升级后会自动删除旧版插件,请前往插件仓库下载安装新版插件使用,若插件开发者还没适配新版插件,请联系插件开发者升级插件。</li>
</ul>
<p>New feature:</p>
<ul>
<li>Support multiple instance services</li>
<li>Use Javascript plugin system</li>
<li>Enable dev tools</li>
<li>Add Database api for plugin</li>
</ul>
<p>Bugs fixed:</p>
<ul>
<li>Recognize failed</li>
<li>TTS failed</li>
<li>Collection failed</li>
<li>Default Lingva error</li>
</ul>
</description>
</release>
<release version="3.0.4" date="2024-06-26">
<url type="details">https://github.com/pot-app/pot-desktop/releases/tag/3.0.4</url>
<description>
<p>Break Change:</p>
<ul>
<li>After version 3.x, old plugins will no longer be available. They will be automatically deleted upon upgrade. Please visit the plugin repository to download and install the new versions. If the plugin developers have not yet updated their plugins, please contact them to request an upgrade.</li>
<li xml:lang="zh-Hans">3.x版本之后旧版插件不再可用,升级后会自动删除旧版插件,请前往插件仓库下载安装新版插件使用,若插件开发者还没适配新版插件,请联系插件开发者升级插件。</li>
</ul>
<p>New feature:</p>
<ul>
<li>Support multiple instance services</li>
<li>Use Javascript plugin system</li>
<li>Enable dev tools</li>
</ul>
<p>Bugs fixed:</p>
<ul>
<li>Recognize failed</li>
<li>TTS failed</li>
<li>Collection failed</li>
<li>Default Lingva error</li>
</ul>
</description>
</release>
<release version="3.0.3" date="2024-06-26">
<url type="details">https://github.com/pot-app/pot-desktop/releases/tag/3.0.3</url>
<description>
<p>Break Change:</p>
<ul>
<li>After version 3.x, old plugins will no longer be available. They will be automatically deleted upon upgrade. Please visit the plugin repository to download and install the new versions. If the plugin developers have not yet updated their plugins, please contact them to request an upgrade.</li>
<li xml:lang="zh-Hans">3.x版本之后旧版插件不再可用,升级后会自动删除旧版插件,请前往插件仓库下载安装新版插件使用,若插件开发者还没适配新版插件,请联系插件开发者升级插件。</li>
</ul>
<p>New feature:</p>
<ul>
<li>Support multiple instance services</li>
<li>Use Javascript plugin system</li>
<li>Enable dev tools</li>
</ul>
<p>Bugs fixed:</p>
<ul>
<li>Recognize failed</li>
<li>TTS failed</li>
<li>Collection failed</li>
</ul>
</description>
</release>
<release version="3.0.2" date="2024-06-24">
<url type="details">https://github.com/pot-app/pot-desktop/releases/tag/3.0.2</url>
<description>
<p>Break Change:</p>
<ul>
<li>After version 3.x, old plugins will no longer be available. They will be automatically deleted upon upgrade. Please visit the plugin repository to download and install the new versions. If the plugin developers have not yet updated their plugins, please contact them to request an upgrade.</li>
<li xml:lang="zh-Hans">3.x版本之后旧版插件不再可用,升级后会自动删除旧版插件,请前往插件仓库下载安装新版插件使用,若插件开发者还没适配新版插件,请联系插件开发者升级插件。</li>
</ul>
<p>New feature:</p>
<ul>
<li>Support multiple instance services</li>
<li>Use Javascript plugin system</li>
</ul>
<p>Bugs fixed:</p>
<ul>
<li>Recognize failed</li>
<li>TTS failed</li>
<li>Collection failed</li>
</ul>
</description>
</release>
<release version="3.0.1" date="2024-06-24">
<url type="details">https://github.com/pot-app/pot-desktop/releases/tag/3.0.1</url>
<description>
<p>Break Change:</p>
<ul>
<li>After version 3.x, old plugins will no longer be available. They will be automatically deleted upon upgrade. Please visit the plugin repository to download and install the new versions. If the plugin developers have not yet updated their plugins, please contact them to request an upgrade.</li>
<li xml:lang="zh-Hans">3.x版本之后旧版插件不再可用,升级后会自动删除旧版插件,请前往插件仓库下载安装新版插件使用,若插件开发者还没适配新版插件,请联系插件开发者升级插件。</li>
</ul>
<p>New feature:</p>
<ul>
<li>Support multiple instance services</li>
<li>Use Javascript plugin system</li>
</ul>
<p>Bugs fixed:</p>
<ul>
<li>Recognize failed</li>
<li>TTS failed</li>
</ul>
</description>
</release>
<release version="3.0.0" date="2024-06-23">
<url type="details">https://github.com/pot-app/pot-desktop/releases/tag/3.0.0</url>
<description>
<p>New feature:</p>
<ul>
<li>Support multiple instance services</li>
<li>Use Javascript plugin system</li>
</ul>
</description>
</release>
<release version="2.7.10" date="2024-04-14">
<url type="details">https://github.com/pot-app/pot-desktop/releases/tag/2.7.10</url>
<description>
<p>Break Change:</p>
<ul>
<li>If you encountered crashes after upgrade, please reinstall the latest releases of all plugins</li>
<li xml:lang="zh-Hans">如果更新后遇到闪退问题,请重新安装所有插件的最新版本</li>
</ul>
<p>Bugs fixed:</p>
<ul>
<li>Check whether the directory is not empty before uninstall</li>
<li>Fix OpenAI translation prompt description</li>
</ul>
</description>
</release>
<release version="2.7.9" date="2024-03-02">
<url type="details">https://github.com/pot-app/pot-desktop/releases/tag/2.7.9</url>
<description>
<p>Break Change:</p>
<ul>
<li>If you encountered crashes after upgrade, please reinstall the latest releases of all plugins</li>
<li xml:lang="zh-Hans">如果更新后遇到闪退问题,请重新安装所有插件的最新版本</li>
</ul>
<p>Bugs fixed:</p>
<ul>
<li>Support Ollama local large language models</li>
<li>Support for disabling history</li>
</ul>
</description>
</release>
</releases>
<content_rating type="oars-1.1"/>
</component>
================================================
FILE: daemon.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link
rel="icon"
type="image/png"
href="/icon.png"
/>
<title>Pot</title>
</head>
<body>
<div>Daemon</div>
</body>
</html>
================================================
FILE: index.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link
rel="icon"
type="image/png"
href="/icon.png"
/>
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
/>
<script>
var Module;
</script>
<title>Pot</title>
</head>
<body>
<div id="root"></div>
<script
type="module"
src="/src/main.jsx"
></script>
</body>
</html>
================================================
FILE: package.json
================================================
{
"name": "pot",
"private": true,
"version": "3.0.7",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"tauri": "tauri",
"updater": "node updater/updater.mjs",
"updater:fixRuntime": "node updater/updater-for-fix-runtime.mjs"
},
"dependencies": {
"@nextui-org/react": "^2.4.8",
"@nextui-org/theme": "^2.2.11",
"@react-spring/web": "^9.7.5",
"@tauri-apps/api": "^1.6.0",
"crypto-js": "^4.2.0",
"flag-icons": "^7.2.3",
"framer-motion": "^11.11.10",
"i18next": "^23.16.4",
"jose": "^5.9.6",
"jotai": "^2.10.1",
"jsqr": "^1.4.0",
"md5": "^2.3.0",
"nanoid": "^5.0.8",
"next-themes": "^0.3.0",
"ollama": "^0.5.9",
"react": "^18.3.1",
"react-beautiful-dnd": "^13.1.1",
"react-dom": "^18.3.1",
"react-hot-toast": "^2.4.1",
"react-i18next": "^15.1.0",
"react-icons": "^5.3.0",
"react-markdown": "^9.0.1",
"react-router-dom": "^6.27.0",
"react-spinners": "^0.14.1",
"react-use-measure": "^2.1.1",
"tauri-plugin-autostart-api": "github:tauri-apps/tauri-plugin-autostart#v1",
"tauri-plugin-fs-watch-api": "github:tauri-apps/tauri-plugin-fs-watch#v1",
"tauri-plugin-log-api": "github:tauri-apps/tauri-plugin-log#v1",
"tauri-plugin-sql-api": "github:tauri-apps/tauri-plugin-sql#v1",
"tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store#v1",
"tesseract.js": "^5.1.1",
"uuid": "^11.0.2"
},
"devDependencies": {
"@tauri-apps/cli": "^1.6.3",
"@vitejs/plugin-react": "^4.3.3",
"autoprefixer": "^10.4.20",
"node-fetch": "^3.3.2",
"postcss": "^8.4.47",
"prettier": "3.3.2",
"tailwindcss": "^3.4.14",
"typescript": "^5.6.3",
"vite": "^5.4.10"
}
}
================================================
FILE: patches/hyprland.patch
================================================
From ef74289f660bcb9d407056a42a045804f6b8ecbf Mon Sep 17 00:00:00 2001
From: Pylogmon <pylogmon@outlook.com>
Date: Wed, 22 Nov 2023 10:31:59 +0800
Subject: [PATCH] fix: Patch for Hyprland
#596
---
src/window/Translate/index.jsx | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/window/Translate/index.jsx b/src/window/Translate/index.jsx
index ddbf885..04579a7 100644
--- a/src/window/Translate/index.jsx
+++ b/src/window/Translate/index.jsx
@@ -54,13 +54,13 @@ void listen('tauri://focus', () => {
}
});
// 监听 move 事件取消 blurTimeout 时间之内的关闭窗口
-void listen('tauri://move', () => {
- info('Move');
- if (blurTimeout) {
- info('Cancel Close');
- clearTimeout(blurTimeout);
- }
-});
+// void listen('tauri://move', () => {
+// info('Move');
+// if (blurTimeout) {
+// info('Cancel Close');
+// clearTimeout(blurTimeout);
+// }
+// });
export default function Translate() {
const [closeOnBlur] = useConfig('translate_close_on_blur', true);
--
2.43.0
================================================
FILE: postcss.config.js
================================================
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
================================================
FILE: public/tesseract-core-simd-lstm.wasm.js
================================================
var TesseractCore = (() => {
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
return (
function(TesseractCore = {}) {
var b;b||(b=typeof TesseractCore !== 'undefined' ? TesseractCore : {});var aa,ba;b.ready=new Promise((a,c)=>{aa=a;ba=c});var ca=Object.assign({},b),da="./this.program",ea=(a,c)=>{throw c;},fa="object"==typeof window,ha="function"==typeof importScripts,ia="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,f="",ja,ka,la;
if(ia){var fs=require("fs"),ma=require("path");f=ha?ma.dirname(f)+"/":__dirname+"/";ja=(a,c)=>{var d=na(a);if(d)return c?d:d.toString();a=a.startsWith("file://")?new URL(a):ma.normalize(a);return fs.readFileSync(a,c?void 0:"utf8")};la=a=>{a=ja(a,!0);a.buffer||(a=new Uint8Array(a));return a};ka=(a,c,d,e=!0)=>{var g=na(a);g&&c(g);a=a.startsWith("file://")?new URL(a):ma.normalize(a);fs.readFile(a,e?void 0:"utf8",(h,k)=>{h?d(h):c(e?k.buffer:k)})};!b.thisProgram&&1<process.argv.length&&(da=process.argv[1].replace(/\\/g,
"/"));process.argv.slice(2);ea=(a,c)=>{process.exitCode=a;throw c;};b.inspect=()=>"[Emscripten Module object]"}else if(fa||ha)ha?f=self.location.href:"undefined"!=typeof document&&document.currentScript&&(f=document.currentScript.src),_scriptDir&&(f=_scriptDir),0!==f.indexOf("blob:")?f=f.substr(0,f.replace(/[?#].*/,"").lastIndexOf("/")+1):f="",ja=a=>{try{var c=new XMLHttpRequest;c.open("GET",a,!1);c.send(null);return c.responseText}catch(g){if(a=na(a)){c=[];for(var d=0;d<a.length;d++){var e=a[d];
255<e&&(e&=255);c.push(String.fromCharCode(e))}return c.join("")}throw g;}},ha&&(la=a=>{try{var c=new XMLHttpRequest;c.open("GET",a,!1);c.responseType="arraybuffer";c.send(null);return new Uint8Array(c.response)}catch(d){if(a=na(a))return a;throw d;}}),ka=(a,c,d)=>{var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=()=>{if(200==e.status||0==e.status&&e.response)c(e.response);else{var g=na(a);g?c(g.buffer):d()}};e.onerror=d;e.send(null)};
var oa=b.print||console.log.bind(console),n=b.printErr||console.warn.bind(console);Object.assign(b,ca);ca=null;b.thisProgram&&(da=b.thisProgram);b.quit&&(ea=b.quit);var pa;b.wasmBinary&&(pa=b.wasmBinary);var noExitRuntime=b.noExitRuntime||!0;"object"!=typeof WebAssembly&&p("no native wasm support detected");var ra,sa=!1,r,ta,ua,u,x,va,wa;
function xa(){var a=ra.buffer;b.HEAP8=r=new Int8Array(a);b.HEAP16=ua=new Int16Array(a);b.HEAP32=u=new Int32Array(a);b.HEAPU8=ta=new Uint8Array(a);b.HEAPU16=new Uint16Array(a);b.HEAPU32=x=new Uint32Array(a);b.HEAPF32=va=new Float32Array(a);b.HEAPF64=wa=new Float64Array(a)}var ya,za=[],Aa=[],Ba=[],Ca=!1;function Da(){var a=b.preRun.shift();za.unshift(a)}var Ea=0,Fa=null,Ga=null;function Ha(){Ea++;b.monitorRunDependencies&&b.monitorRunDependencies(Ea)}
function Ia(){Ea--;b.monitorRunDependencies&&b.monitorRunDependencies(Ea);if(0==Ea&&(null!==Fa&&(clearInterval(Fa),Fa=null),Ga)){var a=Ga;Ga=null;a()}}function p(a){if(b.onAbort)b.onAbort(a);a="Aborted("+a+")";n(a);sa=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");ba(a);throw a;}var Ja="data:application/octet-stream;base64,",Ka;Ka="data:application/octet-stream;base64,AGFzbQEAAAABpgmNAWABfwBgAX8Bf2ADf39/AX9gAn9/AGACf38Bf2ADf39/AGAEf39/fwBgBH9/f38Bf2AFf39/f38AYAV/f39/fwF/YAZ/f39/f38Bf2AGf39/f39/AGADf35/AX5gB39/f39/f38AYAl/f39/f39/f38AYAF/AX1gCH9/f39/f39/AX9gAAF/YAd/f39/f39/AX9gAABgAn9+AX9gCH9/f39/f39/AXxgAX8BfmAEf35/fwF+YAJ/fgF+YAx/f39/f39/f39/f38AYAF8AXxgA399fwF/YAJ/fwF+YAJ/fwF9YAV/fn5+fgBgBH9/f38BfmABfQF9YAV/fX19fwBgAn99AGAJf39/f39/f39/AX9gA39/fwF9YAJ/fwF8YAF/AXxgBX9/f398AX9gA399fQF/YAN/f38BfGAFf39+f38AYAV/f39/fgF/YAp/f39/f39/f39/AGACfHwBfGADf39+AGADf399AX9gA39+fwBgC39/f39/f39/f39/AX9gAn5/AX9gBH9+fn8AYAp/f39/f39/f39/AX9gA399fwBgA39+fwF/YAh/f39/f39/fwBgBH9/f30AYAABfGACf3wBfGACf3wAYAJ9fQF9YAR/f39/AXxgBH5+fn4Bf2ADf3x8AGAGf39/f31/AX9gA398fAF8YAJ/fQF/YAV/f31/fwBgBn9/f39/fwF8YAN8fH8BfGAFf39/fX8Bf2AKf39/fX19f39/fwBgDH9/f39/f39/f39/fwF/YAN8f38AYA9/f39/f39/f39/f39/f38AYAZ/fH9/f38Bf2AEf35/fwF/YAR/f399AX9gCH9/f39/f399AGAEf35/fwBgB39/f39/fn4Bf2AGf39/f35+AX9gBX98f39/AGAEf35+fwF+YAJ/fAF/YAN/fX0AYAx/f39/f39/f31/f38AYAJ/fgBgBn9/f39/fgF/YAJ8fwF8YAR/f319AGAKf39/f39/fHx8fwBgA31/fwF/YAR/f3x/AX9gAn5+AXxgCX9/f399fX19fQBgBX99fX1/AX9gCn9/f39/f31/f38AYAx/f39/fX1/f39/f38BfWALf39/f39/fX9/f38BfGALf39/f39/f399f38AYAV/f39/fwF8YAV/f319fQF/YAd/fn5/f39/AGAIf35+f39/f38Bf2AGf39/fX1/AX9gCn9/f399f39/f38BfWAGf398f39/AXxgBX9/f3x8AGAFf399f38Bf2AFf39/fX8AYAV/f319fQBgBX99fX9/AGAEf398fAF/YAR/f39+AX5gBn9/fX9/fwBgCH9/f39/fX9/AX9gBH9/f34Bf2ACfH8Bf2AGf399f39/AX9gB39/fHx8f38AYAZ/f39/fX0AYAV/f398fAF8YAd/f319f39/AGAEf399fwBgBn99f39/fwBgA39/fQBgA31/fwF9YAd9f399f39/AX9gA398fwF8YAZ/f3x8f38BfGAFf35+f38AYAABfmACfn4BfWANf39/f39/f39/f39/fwBgBH98f38AYAN8fH8Bf2AEf39+fwBgA398fwBgBX9/f3x/AGADf398AAKtAjIBYQFhAAYBYQFiAAcBYQFjAAQBYQFkAAUBYQFlAAMBYQFmAAIBYQFnAAYBYQFoAAkBYQFpAAoBYQFqAAgBYQFrABMBYQFsAAUBYQFtADkBYQFuAAcBYQFvAAEBYQFwAAcBYQFxAAcBYQFyAAIBYQFzAAsBYQF0ACwBYQF1AAIBYQF2AAkBYQF3AAkBYQF4ABMBYQF5AAEBYQF6AAUBYQFBAAEBYQFCAAIBYQFDABIBYQFEAAoBYQFFAAMBYQFGAAABYQFHAAMBYQFIAAEBYQFJAAQBYQFKAAQBYQFLAAQBYQFMAAcBYQFNAAQBYQFOAAQBYQFPADkBYQFQAAQBYQFRABEBYQFSAAUBYQFTAAIBYQFUAAABYQFVAAQBYQFWAAABYQFXAAcBYQFYAAADrxygHAACAQMCAgIGAgAIAAMCBAEAAwsBAQETUgACBwQFAAQTBTIBCwABBAECAwMDAwgEBAIBBAcBAgETDgMBAAUNAQMDBAEFAwYAEAcEBwIeBAMAOgIHBToABgMEJgcFBQMFAwEEAgEBAwMEAAIRAwEAAgEFAAMGBAQtAQMCBQcHBgMCAgEFAgIBAQICBQUEAQEFBwQDCxMDAgIEOwEDAwUDAQABBAMeBQAEAQEDBQEeAAUEHwgEAQMEAQUABAQDAAABBQUDAwUCUwQAAAkGAwMBMwgCBAMGCQIAAgQEAwEEBgMAATsCAwEHBAQBIggAAwEEBgQFAQMEAAcBAAEEAQMBAxFUAwQEMgQEBwQDBAICAQUFAwADBQAEBwQBAQABBlUBAQAA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AklhAOUUAkphAL8UAkthAJ0UAkxhANcTAk1hANYTAk5hANMTAk9hANETAlBhAM8TAlFhAM4TAlJhAM0TAlNhAMkTAlRhAMYTAlVhAMATAlZhALYTAldhALMTAlhhAKsTAllhANAEAlphAJ8BAl9hAJ8BAiRhAOYQAmFiAMMQAmJiAJoQAmNiAP8PAmRiANcPAmViALUPAmZiAJQPAmdiAP0OAmhiAPUOAmliAOoOAmpiANAOAmtiAKwOAmxiAJIOAm1iAPwNAm5iAN4NAm9iANINAnBiAL4NAnFiAKMNAnJiAIUNAnNiAOMMAnRiANAEAnViAJ8BAnZiAKgTAndiAKYTAnhiAKITAnliAKETAnpiAKALAkFiAJQEAkJiANwDAkNiAJMEAkRiAMADAkViAK4GAkZiAJ8BAkdiAIETAkhiAOsOAkliAOQMAkpiAMILAktiALcGAkxiAMADAk1iAPUKAk5iAIcIAk9iANAEAlBiAJ8BAlFiAJ8BAlJiAPYSAlNiAOsSAlRiAOASAlViANUSAlZiAKALAldiAJ8BAlhiAM0SAlliAMoSAlpiAIYLAl9iAMgSAiRiAJ8BAmFjAJ8BAmJjAJQEAmNjANwDAmRjAMQSAmVjAMISAmZjAJ8BAmdjAJQEAmhjANwDAmljAJMEAmpjAMADAmtjAJ8BAmxjAJQEAm1jANwDAm5jAJMEAm9jAMADAnBjAJ8BAnFjAJQEAnJjANwDAnNjAJMEAnRjAMADAnVjAK4GAnZjAJ8BAndjAJQEAnhjANwDAnljAJMEAnpjAMADAkFjAK4GAkJjAIYLAkNjAL4SAkRjAIcIAkVjALMSAkZjAKgSAkdjAJ0SAkhjAJgSAkljAI8SAkpjAJ8BAktjAJ8BAkxjANAEAk1jAJ8BAk5jAIwSAk9jAIYSAlBjAIMSAlFjAIISAlJjAIESAlNjAIASAlRjAP8RAlVjAP4RAlZjAP0RAldjAPgRAlhjAPQRAlljAOwRAlpjAOsRAl9jAOURAiRjANsRAmFkANQRAmJkAMsRAmNkAMURAmRkALsRAmVkALERAmZkAKYRAmdkAJsRAmhkAJERAmlkAIkRAmpkANAcAmtkAMwcAmxkAMccAm1kAMEcAm5kALwcAm9kALgcAnBkALccAnFkALQcAnJkALIcAnNkALEcAnRkAK0cAnVkAKwcAnZkAKsc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AmoiAyABIAJqLQAAOgAAIANBA3ENAAsLIAJBA00NAANAIAAgAkEEayICaiABIAJqKAIANgIAIAJBA0sNAAsLIAJFDQIDQCAAIAJBAWsiAmogASACai0AADoAACACDQALDAILIAJBA00NAANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIAJBBGsiAkEDSw0ACwsgAkUNAANAIAMgAS0AADoAACADQQFqIQMgAUEBaiEBIAJBAWsiAg0ACwsgAAvyAgICfwF+AkAgAkUNACAAIAE6AAAgACACaiIDQQFrIAE6AAAgAkEDSQ0AIAAgAToAAiAAIAE6AAEgA0EDayABOgAAIANBAmsgAToAACACQQdJDQAgACABOgADIANBBGsgAToAACACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiATYCACADIAIgBGtBfHEiBGoiAkEEayABNgIAIARBCUkNACADIAE2AgggAyABNgIEIAJBCGsgATYCACACQQxrIAE2AgAgBEEZSQ0AIAMgATYCGCADIAE2AhQgAyABNgIQIAMgATYCDCACQRBrIAE2AgAgAkEUayABNgIAIAJBGGsgATYCACACQRxrIAE2AgAgBCADQQRxQRhyIgRrIgJBIEkNACABrUKBgICAEH4hBSADIARqIQEDQCABIAU3AxggASAFNwMQIAEgBTcDCCABIAU3AwAgAUEgaiEBIAJBIGsiAkEfSw0ACwsgAAuABAEDfyACQYAETwRAIAAgASACECsgAA8LIAAgAmohAwJAIAAgAXNBA3FFBEACQCAAQQNxRQRAIAAhAgwBCyACRQRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAkEDcUUNASACIANJDQALCwJAIANBfHEiBEHAAEkNACACIARBQGoiBUsNAANAIAIgASgCADYCACACIAEoAgQ2AgQgAiABKAIINgIIIAIgASgCDDYCDCACIAEoAhA2AhAgAiABKAIUNgIUIAIgASgCGDYCGCACIAEoAhw2AhwgAiABKAIgNgIgIAIgASgCJDYCJCACIAEoAig2AiggAiABKAIsNgIsIAIgASgCMDYCMCACIAEoAjQ2AjQgAiABKAI4NgI4IAIgASgCPDYCPCABQUBrIQEgAkFAayICIAVNDQALCyACIARPDQED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Amo2AgQLIAALwAMBA38gACgCACABIAIgAEEEaiAAQQhqEF8gACAAKAIEIgE2AiQgACAAKAIIIgM2AihBACECAn9BACAAKAIAIgQoAhwgASADIAQoAghsakECdGoiAygCACIERQ0AGkEAIAQoAgAiAUUNABogASICKAIACyEBIAAgAzYCOCAAQQA2AEsgAEEANgJIIAAgATYCRCAAQUBrIAI2AgAgACAENgI8AkAgAgRAIAAgAjYCSAwBCyAAQQE6AE0LIABBADYCMCAAQQA6AE4gACADKAIABH8gAigCBAVBAAs2AjQgACgCXARAIAAoAlgiAgRAA0AgAigCACEBIAIQMiABIgINAAsLQQAhAiAAQQA2AlgCQCAAKAJUIgFFDQAgAUEETwRAIAFBfHEhBUEAIQQDQCACQQJ0IgMgACgCUGpBADYCACAAKAJQIANBBHJqQQA2AgAgACgCUCADQQhyakEANgIAIAAoAlAgA0EMcmpBADYCACACQQRqIQIgBEEEaiIEIAVHDQALCyABQQNxIgNFDQBBACEBA0AgACgCUCACQQJ0akEANgIAIAJBAWohAiABQQFqIgEgA0cNAAsLIABBADYCXAsLBgAgABAyCxcAIAAgATYCACAAIAEQQSABajYCBCAACy8BAX9BBBDHBiIAQciBGTYCACAAQaCBGTYCACAAQbSBGTYCACAAQaSCGUENEAsAC00BAn8gACgCDCIEBEAgBCABIAAoAgQiAyABIANIGyAAKAIAIgNrQQAgASADThtBAnRqIgEgASgCACACajYCACAAIAAoAgggAmo2AggLC0ACAX8CfgJAIABCAFIEQEKAgPz/ByAAgCEDIAGtIgQgAH5C/////w9WDQEgAyAEVA0BCyAApyABbBBoIQILIAILFAEBfyAAKAIMIgEEQCABEDILIAALnQIBAn8gACAEOgAIIAAgAzYCBCAAIAI2AgBBASEEIAJB8eECEMgDRQRAIAJB8iEQyANBAEchBAsgACAFNgIUIAAgATYCECAAIAE2AgwgACAEOgAJIAUoAgQiASAFKAIIIgNJBEAgASAANgIAIAUgAUEEajYCBA8LAkAgASAFKAIAIgFrIgRBAnUiBkEBaiICQYCAgIAESQRAQf////8DIAMgAWsiA0EBdSIHIAIgAiAHSRsgA0H8////B08bIgIEfyACQYCA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
gitextract_7600kiul/ ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug.yml │ │ └── feature.yml │ ├── actions/ │ │ ├── build-for-linux/ │ │ │ ├── Dockerfile │ │ │ ├── action.yml │ │ │ └── entrypoint.sh │ │ └── build.sh │ └── workflows/ │ └── package.yml ├── .gitignore ├── .node-version ├── .prettierignore ├── .prettierrc.json ├── .scripts/ │ ├── popclip/ │ │ ├── Config.plist │ │ ├── Pot.sh │ │ └── build.sh │ └── snipdo/ │ ├── build.sh │ ├── pot.json │ └── pot.ps1 ├── .vscode/ │ ├── extensions.json │ ├── launch.json │ └── tasks.json ├── CHANGELOG ├── LICENSE ├── README.md ├── README_EN.md ├── README_KR.md ├── com.pot_app.pot.metainfo.xml ├── daemon.html ├── index.html ├── package.json ├── patches/ │ └── hyprland.patch ├── postcss.config.js ├── public/ │ └── tesseract-core-simd-lstm.wasm.js ├── src/ │ ├── App.jsx │ ├── components/ │ │ └── WindowControl/ │ │ ├── index.jsx │ │ └── style.css │ ├── hooks/ │ │ ├── index.jsx │ │ ├── useConfig.jsx │ │ ├── useGetState.jsx │ │ ├── useSyncAtom.jsx │ │ ├── useToastStyle.jsx │ │ └── useVoice.jsx │ ├── i18n/ │ │ ├── index.jsx │ │ └── locales/ │ │ ├── ar_AE.json │ │ ├── de_DE.json │ │ ├── en_US.json │ │ ├── es_ES.json │ │ ├── fa_IR.json │ │ ├── fr_FR.json │ │ ├── he_IL.json │ │ ├── it_IT.json │ │ ├── ja_JP.json │ │ ├── ko_KR.json │ │ ├── nb_NO.json │ │ ├── nn_NO.json │ │ ├── pt_BR.json │ │ ├── pt_PT.json │ │ ├── ru_RU.json │ │ ├── ta_IN.json │ │ ├── tk_TM.json │ │ ├── tr_TR.json │ │ ├── uk_UA.json │ │ ├── zh_CN.json │ │ └── zh_TW.json │ ├── main.jsx │ ├── services/ │ │ ├── collection/ │ │ │ ├── anki/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── eudic/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ └── index.jsx │ │ ├── recognize/ │ │ │ ├── baidu/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── baidu_accurate/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── baidu_img/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── iflytek/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── iflytek_intsig/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── iflytek_latex/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── index.jsx │ │ │ ├── qrcode/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── simple_latex/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── system/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── tencent/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── tencent_accurate/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── tencent_img/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── tesseract/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── volcengine/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ └── volcengine_multi_lang/ │ │ │ ├── Config.jsx │ │ │ ├── index.jsx │ │ │ └── info.ts │ │ ├── translate/ │ │ │ ├── alibaba/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── baidu/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── baidu_field/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── bing/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── bing_dict/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── caiyun/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── cambridge_dict/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── chatglm/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── deepl/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── ecdict/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── geminipro/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── google/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── index.jsx │ │ │ ├── lingva/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── niutrans/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── ollama/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── openai/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── tencent/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── transmart/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── volcengine/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ ├── yandex/ │ │ │ │ ├── Config.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── info.ts │ │ │ └── youdao/ │ │ │ ├── Config.jsx │ │ │ ├── index.jsx │ │ │ └── info.ts │ │ └── tts/ │ │ ├── index.jsx │ │ └── lingva/ │ │ ├── Config.jsx │ │ ├── index.jsx │ │ └── info.ts │ ├── style.css │ ├── utils/ │ │ ├── env.js │ │ ├── index.js │ │ ├── invoke_plugin.js │ │ ├── lang_detect.js │ │ ├── language.ts │ │ ├── service_instance.ts │ │ └── store.js │ └── window/ │ ├── Config/ │ │ ├── components/ │ │ │ └── SideBar/ │ │ │ └── index.jsx │ │ ├── index.jsx │ │ ├── pages/ │ │ │ ├── About/ │ │ │ │ └── index.jsx │ │ │ ├── Backup/ │ │ │ │ ├── AliyunModal/ │ │ │ │ │ └── index.jsx │ │ │ │ ├── WebDavModal/ │ │ │ │ │ └── index.jsx │ │ │ │ ├── index.jsx │ │ │ │ └── utils/ │ │ │ │ ├── aliyun.jsx │ │ │ │ ├── local.jsx │ │ │ │ └── webdav.jsx │ │ │ ├── General/ │ │ │ │ └── index.jsx │ │ │ ├── History/ │ │ │ │ └── index.jsx │ │ │ ├── Hotkey/ │ │ │ │ └── index.jsx │ │ │ ├── Recognize/ │ │ │ │ └── index.jsx │ │ │ ├── Service/ │ │ │ │ ├── Collection/ │ │ │ │ │ ├── ConfigModal/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── SelectModal/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── ServiceItem/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ └── index.jsx │ │ │ │ ├── PluginConfig/ │ │ │ │ │ └── index.jsx │ │ │ │ ├── Recognize/ │ │ │ │ │ ├── ConfigModal/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── SelectModal/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── ServiceItem/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ └── index.jsx │ │ │ │ ├── SelectPluginModal/ │ │ │ │ │ └── index.jsx │ │ │ │ ├── Translate/ │ │ │ │ │ ├── ConfigModal/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── SelectModal/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── ServiceItem/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ └── index.jsx │ │ │ │ ├── Tts/ │ │ │ │ │ ├── ConfigModal/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── SelectModal/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── ServiceItem/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ └── index.jsx │ │ │ │ └── index.jsx │ │ │ └── Translate/ │ │ │ └── index.jsx │ │ ├── routes/ │ │ │ └── index.jsx │ │ └── style.css │ ├── Recognize/ │ │ ├── ControlArea/ │ │ │ └── index.jsx │ │ ├── ImageArea/ │ │ │ └── index.jsx │ │ ├── TextArea/ │ │ │ └── index.jsx │ │ └── index.jsx │ ├── Screenshot/ │ │ └── index.jsx │ ├── Translate/ │ │ ├── components/ │ │ │ ├── LanguageArea/ │ │ │ │ └── index.jsx │ │ │ ├── SourceArea/ │ │ │ │ └── index.jsx │ │ │ └── TargetArea/ │ │ │ └── index.jsx │ │ └── index.jsx │ └── Updater/ │ └── index.jsx ├── src-tauri/ │ ├── .gitignore │ ├── Cargo.toml │ ├── build.rs │ ├── icons/ │ │ └── icon.icns │ ├── icons_mac/ │ │ └── icon.icns │ ├── resources/ │ │ ├── ocr-aarch64-apple-darwin │ │ └── ocr-x86_64-apple-darwin │ ├── src/ │ │ ├── backup.rs │ │ ├── clipboard.rs │ │ ├── cmd.rs │ │ ├── config.rs │ │ ├── error.rs │ │ ├── hotkey.rs │ │ ├── lang_detect.rs │ │ ├── main.rs │ │ ├── screenshot.rs │ │ ├── server.rs │ │ ├── system_ocr.rs │ │ ├── tray.rs │ │ ├── updater.rs │ │ └── window.rs │ ├── tauri.conf.json │ ├── tauri.linux.conf.json │ ├── tauri.macos.conf.json │ ├── tauri.windows.conf.json │ ├── webview.arm64.json │ ├── webview.x64.json │ └── webview.x86.json ├── tailwind.config.cjs ├── updater/ │ ├── updater-for-fix-runtime.mjs │ └── updater.mjs └── vite.config.js
SYMBOL INDEX (412 symbols across 184 files)
FILE: public/tesseract-core-simd-lstm.wasm.js
function xa (line 13) | function xa(){var a=ra.buffer;b.HEAP8=r=new Int8Array(a);b.HEAP16=ua=new...
function Da (line 13) | function Da(){var a=b.preRun.shift();za.unshift(a)}
function Ha (line 13) | function Ha(){Ea++;b.monitorRunDependencies&&b.monitorRunDependencies(Ea)}
function Ia (line 14) | function Ia(){Ea--;b.monitorRunDependencies&&b.monitorRunDependencies(Ea...
function p (line 14) | function p(a){if(b.onAbort)b.onAbort(a);a="Aborted("+a+")";n(a);sa=!0;a=...
function Ma (line 15) | function Ma(a){try{if(a==Ka&&pa)return new Uint8Array(pa);var c=na(a);if...
function Na (line 16) | function Na(a){if(!pa&&(fa||ha)){if("function"==typeof fetch&&!a.startsW...
function Oa (line 16) | function Oa(a,c,d){return Na(a).then(e=>WebAssembly.instantiate(e,c)).th...
function Pa (line 17) | function Pa(a,c){var d=Ka;return pa||"function"!=typeof WebAssembly.inst...
function Ra (line 18) | function Ra(a){this.name="ExitStatus";this.message="Program terminated w...
function Sa (line 18) | function Sa(a){for(;0<a.length;)a.shift()(b)}
function Ta (line 18) | function Ta(a){for(var c=0,d=0;d<a.length;++d){var e=a.charCodeAt(d);127...
function Ua (line 19) | function Ua(a,c,d,e){if(!(0<e))return 0;var g=d;e=d+e-1;for(var h=0;h<a....
function Wa (line 20) | function Wa(a,c){for(var d=c+NaN,e=c;a[e]&&!(e>=d);)++e;if(16<e-c&&a.buf...
function A (line 20) | function A(a){return a?Wa(ta,a):""}
function Xa (line 21) | function Xa(a,c="i8"){c.endsWith("*")&&(c="*");switch(c){case "i1":retur...
function Ya (line 22) | function Ya(a,c,d="i8"){d.endsWith("*")&&(d="*");switch(d){case "i1":r[a...
function Za (line 23) | function Za(a){this.Ff=a-24;this.vh=function(c){x[this.Ff+4>>2]=c};this....
function gb (line 25) | function gb(){if("object"==typeof crypto&&"function"==typeof crypto.getR...
function hb (line 25) | function hb(a){return(hb=gb())(a)}
function ib (line 26) | function ib(){for(var a="",c=!1,d=arguments.length-1;-1<=d&&!c;d--){c=0<...
function d (line 27) | function d(k){for(var m=0;m<k.length&&""===k[m];m++);for(var v=k.length-...
function kb (line 27) | function kb(a,c){var d=Array(Ta(a)+1);a=Ua(a,d,0,d.length);c&&(d.length=...
function mb (line 28) | function mb(a,c){lb[a]={input:[],output:[],pg:c};B.$g(a,nb)}
function qb (line 39) | function qb(a,c,d){var e="al "+a;ka(a,g=>{g||p(`Loading data file "${a}"...
function sb (line 39) | function sb(a,c,d,e){"undefined"!=typeof Browser&&Browser.fg();var g=!1;...
function tb (line 40) | function tb(a,c){var d=0;a&&(d|=365);c&&(d|=146);return d}
function d (line 46) | function d(k){B.Cg--;return c(k)}
function e (line 46) | function e(k){if(k){if(!e.Kh)return e.Kh=!0,d(k)}else++h>=g.length&&d(nu...
function h (line 67) | function h(){this.Ug=!1;this.Sf=[]}
function ub (line 72) | function ub(a,c,d){if("/"===c.charAt(0))return c;a=-100===a?B.cwd():vb(a...
function wb (line 73) | function wb(a,c,d){try{var e=a(c)}catch(h){if(h&&h.node&&cb(c)!==cb(B.cg...
function yb (line 75) | function yb(){xb+=4;return u[xb-4>>2]}
function vb (line 75) | function vb(a){a=B.rg(a);if(!a)throw new B.Gf(8);return a}
function zb (line 75) | function zb(){n("missing function: setThrew");p(-1)}
function Ab (line 75) | function Ab(a){return 0===a%4&&(0!==a%100||0===a%400)}
function Db (line 76) | function Db(a){return(Ab(a.getFullYear())?Bb:Cb)[a.getMonth()]+a.getDate...
function Eb (line 76) | function Eb(a){var c=Ta(a)+1,d=Fb(c);d&&Ua(a,ta,d,c);return d}
function Jb (line 77) | function Jb(){if(!Kb){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/"...
function Nb (line 78) | function Nb(a,c,d,e){function g(l,w,E){for(l="number"==typeof l?l.toStri...
function Pb (line 85) | function Pb(a){var c=Ob[a];c||(a>=Ob.length&&(Ob.length=a+1),Ob[a]=c=ya....
function Qb (line 85) | function Qb(a,c,d,e){a||(a=this);this.parent=a;this.Pf=a.Pf;this.ug=null...
function t (line 87) | function t(l){function w(E){q&&q();m||B.xg(a,c,E,e,g,v);h&&h();Ia(U)}sb(...
function na (line 90) | function na(a){if(a.startsWith(Ja)){a=a.slice(Ja.length);if("boolean"==t...
function e (line 99) | function e(v){return(v=v.toTimeString().match(/\(([A-Za-z ]+)\)$/))?v[1]...
function a (line 105) | function a(d){d=d.exports;b.asm=d;ra=b.asm.Y;xa();ya=b.asm.tf;Aa.unshift...
function Sb (line 190) | function Sb(){return(Sb=b.asm.zf).apply(null,arguments)}
function D (line 191) | function D(){return(D=b.asm.Df).apply(null,arguments)}
function Gh (line 191) | function Gh(){return(Gh=b.asm.Ef).apply(null,arguments)}
function Vb (line 191) | function Vb(a,c,d,e){var g=D();try{return Pb(a)(c,d,e)}catch(h){Gh(g);if...
function Yb (line 192) | function Yb(a,c){var d=D();try{Pb(a)(c)}catch(e){Gh(d);if(e!==e+0)throw ...
function Tb (line 192) | function Tb(a,c){var d=D();try{return Pb(a)(c)}catch(e){Gh(d);if(e!==e+0...
function $b (line 192) | function $b(a,c,d,e){var g=D();try{Pb(a)(c,d,e)}catch(h){Gh(g);if(h!==h+...
function Zb (line 192) | function Zb(a,c,d){var e=D();try{Pb(a)(c,d)}catch(g){Gh(e);if(g!==g+0)th...
function Ub (line 192) | function Ub(a,c,d){var e=D();try{return Pb(a)(c,d)}catch(g){Gh(e);if(g!=...
function Wb (line 193) | function Wb(a,c,d,e,g){var h=D();try{return Pb(a)(c,d,e,g)}catch(k){Gh(h...
function ac (line 193) | function ac(a,c,d,e,g){var h=D();try{Pb(a)(c,d,e,g)}catch(k){Gh(h);if(k!...
function Xb (line 193) | function Xb(a,c,d,e,g,h){var k=D();try{return Pb(a)(c,d,e,g,h)}catch(m){...
function cc (line 193) | function cc(a,c,d,e,g,h,k,m,v,q){var t=D();try{Pb(a)(c,d,e,g,h,k,m,v,q)}...
function bc (line 194) | function bc(a,c,d,e,g,h){var k=D();try{Pb(a)(c,d,e,g,h)}catch(m){Gh(k);i...
function Jh (line 195) | function Jh(){function a(){if(!Hh&&(Hh=!0,b.calledRun=!0,!sa)){Ca=!0;b.n...
function G (line 196) | function G(){}
function Kh (line 196) | function Kh(a){return(a||G).Lf}
function H (line 196) | function H(a,c){var d=Kh(c),e=d[a];if(e)return e;e=Object.create((c||G)....
function I (line 197) | function I(){if(Ph){for(var a=0;a<Oh.length;a++)b._free(Oh[a]);Oh.length...
function J (line 198) | function J(a){if("string"===typeof a){a=kb(a);var c=r;Lh||p();c=a.length...
function Qh (line 198) | function Qh(){throw"cannot construct a ParagraphJustification, no constr...
function Rh (line 199) | function Rh(){throw"cannot construct a BoolPtr, no constructor in IDL";}
function K (line 199) | function K(){throw"cannot construct a TessResultRenderer, no constructor...
function Sh (line 201) | function Sh(){throw"cannot construct a LongStarPtr, no constructor in ID...
function Uh (line 201) | function Uh(){throw"cannot construct a VoidPtr, no constructor in IDL";}
function L (line 202) | function L(a){a&&"object"===typeof a&&(a=a.Ff);this.Ff=qc(a);Kh(L)[this....
function Vh (line 212) | function Vh(){throw"cannot construct a TextlineOrder, no constructor in ...
function Wh (line 213) | function Wh(){throw"cannot construct a ETEXT_DESC, no constructor in IDL";}
function O (line 213) | function O(){throw"cannot construct a PageIterator, no constructor in ID...
function Xh (line 220) | function Xh(){throw"cannot construct a WritingDirection, no constructor ...
function Yh (line 221) | function Yh(a){a&&"object"===typeof a&&(a=a.Ff);this.Ff=Dd(a);Kh(Yh)[thi...
function P (line 221) | function P(){throw"cannot construct a Box, no constructor in IDL";}
function Q (line 223) | function Q(a,c,d){I();a=a&&"object"===typeof a?a.Ff:J(a);c=c&&"object"==...
function Zh (line 225) | function Zh(){throw"cannot construct a PixaPtr, no constructor in IDL";}
function $h (line 225) | function $h(){throw"cannot construct a FloatPtr, no constructor in IDL";}
function ai (line 226) | function ai(a){a&&"object"===typeof a&&(a=a.Ff);this.Ff=Zd(a);Kh(ai)[thi...
function bi (line 226) | function bi(){throw"cannot construct a PixPtr, no constructor in IDL";}
function ci (line 227) | function ci(){throw"cannot construct a UNICHARSET, no constructor in IDL";}
function di (line 228) | function di(){throw"cannot construct a IntPtr, no constructor in IDL";}
function ei (line 229) | function ei(){throw"cannot construct a Orientation, no constructor in ID...
function R (line 229) | function R(){throw"cannot construct a OSBestResult, no constructor in ID...
function S (line 231) | function S(){throw"cannot construct a Boxa, no constructor in IDL";}
function T (line 232) | function T(){throw"cannot construct a PixColormap, no constructor in IDL";}
function M (line 234) | function M(){throw"cannot construct a Pta, no constructor in IDL";}
function N (line 236) | function N(){throw"cannot construct a Pix, no constructor in IDL";}
function gi (line 240) | function gi(){throw"cannot construct a DoublePtr, no constructor in IDL";}
function hi (line 240) | function hi(){throw"cannot construct a Dawg, no constructor in IDL";}
function fi (line 241) | function fi(){throw"cannot construct a BoxPtr, no constructor in IDL";}
function V (line 241) | function V(){this.Ff=We();Kh(V)[this.Ff]=this}
function Y (line 259) | function Y(){this.Ff=og();Kh(Y)[this.Ff]=this}
function Z (line 260) | function Z(){throw"cannot construct a Pixa, no constructor in IDL";}
function a (line 262) | function a(){b.RIL_BLOCK=zg();b.RIL_PARA=Ag();b.RIL_TEXTLINE=Bg();b.RIL_...
function ii (line 265) | function ii(){this.lg={}}
FILE: src-tauri/build.rs
function main (line 1) | fn main() {
FILE: src-tauri/src/backup.rs
function webdav (line 11) | pub async fn webdav(
function local (line 116) | pub async fn local(operate: &str, path: String) -> Result<String, Error> {
function aliyun (line 179) | pub async fn aliyun(operate: &str, path: String, url: String) -> Result<...
FILE: src-tauri/src/clipboard.rs
type ClipboardMonitorEnableWrapper (line 5) | pub struct ClipboardMonitorEnableWrapper(pub Mutex<String>);
function start_clipboard_monitor (line 7) | pub fn start_clipboard_monitor(app_handle: tauri::AppHandle) {
FILE: src-tauri/src/cmd.rs
function get_text (line 12) | pub fn get_text(state: tauri::State<StringWrapper>) -> String {
function reload_store (line 17) | pub fn reload_store() {
function cut_image (line 24) | pub fn cut_image(left: u32, top: u32, width: u32, height: u32, app_handl...
function get_base64 (line 53) | pub fn get_base64(app_handle: tauri::AppHandle) -> String {
function copy_img (line 78) | pub fn copy_img(app_handle: tauri::AppHandle, width: usize, height: usiz...
function set_proxy (line 99) | pub fn set_proxy() -> Result<bool, ()> {
function unset_proxy (line 122) | pub fn unset_proxy() -> Result<bool, ()> {
function install_plugin (line 131) | pub fn install_plugin(path_list: Vec<String>) -> Result<i32, Error> {
function run_binary (line 179) | pub fn run_binary(
function font_list (line 213) | pub fn font_list() -> Result<Vec<String>, Error> {
function open_devtools (line 221) | pub fn open_devtools(window: tauri::Window) {
FILE: src-tauri/src/config.rs
type StoreWrapper (line 9) | pub struct StoreWrapper(pub Mutex<Store<Wry>>);
function init_config (line 11) | pub fn init_config(app: &mut tauri::App) {
function check_available (line 29) | fn check_available(list: Vec<String>, builtin: Vec<&str>, plugin: Vec<St...
function check_service_available (line 53) | pub fn check_service_available() -> Result<(), Error> {
function get_plugin_list (line 140) | pub fn get_plugin_list(plugin_type: &str) -> Option<Vec<String>> {
function get (line 168) | pub fn get(key: &str) -> Option<Value> {
function set (line 177) | pub fn set<T: serde::ser::Serialize>(key: &str, value: T) {
function is_first_run (line 184) | pub fn is_first_run() -> bool {
FILE: src-tauri/src/error.rs
type Error (line 3) | pub enum Error {
method serialize (line 34) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
FILE: src-tauri/src/hotkey.rs
function register (line 7) | fn register<F>(app_handle: &AppHandle, name: &str, handler: F, key: &str...
function register_shortcut (line 43) | pub fn register_shortcut(shortcut: &str) -> Result<(), String> {
function register_shortcut_by_frontend (line 74) | pub fn register_shortcut_by_frontend(name: &str, shortcut: &str) -> Resu...
FILE: src-tauri/src/lang_detect.rs
function init_lang_detect (line 1) | pub fn init_lang_detect() {
function lang_detect (line 32) | pub fn lang_detect(text: &str) -> Result<&str, ()> {
FILE: src-tauri/src/main.rs
type StringWrapper (line 42) | pub struct StringWrapper(pub Mutex<String>);
function main (line 44) | fn main() {
FILE: src-tauri/src/screenshot.rs
function screenshot (line 4) | pub fn screenshot(x: i32, y: i32) {
FILE: src-tauri/src/server.rs
function start_server (line 8) | pub fn start_server() {
function http_handle (line 34) | fn http_handle(request: Request) {
function handle_config (line 52) | fn handle_config(request: Request) {
function handle_translate (line 57) | fn handle_translate(mut request: Request) {
function handle_selection_translate (line 64) | fn handle_selection_translate(request: Request) {
function handle_input_translate (line 69) | fn handle_input_translate(request: Request) {
function handle_ocr_recognize (line 74) | fn handle_ocr_recognize(request: Request) {
function handle_ocr_translate (line 83) | fn handle_ocr_translate(request: Request) {
function response_ok (line 92) | fn response_ok(request: Request) {
FILE: src-tauri/src/system_ocr.rs
function system_ocr (line 5) | pub fn system_ocr(app_handle: tauri::AppHandle, lang: &str) -> Result<St...
function system_ocr (line 65) | pub fn system_ocr(app_handle: tauri::AppHandle, lang: &str) -> Result<St...
function system_ocr (line 108) | pub fn system_ocr(app_handle: tauri::AppHandle, lang: &str) -> Result<St...
FILE: src-tauri/src/tray.rs
function update_tray (line 18) | pub fn update_tray(app_handle: tauri::AppHandle, mut language: String, m...
function tray_event_handler (line 99) | pub fn tray_event_handler<'a>(app: &'a AppHandle, event: SystemTrayEvent) {
function on_tray_click (line 124) | fn on_tray_click() {
function on_input_translate_click (line 141) | fn on_input_translate_click() {
function on_clipboard_monitor_click (line 144) | fn on_clipboard_monitor_click(app: &AppHandle) {
function on_auto_copy_click (line 171) | fn on_auto_copy_click(app: &AppHandle, mode: &str) {
function on_ocr_recognize_click (line 177) | fn on_ocr_recognize_click() {
function on_ocr_translate_click (line 180) | fn on_ocr_translate_click() {
function on_config_click (line 184) | fn on_config_click() {
function on_check_update_click (line 188) | fn on_check_update_click() {
function on_view_log_click (line 191) | fn on_view_log_click(app: &AppHandle) {
function on_restart_click (line 196) | fn on_restart_click(app: &AppHandle) {
function on_quit_click (line 200) | fn on_quit_click(app: &AppHandle) {
function tray_menu_en (line 206) | fn tray_menu_en() -> tauri::SystemTrayMenu {
function tray_menu_zh_cn (line 244) | fn tray_menu_zh_cn() -> tauri::SystemTrayMenu {
function tray_menu_zh_tw (line 283) | fn tray_menu_zh_tw() -> tauri::SystemTrayMenu {
function tray_menu_ja (line 322) | fn tray_menu_ja() -> tauri::SystemTrayMenu {
function tray_menu_ko (line 361) | fn tray_menu_ko() -> tauri::SystemTrayMenu {
function tray_menu_fr (line 400) | fn tray_menu_fr() -> tauri::SystemTrayMenu {
function tray_menu_de (line 439) | fn tray_menu_de() -> tauri::SystemTrayMenu {
function tray_menu_ru (line 478) | fn tray_menu_ru() -> tauri::SystemTrayMenu {
function tray_menu_fa (line 517) | fn tray_menu_fa() -> tauri::SystemTrayMenu {
function tray_menu_pt_br (line 556) | fn tray_menu_pt_br() -> tauri::SystemTrayMenu {
function tray_menu_uk (line 596) | fn tray_menu_uk() -> tauri::SystemTrayMenu {
FILE: src-tauri/src/updater.rs
function check_update (line 5) | pub fn check_update(app_handle: tauri::AppHandle) {
FILE: src-tauri/src/window.rs
function get_daemon_window (line 17) | fn get_daemon_window() -> Window {
function get_current_monitor (line 38) | fn get_current_monitor(x: i32, y: i32) -> Monitor {
function build_window (line 61) | fn build_window(label: &str, title: &str) -> (Window, bool) {
function config_window (line 116) | pub fn config_window() {
function translate_window (line 125) | fn translate_window() -> Window {
function selection_translate (line 226) | pub fn selection_translate() {
function input_translate (line 241) | pub fn input_translate() {
function text_translate (line 262) | pub fn text_translate(text: String) {
function image_translate (line 271) | pub fn image_translate() {
function recognize_window (line 283) | pub fn recognize_window() {
function screenshot_window (line 316) | fn screenshot_window() -> Window {
function ocr_recognize (line 335) | pub fn ocr_recognize() {
function ocr_translate (line 368) | pub fn ocr_translate() {
function updater_window (line 404) | pub fn updater_window() {
FILE: src/App.jsx
function App (line 27) | function App() {
FILE: src/components/WindowControl/index.jsx
function WindowControl (line 10) | function WindowControl() {
FILE: src/services/collection/anki/Config.jsx
function Config (line 12) | function Config(props) {
FILE: src/services/collection/anki/index.jsx
function collection (line 4) | async function collection(source, target, options = {}) {
FILE: src/services/collection/eudic/Config.jsx
function Config (line 12) | function Config(props) {
FILE: src/services/collection/eudic/index.jsx
function collection (line 3) | async function collection(source, target, options = {}) {
function checkCategory (line 12) | async function checkCategory(name, token) {
function addWordToCategory (line 54) | async function addWordToCategory(id, word, token) {
FILE: src/services/recognize/baidu/Config.jsx
function Config (line 12) | function Config(props) {
FILE: src/services/recognize/baidu/index.jsx
function recognize (line 3) | async function recognize(base64, language, options = {}) {
FILE: src/services/recognize/baidu/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/baidu_accurate/Config.jsx
function Config (line 12) | function Config(props) {
FILE: src/services/recognize/baidu_accurate/index.jsx
function recognize (line 3) | async function recognize(base64, language, options = {}) {
FILE: src/services/recognize/baidu_accurate/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/baidu_img/Config.jsx
function Config (line 12) | function Config(props) {
FILE: src/services/recognize/baidu_img/index.jsx
function recognize (line 6) | async function recognize(base64, language, options = {}) {
FILE: src/services/recognize/baidu_img/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/iflytek/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/recognize/iflytek/index.jsx
function recognize (line 4) | async function recognize(base64, language, options = {}) {
function iflytek_auth (line 95) | function iflytek_auth(api_key, api_secret, host, date, request_line) {
FILE: src/services/recognize/iflytek/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/iflytek_intsig/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/recognize/iflytek_intsig/index.jsx
function recognize (line 5) | async function recognize(base64, language, options = {}) {
FILE: src/services/recognize/iflytek_intsig/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/iflytek_latex/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/recognize/iflytek_latex/index.jsx
function recognize (line 6) | async function recognize(base64, language, options = {}) {
FILE: src/services/recognize/iflytek_latex/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/qrcode/Config.jsx
function Config (line 5) | function Config(props) {
FILE: src/services/recognize/qrcode/index.jsx
function recognize (line 3) | async function recognize(base64, language, options = {}) {
FILE: src/services/recognize/qrcode/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/simple_latex/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/recognize/simple_latex/index.jsx
function recognize (line 4) | async function recognize(base64, language, options = {}) {
FILE: src/services/recognize/simple_latex/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/system/Config.jsx
function Config (line 5) | function Config(props) {
FILE: src/services/recognize/system/index.jsx
function recognize (line 6) | async function recognize(_, lang) {
FILE: src/services/recognize/system/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/tencent/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/recognize/tencent/index.jsx
function recognize (line 6) | async function recognize(base64, language, options = {}) {
FILE: src/services/recognize/tencent/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/tencent_accurate/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/recognize/tencent_accurate/index.jsx
function recognize (line 6) | async function recognize(base64, language, options = {}) {
FILE: src/services/recognize/tencent_accurate/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/tencent_img/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/recognize/tencent_img/index.jsx
function recognize (line 7) | async function recognize(base64, language, options = {}) {
FILE: src/services/recognize/tencent_img/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/tesseract/Config.jsx
function Config (line 5) | function Config(props) {
FILE: src/services/recognize/tesseract/index.jsx
function recognize (line 4) | async function recognize(base64, language) {
FILE: src/services/recognize/tesseract/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/volcengine/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/recognize/volcengine/index.jsx
function recognize (line 4) | async function recognize(base64, language, options = {}) {
function normal_ocr (line 14) | async function normal_ocr(img_base64, appid, secret) {
function query (line 31) | async function query(img_base64, action, serviceVersion, appid, secret) {
FILE: src/services/recognize/volcengine/info.ts
type Language (line 6) | enum Language {
FILE: src/services/recognize/volcengine_multi_lang/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/recognize/volcengine_multi_lang/index.jsx
function recognize (line 4) | async function recognize(base64, language, options = {}) {
function multi_lang_ocr (line 14) | async function multi_lang_ocr(img_base64, appid, secret) {
function query (line 31) | async function query(img_base64, action, serviceVersion, appid, secret) {
FILE: src/services/recognize/volcengine_multi_lang/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/alibaba/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/translate/alibaba/index.jsx
function translate (line 5) | async function translate(text, from, to, options = {}) {
FILE: src/services/translate/alibaba/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/baidu/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/translate/baidu/index.jsx
function translate (line 5) | async function translate(text, from, to, options = {}) {
FILE: src/services/translate/baidu/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/baidu_field/Config.jsx
function Config (line 17) | function Config(props) {
FILE: src/services/translate/baidu_field/index.jsx
function translate (line 5) | async function translate(text, from, to, options = {}) {
FILE: src/services/translate/baidu_field/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/bing/Config.jsx
function Config (line 5) | function Config(props) {
FILE: src/services/translate/bing/index.jsx
function translate (line 3) | async function translate(text, from, to) {
FILE: src/services/translate/bing/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/bing_dict/Config.jsx
function Config (line 5) | function Config(props) {
FILE: src/services/translate/bing_dict/index.jsx
constant DISPLAY_FORMAT_DEFAULT (line 2) | const DISPLAY_FORMAT_DEFAULT = '发音, 快速释义, 变形';
function translate (line 4) | async function translate(text, from, to) {
FILE: src/services/translate/bing_dict/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/caiyun/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/translate/caiyun/index.jsx
function translate (line 3) | async function translate(text, from, to, options = {}) {
FILE: src/services/translate/caiyun/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/cambridge_dict/Config.jsx
function Config (line 5) | function Config(props) {
FILE: src/services/translate/cambridge_dict/index.jsx
class Pronunciation (line 4) | class Pronunciation {
method constructor (line 5) | constructor(region, symbol, voice) {
class Explanation (line 12) | class Explanation {
method constructor (line 13) | constructor(trait, explains) {
class WordTranslateResult (line 19) | class WordTranslateResult {
method constructor (line 20) | constructor(pronunciations, explanations) {
function tryDetectLanguage (line 26) | function tryDetectLanguage(text) {
function translate (line 34) | async function translate(text, from, to) {
FILE: src/services/translate/cambridge_dict/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/chatglm/Config.jsx
function Config (line 21) | function Config(props) {
FILE: src/services/translate/chatglm/index.jsx
function translate (line 5) | async function translate(text, from, to, options = {}) {
FILE: src/services/translate/chatglm/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/deepl/Config.jsx
function Config (line 17) | function Config(props) {
FILE: src/services/translate/deepl/index.jsx
function translate (line 3) | async function translate(text, from, to, options = {}) {
function translate_by_free (line 18) | async function translate_by_free(text, from, to) {
function translate_by_deeplx (line 65) | async function translate_by_deeplx(text, from, to, url) {
function translate_by_key (line 87) | async function translate_by_key(text, from, to, key) {
function getTimeStamp (line 129) | function getTimeStamp(iCount) {
function getICount (line 139) | function getICount(translate_text) {
function getRandomNumber (line 143) | function getRandomNumber() {
FILE: src/services/translate/deepl/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/ecdict/Config.jsx
function Config (line 5) | function Config(props) {
FILE: src/services/translate/ecdict/index.jsx
function translate (line 3) | async function translate(text, _from, _to) {
FILE: src/services/translate/ecdict/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/geminipro/Config.jsx
function Config (line 14) | function Config(props) {
FILE: src/services/translate/geminipro/index.jsx
function translate (line 4) | async function translate(text, from, to, options = {}) {
FILE: src/services/translate/geminipro/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/google/Config.jsx
function Config (line 12) | function Config(props) {
FILE: src/services/translate/google/index.jsx
function translate (line 3) | async function translate(text, from, to, options = {}) {
FILE: src/services/translate/google/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/lingva/Config.jsx
function Config (line 5) | function Config(props) {
FILE: src/services/translate/lingva/index.jsx
function translate (line 3) | async function translate(text, from, to) {
FILE: src/services/translate/lingva/info.ts
type Language (line 7) | enum Language {
FILE: src/services/translate/niutrans/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/translate/niutrans/index.jsx
function translate (line 3) | async function translate(text, from, to, options = {}) {
FILE: src/services/translate/niutrans/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/ollama/Config.jsx
function Config (line 15) | function Config(props) {
FILE: src/services/translate/ollama/index.jsx
function translate (line 4) | async function translate(text, from, to, options = {}) {
FILE: src/services/translate/ollama/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/openai/Config.jsx
function Config (line 25) | function Config(props) {
FILE: src/services/translate/openai/index.jsx
function translate (line 5) | async function translate(text, from, to, options) {
FILE: src/services/translate/openai/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/tencent/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/translate/tencent/index.jsx
function translate (line 6) | async function translate(text, from, to, options = {}) {
FILE: src/services/translate/tencent/info.ts
type Language (line 7) | enum Language {
FILE: src/services/translate/transmart/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/translate/transmart/index.jsx
function translate (line 3) | async function translate(text, from, to, options = {}) {
FILE: src/services/translate/transmart/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/volcengine/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/translate/volcengine/index.jsx
function translate (line 4) | async function translate(text, from, to, options = {}) {
FILE: src/services/translate/volcengine/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/yandex/Config.jsx
function Config (line 5) | function Config(props) {
FILE: src/services/translate/yandex/index.jsx
function translate (line 4) | async function translate(text, from, to) {
FILE: src/services/translate/yandex/info.ts
type Language (line 6) | enum Language {
FILE: src/services/translate/youdao/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/translate/youdao/index.jsx
function translate (line 5) | async function translate(text, from, to, options = {}) {
function truncate (line 96) | function truncate(q) {
FILE: src/services/translate/youdao/info.ts
type Language (line 6) | enum Language {
FILE: src/services/tts/lingva/Config.jsx
function Config (line 13) | function Config(props) {
FILE: src/services/tts/lingva/index.jsx
function tts (line 3) | async function tts(text, lang, options = {}) {
FILE: src/services/tts/lingva/info.ts
type Language (line 6) | enum Language {
FILE: src/utils/env.js
function initEnv (line 9) | async function initEnv() {
FILE: src/utils/invoke_plugin.js
function invoke_plugin (line 9) | async function invoke_plugin(pluginType, pluginName) {
FILE: src/utils/lang_detect.js
function baidu_detect (line 7) | async function baidu_detect(text) {
function tencent_detect (line 51) | async function tencent_detect(text) {
function google_detect (line 90) | async function google_detect(text) {
function niutrans_detect (line 145) | async function niutrans_detect(text) {
function yandex_detect (line 191) | async function yandex_detect(text) {
function bing_detect (line 232) | async function bing_detect(text) {
function local_detect (line 309) | async function local_detect(text) {
function detect (line 313) | async function detect(text) {
FILE: src/utils/language.ts
type LanguageFlag (line 37) | enum LanguageFlag {
FILE: src/utils/service_instance.ts
type ServiceType (line 1) | enum ServiceType {
type ServiceSourceType (line 8) | enum ServiceSourceType {
function getServiceSouceType (line 13) | function getServiceSouceType(serviceInstanceKey: string): ServiceSourceT...
function whetherPluginService (line 21) | function whetherPluginService(serviceInstanceKey: string): boolean {
function createServiceInstanceKey (line 27) | function createServiceInstanceKey(serviceName: string): string {
function getServiceName (line 33) | function getServiceName(serviceInstanceKey: string): string {
function getDisplayInstanceName (line 37) | function getDisplayInstanceName(instanceName: string, serviceNameSupplie...
constant INSTANCE_NAME_CONFIG_KEY (line 41) | const INSTANCE_NAME_CONFIG_KEY = 'instanceName';
function whetherAvailableService (line 43) | function whetherAvailableService(
FILE: src/utils/store.js
function initStore (line 8) | async function initStore() {
FILE: src/window/Config/components/SideBar/index.jsx
function SideBar (line 14) | function SideBar() {
FILE: src/window/Config/index.jsx
function Config (line 14) | function Config() {
FILE: src/window/Config/pages/About/index.jsx
function About (line 13) | function About() {
FILE: src/window/Config/pages/Backup/AliyunModal/index.jsx
function AliyunModal (line 10) | function AliyunModal(props) {
FILE: src/window/Config/pages/Backup/WebDavModal/index.jsx
function WebDavModal (line 10) | function WebDavModal(props) {
FILE: src/window/Config/pages/Backup/index.jsx
function Backup (line 27) | function Backup() {
FILE: src/window/Config/pages/Backup/utils/aliyun.jsx
function backup (line 5) | async function backup(token, name) {
function list (line 29) | async function list(token) {
function get (line 63) | async function get(token, name) {
function remove (line 70) | async function remove(token, name) {
function qrcode (line 95) | async function qrcode() {
function status (line 120) | async function status(sid) {
function userInfo (line 140) | async function userInfo(token) {
function accessToken (line 163) | async function accessToken(code) {
function driveId (line 188) | async function driveId(token) {
function createDir (line 212) | async function createDir(token, drive_id) {
function createFile (line 243) | async function createFile(token, drive_id, dir_id, name) {
function getFileByPath (line 277) | async function getFileByPath(token, drive_id, name) {
function getDownloadUrl (line 305) | async function getDownloadUrl(token, drive_id, file_id) {
FILE: src/window/Config/pages/Backup/utils/local.jsx
function backup (line 4) | async function backup() {
function get (line 23) | async function get() {
FILE: src/window/Config/pages/Backup/utils/webdav.jsx
function backup (line 3) | async function backup(url, username, password, name) {
function list (line 13) | async function list(url, username, password) {
function get (line 29) | async function get(url, username, password, name) {
function remove (line 39) | async function remove(url, username, password, name) {
FILE: src/window/Config/pages/General/index.jsx
function General (line 26) | function General() {
FILE: src/window/Config/pages/History/index.jsx
function History (line 28) | function History() {
FILE: src/window/Config/pages/Hotkey/index.jsx
function Hotkey (line 48) | function Hotkey() {
FILE: src/window/Config/pages/Recognize/index.jsx
function Recognize (line 15) | function Recognize() {
FILE: src/window/Config/pages/Service/Collection/ConfigModal/index.jsx
function ConfigModal (line 14) | function ConfigModal(props) {
FILE: src/window/Config/pages/Service/Collection/SelectModal/index.jsx
function SelectModal (line 8) | function SelectModal(props) {
FILE: src/window/Config/pages/Service/Collection/ServiceItem/index.jsx
function ServiceItem (line 17) | function ServiceItem(props) {
FILE: src/window/Config/pages/Service/Collection/index.jsx
function Collection (line 13) | function Collection(props) {
FILE: src/window/Config/pages/Service/PluginConfig/index.jsx
function PluginConfig (line 13) | function PluginConfig(props) {
FILE: src/window/Config/pages/Service/Recognize/ConfigModal/index.jsx
function ConfigModal (line 16) | function ConfigModal(props) {
FILE: src/window/Config/pages/Service/Recognize/SelectModal/index.jsx
function SelectModal (line 9) | function SelectModal(props) {
FILE: src/window/Config/pages/Service/Recognize/ServiceItem/index.jsx
function ServiceItem (line 18) | function ServiceItem(props) {
FILE: src/window/Config/pages/Service/Recognize/index.jsx
function Recognize (line 15) | function Recognize(props) {
FILE: src/window/Config/pages/Service/SelectPluginModal/index.jsx
function SelectPluginModal (line 15) | function SelectPluginModal(props) {
FILE: src/window/Config/pages/Service/Translate/ConfigModal/index.jsx
function ConfigModal (line 9) | function ConfigModal(props) {
FILE: src/window/Config/pages/Service/Translate/SelectModal/index.jsx
function SelectModal (line 8) | function SelectModal(props) {
FILE: src/window/Config/pages/Service/Translate/ServiceItem/index.jsx
function ServiceItem (line 12) | function ServiceItem(props) {
FILE: src/window/Config/pages/Service/Translate/index.jsx
function Translate (line 15) | function Translate(props) {
FILE: src/window/Config/pages/Service/Tts/ConfigModal/index.jsx
function ConfigModal (line 14) | function ConfigModal(props) {
FILE: src/window/Config/pages/Service/Tts/SelectModal/index.jsx
function SelectModal (line 8) | function SelectModal(props) {
FILE: src/window/Config/pages/Service/Tts/ServiceItem/index.jsx
function ServiceItem (line 17) | function ServiceItem(props) {
FILE: src/window/Config/pages/Service/Tts/index.jsx
function Tts (line 15) | function Tts(props) {
FILE: src/window/Config/pages/Service/index.jsx
function Service (line 16) | function Service() {
FILE: src/window/Config/pages/Translate/index.jsx
function Translate (line 16) | function Translate() {
FILE: src/window/Recognize/ControlArea/index.jsx
function ControlArea (line 27) | function ControlArea(props) {
FILE: src/window/Recognize/ImageArea/index.jsx
function ImageArea (line 15) | function ImageArea() {
FILE: src/window/Recognize/TextArea/index.jsx
function TextArea (line 23) | function TextArea(props) {
FILE: src/window/Recognize/index.jsx
function Recognize (line 53) | function Recognize() {
FILE: src/window/Screenshot/index.jsx
function Screenshot (line 10) | function Screenshot() {
FILE: src/window/Translate/components/LanguageArea/index.jsx
function LanguageArea (line 14) | function LanguageArea() {
FILE: src/window/Translate/components/SourceArea/index.jsx
function SourceArea (line 32) | function SourceArea(props) {
FILE: src/window/Translate/components/TargetArea/index.jsx
function TargetArea (line 54) | function TargetArea(props) {
FILE: src/window/Translate/index.jsx
function Translate (line 66) | function Translate() {
FILE: src/window/Updater/index.jsx
function Updater (line 17) | function Updater() {
FILE: updater/updater-for-fix-runtime.mjs
function resolveUpdater (line 4) | async function resolveUpdater() {
function getVersion (line 35) | async function getVersion(token) {
function getChangeLog (line 51) | async function getChangeLog(token) {
function getSignature (line 69) | async function getSignature(url) {
FILE: updater/updater.mjs
function resolveUpdater (line 4) | async function resolveUpdater() {
function getVersion (line 47) | async function getVersion(token) {
function getChangeLog (line 63) | async function getChangeLog(token) {
function getSignature (line 81) | async function getSignature(url) {
Condensed preview — 271 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,235K chars).
[
{
"path": ".github/FUNDING.yml",
"chars": 836,
"preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
},
{
"path": ".github/ISSUE_TEMPLATE/bug.yml",
"chars": 1743,
"preview": "name: 🐞 Bug Report\ndescription: Report a bug\ntitle: '[BUG]: title'\nlabels: ['type: bug']\nbody:\n - type: markdown\n "
},
{
"path": ".github/ISSUE_TEMPLATE/feature.yml",
"chars": 1064,
"preview": "name: 🌟 Feature Request\ndescription: Suggest an idea\ntitle: '[Feature]: title'\nlabels: ['type: enhancement']\nbody:\n -"
},
{
"path": ".github/actions/build-for-linux/Dockerfile",
"chars": 112,
"preview": "FROM rust:bullseye\nCOPY entrypoint.sh /entrypoint.sh\nRUN chmod a+x /entrypoint.sh\nENTRYPOINT [\"/entrypoint.sh\"] "
},
{
"path": ".github/actions/build-for-linux/action.yml",
"chars": 355,
"preview": "name: 'Build for Linux'\nbranding:\n icon: user-check\n color: gray-dark\ninputs:\n target:\n required: true\n "
},
{
"path": ".github/actions/build-for-linux/entrypoint.sh",
"chars": 2795,
"preview": "#!/bin/bash\n\nwget https://nodejs.org/dist/v19.8.1/node-v19.8.1-linux-x64.tar.xz\ntar -Jxvf ./node-v19.8.1-linux-x64.tar.x"
},
{
"path": ".github/actions/build.sh",
"chars": 305,
"preview": "# pnpm install --resolution-only\npnpm install\nsed -i \"s/#openssl/openssl={version=\\\"0.10\\\",features=[\\\"vendored\\\"]}/g\" s"
},
{
"path": ".github/workflows/package.yml",
"chars": 21995,
"preview": "name: Package\non:\n push:\n branches: [master]\n tags-ignore: [updater]\npermissions: write-all\n\njobs:\n "
},
{
"path": ".gitignore",
"chars": 218,
"preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndis"
},
{
"path": ".node-version",
"chars": 2,
"preview": "21"
},
{
"path": ".prettierignore",
"chars": 46,
"preview": "asset\ndist\nnode_modules\npublic\ntarget\n*-lock*\n"
},
{
"path": ".prettierrc.json",
"chars": 547,
"preview": "{\n \"arrowParens\": \"always\",\n \"bracketSameLine\": false,\n \"bracketSpacing\": true,\n \"embeddedLanguageFormatting"
},
{
"path": ".scripts/popclip/Config.plist",
"chars": 1196,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": ".scripts/popclip/Pot.sh",
"chars": 174,
"preview": "curl -Lsd \"$POPCLIP_TEXT\" \"127.0.0.1:60828\"\n\nif [ $? -eq 0 ]; then\n exit 0\nelse\n open -g -a pot\n sleep 2\n cu"
},
{
"path": ".scripts/popclip/build.sh",
"chars": 181,
"preview": "rm Pot.popclipextz\nmkdir Pot.popclipext\ncp Config.plist Pot.popclipext\ncp Pot.png Pot.popclipext\ncp Pot.sh Pot.popclipex"
},
{
"path": ".scripts/snipdo/build.sh",
"chars": 37,
"preview": "zip pot.pbar pot.json pot.png pot.ps1"
},
{
"path": ".scripts/snipdo/pot.json",
"chars": 263,
"preview": "{\n \"name\": \"Pot Translation\",\n \"identifier\": \"com.pot-app.snipdoext.desktop\",\n \"icon\": \"pot.png\",\n \"actions\""
},
{
"path": ".scripts/snipdo/pot.ps1",
"chars": 177,
"preview": "param(\n[string]$PLAIN_TEXT\n)\n\n$encode_text = [System.Text.Encoding]::UTF8.GetBytes($PLAIN_TEXT)\n\ncurl 127.0.0.1:60828/tr"
},
{
"path": ".vscode/extensions.json",
"chars": 105,
"preview": "{\n \"recommendations\": [\"tauri-apps.tauri-vscode\", \"rust-lang.rust-analyzer\", \"vadimcn.vscode-lldb\"]\n}\n"
},
{
"path": ".vscode/launch.json",
"chars": 658,
"preview": "{\n \"version\": \"0.2.0\",\n \"configurations\": [\n {\n \"type\": \"lldb\",\n \"request\": \"launch\","
},
{
"path": ".vscode/tasks.json",
"chars": 674,
"preview": "{\n \"version\": \"2.0.0\",\n \"tasks\": [\n {\n \"label\": \"tauri:dev\",\n \"type\": \"shell\",\n "
},
{
"path": "CHANGELOG",
"chars": 140,
"preview": "## 3.0.7 (2025-5-10)\n\n### New feature:\n\n- signed macOS app\n\n### Bugs fixed:\n\n- fix screenshot on macOS\n- rm tray c"
},
{
"path": "LICENSE",
"chars": 35149,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 13554,
"preview": "<img width=\"200px\" src=\"public/icon.svg\" align=\"left\"/>\n\n# Pot (派了个萌的翻译器)\n\n> 🌈 一个跨平台的划词翻译软件 ([QQ 频道](https://pd.qq.com/s"
},
{
"path": "README_EN.md",
"chars": 19277,
"preview": "<img width=\"200px\" src=\"public/icon.svg\" align=\"left\"/>\n\n# Pot (A cute translator)\n\n> A cross-platform translator applic"
},
{
"path": "README_KR.md",
"chars": 15822,
"preview": "<img width=\"200px\" src=\"public/icon.svg\" align=\"left\"/>\n\n# Pot (간편 번역기)\n\n> A cross-platform translator application ([Tel"
},
{
"path": "com.pot_app.pot.metainfo.xml",
"chars": 11488,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<component type=\"desktop-application\">\n <id>com.pot_app.pot</id>\n <name>Pot"
},
{
"path": "daemon.html",
"chars": 280,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <link\n rel=\"icon\"\n "
},
{
"path": "index.html",
"chars": 549,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <link\n rel=\"icon\"\n "
},
{
"path": "package.json",
"chars": 1997,
"preview": "{\n \"name\": \"pot\",\n \"private\": true,\n \"version\": \"3.0.7\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": "
},
{
"path": "patches/hyprland.patch",
"chars": 1052,
"preview": "From ef74289f660bcb9d407056a42a045804f6b8ecbf Mon Sep 17 00:00:00 2001\nFrom: Pylogmon <pylogmon@outlook.com>\nDate: Wed, "
},
{
"path": "postcss.config.js",
"chars": 93,
"preview": "export default {\n plugins: {\n tailwindcss: {},\n autoprefixer: {},\n },\n};\n"
},
{
"path": "public/tesseract-core-simd-lstm.wasm.js",
"chars": 3938114,
"preview": "\nvar TesseractCore = (() => {\n var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.cu"
},
{
"path": "src/App.jsx",
"chars": 4122,
"preview": "import { appWindow } from '@tauri-apps/api/window';\nimport { BrowserRouter } from 'react-router-dom';\nimport { useTransl"
},
{
"path": "src/components/WindowControl/index.jsx",
"chars": 1907,
"preview": "import { VscChromeClose, VscChromeMinimize, VscChromeMaximize, VscChromeRestore } from 'react-icons/vsc';\nimport React, "
},
{
"path": "src/components/WindowControl/style.css",
"chars": 66,
"preview": ".close-button:hover {\n background-color: #c42b1c !important;\n}\n"
},
{
"path": "src/hooks/index.jsx",
"chars": 121,
"preview": "export * from './useConfig';\nexport * from './useToastStyle';\nexport * from './useSyncAtom';\nexport * from './useVoice';"
},
{
"path": "src/hooks/useConfig.jsx",
"chars": 1908,
"preview": "import { useCallback, useEffect } from 'react';\nimport { listen, emit } from '@tauri-apps/api/event';\nimport { useGetSta"
},
{
"path": "src/hooks/useGetState.jsx",
"chars": 322,
"preview": "import { useState, useRef, useCallback } from 'react';\n\nexport const useGetState = (initState) => {\n const [state, se"
},
{
"path": "src/hooks/useSyncAtom.jsx",
"chars": 364,
"preview": "import { useAtom } from 'jotai';\n\nimport { useGetState } from './useGetState';\n\nexport const useSyncAtom = (atom) => {\n "
},
{
"path": "src/hooks/useToastStyle.jsx",
"chars": 510,
"preview": "import { semanticColors } from '@nextui-org/theme';\nimport { useTheme } from 'next-themes';\n\nexport const useToastStyle "
},
{
"path": "src/hooks/useVoice.jsx",
"chars": 864,
"preview": "import { useCallback } from 'react';\nlet audioContext = new (window.AudioContext || window.webkitAudioContext)();\nlet so"
},
{
"path": "src/i18n/index.jsx",
"chars": 1675,
"preview": "import { initReactI18next } from 'react-i18next';\nimport i18n from 'i18next';\nimport zh_CN from './locales/zh_CN.json';\n"
},
{
"path": "src/i18n/locales/ar_AE.json",
"chars": 19250,
"preview": "{\n \"translation\": {\n \"common\": {\n \"cancel\": \"إلغاء\",\n \"ok\": \"حسنا\",\n \"plugin\""
},
{
"path": "src/i18n/locales/de_DE.json",
"chars": 18842,
"preview": "{\n \"translation\": {\n \"common\": {\n \"ok\": \"OK\",\n \"cancel\": \"Abbrechen\",\n \"save\""
},
{
"path": "src/i18n/locales/en_US.json",
"chars": 19218,
"preview": "{\n \"translation\": {\n \"common\": {\n \"ok\": \"Ok\",\n \"cancel\": \"Cancel\",\n \"save\": \""
},
{
"path": "src/i18n/locales/es_ES.json",
"chars": 12577,
"preview": "{\n \"translation\": {\n \"common\": {\n \"ok\": \"De acuerdo\",\n \"plugin\": \"Complemento\",\n "
},
{
"path": "src/i18n/locales/fa_IR.json",
"chars": 4531,
"preview": "{\n \"translation\": {\n \"languages\": {\n \"mn_cy\": \"مغولی (سیریلیک)\",\n \"ar\": \"عربی\",\n "
},
{
"path": "src/i18n/locales/fr_FR.json",
"chars": 20721,
"preview": "{\n \"translation\": {\n \"services\": {\n \"help\": \"Guide de configuration\",\n \"no_need\": \"Aucun"
},
{
"path": "src/i18n/locales/he_IL.json",
"chars": 16141,
"preview": "{\n \"translation\": {\n \"common\": {\n \"write_clipboard\": \"כתוב ללוח\",\n \"coming\": \"בקרוב…\",\n "
},
{
"path": "src/i18n/locales/it_IT.json",
"chars": 17837,
"preview": "{\n \"translation\": {\n \"common\": {\n \"ok\": \"Ok\",\n \"plugin\": \"Plugin\",\n \"cancel\":"
},
{
"path": "src/i18n/locales/ja_JP.json",
"chars": 4735,
"preview": "{\n \"translation\": {\n \"config\": {\n \"translate\": {\n \"title\": \"翻訳設定\",\n \""
},
{
"path": "src/i18n/locales/ko_KR.json",
"chars": 9797,
"preview": "{\n \"translation\": {\n \"common\": {\n \"ok\": \"Ok\",\n \"cancel\": \"취소\",\n \"save\": \"저장\","
},
{
"path": "src/i18n/locales/nb_NO.json",
"chars": 2454,
"preview": "{\n \"translation\": {\n \"common\": {\n \"ok\": \"Ok\"\n },\n \"services\": {\n \"translat"
},
{
"path": "src/i18n/locales/nn_NO.json",
"chars": 2454,
"preview": "{\n \"translation\": {\n \"common\": {\n \"ok\": \"Ok\"\n },\n \"services\": {\n \"translat"
},
{
"path": "src/i18n/locales/pt_BR.json",
"chars": 20033,
"preview": "{\n \"translation\": {\n \"common\": {\n \"ok\": \"Ok\",\n \"cancel\": \"Cancelar\",\n \"save\":"
},
{
"path": "src/i18n/locales/pt_PT.json",
"chars": 20023,
"preview": "{\n \"translation\": {\n \"common\": {\n \"ok\": \"Ok\",\n \"plugin\": \"Plugin\",\n \"cancel\":"
},
{
"path": "src/i18n/locales/ru_RU.json",
"chars": 19556,
"preview": "{\n \"translation\": {\n \"common\": {\n \"ok\": \"ОК\",\n \"cancel\": \"Отмена\",\n \"save\": \""
},
{
"path": "src/i18n/locales/ta_IN.json",
"chars": 20195,
"preview": "{\n \"translation\": {\n \"languages\": {\n \"pt_pt\": \"போர்த்துகீசியம்\",\n \"auto\": \"ஆட்டோ கண்டறித"
},
{
"path": "src/i18n/locales/tk_TM.json",
"chars": 2936,
"preview": "{\n \"translation\": {\n \"config\": {\n \"general\": {\n \"default_font\": \"Bellenen\",\n "
},
{
"path": "src/i18n/locales/tr_TR.json",
"chars": 2454,
"preview": "{\n \"translation\": {\n \"common\": {\n \"ok\": \"Ok\"\n },\n \"services\": {\n \"translat"
},
{
"path": "src/i18n/locales/uk_UA.json",
"chars": 3958,
"preview": "{\n \"translation\": {\n \"common\": {\n \"cancel\": \"Відміна\",\n \"ok\": \"Ок\",\n \"save\": "
},
{
"path": "src/i18n/locales/zh_CN.json",
"chars": 16255,
"preview": "{\n \"translation\": {\n \"common\": {\n \"ok\": \"确定\",\n \"cancel\": \"取消\",\n \"save\": \"保存\","
},
{
"path": "src/i18n/locales/zh_TW.json",
"chars": 16284,
"preview": "{\n \"translation\": {\n \"common\": {\n \"ok\": \"確定\",\n \"cancel\": \"取消\",\n \"save\": \"儲存\","
},
{
"path": "src/main.jsx",
"chars": 817,
"preview": "import { ThemeProvider as NextThemesProvider } from 'next-themes';\nimport { appWindow } from '@tauri-apps/api/window';\ni"
},
{
"path": "src/services/collection/anki/Config.jsx",
"chars": 4506,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Button, Input } from '@nextui-org/r"
},
{
"path": "src/services/collection/anki/index.jsx",
"chars": 3613,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\nimport { store } from '../../../utils/store';\n\nexport async function"
},
{
"path": "src/services/collection/anki/info.ts",
"chars": 70,
"preview": "export const info = {\n name: 'anki',\n icon: 'logo/anki.svg',\n};\n"
},
{
"path": "src/services/collection/eudic/Config.jsx",
"chars": 5423,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Button, Input } from '@nextui-org/r"
},
{
"path": "src/services/collection/eudic/index.jsx",
"chars": 1946,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\n\nexport async function collection(source, target, options = {}) {\n "
},
{
"path": "src/services/collection/eudic/info.ts",
"chars": 72,
"preview": "export const info = {\n name: 'eudic',\n icon: 'logo/eudic.png',\n};\n"
},
{
"path": "src/services/collection/index.jsx",
"chars": 125,
"preview": "import * as _anki from './anki';\nimport * as _eudic from './eudic';\n\nexport const anki = _anki;\nexport const eudic = _eu"
},
{
"path": "src/services/recognize/baidu/Config.jsx",
"chars": 6121,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Button, Input } from '@nextui-org/r"
},
{
"path": "src/services/recognize/baidu/index.jsx",
"chars": 2065,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\n\nexport async function recognize(base64, language, options = {}) {\n "
},
{
"path": "src/services/recognize/baidu/info.ts",
"chars": 357,
"preview": "export const info = {\n name: 'baidu_ocr',\n icon: 'logo/baidu.svg',\n};\n\nexport enum Language {\n auto = 'CHN_ENG'"
},
{
"path": "src/services/recognize/baidu_accurate/Config.jsx",
"chars": 6148,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Button, Input } from '@nextui-org/r"
},
{
"path": "src/services/recognize/baidu_accurate/index.jsx",
"chars": 2066,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\n\nexport async function recognize(base64, language, options = {}) {\n "
},
{
"path": "src/services/recognize/baidu_accurate/info.ts",
"chars": 482,
"preview": "export const info = {\n name: 'baidu_accurate_ocr',\n icon: 'logo/baidu.svg',\n};\n\nexport enum Language {\n auto = "
},
{
"path": "src/services/recognize/baidu_img/Config.jsx",
"chars": 6093,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Button, Input } from '@nextui-org/r"
},
{
"path": "src/services/recognize/baidu_img/index.jsx",
"chars": 1826,
"preview": "import { readBinaryFile, BaseDirectory } from '@tauri-apps/api/fs';\nimport { fetch, Body } from '@tauri-apps/api/http';\n"
},
{
"path": "src/services/recognize/baidu_img/info.ts",
"chars": 446,
"preview": "export const info = {\n name: 'baidu_img_ocr',\n icon: 'logo/baidu.svg',\n};\n\nexport enum Language {\n auto = 'auto"
},
{
"path": "src/services/recognize/iflytek/Config.jsx",
"chars": 6982,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/recognize/iflytek/index.jsx",
"chars": 3379,
"preview": "import { fetch } from '@tauri-apps/api/http';\nimport CryptoJS from 'crypto-js';\n\nexport async function recognize(base64,"
},
{
"path": "src/services/recognize/iflytek/info.ts",
"chars": 183,
"preview": "export const info = {\n name: 'iflytek_ocr',\n icon: 'logo/iflytek.png',\n};\n\nexport enum Language {\n auto = 'zh_c"
},
{
"path": "src/services/recognize/iflytek_intsig/Config.jsx",
"chars": 7010,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/recognize/iflytek_intsig/index.jsx",
"chars": 2270,
"preview": "import { fetch } from '@tauri-apps/api/http';\nimport CryptoJS from 'crypto-js';\nimport { iflytek_auth } from '../iflytek"
},
{
"path": "src/services/recognize/iflytek_intsig/info.ts",
"chars": 441,
"preview": "export const info = {\n name: 'iflytek_intsig_ocr',\n icon: 'logo/iflytek.png',\n};\n\nexport enum Language {\n auto "
},
{
"path": "src/services/recognize/iflytek_latex/Config.jsx",
"chars": 7006,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/recognize/iflytek_latex/index.jsx",
"chars": 2224,
"preview": "import { fetch } from '@tauri-apps/api/http';\nimport hmacSHA256 from 'crypto-js/hmac-sha256';\nimport hashSHA256 from 'cr"
},
{
"path": "src/services/recognize/iflytek_latex/info.ts",
"chars": 189,
"preview": "export const info = {\n name: 'iflytek_latex_ocr',\n icon: 'logo/iflytek.png',\n};\n\nexport enum Language {\n auto ="
},
{
"path": "src/services/recognize/index.jsx",
"chars": 1445,
"preview": "import * as _system from './system';\nimport * as _tesseract from './tesseract';\nimport * as _baidu_ocr from './baidu';\ni"
},
{
"path": "src/services/recognize/qrcode/Config.jsx",
"chars": 653,
"preview": "import { useTranslation } from 'react-i18next';\nimport { Button } from '@nextui-org/react';\nimport React from 'react';\n\n"
},
{
"path": "src/services/recognize/qrcode/index.jsx",
"chars": 1051,
"preview": "import jsQR from 'jsqr';\n\nexport async function recognize(base64, language, options = {}) {\n let canvas = document.cr"
},
{
"path": "src/services/recognize/qrcode/info.ts",
"chars": 374,
"preview": "export const info = {\n name: 'qrcode',\n icon: 'logo/qrcode.svg',\n};\n\nexport enum Language {\n auto = '',\n zh_"
},
{
"path": "src/services/recognize/simple_latex/Config.jsx",
"chars": 5267,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/recognize/simple_latex/index.jsx",
"chars": 1121,
"preview": "import { readBinaryFile, BaseDirectory } from '@tauri-apps/api/fs';\nimport { fetch, Body } from '@tauri-apps/api/http';\n"
},
{
"path": "src/services/recognize/simple_latex/info.ts",
"chars": 193,
"preview": "export const info = {\n name: 'simple_latex_ocr',\n icon: 'logo/simple_latex.png',\n};\n\nexport enum Language {\n au"
},
{
"path": "src/services/recognize/system/Config.jsx",
"chars": 653,
"preview": "import { useTranslation } from 'react-i18next';\nimport { Button } from '@nextui-org/react';\nimport React from 'react';\n\n"
},
{
"path": "src/services/recognize/system/index.jsx",
"chars": 2962,
"preview": "import detect from '../../../utils/lang_detect';\nimport { osType } from '../../../utils/env';\nimport { invoke } from '@t"
},
{
"path": "src/services/recognize/system/info.ts",
"chars": 449,
"preview": "export const info = {\n name: 'system',\n icon: `system`,\n};\n\nexport enum Language {\n auto = 'auto',\n zh_cn = "
},
{
"path": "src/services/recognize/tencent/Config.jsx",
"chars": 6204,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/recognize/tencent/index.jsx",
"chars": 3985,
"preview": "import { fetch } from '@tauri-apps/api/http';\nimport hmacSHA256 from 'crypto-js/hmac-sha256';\nimport hashSHA256 from 'cr"
},
{
"path": "src/services/recognize/tencent/info.ts",
"chars": 439,
"preview": "export const info = {\n name: 'tencent_ocr',\n icon: 'logo/tencent_cloud.png',\n};\n\nexport enum Language {\n auto ="
},
{
"path": "src/services/recognize/tencent_accurate/Config.jsx",
"chars": 6170,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/recognize/tencent_accurate/index.jsx",
"chars": 3956,
"preview": "import { fetch } from '@tauri-apps/api/http';\nimport hmacSHA256 from 'crypto-js/hmac-sha256';\nimport hashSHA256 from 'cr"
},
{
"path": "src/services/recognize/tencent_accurate/info.ts",
"chars": 219,
"preview": "export const info = {\n name: 'tencent_accurate_ocr',\n icon: 'logo/tencent_cloud.png',\n};\n\nexport enum Language {\n "
},
{
"path": "src/services/recognize/tencent_img/Config.jsx",
"chars": 6159,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/recognize/tencent_img/index.jsx",
"chars": 4336,
"preview": "import hmacSHA256 from 'crypto-js/hmac-sha256';\nimport { fetch } from '@tauri-apps/api/http';\nimport hashSHA256 from 'cr"
},
{
"path": "src/services/recognize/tencent_img/info.ts",
"chars": 394,
"preview": "export const info = {\n name: 'tencent_img_ocr',\n icon: 'logo/tencent_cloud.png',\n};\n\nexport enum Language {\n au"
},
{
"path": "src/services/recognize/tesseract/Config.jsx",
"chars": 656,
"preview": "import { useTranslation } from 'react-i18next';\nimport { Button } from '@nextui-org/react';\nimport React from 'react';\n\n"
},
{
"path": "src/services/recognize/tesseract/index.jsx",
"chars": 635,
"preview": "import Tesseract from 'tesseract.js';\nimport { Language } from './info';\n\nexport async function recognize(base64, langua"
},
{
"path": "src/services/recognize/tesseract/info.ts",
"chars": 501,
"preview": "export const info = {\n name: 'tesseract',\n icon: 'logo/tesseract.png',\n};\n\nexport enum Language {\n auto = 'eng'"
},
{
"path": "src/services/recognize/volcengine/Config.jsx",
"chars": 6123,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/recognize/volcengine/index.jsx",
"chars": 4479,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\nimport CryptoJS from 'crypto-js';\n\nexport async function recognize(b"
},
{
"path": "src/services/recognize/volcengine/info.ts",
"chars": 205,
"preview": "export const info = {\n name: 'volcengine_ocr',\n icon: 'logo/volcengine.svg',\n};\n\nexport enum Language {\n auto ="
},
{
"path": "src/services/recognize/volcengine_multi_lang/Config.jsx",
"chars": 6156,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/recognize/volcengine_multi_lang/index.jsx",
"chars": 4501,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\nimport CryptoJS from 'crypto-js';\n\nexport async function recognize(b"
},
{
"path": "src/services/recognize/volcengine_multi_lang/info.ts",
"chars": 451,
"preview": "export const info = {\n name: 'volcengine_multi_lang_ocr',\n icon: 'logo/volcengine.svg',\n};\n\nexport enum Language {"
},
{
"path": "src/services/translate/alibaba/Config.jsx",
"chars": 5078,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/translate/alibaba/index.jsx",
"chars": 2345,
"preview": "import { fetch } from '@tauri-apps/api/http';\nimport HmacSHA1 from 'crypto-js/hmac-sha1';\nimport base64 from 'crypto-js/"
},
{
"path": "src/services/translate/alibaba/info.ts",
"chars": 672,
"preview": "export const info = {\n name: 'alibaba',\n icon: 'logo/alibaba.svg',\n};\n// https://help.aliyun.com/document_detail/2"
},
{
"path": "src/services/translate/baidu/Config.jsx",
"chars": 5002,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/translate/baidu/index.jsx",
"chars": 1252,
"preview": "import { fetch } from '@tauri-apps/api/http';\nimport { nanoid } from 'nanoid';\nimport md5 from 'md5';\n\nexport async func"
},
{
"path": "src/services/translate/baidu/info.ts",
"chars": 628,
"preview": "export const info = {\n name: 'baidu',\n icon: 'logo/baidu.svg',\n};\n// https://fanyi-api.baidu.com/product/113\nexpor"
},
{
"path": "src/services/translate/baidu_field/Config.jsx",
"chars": 6773,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { DropdownTrigger } from '@nextui-org"
},
{
"path": "src/services/translate/baidu_field/index.jsx",
"chars": 1300,
"preview": "import { fetch } from '@tauri-apps/api/http';\nimport { nanoid } from 'nanoid';\nimport md5 from 'md5';\n\nexport async func"
},
{
"path": "src/services/translate/baidu_field/info.ts",
"chars": 634,
"preview": "export const info = {\n name: 'baidu_field',\n icon: 'logo/baidu.svg',\n};\n// https://fanyi-api.baidu.com/product/113"
},
{
"path": "src/services/translate/bing/Config.jsx",
"chars": 687,
"preview": "import { useTranslation } from 'react-i18next';\nimport { Button } from '@nextui-org/react';\nimport React from 'react';\n\n"
},
{
"path": "src/services/translate/bing/index.jsx",
"chars": 2338,
"preview": "import { fetch } from '@tauri-apps/api/http';\n\nexport async function translate(text, from, to) {\n const token_url = '"
},
{
"path": "src/services/translate/bing/info.ts",
"chars": 689,
"preview": "export const info = {\n name: 'bing',\n icon: 'logo/bing.svg',\n};\n// https://learn.microsoft.com/en-us/azure/ai-serv"
},
{
"path": "src/services/translate/bing_dict/Config.jsx",
"chars": 692,
"preview": "import { useTranslation } from 'react-i18next';\nimport { Button } from '@nextui-org/react';\nimport React from 'react';\n\n"
},
{
"path": "src/services/translate/bing_dict/index.jsx",
"chars": 2556,
"preview": "import { fetch } from '@tauri-apps/api/http';\nconst DISPLAY_FORMAT_DEFAULT = '发音, 快速释义, 变形';\n\nexport async function tran"
},
{
"path": "src/services/translate/bing_dict/info.ts",
"chars": 180,
"preview": "export const info = {\n name: 'bing_dict',\n icon: 'logo/bing.svg',\n};\n\nexport enum Language {\n auto = 'auto',\n "
},
{
"path": "src/services/translate/caiyun/Config.jsx",
"chars": 4152,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/translate/caiyun/index.jsx",
"chars": 1083,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\n\nexport async function translate(text, from, to, options = {}) {\n "
},
{
"path": "src/services/translate/caiyun/info.ts",
"chars": 185,
"preview": "export const info = {\n name: 'caiyun',\n icon: 'logo/caiyun.svg',\n};\n\nexport enum Language {\n auto = 'auto',\n "
},
{
"path": "src/services/translate/cambridge_dict/Config.jsx",
"chars": 697,
"preview": "import { useTranslation } from 'react-i18next';\nimport { Button } from '@nextui-org/react';\nimport React from 'react';\n\n"
},
{
"path": "src/services/translate/cambridge_dict/index.jsx",
"chars": 3655,
"preview": "import { fetch } from '@tauri-apps/api/http';\nimport { Language } from './info';\n\nclass Pronunciation {\n constructor("
},
{
"path": "src/services/translate/cambridge_dict/info.ts",
"chars": 224,
"preview": "export const info = {\n name: 'cambridge_dict',\n icon: 'logo/cambridge_dict.svg',\n};\n\nexport enum Language {\n au"
},
{
"path": "src/services/translate/chatglm/Config.jsx",
"chars": 10220,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button, Textarea } from '@ne"
},
{
"path": "src/services/translate/chatglm/index.jsx",
"chars": 3177,
"preview": "import { Language } from './info';\nimport * as jose from 'jose';\nimport { info } from 'tauri-plugin-log-api';\n\nexport as"
},
{
"path": "src/services/translate/chatglm/info.ts",
"chars": 832,
"preview": "export const info = {\n name: 'chatglm',\n icon: 'logo/chatglm.png',\n};\n\nexport enum Language {\n auto = 'Auto',\n "
},
{
"path": "src/services/translate/deepl/Config.jsx",
"chars": 6923,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { DropdownTrigger } from '@nextui-org"
},
{
"path": "src/services/translate/deepl/index.jsx",
"chars": 4234,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\n\nexport async function translate(text, from, to, options = {}) {\n "
},
{
"path": "src/services/translate/deepl/info.ts",
"chars": 405,
"preview": "export const info = {\n name: 'deepl',\n icon: 'logo/deepl.svg',\n};\n\nexport enum Language {\n auto = 'auto',\n z"
},
{
"path": "src/services/translate/ecdict/Config.jsx",
"chars": 689,
"preview": "import { useTranslation } from 'react-i18next';\nimport { Button } from '@nextui-org/react';\nimport React from 'react';\n\n"
},
{
"path": "src/services/translate/ecdict/index.jsx",
"chars": 472,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\n\nexport async function translate(text, _from, _to) {\n const res ="
},
{
"path": "src/services/translate/ecdict/info.ts",
"chars": 166,
"preview": "export const info = {\n name: 'ecdict',\n icon: 'logo/ecdict.svg',\n};\n\nexport enum Language {\n auto = '',\n zh_"
},
{
"path": "src/services/translate/geminipro/Config.jsx",
"chars": 11603,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button, Switch, Textarea } f"
},
{
"path": "src/services/translate/geminipro/index.jsx",
"chars": 4527,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\nimport { Language } from './info';\n\nexport async function translate("
},
{
"path": "src/services/translate/geminipro/info.ts",
"chars": 837,
"preview": "export const info = {\n name: 'geminipro',\n icon: 'logo/geminipro.webp',\n};\n\nexport enum Language {\n auto = 'Aut"
},
{
"path": "src/services/translate/google/Config.jsx",
"chars": 3732,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/translate/google/index.jsx",
"chars": 2212,
"preview": "import { fetch } from '@tauri-apps/api/http';\n\nexport async function translate(text, from, to, options = {}) {\n const"
},
{
"path": "src/services/translate/google/info.ts",
"chars": 642,
"preview": "export const info = {\n name: 'google',\n icon: 'logo/google.svg',\n};\n// https://cloud.google.com/translate/docs/lan"
},
{
"path": "src/services/translate/index.jsx",
"chars": 1537,
"preview": "import * as _deepl from './deepl';\nimport * as _bing from './bing';\nimport * as _yandex from './yandex';\nimport * as _op"
},
{
"path": "src/services/translate/lingva/Config.jsx",
"chars": 689,
"preview": "import { useTranslation } from 'react-i18next';\nimport { Button } from '@nextui-org/react';\nimport React from 'react';\n\n"
},
{
"path": "src/services/translate/lingva/index.jsx",
"chars": 745,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\n\nexport async function translate(text, from, to) {\n let plain_tex"
},
{
"path": "src/services/translate/lingva/info.ts",
"chars": 660,
"preview": "export const info = {\n name: 'lingva',\n icon: 'logo/lingva.svg',\n};\n\n// https://cloud.google.com/translate/docs/la"
},
{
"path": "src/services/translate/niutrans/Config.jsx",
"chars": 4769,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button, Switch } from '@next"
},
{
"path": "src/services/translate/niutrans/index.jsx",
"chars": 952,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\n\nexport async function translate(text, from, to, options = {}) {\n "
},
{
"path": "src/services/translate/niutrans/info.ts",
"chars": 681,
"preview": "export const info = {\n name: 'niutrans',\n icon: 'logo/niutrans.svg',\n};\n// https://niutrans.com/documents/contents"
},
{
"path": "src/services/translate/ollama/Config.jsx",
"chars": 16284,
"preview": "import { Input, Button, Switch, Textarea, Card, CardBody, Link, Tooltip, Progress } from '@nextui-org/react';\nimport { I"
},
{
"path": "src/services/translate/ollama/index.jsx",
"chars": 1401,
"preview": "import { Language } from './info';\nimport { Ollama } from 'ollama/browser';\n\nexport async function translate(text, from,"
},
{
"path": "src/services/translate/ollama/info.ts",
"chars": 830,
"preview": "export const info = {\n name: 'ollama',\n icon: 'logo/ollama.png',\n};\n\nexport enum Language {\n auto = 'Auto',\n "
},
{
"path": "src/services/translate/openai/Config.jsx",
"chars": 16058,
"preview": "import { Input, Button, Switch, Textarea, Card, CardBody, Link } from '@nextui-org/react';\nimport { DropdownTrigger } fr"
},
{
"path": "src/services/translate/openai/index.jsx",
"chars": 5762,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\nimport { Language } from './info';\nimport { defaultRequestArguments "
},
{
"path": "src/services/translate/openai/info.ts",
"chars": 830,
"preview": "export const info = {\n name: 'openai',\n icon: 'logo/openai.svg',\n};\n\nexport enum Language {\n auto = 'Auto',\n "
},
{
"path": "src/services/translate/tencent/Config.jsx",
"chars": 4997,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/translate/tencent/index.jsx",
"chars": 3917,
"preview": "import { fetch } from '@tauri-apps/api/http';\nimport hmacSHA256 from 'crypto-js/hmac-sha256';\nimport hashSHA256 from 'cr"
},
{
"path": "src/services/translate/tencent/info.ts",
"chars": 490,
"preview": "export const info = {\n name: 'tencent',\n icon: 'logo/tencent.svg',\n};\n// 腾讯只支持这么多语言\n// https://cloud.tencent.com/d"
},
{
"path": "src/services/translate/transmart/Config.jsx",
"chars": 5026,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/translate/transmart/index.jsx",
"chars": 1307,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\n\nexport async function translate(text, from, to, options = {}) {\n "
},
{
"path": "src/services/translate/transmart/info.ts",
"chars": 469,
"preview": "export const info = {\n name: 'transmart',\n icon: 'logo/transmart.svg',\n};\n// https://docs.qq.com/doc/DY2NxUWpmdnB2"
},
{
"path": "src/services/translate/volcengine/Config.jsx",
"chars": 5023,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/translate/volcengine/index.jsx",
"chars": 4374,
"preview": "import { fetch } from '@tauri-apps/api/http';\nimport CryptoJS from 'crypto-js';\n\nexport async function translate(text, f"
},
{
"path": "src/services/translate/volcengine/info.ts",
"chars": 618,
"preview": "export const info = {\n name: 'volcengine',\n icon: 'logo/volcengine.svg',\n};\n// https://www.volcengine.com/docs/464"
},
{
"path": "src/services/translate/yandex/Config.jsx",
"chars": 689,
"preview": "import { useTranslation } from 'react-i18next';\nimport { Button } from '@nextui-org/react';\nimport React from 'react';\n\n"
},
{
"path": "src/services/translate/yandex/index.jsx",
"chars": 949,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport async function translat"
},
{
"path": "src/services/translate/yandex/info.ts",
"chars": 602,
"preview": "export const info = {\n name: 'yandex',\n icon: 'logo/yandex.svg',\n};\n// https://yandex.com/dev/translate/doc/en/con"
},
{
"path": "src/services/translate/youdao/Config.jsx",
"chars": 4998,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Input, Button } from '@nextui-org/r"
},
{
"path": "src/services/translate/youdao/index.jsx",
"chars": 3515,
"preview": "import { fetch } from '@tauri-apps/api/http';\nimport CryptoJS from 'crypto-js';\nimport { nanoid } from 'nanoid';\n\nexport"
},
{
"path": "src/services/translate/youdao/info.ts",
"chars": 669,
"preview": "export const info = {\n name: 'youdao',\n icon: 'logo/youdao.svg',\n};\n// https://ai.youdao.com/DOCSIRMA/html/trans/a"
},
{
"path": "src/services/tts/index.jsx",
"chars": 81,
"preview": "import * as _lingva_tts from './lingva';\n\nexport const lingva_tts = _lingva_tts;\n"
},
{
"path": "src/services/tts/lingva/Config.jsx",
"chars": 4092,
"preview": "import { INSTANCE_NAME_CONFIG_KEY } from '../../../utils/service_instance';\nimport { Button, Input } from '@nextui-org/r"
},
{
"path": "src/services/tts/lingva/index.jsx",
"chars": 584,
"preview": "import { fetch } from '@tauri-apps/api/http';\n\nexport async function tts(text, lang, options = {}) {\n const { config "
},
{
"path": "src/services/tts/lingva/info.ts",
"chars": 584,
"preview": "export const info = {\n name: 'lingva_tts',\n icon: 'logo/lingva.svg',\n};\n\nexport enum Language {\n auto = 'auto',"
},
{
"path": "src/style.css",
"chars": 395,
"preview": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n* {\n margin: 0;\n padding: 0;\n}\n\nhtml {\n border-radi"
},
{
"path": "src/utils/env.js",
"chars": 381,
"preview": "import { type, arch as archFn, version } from '@tauri-apps/api/os';\nimport { getVersion } from '@tauri-apps/api/app';\n\ne"
},
{
"path": "src/utils/index.js",
"chars": 197,
"preview": "export const debounce = (fn, delay = 500) => {\n let timer = null;\n return (...args) => {\n timer && clearTim"
},
{
"path": "src/utils/invoke_plugin.js",
"chars": 1179,
"preview": "import { appCacheDir, appConfigDir, join } from \"@tauri-apps/api/path\";\nimport { readBinaryFile, readTextFile } from \"@t"
},
{
"path": "src/utils/lang_detect.js",
"chars": 8832,
"preview": "import { fetch, Body } from '@tauri-apps/api/http';\nimport { invoke } from '@tauri-apps/api';\nimport { store } from './s"
},
{
"path": "src/utils/language.ts",
"chars": 1000,
"preview": "// ISO-639-1 + Country Code (Option)\n// https://zh.wikipedia.org/wiki/ISO_639-1%E4%BB%A3%E7%A0%81%E8%A1%A8\nexport const "
},
{
"path": "src/utils/service_instance.ts",
"chars": 1745,
"preview": "export enum ServiceType {\n TRANSLATE = 'translate',\n RECOGNIZE = 'recognize',\n TTS = 'tts',\n COLLECTION = 'c"
},
{
"path": "src/utils/store.js",
"chars": 561,
"preview": "import { Store } from 'tauri-plugin-store-api';\nimport { appConfigDir, join } from '@tauri-apps/api/path';\nimport { watc"
},
{
"path": "src/window/Config/components/SideBar/index.jsx",
"chars": 4372,
"preview": "import { useNavigate, useLocation } from 'react-router-dom';\nimport { BsInfoSquareFill } from 'react-icons/bs';\nimport {"
},
{
"path": "src/window/Config/index.jsx",
"chars": 3017,
"preview": "import { useLocation, useRoutes } from 'react-router-dom';\nimport React, { useEffect, useState } from 'react';\nimport { "
},
{
"path": "src/window/Config/pages/About/index.jsx",
"chars": 8721,
"preview": "import { Divider, Button, Popover, PopoverTrigger, PopoverContent, Tooltip } from '@nextui-org/react';\nimport { appLogDi"
},
{
"path": "src/window/Config/pages/Backup/AliyunModal/index.jsx",
"chars": 6522,
"preview": "import { Modal, ModalContent, ModalHeader, ModalBody, Button, Skeleton } from '@nextui-org/react';\nimport React, { useEf"
},
{
"path": "src/window/Config/pages/Backup/WebDavModal/index.jsx",
"chars": 6569,
"preview": "import { Modal, ModalContent, ModalHeader, ModalBody, Button, Skeleton } from '@nextui-org/react';\nimport React, { useEf"
},
{
"path": "src/window/Config/pages/Backup/index.jsx",
"chars": 12685,
"preview": "import { readTextFile, BaseDirectory } from '@tauri-apps/api/fs';\nimport { DropdownTrigger } from '@nextui-org/react';\ni"
}
]
// ... and 71 more files (download for full content)
About this extraction
This page contains the full source code of the pot-app/pot-desktop GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 271 files (4.9 MB), approximately 1.3M tokens, and a symbol index with 412 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.