├── .github └── workflows │ └── release.yml ├── .gitignore ├── .node-version ├── LICENSE ├── README.md ├── esbuild.config.mjs ├── manifest.json ├── package.json ├── pnpm-lock.yaml ├── readme-zh.md ├── src ├── icon.tsx ├── interface.ts ├── lang.ts ├── lang │ └── locale │ │ ├── ar.ts │ │ ├── be.ts │ │ ├── ca.ts │ │ ├── da.ts │ │ ├── de.ts │ │ ├── en-gb.ts │ │ ├── en.ts │ │ ├── es.ts │ │ ├── fr.ts │ │ ├── he.ts │ │ ├── hu.ts │ │ ├── id.ts │ │ ├── it.ts │ │ ├── ja.ts │ │ ├── ko.ts │ │ ├── ms.ts │ │ ├── nb.ts │ │ ├── ne.ts │ │ ├── nl.ts │ │ ├── pl.ts │ │ ├── pt-br.ts │ │ ├── pt.ts │ │ ├── ro.ts │ │ ├── ru.ts │ │ ├── sq.ts │ │ ├── th.ts │ │ ├── tr.ts │ │ ├── uk.ts │ │ ├── vi.ts │ │ ├── zh-cn.ts │ │ └── zh-tw.ts ├── main.ts ├── res.ts ├── setting.tsx ├── styles.scss ├── utils.ts └── views │ └── settings-view.tsx ├── styles.css ├── tsconfig.json └── versions.json /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Build plugin 2 | 3 | on: 4 | push: 5 | tags: 6 | - "*" 7 | 8 | env: 9 | PLUGIN_NAME: custom-image-auto-uploader 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v4 17 | - uses: pnpm/action-setup@v4 18 | with: 19 | run_install: false 20 | 21 | - name: Setup Node.js 22 | uses: actions/setup-node@v4 23 | with: 24 | node-version-file: ".node-version" 25 | cache: "pnpm" 26 | 27 | - name: Build 28 | id: build 29 | run: | 30 | pnpm install 31 | pnpm run build 32 | mkdir ${{ env.PLUGIN_NAME }} 33 | cp main.js manifest.json styles.css ${{ env.PLUGIN_NAME }} 34 | zip -r ${{ env.PLUGIN_NAME }}.zip ${{ env.PLUGIN_NAME }} 35 | ls 36 | echo "::set-output name=tag_name::$(git tag --sort version:refname | tail -n 1)" 37 | - name: Create Release 38 | id: create_release 39 | uses: actions/create-release@v1 40 | env: 41 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 42 | with: 43 | tag_name: ${{ github.ref }} 44 | release_name: ${{ github.ref }} 45 | draft: false 46 | prerelease: false 47 | - name: Upload zip file 48 | id: upload-zip 49 | uses: actions/upload-release-asset@v1 50 | env: 51 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 52 | with: 53 | upload_url: ${{ steps.create_release.outputs.upload_url }} 54 | asset_path: ./${{ env.PLUGIN_NAME }}.zip 55 | asset_name: ${{ env.PLUGIN_NAME }}-${{ steps.build.outputs.tag_name }}.zip 56 | asset_content_type: application/zip 57 | - name: Upload main.js 58 | id: upload-main 59 | uses: actions/upload-release-asset@v1 60 | env: 61 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 62 | with: 63 | upload_url: ${{ steps.create_release.outputs.upload_url }} 64 | asset_path: ./main.js 65 | asset_name: main.js 66 | asset_content_type: text/javascript 67 | - name: Upload manifest.json 68 | id: upload-manifest 69 | uses: actions/upload-release-asset@v1 70 | env: 71 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 72 | with: 73 | upload_url: ${{ steps.create_release.outputs.upload_url }} 74 | asset_path: ./manifest.json 75 | asset_name: manifest.json 76 | asset_content_type: application/json 77 | - name: Upload styles.css 78 | id: upload-css 79 | uses: actions/upload-release-asset@v1 80 | env: 81 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 82 | with: 83 | upload_url: ${{ steps.create_release.outputs.upload_url }} 84 | asset_path: ./styles.css 85 | asset_name: styles.css 86 | asset_content_type: application/json -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # vscode 2 | .vscode 3 | 4 | # Intellij 5 | *.iml 6 | .idea 7 | 8 | # npm 9 | node_modules 10 | 11 | # Don't include the compiled main.js file in the repo. 12 | # They should be uploaded to GitHub releases instead. 13 | main.js 14 | 15 | # Exclude sourcemaps 16 | *.map 17 | 18 | # obsidian 19 | data.json 20 | 21 | # Exclude macOS Finder (System Explorer) View States 22 | .DS_Store 23 | /src/dist 24 | /src/views/dist 25 | -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | v22.11.0 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 HaierKeys 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [中文文档](https://github.com/haierkeys/obsidian-custom-image-auto-uploader/blob/master/readme-zh.md) / [English Document](https://github.com/haierkeys/obsidian-custom-image-auto-uploader/blob/master/README.md) 2 | 3 | 4 |

Obsidian Custom Image Auto Uploader

5 | 6 |

7 | version 8 | license 9 |

10 | 11 | You can batch download images from notes on both computer and mobile devices, batch upload and save them to remote servers, home NAS, WebDAV, or cloud storage (Alibaba Cloud OSS, Amazon S3, Cloudflare R2, MinIO), and you can also stretch, crop, and resize images. 12 | 13 | ![](https://github.com/user-attachments/assets/0878061b-d77c-48c5-aa61-cc5154612a7b) 14 | 15 | ## Plugin Features: 16 | - **Batch download** online images in notes to local 17 | - **Batch upload** local images in notes to remote services ([Image Api Gateway](https://github.com/haierkeys/obsidian-image-api-gateway)) 18 | - Drag and drop, paste images to upload 19 | - Batch save images in notes to **remote server**, such as your web server or home NAS, and save them in WebDAV server. 20 | - Batch save images in notes to cloud storage, such as Alibaba Cloud OSS, Amazon S3, Cloudflare R2. 21 | - Support multi-end use, support Windows, MacOS, Linux, Android, iOS 22 | - Support multiple languages 23 | - Add image stretching and cropping function in note attributes or text content (e.g., for hugo blog cover image) 24 | - Proportional top-left fill (crop) 25 | - Proportional center fill (crop) 26 | - Fixed size stretch 27 | - Proportional fit 28 | 29 | ## Price 30 | 31 | If you find this plugin useful and want to support its continued development, you can support me here: 32 | [BuyMeACoffee](https://ko-fi.com/haierkeys) 33 | 34 | ## Quick Start 35 | 36 | 1. Install the plugin 37 | Open the OBSidian community plugin market, search **Custom Image Auto Uploader** for installation 38 | 2. Open plugin settings, set **Upload Settings** > **API Gateway Address** to your **Image Api Gateway** address, 39 | e.g., `http://127.0.0.1:9000/api/upload` 40 | 3. Set **API Access Token**. 41 | 4. Start **Image Api Gateway** service on remote server. 42 | 5. Create a note and copy an image to check if the upload is successful. 43 | 44 | ## Upload Image API Setup 45 | 46 | This plugin requires configuring **Image Api Gateway** to complete the upload work. 47 | **Image Api Gateway** is a free tool, for deployment and usage, please refer to [https://github.com/haierkeys/obsidian-image-api-gateway](https://github.com/haierkeys/obsidian-image-api-gateway). 48 | -------------------------------------------------------------------------------- /esbuild.config.mjs: -------------------------------------------------------------------------------- 1 | import esbuild from "esbuild"; 2 | import process from "process"; 3 | import builtins from "builtin-modules"; 4 | 5 | const banner = 6 | `/* 7 | THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 8 | if you want to view the source, please visit the github repository of this plugin 9 | */ 10 | `; 11 | 12 | const prod = (process.argv[2] === "production"); 13 | 14 | const context = await esbuild.context({ 15 | banner: { 16 | js: banner, 17 | }, 18 | entryPoints: ["src/main.ts"], 19 | bundle: true, 20 | external: [ 21 | "obsidian", 22 | "electron", 23 | "@codemirror/autocomplete", 24 | "@codemirror/collab", 25 | "@codemirror/commands", 26 | "@codemirror/language", 27 | "@codemirror/lint", 28 | "@codemirror/search", 29 | "@codemirror/state", 30 | "@codemirror/view", 31 | "@lezer/common", 32 | "@lezer/highlight", 33 | "@lezer/lr", 34 | ...builtins], 35 | format: "cjs", 36 | target: "es2018", 37 | logLevel: "info", 38 | sourcemap: prod ? false : "inline", 39 | treeShaking: true, 40 | outfile: "main.js", 41 | minify: prod, 42 | }); 43 | 44 | if (prod) { 45 | await context.rebuild(); 46 | process.exit(0); 47 | } else { 48 | await context.watch(); 49 | } 50 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "custom-image-auto-uploader", 3 | "name": "Custom Image Auto Uploader", 4 | "version": "2.7.7", 5 | "minAppVersion": "1.6.5", 6 | "description": "You can batch download images from your notes on desktop, iOS, and Android platforms, and batch upload and save them to a remote server, home NAS, or cloud storage (such as Alibaba Cloud OSS, Amazon S3, Cloudflare R2, MinIO). Additionally, you can stretch, crop, and resize the images.", 7 | "author": "HaierKeys", 8 | "authorUrl": "https://blog.diybeta.com", 9 | "isDesktopOnly": false, 10 | "fundingUrl": "https://ko-fi.com/haierkeys" 11 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Custom Image Auto Uploader", 3 | "version": "1.0.0", 4 | "description": "You can upload and save images from your notes to your remote server, home NAS, or sync them to your cloud storage (Alibaba Cloud OSS, Amazon S3, Cloudflare R2).", 5 | "main": "main.js", 6 | "scripts": { 7 | "dev": "node esbuild.config.mjs", 8 | "devcss": "sass --watch src/styles.scss styles.css", 9 | "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "MIT", 14 | "devDependencies": { 15 | "@types/node": "^22.13.5", 16 | "@types/react": "^19.0.10", 17 | "@types/react-dom": "^19.0.4", 18 | "@typescript-eslint/eslint-plugin": "^8.24.1", 19 | "@typescript-eslint/parser": "^8.24.1", 20 | "builtin-modules": "^4.0.0", 21 | "esbuild": "^0.24.2", 22 | "obsidian": "^1.8.7", 23 | "tslib": "^2.8.1", 24 | "typescript": "^5.7.3" 25 | }, 26 | "dependencies": { 27 | "file-type": "^19.6.0", 28 | "image-type": "^5.2.0", 29 | "react": "^19.0.0", 30 | "react-dom": "^19.0.0" 31 | }, 32 | "packageManager": "pnpm@9.12.3+sha512.cce0f9de9c5a7c95bef944169cc5dfe8741abfb145078c0d508b868056848a87c81e626246cb60967cbd7fd29a6c062ef73ff840d96b3c86c40ac92cf4a813ee" 33 | } 34 | -------------------------------------------------------------------------------- /readme-zh.md: -------------------------------------------------------------------------------- 1 | [中文文档](https://github.com/haierkeys/obsidian-custom-image-auto-uploader/blob/master/readme-zh.md) / [English Document](https://github.com/haierkeys/obsidian-custom-image-auto-uploader/blob/master/README.md) 2 | 3 | 4 |

自定义图片上传云端保存插件 For Obsidian

5 | 6 |

7 | version 8 | license 9 |

10 | 11 | 您可以在 电脑和手机 端上将笔记中的图片批量下载,批量上传保存到远端服务器、家庭 NAS、WebDAV 或者云存储上(阿里云 OSS 、亚马逊 S3 、Cloudflare R2 、MinIO ),并且您还可以对图片进行拉伸裁剪以及修改尺寸。 12 | 13 | ![](https://github.com/user-attachments/assets/0878061b-d77c-48c5-aa61-cc5154612a7b) 14 | 15 | ## 插件功能: 16 | - **批量下载**笔记内网络图片到本地 17 | - **批量上传**笔记中本地图片到远端服务 ( [ Image Api Gateway](https://github.com/haierkeys/obsidian-image-api-gateway) ) 18 | - 拖拽,粘贴 上传图片 19 | - 批量将笔记内图片保存到 **远端服务器**,例如您的 Web 服务器或家庭 NAS,以及保存在WebDAV服务器内。 20 | - 批量将笔记内图片保存到云存储内,例如阿里云 OSS、亚马逊 S3、Cloudflare R2。 21 | - 支持多端使用, 支持 Windows, MacOS, Linux, Android, iOS 22 | - 支持多国语言 23 | - 增加笔记属性或正文内图片拉伸裁剪功能 (例如 对 hugo 博客标题图 cover 进行) 24 | - 等比左上填充(裁剪) 25 | - 等比居中填充(裁剪) 26 | - 固定尺寸拉伸 27 | - 等比适应 28 | 29 | ## 价格 30 | 31 | 如果觉得这个插件很有用,并且想要支持它的继续开发,你可以在这里支持我: 32 | [BuyMeACoffee](https://ko-fi.com/haierkeys) 33 | 34 | ## 快速开始 35 | 36 | 1. 安装插件 37 | 打开 OBSidian 社区插件市场, 搜索 **Custom Image Auto Uploader** 安装 38 | 2. 打开插件配置项,将 **上传设置** > **API 网关地址** 设置为您的 **Image Api Gateway** 地址, 39 | 例如: `http://127.0.0.1:9000/api/upload` 40 | 3. 设置 **API 访问令牌**。 41 | 4. 在远端服务启动 **Image Api Gateway** 服务。 42 | 5. 创建一个笔记,并复制一个图片检查是否上传成功。 43 | 44 | ## 上传图片 API 搭建 45 | 46 | 此插件需要 配置 **Image Api Gateway** 才能完成上传工作。 47 | **Image Api Gateway** 为免费工具, 部署使用请参考 [https://github.com/haierkeys/obsidian-image-api-gateway](https://github.com/haierkeys/obsidian-image-api-gateway)。 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/icon.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import { MouseEvent } from "react"; 3 | 4 | export const ICON_TYPE = { 5 | trash: "trash", 6 | }; 7 | Object.freeze(ICON_TYPE); 8 | 9 | export const Icon = ({ iconType, onClick, className, label, active, disabled }: { iconType: string; onClick?: (e: MouseEvent) => void; className: string; label?: string; active?: boolean; disabled?: boolean }) => { 10 | let classes = `custom-icon ${className}`; 11 | if (active) { 12 | classes += " is-active"; 13 | } 14 | if (disabled) { 15 | classes += " is-disabled"; 16 | } 17 | return ( 18 |
{ 24 | if (!disabled) { 25 | onClick(e) 26 | } 27 | } 28 | : undefined 29 | }> 30 | 31 | {iconType === ICON_TYPE.trash ? ( 32 | <> 33 | 34 | 35 | 36 | 37 | 38 | 39 | ) : ( 40 | <> 41 | 42 | 43 | 44 | )} 45 | 46 |
47 | ) 48 | }; 49 | -------------------------------------------------------------------------------- /src/interface.ts: -------------------------------------------------------------------------------- 1 | import { TFile } from "obsidian" 2 | import { UploadSet } from "./setting" 3 | 4 | export interface Metadata { 5 | key: string 6 | type: string 7 | value: Array 8 | params: UploadSet 9 | } 10 | 11 | export interface DownTask { 12 | matchText: string // 原始匹配文本 13 | imageAlt: string // 图片替代文本 14 | imageUrl: string // 图片URL 15 | metadataItem?: Metadata 16 | } 17 | 18 | export interface UploadTask { 19 | matchText: string // 原始匹配文本 20 | imageAlt: string // 图片替代文本 21 | imageFile: TFile // 图片路径 22 | metadataItem?: Metadata 23 | } 24 | -------------------------------------------------------------------------------- /src/lang.ts: -------------------------------------------------------------------------------- 1 | import { moment } from "obsidian"; 2 | 3 | import ar from "src/lang/locale/ar"; 4 | import be from "src/lang/locale/be"; 5 | import ca from "src/lang/locale/ca"; 6 | import da from "src/lang/locale/da"; 7 | import de from "src/lang/locale/de"; 8 | import en from "src/lang/locale/en"; 9 | import enGB from "src/lang/locale/en-gb"; 10 | import es from "src/lang/locale/es"; 11 | //import fa from "src/lang/locale/fa"; 12 | import fr from "src/lang/locale/fr"; 13 | import he from "src/lang/locale/he"; 14 | import hu from "src/lang/locale/hu"; 15 | import id from "src/lang/locale/id"; 16 | import it from "src/lang/locale/it"; 17 | import ja from "src/lang/locale/ja"; 18 | import ko from "src/lang/locale/ko"; 19 | import ms from "src/lang/locale/ms"; 20 | import ne from "src/lang/locale/ne"; 21 | import nl from "src/lang/locale/nl"; 22 | import nb from "src/lang/locale/nb"; 23 | import pl from "src/lang/locale/pl"; 24 | import pt from "src/lang/locale/pt"; 25 | import ptBR from "src/lang/locale/pt-br"; 26 | import ro from "src/lang/locale/ro"; 27 | import ru from "src/lang/locale/ru"; 28 | import sq from "src/lang/locale/sq"; 29 | import th from "src/lang/locale/th"; 30 | import tr from "src/lang/locale/tr"; 31 | import uk from "src/lang/locale/uk"; 32 | import vi from "src/lang/locale/vi"; 33 | import zhCN from "src/lang/locale/zh-cn"; 34 | import zhTW from "src/lang/locale/zh-tw"; 35 | 36 | 37 | export interface lang { 38 | [propName: string]: any; 39 | } 40 | 41 | export const localeMap: { [k: string]: Partial } = { 42 | ar, 43 | be, 44 | ca, 45 | da, 46 | de, 47 | en, 48 | "en-gb": enGB, 49 | es, 50 | // fa, 51 | fr, 52 | he, 53 | hu, 54 | id, 55 | it, 56 | ja, 57 | ko, 58 | ms, 59 | ne, 60 | nl, 61 | nb, 62 | pl, 63 | pt, 64 | "pt-br": ptBR, 65 | ro, 66 | ru, 67 | sq, 68 | th, 69 | tr, 70 | uk, 71 | vi, 72 | "zh-cn": zhCN, 73 | "zh-tw": zhTW, 74 | }; 75 | 76 | const locale = localeMap[moment.locale()]; 77 | 78 | // https://stackoverflow.com/a/41015840/ 79 | function interpolate(str: string, params: Record): string { 80 | const names: string[] = Object.keys(params); 81 | const vals: unknown[] = Object.values(params); 82 | return new Function(...names, `return \`${str}\`;`)(...vals); 83 | } 84 | 85 | export function $(str: keyof typeof en, params?: Record): string { 86 | 87 | const result = (locale && locale[str]) || en[str]; 88 | 89 | if (params) { 90 | return interpolate(result, params); 91 | } 92 | 93 | return result; 94 | } 95 | 96 | 97 | // // CARD_TYPES_SUMMARY: "总卡片数: ${totalCardsCount}", 98 | // t("CARD_TYPES_SUMMARY", { totalCardsCount }), 99 | /** 100 | 101 | 通过AI 进行多语言翻译 102 | 103 | 我提供一段typescript的代码,键的部分保持简体中文,你帮我把值的部分翻译成英文。 104 | 105 | 106 | 键的部分保持简体中文,再帮我把值的部分翻译成繁体中文 107 | 108 | 109 | 键的部分保持简体中文,再帮我把值的部分翻译成阿拉伯语 ar 110 | 键的部分保持简体中文,再帮我把值的部分翻译成白俄罗斯语 be 111 | 键的部分保持简体中文,再帮我把值的部分翻译成加泰罗尼亚语 ca 112 | 键的部分保持简体中文,再帮我把值的部分翻译成丹麦语 da 113 | 键的部分保持简体中文,再帮我把值的部分翻译成德语 de 114 | 键的部分保持简体中文,再帮我把值的部分翻译成西班牙语 es 115 | 键的部分保持简体中文,再帮我把值的部分翻译成法语 fr 116 | 键的部分保持简体中文,再帮我把值的部分翻译成希伯来语 he 117 | 键的部分保持简体中文,再帮我把值的部分翻译成匈牙利语 hu 118 | 键的部分保持简体中文,再帮我把值的部分翻译成印度尼西亚语 id 119 | 键的部分保持简体中文,再帮我把值的部分翻译成意大利语 it 120 | 键的部分保持简体中文,再帮我把值的部分翻译成日语 ja 121 | 键的部分保持简体中文,再帮我把值的部分翻译成韩语 ko 122 | 键的部分保持简体中文,再帮我把值的部分翻译成马来语 ms 123 | 键的部分保持简体中文,再帮我把值的部分翻译成挪威语 nb 124 | 键的部分保持简体中文,再帮我把值的部分翻译成尼泊尔语 ne 125 | 键的部分保持简体中文,再帮我把值的部分翻译成荷兰语 nl 126 | 键的部分保持简体中文,再帮我把值的部分翻译成波兰语 pl 127 | 键的部分保持简体中文,再帮我把值的部分翻译成葡萄牙语 pt-br 128 | 键的部分保持简体中文,再帮我把值的部分翻译成葡萄牙语 pt 129 | 键的部分保持简体中文,再帮我把值的部分翻译成罗马尼亚语 ro 130 | 键的部分保持简体中文,再帮我把值的部分翻译成俄语 ru 131 | 键的部分保持简体中文,再帮我把值的部分翻译成阿尔巴尼亚语 sq 132 | 键的部分保持简体中文,再帮我把值的部分翻译成泰语 th 133 | 键的部分保持简体中文,再帮我把值的部分翻译成土耳其语 tr 134 | 键的部分保持简体中文,再帮我把值的部分翻译成乌克兰语 uk 135 | 键的部分保持简体中文,再帮我把值的部分翻译成越南语 vi 136 | 137 | 语言对照表 138 | am አማርኛ 139 | ar اَلْعَرَبِيَّةُ 140 | be беларуская мова 141 | ca català 142 | cs čeština 143 | da Dansk 144 | de Deutsch 145 | en English 146 | en-GB English (GB) 147 | es Español 148 | fa فارسی 149 | fr Français 150 | he עברית 151 | hu Magyar 152 | id Bahasa Indonesia 153 | it Italiano 154 | ja 日本語 155 | kh ខ្មែរ 156 | ko 한국어 157 | ms Bahasa Melayu 158 | ne नेपाली 159 | nl Nederlands 160 | no Norsk 161 | pl Polski 162 | pt Português 163 | pt-BR Português do Brasil 164 | ro Română 165 | ru Pусский 166 | sq Shqip 167 | th ไทย 168 | tr Türkçe 169 | uk Українська 170 | vi Tiếng Việt 171 | zh 简体中文 172 | zh-TW 繁體中文 173 | 174 | */ -------------------------------------------------------------------------------- /src/lang/locale/ar.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "تحميل جميع الصور", 6 | "上传全部图片": "رفع جميع الصور", 7 | 8 | //utils 9 | "自动上传": "التحميل التلقائي", 10 | "自动下载": "التنزيل التلقائي", 11 | "下载文件不是允许的图片类型": "الملف الذي تم تنزيله ليس من نوع الصورة المسموح به", 12 | "待上传图片不存在": "لا توجد صور للتحميل", 13 | "图片文件创建失败:": "فشل في إنشاء ملف الصورة: تحقق من صلاحيات إنشاء الملفات", 14 | "网络错误,请检查网络是否通畅": "خطأ في الشبكة، يرجى التحقق من اتصال الشبكة", 15 | 16 | // setting 17 | "通用": "الإعدادات العامة", 18 | "API 网关": "بوابة API", 19 | "是否自动上传": "هل تفعيل التحميل التلقائي؟", 20 | "如果关闭,您只能手动上传图片": "إذا تم تعطيله، يمكنك رفع الصور يدويًا فقط", 21 | "是否自动下载": "هل تفعيل التنزيل التلقائي؟", 22 | "如果关闭,您只能手动下载图片": "إذا تم تعطيله، يمكنك تنزيل الصور يدويًا فقط", 23 | "上传间隔时间": "فاصل تحميل الصور", 24 | "单位为毫秒,默认设置1s": "الوحدة هي الملي ثانية، الإعداد الافتراضي هو 1 ثانية", 25 | "关闭提示": "إيقاف الإشعارات", 26 | "关闭右上角结果提示": "إيقاف إشعارات النتائج في الزاوية اليمنى العليا", 27 | "下载": "تنزيل", 28 | "下载域名排除": "استبعاد النطاقات من التنزيل", 29 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "عناوين الصور في قائمة الاستبعاد لن يتم تنزيلها. سطر واحد لكل نطاق، يدعم الرموز البديلة *", 30 | "上传": "رفع", 31 | "API 网关地址": "عنوان بوابة API", 32 | "Image API Gateway 地址": "عنوان بوابة API للصور", 33 | "API 访问令牌": "رمز الوصول إلى API", 34 | "用于访问API的令牌": "رمز للوصول إلى API", 35 | "输入您的 API 访问令牌": "أدخل رمز الوصول إلى API الخاص بك", 36 | "输入您的 Image API Gateway 地址": "إعداد خدمة API", 37 | "项目地址": "عنوان المشروع", 38 | "是否上传后删除原图片": "هل يجب حذف الصورة الأصلية بعد الرفع؟", 39 | "在图片上传后是否删除本地原图片": "هل يجب حذف الصورة الأصلية محليًا بعد الرفع؟", 40 | "支持": "الدعم", 41 | "捐赠": "التبرع", 42 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "إذا كنت تحب هذا الملحق، يرجى التفكير في التبرع لدعم تطويره المستمر", 43 | "复制 Debug 信息": "نسخ معلومات التصحيح", 44 | "将调试信息复制到剪贴板, 可能包含敏感信!": "تم نسخ معلومات التصحيح إلى الحافظة، قد تحتوي على معلومات حساسة!", 45 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "افتح وحدة التحكم باستخدام اختصار لوحة المفاتيح، يمكنك رؤية سجلات هذا الملحق والملحقات الأخرى", 46 | 47 | "不处理": "لا تعالج", 48 | "等比左上填充(裁剪)": "تعبئة بنسبة متساوية من الزاوية العلوية اليسرى (اقتصاص)", 49 | "等比居中填充(裁剪)": "تعبئة بنسبة متساوية من المنتصف (اقتصاص)", 50 | "固定尺寸拉伸": "تمدد بحجم ثابت", 51 | "等比适应": "التناسب بنسبة متساوية", 52 | "笔记正文图片": "صورة نص الملاحظة", 53 | "笔记属性图片": "صورة خاصية الملاحظة", 54 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "تعيين وضع ضغط الصورة ، 0 لا قيود ، القيمة القصوى لا تتجاوز إعدادات الخادم ذات الصلة", 55 | "正文图片": "صورة النص", 56 | "宽度": "العرض", 57 | "高度": "الارتفاع", 58 | "调整压缩": "تعديل الضغط", 59 | "属性": "الخاصية", 60 | "添加属性图片上传": "إضافة رفع صورة الخاصية", 61 | "选择属性": "اختيار الخاصية", 62 | 63 | 64 | "图片上传地址增加随机查询": "إضافة سطر عشوائي إلى عنوان رفع الصورة لتجنب تخزين الصور في CDN", 65 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "إضافة سطر عشوائي إلى عنوان رفع الصورة لتجنب تخزين الصور في CDN", 66 | "一键上传下载": "رفع وتنزيل واحد", 67 | }; 68 | -------------------------------------------------------------------------------- /src/lang/locale/be.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Спампаваць усе выявы", 6 | "上传全部图片": "Загрузіць усе выявы", 7 | 8 | //utils 9 | "自动上传": "Аўтаматычная загрузка", 10 | "自动下载": "Аўтаматычнае спампаванне", 11 | "下载文件不是允许的图片类型": "Загружаны файл не з'яўляецца дазволеным тыпам выявы", 12 | "待上传图片不存在": "Няма малюнкаў для загрузкі", 13 | "图片文件创建失败:": "Памылка стварэння файла выявы: праверце правы на стварэнне файлаў", 14 | "网络错误,请检查网络是否通畅": "Памылка сеткі, калі ласка, праверце злучэнне з сеткай", 15 | 16 | // setting 17 | "通用": "Агульныя налады", 18 | "是否自动上传": "Уключыць аўтаматычную загрузку?", 19 | "如果关闭,您只能手动上传图片": "Калі адключыць, вы зможаце загружаць выявы толькі ўручную", 20 | "是否自动下载": "Уключыць аўтаматычнае спампаванне?", 21 | "如果关闭,您只能手动下载图片": "Калі адключыць, вы зможаце спампаваць выявы толькі ўручную", 22 | "上传间隔时间": "Інтэрвал загрузкі", 23 | "单位为毫秒,默认设置1s": "Адзінка ў мілісекундах, стандартная настройка 1 секунда", 24 | "关闭提示": "Адключыць апавяшчэнні", 25 | "关闭右上角结果提示": "Адключыць апавяшчэнні аб выніках у верхнім правым вуглу", 26 | "下载": "Спампаваць", 27 | "下载域名排除": "Выключэнне даменаў для спампоўкі", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Адрасы выяў у спісе выключэнняў не будуць загружаныя. Па адным дамене на радок, падтрымлівае выкарыстанне шаблона *", 29 | "上传": "Загрузіць", 30 | "API 网关地址": "Адрас API", 31 | "Image API Gateway 地址": "Адрас шлюзу API выявы", 32 | "API 访问令牌": "Токен доступу API", 33 | "用于访问API的令牌": "Токен для доступу да API", 34 | "输入您的 API 访问令牌": "Увядзіце ваш токен доступу да API", 35 | "输入您的 Image API Gateway 地址": "Наладзіць API сэрвіс", 36 | "项目地址": "Адрас праекта", 37 | "是否上传后删除原图片": "Ці трэба выдаліць арыгінальную выяву пасля загрузкі?", 38 | "在图片上传后是否删除本地原图片": "Ці трэба выдаліць арыгінальную выяву лакальна пасля загрузкі?", 39 | "支持": "Падтрымка", 40 | "捐赠": "Падтрыманне", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Калі вам падабаецца гэты плагін, разгледзьце магчымасць зрабіць ахвяраванне для падтрымкі далейшага развіцця", 42 | "复制 Debug 信息": "Капіяваць інфармацыю аб адладцы", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Інфармацыя аб адладцы была скапіявана ў буфер абмену, яна можа ўтрымліваць адчувальную інфармацыю!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Адкрыйце кансоль з дапамогай гарачых клавіш, каб убачыць лагі гэтага плагіна і іншых плагінаў", 45 | 46 | "不处理": "Не апрацоўваць", 47 | "等比左上填充(裁剪)": "Запаўненне з захаваннем прапорцый з верхняга левага кута (уражанне)", 48 | "等比居中填充(裁剪)": "Запаўненне з захаваннем прапорцый па цэнтры (уражанне)", 49 | "固定尺寸拉伸": "Растягванне да фіксаваных памераў", 50 | "等比适应": "Прапарцыйнае прыстасаванне", 51 | "笔记正文图片": "Выява асноўнага тэксту нататкі", 52 | "笔记属性图片": "Выява ўласцівасці нататкі", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Наладзіць рэжым сціскання малюнкаў, 0 — без абмежаванняў, максімальнае значэнне не перавышае налад сервера", 54 | "正文图片": "Выява тэксту", 55 | "宽度": "Шырыня", 56 | "高度": "Вышыня", 57 | "调整压缩": "Настройка сціскання", 58 | "属性": "Уласцівасць", 59 | "添加属性图片上传": "Дадаць загрузку выявы ўласцівасці", 60 | "选择属性": "Выбраць уласцівасць", 61 | 62 | "图片上传地址增加随机查询": "Дадаць выпадковы запыт да адрасу загрузкі выявы", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Дадаць выпадковы запыт да адрасу загрузкі выявы, каб выключыць кэшірованне CDN", 64 | "一键上传下载": "Загрузіць і спампаваць аднаклік", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/ca.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Descarregar totes les imatges", 6 | "上传全部图片": "Pujar totes les imatges", 7 | 8 | //utils 9 | "自动上传": "Pujada automàtica", 10 | "自动下载": "Descarrega automàtica", 11 | "下载文件不是允许的图片类型": "El fitxer descarregat no és un tipus d'imatge permès", 12 | "待上传图片不存在": "No hi ha imatges per pujar", 13 | "图片文件创建失败:": "Error en la creació del fitxer d'imatge: comprova els permisos de creació de fitxers", 14 | "网络错误,请检查网络是否通畅": "Error de xarxa, si us plau, comprova la connexió a la xarxa", 15 | 16 | // setting 17 | "通用": "Configuració general", 18 | "是否自动上传": "Activar pujada automàtica?", 19 | "如果关闭,您只能手动上传图片": "Si es desactiva, només podreu pujar les imatges manualment", 20 | "是否自动下载": "Activar descàrrega automàtica?", 21 | "如果关闭,您只能手动下载图片": "Si es desactiva, només podreu descarregar les imatges manualment", 22 | "上传间隔时间": "Interval de pujada", 23 | "单位为毫秒,默认设置1s": "L'unitat és mil·lisegons, la configuració per defecte és 1 segon", 24 | "关闭提示": "Desactivar notificacions", 25 | "关闭右上角结果提示": "Desactivar notificacions de resultats a la cantonada superior dreta", 26 | "下载": "Descarregar", 27 | "下载域名排除": "Exclusió de dominis per a descàrregues", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Les adreces d'imatges a la llista d'exclusió no seran descarregades. Un domini per línia, suporta el comodí *", 29 | "上传": "Pujar", 30 | "API 网关地址": "Adreça de l'API", 31 | "Image API Gateway 地址": "Adreça del portal API d'imatges", 32 | "API 访问令牌": "Token d'accés API", 33 | "用于访问API的令牌": "Token per accedir a l'API", 34 | "输入您的 API 访问令牌": "Introdueix el teu token d'accés a l'API", 35 | "输入您的 Image API Gateway 地址": "Configuració del servei API", 36 | "项目地址": "Adreça del projecte", 37 | "是否上传后删除原图片": "Esborrar la imatge original després de pujar-la?", 38 | "在图片上传后是否删除本地原图片": "Esborrar la imatge original local després de pujar-la?", 39 | "支持": "Suport", 40 | "捐赠": "Donacions", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Si t'agrada aquest complement, considera fer una donació per ajudar a continuar el desenvolupament", 42 | "复制 Debug 信息": "Copiar informació de depuració", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "S'ha copiat la informació de depuració al porta-retalls, pot contenir informació sensible!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Obre la consola amb una tecla de drecera per veure els registres d'aquest complement i d'altres complements", 45 | 46 | "不处理": "No processar", 47 | "等比左上填充(裁剪)": "Ompliment proporcional des de l'angle superior esquerre (retallar)", 48 | "等比居中填充(裁剪)": "Ompliment proporcional centrat (retallar)", 49 | "固定尺寸拉伸": "Estirament de mida fixa", 50 | "等比适应": "Adaptació proporcional", 51 | "笔记正文图片": "Imatge del cos de la nota", 52 | "笔记属性图片": "Imatge de la propietat de la nota", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Configura el mode de compressió d'imatges, 0 sense límits, el valor màxim no superarà la configuració del servidor", 54 | "正文图片": "Imatge del cos del text", 55 | "宽度": "Amplada", 56 | "高度": "Alçada", 57 | "调整压缩": "Ajustar la compressió", 58 | "属性": "Propietat", 59 | "添加属性图片上传": "Afegir càrrega d'imatge de propietat", 60 | "选择属性": "Seleccionar propietat", 61 | 62 | "图片上传地址增加随机查询": "Afegir una consulta aleatòria a l'adreça d'upload d'imatges per evitar el cach de CDN", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Afegir una consulta aleatòria a l'adreça d'upload d'imatges per evitar el cach de CDN", 64 | "一键上传下载": "Pujar i descarregar en un sol clic", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/da.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Hent alle billeder", 6 | "上传全部图片": "Upload alle billeder", 7 | 8 | //utils 9 | "自动上传": "Automatisk upload", 10 | "自动下载": "Automatisk download", 11 | "下载文件不是允许的图片类型": "Den downloadede fil er ikke en tilladt billedtype", 12 | "待上传图片不存在": "Ingen billeder til upload", 13 | "图片文件创建失败:": "Fejl ved oprettelse af billedfil: Kontroller filoprettelsesrettigheder", 14 | "网络错误,请检查网络是否通畅": "Netværksfejl, venligst kontroller din netværksforbindelse", 15 | 16 | // setting 17 | "通用": "Generelle indstillinger", 18 | "是否自动上传": "Aktiver automatisk upload?", 19 | "如果关闭,您只能手动上传图片": "Hvis deaktiveret, kan du kun uploade billeder manuelt", 20 | "是否自动下载": "Aktiver automatisk download?", 21 | "如果关闭,您只能手动下载图片": "Hvis deaktiveret, kan du kun downloade billeder manuelt", 22 | "上传间隔时间": "Uploadinterval", 23 | "单位为毫秒,默认设置1s": "Enheden er millisekunder, standardindstillingen er 1 sekund", 24 | "关闭提示": "Deaktiver notifikationer", 25 | "关闭右上角结果提示": "Deaktiver resultatsnotifikationer i øverste højre hjørne", 26 | "下载": "Hent", 27 | "下载域名排除": "Udelukkelse af domæner til download", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Billedadresser på udelukkelseslisten vil ikke blive downloadet. Ét domæne pr. linje, understøtter * wildcard", 29 | "上传": "Upload", 30 | "API 网关地址": "API-adresse", 31 | "Image API Gateway 地址": "Billede API Gateway adresse", 32 | "API 访问令牌": "API adgangstoken", 33 | "用于访问API的令牌": "Token til at få adgang til API", 34 | "输入您的 API 访问令牌": "Indtast dit API adgangstoken", 35 | "输入您的 Image API Gateway 地址": "Opsætning af API-tjeneste", 36 | "项目地址": "Projektadresse", 37 | "是否上传后删除原图片": "Slette originalbilledet efter upload?", 38 | "在图片上传后是否删除本地原图片": "Slette originalbilledet lokalt efter upload?", 39 | "支持": "Support", 40 | "捐赠": "Donation", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Hvis du kan lide dette plugin, bedes du overveje at donere for at støtte den fortsatte udvikling", 42 | "复制 Debug 信息": "Kopier fejlfindingsinformation", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Fejlfindingsinformationer er blevet kopieret til udklipsholderen, de kan indeholde følsomme oplysninger!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Åbn konsollen med en genvejstast, så kan du se logfilerne for dette plugin og andre plugins", 45 | 46 | "不处理": "Behandle ikke", 47 | "等比左上填充(裁剪)": "Proportional udfyldning fra øverste venstre hjørne (beskæring)", 48 | "等比居中填充(裁剪)": "Proportional udfyldning centreret (beskæring)", 49 | "固定尺寸拉伸": "Fast størrelse strækning", 50 | "等比适应": "Proportional tilpasning", 51 | "笔记正文图片": "Billede af notens hovedtekst", 52 | "笔记属性图片": "Billede af noteegenskab", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Indstil billedkomprimeringsmodus, 0 betyder ingen grænser, den maksimale værdi vil ikke overskride serverindstillingerne", 54 | "正文图片": "Hovedtekstbillede", 55 | "宽度": "Bredde", 56 | "高度": "Højde", 57 | "调整压缩": "Juster komprimering", 58 | "属性": "Egenskab", 59 | "添加属性图片上传": "Tilføj upload af billede af egenskab", 60 | "选择属性": "Vælg egenskab", 61 | 62 | "图片上传地址增加随机查询": "Tilføj en tilfældig forespørgsel til billede-upload-adressen for at undgå CDN-cachelagring", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Tilføj en tilfældig forespørgsel til billede-upload-adressen for at undgå CDN-cachelagring", 64 | "一键上传下载": "Upload og download i et klik", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/de.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Alle Bilder herunterladen", 6 | "上传全部图片": "Alle Bilder hochladen", 7 | 8 | //utils 9 | "自动上传": "Automatisches Hochladen", 10 | "自动下载": "Automatisches Herunterladen", 11 | "下载文件不是允许的图片类型": "Die heruntergeladene Datei ist kein zulässiger Bildtyp", 12 | "待上传图片不存在": "Keine Bilder zum Hochladen vorhanden", 13 | "图片文件创建失败:": "Fehler bei der Erstellung der Bilddatei: Überprüfen Sie die Berechtigungen zur Dateierstellung", 14 | "网络错误,请检查网络是否通畅": "Netzwerkfehler, bitte überprüfen Sie die Netzwerkverbindung", 15 | 16 | // setting 17 | "通用": "Allgemeine Einstellungen", 18 | "是否自动上传": "Automatisches Hochladen aktivieren?", 19 | "如果关闭,您只能手动上传图片": "Wenn deaktiviert, können Sie Bilder nur manuell hochladen", 20 | "是否自动下载": "Automatisches Herunterladen aktivieren?", 21 | "如果关闭,您只能手动下载图片": "Wenn deaktiviert, können Sie Bilder nur manuell herunterladen", 22 | "上传间隔时间": "Hochlade-Intervall", 23 | "单位为毫秒,默认设置1s": "Die Einheit ist Millisekunden, die Standardeinstellung ist 1 Sekunde", 24 | "关闭提示": "Benachrichtigungen deaktivieren", 25 | "关闭右上角结果提示": "Benachrichtigungen für Ergebnisse in der oberen rechten Ecke deaktivieren", 26 | "下载": "Herunterladen", 27 | "下载域名排除": "Domain-Exklusion für Downloads", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Bilderadressen in der Ausschlussliste werden nicht heruntergeladen. Ein Domain pro Zeile, unterstützt den Platzhalter *", 29 | "上传": "Hochladen", 30 | "API 网关地址": "API-Adresse", 31 | "Image API Gateway 地址": "Bild-API-Gateway-Adresse", 32 | "API 访问令牌": "API-Zugangstoken", 33 | "用于访问API的令牌": "Token zum Zugriff auf die API", 34 | "输入您的 API 访问令牌": "Geben Sie Ihr API-Zugangstoken ein", 35 | "输入您的 Image API Gateway 地址": "API-Dienst konfigurieren", 36 | "项目地址": "Projektadresse", 37 | "是否上传后删除原图片": "Originalbild nach dem Hochladen löschen?", 38 | "在图片上传后是否删除本地原图片": "Originalbild lokal nach dem Hochladen löschen?", 39 | "支持": "Unterstützung", 40 | "捐赠": "Spenden", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Wenn Ihnen dieses Plugin gefällt, denken Sie bitte darüber nach, eine Spende zu machen, um die Weiterentwicklung zu unterstützen", 42 | "复制 Debug 信息": "Debug-Informationen kopieren", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Die Debug-Informationen wurden in die Zwischenablage kopiert, sie könnten sensible Informationen enthalten!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Öffnen Sie die Konsole mit einer Tastenkombination, um die Protokolle dieses Plugins und anderer Plugins zu sehen", 45 | 46 | "不处理": "Nicht bearbeiten", 47 | "等比左上填充(裁剪)": "Proportionale Füllung von der oberen linken Ecke (Zuschneiden)", 48 | "等比居中填充(裁剪)": "Proportionale Füllung zentriert (Zuschneiden)", 49 | "固定尺寸拉伸": "Streckung auf feste Größe", 50 | "等比适应": "Proportionale Anpassung", 51 | "笔记正文图片": "Bild des Notiztextes", 52 | "笔记属性图片": "Bild der Notizeigenschaft", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Bildeinstellungen für die Kompression festlegen, 0 bedeutet keine Begrenzung, der Maximalwert überschreitet nicht die Servereinstellungen", 54 | "正文图片": "Haupttextbild", 55 | "宽度": "Breite", 56 | "高度": "Höhe", 57 | "调整压缩": "Kompression anpassen", 58 | "属性": "Eigenschaft", 59 | "添加属性图片上传": "Bild der Eigenschaft hochladen hinzufügen", 60 | "选择属性": "Eigenschaft auswählen", 61 | 62 | "图片上传地址增加随机查询": "Zufällige Abfrage an die Bild-Upload-Adresse hinzufügen, um CDN-Cache zu vermeiden", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Zufällige Abfrage an die Bild-Upload-Adresse hinzufügen, um CDN-Cache zu vermeiden", 64 | "一键上传下载": "Hochladen und herunterladen in einem Klick", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/en-gb.ts: -------------------------------------------------------------------------------- 1 | // British English 2 | 3 | export default {}; 4 | -------------------------------------------------------------------------------- /src/lang/locale/en.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | "Custom Image Auto Uploader": "Custom Image Auto Uploader", 5 | "已开启": "Enabled", 6 | "已关闭": "Disabled", 7 | 8 | 9 | //main 10 | "下载全部图片": "Download all images", 11 | "上传全部图片": "Upload all images", 12 | 13 | //utils 14 | "自动上传下载": "Automatic upload and download", 15 | "自动上传": "Automatic upload", 16 | "自动下载": "Automatic download", 17 | "下载文件不是允许的图片类型": "Downloaded file is not an allowed image type", 18 | "待上传图片不存在": "Image to be uploaded does not exist", 19 | "图片文件创建失败:": "Local file creation failed, please check if you have the creation permission", 20 | "网络错误,请检查网络是否通畅": "Network error, please check if the network is stable", 21 | 22 | // setting 23 | "通用": "Common", 24 | "API 网关": "API Gateway", 25 | "是否自动上传": "Automatic upload?", 26 | "如果关闭,您只能手动上传图片": "If disabled, you can only upload images manually", 27 | "是否自动下载": "Automatic download?", 28 | "如果关闭,您只能手动下载图片": "If disabled, you can only download images manually", 29 | "上传间隔时间": "Upload interval", 30 | "单位为毫秒,默认设置1s": "Unit in milliseconds, default setting is 1 second", 31 | "关闭提示": "Disable notifications", 32 | "关闭右上角结果提示": "Disable result notifications in the top-right corner", 33 | "下载": "Download", 34 | "下载域名排除": "Download domain exclusion", 35 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Image addresses in the exclusion list will not be downloaded, one domain per line, supports * wildcard", 36 | "上传": "Upload", 37 | "API 网关地址": "API gateway address", 38 | "Image API Gateway 地址": "Image API Gateway address", 39 | "API 访问令牌": "API access token", 40 | "用于访问API的令牌": "Token used to access the API", 41 | "输入您的 API 访问令牌": "Enter your API access token", 42 | "输入您的 Image API Gateway 地址": "Enter your Image API Gateway address", 43 | 44 | "接口配置信息已经粘贴到设置中!": "Interface configuration information has been pasted into the settings!", 45 | "网关服务选择": "Gateway service selection", 46 | "选择一个适合自己的网关服务": "Select a gateway service that suits you", 47 | "方式": "Method", 48 | "说明": "Description", 49 | "自行搭建": "Self-build", 50 | "速度好, 自由配置, 无隐私风险, 支持云存储和服务端存储": "Speed good, free configuration, no privacy risk, supports cloud storage and server storage", 51 | "多用户开放网关": "Multi-user open gateway", 52 | "稳定性好, 仅支持用户的云存储": "Stability good, only supports user cloud storage", 53 | "粘贴多用户开放网关的接口配置": "Paste multi-user open gateway interface configuration", 54 | 55 | "未检测到配置信息!": "No configuration information detected!", 56 | 57 | "项目地址": "Project address", 58 | "是否上传后删除原图片": "Delete original image after upload?", 59 | "在图片上传后是否删除本地原图片": "Delete local original image after upload?", 60 | "支持": "Support", 61 | "捐赠": "Donate", 62 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "If you like this plugin, please consider donating to support continued development.", 63 | "复制 Debug 信息": "Copy debug information", 64 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Copy debug information to clipboard, it may contain sensitive information!", 65 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Open the console using the shortcut, you can see the logs of this plugin and other plugins", 66 | 67 | 68 | "不处理": "Do not process", 69 | "等比左上填充(裁剪)": "Aspect ratio top-left fill (crop)", 70 | "等比居中填充(裁剪)": "Aspect ratio center fill (crop)", 71 | "固定尺寸拉伸": "Fixed size stretch", 72 | "等比适应": "Aspect ratio fit", 73 | "笔记正文图片": "Note body image", 74 | "笔记属性图片": "Note property image", 75 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Set image compression mode, 0 means no limit, the maximum value will not exceed server-side settings", 76 | "正文图片": "Body image", 77 | "宽度": "Width", 78 | "高度": "Height", 79 | "调整压缩": "Adjust compression", 80 | "属性": "Property", 81 | "添加属性图片上传": "Add property image upload", 82 | "选择属性": "Select property", 83 | 84 | 85 | 86 | "图片上传地址增加随机查询": "Add random query to image upload URL", 87 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Add a random query at the end of the image URL to avoid CDN caching", 88 | "一键上传下载": "One-click upload and download", 89 | 90 | "上传速度优化": "Upload speed optimization", 91 | "在图片上传前是否进行压缩": "Whether to compress the image before uploading", 92 | "上传速度优化 - 压缩质量": "Upload speed optimization - Compression quality", 93 | "压缩后的图片质量,范围0-1,默认0.8": "The quality of the compressed image, range 0-1, default 0.8", 94 | "上传速度优化 - 最大宽度": "Upload speed optimization - Maximum width", 95 | "压缩后的最大宽度,单位像素,默认1200": "The maximum width of the compressed image, in pixels, default 1200", 96 | "上传速度优化 - 最大高度": "Upload speed optimization - Maximum height", 97 | "压缩后的最大高度,单位像素,默认1200": "The maximum height of the compressed image, in pixels, default 1200", 98 | }; 99 | -------------------------------------------------------------------------------- /src/lang/locale/es.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Descargar todas las imágenes", 6 | "上传全部图片": "Subir todas las imágenes", 7 | 8 | //utils 9 | "自动上传": "Subida automática", 10 | "自动下载": "Descarga automática", 11 | "下载文件不是允许的图片类型": "El archivo descargado no es un tipo de imagen permitido", 12 | "待上传图片不存在": "No hay imágenes para subir", 13 | "图片文件创建失败:": "Error al crear el archivo de imagen: verifica los permisos de creación de archivos", 14 | "网络错误,请检查网络是否通畅": "Error de red, por favor verifica la conexión de red", 15 | 16 | // setting 17 | "通用": "Configuración general", 18 | "是否自动上传": "¿Subida automática activada?", 19 | "如果关闭,您只能手动上传图片": "Si se desactiva, solo podrás subir las imágenes manualmente", 20 | "是否自动下载": "¿Descarga automática activada?", 21 | "如果关闭,您只能手动下载图片": "Si se desactiva, solo podrás descargar las imágenes manualmente", 22 | "上传间隔时间": "Intervalo de subida", 23 | "单位为毫秒,默认设置1s": "La unidad es milisegundos, la configuración por defecto es 1 segundo", 24 | "关闭提示": "Desactivar notificaciones", 25 | "关闭右上角结果提示": "Desactivar notificaciones de resultados en la esquina superior derecha", 26 | "下载": "Descargar", 27 | "下载域名排除": "Exclusión de dominios para descarga", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Las direcciones de imágenes en la lista de exclusión no serán descargadas. Un dominio por línea, soporta el comodín *", 29 | "上传": "Subir", 30 | "API 网关地址": "Dirección de la API", 31 | "Image API Gateway 地址": "Dirección del portal de la API de imágenes", 32 | "API 访问令牌": "Token de acceso API", 33 | "用于访问API的令牌": "Token para acceder a la API", 34 | "输入您的 API 访问令牌": "Introduce tu token de acceso a la API", 35 | "输入您的 Image API Gateway 地址": "Configuración del servicio API", 36 | "项目地址": "Dirección del proyecto", 37 | "是否上传后删除原图片": "¿Eliminar la imagen original después de subirla?", 38 | "在图片上传后是否删除本地原图片": "¿Eliminar la imagen original local después de subirla?", 39 | "支持": "Soporte", 40 | "捐赠": "Donaciones", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Si te gusta este complemento, considera hacer una donación para apoyar el desarrollo continuo", 42 | "复制 Debug 信息": "Copiar información de depuración", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "La información de depuración ha sido copiada al portapapeles, ¡puede contener información sensible!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Abre la consola con una tecla de acceso rápido, podrás ver los registros de este complemento y otros complementos", 45 | 46 | "不处理": "No procesar", 47 | "等比左上填充(裁剪)": "Relleno proporcional desde la esquina superior izquierda (recortar)", 48 | "等比居中填充(裁剪)": "Relleno proporcional centrado (recortar)", 49 | "固定尺寸拉伸": "Estiramiento de tamaño fijo", 50 | "等比适应": "Ajuste proporcional", 51 | "笔记正文图片": "Imagen del cuerpo de la nota", 52 | "笔记属性图片": "Imagen de la propiedad de la nota", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Configurar modo de compresión de imagen, 0 significa sin límite, el valor máximo no superará la configuración del servidor", 54 | "正文图片": "Imagen del cuerpo del texto", 55 | "宽度": "Ancho", 56 | "高度": "Alto", 57 | "调整压缩": "Ajustar compresión", 58 | "属性": "Propiedad", 59 | "添加属性图片上传": "Añadir carga de imagen de propiedad", 60 | "选择属性": "Seleccionar propiedad", 61 | 62 | "图片上传地址增加随机查询": "Añadir una consulta aleatoria a la dirección de carga de imágenes para evitar el almacenamiento en caché de CDN", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Añadir una consulta aleatoria a la dirección de carga de imágenes para evitar el almacenamiento en caché de CDN", 64 | "一键上传下载": "Cargar y descargar en un solo clic", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/fr.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | "Custom Image Auto Uploader": "Custom Image Auto Uploader", 5 | "已开启": "Activé", 6 | "已关闭": "Désactivé", 7 | 8 | //main 9 | "下载全部图片": "Télécharger toutes les images", 10 | "上传全部图片": "Téléverser toutes les images", 11 | 12 | //utils 13 | "自动上传下载": "Téléversement et téléchargement automatiques", 14 | "自动上传": "Téléversement automatique", 15 | "自动下载": "Téléchargement automatique", 16 | "下载文件不是允许的图片类型": "Le fichier téléchargé n'est pas un type d'image autorisé", 17 | "待上传图片不存在": "Aucune image à téléverser", 18 | "图片文件创建失败:": "Échec de la création du fichier image : vérifiez les autorisations de création de fichiers", 19 | "网络错误,请检查网络是否通畅": "Erreur réseau, veuillez vérifier la connexion réseau", 20 | 21 | // setting 22 | "通用": "Paramètres généraux", 23 | "是否自动上传": "Activer le téléversement automatique ?", 24 | "如果关闭,您只能手动上传图片": "Si désactivé, vous ne pourrez téléverser les images que manuellement", 25 | "是否自动下载": "Activer le téléchargement automatique ?", 26 | "如果关闭,您只能手动下载图片": "Si désactivé, vous ne pourrez télécharger les images que manuellement", 27 | "上传间隔时间": "Intervalle de téléversement", 28 | "单位为毫秒,默认设置1s": "L'unité est en millisecondes, la valeur par défaut est 1 seconde", 29 | "关闭提示": "Désactiver les notifications", 30 | "关闭右上角结果提示": "Désactiver les notifications des résultats dans le coin supérieur droit", 31 | "下载": "Télécharger", 32 | "下载域名排除": "Exclusion des domaines de téléchargement", 33 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Les adresses des images dans la liste d'exclusion ne seront pas téléchargées. Un domaine par ligne, supporte le caractère générique *", 34 | "上传": "Téléverser", 35 | "API 网关地址": "Adresse de l'API", 36 | "Image API Gateway 地址": "Adresse du portail API d'image", 37 | "API 访问令牌": "Jeton d'accès API", 38 | "用于访问API的令牌": "Jeton pour accéder à l'API", 39 | "输入您的 API 访问令牌": "Entrez votre jeton d'accès API", 40 | "输入您的 Image API Gateway 地址": "Configuration du service API", 41 | "项目地址": "Adresse du projet", 42 | "是否上传后删除原图片": "Supprimer l'image originale après le téléversement ?", 43 | "在图片上传后是否删除本地原图片": "Supprimer l'image originale locale après le téléversement ?", 44 | "支持": "Support", 45 | "捐赠": "Dons", 46 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Si vous aimez ce plugin, veuillez envisager de faire un don pour soutenir son développement continu", 47 | "复制 Debug 信息": "Copier les informations de débogage", 48 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Les informations de débogage ont été copiées dans le presse-papiers, elles peuvent contenir des informations sensibles !", 49 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Ouvrez la console avec un raccourci clavier, vous pourrez voir les journaux de ce plugin et des autres plugins", 50 | 51 | "不处理": "Ne pas traiter", 52 | "等比左上填充(裁剪)": "Remplissage proportionnel depuis le coin supérieur gauche (découper)", 53 | "等比居中填充(裁剪)": "Remplissage proportionnel centré (découper)", 54 | "固定尺寸拉伸": "Étirement à taille fixe", 55 | "等比适应": "Adaptation proportionnelle", 56 | "笔记正文图片": "Image du corps de la note", 57 | "笔记属性图片": "Image de la propriété de la note", 58 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Configurer le mode de compression de l'image, 0 signifie pas de limite, la valeur maximale ne dépassera pas les paramètres du serveur", 59 | "正文图片": "Image du corps du texte", 60 | "宽度": "Largeur", 61 | "高度": "Hauteur", 62 | "调整压缩": "Ajuster la compression", 63 | "属性": "Propriété", 64 | "添加属性图片上传": "Ajouter un téléchargement d'image de propriété", 65 | "选择属性": "Sélectionner la propriété", 66 | 67 | "图片上传地址增加随机查询": "Ajouter une requête aléatoire à l'adresse de téléchargement d'images pour éviter le cache CDN", 68 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Ajouter une requête aléatoire à l'adresse de téléchargement d'images pour éviter le cache CDN", 69 | "一键上传下载": "Télécharger et télécharger en un clic", 70 | }; 71 | -------------------------------------------------------------------------------- /src/lang/locale/he.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "הורד את כל התמונות", 6 | "上传全部图片": "העלה את כל התמונות", 7 | 8 | //utils 9 | "自动上传": "העלאה אוטומטית", 10 | "自动下载": "הורדה אוטומטית", 11 | "下载文件不是允许的图片类型": "הקובץ שהורד אינו סוג תמונה מותר", 12 | "待上传图片不存在": "אין תמונה להעלות", 13 | "图片文件创建失败:": "יצירת קובץ התמונה נכשלה: בדוק את הרשאות יצירת הקובץ", 14 | "网络错误,请检查网络是否通畅": "שגיאת רשת, אנא בדוק את חיבור הרשת", 15 | 16 | // setting 17 | "通用": "הגדרות כלליות", 18 | "是否自动上传": "האם להפעיל העלאה אוטומטית?", 19 | "如果关闭,您只能手动上传图片": "אם תכבה את האפשרות הזו, תוכל להעלות תמונות ידנית בלבד", 20 | "是否自动下载": "האם להפעיל הורדה אוטומטית?", 21 | "如果关闭,您只能手动下载图片": "אם תכבה את האפשרות הזו, תוכל להוריד תמונות ידנית בלבד", 22 | "上传间隔时间": "מרווח זמן להעלאה", 23 | "单位为毫秒,默认设置1s": "היחידה היא מילישניות, ברירת המחדל היא שנייה אחת", 24 | "关闭提示": "כיבוי התראות", 25 | "关闭右上角结果提示": "כיבוי התראות התוצאות בפינה הימנית העליונה", 26 | "下载": "הורד", 27 | "下载域名排除": "החרגת דומיינים מהורדה", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "כתובת התמונות ברשימת ההחרגה לא תורד. אחד על כל שורה, תומך בכוכבית *", 29 | "上传": "העלה", 30 | "API 网关地址": "כתובת API", 31 | "Image API Gateway 地址": "כתובת שער ה-API של התמונה", 32 | "API 访问令牌": "אסימון גישה ל-API", 33 | "用于访问API的令牌": "אסימון לשימוש בגישה ל-API", 34 | "输入您的 API 访问令牌": "הכנס את אסימון הגישה שלך ל-API", 35 | "输入您的 Image API Gateway 地址": "הגדרת שירות API", 36 | "项目地址": "כתובת הפרויקט", 37 | "是否上传后删除原图片": "האם למחוק את התמונה המקורית לאחר ההעלאה?", 38 | "在图片上传后是否删除本地原图片": "האם למחוק את התמונה המקורית המקומית לאחר ההעלאה?", 39 | "支持": "תמיכה", 40 | "捐赠": "תרומות", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "אם אהבת את התוסף הזה, שקול לתרום על מנת לתמוך בהמשך הפיתוח", 42 | "复制 Debug 信息": "העתק מידע ניפוי שגיאות", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "מידע הניפוי שגיאות הועתק ללוח, ייתכן שהוא מכיל מידע רגיש!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "פתח את הקונסולה בעזרת קיצור מקשים, תוכל לראות את הלוגים של תוסף זה ותוספים אחרים", 45 | 46 | "不处理": "לא לעבד", 47 | "等比左上填充(裁剪)": "מילוי פרופורציונלי מפינה עליונה שמאלית (חיתוך)", 48 | "等比居中填充(裁剪)": "מילוי פרופורציונלי במרכז (חיתוך)", 49 | "固定尺寸拉伸": "מתיחה לגודל קבוע", 50 | "等比适应": "התאמה פרופורציונלית", 51 | "笔记正文图片": "תמונה של גוף ההערה", 52 | "笔记属性图片": "תמונה של מאפיין ההערה", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "הגדרת מצב דחיסת תמונה, 0 כלומר אין הגבלות, הערך המקסימלי לא יעלה על הגדרות השרת", 54 | "正文图片": "תמונה של גוף הטקסט", 55 | "宽度": "רוחב", 56 | "高度": "גובה", 57 | "调整压缩": "התאמת דחיסה", 58 | "属性": "מאפיין", 59 | "添加属性图片上传": "הוסף העלאת תמונת מאפיין", 60 | "选择属性": "בחר מאפיין", 61 | 62 | "图片上传地址增加随机查询": "הוסף שאילתה אקראית לכתובת העלאת תמונות כדי להפסיק את שמירת התמונות ב-CDN", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "הוסף שאילתה אקראית לכתובת העלאת תמונות כדי להפסיק את שמירת התמונות ב-CDN", 64 | "一键上传下载": "העלאה והורדה בכפתור אחד", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/hu.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Töltsd le az összes képet", 6 | "上传全部图片": "Töltsd fel az összes képet", 7 | 8 | //utils 9 | "自动上传": "Automatikus feltöltés", 10 | "自动下载": "Automatikus letöltés", 11 | "下载文件不是允许的图片类型": "A letöltött fájl nem engedélyezett képtípus", 12 | "待上传图片不存在": "Nincs feltöltésre váró kép", 13 | "图片文件创建失败:": "A kép fájl létrehozása sikertelen: Ellenőrizze a fájl létrehozási jogosultságokat", 14 | "网络错误,请检查网络是否通畅": "Hálózati hiba, kérjük ellenőrizze a hálózati kapcsolatot", 15 | 16 | // setting 17 | "通用": "Általános beállítások", 18 | "是否自动上传": "Automatikus feltöltés engedélyezése?", 19 | "如果关闭,您只能手动上传图片": "Ha kikapcsolja, csak manuálisan töltheti fel a képeket", 20 | "是否自动下载": "Automatikus letöltés engedélyezése?", 21 | "如果关闭,您只能手动下载图片": "Ha kikapcsolja, csak manuálisan töltheti le a képeket", 22 | "上传间隔时间": "Feltöltési intervallum", 23 | "单位为毫秒,默认设置1s": "Az egység milliszekundumban van, az alapértelmezett beállítás 1 másodperc", 24 | "关闭提示": "Értesítések kikapcsolása", 25 | "关闭右上角结果提示": "A jobb felső sarokban lévő eredmény értesítésének kikapcsolása", 26 | "下载": "Letöltés", 27 | "下载域名排除": "Letöltési domainek kizárása", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "A kizárt listán lévő képek nem lesznek letöltve. Soronként egy domain, * karaktertámogatás", 29 | "上传": "Feltöltés", 30 | "API 网关地址": "API cím", 31 | "Image API Gateway 地址": "Kép API átjáró címe", 32 | "API 访问令牌": "API hozzáférési token", 33 | "用于访问API的令牌": "Token az API-hoz való hozzáféréshez", 34 | "输入您的 API 访问令牌": "Írja be az API hozzáférési tokenjét", 35 | "输入您的 Image API Gateway 地址": "API szolgáltatás beállítása", 36 | "项目地址": "Projekt cím", 37 | "是否上传后删除原图片": "Törölje az eredeti képet feltöltés után?", 38 | "在图片上传后是否删除本地原图片": "Törölje a helyi eredeti képet feltöltés után?", 39 | "支持": "Támogatás", 40 | "捐赠": "Adományok", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Ha tetszik ez a bővítmény, fontolja meg adományozást a további fejlesztések támogatásához", 42 | "复制 Debug 信息": "Másolja a hibakeresési információkat", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "A hibakeresési információk másolva lettek a vágólapra, érzékeny információkat tartalmazhatnak!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Nyissa meg a konzolt gyorsbillentyűkkel, és megtekintheti ennek a bővítménynek és más bővítményeknek a naplóit", 45 | 46 | 47 | "不处理": "Ne dolgozza fel", 48 | "等比左上填充(裁剪)": "Arányos kitöltés a bal felső sarokból (levágás)", 49 | "等比居中填充(裁剪)": "Arányos kitöltés középre (levágás)", 50 | "固定尺寸拉伸": "Fix méretre nyújtás", 51 | "等比适应": "Arányos igazítás", 52 | "笔记正文图片": "A jegyzet szövegtörzsének képe", 53 | "笔记属性图片": "A jegyzet tulajdonságának képe", 54 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Állítsa be a kép tömörítési módját, 0 korlátozás nélkül, a maximális érték nem haladhatja meg a szerver beállításait", 55 | "正文图片": "A szövegtörzs képe", 56 | "宽度": "Szélesség", 57 | "高度": "Magasság", 58 | "调整压缩": "Tömörítés beállítása", 59 | "属性": "Tulajdonság", 60 | "添加属性图片上传": "Tulajdonság képek feltöltése hozzáadása", 61 | "选择属性": "Tulajdonság kiválasztása", 62 | 63 | "图片上传地址增加随机查询": "Egy véletlenszerű lekérdezést ad hozzá a kép feltöltési címéhez, hogy elkerülje a CDN gyorsítótárazását", 64 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Egy véletlenszerű lekérdezést ad hozzá a kép feltöltési címéhez, hogy elkerülje a CDN gyorsítótárazását", 65 | "一键上传下载": "Feltöltés és letöltés egy kattintással", 66 | }; 67 | -------------------------------------------------------------------------------- /src/lang/locale/id.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Unduh semua gambar", 6 | "上传全部图片": "Unggah semua gambar", 7 | 8 | //utils 9 | "自动上传": "Unggah otomatis", 10 | "自动下载": "Unduh otomatis", 11 | "下载文件不是允许的图片类型": "File yang diunduh bukan tipe gambar yang diizinkan", 12 | "待上传图片不存在": "Gambar yang akan diunggah tidak ditemukan", 13 | "图片文件创建失败:": "Gagal membuat file gambar: Periksa izin pembuatan file", 14 | "网络错误,请检查网络是否通畅": "Kesalahan jaringan, harap periksa koneksi jaringan", 15 | 16 | // setting 17 | "通用": "Pengaturan Umum", 18 | "是否自动上传": "Apakah unggahan otomatis diaktifkan?", 19 | "如果关闭,您只能手动上传图片": "Jika dimatikan, Anda hanya dapat mengunggah gambar secara manual", 20 | "是否自动下载": "Apakah unduhan otomatis diaktifkan?", 21 | "如果关闭,您只能手动下载图片": "Jika dimatikan, Anda hanya dapat mengunduh gambar secara manual", 22 | "上传间隔时间": "Interval Unggah", 23 | "单位为毫秒,默认设置1s": "Satuan dalam milidetik, pengaturan default adalah 1 detik", 24 | "关闭提示": "Matikan pemberitahuan", 25 | "关闭右上角结果提示": "Matikan pemberitahuan hasil di pojok kanan atas", 26 | "下载": "Unduh", 27 | "下载域名排除": "Pengecualian Domain Unduhan", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Alamat gambar dalam daftar pengecualian tidak akan diunduh. Satu domain per baris, mendukung wildcard *", 29 | "上传": "Unggah", 30 | "API 网关地址": "Alamat API", 31 | "Image API Gateway 地址": "Alamat Gerbang API Gambar", 32 | "API 访问令牌": "Token Akses API", 33 | "用于访问API的令牌": "Token untuk mengakses API", 34 | "输入您的 API 访问令牌": "Masukkan token akses API Anda", 35 | "输入您的 Image API Gateway 地址": "Pengaturan Layanan API", 36 | "项目地址": "Alamat Proyek", 37 | "是否上传后删除原图片": "Hapus gambar asli setelah diunggah?", 38 | "在图片上传后是否删除本地原图片": "Hapus gambar asli lokal setelah diunggah?", 39 | "支持": "Dukungan", 40 | "捐赠": "Donasi", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Jika Anda menyukai plugin ini, pertimbangkan untuk menyumbang guna mendukung pengembangan lebih lanjut", 42 | "复制 Debug 信息": "Salin informasi debug", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Informasi debug telah disalin ke papan klip, mungkin mengandung informasi sensitif!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Buka konsol menggunakan pintasan, Anda dapat melihat log dari plugin ini dan plugin lainnya", 45 | 46 | "不处理": "Tidak diproses", 47 | "等比左上填充(裁剪)": "Pengisian proporsional dari sudut kiri atas (potong)", 48 | "等比居中填充(裁剪)": "Pengisian proporsional terpusat (potong)", 49 | "固定尺寸拉伸": "Peregangan ukuran tetap", 50 | "等比适应": "Penyesuaian proporsional", 51 | "笔记正文图片": "Gambar tubuh catatan", 52 | "笔记属性图片": "Gambar properti catatan", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Atur mode kompresi gambar, 0 berarti tanpa batasan, nilai maksimum tidak akan melebihi pengaturan server", 54 | "正文图片": "Gambar tubuh teks", 55 | "宽度": "Lebar", 56 | "高度": "Tinggi", 57 | "调整压缩": "Sesuaikan kompresi", 58 | "属性": "Properti", 59 | "添加属性图片上传": "Tambah unggah gambar properti", 60 | "选择属性": "Pilih properti", 61 | 62 | "图片上传地址增加随机查询": "Tambahkan permintaan acak ke alamat unggah gambar untuk menghindari cache CDN", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Tambahkan permintaan acak ke alamat unggah gambar untuk menghindari cache CDN", 64 | "一键上传下载": "Unggah dan unduh dalam satu klik", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/it.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Scarica tutte le immagini", 6 | "上传全部图片": "Carica tutte le immagini", 7 | 8 | //utils 9 | "自动上传": "Caricamento automatico", 10 | "自动下载": "Download automatico", 11 | "下载文件不是允许的图片类型": "Il file scaricato non è un tipo di immagine consentito", 12 | "待上传图片不存在": "Immagine da caricare non trovata", 13 | "图片文件创建失败:": "Creazione del file immagine fallita: controlla i permessi di creazione del file", 14 | "网络错误,请检查网络是否通畅": "Errore di rete, verifica la connessione di rete", 15 | 16 | // setting 17 | "通用": "Impostazioni generali", 18 | "是否自动上传": "Caricamento automatico?", 19 | "如果关闭,您只能手动上传图片": "Se disattivato, puoi caricare solo le immagini manualmente", 20 | "是否自动下载": "Download automatico?", 21 | "如果关闭,您只能手动下载图片": "Se disattivato, puoi scaricare solo le immagini manualmente", 22 | "上传间隔时间": "Intervallo di caricamento", 23 | "单位为毫秒,默认设置1s": "Unità in millisecondi, impostazione predefinita 1 secondo", 24 | "关闭提示": "Disattiva notifiche", 25 | "关闭右上角结果提示": "Disattiva notifiche dei risultati in alto a destra", 26 | "下载": "Scarica", 27 | "下载域名排除": "Escludi domini dal download", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Gli indirizzi delle immagini nella lista di esclusione non verranno scaricati. Un dominio per riga, supporta il carattere jolly *", 29 | "上传": "Carica", 30 | "API 网关地址": "Indirizzo API", 31 | "Image API Gateway 地址": "Indirizzo del gateway API immagine", 32 | "API 访问令牌": "Token di accesso API", 33 | "用于访问API的令牌": "Token per accedere all'API", 34 | "输入您的 API 访问令牌": "Inserisci il tuo token di accesso API", 35 | "输入您的 Image API Gateway 地址": "Impostazione del servizio API", 36 | "项目地址": "Indirizzo del progetto", 37 | "是否上传后删除原图片": "Eliminare l'immagine originale dopo il caricamento?", 38 | "在图片上传后是否删除本地原图片": "Eliminare l'immagine originale locale dopo il caricamento?", 39 | "支持": "Supporto", 40 | "捐赠": "Donazioni", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Se ti piace questo plugin, considera di fare una donazione per supportare lo sviluppo continuo", 42 | "复制 Debug 信息": "Copia informazioni di debug", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Le informazioni di debug sono state copiate negli appunti, potrebbero contenere informazioni sensibili!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Apri la console con una scorciatoia, puoi vedere i log di questo plugin e di altri", 45 | 46 | 47 | "不处理": "Non elaborare", 48 | "等比左上填充(裁剪)": "Riempimento proporzionale dall'angolo in alto a sinistra (ritaglio)", 49 | "等比居中填充(裁剪)": "Riempimento proporzionale centrato (ritaglio)", 50 | "固定尺寸拉伸": "Stiramento a dimensione fissa", 51 | "等比适应": "Adattamento proporzionale", 52 | "笔记正文图片": "Immagine del corpo della nota", 53 | "笔记属性图片": "Immagine della proprietà della nota", 54 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Imposta modalità di compressione immagine, 0 significa senza limiti, il valore massimo non supererà le impostazioni del server", 55 | "正文图片": "Immagine del corpo del testo", 56 | "宽度": "Larghezza", 57 | "高度": "Altezza", 58 | "调整压缩": "Regola compressione", 59 | "属性": "Proprietà", 60 | "添加属性图片上传": "Aggiungi caricamento immagine proprietà", 61 | "选择属性": "Seleziona proprietà", 62 | 63 | "图片上传地址增加随机查询": "Aggiungi una query casuale all'indirizzo di caricamento delle immagini per evitare il caching CDN", 64 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Aggiungi una query casuale all'indirizzo di caricamento delle immagini per evitare il caching CDN", 65 | "一键上传下载": "Carica e scarica in un clic", 66 | }; 67 | -------------------------------------------------------------------------------- /src/lang/locale/ja.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | "Custom Image Auto Uploader": "カスタム画像自動アップロードプラグイン", 5 | "已开启": "有効", 6 | "已关闭": "無効", 7 | 8 | //main 9 | "下载全部图片": "すべての画像をダウンロード", 10 | "上传全部图片": "すべての画像をアップロード", 11 | 12 | //utils 13 | "自动上传下载": "自動アップロードとダウンロード", 14 | "自动上传": "自動アップロード", 15 | "自动下载": "自動ダウンロード", 16 | "下载文件不是允许的图片类型": "ダウンロードしたファイルは許可された画像タイプではありません", 17 | "待上传图片不存在": "アップロードする画像が存在しません", 18 | "图片文件创建失败:": "画像ファイルの作成に失敗しました: ファイル作成の権限を確認してください", 19 | "网络错误,请检查网络是否通畅": "ネットワークエラー、接続状態を確認してください", 20 | 21 | // setting 22 | "通用": "一般設定", 23 | "API 网关": "APIゲートウェイ", 24 | "是否自动上传": "自動アップロードを有効にしますか?", 25 | "如果关闭,您只能手动上传图片": "無効にすると、手動で画像をアップロードすることしかできません", 26 | "是否自动下载": "自動ダウンロードを有効にしますか?", 27 | "如果关闭,您只能手动下载图片": "無効にすると、手動で画像をダウンロードすることしかできません", 28 | "上传间隔时间": "アップロード間隔", 29 | "单位为毫秒,默认设置1s": "単位はミリ秒で、デフォルト設定は1秒です", 30 | "关闭提示": "通知を無効にする", 31 | "关闭右上角结果提示": "右上隅の結果通知を無効にする", 32 | "下载": "ダウンロード", 33 | "下载域名排除": "ダウンロード除外ドメイン", 34 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "除外リストにある画像リンクはダウンロードされません。1行につき1つのドメイン、* ワイルドカードをサポートします", 35 | "上传": "アップロード", 36 | "API 网关地址": "APIゲートウェイアドレス", 37 | "Image API Gateway 地址": "Image API Gateway アドレス", 38 | "API 访问令牌": "APIアクセストークン", 39 | "用于访问API的令牌": "APIへのアクセスに使用するトークン", 40 | "输入您的 API 访问令牌": "APIアクセス用のトークンを入力してください", 41 | "输入您的 Image API Gateway 地址": "Image API Gateway のアドレスを入力してください", 42 | 43 | "接口配置信息已经粘贴到设置中!": "インターフェース設定情報が設定に貼り付けられました!", 44 | "网关服务选择": "ゲートウェイサービスの選択", 45 | "选择一个适合自己的网关服务": "自分に最適なゲートウェイサービスを選択してください", 46 | "方式": "方法", 47 | "说明": "説明", 48 | "自行搭建": "自分で構築", 49 | "速度好, 自由配置, 无隐私风险, 支持云存储和服务端存储": "速度が良い、自由な構成、プライバシーのリスクが低い、クラウドストレージとサーバーストレージをサポート", 50 | "多用户开放网关": "多ユーザー開放ゲートウェイ", 51 | "稳定性好, 仅支持用户的云存储": "安定性が高く、ユーザーのクラウドストレージのみをサポート", 52 | "粘贴多用户开放网关的接口配置": "多ユーザー開放ゲートウェイのインターフェース設定を貼り付ける", 53 | 54 | "未检测到配置信息!": "設定情報が検出されませんでした!", 55 | 56 | "项目地址": "プロジェクトのアドレス", 57 | "是否上传后删除原图片": "アップロード後に元の画像を削除しますか?", 58 | "在图片上传后是否删除本地原图片": "画像をアップロード後、ローカルの元画像を削除しますか?", 59 | "支持": "サポート", 60 | "捐赠": "寄付", 61 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "このプラグインが気に入ったら、開発を継続するために寄付をご検討ください", 62 | "复制 Debug 信息": "デバッグ情報をコピー", 63 | "将调试信息复制到剪贴板, 可能包含敏感信!": "デバッグ情報をクリップボードにコピーしました。機密情報が含まれている可能性があります!", 64 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "ショートカットキーでコンソールを開き、このプラグインや他のプラグインのログを確認できます", 65 | 66 | 67 | "不处理": "処理しない", 68 | "等比左上填充(裁剪)": "左上隅からの比率に基づく塗りつぶし(切り抜き)", 69 | "等比居中填充(裁剪)": "中央に合わせた比率に基づく塗りつぶし(切り抜き)", 70 | "固定尺寸拉伸": "固定サイズで引き伸ばす", 71 | "等比适应": "比率に基づいた調整", 72 | "笔记正文图片": "ノート本文画像", 73 | "笔记属性图片": "ノート属性画像", 74 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "画像の圧縮モードを設定します。0は制限なし、最大値はサーバー設定を超えません。", 75 | "正文图片": "本文画像", 76 | "宽度": "幅", 77 | "高度": "高さ", 78 | "调整压缩": "圧縮を調整", 79 | "属性": "属性", 80 | "添加属性图片上传": "属性画像のアップロードを追加", 81 | "选择属性": "属性を選択", 82 | 83 | "图片上传地址增加随机查询": "画像アップロードアドレスにランダムクエリを追加", 84 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "画像アドレスの末尾にランダムクエリを追加して、CDNキャッシュを回避します", 85 | "一键上传下载": "一つのクリックでアップロードとダウンロード", 86 | }; 87 | -------------------------------------------------------------------------------- /src/lang/locale/ko.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | "Custom Image Auto Uploader": "커스텀 이미지 자동 업로드 플러그인", 5 | "已开启": "활성화", 6 | "已关闭": "비활성화", 7 | 8 | //main 9 | "下载全部图片": "모든 이미지 다운로드", 10 | "上传全部图片": "모든 이미지 업로드", 11 | 12 | //utils 13 | "自动上传下载": "자동 업로드 및 다운로드", 14 | "自动上传": "자동 업로드", 15 | "自动下载": "자동 다운로드", 16 | "下载文件不是允许的图片类型": "다운로드한 파일은 허용된 이미지 유형이 아닙니다", 17 | "待上传图片不存在": "업로드할 이미지가 존재하지 않습니다", 18 | "图片文件创建失败:": "이미지 파일 생성 실패: 파일 생성 권한을 확인하세요", 19 | "网络错误,请检查网络是否通畅": "네트워크 오류, 네트워크 연결을 확인하세요", 20 | 21 | // setting 22 | "通用": "일반 설정", 23 | "API 网关": "API 게이트웨이", 24 | "是否自动上传": "자동 업로드 여부", 25 | "如果关闭,您只能手动上传图片": "비활성화 시, 이미지를 수동으로만 업로드할 수 있습니다", 26 | "是否自动下载": "자동 다운로드 여부", 27 | "如果关闭,您只能手动下载图片": "비활성화 시, 이미지를 수동으로만 다운로드할 수 있습니다", 28 | "上传间隔时间": "업로드 간격 시간", 29 | "单位为毫秒,默认设置1s": "단위는 밀리초이며, 기본 설정은 1초입니다", 30 | "关闭提示": "알림 끄기", 31 | "关闭右上角结果提示": "우측 상단 알림 끄기", 32 | "下载": "다운로드", 33 | "下载域名排除": "다운로드 제외 도메인", 34 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "배제 목록에 있는 이미지 주소는 다운로드되지 않습니다. 한 줄에 하나의 도메인, * 와일드카드 지원", 35 | "上传": "업로드", 36 | "API 网关地址": "API 게이트웨이 주소", 37 | "Image API Gateway 地址": "이미지 API 게이트웨이 주소", 38 | "API 访问令牌": "API 접근 토큰", 39 | "用于访问API的令牌": "API 접근을 위한 토큰", 40 | "输入您的 API 访问令牌": "API 접근 토큰을 입력하세요", 41 | "输入您的 Image API Gateway 地址": "이미지 API 게이트웨이 주소를 입력하세요", 42 | 43 | "接口配置信息已经粘贴到设置中!": "인터페이스 설정 정보가 설정에 복사되었습니다!", 44 | "网关服务选择": "게이트웨이 서비스 선택", 45 | "选择一个适合自己的网关服务": "자신에 맞는 게이트웨이 서비스를 선택하세요", 46 | "方式": "방법", 47 | "说明": "설명", 48 | "自行搭建": "자체 구축", 49 | "速度好, 自由配置, 无隐私风险, 支持云存储和服务端存储": "속도가 빠르고, 자유로운 구성, 개인 정보 보호에 우수하며, 클라우드 저장소 및 서버 저장소를 지원합니다", 50 | "多用户开放网关": "다중 사용자 공용 게이트웨이", 51 | "稳定性好, 仅支持用户的云存储": "안정성이 높고, 사용자의 클라우드 저장소만 지원합니다", 52 | "粘贴多用户开放网关的接口配置": "다중 사용자 공용 게이트웨이의 인터페이스 설정을 붙여넣기", 53 | 54 | "未检测到配置信息!": "설정 정보가 감지되지 않았습니다!", 55 | 56 | 57 | "项目地址": "프로젝트 주소", 58 | "是否上传后删除原图片": "업로드 후 원본 이미지 삭제 여부", 59 | "在图片上传后是否删除本地原图片": "이미지 업로드 후 로컬 원본 이미지를 삭제할지 여부", 60 | "支持": "지원", 61 | "捐赠": "기부", 62 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "이 플러그인을 좋아하시면 계속 개발을 지원하기 위해 기부를 고려해주세요", 63 | "复制 Debug 信息": "디버그 정보 복사", 64 | "将调试信息复制到剪贴板, 可能包含敏感信!": "디버그 정보를 클립보드에 복사했습니다. 민감한 정보가 포함될 수 있습니다!", 65 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "단축키로 콘솔을 열어 이 플러그인과 다른 플러그인의 로그를 확인하세요", 66 | 67 | "不处理": "처리 안 함", 68 | "等比左上填充(裁剪)": "왼쪽 상단에서 비율에 맞춰 채우기 (자르기)", 69 | "等比居中填充(裁剪)": "중앙에서 비율에 맞춰 채우기 (자르기)", 70 | "固定尺寸拉伸": "고정 크기 늘리기", 71 | "等比适应": "비율에 맞게 조정", 72 | "笔记正文图片": "노트 본문 이미지", 73 | "笔记属性图片": "노트 속성 이미지", 74 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "이미지 압축 모드를 설정합니다. 0은 제한 없음, 최대 값은 서버 설정을 초과하지 않습니다.", 75 | "正文图片": "본문 이미지", 76 | "宽度": "너비", 77 | "高度": "높이", 78 | "调整压缩": "압축 조정", 79 | "属性": "속성", 80 | "添加属性图片上传": "속성 이미지 업로드 추가", 81 | "选择属性": "속성 선택", 82 | 83 | "图片上传地址增加随机查询": "이미지 업로드 주소에 랜덤 쿼리 추가", 84 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "이미지 주소 끝에 랜덤 쿼리를 추가하여 CDN 캐시를 회피합니다", 85 | "一键上传下载": "한 번의 클릭으로 업로드와 다운로드", 86 | }; 87 | -------------------------------------------------------------------------------- /src/lang/locale/ms.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Muat turun semua gambar", 6 | "上传全部图片": "Muat naik semua gambar", 7 | 8 | //utils 9 | "自动上传": "Muat naik automatik", 10 | "自动下载": "Muat turun automatik", 11 | "下载文件不是允许的图片类型": "Fail yang dimuat turun bukan jenis gambar yang dibenarkan", 12 | "待上传图片不存在": "Gambar yang hendak dimuat naik tiada", 13 | "图片文件创建失败:": "Gagal mencipta fail gambar: Sila semak kebenaran penciptaan fail", 14 | "网络错误,请检查网络是否通畅": "Ralat rangkaian, sila semak sambungan rangkaian", 15 | 16 | // setting 17 | "通用": "Tetapan Umum", 18 | "是否自动上传": "Muat naik automatik?", 19 | "如果关闭,您只能手动上传图片": "Jika ditutup, anda hanya boleh memuat naik gambar secara manual", 20 | "是否自动下载": "Muat turun automatik?", 21 | "如果关闭,您只能手动下载图片": "Jika ditutup, anda hanya boleh memuat turun gambar secara manual", 22 | "上传间隔时间": "Selang masa muat naik", 23 | "单位为毫秒,默认设置1s": "Unit adalah milisaat, tetapan lalai adalah 1 saat", 24 | "关闭提示": "Tutup pemberitahuan", 25 | "关闭右上角结果提示": "Tutup pemberitahuan hasil di penjuru kanan atas", 26 | "下载": "Muat turun", 27 | "下载域名排除": "Kecualikan domain untuk muat turun", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Alamat gambar dalam senarai pengecualian tidak akan dimuat turun, satu domain setiap baris, menyokong * wildcard", 29 | "上传": "Muat naik", 30 | "API 网关地址": "Alamat API", 31 | "Image API Gateway 地址": "Alamat Gateway API Gambar", 32 | "API 访问令牌": "Token Akses API", 33 | "用于访问API的令牌": "Token untuk akses API", 34 | "输入您的 API 访问令牌": "Masukkan token akses API anda", 35 | "输入您的 Image API Gateway 地址": "Penyediaan perkhidmatan API", 36 | "项目地址": "Alamat Projek", 37 | "是否上传后删除原图片": "Padam gambar asal selepas muat naik?", 38 | "在图片上传后是否删除本地原图片": "Padam gambar asal tempatan selepas muat naik?", 39 | "支持": "Sokongan", 40 | "捐赠": "Derma", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Jika anda suka plugin ini, sila pertimbangkan untuk menderma bagi menyokong pembangunan berterusan", 42 | "复制 Debug 信息": "Salin maklumat penyahpepijatan", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Salin maklumat penyahpepijatan ke papan klip, mungkin mengandungi maklumat sensitif!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Buka konsol menggunakan pintasan, anda boleh melihat log plugin ini dan plugin lain", 45 | 46 | "不处理": "Tidak diproses", 47 | "等比左上填充(裁剪)": "Isian berbanding dari sudut kiri atas (pemangkasan)", 48 | "等比居中填充(裁剪)": "Isian berbanding di tengah (pemangkasan)", 49 | "固定尺寸拉伸": "Regangan saiz tetap", 50 | "等比适应": "Penyesuaian berbanding", 51 | "笔记正文图片": "Gambar teks nota", 52 | "笔记属性图片": "Gambar atribut nota", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Tetapkan mod pemampatan imej, 0 bermaksud tiada had, nilai maksimum tidak akan melebihi tetapan pelayan", 54 | "正文图片": "Gambar teks utama", 55 | "宽度": "Lebar", 56 | "高度": "Tinggi", 57 | "调整压缩": "Laraskan pemampatan", 58 | "属性": "Atribut", 59 | "添加属性图片上传": "Tambah muat naik gambar atribut", 60 | "选择属性": "Pilih atribut", 61 | 62 | "图片上传地址增加随机查询": "Tambahkan permintaan acak ke alamat unggah gambar untuk menghindari cache CDN", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Tambahkan permintaan acak ke alamat unggah gambar untuk menghindari cache CDN", 64 | "一键上传下载": "Unggah dan unduh dalam satu klik", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/nb.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Last ned alle bilder", 6 | "上传全部图片": "Last opp alle bilder", 7 | 8 | //utils 9 | "自动上传": "Automatisk opplasting", 10 | "自动下载": "Automatisk nedlasting", 11 | "下载文件不是允许的图片类型": "Den nedlastede filen er ikke en tillatt bildetype", 12 | "待上传图片不存在": "Bilde som skal lastes opp finnes ikke", 13 | "图片文件创建失败:": "Feil ved oppretting av bilde fil: Sjekk tillatelsene for filoppretting", 14 | "网络错误,请检查网络是否通畅": "Nettverksfeil, vennligst sjekk nettverkstilkoblingen", 15 | 16 | // setting 17 | "通用": "Generelle innstillinger", 18 | "是否自动上传": "Automatisk opplasting?", 19 | "如果关闭,您只能手动上传图片": "Hvis deaktivert, kan du bare laste opp bilder manuelt", 20 | "是否自动下载": "Automatisk nedlasting?", 21 | "如果关闭,您只能手动下载图片": "Hvis deaktivert, kan du bare laste ned bilder manuelt", 22 | "上传间隔时间": "Opplastingsintervall", 23 | "单位为毫秒,默认设置1s": "Enheten er millisekunder, standardinnstillingen er 1 sekund", 24 | "关闭提示": "Slå av varsler", 25 | "关闭右上角结果提示": "Slå av resultatvarsler øverst til høyre", 26 | "下载": "Last ned", 27 | "下载域名排除": "Ekskluder domener fra nedlasting", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Bildelenker i unntaksliste blir ikke lastet ned, ett domene per linje, støtter * wildcard", 29 | "上传": "Last opp", 30 | "API 网关地址": "API-adresse", 31 | "Image API Gateway 地址": "Bilde API Gateway adresse", 32 | "API 访问令牌": "API-tilgangstoken", 33 | "用于访问API的令牌": "Token for tilgang til API", 34 | "输入您的 API 访问令牌": "Skriv inn ditt API-tilgangstoken", 35 | "输入您的 Image API Gateway 地址": "Sett opp API-tjeneste", 36 | "项目地址": "Prosjektadresse", 37 | "是否上传后删除原图片": "Slette originalbilde etter opplasting?", 38 | "在图片上传后是否删除本地原图片": "Slette originalbilde lokalt etter opplasting?", 39 | "支持": "Støtte", 40 | "捐赠": "Donere", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Hvis du liker denne pluginen, vurder å donere for å støtte videre utvikling", 42 | "复制 Debug 信息": "Kopier feilsøkingsinformasjon", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Kopier feilsøkingsinformasjon til utklippstavlen, kan inneholde sensitiv informasjon!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Åpne konsollen med hurtigtast for å se logger for denne pluginen og andre plugins", 45 | 46 | "不处理": "Ikke behandle", 47 | "等比左上填充(裁剪)": "Proposjonal fylling fra øverste venstre hjørne (beskjæring)", 48 | "等比居中填充(裁剪)": "Proposjonal fylling i sentrum (beskjæring)", 49 | "固定尺寸拉伸": "Strekking til fast størrelse", 50 | "等比适应": "Proposjonal tilpasning", 51 | "笔记正文图片": "Bilde av notatinnhold", 52 | "笔记属性图片": "Bilde av notatets egenskaper", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Sett bildekomprimeringsmodus, 0 betyr ingen begrensning, maksimal verdi vil ikke overskride serverinnstillingene", 54 | "正文图片": "Bilde av tekstinnhold", 55 | "宽度": "Bredde", 56 | "高度": "Høyde", 57 | "调整压缩": "Juster komprimering", 58 | "属性": "Egenskap", 59 | "添加属性图片上传": "Legg til opplasting av bildeegenskap", 60 | "选择属性": "Velg egenskap", 61 | 62 | "图片上传地址增加随机查询": "Legg til en tilfeldig forespørsel til bilde-opplastingsadressen for å unngå CDN-cache", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Legg til en tilfeldig forespørsel til bilde-opplastingsadressen for å unngå CDN-cache", 64 | "一键上传下载": "Last opp og last ned i ett klikk", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/ne.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "सबै तस्बिरहरू डाउनलोड गर्नुहोस्", 6 | "上传全部图片": "सबै तस्बिरहरू अपलोड गर्नुहोस्", 7 | 8 | //utils 9 | "自动上传": "स्वचालित अपलोड", 10 | "自动下载": "स्वचालित डाउनलोड", 11 | "下载文件不是允许的图片类型": "डाउनलोड गरिएको फाइल अनुमत छवि प्रकार होइन", 12 | "待上传图片不存在": "अपलोड गर्नको लागि छवि उपलब्ध छैन", 13 | "图片文件创建失败:": "छवि फाइल सिर्जना गर्न असफल: कृपया फाइल सिर्जना अनुमतिहरू जाँच गर्नुहोस्", 14 | "网络错误,请检查网络是否通畅": "नेटवर्क त्रुटि, कृपया नेटवर्क जडान जाँच गर्नुहोस्", 15 | 16 | // setting 17 | "通用": "सामान्य सेटिङहरू", 18 | "是否自动上传": "स्वचालित अपलोड सक्षम छ?", 19 | "如果关闭,您只能手动上传图片": "यदि डिसेबल गरिएको छ भने, तपाईं केवल म्यानुअल रूपमा तस्बिरहरू अपलोड गर्न सक्नुहुन्छ", 20 | "是否自动下载": "स्वचालित डाउनलोड सक्षम छ?", 21 | "如果关闭,您只能手动下载图片": "यदि डिसेबल गरिएको छ भने, तपाईं केवल म्यानुअल रूपमा तस्बिरहरू डाउनलोड गर्न सक्नुहुन्छ", 22 | "上传间隔时间": "अपलोड अन्तराल", 23 | "单位为毫秒,默认设置1s": "इकाई मिलिसेकेन्ड हो, डिफल्ट सेटिङ 1 सेकेन्ड हो", 24 | "关闭提示": "सूचनाहरू बन्द गर्नुहोस्", 25 | "关闭右上角结果提示": "उज्यालो कुनामा परिणामको सूचनाहरू बन्द गर्नुहोस्", 26 | "下载": "डाउनलोड गर्नुहोस्", 27 | "下载域名排除": "डाउनलोडका लागि डोमेनहरू बहिष्कृत गर्नुहोस्", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "वर्जना सूचीमा रहेका छवि ठेगानाहरू डाउनलोड हुने छैनन्, एक पंक्तिमा एक डोमेन, * वाइल्डकार्डको समर्थन गर्दछ", 29 | "上传": "अपलोड गर्नुहोस्", 30 | "API 网关地址": "API ठेगाना", 31 | "Image API Gateway 地址": "छवि API गेटवे ठेगाना", 32 | "API 访问令牌": "API पहुँच टोकन", 33 | "用于访问API的令牌": "API पहुँचको लागि टोकन", 34 | "输入您的 API 访问令牌": "आफ्नो API पहुँच टोकन प्रविष्ट गर्नुहोस्", 35 | "输入您的 Image API Gateway 地址": "API सेवा सेटअप", 36 | "项目地址": "प्रोजेक्ट ठेगाना", 37 | "是否上传后删除原图片": "अपलोड पछि मूल छवि मेटाउने हो?", 38 | "在图片上传后是否删除本地原图片": "छवि अपलोड पछि स्थानीय मूल छवि मेटाउने हो?", 39 | "支持": "समर्थन", 40 | "捐赠": "दान गर्नुहोस्", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "यदि तपाईंलाई यो प्लगइन मनपर्छ भने, कृपया यसको निरन्तर विकासमा सहयोग गर्न दान गर्नुहोस्", 42 | "复制 Debug 信息": "डिबग जानकारी प्रतिलिपि गर्नुहोस्", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "डिबग जानकारीलाई क्लिपबोर्डमा प्रतिलिपि गर्नुहोस्, यसमा संवेदनशील जानकारी हुन सक्छ!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "छोटो कुञ्जी प्रयोग गरेर कन्सोल खोल्नुहोस्, तपाईं यो प्लगइन र अन्य प्लगइनहरूको लगहरू देख्न सक्नुहुन्छ", 45 | 46 | "不处理": "प्रक्रिया नगर्नुहोस्", 47 | "等比左上填充(裁剪)": "बायाँ माथिको कुनाबाट अनुपातिक रूपमा भर्नुहोस् (काट्नु)", 48 | "等比居中填充(裁剪)": "केंद्रमा अनुपातिक रूपमा भर्नुहोस् (काट्नु)", 49 | "固定尺寸拉伸": "नियत आकारमा फैलाउनुहोस्", 50 | "等比适应": "अनुपातिक अनुकूलन", 51 | "笔记正文图片": "नोटको मुख्य सामग्री छवि", 52 | "笔记属性图片": "नोटको गुण छवि", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "छवि कम्प्रेसन मोड सेट गर्नुहोस्, 0 को मतलब सीमित नगर्नुहोस्, अधिकतम मान सर्भर सेटिङ्गलाई पार नगर्नेछ", 54 | "正文图片": "मुख्य सामग्री छवि", 55 | "宽度": "चौडाई", 56 | "高度": "उचाई", 57 | "调整压缩": "कम्प्रेसन समायोजन गर्नुहोस्", 58 | "属性": "गुण", 59 | "添加属性图片上传": "गुण छवि अपलोड थप्नुहोस्", 60 | "选择属性": "गुण चयन गर्नुहोस्", 61 | 62 | "图片上传地址增加随机查询": "छवि अपलोड ठेगाना अन्तर्गत यादृच्छिक प्रश्न थप्नुहोस्, CDN कैच बन्द गर्नको लागि", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "छवि अपलोड ठेगाना अन्तर्गत यादृच्छिक प्रश्न थप्नुहोस्, CDN कैच बन्द गर्नको लागि", 64 | "一键上传下载": "एक बारमा अपलोड डाउनलोड गर्नुहोस्", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/nl.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Alle afbeeldingen downloaden", 6 | "上传全部图片": "Alle afbeeldingen uploaden", 7 | 8 | //utils 9 | "自动上传": "Automatisch uploaden", 10 | "自动下载": "Automatisch downloaden", 11 | "下载文件不是允许的图片类型": "Het gedownloade bestand is geen toegestaan afbeeldingsbestandstype", 12 | "待上传图片不存在": "De afbeelding die moet worden geüpload bestaat niet", 13 | "图片文件创建失败:": "Fout bij het aanmaken van het afbeeldingsbestand, controleer de machtigingen voor het maken van bestanden", 14 | "网络错误,请检查网络是否通畅": "Netwerkfout, controleer de netwerkverbinding", 15 | 16 | // setting 17 | "通用": "Algemene instellingen", 18 | "是否自动上传": "Automatisch uploaden?", 19 | "如果关闭,您只能手动上传图片": "Als uitgeschakeld, kunt u alleen handmatig afbeeldingen uploaden", 20 | "是否自动下载": "Automatisch downloaden?", 21 | "如果关闭,您只能手动下载图片": "Als uitgeschakeld, kunt u alleen handmatig afbeeldingen downloaden", 22 | "上传间隔时间": "Uploadinterval", 23 | "单位为毫秒,默认设置1s": "De eenheid is milliseconden, de standaardinstelling is 1 seconde", 24 | "关闭提示": "Meldingen uitschakelen", 25 | "关闭右上角结果提示": "Meldingen van resultaten in de rechterbovenhoek uitschakelen", 26 | "下载": "Downloaden", 27 | "下载域名排除": "Domeinen uitsluiten van download", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Afbeeldingsadressen in de uitsluitingslijst worden niet gedownload, één domein per regel, ondersteunt het gebruik van het * wildcard teken", 29 | "上传": "Uploaden", 30 | "API 网关地址": "API-adres", 31 | "Image API Gateway 地址": "Image API Gateway adres", 32 | "API 访问令牌": "API-toegangstoken", 33 | "用于访问API的令牌": "Token voor toegang tot de API", 34 | "输入您的 API 访问令牌": "Voer uw API-toegangstoken in", 35 | "输入您的 Image API Gateway 地址": "Instellen van de API-service", 36 | "项目地址": "Projectadres", 37 | "是否上传后删除原图片": "Verwijder de originele afbeelding na uploaden?", 38 | "在图片上传后是否删除本地原图片": "Verwijder de lokale originele afbeelding na uploaden?", 39 | "支持": "Ondersteuning", 40 | "捐赠": "Doneren", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Als u van deze plugin houdt, overweeg dan om te doneren om de doorontwikkeling te ondersteunen", 42 | "复制 Debug 信息": "Debug-informatie kopiëren", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Kopieer de debug-informatie naar het klembord, het kan gevoelige gegevens bevatten!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Open de console met sneltoetsen om de logboeken van deze plugin en andere plugins te bekijken", 45 | 46 | "不处理": "Niet verwerken", 47 | "等比左上填充(裁剪)": "Proportioneel vullen vanaf de linkerbovenhoek (bijsnijden)", 48 | "等比居中填充(裁剪)": "Proportioneel vullen in het midden (bijsnijden)", 49 | "固定尺寸拉伸": "Rekken naar vaste grootte", 50 | "等比适应": "Proportionele aanpassing", 51 | "笔记正文图片": "Afbeelding van de hoofdinhoud van de notitie", 52 | "笔记属性图片": "Afbeelding van de eigenschappen van de notitie", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Stel de afbeeldingscompressiemodus in, 0 betekent geen beperking, de maximale waarde zal de serverinstellingen niet overschrijden", 54 | "正文图片": "Afbeelding van de tekstinhoud", 55 | "宽度": "Breedte", 56 | "高度": "Hoogte", 57 | "调整压缩": "Pas compressie aan", 58 | "属性": "Eigenschap", 59 | "添加属性图片上传": "Voeg upload van afbeeldingeigenschappen toe", 60 | "选择属性": "Kies eigenschap", 61 | 62 | "图片上传地址增加随机查询": "Voeg een willekeurige query toe aan de afbeelding-uploadadres om CDN-cache te voorkomen", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Voeg een willekeurige query toe aan de afbeelding-uploadadres om CDN-cache te voorkomen", 64 | "一键上传下载": "Upload en download in één klik", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/pl.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Pobierz wszystkie obrazy", 6 | "上传全部图片": "Wyślij wszystkie obrazy", 7 | 8 | //utils 9 | "自动上传": "Automatyczne wysyłanie", 10 | "自动下载": "Automatyczne pobieranie", 11 | "下载文件不是允许的图片类型": "Pobrany plik nie jest dozwolonym typem obrazu", 12 | "待上传图片不存在": "Obraz do wysłania nie istnieje", 13 | "图片文件创建失败:": "Nie udało się utworzyć pliku obrazu, sprawdź uprawnienia do tworzenia plików", 14 | "网络错误,请检查网络是否通畅": "Błąd sieci, sprawdź połączenie z siecią", 15 | 16 | // setting 17 | "通用": "Ustawienia ogólne", 18 | "是否自动上传": "Automatyczne wysyłanie?", 19 | "如果关闭,您只能手动上传图片": "Jeśli wyłączone, obrazy będą mogły być wysyłane tylko ręcznie", 20 | "是否自动下载": "Automatyczne pobieranie?", 21 | "如果关闭,您只能手动下载图片": "Jeśli wyłączone, obrazy będą mogły być pobierane tylko ręcznie", 22 | "上传间隔时间": "Interwał wysyłania", 23 | "单位为毫秒,默认设置1s": "Jednostka to milisekundy, domyślnie ustawione na 1 sekundę", 24 | "关闭提示": "Wyłącz powiadomienia", 25 | "关闭右上角结果提示": "Wyłącz powiadomienia o wynikach w prawym górnym rogu", 26 | "下载": "Pobierz", 27 | "下载域名排除": "Wyklucz domeny do pobierania", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Adresy obrazów na liście wykluczeń nie będą pobierane, jedna domena na linię, obsługiwany jest symbol * jako wieloznacznik", 29 | "上传": "Wyślij", 30 | "API 网关地址": "Adres API", 31 | "Image API Gateway 地址": "Adres bramy API obrazu", 32 | "API 访问令牌": "Token dostępu API", 33 | "用于访问API的令牌": "Token do dostępu do API", 34 | "输入您的 API 访问令牌": "Wpisz swój token dostępu do API", 35 | "输入您的 Image API Gateway 地址": "Konfiguracja usługi API", 36 | "项目地址": "Adres projektu", 37 | "是否上传后删除原图片": "Usunąć oryginalny obraz po wysłaniu?", 38 | "在图片上传后是否删除本地原图片": "Usunąć oryginalny obraz lokalny po wysłaniu?", 39 | "支持": "Wsparcie", 40 | "捐赠": "Darowizna", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Jeśli lubisz ten plugin, rozważ dokonanie darowizny na rzecz dalszego rozwoju", 42 | "复制 Debug 信息": "Kopiuj informacje o debugowaniu", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Kopiuj informacje o debugowaniu do schowka, mogą zawierać poufne dane!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Otwórz konsolę za pomocą skrótów, aby zobaczyć logi tego pluginu i innych pluginów", 45 | 46 | "不处理": "Nie przetwarzaj", 47 | "等比左上填充(裁剪)": "Proporcjonalne wypełnienie z lewego górnego rogu (przycinanie)", 48 | "等比居中填充(裁剪)": "Proporcjonalne wypełnienie na środku (przycinanie)", 49 | "固定尺寸拉伸": "Rozciąganie do stałego rozmiaru", 50 | "等比适应": "Proporcjonalne dopasowanie", 51 | "笔记正文图片": "Obraz treści notatki", 52 | "笔记属性图片": "Obraz właściwości notatki", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Ustaw tryb kompresji obrazu, 0 oznacza brak ograniczeń, maksymalna wartość nie przekroczy ustawień serwera", 54 | "正文图片": "Obraz treści głównej", 55 | "宽度": "Szerokość", 56 | "高度": "Wysokość", 57 | "调整压缩": "Dostosowanie kompresji", 58 | "属性": "Właściwość", 59 | "添加属性图片上传": "Dodaj przesyłanie obrazu właściwości", 60 | "选择属性": "Wybierz właściwość", 61 | 62 | "图片上传地址增加随机查询": "Dodaj losową zapytanie do adresu przesyłania obrazu, aby uniknąć buforowania CDN", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Dodaj losową zapytanie do adresu przesyłania obrazu, aby uniknąć buforowania CDN", 64 | "一键上传下载": "Przesyłanie i pobieranie w jednym kliknięciu", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/pt-br.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Baixar todas as imagens", 6 | "上传全部图片": "Enviar todas as imagens", 7 | 8 | //utils 9 | "自动上传": "Envio automático", 10 | "自动下载": "Download automático", 11 | "下载文件不是允许的图片类型": "O arquivo baixado não é um tipo de imagem permitido", 12 | "待上传图片不存在": "A imagem a ser enviada não existe", 13 | "图片文件创建失败:": "Falha ao criar o arquivo de imagem, por favor, verifique as permissões para criar arquivos", 14 | "网络错误,请检查网络是否通畅": "Erro de rede, por favor, verifique a conexão com a rede", 15 | 16 | // setting 17 | "通用": "Configurações gerais", 18 | "是否自动上传": "Envio automático?", 19 | "如果关闭,您只能手动上传图片": "Se desativado, você só poderá enviar as imagens manualmente", 20 | "是否自动下载": "Download automático?", 21 | "如果关闭,您只能手动下载图片": "Se desativado, você só poderá baixar as imagens manualmente", 22 | "上传间隔时间": "Intervalo de envio", 23 | "单位为毫秒,默认设置1s": "A unidade é milissegundos, a configuração padrão é 1 segundo", 24 | "关闭提示": "Desativar notificações", 25 | "关闭右上角结果提示": "Desativar notificações de resultados no canto superior direito", 26 | "下载": "Baixar", 27 | "下载域名排除": "Excluir domínios para download", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Os endereços de imagens na lista de exclusão não serão baixados, um domínio por linha, suporta o uso de curinga *", 29 | "上传": "Enviar", 30 | "API 网关地址": "Endereço da API", 31 | "Image API Gateway 地址": "Endereço do Gateway da API de Imagens", 32 | "API 访问令牌": "Token de acesso da API", 33 | "用于访问API的令牌": "Token para acessar a API", 34 | "输入您的 API 访问令牌": "Digite seu token de acesso à API", 35 | "输入您的 Image API Gateway 地址": "Configuração do serviço API", 36 | "项目地址": "Endereço do projeto", 37 | "是否上传后删除原图片": "Excluir a imagem original após o envio?", 38 | "在图片上传后是否删除本地原图片": "Excluir a imagem original local após o envio?", 39 | "支持": "Suporte", 40 | "捐赠": "Doação", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Se você gostar deste plugin, considere fazer uma doação para apoiar o desenvolvimento contínuo", 42 | "复制 Debug 信息": "Copiar informações de depuração", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Copiar informações de depuração para a área de transferência, pode conter informações confidenciais!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Abra o console usando atalhos, você poderá ver os logs deste plugin e de outros plugins", 45 | 46 | 47 | "不处理": "Não processar", 48 | "等比左上填充(裁剪)": "Preenchimento proporcional a partir do canto superior esquerdo (corte)", 49 | "等比居中填充(裁剪)": "Preenchimento proporcional centralizado (corte)", 50 | "固定尺寸拉伸": "Esticar para tamanho fixo", 51 | "等比适应": "Ajuste proporcional", 52 | "笔记正文图片": "Imagem do conteúdo da nota", 53 | "笔记属性图片": "Imagem das propriedades da nota", 54 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Defina o modo de compressão da imagem, 0 significa sem restrições, o valor máximo não excederá as configurações do servidor", 55 | "正文图片": "Imagem do conteúdo principal", 56 | "宽度": "Largura", 57 | "高度": "Altura", 58 | "调整压缩": "Ajustar compressão", 59 | "属性": "Propriedade", 60 | "添加属性图片上传": "Adicionar upload de imagem de propriedade", 61 | "选择属性": "Selecionar propriedade", 62 | 63 | "图片上传地址增加随机查询": "Adicionar uma consulta aleatória ao endereço de upload de imagem para evitar o cache CDN", 64 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Adicionar uma consulta aleatória ao endereço de upload de imagem para evitar o cache CDN", 65 | "一键上传下载": "Upload e download em um clique", 66 | }; 67 | -------------------------------------------------------------------------------- /src/lang/locale/pt.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Baixar todas as imagens", 6 | "上传全部图片": "Enviar todas as imagens", 7 | 8 | //utils 9 | "自动上传": "Envio automático", 10 | "自动下载": "Download automático", 11 | "下载文件不是允许的图片类型": "O arquivo baixado não é um tipo de imagem permitido", 12 | "待上传图片不存在": "A imagem a ser enviada não existe", 13 | "图片文件创建失败:": "Falha ao criar o arquivo de imagem, por favor, verifique as permissões para criar arquivos", 14 | "网络错误,请检查网络是否通畅": "Erro de rede, por favor, verifique a conexão com a rede", 15 | 16 | // setting 17 | "通用": "Configurações gerais", 18 | "是否自动上传": "Envio automático?", 19 | "如果关闭,您只能手动上传图片": "Se desativado, você só poderá enviar as imagens manualmente", 20 | "是否自动下载": "Download automático?", 21 | "如果关闭,您只能手动下载图片": "Se desativado, você só poderá baixar as imagens manualmente", 22 | "上传间隔时间": "Intervalo de envio", 23 | "单位为毫秒,默认设置1s": "A unidade é milissegundos, a configuração padrão é 1 segundo", 24 | "关闭提示": "Desativar notificações", 25 | "关闭右上角结果提示": "Desativar notificações de resultados no canto superior direito", 26 | "下载": "Baixar", 27 | "下载域名排除": "Excluir domínios para download", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Os endereços de imagens na lista de exclusão não serão baixados, um domínio por linha, suporta o uso de curinga *", 29 | "上传": "Enviar", 30 | "API 网关地址": "Endereço da API", 31 | "Image API Gateway 地址": "Endereço do Gateway da API de Imagens", 32 | "API 访问令牌": "Token de acesso da API", 33 | "用于访问API的令牌": "Token para acessar a API", 34 | "输入您的 API 访问令牌": "Digite seu token de acesso à API", 35 | "输入您的 Image API Gateway 地址": "Configuração do serviço API", 36 | "项目地址": "Endereço do projeto", 37 | "是否上传后删除原图片": "Excluir a imagem original após o envio?", 38 | "在图片上传后是否删除本地原图片": "Excluir a imagem original local após o envio?", 39 | "支持": "Suporte", 40 | "捐赠": "Doação", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Se você gostar deste plugin, considere fazer uma doação para apoiar o desenvolvimento contínuo", 42 | "复制 Debug 信息": "Copiar informações de depuração", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Copiar informações de depuração para a área de transferência, pode conter informações confidenciais!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Abra o console usando atalhos, você poderá ver os logs deste plugin e de outros plugins", 45 | 46 | "不处理": "Não processar", 47 | "等比左上填充(裁剪)": "Preenchimento proporcional a partir do canto superior esquerdo (corte)", 48 | "等比居中填充(裁剪)": "Preenchimento proporcional centralizado (corte)", 49 | "固定尺寸拉伸": "Esticar para tamanho fixo", 50 | "等比适应": "Ajuste proporcional", 51 | "笔记正文图片": "Imagem do conteúdo da nota", 52 | "笔记属性图片": "Imagem das propriedades da nota", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Defina o modo de compressão da imagem, 0 significa sem restrições, o valor máximo não excederá as configurações do servidor", 54 | "正文图片": "Imagem do conteúdo principal", 55 | "宽度": "Largura", 56 | "高度": "Altura", 57 | "调整压缩": "Ajustar compressão", 58 | "属性": "Propriedade", 59 | "添加属性图片上传": "Adicionar upload de imagem de propriedade", 60 | "选择属性": "Selecionar propriedade", 61 | 62 | "图片上传地址增加随机查询": "Adicionar uma consulta aleatória ao endereço de upload de imagem para evitar o cache CDN", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Adicionar uma consulta aleatória ao endereço de upload de imagem para evitar o cache CDN", 64 | "一键上传下载": "Upload e download em um clique", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/ro.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Descarcă toate imaginile", 6 | "上传全部图片": "Încarcă toate imaginile", 7 | 8 | //utils 9 | "自动上传": "Încărcare automată", 10 | "自动下载": "Descarcare automată", 11 | "下载文件不是允许的图片类型": "Fișierul descărcat nu este un tip de imagine permis", 12 | "待上传图片不存在": "Imaginea de încărcat nu există", 13 | "图片文件创建失败:": "Crearea fișierului de imagine a eșuat, vă rugăm să verificați permisiunile pentru crearea fișierelor", 14 | "网络错误,请检查网络是否通畅": "Eroare de rețea, vă rugăm să verificați conexiunea la rețea", 15 | 16 | // setting 17 | "通用": "Setări generale", 18 | "是否自动上传": "Încărcare automată?", 19 | "如果关闭,您只能手动上传图片": "Dacă este oprit, veți putea încărca imagini doar manual", 20 | "是否自动下载": "Descarcare automată?", 21 | "如果关闭,您只能手动下载图片": "Dacă este oprit, veți putea descărca imagini doar manual", 22 | "上传间隔时间": "Interval de încărcare", 23 | "单位为毫秒,默认设置1s": "Unitatea este milisecunde, setarea implicită este 1 secundă", 24 | "关闭提示": "Dezactivează notificările", 25 | "关闭右上角结果提示": "Dezactivează notificările de rezultate din colțul din dreapta sus", 26 | "下载": "Descarcă", 27 | "下载域名排除": "Excluderea domeniilor de descărcare", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Adresele imaginilor din lista de excludere nu vor fi descărcate, un domeniu pe rând, suportă caracterul wildcard *", 29 | "上传": "Încarcă", 30 | "API 网关地址": "Adresă API", 31 | "Image API Gateway 地址": "Adresă Image API Gateway", 32 | "API 访问令牌": "Token de acces API", 33 | "用于访问API的令牌": "Token pentru acces la API", 34 | "输入您的 API 访问令牌": "Introduceți tokenul dumneavoastră de acces API", 35 | "输入您的 Image API Gateway 地址": "Configurarea serviciului API", 36 | "项目地址": "Adresă proiect", 37 | "是否上传后删除原图片": "Se șterge imaginea originală după încărcare?", 38 | "在图片上传后是否删除本地原图片": "Se șterge imaginea originală locală după încărcare?", 39 | "支持": "Suport", 40 | "捐赠": "Donație", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Dacă vă place acest plugin, vă rugăm să luați în considerare o donație pentru a sprijini dezvoltarea continuă", 42 | "复制 Debug 信息": "Copiază informațiile de depanare", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Copiază informațiile de depanare în clipboard, poate conține informații sensibile!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Deschideți consola folosind o combinație de taste, pentru a vizualiza jurnalele acestui plugin și ale altor pluginuri", 45 | 46 | "不处理": "Nu procesați", 47 | "等比左上填充(裁剪)": "Umplere proporțională din colțul din stânga sus (tăiere)", 48 | "等比居中填充(裁剪)": "Umplere proporțională centrată (tăiere)", 49 | "固定尺寸拉伸": "Întindere la dimensiune fixă", 50 | "等比适应": "Ajustare proporțională", 51 | "笔记正文图片": "Imaginea conținutului notei", 52 | "笔记属性图片": "Imaginea proprietăților notei", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Setați modul de compresie a imaginii, 0 înseamnă fără restricții, valoarea maximă nu va depăși setările serverului", 54 | "正文图片": "Imaginea conținutului principal", 55 | "宽度": "Lățime", 56 | "高度": "Înălțime", 57 | "调整压缩": "Ajustați compresia", 58 | "属性": "Proprietate", 59 | "添加属性图片上传": "Adăugați încărcarea imaginii proprietății", 60 | "选择属性": "Selectați proprietatea", 61 | 62 | "图片上传地址增加随机查询": "Adăugați o întrebare aleatorie la adresa de încărcare a imaginii pentru a evita cache-ul CDN", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Adăugați o întrebare aleatorie la adresa de încărcare a imaginii pentru a evita cache-ul CDN", 64 | "一键上传下载": "Încărcare și descărcare într-un clic", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/ru.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Скачать все изображения", 6 | "上传全部图片": "Загрузить все изображения", 7 | 8 | //utils 9 | "自动上传": "Автозагрузка", 10 | "自动下载": "Автоскачивание", 11 | "下载文件不是允许的图片类型": "Загруженный файл не является допустимым типом изображения", 12 | "待上传图片不存在": "Изображение для загрузки не существует", 13 | "图片文件创建失败:": "Не удалось создать файл изображения, пожалуйста, проверьте права на создание файлов", 14 | "网络错误,请检查网络是否通畅": "Ошибка сети, пожалуйста, проверьте подключение к сети", 15 | 16 | // setting 17 | "通用": "Общие настройки", 18 | "是否自动上传": "Автоматическая загрузка?", 19 | "如果关闭,您只能手动上传图片": "Если отключено, вы сможете загружать изображения только вручную", 20 | "是否自动下载": "Автоматическое скачивание?", 21 | "如果关闭,您只能手动下载图片": "Если отключено, вы сможете скачивать изображения только вручную", 22 | "上传间隔时间": "Интервал загрузки", 23 | "单位为毫秒,默认设置1s": "Единица измерения - миллисекунды, значение по умолчанию - 1 секунда", 24 | "关闭提示": "Отключить уведомления", 25 | "关闭右上角结果提示": "Отключить уведомления о результатах в правом верхнем углу", 26 | "下载": "Скачать", 27 | "下载域名排除": "Исключенные домены для скачивания", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Изображения с адресов, включенных в список исключений, не будут скачиваться. Один домен на строку, поддерживается символ * для подстановки", 29 | "上传": "Загрузить", 30 | "API 网关地址": "Адрес API", 31 | "Image API Gateway 地址": "Адрес Image API Gateway", 32 | "API 访问令牌": "Токен доступа API", 33 | "用于访问API的令牌": "Токен для доступа к API", 34 | "输入您的 API 访问令牌": "Введите ваш токен доступа к API", 35 | "输入您的 Image API Gateway 地址": "Настройка API-сервиса", 36 | "项目地址": "Адрес проекта", 37 | "是否上传后删除原图片": "Удалить оригинальное изображение после загрузки?", 38 | "在图片上传后是否删除本地原图片": "Удалить оригинальное изображение с локального устройства после загрузки?", 39 | "支持": "Поддержка", 40 | "捐赠": "Пожертвование", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Если вам нравится этот плагин, пожалуйста, подумайте о пожертвовании для поддержки дальнейшей разработки", 42 | "复制 Debug 信息": "Копировать информацию для отладки", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Копировать информацию для отладки в буфер обмена, может содержать конфиденциальные данные!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Откройте консоль с помощью горячих клавиш, чтобы увидеть логи этого плагина и других плагинов", 45 | 46 | "不处理": "Не обрабатывать", 47 | "等比左上填充(裁剪)": "Пропорциональное заполнение с левого верхнего угла (обрезка)", 48 | "等比居中填充(裁剪)": "Пропорциональное заполнение по центру (обрезка)", 49 | "固定尺寸拉伸": "Растяжение до фиксированного размера", 50 | "等比适应": "Пропорциональная настройка", 51 | "笔记正文图片": "Изображение основного содержимого заметки", 52 | "笔记属性图片": "Изображение свойств заметки", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Установите режим сжатия изображения, 0 означает без ограничений, максимальное значение не превысит настройки сервера", 54 | "正文图片": "Изображение основного текста", 55 | "宽度": "Ширина", 56 | "高度": "Высота", 57 | "调整压缩": "Настроить сжатие", 58 | "属性": "Свойство", 59 | "添加属性图片上传": "Добавить загрузку изображения свойства", 60 | "选择属性": "Выбрать свойство", 61 | 62 | "图片上传地址增加随机查询": "Добавить случайный запрос к адресу загрузки изображения", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Добавить случайный запрос к адресу загрузки изображения, чтобы избежать кэширования CDN", 64 | "一键上传下载": "Загрузить и скачать одним кликом", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/sq.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Shkarkoni të gjitha imazhet", 6 | "上传全部图片": "Ngarkoni të gjitha imazhet", 7 | 8 | //utils 9 | "自动上传": "Ngarkim automatik", 10 | "自动下载": "Shkarkim automatik", 11 | "下载文件不是允许的图片类型": "Dosja e shkarkuar nuk është një lloj imazhi i lejuar", 12 | "待上传图片不存在": "Imazhi për t'u ngarkuar nuk ekziston", 13 | "图片文件创建失败:": "Dështoi krijimi i skedarit të imazhit, ju lutemi kontrolloni lejet për krijimin e skedarëve", 14 | "网络错误,请检查网络是否通畅": "Gabim rrjeti, ju lutemi kontrolloni lidhjen me rrjetin", 15 | 16 | // setting 17 | "通用": "Cilësime të përgjithshme", 18 | "是否自动上传": "A të ngarkohet automatikisht?", 19 | "如果关闭,您只能手动上传图片": "Nëse është e fikur, mund të ngarkoni imazhe vetëm manualisht", 20 | "是否自动下载": "A të shkarkohet automatikisht?", 21 | "如果关闭,您只能手动下载图片": "Nëse është e fikur, mund të shkarkoni imazhe vetëm manualisht", 22 | "上传间隔时间": "Kohëzgjatja midis ngarkimeve", 23 | "单位为毫秒,默认设置1s": "Njësia është milisekonda, cilësimi i parazgjedhur është 1 sekondë", 24 | "关闭提示": "Mbyll njoftimet", 25 | "关闭右上角结果提示": "Mbyll njoftimet për rezultatet në këndin e sipërm të djathtë", 26 | "下载": "Shkarkoni", 27 | "下载域名排除": "Përjashtoni domenet për shkarkim", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Adresat e imazheve në listën e përjashtimit nuk do të shkarkohen, një domen për rresht, mbështet përdorimin e karaktereve zamenuese *", 29 | "上传": "Ngarkoni", 30 | "API 网关地址": "Adresa API", 31 | "Image API Gateway 地址": "Adresa e Image API Gateway", 32 | "API 访问令牌": "Tokeni i hyrjes API", 33 | "用于访问API的令牌": "Tokeni për akses në API", 34 | "输入您的 API 访问令牌": "Futni tokenin tuaj të hyrjes API", 35 | "输入您的 Image API Gateway 地址": "Konfigurimi i shërbimit API", 36 | "项目地址": "Adresa e projektit", 37 | "是否上传后删除原图片": "Të fshihet imazhi origjinal pas ngarkimit?", 38 | "在图片上传后是否删除本地原图片": "Të fshihet imazhi origjinal lokal pas ngarkimit?", 39 | "支持": "Mbështetje", 40 | "捐赠": "Dhurim", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Nëse ju pëlqen ky shtojcë, ju lutemi merrni parasysh dhurimin për të mbështetur zhvillimin e mëtejshëm", 42 | "复制 Debug 信息": "Kopjoni informacionin e debug", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Kopjoni informacionin e debug në shiritin e ngjitjes, mund të përmbajë informacion të ndjeshëm!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Hapni konsolën me shkurtore, mund të shihni regjistrat e këtij shtojce dhe shtojcave të tjera", 45 | 46 | "不处理": "Mos procesoni", 47 | "等比左上填充(裁剪)": "Përmbushje proporcionale nga këndi i majtë i sipërm (prerje)", 48 | "等比居中填充(裁剪)": "Përmbushje proporcionale në qendër (prerje)", 49 | "固定尺寸拉伸": "Shtrirje në madhësi fikse", 50 | "等比适应": "Përshtatje proporcionale", 51 | "笔记正文图片": "Imazhi i përmbajtjes së shënimit", 52 | "笔记属性图片": "Imazhi i pronave të shënimit", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Caktoni modalitetin e kompresimit të imazhit, 0 do të thotë pa kufizime, vlera maksimale nuk do të kalojë cilësimet e serverit", 54 | "正文图片": "Imazhi i përmbajtjes kryesore", 55 | "宽度": "Gjerësi", 56 | "高度": "Lartësi", 57 | "调整压缩": "Përshtatni kompresimin", 58 | "属性": "Pronë", 59 | "添加属性图片上传": "Shto ngarkimin e imazhit të pronës", 60 | "选择属性": "Zgjidhni pronën", 61 | 62 | "图片上传地址增加随机查询": "Shto një pyetje të rastëv në adresën e ngarkimit të imazhit për të evitë keshën e CDN", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Shto një pyetje të rastëv në adresën e ngarkimit të imazhit për të evitë keshën e CDN", 64 | "一键上传下载": "Ngarko dhe shkarko në një klik", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/th.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "ดาวน์โหลดรูปภาพทั้งหมด", 6 | "上传全部图片": "อัพโหลดรูปภาพทั้งหมด", 7 | 8 | //utils 9 | "自动上传": "อัพโหลดอัตโนมัติ", 10 | "自动下载": "ดาวน์โหลดอัตโนมัติ", 11 | "下载文件不是允许的图片类型": "ไฟล์ที่ดาวน์โหลดไม่ใช่ประเภทภาพที่อนุญาต", 12 | "待上传图片不存在": "ไม่มีรูปภาพที่ต้องอัพโหลด", 13 | "图片文件创建失败:": "ไม่สามารถสร้างไฟล์รูปภาพได้ กรุณาตรวจสอบสิทธิ์การสร้างไฟล์", 14 | "网络错误,请检查网络是否通畅": "ข้อผิดพลาดทางเครือข่าย กรุณาตรวจสอบการเชื่อมต่อเครือข่าย", 15 | 16 | // setting 17 | "通用": "การตั้งค่าทั่วไป", 18 | "是否自动上传": "อัพโหลดอัตโนมัติหรือไม่?", 19 | "如果关闭,您只能手动上传图片": "หากปิดใช้งาน คุณจะสามารถอัพโหลดรูปภาพได้เพียงแบบแมนนวล", 20 | "是否自动下载": "ดาวน์โหลดอัตโนมัติหรือไม่?", 21 | "如果关闭,您只能手动下载图片": "หากปิดใช้งาน คุณจะสามารถดาวน์โหลดรูปภาพได้เพียงแบบแมนนวล", 22 | "上传间隔时间": "ระยะเวลาในการอัพโหลด", 23 | "单位为毫秒,默认设置1s": "หน่วยเป็นมิลลิวินาที การตั้งค่าเริ่มต้นคือ 1 วินาที", 24 | "关闭提示": "ปิดการแจ้งเตือน", 25 | "关闭右上角结果提示": "ปิดการแจ้งเตือนผลลัพธ์ที่มุมขวาบน", 26 | "下载": "ดาวน์โหลด", 27 | "下载域名排除": "ยกเว้นโดเมนที่ดาวน์โหลด", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "ที่อยู่ของรูปภาพในรายการยกเว้นจะไม่ถูกดาวน์โหลด ทุกโดเมนในหนึ่งบรรทัด รองรับตัวอักษร * สำหรับตัวแทน", 29 | "上传": "อัพโหลด", 30 | "API 网关地址": "ที่อยู่ API", 31 | "Image API Gateway 地址": "ที่อยู่ Image API Gateway", 32 | "API 访问令牌": "โทเค็นการเข้าถึง API", 33 | "用于访问API的令牌": "โทเค็นที่ใช้ในการเข้าถึง API", 34 | "输入您的 API 访问令牌": "กรอกโทเค็นการเข้าถึง API ของคุณ", 35 | "输入您的 Image API Gateway 地址": "ตั้งค่าบริการ API", 36 | "项目地址": "ที่อยู่โครงการ", 37 | "是否上传后删除原图片": "ลบรูปภาพต้นฉบับหลังจากอัพโหลดหรือไม่?", 38 | "在图片上传后是否删除本地原图片": "ลบรูปภาพต้นฉบับในเครื่องหลังจากการอัพโหลดหรือไม่?", 39 | "支持": "การสนับสนุน", 40 | "捐赠": "การบริจาค", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "หากคุณชื่นชอบปลั๊กอินนี้ กรุณาพิจารณาบริจาคเพื่อสนับสนุนการพัฒนาต่อไป", 42 | "复制 Debug 信息": "คัดลอกข้อมูลการดีบัก", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "คัดลอกข้อมูลการดีบักไปยังคลิปบอร์ด อาจมีข้อมูลที่ละเอียดอ่อน!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "เปิดคอนโซลโดยใช้คีย์ลัด คุณจะเห็นบันทึกของปลั๊กอินนี้และปลั๊กอินอื่นๆ", 45 | 46 | "不处理": "ไม่ประมวลผล", 47 | "等比左上填充(裁剪)": "เติมเต็มแบบอัตราส่วนจากมุมซ้ายบน (ตัด)", 48 | "等比居中填充(裁剪)": "เติมเต็มแบบอัตราส่วนที่ศูนย์กลาง (ตัด)", 49 | "固定尺寸拉伸": "ยืดขนาดคงที่", 50 | "等比适应": "ปรับขนาดตามอัตราส่วน", 51 | "笔记正文图片": "ภาพเนื้อหาหลักของบันทึก", 52 | "笔记属性图片": "ภาพคุณสมบัติของบันทึก", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "ตั้งค่าโหมดการบีบอัดภาพ, 0 หมายถึงไม่มีข้อจำกัด, ค่าสูงสุดจะไม่เกินการตั้งค่าของเซิร์ฟเวอร์", 54 | "正文图片": "ภาพเนื้อหาหลัก", 55 | "宽度": "ความกว้าง", 56 | "高度": "ความสูง", 57 | "调整压缩": "ปรับการบีบอัด", 58 | "属性": "คุณสมบัติ", 59 | "添加属性图片上传": "เพิ่มการอัปโหลดภาพคุณสมบัติ", 60 | "选择属性": "เลือกคุณสมบัติ", 61 | 62 | "图片上传地址增加随机查询": "เพิ่มคำสั่งสุ่มที่สำหรับที่อยู่ของภาพที่จะอัปโหลด", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "เพิ่มคำสั่งสุ่มที่สำหรับที่อยู่ของภาพที่จะอัปโหลด เพื่อหลีกเลี่ยงการเก็บข้อมูลจาก CDN", 64 | "一键上传下载": "อัปโหลดและดาวน์โหลดในครั้งเดียว", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/tr.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Tüm resimleri indir", 6 | "上传全部图片": "Tüm resimleri yükle", 7 | 8 | //utils 9 | "自动上传": "Otomatik yükleme", 10 | "自动下载": "Otomatik indirme", 11 | "下载文件不是允许的图片类型": "İndirilen dosya izin verilen resim türünde değil", 12 | "待上传图片不存在": "Yüklenmesi gereken resim mevcut değil", 13 | "图片文件创建失败:": "Yerel dosya oluşturulamadı, lütfen dosya oluşturma izninizin olup olmadığını kontrol edin", 14 | "网络错误,请检查网络是否通畅": "Ağ hatası, lütfen ağ bağlantınızı kontrol edin", 15 | 16 | // setting 17 | "通用": "Genel", 18 | "是否自动上传": "Otomatik yükleme?", 19 | "如果关闭,您只能手动上传图片": "Eğer kapalıysa, yalnızca manuel olarak resim yükleyebilirsiniz", 20 | "是否自动下载": "Otomatik indirme?", 21 | "如果关闭,您只能手动下载图片": "Eğer kapalıysa, yalnızca manuel olarak resim indirebilirsiniz", 22 | "上传间隔时间": "Yükleme aralığı", 23 | "单位为毫秒,默认设置1s": "Birim milisaniye cinsindendir, varsayılan 1 saniye olarak ayarlanmıştır", 24 | "关闭提示": "Bildirimleri kapat", 25 | "关闭右上角结果提示": "Sağ üst köşedeki sonuç bildirimlerini kapat", 26 | "下载": "İndir", 27 | "下载域名排除": "İndirilen alan adı hariç tutma", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Hariç tutma listesinde bulunan resim adresleri indirilmeyecek, her satırda bir alan adı, * joker karakteri desteklenir", 29 | "上传": "Yükle", 30 | "API 网关地址": "API adresi", 31 | "Image API Gateway 地址": "Resim API Geçidi adresi", 32 | "API 访问令牌": "API erişim token'ı", 33 | "用于访问API的令牌": "API'ye erişim için kullanılan token", 34 | "输入您的 API 访问令牌": "API erişim token'ınızı girin", 35 | "输入您的 Image API Gateway 地址": "API hizmeti kurulumu", 36 | "项目地址": "Proje adresi", 37 | "是否上传后删除原图片": "Yükleme sonrası orijinal resmi sil?", 38 | "在图片上传后是否删除本地原图片": "Resim yüklendikten sonra yerel orijinal resmi sil?", 39 | "支持": "Destek", 40 | "捐赠": "Bağış yap", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Bu eklentiyi beğendiyseniz, gelişimine devam etmek için bağış yapmayı düşünün.", 42 | "复制 Debug 信息": "Hata ayıklama bilgilerini kopyala", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Hata ayıklama bilgilerini panoya kopyalayın, hassas bilgiler içerebilir!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Konsolu kısayol ile açın, bu eklentinin ve diğer eklentilerin günlüklerini görebilirsiniz", 45 | 46 | "不处理": "İşlemeyin", 47 | "等比左上填充(裁剪)": "Sol üst köşeden orantılı doldurma (kesme)", 48 | "等比居中填充(裁剪)": "Orantılı merkezden doldurma (kesme)", 49 | "固定尺寸拉伸": "Sabit boyuta germe", 50 | "等比适应": "Orantılı uyum", 51 | "笔记正文图片": "Not içeriği resmi", 52 | "笔记属性图片": "Not özellikleri resmi", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Resim sıkıştırma modunu ayarlayın, 0 sınırsız demektir, maksimum değer sunucu ayarlarını geçmeyecektir", 54 | "正文图片": "Ana içerik resmi", 55 | "宽度": "Genişlik", 56 | "高度": "Yükseklik", 57 | "调整压缩": "Sıkıştırmayı ayarla", 58 | "属性": "Özellik", 59 | "添加属性图片上传": "Özellik resmi yüklemesi ekle", 60 | "选择属性": "Özellik seçin", 61 | 62 | 63 | "图片上传地址增加随机查询": "Resim yükleme adresine rastgele sorgu ekleyerek CDN önbelleğini önleme", 64 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Resim yükleme adresine rastgele sorgu ekleyerek CDN önbelleğini önleme", 65 | "一键上传下载": "Tüm resimleri yükle ve indir", 66 | }; 67 | -------------------------------------------------------------------------------- /src/lang/locale/uk.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Завантажити всі зображення", 6 | "上传全部图片": "Завантажити всі зображення", 7 | 8 | //utils 9 | "自动上传": "Автоматичне завантаження", 10 | "自动下载": "Автоматичне завантаження", 11 | "下载文件不是允许的图片类型": "Завантажений файл не є дозволеним типом зображення", 12 | "待上传图片不存在": "Зображення для завантаження не існує", 13 | "图片文件创建失败:": "Не вдалося створити файл зображення, перевірте права на створення файлів", 14 | "网络错误,请检查网络是否通畅": "Помилка мережі, перевірте підключення до мережі", 15 | 16 | // setting 17 | "通用": "Загальні налаштування", 18 | "是否自动上传": "Автоматично завантажувати?", 19 | "如果关闭,您只能手动上传图片": "Якщо вимкнено, ви можете завантажувати зображення лише вручну", 20 | "是否自动下载": "Автоматично завантажувати?", 21 | "如果关闭,您只能手动下载图片": "Якщо вимкнено, ви можете завантажувати зображення лише вручну", 22 | "上传间隔时间": "Інтервал між завантаженнями", 23 | "单位为毫秒,默认设置1s": "Одиниця вимірювання — мілісекунди, за замовчуванням 1 секунда", 24 | "关闭提示": "Вимкнути сповіщення", 25 | "关闭右上角结果提示": "Вимкнути сповіщення про результати у верхньому правому куті", 26 | "下载": "Завантажити", 27 | "下载域名排除": "Виключити домени для завантаження", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Адреси зображень у списку виключень не будуть завантажені, один домен на рядок, підтримуються символи-замінники *", 29 | "上传": "Завантажити", 30 | "API 网关地址": "Адреса API", 31 | "Image API Gateway 地址": "Адреса шлюзу Image API", 32 | "API 访问令牌": "Токен доступу до API", 33 | "用于访问API的令牌": "Токен для доступу до API", 34 | "输入您的 API 访问令牌": "Введіть ваш токен доступу до API", 35 | "输入您的 Image API Gateway 地址": "Налаштування сервісу API", 36 | "项目地址": "Адреса проєкту", 37 | "是否上传后删除原图片": "Видаляти оригінальне зображення після завантаження?", 38 | "在图片上传后是否删除本地原图片": "Видаляти локальне оригінальне зображення після завантаження?", 39 | "支持": "Підтримка", 40 | "捐赠": "Пожертвування", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Якщо вам подобається цей плагін, будь ласка, розгляньте можливість пожертвування для підтримки подальшої розробки.", 42 | "复制 Debug 信息": "Копіювати інформацію для налагодження", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Копіювати інформацію для налагодження в буфер обміну, може містити конфіденційну інформацію!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Відкрийте консоль за допомогою гарячих клавіш, ви зможете побачити журнали цього плагіна та інших плагінів", 45 | 46 | "不处理": "Не обробляти", 47 | "等比左上填充(裁剪)": "Пропорційне заповнення з лівого верхнього кута (обрізка)", 48 | "等比居中填充(裁剪)": "Пропорційне заповнення по центру (обрізка)", 49 | "固定尺寸拉伸": "Розтягування до фіксованого розміру", 50 | "等比适应": "Пропорційне налаштування", 51 | "笔记正文图片": "Зображення основного контенту нотатки", 52 | "笔记属性图片": "Зображення властивостей нотатки", 53 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Встановіть режим стиснення зображення, 0 означає без обмежень, максимальне значення не перевищить налаштування сервера", 54 | "正文图片": "Зображення основного тексту", 55 | "宽度": "Ширина", 56 | "高度": "Висота", 57 | "调整压缩": "Налаштувати стиснення", 58 | "属性": "Властивість", 59 | "添加属性图片上传": "Додати завантаження зображення властивості", 60 | "选择属性": "Вибрати властивість", 61 | 62 | "图片上传地址增加随机查询": "Додати випадковий запит до адреси завантаження зображення для уникнення кешування CDN", 63 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Додати випадковий запит до адреси завантаження зображення для уникнення кешування CDN", 64 | "一键上传下载": "Завантажити всі зображення", 65 | }; 66 | -------------------------------------------------------------------------------- /src/lang/locale/vi.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | //main 5 | "下载全部图片": "Tải tất cả hình ảnh", 6 | "上传全部图片": "Tải lên tất cả hình ảnh", 7 | 8 | //utils 9 | "自动上传": "Tải lên tự động", 10 | "自动下载": "Tải xuống tự động", 11 | "下载文件不是允许的图片类型": "Tệp tải xuống không phải là loại hình ảnh được phép", 12 | "待上传图片不存在": "Hình ảnh cần tải lên không tồn tại", 13 | "图片文件创建失败:": "Tạo tệp hình ảnh thất bại, vui lòng kiểm tra quyền tạo tệp", 14 | "网络错误,请检查网络是否通畅": "Lỗi mạng, vui lòng kiểm tra kết nối mạng", 15 | 16 | // setting 17 | "通用": "Cài đặt chung", 18 | "是否自动上传": "Tải lên tự động?", 19 | "如果关闭,您只能手动上传图片": "Nếu tắt, bạn chỉ có thể tải lên hình ảnh thủ công", 20 | "是否自动下载": "Tải xuống tự động?", 21 | "如果关闭,您只能手动下载图片": "Nếu tắt, bạn chỉ có thể tải xuống hình ảnh thủ công", 22 | "上传间隔时间": "Khoảng thời gian tải lên", 23 | "单位为毫秒,默认设置1s": "Đơn vị tính bằng mili giây, cài đặt mặc định là 1 giây", 24 | "关闭提示": "Tắt thông báo", 25 | "关闭右上角结果提示": "Tắt thông báo kết quả ở góc phải trên", 26 | "下载": "Tải xuống", 27 | "下载域名排除": "Loại trừ tên miền tải xuống", 28 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "Địa chỉ hình ảnh trong danh sách loại trừ sẽ không được tải xuống, một tên miền mỗi dòng, hỗ trợ ký tự đại diện *", 29 | "上传": "Tải lên", 30 | "API 网关地址": "Địa chỉ API", 31 | "Image API Gateway 地址": "Địa chỉ Cổng API Hình ảnh", 32 | "API 访问令牌": "Mã thông báo truy cập API", 33 | "用于访问API的令牌": "Mã thông báo được sử dụng để truy cập API", 34 | "输入您的 API 访问令牌": "Nhập mã thông báo truy cập API của bạn", 35 | "输入您的 Image API Gateway 地址": "Cài đặt dịch vụ API", 36 | "项目地址": "Địa chỉ dự án", 37 | "是否上传后删除原图片": "Xóa hình ảnh gốc sau khi tải lên?", 38 | "在图片上传后是否删除本地原图片": "Xóa hình ảnh gốc trên máy tính sau khi tải lên?", 39 | "支持": "Hỗ trợ", 40 | "捐赠": "Ủng hộ", 41 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "Nếu bạn thích plugin này, hãy cân nhắc ủng hộ để hỗ trợ phát triển tiếp.", 42 | "复制 Debug 信息": "Sao chép thông tin gỡ lỗi", 43 | "将调试信息复制到剪贴板, 可能包含敏感信!": "Sao chép thông tin gỡ lỗi vào clipboard, có thể chứa thông tin nhạy cảm!", 44 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "Mở bảng điều khiển bằng phím tắt, bạn có thể xem nhật ký của plugin này và các plugin khác", 45 | 46 | 47 | "不处理": "Không xử lý", 48 | "等比左上填充(裁剪)": "Điền tỉ lệ từ góc trên bên trái (cắt)", 49 | "等比居中填充(裁剪)": "Điền tỉ lệ trung tâm (cắt)", 50 | "固定尺寸拉伸": "Kéo dài đến kích thước cố định", 51 | "等比适应": "Điều chỉnh tỉ lệ", 52 | "笔记正文图片": "Hình ảnh nội dung chính của ghi chú", 53 | "笔记属性图片": "Hình ảnh thuộc tính của ghi chú", 54 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "Cài đặt chế độ nén hình ảnh, 0 có nghĩa là không giới hạn, giá trị tối đa không vượt quá cài đặt của máy chủ", 55 | "正文图片": "Hình ảnh nội dung chính", 56 | "宽度": "Chiều rộng", 57 | "高度": "Chiều cao", 58 | "调整压缩": "Điều chỉnh nén", 59 | "属性": "Thuộc tính", 60 | "添加属性图片上传": "Thêm tải lên hình ảnh thuộc tính", 61 | "选择属性": "Chọn thuộc tính", 62 | 63 | "图片上传地址增加随机查询": "Thêm tải lên hình ảnh thuộc tính", 64 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "Thêm tải lên hình ảnh thuộc tính", 65 | 66 | "一键上传下载": "Tải lên và tải xuống một lần", 67 | }; 68 | -------------------------------------------------------------------------------- /src/lang/locale/zh-cn.ts: -------------------------------------------------------------------------------- 1 | // 简体中文 2 | import { lang } from "../../lang"; 3 | 4 | export default { 5 | "Custom Image Auto Uploader": "自定义图片上传云端保存插件", 6 | "已开启": "已开启", 7 | "已关闭": "已关闭", 8 | //main 9 | "下载全部图片": "下载全部图片", 10 | "上传全部图片": "上传全部图片", 11 | 12 | //utils 13 | "自动上传下载": "自动上传下载", 14 | "自动上传": "自动上传", 15 | "自动下载": "自动下载", 16 | "下载文件不是允许的图片类型": "下载文件不是允许的图片类型", 17 | "待上传图片不存在": "待上传图片不存在", 18 | "图片文件创建失败:": "本地文件创建错误,请检查是否有创建权限", 19 | "网络错误,请检查网络是否通畅": "网络错误,请检查网络是否通畅", 20 | 21 | // setting 22 | "通用": "通用", 23 | "API 网关": "API 网关", 24 | "是否自动上传": "是否自动上传", 25 | "如果关闭,您只能手动上传图片": "如果关闭,您只能手动上传图片", 26 | "是否自动下载": "是否自动下载", 27 | "如果关闭,您只能手动下载图片": "如果关闭,您只能手动下载图片", 28 | "上传间隔时间": "上传间隔时间", 29 | "单位为毫秒,默认设置1s": "单位为毫秒,默认设置1s", 30 | "关闭提示": "关闭提示", 31 | "关闭右上角结果提示": "关闭右上角结果提示", 32 | "下载": "下载", 33 | "下载域名排除": "下载域名排除", 34 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符", 35 | "上传": "上传", 36 | "API 网关地址": "API 网关地址", 37 | "Image API Gateway 地址": "Image API Gateway 地址", 38 | "API 访问令牌": "API 访问令牌", 39 | "用于访问API的令牌": "用于访问API的令牌", 40 | "输入您的 API 访问令牌": "输入您的 API 访问令牌", 41 | "输入您的 Image API Gateway 地址": "输入您的 Image API Gateway 地址", 42 | "接口配置信息已经粘贴到设置中!": "接口配置信息已经粘贴到设置中!", 43 | "网关服务选择": "网关服务选择", 44 | "选择一个适合自己的网关服务": "选择一个适合自己的网关服务", 45 | "方式": "方式", 46 | "说明": "说明", 47 | "自行搭建": "自行搭建", 48 | "速度好, 自由配置, 无隐私风险, 支持云存储和服务端存储": "速度好, 自由配置, 无隐私风险, 支持云存储和服务端存储", 49 | "多用户开放网关": "多用户开放网关", 50 | "稳定性好, 仅支持用户的云存储": "稳定性好, 仅支持用户的云存储", 51 | "粘贴多用户开放网关的接口配置": "粘贴多用户开放网关的接口配置", 52 | "未检测到配置信息!" : "未检测到配置信息!", 53 | 54 | "项目地址": "项目地址", 55 | "是否上传后删除原图片": "是否上传后删除原图片", 56 | "在图片上传后是否删除本地原图片": "在图片上传后是否删除本地原图片", 57 | "支持": "支持", 58 | "捐赠": "捐赠", 59 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "如果您喜欢这个插件,请考虑捐赠以支持继续开发。", 60 | "复制 Debug 信息": "复制 Debug 信息", 61 | "将调试信息复制到剪贴板, 可能包含敏感信!": "将调试信息复制到剪贴板, 可能包含敏感信!", 62 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志", 63 | 64 | 65 | "不处理": "不处理", 66 | "等比左上填充(裁剪)": "等比左上填充(裁剪)", 67 | "等比居中填充(裁剪)": "等比居中填充(裁剪)", 68 | "固定尺寸拉伸": "固定尺寸拉伸", 69 | "等比适应": "等比适应", 70 | "笔记正文图片": "笔记正文图片", 71 | "笔记属性图片": "笔记属性图片", 72 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置", 73 | "正文图片": "正文图片", 74 | "宽度": "宽度", 75 | "高度": "高度", 76 | "调整压缩": "调整压缩", 77 | "属性": "属性", 78 | "添加属性图片上传": "添加属性图片上传", 79 | "选择属性": "选择属性", 80 | 81 | "图片上传地址增加随机查询": "图片上传地址增加随机查询", 82 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "在图片地址末尾增加随机查询,用于规避CDN缓存", 83 | "一键上传下载": "一键上传下载", 84 | 85 | "上传速度优化": "上传速度优化", 86 | "在图片上传前是否进行压缩": "在图片上传前是否进行压缩", 87 | "上传速度优化 - 压缩质量": "上传速度优化 - 压缩质量", 88 | "压缩后的图片质量,范围0-1,默认0.8": "压缩后的图片质量,范围0-1,默认0.8", 89 | "上传速度优化 - 最大宽度": "上传速度优化 - 最大宽度", 90 | "压缩后的最大宽度,单位像素,默认1200": "压缩后的最大宽度,单位像素,默认1200", 91 | "上传速度优化 - 最大高度": "上传速度优化 - 最大高度", 92 | "压缩后的最大高度,单位像素,默认1200": "压缩后的最大高度,单位像素,默认1200", 93 | 94 | }; 95 | 96 | 97 | -------------------------------------------------------------------------------- /src/lang/locale/zh-tw.ts: -------------------------------------------------------------------------------- 1 | import { lang } from "../../lang"; 2 | 3 | export default { 4 | "Custom Image Auto Uploader": "自定義圖片上傳雲端保存插件", 5 | "已开启": "已開啟", 6 | "已关闭": "已關閉", 7 | //main 8 | "下载全部图片": "下載全部圖片", 9 | "上传全部图片": "上傳全部圖片", 10 | 11 | //utils 12 | "自动上传下载": "自動上傳下載", 13 | "自动上传": "自動上傳", 14 | "自动下载": "自動下載", 15 | "下载文件不是允许的图片类型": "下載文件不是允許的圖片類型", 16 | "待上传图片不存在": "待上傳圖片不存在", 17 | "图片文件创建失败:": "圖片文件創建失敗:", 18 | "网络错误,请检查网络是否通畅": "網絡錯誤,請檢查網絡是否通暢", 19 | 20 | // setting 21 | "通用": "通用", 22 | "API 网关": "API 網關", 23 | "是否自动上传": "是否自動上傳", 24 | "如果关闭,您只能手动上传图片": "如果關閉,您只能手動上傳圖片", 25 | "是否自动下载": "是否自動下載", 26 | "如果关闭,您只能手动下载图片": "如果關閉,您只能手動下載圖片", 27 | "上传间隔时间": "上傳間隔時間", 28 | "单位为毫秒,默认设置1s": "單位為毫秒,默認設置1s", 29 | "关闭提示": "關閉提示", 30 | "关闭右上角结果提示": "關閉右上角結果提示", 31 | "下载": "下載", 32 | "下载域名排除": "下載域名排除", 33 | "在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符": "在排除名單內的圖片地址不會被下載,一行一個域名,支持 * 通配符", 34 | "上传": "上傳", 35 | "API 网关地址": "API 网关地址", 36 | "Image API Gateway 地址": "Image API Gateway 地址", 37 | "API 访问令牌": "API 訪問令牌", 38 | "用于访问API的令牌": "用於訪問API的令牌", 39 | "输入您的 API 访问令牌": "輸入您的 API 訪問令牌", 40 | "输入您的 Image API Gateway 地址": "輸入您的 Image API Gateway 地址", 41 | 42 | "接口配置信息已经粘贴到设置中!": "接口配置信息已經粘貼到設置中!", 43 | "网关服务选择": "网关服務選擇", 44 | "选择一个适合自己的网关服务": "選擇一個適合自己的网关服務", 45 | "方式": "方式", 46 | "说明": "說明", 47 | "自行搭建": "自行搭建", 48 | "速度好, 自由配置, 无隐私风险, 支持云存储和服务端存储": "速度好, 自由配置, 無隐私風險, 支持雲存儲和服務端存儲", 49 | "多用户开放网关": "多用户开放网关", 50 | "稳定性好, 仅支持用户的云存储": "稳定性好, 僅支持用戶的雲存儲", 51 | "粘贴多用户开放网关的接口配置": "粘貼多用户开放网关的接口配置", 52 | "未检测到配置信息!" : "未檢測到配置信息!", 53 | 54 | 55 | "项目地址": "項目地址", 56 | "是否上传后删除原图片": "是否上傳後刪除原圖片", 57 | "在图片上传后是否删除本地原图片": "在圖片上傳後是否刪除本地原圖片", 58 | "支持": "支持", 59 | "捐赠": "捐贈", 60 | "如果您喜欢这个插件,请考虑捐赠以支持继续开发。": "如果您喜歡這個插件,請考慮捐贈以支持繼續開發。", 61 | "复制 Debug 信息": "複製 Debug 信息", 62 | "将调试信息复制到剪贴板, 可能包含敏感信!": "將調試信息複製到剪貼板, 可能包含敏感信!", 63 | "通过快捷键打开控制台,你可以看到这个插件和其他插件的日志": "通過快捷鍵打開控制台,你可以看到這個插件和其他插件的日誌", 64 | 65 | "不处理": "不處理", 66 | "等比左上填充(裁剪)": "等比左上填充(裁剪)", 67 | "等比居中填充(裁剪)": "等比居中填充(裁剪)", 68 | "固定尺寸拉伸": "固定尺寸拉伸", 69 | "等比适应": "等比適應", 70 | "笔记正文图片": "筆記正文圖片", 71 | "笔记属性图片": "筆記屬性圖片", 72 | "设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置": "設置圖片壓縮模式, 0不限制, 最大值不會超過伺服器相關設置", 73 | "正文图片": "正文圖片", 74 | "宽度": "寬度", 75 | "高度": "高度", 76 | "调整压缩": "調整壓縮", 77 | "属性": "屬性", 78 | "添加属性图片上传": "添加屬性圖片上傳", 79 | "选择属性": "選擇屬性", 80 | 81 | 82 | "图片上传地址增加随机查询": "圖片上傳地址增加隨機查詢", 83 | "在图片地址末尾增加随机查询,用于规避CDN缓存": "在圖片地址末尾增加隨機查詢,用於規避CDN快取", 84 | "一键上传下载": "一鍵上傳下載", 85 | 86 | "上传速度优化": "上傳速度優化", 87 | "在图片上传前是否进行压缩": "在圖片上傳前是否進行壓縮", 88 | "上传速度优化 - 压缩质量": "上傳速度優化 - 壓縮質量", 89 | "压缩后的图片质量,范围0-1,默认0.8": "壓縮後的圖片質量,範圍0-1,預設0.8", 90 | "上传速度优化 - 最大宽度": "上傳速度優化 - 最大寬度", 91 | "压缩后的最大宽度,单位像素,默认1200": "壓縮後的最大寬度,單位像素,預設1200", 92 | "上传速度优化 - 最大高度": "上傳速度優化 - 最大高度", 93 | "压缩后的最大高度,单位像素,默认1200": "壓縮後的最大高度,單位像素,預設1200", 94 | }; 95 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { Menu, Plugin } from "obsidian" 2 | import { SettingTab, PluginSettings, DEFAULT_SETTINGS } from "./setting" 3 | import { imageDown, imageUpload, statusCheck, replaceInText, hasExcludeDomain, autoAddExcludeDomain, metadataCacheHandle, generateRandomString, showTaskNotice, showErrorNotice, getAttachmentUploadPath, setMenu } from "./utils" 4 | import { DownTask, UploadTask } from "./interface" 5 | import { $ } from "./lang" 6 | 7 | const mdImageRegex = /!\[([^\]]*)\][\(|\[](.*?)\s*("(?:.*[^"])")?\s*[\)|\]]|!\[\[([^\]]*)\]\]/g 8 | 9 | export default class CustomImageAutoUploader extends Plugin { 10 | settingTab: SettingTab 11 | settings: PluginSettings 12 | statusBar: HTMLElement[] = [] 13 | downloadStatus: { current: number; total: number } = { current: 0, total: 0 } 14 | uploadStatus: { current: number; total: number } = { current: 0, total: 0 } 15 | // 添加状态显示类型变量 16 | statusType: "download" | "upload" | "all" | "none" = "none" 17 | fromPluginSet = false 18 | 19 | /** 20 | * 重置任务状态并设置显示类型 21 | * @param type 显示类型:'download' | 'upload' | 'all' | 'none' 22 | * @param reset 是否重置计数,默认为 true 23 | */ 24 | resetStatus(type: "download" | "upload" | "all" | "none", reset: boolean = true): void { 25 | // 设置显示类型 26 | this.statusType = type 27 | 28 | // 重置计数 29 | if (reset) { 30 | this.downloadStatus = { current: 0, total: 0 } 31 | this.uploadStatus = { current: 0, total: 0 } 32 | } 33 | 34 | // 更新状态栏显示 35 | statusCheck(this) 36 | } 37 | 38 | async onload() { 39 | await this.loadSettings() 40 | 41 | statusCheck(this) 42 | 43 | this.settingTab = new SettingTab(this.app, this) 44 | // 注册设置选项 45 | this.addSettingTab(this.settingTab); 46 | 47 | // 注册编译器事件 48 | this.registerEvent( 49 | this.app.workspace.on("editor-change", async () => { 50 | if (!this.fromPluginSet) { 51 | this.resetStatus("all", true) 52 | await this.ContentImageAutoHandle() 53 | await this.MetadataImageAutoHandle() 54 | showTaskNotice(this, "all") 55 | } 56 | }) 57 | ) 58 | 59 | // 注册命令 60 | this.addCommand({ 61 | id: "down-all-images", 62 | name: $("下载全部图片"), 63 | callback: async () => { 64 | this.resetStatus("download", true) 65 | await this.ContentDownImage() 66 | await this.MetadataDownImage() 67 | showTaskNotice(this, "download") 68 | }, 69 | }) 70 | this.addCommand({ 71 | id: "upload-all-images", 72 | name: $("上传全部图片"), 73 | callback: async () => { 74 | this.resetStatus("upload", true) 75 | await this.ContentUploadImage() 76 | await this.MetadataUploadImage() 77 | showTaskNotice(this, "upload") 78 | }, 79 | }) 80 | 81 | // 注册菜单 82 | this.registerEvent( 83 | this.app.workspace.on("file-menu", (menu: Menu) => { 84 | setMenu(menu, this) 85 | }) 86 | ) 87 | this.registerEvent( 88 | this.app.workspace.on("editor-menu", (menu: Menu) => { 89 | setMenu(menu, this) 90 | }) 91 | ) 92 | 93 | this.addRibbonIcon("image", "Custom Image Auto Uploader / " + $("Custom Image Auto Uploader"), (event) => { 94 | const menu = new Menu() 95 | setMenu(menu, this, true) 96 | menu.showAtMouseEvent(event) 97 | }) 98 | } 99 | 100 | async ContentImageAutoHandle(isManual: boolean = false) { 101 | if (this.settings.isAutoDown || isManual) { 102 | await this.ContentDownImage() 103 | } 104 | if (this.settings.isAutoUpload || isManual) { 105 | await sleep(this.settings.afterUploadTimeout) 106 | await this.ContentUploadImage() 107 | } 108 | } 109 | 110 | async MetadataImageAutoHandle(isManual: boolean = false) { 111 | if (this.settings.isAutoDown || isManual) { 112 | await this.MetadataDownImage() 113 | } 114 | if (this.settings.isAutoUpload || isManual) { 115 | await sleep(this.settings.afterUploadTimeout) 116 | await this.MetadataUploadImage() 117 | } 118 | } 119 | 120 | async ContentDownImage() { 121 | if (!this.app.workspace.activeEditor || !this.app.workspace.activeEditor.editor) return 122 | 123 | let cursor = this.app.workspace.activeEditor.editor.getCursor() 124 | let fileFullContent = this.app.workspace.activeEditor.editor.getValue() || "" 125 | if (!fileFullContent) return 126 | 127 | let filePropertyContent = "" 128 | let filePropertyContentEndLine = 0 129 | let fileContent = "" 130 | const propertyMatch = fileFullContent.match(/^---\n((?:.|\n)*)---\n/gm) 131 | if (propertyMatch) { 132 | fileContent = fileFullContent.substring(propertyMatch[0].length) 133 | filePropertyContent = propertyMatch[0] 134 | 135 | const activeFile = this.app.workspace.getActiveFile() 136 | if (activeFile) { 137 | const cachedMetadata = this.app.metadataCache.getFileCache(activeFile) 138 | filePropertyContentEndLine = cachedMetadata?.frontmatterPosition?.end.line || 0 139 | } 140 | } else { 141 | fileContent = fileFullContent 142 | } 143 | 144 | // 第一次循环:收集任务并统计数量 145 | const downloadTasks: DownTask[] = [] 146 | 147 | const matches = fileContent.matchAll(mdImageRegex) 148 | for (const match of matches) { 149 | if (!/^http/.test(match[2]) || hasExcludeDomain(match[2], this.settings.excludeDomains)) { 150 | continue 151 | } 152 | 153 | let imageAlt = match[3] ? match[3] : match[1] ? match[1] : "" 154 | imageAlt = imageAlt.replaceAll('"', "") 155 | downloadTasks.push({ 156 | matchText: match[0], 157 | imageAlt, 158 | imageUrl: match[2], 159 | }) 160 | 161 | this.downloadStatus.total++ 162 | statusCheck(this) 163 | } 164 | 165 | // 第二次循环:批量异步处理任务 166 | let isModify = false 167 | const downloadResults = await Promise.all( 168 | downloadTasks.map(async (task) => { 169 | const result = await imageDown(task.imageUrl, this) 170 | return { task, result } 171 | }) 172 | ) 173 | // 处理下载结果 174 | for (const { task, result } of downloadResults) { 175 | if (result.err) { 176 | showErrorNotice(result.msg) 177 | } else if (result.path) { 178 | isModify = true 179 | this.downloadStatus.current++ 180 | statusCheck(this) 181 | fileContent = replaceInText(fileContent, task.matchText, task.imageAlt, result.path, task.imageUrl) 182 | } 183 | } 184 | 185 | if (isModify) { 186 | this.fromPluginSet = true 187 | 188 | this.app.workspace.activeEditor?.editor?.setValue(filePropertyContent + fileContent) 189 | await this.app.workspace.activeEditor?.editor?.setCursor({ line: cursor.line - filePropertyContentEndLine, ch: 0 }) 190 | 191 | this.fromPluginSet = false 192 | } 193 | } 194 | 195 | async ContentUploadImage() { 196 | if (!this.app.workspace.activeEditor || !this.app.workspace.activeEditor.editor) return 197 | 198 | let cursor = this.app.workspace.activeEditor.editor.getCursor() 199 | 200 | let fileFullContent = this.app.workspace.activeEditor.editor.getValue() || "" 201 | if (!fileFullContent) return 202 | 203 | let filePropertyContent = "" 204 | let fileContent = "" 205 | const propertyMatch = fileFullContent.match(/^---\n((?:.|\n)*)---\n/gm) 206 | if (propertyMatch) { 207 | fileContent = fileFullContent.substring(propertyMatch[0].length) 208 | filePropertyContent = propertyMatch[0] 209 | } else { 210 | fileContent = fileFullContent 211 | } 212 | 213 | const uploadTasks: UploadTask[] = [] 214 | const matches = fileContent.matchAll(mdImageRegex) 215 | for (const match of matches) { 216 | if (/^http/.test(match[2]) || /^http/.test(match[4])) { 217 | continue 218 | } 219 | 220 | const file = match[2] ? match[2] : match[4] 221 | let readfile = await getAttachmentUploadPath(file, this) 222 | if (!readfile) continue 223 | 224 | const imageAlt = match[3] ? match[3] : match[1] ? match[1] : file 225 | uploadTasks.push({ 226 | matchText: match[0], 227 | imageAlt, 228 | imageFile: readfile, 229 | }) 230 | this.uploadStatus.total++ 231 | statusCheck(this) 232 | } 233 | 234 | // 第二次循环:批量异步处理任务 235 | let isModify = false 236 | const uploadResults = await Promise.all( 237 | uploadTasks.map(async (task) => { 238 | const result = await imageUpload(task.imageFile, this.settings.contentSet, this) 239 | return { task, result } 240 | }) 241 | ) 242 | // 处理上传结果 243 | for (const { task, result } of uploadResults) { 244 | if (result.err) { 245 | showErrorNotice(result.msg) 246 | } else if (result.imageUrl) { 247 | isModify = true 248 | this.uploadStatus.current++ 249 | statusCheck(this) 250 | 251 | const searchStr = this.settings.uploadImageRandomSearch ? `?${generateRandomString(10)}` : "" 252 | fileContent = replaceInText(fileContent, task.matchText, task.imageAlt, result.imageUrl + searchStr) 253 | autoAddExcludeDomain(result.imageUrl, this) 254 | } 255 | } 256 | 257 | if (isModify) { 258 | this.fromPluginSet = true 259 | 260 | this.app.workspace.activeEditor?.editor?.setValue(filePropertyContent + fileContent) 261 | await this.app.workspace.activeEditor?.editor?.setCursor(cursor) 262 | 263 | this.fromPluginSet = false 264 | } 265 | } 266 | 267 | /** 268 | * 处理当前活动文件中的元数据图片下载任务 269 | * @param isWorkspace - 是否处理工作区中的所有文件,默认为 false 270 | */ 271 | async MetadataDownImage() { 272 | if (this.settings.propertyNeedSets.length === 0) { 273 | return 274 | } 275 | const activeFile = this.app.workspace.getActiveFile() 276 | if (!activeFile) return 277 | 278 | const cachedMetadata = this.app.metadataCache.getFileCache(activeFile) 279 | if (!cachedMetadata) return 280 | 281 | // 第一次循环:收集任务并统计数量 282 | const downloadTasks: DownTask[] = [] 283 | const metadata = metadataCacheHandle(cachedMetadata, this) 284 | for (const item of metadata) { 285 | for (const pic of item.value) { 286 | if (!/^http/.test(pic) || hasExcludeDomain(pic, this.settings.excludeDomains)) { 287 | continue 288 | } 289 | downloadTasks.push({ 290 | matchText: pic, 291 | imageAlt: "", 292 | imageUrl: pic, 293 | metadataItem: item, 294 | }) 295 | this.downloadStatus.total++ 296 | statusCheck(this) 297 | } 298 | } 299 | 300 | // 第二次循环:批量异步处理任务 301 | let isModify = false 302 | const downloadResults = await Promise.all( 303 | downloadTasks.map(async (task) => { 304 | const result = await imageDown(task.imageUrl, this) 305 | return { task, result } 306 | }) 307 | ) 308 | 309 | // 处理下载结果 310 | for (const { task, result } of downloadResults) { 311 | if (result.err) { 312 | showErrorNotice(result.msg) 313 | } else if (result.path && task.metadataItem) { 314 | isModify = true 315 | this.downloadStatus.current++ 316 | statusCheck(this) 317 | const index = task.metadataItem.value.indexOf(task.matchText) 318 | if (index !== -1) { 319 | task.metadataItem.value[index] = result.path 320 | } 321 | } 322 | } 323 | 324 | if (isModify) { 325 | this.fromPluginSet = true 326 | await this.app.fileManager.processFrontMatter(activeFile, (frontmatter) => { 327 | for (const item of metadata) { 328 | frontmatter[item.key] = item.type === "string" ? item.value[0] : item.value 329 | } 330 | }) 331 | setTimeout(() => { 332 | this.fromPluginSet = false 333 | }, 1000) 334 | } 335 | } 336 | 337 | async MetadataUploadImage() { 338 | if (this.settings.propertyNeedSets.length === 0) { 339 | return 340 | } 341 | const activeFile = this.app.workspace.getActiveFile() 342 | if (!activeFile) return 343 | 344 | const cachedMetadata = this.app.metadataCache.getFileCache(activeFile) 345 | if (!cachedMetadata) return 346 | 347 | // 第一次循环:收集任务并统计数量 348 | const uploadTasks: UploadTask[] = [] 349 | const metadata = metadataCacheHandle(cachedMetadata, this) 350 | for (const item of metadata) { 351 | for (const pic of item.value) { 352 | if (/^http/.test(pic)) { 353 | continue 354 | } 355 | let readfile = await getAttachmentUploadPath(pic, this) 356 | if (!readfile) continue 357 | 358 | if (!item.params) continue 359 | 360 | uploadTasks.push({ 361 | matchText: pic, 362 | imageAlt: "", 363 | imageFile: readfile, 364 | metadataItem: item, 365 | }) 366 | 367 | this.uploadStatus.total++ 368 | statusCheck(this) 369 | } 370 | } 371 | // 第二次循环:批量异步处理任务 372 | let isModify = false 373 | const uploadResults = await Promise.all( 374 | uploadTasks.map(async (task) => { 375 | const result = await imageUpload(task.imageFile, task.metadataItem?.params, this) 376 | return { task, result } 377 | }) 378 | ) 379 | 380 | // 处理上传结果 381 | for (const { task, result } of uploadResults) { 382 | if (result.err) { 383 | showErrorNotice(result.msg) 384 | } else if (result.imageUrl && task.metadataItem) { 385 | isModify = true 386 | this.uploadStatus.current++ 387 | statusCheck(this) 388 | const searchStr = this.settings.uploadImageRandomSearch ? `?${generateRandomString(10)}` : "" 389 | const index = task.metadataItem.value.indexOf(task.matchText) 390 | if (index !== -1) { 391 | task.metadataItem.value[index] = result.imageUrl + searchStr 392 | } 393 | } 394 | } 395 | 396 | if (isModify) { 397 | this.fromPluginSet = true 398 | await this.app.fileManager.processFrontMatter(activeFile, (frontmatter) => { 399 | for (const item of metadata) { 400 | frontmatter[item.key] = item.type === "string" ? item.value[0] : item.value 401 | } 402 | }) 403 | setTimeout(() => { 404 | this.fromPluginSet = false 405 | }, 1000) 406 | } 407 | } 408 | 409 | onunload() {} 410 | 411 | async loadSettings() { 412 | this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()) 413 | } 414 | 415 | async saveSettings(isStatusCheck: boolean = true) { 416 | await this.saveData(this.settings) 417 | if (isStatusCheck) { 418 | this.resetStatus("none") 419 | } 420 | } 421 | } 422 | -------------------------------------------------------------------------------- /src/res.ts: -------------------------------------------------------------------------------- 1 | 2 | export const KofiImage: string = 3 | "data:image/png;base64,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"; 4 | -------------------------------------------------------------------------------- /src/setting.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { App, PluginSettingTab, Notice, Setting, Platform } from "obsidian" 3 | import CustomImageAutoUploader from "./main" 4 | import { $ } from "./lang" 5 | import { KofiImage } from "./res" 6 | import { createRoot } from "react-dom/client" 7 | import { SettingsView, CompressionView } from "./views/settings-view" 8 | 9 | export const ImageSvrProcessMode = { 10 | // 不处理 11 | none: { label: $("不处理"), value: "none" }, 12 | // 默认裁剪 13 | fillTopleft: { label: $("等比左上填充(裁剪)"), value: "fill-topleft" }, 14 | // 居中裁剪 15 | fillCenter: { label: $("等比居中填充(裁剪)"), value: "fill-center" }, 16 | // 固定尺寸拉伸 17 | resize: { label: $("固定尺寸拉伸"), value: "resize" }, 18 | // 固定尺寸等比缩放不裁切 19 | fit: { label: $("等比适应"), value: "fit" }, 20 | } 21 | 22 | export interface UploadSet { 23 | [key: string]: string 24 | key: string 25 | //设置宽度 26 | width: string 27 | //设置高度 28 | height: string 29 | // PropertyUploadSetType 30 | type: string 31 | } 32 | 33 | export interface PluginSettings { 34 | //是否自动上传 35 | isAutoUpload: boolean 36 | isAutoDown: boolean 37 | isCloseNotice: boolean 38 | afterUploadTimeout: number 39 | //API地址 40 | api: string 41 | //API Token 42 | apiToken: string 43 | clipboardReadTip: string 44 | //处理排除的域名清单 45 | excludeDomains: string 46 | //// 是否处理剪贴板图片 47 | // isHandleClipboard: boolean; 48 | //本地图片上传后是否删除 49 | isDeleteSource: boolean 50 | //上传后的图片是否随机后缀 51 | uploadImageRandomSearch: boolean 52 | isCompress: boolean 53 | compressMaxWidth: number 54 | compressMaxHeight: number 55 | compressQuality: number 56 | //内容部分上传设置 57 | contentSet: UploadSet 58 | //元数据上传设置 59 | propertyNeedSets: Array 60 | // [propName: string]: any; 61 | } 62 | 63 | /** 64 | * 65 | 66 | ![这是图片](https://markdown.com.cn/assets/img/philly-magic-garden.9c0b4415.jpg) 67 | 68 | */ 69 | 70 | // 默认插件设置 71 | export const DEFAULT_SETTINGS: PluginSettings = { 72 | // 是否自动上传 73 | isAutoUpload: true, 74 | // 是否自动下载 75 | isAutoDown: true, 76 | // 是否关闭提示 77 | isCloseNotice: true, 78 | // 上传后的超时时间,单位为毫秒 79 | afterUploadTimeout: 1000, 80 | // API 网关地址 81 | api: "http://127.0.0.1:36677/upload", 82 | // API 令牌 83 | apiToken: "", 84 | clipboardReadTip:"", 85 | // 排除的域名列表 86 | excludeDomains: "", 87 | // 本地图片上传后是否删除 88 | isDeleteSource: true, 89 | // 上传后的图片是否随机后缀 90 | uploadImageRandomSearch: true, 91 | // 图片预压缩设置 92 | isCompress: true, 93 | compressMaxWidth: 1200, 94 | compressMaxHeight: 1200, 95 | compressQuality: 1, 96 | // 内容部分上传设置 97 | contentSet: { key: "", type: ImageSvrProcessMode.none.value, width: "0", height: "0" }, 98 | // 元数据上传设置 99 | propertyNeedSets: [ 100 | { key: "cover", type: ImageSvrProcessMode.none.value, width: "0", height: "0" }, 101 | { key: "images", type: ImageSvrProcessMode.none.value, width: "0", height: "0" }, 102 | ], 103 | } 104 | 105 | export class SettingTab extends PluginSettingTab { 106 | plugin: CustomImageAutoUploader 107 | 108 | constructor(app: App, plugin: CustomImageAutoUploader) { 109 | super(app, plugin) 110 | this.plugin = plugin 111 | } 112 | 113 | 114 | display(): void { 115 | const { containerEl: set } = this 116 | 117 | set.empty() 118 | 119 | new Setting(set) 120 | .setName("| " + $("通用")) 121 | .setHeading() 122 | .setClass("custom-image-auto-uploader-settings-tag") 123 | 124 | new Setting(set) 125 | .setName($("是否自动上传")) 126 | .setDesc($("如果关闭,您只能手动上传图片")) 127 | .addToggle((toggle) => 128 | toggle.setValue(this.plugin.settings.isAutoUpload).onChange(async (value) => { 129 | this.plugin.settings.isAutoUpload = value 130 | this.display() 131 | await this.plugin.saveSettings() 132 | }) 133 | ) 134 | 135 | new Setting(set) 136 | .setName($("是否自动下载")) 137 | .setDesc($("如果关闭,您只能手动下载图片")) 138 | .addToggle((toggle) => 139 | toggle.setValue(this.plugin.settings.isAutoDown).onChange(async (value) => { 140 | this.plugin.settings.isAutoDown = value 141 | this.display() 142 | await this.plugin.saveSettings() 143 | }) 144 | ) 145 | 146 | new Setting(set) 147 | .setName($("上传间隔时间")) 148 | .setDesc($("单位为毫秒,默认设置1s")) 149 | .addText((text) => 150 | text.setValue(this.plugin.settings.afterUploadTimeout.toString()).onChange(async (value) => { 151 | this.plugin.settings.afterUploadTimeout = Number(value) 152 | await this.plugin.saveSettings() 153 | }) 154 | ) 155 | 156 | new Setting(set) 157 | .setName($("关闭提示")) 158 | .setDesc($("关闭右上角结果提示")) 159 | .addToggle((toggle) => 160 | toggle.setValue(this.plugin.settings.isCloseNotice).onChange(async (value) => { 161 | this.plugin.settings.isCloseNotice = value 162 | this.display() 163 | await this.plugin.saveSettings() 164 | }) 165 | ) 166 | 167 | new Setting(set) 168 | .setName("| " + $("API 网关")) 169 | .setHeading() 170 | .setClass("custom-image-auto-uploader-settings-tag") 171 | 172 | const root2 = document.createElement("div") 173 | root2.className = "custom-image-auto-uploader-settings" 174 | set.appendChild(root2) 175 | 176 | const reactRoot2 = createRoot(root2) 177 | reactRoot2.render() 178 | 179 | const api = new Setting(set) 180 | .setName($("API 网关地址")) 181 | .setDesc($("Image API Gateway 地址")) 182 | .addText((text) => 183 | text 184 | .setPlaceholder($("输入您的 Image API Gateway 地址")) 185 | .setValue(this.plugin.settings.api) 186 | .onChange(async (value) => { 187 | this.plugin.settings.api = value 188 | await this.plugin.saveSettings() 189 | }) 190 | ) 191 | 192 | const apiToken = new Setting(set) 193 | .setName($("API 访问令牌")) 194 | .setDesc($("用于访问API的令牌")) 195 | .addText((text) => 196 | text 197 | .setPlaceholder($("输入您的 API 访问令牌")) 198 | .setValue(this.plugin.settings.apiToken) 199 | .onChange(async (value) => { 200 | this.plugin.settings.apiToken = value 201 | await this.plugin.saveSettings() 202 | }) 203 | ) 204 | 205 | new Setting(set) 206 | .setName("| " + $("下载")) 207 | .setHeading() 208 | .setClass("custom-image-auto-uploader-settings-tag") 209 | 210 | new Setting(set) 211 | .setName($("下载域名排除")) 212 | .setDesc($("在排除名单内的图片地址不会被下载,一行一个域名,支持 * 通配符")) 213 | .addTextArea((text) => 214 | text 215 | .setPlaceholder($("Enter your secret")) 216 | .setValue(this.plugin.settings.excludeDomains) 217 | .onChange(async (value) => { 218 | this.plugin.settings.excludeDomains = value 219 | await this.plugin.saveSettings() 220 | }) 221 | ) 222 | new Setting(set) 223 | .setName("| " + $("上传")) 224 | .setHeading() 225 | .setClass("custom-image-auto-uploader-settings-tag") 226 | 227 | new Setting(set) 228 | .setName($("上传速度优化")) 229 | .setDesc($("在图片上传前是否进行压缩")) 230 | .addToggle((toggle) => 231 | toggle.setValue(this.plugin.settings.isCompress).onChange(async (value) => { 232 | this.plugin.settings.isCompress = value 233 | this.display() 234 | await this.plugin.saveSettings() 235 | }) 236 | ) 237 | 238 | if (this.plugin.settings.isCompress) { 239 | new Setting(set) 240 | .setName($("上传速度优化 - 压缩质量")) 241 | .setDesc($("压缩后的图片质量,范围0-1,默认0.8")) 242 | .addText((text) => 243 | text.setValue(this.plugin.settings.compressQuality.toString()).onChange(async (value) => { 244 | this.plugin.settings.compressQuality = Number(value) 245 | await this.plugin.saveSettings() 246 | }) 247 | ) 248 | 249 | new Setting(set) 250 | .setName($("上传速度优化 - 最大宽度")) 251 | .setDesc($("压缩后的最大宽度,单位像素,默认1200")) 252 | .addText((text) => 253 | text.setValue(this.plugin.settings.compressMaxWidth.toString()).onChange(async (value) => { 254 | this.plugin.settings.compressMaxWidth = Number(value) 255 | await this.plugin.saveSettings() 256 | }) 257 | ) 258 | 259 | new Setting(set) 260 | .setName($("上传速度优化 - 最大高度")) 261 | .setDesc($("压缩后的最大高度,单位像素,默认1200")) 262 | .addText((text) => 263 | text.setValue(this.plugin.settings.compressMaxHeight.toString()).onChange(async (value) => { 264 | this.plugin.settings.compressMaxHeight = Number(value) 265 | await this.plugin.saveSettings() 266 | }) 267 | ) 268 | } 269 | 270 | new Setting(set) 271 | .setName($("是否上传后删除原图片")) 272 | .setDesc($("在图片上传后是否删除本地原图片")) 273 | .addToggle((toggle) => 274 | toggle.setValue(this.plugin.settings.isDeleteSource).onChange(async (value) => { 275 | this.plugin.settings.isDeleteSource = value 276 | this.display() 277 | await this.plugin.saveSettings() 278 | }) 279 | ) 280 | 281 | new Setting(set) 282 | .setName($("图片上传地址增加随机查询")) 283 | .setDesc($("在图片地址末尾增加随机查询,用于规避CDN缓存") + " eg: https://domain.com/upload-image.png?Bh7OP5YGJ0") 284 | .addToggle((toggle) => 285 | toggle.setValue(this.plugin.settings.uploadImageRandomSearch).onChange(async (value) => { 286 | this.plugin.settings.uploadImageRandomSearch = value 287 | this.display() 288 | await this.plugin.saveSettings() 289 | }) 290 | ) 291 | const root = document.createElement("div") 292 | root.className = "custom-image-auto-uploader-settings" 293 | set.appendChild(root) 294 | 295 | const reactRoot = createRoot(root) 296 | reactRoot.render() 297 | 298 | new Setting(set) 299 | .setName("| " + $("支持")) 300 | .setHeading() 301 | .setClass("custom-image-auto-uploader-settings-tag") 302 | let y = new Setting(set) 303 | .setName($("捐赠")) 304 | .setDesc($("如果您喜欢这个插件,请考虑捐赠以支持继续开发。")) 305 | .settingEl.createEl("a", { href: "https://ko-fi.com/haierkeys" }) 306 | .createEl("img", { 307 | attr: { src: KofiImage, height: "36", border: "0", alt: "Buy Me a Coffee at ko-fi.com", style: "height:36px!important;border:0px!important;" }, 308 | }) 309 | 310 | const debugDiv = set.createDiv() 311 | debugDiv.setAttr("align", "center") 312 | debugDiv.setAttr("style", "margin: var(--size-4-2)") 313 | 314 | const debugButton = debugDiv.createEl("button") 315 | debugButton.setText($("复制 Debug 信息")) 316 | debugButton.onclick = async () => { 317 | await window.navigator.clipboard.writeText( 318 | JSON.stringify( 319 | { 320 | settings: this.plugin.settings, 321 | pluginVersion: this.plugin.manifest.version, 322 | }, 323 | null, 324 | 4 325 | ) 326 | ) 327 | new Notice($("将调试信息复制到剪贴板, 可能包含敏感信!")) 328 | } 329 | 330 | if (Platform.isDesktopApp) { 331 | const info = set.createDiv() 332 | info.setAttr("align", "center") 333 | info.setText($("通过快捷键打开控制台,你可以看到这个插件和其他插件的日志")) 334 | 335 | const keys = set.createDiv() 336 | keys.setAttr("align", "center") 337 | keys.addClass("custom-shortcuts") 338 | if (Platform.isMacOS === true) { 339 | keys.createEl("kbd", { text: "CMD (⌘) + OPTION (⌥) + I" }) 340 | } else { 341 | keys.createEl("kbd", { text: "CTRL + SHIFT + I" }) 342 | } 343 | } 344 | } 345 | 346 | } 347 | -------------------------------------------------------------------------------- /src/styles.scss: -------------------------------------------------------------------------------- 1 | .custom-image-auto-uploader-settings-tag{ 2 | font-color: red; 3 | 4 | } 5 | 6 | .custom-image-auto-uploader-settings { 7 | padding: 0.75em 0; 8 | border-top: 1px solid var(--background-modifier-border); 9 | } 10 | 11 | .custom-image-auto-uploader-settings-table { 12 | width: 100%; 13 | margin-bottom: 20px; 14 | border: 0 !important; 15 | background-color: var(--background-secondary); 16 | 17 | th, td { 18 | border: 0 !important; 19 | } 20 | 21 | th { 22 | text-align: left; 23 | padding: 8px 10px; 24 | font-size: var(--font-ui-smaller); 25 | } 26 | 27 | .no-columns-added { 28 | padding: 15px; 29 | text-align: center; 30 | background-color: var(--background-secondary); 31 | 32 | p { 33 | margin: 4px; 34 | font-size: 10px; 35 | } 36 | } 37 | 38 | thead { 39 | border-bottom: 1px solid var(--color-base-40) !important; 40 | } 41 | 42 | tbody { 43 | tr { 44 | background-color: var(--background-secondary); 45 | 46 | &:nth-child(odd) { 47 | background-color: var(--background-secondary-alt); 48 | } 49 | } 50 | 51 | td { 52 | padding: 4px 8px; 53 | font-size: var(--font-ui-small); 54 | } 55 | } 56 | 57 | 58 | tfoot td { 59 | padding: 8px 10px; 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import { requestUrl, TFile, Vault, Notice, Menu, MenuItem, setIcon, CachedMetadata } from "obsidian" 2 | import { fileTypeFromBuffer, FileTypeResult } from "file-type" 3 | import CustomImageAutoUploader from "./main" 4 | import { $ } from "./lang" 5 | import { UploadSet } from "./setting" 6 | import { Metadata } from "./interface" 7 | 8 | export const IMAGE_MIME_TYPES: Record = { 9 | "image/bmp": ["bmp"], 10 | "image/avif": ["avif"], 11 | "image/gif": ["gif"], 12 | "image/jpeg": ["jpg", "jpeg"], 13 | "image/png": ["png"], 14 | "image/webp": ["webp"], 15 | } 16 | export const IMAGE_EXTENSIONS = Object.values(IMAGE_MIME_TYPES).flat() 17 | 18 | export interface ImageDownResult { 19 | err: boolean 20 | msg: string 21 | path?: string 22 | type?: FileTypeResult 23 | } 24 | 25 | export interface ImageUploadResult { 26 | err: boolean 27 | msg: string 28 | imageUrl?: string 29 | apiError?: string 30 | } 31 | 32 | /** 33 | * 从URL中提取文件名 34 | * @param url - 文件的URL 35 | * @param hasExt - 是否包含扩展名 36 | * @returns 提取的文件名 37 | */ 38 | export function getUrlFileName(url: string, hasExt: Boolean = true): string { 39 | let pathname = new URL(url).pathname 40 | let fileName = pathname.substring(pathname.lastIndexOf("/") + 1) 41 | fileName = fileName.substring(0, fileName.lastIndexOf(".")) 42 | return decodeURI(fileName).replaceAll(/[\\\\/:*?\"<>|]/g, "-") 43 | } 44 | 45 | /** 46 | * 从给定的路径中提取目录名 47 | * @param path - 包含文件名的路径 48 | * @returns 路径中的目录名部分 49 | */ 50 | export function getDirname(path: string): string { 51 | let folderList = path.split("/") 52 | folderList.pop() 53 | return folderList.join("/") 54 | } 55 | 56 | /** 57 | * 生成指定长度的随机字符串 58 | * @param length - 随机字符串的长度 59 | * @returns 生成的随机字符串 60 | */ 61 | export function generateRandomString(length: number): string { 62 | // 定义包含所有可能字符的字符串 63 | const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" 64 | let result = "" 65 | // 循环生成随机字符串 66 | for (let i = 0; i < length; i++) { 67 | // 生成一个随机索引 68 | const randomIndex = Math.floor(Math.random() * characters.length) 69 | // 将随机索引对应的字符添加到结果字符串中 70 | result += characters[randomIndex] 71 | } 72 | // 返回生成的随机字符串 73 | return result 74 | } 75 | 76 | /** 77 | * 生成文件的随机保存键 78 | * @returns 生成的随机保存键 79 | */ 80 | const nameSet = new Set() 81 | export function getFileRandomSaveKey(): string { 82 | let name = (Math.random() + 1).toString(36).substr(2, 5) 83 | if (nameSet.has(name)) { 84 | name = `${name}-${(Math.random() + 1).toString(36).substr(2, 5)}` 85 | } 86 | nameSet.add(name) 87 | return name 88 | } 89 | 90 | /** 91 | * 检查并创建文件夹 92 | * @param path - 文件夹路径 93 | * @param vault - Vault实例 94 | */ 95 | export async function checkCreateFolder(path: string, vault: Vault) { 96 | if (path != "" && !vault.getFolderByPath(path)) { 97 | vault.createFolder(path) 98 | } 99 | } 100 | 101 | /** 102 | * 获取附件保存路径 103 | * @param file - 文件名 104 | * @param plugin - 插件实例 105 | * @returns 附件保存路径 106 | */ 107 | export async function getAttachmentSavePath(file: string, plugin: CustomImageAutoUploader): Promise { 108 | return await plugin.app.fileManager.getAvailablePathForAttachment(file) 109 | } 110 | 111 | /** 112 | * 获取附件上传路径 113 | * @param image - 图片名 114 | * @param plugin - 插件实例 115 | * @returns 附件上传路径 116 | */ 117 | export async function getAttachmentUploadPath(image: string, plugin: CustomImageAutoUploader): Promise { 118 | return plugin.app.metadataCache.getFirstLinkpathDest(image, image) 119 | } 120 | 121 | /** 122 | * 替换文本中的内容 123 | * @param content - 原始内容 124 | * @param search - 要替换的内容 125 | * @param desc - 描述 126 | * @param path - 路径 127 | * @param url - URL(可选) 128 | * @returns 替换后的内容 129 | */ 130 | export function replaceInText(content: string, search: string, desc: string, path: string, url?: string): string { 131 | let newLink = "" 132 | 133 | if (url) { 134 | newLink = `![${desc}](${path})` 135 | } else { 136 | newLink = `![${desc}](${path})` 137 | } 138 | 139 | return content.split(search).join(newLink) 140 | } 141 | 142 | /** 143 | * 检查是否包含排除的域名 144 | * @param src - 源URL 145 | * @param excludeDomains - 排除的域名列表 146 | * @returns 是否包含排除的域名 147 | */ 148 | export function hasExcludeDomain(src: string, excludeDomains: string): boolean { 149 | if (excludeDomains.trim() === "" || !/^http/.test(src)) { 150 | return false 151 | } 152 | 153 | let url = new URL(src) 154 | let has = false 155 | 156 | const domain = url.hostname 157 | 158 | const excludeDomainList = excludeDomains.split("\n").filter((item) => item !== "") 159 | 160 | excludeDomainList.forEach(function (item) { 161 | item = item.replace(/\./g, "\\.") //将.替换为\.,因为.在正则表达式中有特殊含义 162 | item = item.replace("*", ".*") 163 | 164 | let patt = new RegExp("^" + item, "i") //正则表达式 165 | let res = patt.exec(domain) //执行匹配,并获取到匹配结果 166 | 167 | if (res != null) { 168 | has = true 169 | return 170 | } 171 | }) 172 | return has 173 | } 174 | 175 | /** 176 | * 自动添加排除的域名 177 | * @param src - 源URL 178 | * @param plugin - 插件实例 179 | */ 180 | export function autoAddExcludeDomain(src: string, plugin: CustomImageAutoUploader): void { 181 | let url = new URL(src) 182 | const domain = url.hostname 183 | let has = hasExcludeDomain(src, plugin.settings.excludeDomains) 184 | 185 | if (!has) { 186 | plugin.settings.excludeDomains += `\n${domain}` 187 | plugin.settings.excludeDomains = plugin.settings.excludeDomains.trim() 188 | } 189 | plugin.saveSettings(false) 190 | } 191 | 192 | /** 193 | * 下载图片 194 | * @param url - 图片URL 195 | * @param plugin - 插件实例 196 | * @returns 下载结果 197 | */ 198 | export async function imageDown(url: string, plugin: CustomImageAutoUploader): Promise { 199 | const response = await requestUrl({ url }) 200 | 201 | if (response.status !== 200) { 202 | return { err: false, msg: $("网络错误,请检查网络是否通畅") } 203 | } 204 | 205 | let type = await fileTypeFromBuffer(response.arrayBuffer) 206 | 207 | if (!IMAGE_EXTENSIONS.includes(type.ext) && type) { 208 | return { err: true, msg: $("下载文件不是允许的图片类型") } 209 | } 210 | 211 | let urlObj = new URL(url) 212 | 213 | try { 214 | const name = getUrlFileName(url, false) != "" ? getUrlFileName(url, false) : getFileRandomSaveKey() 215 | const path = `${name}.${type.ext}` 216 | const userPath = await getAttachmentSavePath(path, plugin) 217 | checkCreateFolder(getDirname(userPath), this.app.vault) 218 | 219 | await plugin.app.vault.createBinary(userPath, response.arrayBuffer) 220 | 221 | return { err: false, msg: "", path: path, type } 222 | } catch (err) { 223 | return { err: true, msg: $("图片文件创建失败:") + err.message } 224 | } 225 | } 226 | 227 | /** 228 | * 上传图片 229 | * @param path - 图片路径 230 | * @param postdata - 上传数据 231 | * @param plugin - 插件实例 232 | * @returns 上传结果 233 | */ 234 | export async function imageUpload(file: TFile, postData: UploadSet | undefined, plugin: CustomImageAutoUploader): Promise { 235 | if (!IMAGE_EXTENSIONS.includes(file.extension)) { 236 | return { err: true, msg: $("上传文件不是允许的图片类型") } 237 | } 238 | 239 | let body = await plugin.app.vault.readBinary(file) 240 | 241 | if (!postData) return { err: true, msg: $("扩展参数为空") } 242 | 243 | let compressedBody = body 244 | 245 | if (plugin.settings.isCompress) { 246 | try { 247 | const img = new Image() 248 | const canvas = document.createElement("canvas") 249 | const ctx = canvas.getContext("2d") 250 | 251 | // 创建临时URL以加载图片 252 | const blob = new Blob([body], { type: `image/${file.extension}` }) 253 | const url = URL.createObjectURL(blob) 254 | 255 | await new Promise((resolve, reject) => { 256 | img.onload = () => { 257 | // 设置压缩后的尺寸,保持宽高比 258 | const maxWidth = plugin.settings.compressMaxWidth 259 | const maxHeight = plugin.settings.compressMaxHeight 260 | let width = img.width 261 | let height = img.height 262 | 263 | if (width > maxWidth) { 264 | height = Math.round((height * maxWidth) / width) 265 | width = maxWidth 266 | } 267 | if (height > maxHeight) { 268 | width = Math.round((width * maxHeight) / height) 269 | height = maxHeight 270 | } 271 | 272 | canvas.width = width 273 | canvas.height = height 274 | 275 | // 绘制并压缩 276 | ctx?.drawImage(img, 0, 0, width, height) 277 | 278 | // 转换为二进制 279 | canvas.toBlob( 280 | (blob) => { 281 | if (blob) { 282 | blob.arrayBuffer().then((buffer) => { 283 | compressedBody = buffer 284 | resolve(null) 285 | }) 286 | } 287 | }, 288 | `image/${file.extension}`, 289 | plugin.settings.compressQuality 290 | ) 291 | } 292 | img.src = url 293 | }) 294 | 295 | URL.revokeObjectURL(url) 296 | } catch (error) { 297 | return { err: true, msg: $("图片压缩失败:")+error.message } 298 | } 299 | } 300 | 301 | let requestData = new FormData() 302 | requestData.append("imagefile", new Blob([compressedBody], { type: `image/${file.extension}` }), file.name) 303 | 304 | Object.keys(postData).forEach((v, i, p) => { 305 | requestData.append(v, postData[v]) 306 | }) 307 | 308 | let response 309 | try { 310 | response = await fetch(plugin.settings.api, { method: "POST", headers: plugin.settings.apiToken == "" ? new Headers() : new Headers({ Authorization: plugin.settings.apiToken }), body: requestData }) 311 | } catch (error) { 312 | return { err: true, msg: $("网络错误,请检查网络是否通畅") } 313 | } 314 | 315 | if (response && !response.ok) { 316 | let result = await response.text() 317 | return { err: true, msg: $("网络错误,请检查网络是否通畅") } 318 | } 319 | 320 | let result = await response.json() 321 | 322 | if (result && !result.status) { 323 | return { err: true, msg: "API Error:" + result.message + result.details.join(""), apiError: result.details.join("") } 324 | } else { 325 | if (plugin.settings.isDeleteSource && file instanceof TFile) { 326 | plugin.app.fileManager.trashFile(file) 327 | } 328 | 329 | return { err: false, msg: result.message, imageUrl: result.data.imageUrl } 330 | } 331 | } 332 | 333 | /** 334 | * 处理文件的元数据缓存 335 | * @param activeFile - 当前活动文件 336 | * @param plugin - 插件实例 337 | * @returns 处理后的元数据数组 338 | */ 339 | export function metadataCacheHandle(cache: CachedMetadata, plugin: CustomImageAutoUploader): Metadata[] { 340 | let metadataNeedKeys = Array() 341 | 342 | plugin.settings.propertyNeedSets.forEach((item, i) => { 343 | metadataNeedKeys[i] = item.key 344 | }) 345 | 346 | let handleMetadata: Metadata[] = [] 347 | 348 | if (cache?.frontmatter) { 349 | Object.keys(cache.frontmatter).forEach((key) => { 350 | if (cache?.frontmatter && metadataNeedKeys.includes(key)) { 351 | let i: number = metadataNeedKeys.indexOf(key) 352 | if (typeof cache.frontmatter[key] == "string") { 353 | const match = cache.frontmatter[key].match(/^\!\[\[(.*)\]\]$/) 354 | if (match) { 355 | cache.frontmatter[key] = match[1] 356 | } 357 | handleMetadata.push({ key: key, type: "string", value: [cache.frontmatter[key]], params: plugin.settings.propertyNeedSets[i] }) 358 | } else if (Array.isArray(cache.frontmatter[key])) { 359 | let pics = [] 360 | for (let index = 0; index < cache.frontmatter[key].length; index++) { 361 | pics.push(cache.frontmatter[key][index]) 362 | } 363 | handleMetadata.push({ key: key, type: "array", value: pics, params: plugin.settings.propertyNeedSets[i] }) 364 | } 365 | } 366 | }) 367 | } 368 | 369 | return handleMetadata 370 | } 371 | 372 | /** 373 | * 显示任务结果通知 374 | * @param plugin 插件实例 375 | * @param type 任务类型:'download' | 'upload' | 'all' 376 | * @param isMetadata 是否为元数据任务 377 | */ 378 | export function showTaskNotice(plugin: CustomImageAutoUploader, type: "download" | "upload" | "all"): void { 379 | if (plugin.settings.isCloseNotice) return 380 | let message = "" 381 | if (type === "all") { 382 | // 显示下载和上传的所有信息 383 | if (plugin.downloadStatus.total > 0) { 384 | message += `${$("下载")}:\n` 385 | message += `succeed: ${plugin.downloadStatus.current} \n` 386 | message += `failed: ${plugin.downloadStatus.total - plugin.downloadStatus.current}\n\n` 387 | } 388 | if (plugin.uploadStatus.total > 0) { 389 | message += `${$("上传")}:\n` 390 | message += `succeed: ${plugin.uploadStatus.current} \n` 391 | message += `failed: ${plugin.uploadStatus.total - plugin.uploadStatus.current}` 392 | } 393 | } else { 394 | // 显示单个任务的信息 395 | const status = type === "download" ? plugin.downloadStatus : plugin.uploadStatus 396 | const typeText = type === "download" ? $("下载") : $("上传") 397 | message = `${typeText}:\nsucceed: ${status.current} \nfailed: ${status.total - status.current}` 398 | } 399 | if (message != "" && !plugin.settings.isCloseNotice) { 400 | new Notice(message) 401 | } 402 | } 403 | 404 | /** 405 | * 显示错误通知 406 | * @param message 错误信息 407 | */ 408 | export function showErrorNotice(message: string): void { 409 | new Notice(message) 410 | } 411 | 412 | /** 413 | * 检查插件状态 414 | * @param plugin - 插件实例 415 | */ 416 | export function statusCheck(plugin: CustomImageAutoUploader): void { 417 | if (plugin.statusBar.length == 0) { 418 | plugin.statusBar[0] = plugin.addStatusBarItem() 419 | plugin.statusBar[1] = plugin.addStatusBarItem() 420 | plugin.statusBar[2] = plugin.addStatusBarItem() 421 | } 422 | setIcon(plugin.statusBar[0], "image") 423 | plugin.statusBar[0].setAttrs({ title: "Custom Image Auto Uploader / " + $("Custom Image Auto Uploader") }) 424 | 425 | setIcon(plugin.statusBar[1], "none") 426 | if (plugin.settings.isAutoUpload && plugin.settings.isAutoDown) { 427 | setIcon(plugin.statusBar[1], "arrow-down-up") 428 | plugin.statusBar[1].setAttrs({ title: $("自动上传下载") + ":" + $("已开启") }) 429 | } else { 430 | if (plugin.settings.isAutoUpload) { 431 | setIcon(plugin.statusBar[1], "circle-arrow-up") 432 | plugin.statusBar[1].setAttrs({ title: $("自动上传") + ":" + $("已开启") + " / " + $("自动下载") + ":" + $("已关闭") }) 433 | } 434 | if (plugin.settings.isAutoDown) { 435 | setIcon(plugin.statusBar[1], "circle-arrow-down") 436 | plugin.statusBar[1].setAttrs({ title: $("自动下载") + ":" + $("已开启") + " / " + $("自动上传") + ":" + $("已关闭") }) 437 | } 438 | } 439 | 440 | let title = "" 441 | 442 | // 根据全局状态类型显示进度 443 | if (plugin.statusType !== "none") { 444 | if (plugin.statusType === "download" && plugin.downloadStatus.total > 0) { 445 | title += $("下载") + `: ${plugin.downloadStatus.current}/${plugin.downloadStatus.total}` 446 | } else if (plugin.statusType === "upload" && plugin.uploadStatus.total > 0) { 447 | title += $("上传") + `: ${plugin.uploadStatus.current}/${plugin.uploadStatus.total}` 448 | } else if (plugin.statusType === "all") { 449 | if (plugin.downloadStatus.total > 0 || plugin.uploadStatus.total > 0) { 450 | if (plugin.downloadStatus.total > 0) { 451 | title += $("下载") + `: ${plugin.downloadStatus.current}/${plugin.downloadStatus.total}` 452 | } 453 | if (plugin.uploadStatus.total > 0) { 454 | if (plugin.downloadStatus.total > 0) title += " " 455 | title += $("上传") + `: ${plugin.uploadStatus.current}/${plugin.uploadStatus.total}` 456 | } 457 | } 458 | } 459 | } 460 | 461 | plugin.statusBar[2].setText(title) 462 | } 463 | 464 | export function setMenu(menu: Menu, plugin: CustomImageAutoUploader, isShowAuto: boolean = false) { 465 | if (isShowAuto) { 466 | menu.addItem((item: MenuItem) => { 467 | item 468 | .setIcon("arrow-down-up") 469 | .setTitle($("一键上传下载")) 470 | .onClick(async () => { 471 | plugin.resetStatus("all", true) 472 | await plugin.ContentImageAutoHandle(true) 473 | await plugin.MetadataImageAutoHandle(true) 474 | showTaskNotice(plugin, "all") 475 | statusCheck(plugin) 476 | }) 477 | }) 478 | } 479 | 480 | menu.addItem((item: MenuItem) => { 481 | item 482 | .setIcon("image-down") 483 | .setTitle($("下载全部图片")) 484 | .onClick(async () => { 485 | plugin.resetStatus("download", true) 486 | await plugin.ContentDownImage() 487 | 488 | await plugin.MetadataDownImage() 489 | showTaskNotice(plugin, "download") 490 | statusCheck(plugin) 491 | }) 492 | }) 493 | menu.addItem((item: MenuItem) => { 494 | item 495 | .setIcon("image-up") 496 | .setTitle($("上传全部图片")) 497 | .onClick(async () => { 498 | plugin.resetStatus("upload", true) 499 | await plugin.ContentUploadImage() 500 | await plugin.MetadataUploadImage() 501 | showTaskNotice(plugin, "upload") 502 | statusCheck(plugin) 503 | }) 504 | }) 505 | } 506 | -------------------------------------------------------------------------------- /src/views/settings-view.tsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react" 2 | import { ICON_TYPE, Icon } from "src/icon" 3 | import CustomImageAutoUploader from "src/main" 4 | import { UploadSet, ImageSvrProcessMode } from "src/setting" 5 | import { $ } from "src/lang" 6 | 7 | async function getClipboardContent(plugin: CustomImageAutoUploader): Promise { 8 | const clipboardReadTipSave = async (api: string, apiToken: string, clipboardReadTip: string) => { 9 | plugin.settings.api = api 10 | plugin.settings.apiToken = apiToken 11 | plugin.settings.clipboardReadTip = clipboardReadTip 12 | 13 | await plugin.saveData(plugin.settings) 14 | plugin.settingTab.display() 15 | 16 | setTimeout(() => { 17 | plugin.settings.clipboardReadTip = "" 18 | plugin.saveData(plugin.settings) 19 | }, 2000) 20 | } 21 | 22 | // 23 | const clipboardReadTipTipSave = async (clipboardReadTip: string) => { 24 | plugin.settings.clipboardReadTip = clipboardReadTip 25 | 26 | await plugin.saveData(plugin.settings) 27 | plugin.settingTab.display() 28 | 29 | setTimeout(() => { 30 | plugin.settings.clipboardReadTip = "" 31 | plugin.saveData(plugin.settings) 32 | }, 2000) 33 | } 34 | 35 | try { 36 | // 检查浏览器是否支持 Clipboard API 37 | if (!navigator.clipboard) { 38 | return 39 | } 40 | 41 | // 获取剪贴板文本内容 42 | const text = await navigator.clipboard.readText() 43 | 44 | // 检查是否为 JSON 格式 45 | let parsedData: any 46 | try { 47 | parsedData = JSON.parse(text) 48 | 49 | // 检查是否为对象且包含 api 和 apiToken 50 | if (typeof parsedData === "object" && parsedData !== null) { 51 | const hasApi = "api" in parsedData 52 | const hasApiToken = "apiToken" in parsedData 53 | 54 | if (hasApi && hasApiToken) { 55 | clipboardReadTipSave(parsedData.api, parsedData.apiToken, $("接口配置信息已经粘贴到设置中!")) 56 | } else { 57 | clipboardReadTipTipSave($("未检测到配置信息!")) 58 | } 59 | } else { 60 | clipboardReadTipTipSave($("未检测到配置信息!")) 61 | } 62 | } catch (jsonErr) { 63 | clipboardReadTipTipSave($("未检测到配置信息!")) 64 | return 65 | } 66 | return 67 | } catch (err) { 68 | clipboardReadTipTipSave($("未检测到配置信息!")) 69 | return 70 | } 71 | } 72 | 73 | export const SettingsView = ({ plugin }: { plugin: CustomImageAutoUploader }) => { 74 | return ( 75 | <> 76 |
77 |
78 |
{$("网关服务选择")}
79 |
{$("选择一个适合自己的网关服务")}
80 |
81 |
82 |
83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 97 | 98 | 99 | 100 | 101 | 104 | 105 | 106 | 107 |
{$("方式")}{$("说明")}
{$("自行搭建")} 95 | https://github.com/haierkeys/image-api-gateway 96 | {$("速度好, 自由配置, 无隐私风险, 支持云存储和服务端存储")}
{$("多用户开放网关")} 102 | https://img.diybeta.com 103 | {$("稳定性好, 仅支持用户的云存储")}
108 |
109 |
110 | 113 |
{plugin.settings.clipboardReadTip}
114 |
115 | 116 | ) 117 | } 118 | 119 | export const CompressionView = ({ plugin }: { plugin: CustomImageAutoUploader }) => { 120 | const frontMatterPropertiesSet = new Set() 121 | plugin.app.vault.getMarkdownFiles().forEach((file) => { 122 | const cache = plugin.app.metadataCache.getFileCache(file) 123 | if (cache?.frontmatter) { 124 | Object.keys(cache.frontmatter).forEach((key) => frontMatterPropertiesSet.add(key)) 125 | } 126 | }) 127 | 128 | // Convert to array and sort 129 | const frontMatterProperties: string[] = Array.from(frontMatterPropertiesSet) 130 | frontMatterProperties.sort((a, b) => a.localeCompare(b)) 131 | 132 | return ( 133 | <> 134 |
135 |
136 |
{$("笔记正文图片")}
137 |
{$("设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置")}
138 |
139 |
140 | 141 |
142 |
143 |
{$("笔记属性图片")}
144 |
{$("设置图片压缩模式, 0不限制, 最大值不会超过服务端相关设置")}
145 |
146 |
147 | 148 | 149 | ) 150 | } 151 | 152 | export const ContentSet = ({ plugin }: { plugin: CustomImageAutoUploader }) => { 153 | const [contentSet, setContentSet] = useState(plugin.settings.contentSet) 154 | 155 | useEffect(() => { 156 | save() 157 | }, [contentSet]) 158 | 159 | const setWidth = (value: string) => { 160 | setContentSet({ key: "", type: contentSet.type, width: value, height: contentSet.height }) 161 | } 162 | 163 | const setHeight = (value: string) => { 164 | setContentSet({ key: "", type: contentSet.type, width: contentSet.width, height: value }) 165 | } 166 | 167 | const setType = (value: string) => { 168 | setContentSet({ key: "", type: value, width: contentSet.width, height: contentSet.height }) 169 | } 170 | 171 | const save = async () => { 172 | plugin.settings.contentSet = contentSet 173 | await plugin.saveData(plugin.settings) 174 | } 175 | 176 | const ImageSvrProcessModeEntries = Object.entries(ImageSvrProcessMode) 177 | 178 | const TableRows = ( 179 | 180 | {$("正文图片")} 181 | 182 | setWidth(e.target.value)} /> 183 | 184 | 185 | setHeight(e.target.value)} /> 186 | 187 | 188 | 195 | 196 | 197 | 198 | ) 199 | 200 | return ( 201 |
202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | {TableRows} 213 |
{$("宽度")}{$("高度")}{$("调整压缩")}
214 |
215 | ) 216 | } 217 | 218 | export const PropertyNeedSet = ({ plugin, frontMatterProperties }: { plugin: CustomImageAutoUploader; frontMatterProperties: string[] }) => { 219 | const [propertyNeedSets, setPropertyNeedSets] = useState(plugin.settings.propertyNeedSets) 220 | 221 | useEffect(() => { 222 | save() 223 | }, [propertyNeedSets]) 224 | 225 | const selectedTypes: string[] = propertyNeedSets.map((propertyNeedSet: UploadSet) => propertyNeedSet.key) 226 | 227 | const add = (property: string) => { 228 | if (!propertyNeedSets.find((selectedProperty) => selectedProperty.property === property)) { 229 | setPropertyNeedSets([...propertyNeedSets, { key: property, type: ImageSvrProcessMode.none.value, width: "0", height: "0" }]) 230 | } 231 | } 232 | 233 | const setWidth = (propertyNeedSet: UploadSet, value: string) => { 234 | const index = propertyNeedSets.indexOf(propertyNeedSet) 235 | const tempPropertyNeeds = [...propertyNeedSets] 236 | tempPropertyNeeds[index].width = value 237 | setPropertyNeedSets([...tempPropertyNeeds]) 238 | } 239 | 240 | const setHeight = (propertyNeedSet: UploadSet, value: string) => { 241 | const index = propertyNeedSets.indexOf(propertyNeedSet) 242 | const tempPropertyNeeds = [...propertyNeedSets] 243 | tempPropertyNeeds[index].height = value 244 | setPropertyNeedSets([...tempPropertyNeeds]) 245 | } 246 | 247 | const setType = (propertyNeedSet: UploadSet, value: string) => { 248 | const index = propertyNeedSets.indexOf(propertyNeedSet) 249 | const tempPropertyNeeds = [...propertyNeedSets] 250 | tempPropertyNeeds[index].type = value 251 | setPropertyNeedSets([...tempPropertyNeeds]) 252 | } 253 | 254 | const remove = (index: number) => { 255 | const tempPropertyNeeds = [...propertyNeedSets] 256 | tempPropertyNeeds.splice(index, 1) 257 | setPropertyNeedSets([...tempPropertyNeeds]) 258 | } 259 | 260 | const save = async () => { 261 | plugin.settings.propertyNeedSets = propertyNeedSets 262 | await plugin.saveData(plugin.settings) 263 | } 264 | 265 | const ImageSvrProcessModeEntries = Object.entries(ImageSvrProcessMode) 266 | 267 | const TableRows = 268 | propertyNeedSets.length === 0 ? ( 269 | 270 | 271 | No property added 272 |

No property images need to be uploaded

273 | 274 | 275 | ) : ( 276 | propertyNeedSets.map((propertySet: UploadSet, index: number) => { 277 | return ( 278 | 279 | {propertySet.key} 280 | 281 | setWidth(propertySet, e.target.value)} /> 282 | 283 | 284 | setHeight(propertySet, e.target.value)} /> 285 | 286 | 287 | 294 | 295 | 296 | { 300 | remove(index) 301 | }} 302 | /> 303 | 304 | 305 | ) 306 | }) 307 | ) 308 | 309 | return ( 310 |
311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | {TableRows} 322 | 323 | 324 | 337 | 338 | 339 |
{$("属性")}{$("宽度")}{$("高度")}{$("调整压缩")}
325 | {$("添加属性图片上传")} 326 | 336 |
340 |
341 | ) 342 | } 343 | -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | .custom-image-auto-uploader-settings-tag .setting-item-name{ 2 | color: var(--interactive-accent); 3 | } 4 | .custom-image-auto-uploader-settings-openapi { 5 | width: 100%; 6 | margin-bottom: 20px; 7 | border: 1px solid var(--background-modifier-border); 8 | } 9 | 10 | .custom-image-auto-uploader-settings-openapi th, 11 | .custom-image-auto-uploader-settings-openapi td { 12 | border: 0 !important; 13 | } 14 | .custom-image-auto-uploader-settings-openapi th { 15 | text-align: left; 16 | padding: 8px 10px; 17 | font-size: var(--font-ui-smaller); 18 | } 19 | .custom-image-auto-uploader-settings-openapi thead { 20 | border-bottom: 1px solid var(--color-base-40) !important; 21 | } 22 | .custom-image-auto-uploader-settings-openapi thead tr th { 23 | background-color: var(--background-secondary); 24 | } 25 | 26 | .custom-image-auto-uploader-settings-openapi thead { 27 | border-bottom: 1px solid var(--color-base-40) !important; 28 | } 29 | .custom-image-auto-uploader-settings-openapi tbody tr { 30 | background-color: var(--background-secondary); 31 | } 32 | .custom-image-auto-uploader-settings-openapi tbody tr:nth-child(odd) { 33 | background-color: var(--background-secondary-alt); 34 | } 35 | .custom-image-auto-uploader-settings-openapi tbody td { 36 | padding: 4px 8px; 37 | font-size: var(--font-ui-small); 38 | } 39 | .custom-image-auto-uploader-settings-openapi tfoot td { 40 | padding: 8px 10px; 41 | } 42 | .custom-image-auto-uploader-settings-openapi a { 43 | color: var(--color-blue); 44 | text-decoration: none; 45 | } 46 | .custom-image-auto-uploader-settings-openapi a:hover { 47 | text-decoration: underline; 48 | } 49 | 50 | .custom-image-auto-uploader-settings { 51 | padding: 0.75em 0; 52 | border-top: 1px solid var(--background-modifier-border); 53 | } 54 | 55 | .clipboard-read { 56 | display: flex; 57 | } 58 | .clipboard-read .clipboard-read-button { 59 | display: inline-flex; 60 | align-items: center; 61 | justify-content: center; 62 | gap: 0.5rem; /* 间距 8px */ 63 | white-space: nowrap; 64 | font-size: 0.875rem; /* 14px */ 65 | line-height: 1.25rem; /* 20px */ 66 | font-weight: 500; 67 | transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out; 68 | border: 1px solid var(--input); /* 假设使用自定义变量 */ 69 | background-color: var(--background); /* 假设使用自定义变量 */ 70 | height: 2.25rem; /* 36px */ 71 | border-radius: 0.375rem; /* 6px */ 72 | padding-left: 0.75rem; /* 12px */ 73 | padding-right: 0.75rem; /* 12px */ 74 | color: #6b7280; /* gray-500 */ 75 | 76 | 77 | 78 | /* 伪类 */ 79 | &:focus-visible { 80 | outline: none; 81 | /* 移除阴影效果 */ 82 | /* box-shadow: 0 0 0 2px var(--ring), 0 0 0 4px var(--background); 已注释掉 */ 83 | } 84 | 85 | &:hover { 86 | background-color: var(--accent); 87 | color: var(--accent-foreground); 88 | } 89 | 90 | &:disabled { 91 | pointer-events: none; 92 | opacity: 0.5; 93 | } 94 | 95 | /* 子元素 SVG 样式 */ 96 | & svg { 97 | pointer-events: none; 98 | width: 1rem; /* 16px */ 99 | height: 1rem; /* 16px */ 100 | flex-shrink: 0; 101 | } 102 | } 103 | 104 | .clipboard-read .clipboard-read-description { 105 | color: var(--color-red); 106 | float: left; 107 | padding-left: 20px; 108 | height: 20px; 109 | padding-top: 8px; 110 | } 111 | 112 | .custom-image-auto-uploader-settings-table { 113 | width: 100%; 114 | margin-bottom: 20px; 115 | border: 0 !important; 116 | background-color: var(--background-secondary); 117 | } 118 | .custom-image-auto-uploader-settings-table th, 119 | .custom-image-auto-uploader-settings-table td { 120 | border: 0 !important; 121 | } 122 | .custom-image-auto-uploader-settings-table th { 123 | text-align: left; 124 | padding: 8px 10px; 125 | font-size: var(--font-ui-smaller); 126 | } 127 | .custom-image-auto-uploader-settings-table .no-columns-added { 128 | padding: 15px; 129 | text-align: center; 130 | background-color: var(--background-secondary); 131 | } 132 | .custom-image-auto-uploader-settings-table .no-columns-added p { 133 | margin: 4px; 134 | font-size: 10px; 135 | } 136 | .custom-image-auto-uploader-settings-table thead { 137 | border-bottom: 1px solid var(--color-base-40) !important; 138 | } 139 | .custom-image-auto-uploader-settings-table tbody tr { 140 | background-color: var(--background-secondary); 141 | } 142 | .custom-image-auto-uploader-settings-table tbody tr:nth-child(odd) { 143 | background-color: var(--background-secondary-alt); 144 | } 145 | .custom-image-auto-uploader-settings-table tbody td { 146 | padding: 4px 8px; 147 | font-size: var(--font-ui-small); 148 | } 149 | .custom-image-auto-uploader-settings-table tfoot td { 150 | padding: 8px 10px; 151 | } 152 | 153 | /*# sourceMappingURL=styles.css.map */ 154 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": true, 4 | "baseUrl": ".", 5 | "importHelpers": true, 6 | "inlineSourceMap": true, 7 | "inlineSources": true, 8 | "isolatedModules": true, 9 | "lib": [ 10 | "DOM", 11 | "ES5", 12 | "ES6", 13 | "ES7", 14 | "ESNext" 15 | ], 16 | "module": "ESNext", 17 | "moduleResolution": "node", 18 | "noImplicitAny": true, 19 | "strictNullChecks": true, 20 | "target": "ES6", 21 | "jsx": "react-jsx" 22 | }, 23 | "include": [ 24 | "**/*.ts" 25 | ] 26 | } -------------------------------------------------------------------------------- /versions.json: -------------------------------------------------------------------------------- 1 | { 2 | } --------------------------------------------------------------------------------