Compare commits
74 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| dc3a01fb3c | |||
| 591de11072 | |||
| 853c361e6d | |||
| b0ebc737e2 | |||
| bc9db25dfd | |||
| 08c9902759 | |||
| 8d2f52710d | |||
| dd48fd79db | |||
| 9e7ad10309 | |||
| 6e17102210 | |||
| 5ed3b68a57 | |||
| a705427ce2 | |||
| c37f7c73ce | |||
| efcf01d59b | |||
| 324b61567d | |||
| d1e24fced0 | |||
| cb50d6709b | |||
| 900ac4c8d1 | |||
| 6696b0a538 | |||
| 110c83bcb8 | |||
| 136b4969bd | |||
| a901fdd2b6 | |||
| 215bdbc416 | |||
| 4e8d226460 | |||
| 23f3357d27 | |||
| 7adafab7fe | |||
| e3afb14e4a | |||
| 228cd1fa7d | |||
| 47a7464bf9 | |||
| 8efd86af3d | |||
| ee78ae262e | |||
| 7562f6a7d1 | |||
| defacd50e8 | |||
| f5ed0d89cc | |||
| a3bb1c7ff1 | |||
| d0085b295d | |||
| 6cb278fd9e | |||
| aeeb9813ed | |||
| 359da895e7 | |||
| 8a3f510c38 | |||
| 1345994402 | |||
| c770108a6c | |||
| 178f2103f1 | |||
| d5c71b50e8 | |||
| ce09e76ffb | |||
| 4688b521fa | |||
| 33960dc264 | |||
| d29d0d3321 | |||
| f4c3e7be69 | |||
| 338b51975c | |||
| e1a287350d | |||
| afeee1fc86 | |||
| a39820f8ab | |||
| aea604278c | |||
| 0b92e6b96e | |||
| 2ba0040bdd | |||
| 04bf2b6b9d | |||
| cc367f4c5c | |||
| 73809a6501 | |||
| 5067ad7306 | |||
| d5b3ad5933 | |||
| 7a903e112c | |||
| 829eb83a4c | |||
| 886acc2486 | |||
| 87440701ab | |||
| e880430e3a | |||
| 2febff883b | |||
| 7d8bb443b8 | |||
| 1489d58a63 | |||
| 00fdafe824 | |||
| 81c91e8cb1 | |||
| 0fd34254de | |||
| d9298f0d46 | |||
| 83e12a699e |
@@ -9,3 +9,4 @@ npm-debug.log.*
|
||||
thumbs.db
|
||||
!.gitkeep
|
||||
release/*
|
||||
.idea/
|
||||
|
||||
+15
-13
@@ -1,30 +1,32 @@
|
||||
# Motrix 贡献指南
|
||||
|
||||
## 🌍 翻译指南
|
||||
|
||||
首先你要确定一个语言的英文简写作为 **locale**,如 en-US,这个 locale 值请严格参考 [Electron 的 Locales 文档](https://electronjs.org/docs/api/locales)
|
||||
|
||||
Motrix 的国际化分三部分:
|
||||
Motrix 的国际化分两部分:
|
||||
|
||||
- Element UI
|
||||
- 应用菜单
|
||||
- 主界面
|
||||
- 菜单和主界面
|
||||
|
||||
### Element UI
|
||||
|
||||
Element UI 的国际化由 [Element 社区](http://element.eleme.io/#/en-US/component/i18n)提供,找到 **locale** 对应的语言包文件「两者 locale 命名可能不一致」,在 `src/shared/locales/all.js` 中引入,如
|
||||
```
|
||||
|
||||
```javascript
|
||||
import eleLocaleEn from 'element-ui/lib/locale/lang/en'
|
||||
import eleLocaleZhCN from 'element-ui/lib/locale/lang/zh-CN'
|
||||
```
|
||||
|
||||
### 应用菜单
|
||||
应用菜单的国际化文件按照语言进行目录划分,每个目录里有三大操作系统对应的 JSON 文件:
|
||||
- darwin.json
|
||||
- linux.json
|
||||
- win32.json
|
||||
### 菜单和主界面
|
||||
|
||||
Motrix 使用 i18next 作为翻译支持库,所以你可能需要简单了解一下它的[使用方法](https://www.i18next.com/overview/getting-started)。
|
||||
配置文件按照语言 (**locale**) 划分目录:`src/shared/locales`,如:`src/shared/locales/en-US` 和 `src/shared/locales/zh-CN`。
|
||||
|
||||
目录里面有按业务模块划分的语言文件
|
||||
|
||||
菜单模块经过重构之后,国际化已经打散到了以下文件里了,不再需要再复制 `src/main/menus` 里的配置。
|
||||
|
||||
### 主界面
|
||||
主界面和 Element UI 都是用 i18next 作为翻译支持库,所以你可能需要简单了解一下它的[使用方法](https://www.i18next.com/overview/getting-started)。
|
||||
主界面的配置同样按照语言划分目录:`src/shared/locales`,如:`src/shared/locales/en-US` 和 `src/shared/locales/zh-CN`。
|
||||
目录里面有按业务模块划分的语言文件:
|
||||
- about.js
|
||||
- app.js
|
||||
- edit.js
|
||||
|
||||
+15
-13
@@ -1,30 +1,32 @@
|
||||
# Motrix Contributing Guide
|
||||
|
||||
## 🌍 Translation Guide
|
||||
|
||||
First you need to determine the English abbreviation of a language as **locale**, such as en-US, this locale value should strictly refer to the [electron's documentation](https://electronjs.org/docs/api/locales).
|
||||
|
||||
The internationalization of Motrix is divided into three parts:
|
||||
The internationalization of Motrix is divided into two parts:
|
||||
|
||||
- Element UI
|
||||
- Application Menu
|
||||
- Main Interface
|
||||
- Menu & Main Interface
|
||||
|
||||
### Element UI
|
||||
|
||||
The internationalization of Element UI is provided by the [Element community](http://element.eleme.io/#/en-US/component/i18n), then find the language pack file corresponding to **locale** (both locale naming may be inconsistent), which is import in `src/shared/locales/all.js`, such as
|
||||
```
|
||||
|
||||
```javascript
|
||||
import eleLocaleEn from 'element-ui/lib/locale/lang/en'
|
||||
import eleLocaleZhCN from 'element-ui/lib/locale/lang/zh-CN'
|
||||
```
|
||||
|
||||
### Application Menu
|
||||
The internationalization files of the application menu are divided into directories according to the **locale**. Each directory has three JSON files corresponding to the OS:
|
||||
- darwin.json
|
||||
- linux.json
|
||||
- win32.json
|
||||
### Menu & Main Interface
|
||||
|
||||
Motrix uses the [i18next](https://www.i18next.com/overview/getting-started) library for internationalization, so you need a quick look at how to use it.
|
||||
The configuration files are divided by **locale**: `src/shared/locales`, such as `src/shared/locales/en-US` and `src/shared/locales/zh-CN`.
|
||||
|
||||
There are language files in the directory according to the business module.
|
||||
|
||||
After the menu module is refactored, the internationalization of the menu has been dispersed into the following files, and there is no need to copy the configuration in `src/main/menus`.
|
||||
|
||||
### Main Interface
|
||||
Both the main interface and the Element UI use [i18next](https://www.i18next.com/overview/getting-started) as the translation support library, so you may need to take a brief look at how to use it.
|
||||
The configuration of the main interface is also divided into directories according to the **locale**: `src/shared/locales`, such as: `src/shared/locales/en-US` and `src/shared/locales/zh-CN`.
|
||||
There are language files in the directory divided by business modules:
|
||||
- about.js
|
||||
- app.js
|
||||
- edit.js
|
||||
|
||||
+45
-9
@@ -7,24 +7,43 @@
|
||||
[English](./README.md) | 简体中文
|
||||
|
||||
## 一款全能的下载工具
|
||||
[](https://travis-ci.org/agalwood/Motrix) [](https://ci.appveyor.com/project/agalwood/motrix/branch/master)  
|
||||
|
||||
[](https://github.com/agalwood/Motrix/releases) [](https://travis-ci.org/agalwood/Motrix) [](https://ci.appveyor.com/project/agalwood/motrix/branch/master) [](https://github.com/agalwood/Motrix/releases) 
|
||||
|
||||
我是个兴趣使然的桌面应用开发者🤓,利用搬砖之余开发了 Motrix。
|
||||
|
||||
Motirx 是一款全能的下载工具,支持下载 HTTP、FTP、BT、磁力链、百度网盘等资源。它的界面简洁易用,希望大家喜欢 👻。
|
||||
Motrix 是一款全能的下载工具,支持下载 HTTP、FTP、BT、磁力链、百度网盘等资源。它的界面简洁易用,希望大家喜欢 👻。
|
||||
|
||||
✈️ 去 [官网](https://motrix.app/zh-CN) 逛逛 | 📖 查看 [帮助手册](http://motrix.app/support/issues)
|
||||
|
||||
## 💽 安装稳定版
|
||||
|
||||
[GitHub](https://github.com/agalwood/Motrix/releases) 和 [官网](https://motrix.app/zh-CN) 提供了已经编译好的稳定版安装包,当然你也可以自己克隆代码编译打包。
|
||||
|
||||
### macOS
|
||||
|
||||
更新:macOS 用户支持 `brew cask` 安装,感谢 [Mitscherlich](https://github.com/Mitscherlich) 的 [PR](https://github.com/Homebrew/homebrew-cask/pull/59494)。
|
||||
|
||||
```bash
|
||||
brew update && brew cask install motrix
|
||||
```
|
||||
|
||||
### Linux
|
||||
|
||||
您可以下载 AppImage(适用于所有Linux发行版)软件包或 snap 或从源代码构建。
|
||||
|
||||
构建请阅读 **编译打包** 部分。
|
||||
|
||||
对于 Arch Linux 用户,可以使用 [aur](https://aur.archlinux.org/packages/motrix/) 安装 Motrix,感谢维护者 [weearc](https://github.com/weearc)。
|
||||
|
||||
运行以下命令进行安装:
|
||||
|
||||
```bash
|
||||
yay motrix
|
||||
```
|
||||
|
||||
## ✨ 特性
|
||||
|
||||
- 🕹 简洁明了的图形操作界面
|
||||
- 🦄 支持BT和磁力链任务
|
||||
- 💾 支持下载百度云盘资源
|
||||
@@ -33,67 +52,84 @@ brew update && brew cask install motrix
|
||||
- 🕶 模拟用户代理UA
|
||||
- 🔔 下载完成后通知
|
||||
- 💻 支持触控栏快捷健 (Mac 专享)
|
||||
- 🤖 常驻系统托盘,操作更加便捷
|
||||
- 🌑 深色模式
|
||||
- 🗑 移除任务时可同时删除相关文件
|
||||
- 🌍 国际化,[查看已可选的语言](#-国际化)
|
||||
- 🎏 ...
|
||||
|
||||
## 🖥 应用界面
|
||||
|
||||

|
||||
|
||||
## ⌨️ 本地开发
|
||||
|
||||
### 克隆代码
|
||||
|
||||
```bash
|
||||
git clone git@github.com:agalwood/Motrix.git
|
||||
```
|
||||
|
||||
### 安装依赖
|
||||
|
||||
```bash
|
||||
cd Motrix
|
||||
npm install
|
||||
```
|
||||
天朝大陆用户建议使用淘宝的npm源
|
||||
|
||||
天朝大陆用户建议使用淘宝的 npm 源
|
||||
|
||||
```bash
|
||||
npm config set registry 'https://registry.npm.taobao.org'
|
||||
export ELECTRON_MIRROR='https://npm.taobao.org/mirrors/electron/'
|
||||
export SASS_BINARY_SITE='https://npm.taobao.org/mirrors/node-sass'
|
||||
```
|
||||
|
||||
如果喜欢 [Yarn](https://yarnpkg.com/),也可以使用 `yarn` 安装依赖
|
||||
|
||||
### 开发模式
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### 编译打包
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
完成之后可以在项目的 `release` 目录看到编译打包好的应用文件
|
||||
|
||||
## 🛠 技术栈
|
||||
|
||||
- [Electron](https://electronjs.org/)
|
||||
- [Vue](https://vuejs.org/) + [VueX](https://vuex.vuejs.org/) + [Element](https://element.eleme.io)
|
||||
- [Aria2](https://aria2.github.io/) (注:macOS 和 Linux 版本使用的是 64 位的 aria2c,Windows 版使用的 32 位的)
|
||||
|
||||
## ☑️ TODO
|
||||
|
||||
开发计划请移步 [Trello](https://trello.com/b/qNUzA0bv/motrix) 查看
|
||||
|
||||
## 🤝 参与共建 [](http://makeapullrequest.com)
|
||||
## 🤝 参与共建 [](http://makeapullrequest.com)
|
||||
|
||||
如果你有兴趣参与共同开发,欢迎 FORK 和 PR。
|
||||
|
||||
## 🌍 国际化
|
||||
|
||||
欢迎大家将 Motrix 翻译成更多的语言版本 🧐,开工之前请先阅读一下 [翻译指南](./CONTRIBUTING-CN.md#-翻译指南)。
|
||||
|
||||
| Key | Name | Status |
|
||||
|-------|:--------------------|:-------------|
|
||||
| de | German | 下版本发布 [@Schloemicher](https://github.com/Schloemicher) |
|
||||
| de | German | ✔️ [@Schloemicher](https://github.com/Schloemicher) |
|
||||
| en-US | English | ✔️ |
|
||||
| fr | Français | 下版本发布 [@gpatarin](https://github.com/gpatarin) |
|
||||
| pt-BR | Portuguese (Brazil) | 下版本发布 [@andrenoberto](https://github.com/andrenoberto) |
|
||||
| tr | Türkçe | 下版本发布 [@abdullah](https://github.com/abdullah) |
|
||||
| fr | Français | ✔️ [@gpatarin](https://github.com/gpatarin) |
|
||||
| ja | 日本語 | ✔️ [@hbkrkzk](https://github.com/hbkrkzk) |
|
||||
| pt-BR | Portuguese (Brazil) | ✔️ [@andrenoberto](https://github.com/andrenoberto) |
|
||||
| tr | Türkçe | ✔️ [@abdullah](https://github.com/abdullah) |
|
||||
| zh-CN | 简体中文 | ✔️ |
|
||||
| zh-TW | 繁體中文 | 下版本发布 [@Yukaii](https://github.com/Yukaii) |
|
||||
| zh-TW | 繁體中文 | ✔️ [@Yukaii](https://github.com/Yukaii) |
|
||||
|
||||
## 📜 开源许可
|
||||
|
||||
基于 [MIT license](https://opensource.org/licenses/MIT) 许可进行开源。
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
<img src="https://cdn.nlark.com/yuque/0/2018/png/129147/1543735425232-a5d2c99f-d788-43e4-9781-558ff6d21027.png" width="256" alt="App Icon" />
|
||||
</a>
|
||||
|
||||
## A full-featured download manager.
|
||||
[](https://travis-ci.org/agalwood/Motrix) [](https://ci.appveyor.com/project/agalwood/motrix/branch/master)  
|
||||
## A full-featured download manager
|
||||
|
||||
[](https://github.com/agalwood/Motrix/releases) [](https://travis-ci.org/agalwood/Motrix) [](https://ci.appveyor.com/project/agalwood/motrix/branch/master) [](https://github.com/agalwood/Motrix/releases) 
|
||||
|
||||
English | [简体中文](./README-CN.md)
|
||||
|
||||
@@ -13,18 +14,36 @@ Motrix is a full-featured download manager that supports downloading HTTP, FTP,
|
||||
|
||||
Motrix has a clean and easy to use interface. I hope you will like it 👻.
|
||||
|
||||
✈️ [Official Website](https://motrix.app) | 📖 [Manual](http://motrix.app/support/issues) (zh-CN)
|
||||
✈️ [Official Website](https://motrix.app) | 📖 [Manual](https://github.com/agalwood/Motrix/wiki)
|
||||
|
||||
## 💽 Installation
|
||||
|
||||
Download from [GitHub Releases](https://github.com/agalwood/Motrix/releases) and install it.
|
||||
|
||||
### macOS
|
||||
|
||||
Update: macOS user support `brew cask` installation, thanks to [PR](https://github.com/Homebrew/homebrew-cask/pull/59494) of [Mitscherlich](https://github.com/Mitscherlich).
|
||||
|
||||
```bash
|
||||
brew update && brew cask install motrix
|
||||
```
|
||||
|
||||
### Linux
|
||||
|
||||
You can download the AppImage(for all Linux distributions) package or snap or just build from source code.
|
||||
|
||||
Please read the **Build** section.
|
||||
|
||||
For Arch Linux users, Motrix is available in [aur](https://aur.archlinux.org/packages/motrix/), thanks to the maintainer [weearc](https://github.com/weearc).
|
||||
|
||||
Run the following command to install:
|
||||
|
||||
```bash
|
||||
yay motrix
|
||||
```
|
||||
|
||||
## ✨ Features
|
||||
|
||||
- 🕹 Simple and clear user interface
|
||||
- 🦄 Supports BitTorrent & Magnet
|
||||
- 💾 Supports downloading Baidu Net Disk
|
||||
@@ -33,61 +52,76 @@ brew update && brew cask install motrix
|
||||
- 🕶 Mock User-Agent
|
||||
- 🔔 Download completed Notification
|
||||
- 💻 Ready for Touch Bar (Mac only)
|
||||
- 🤖 Resident system tray for quick operation
|
||||
- 🌑 Dark mode
|
||||
- 🗑 Delete related files when removing tasks (optional)
|
||||
- 🌍 I18n, [View supported languages](#-internationalization).
|
||||
- 🎏 ...
|
||||
|
||||
## 🖥 User Interface
|
||||
|
||||

|
||||
|
||||
## ⌨️ Development
|
||||
|
||||
### Clone Code
|
||||
|
||||
```bash
|
||||
git clone git@github.com:agalwood/Motrix.git
|
||||
```
|
||||
|
||||
### Install Dependencies
|
||||
|
||||
```bash
|
||||
cd Motrix
|
||||
npm install
|
||||
```
|
||||
|
||||
If you like [Yarn](https://yarnpkg.com/), you can also use `yarn` to install dependencies.
|
||||
|
||||
### Dev Mode
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### Build Release
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
After building, the application will be found in the project's `release` directory.
|
||||
|
||||
## 🛠 Technology Stack
|
||||
|
||||
- [Electron](https://electronjs.org/)
|
||||
- [Vue](https://vuejs.org/) + [VueX](https://vuex.vuejs.org/) + [Element](https://element.eleme.io)
|
||||
- [Aria2](https://aria2.github.io/) (Note: macOS and Linux versions use 64-bit aria2c, Windows version uses 32-bit)
|
||||
|
||||
## ☑️ TODO
|
||||
|
||||
Development Roadmap see: [Trello](https://trello.com/b/qNUzA0bv/motrix)
|
||||
|
||||
## 🤝 Contribute [](http://makeapullrequest.com)
|
||||
## 🤝 Contribute [](http://makeapullrequest.com)
|
||||
|
||||
If you are interested in participating in joint development, PR and Forks are welcome!
|
||||
|
||||
## 🌍 Internationalization
|
||||
|
||||
Translations into versions for other languages are welcome 🧐! Please read the [translation guide](./CONTRIBUTING.md#-translation-guide) before starting translations.
|
||||
|
||||
| Key | Name | Status |
|
||||
|-------|:--------------------|:-------------|
|
||||
| de | German | Next Release [@Schloemicher](https://github.com/Schloemicher) |
|
||||
| de | German | ✔️ [@Schloemicher](https://github.com/Schloemicher) |
|
||||
| en-US | English | ✔️ |
|
||||
| fr | Français | Next Release [@gpatarin](https://github.com/gpatarin) |
|
||||
| pt-BR | Portuguese (Brazil) | Next Release [@andrenoberto](https://github.com/andrenoberto) |
|
||||
| tr | Türkçe | Next Release [@abdullah](https://github.com/abdullah) |
|
||||
| fr | Français | ✔️ [@gpatarin](https://github.com/gpatarin) |
|
||||
| ja | 日本語 | ✔️ [@hbkrkzk](https://github.com/hbkrkzk) |
|
||||
| pt-BR | Portuguese (Brazil) | ✔️ [@andrenoberto](https://github.com/andrenoberto) |
|
||||
| tr | Türkçe | ✔️ [@abdullah](https://github.com/abdullah) |
|
||||
| zh-CN | 简体中文 | ✔️ |
|
||||
| zh-TW | 繁體中文 | Next Release [@Yukaii](https://github.com/Yukaii) |
|
||||
| zh-TW | 繁體中文 | ✔️ [@Yukaii](https://github.com/Yukaii) |
|
||||
|
||||
## 📜 License
|
||||
|
||||
[MIT](https://opensource.org/licenses/MIT) Copyright (c) 2018-present Dr_rOot
|
||||
|
||||
@@ -73,15 +73,19 @@ rpc-listen-all=true
|
||||
# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
|
||||
#follow-torrent=true
|
||||
# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
|
||||
listen-port=51413
|
||||
listen-port=50101-50109
|
||||
# 单个种子最大连接数, 默认:55
|
||||
#bt-max-peers=55
|
||||
# 打开DHT功能, PT需要禁用, 默认:true
|
||||
# enable-dht=false
|
||||
enable-dht=true
|
||||
# 打开IPv6 DHT功能, PT需要禁用
|
||||
#enable-dht6=false
|
||||
enable-dht6=true
|
||||
# DHT网络监听端口, 默认:6881-6999
|
||||
#dht-listen-port=6881-6999
|
||||
dht-listen-port=50101-50109
|
||||
# Set host and port as an entry point to IPv4 DHT network.
|
||||
dht-entry-point=dht.transmissionbt.com:6881
|
||||
# Set host and port as an entry point to IPv6 DHT network.
|
||||
dht-entry-point6=dht.transmissionbt.com:6881
|
||||
# 本地节点查找, PT需要禁用, 默认:false
|
||||
bt-enable-lpd=true
|
||||
# 种子交换, PT需要禁用, 默认:true
|
||||
@@ -101,8 +105,4 @@ seed-ratio=1.0
|
||||
# 继续之前的BT任务时, 无需再次校验, 默认:false
|
||||
bt-seed-unverified=true
|
||||
# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
|
||||
bt-save-metadata=true
|
||||
|
||||
# bt-tracker数据来自https://github.com/ngosang/trackerslist/blob/master/trackers_best.txt
|
||||
|
||||
bt-tracker=udp://tracker.coppersurfer.tk:6969/announce,udp://tracker.opentrackr.org:1337/announce,udp://tracker.internetwarriors.net:1337/announce,udp://9.rarbg.to:2710/announce,udp://exodus.desync.com:6969/announce,udp://tracker2.itzmx.com:6961/announce,udp://tracker1.itzmx.com:8080/announce,udp://explodie.org:6969/announce,http://tracker.tfile.me:80/announce.php,http://tracker.tfile.me:80/announce,http://tracker.tfile.co:80/announce,http://peersteers.org:80/announce,udp://tracker.tiny-vps.com:6969/announce,udp://ipv4.tracker.harry.lu:80/announce,udp://denis.stalker.upeer.me:6969/announce,udp://tracker.torrent.eu.org:451/announce,udp://tracker.port443.xyz:6969/announce,udp://tracker.cyberia.is:6969/announce,udp://thetracker.org:80/announce,udp://retracker.lanta-net.ru:2710/announce
|
||||
bt-save-metadata=false
|
||||
|
||||
@@ -73,15 +73,19 @@ rpc-listen-all=true
|
||||
# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
|
||||
#follow-torrent=true
|
||||
# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
|
||||
listen-port=51413
|
||||
listen-port=50101-50109
|
||||
# 单个种子最大连接数, 默认:55
|
||||
#bt-max-peers=55
|
||||
# 打开DHT功能, PT需要禁用, 默认:true
|
||||
# enable-dht=false
|
||||
enable-dht=true
|
||||
# 打开IPv6 DHT功能, PT需要禁用
|
||||
#enable-dht6=false
|
||||
enable-dht6=true
|
||||
# DHT网络监听端口, 默认:6881-6999
|
||||
#dht-listen-port=6881-6999
|
||||
dht-listen-port=50101-50109
|
||||
# Set host and port as an entry point to IPv4 DHT network.
|
||||
dht-entry-point=dht.transmissionbt.com:6881
|
||||
# Set host and port as an entry point to IPv6 DHT network.
|
||||
dht-entry-point6=dht.transmissionbt.com:6881
|
||||
# 本地节点查找, PT需要禁用, 默认:false
|
||||
bt-enable-lpd=true
|
||||
# 种子交换, PT需要禁用, 默认:true
|
||||
@@ -101,8 +105,4 @@ seed-ratio=1.0
|
||||
# 继续之前的BT任务时, 无需再次校验, 默认:false
|
||||
bt-seed-unverified=true
|
||||
# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
|
||||
bt-save-metadata=true
|
||||
|
||||
# bt-tracker数据来自https://github.com/ngosang/trackerslist/blob/master/trackers_best.txt
|
||||
|
||||
bt-tracker=udp://tracker.coppersurfer.tk:6969/announce,udp://tracker.opentrackr.org:1337/announce,udp://tracker.internetwarriors.net:1337/announce,udp://9.rarbg.to:2710/announce,udp://exodus.desync.com:6969/announce,udp://tracker2.itzmx.com:6961/announce,udp://tracker1.itzmx.com:8080/announce,udp://explodie.org:6969/announce,http://tracker.tfile.me:80/announce.php,http://tracker.tfile.me:80/announce,http://tracker.tfile.co:80/announce,http://peersteers.org:80/announce,udp://tracker.tiny-vps.com:6969/announce,udp://ipv4.tracker.harry.lu:80/announce,udp://denis.stalker.upeer.me:6969/announce,udp://tracker.torrent.eu.org:451/announce,udp://tracker.port443.xyz:6969/announce,udp://tracker.cyberia.is:6969/announce,udp://thetracker.org:80/announce,udp://retracker.lanta-net.ru:2710/announce
|
||||
bt-save-metadata=false
|
||||
|
||||
@@ -73,15 +73,19 @@ rpc-listen-all=true
|
||||
# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
|
||||
#follow-torrent=true
|
||||
# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
|
||||
listen-port=51413
|
||||
listen-port=50101-50109
|
||||
# 单个种子最大连接数, 默认:55
|
||||
#bt-max-peers=55
|
||||
# 打开DHT功能, PT需要禁用, 默认:true
|
||||
# enable-dht=false
|
||||
enable-dht=true
|
||||
# 打开IPv6 DHT功能, PT需要禁用
|
||||
#enable-dht6=false
|
||||
enable-dht6=true
|
||||
# DHT网络监听端口, 默认:6881-6999
|
||||
#dht-listen-port=6881-6999
|
||||
dht-listen-port=50101-50109
|
||||
# Set host and port as an entry point to IPv4 DHT network.
|
||||
dht-entry-point=dht.transmissionbt.com:6881
|
||||
# Set host and port as an entry point to IPv6 DHT network.
|
||||
dht-entry-point6=dht.transmissionbt.com:6881
|
||||
# 本地节点查找, PT需要禁用, 默认:false
|
||||
bt-enable-lpd=true
|
||||
# 种子交换, PT需要禁用, 默认:true
|
||||
@@ -101,8 +105,4 @@ seed-ratio=1.0
|
||||
# 继续之前的BT任务时, 无需再次校验, 默认:false
|
||||
bt-seed-unverified=true
|
||||
# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
|
||||
bt-save-metadata=true
|
||||
|
||||
# bt-tracker数据来自https://github.com/ngosang/trackerslist/blob/master/trackers_best.txt
|
||||
|
||||
bt-tracker=udp://tracker.coppersurfer.tk:6969/announce,udp://tracker.opentrackr.org:1337/announce,udp://tracker.internetwarriors.net:1337/announce,udp://9.rarbg.to:2710/announce,udp://exodus.desync.com:6969/announce,udp://tracker2.itzmx.com:6961/announce,udp://tracker1.itzmx.com:8080/announce,udp://explodie.org:6969/announce,http://tracker.tfile.me:80/announce.php,http://tracker.tfile.me:80/announce,http://tracker.tfile.co:80/announce,http://peersteers.org:80/announce,udp://tracker.tiny-vps.com:6969/announce,udp://ipv4.tracker.harry.lu:80/announce,udp://denis.stalker.upeer.me:6969/announce,udp://tracker.torrent.eu.org:451/announce,udp://tracker.port443.xyz:6969/announce,udp://tracker.cyberia.is:6969/announce,udp://thetracker.org:80/announce,udp://retracker.lanta-net.ru:2710/announce
|
||||
bt-save-metadata=false
|
||||
|
||||
Generated
+2056
-4519
File diff suppressed because it is too large
Load Diff
+39
-33
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Motrix",
|
||||
"version": "1.2.2",
|
||||
"version": "1.3.7",
|
||||
"description": "A full-featured download manager",
|
||||
"homepage": "https://motrix.app",
|
||||
"author": {
|
||||
@@ -47,6 +47,21 @@
|
||||
"files": [
|
||||
"dist/electron/**/*"
|
||||
],
|
||||
"protocols": [
|
||||
{
|
||||
"name": "Motrix Protocol",
|
||||
"schemes": [
|
||||
"mo",
|
||||
"motrix"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Magnet Protocol",
|
||||
"schemes": [
|
||||
"magnet"
|
||||
]
|
||||
}
|
||||
],
|
||||
"dmg": {
|
||||
"window": {
|
||||
"width": 540,
|
||||
@@ -83,16 +98,7 @@
|
||||
"binaries": [
|
||||
"./release/mac/Motrix.app/Contents/Resources/engine/aria2c"
|
||||
],
|
||||
"category": "public.app-category.utilities",
|
||||
"protocols": [
|
||||
{
|
||||
"name": "Motrix Protocol",
|
||||
"schemes": [
|
||||
"mo",
|
||||
"motrix"
|
||||
]
|
||||
}
|
||||
]
|
||||
"category": "public.app-category.utilities"
|
||||
},
|
||||
"win": {
|
||||
"target": [
|
||||
@@ -160,33 +166,33 @@
|
||||
"aria2": "^4.0.3",
|
||||
"axios": "^0.18.0",
|
||||
"blob-util": "^2.0.2",
|
||||
"clipboard-polyfill": "^2.7.0",
|
||||
"electron-debug": "^2.1.0",
|
||||
"clipboard-polyfill": "^2.8.0",
|
||||
"electron-debug": "^2.2.0",
|
||||
"electron-is": "^3.0.0",
|
||||
"electron-log": "^2.2.17",
|
||||
"electron-updater": "^4.0.8",
|
||||
"element-ui": "^2.6.2",
|
||||
"electron-log": "^3.0.5",
|
||||
"electron-updater": "^4.0.9",
|
||||
"element-ui": "^2.7.2",
|
||||
"forever-monitor": "^1.7.1",
|
||||
"i18next": "^15.0.6",
|
||||
"i18next": "^15.0.9",
|
||||
"lodash": "^4.17.11",
|
||||
"normalize.css": "^8.0.1",
|
||||
"parse-torrent": "^6.1.2",
|
||||
"svg-innerhtml": "^1.1.0",
|
||||
"vue": "^2.6.10",
|
||||
"vue-electron": "^1.0.6",
|
||||
"vue-router": "^3.0.2",
|
||||
"vue-router": "^3.0.6",
|
||||
"vuex": "^3.1.0",
|
||||
"vuex-router-sync": "^5.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vue/cli-plugin-babel": "^3.5.1",
|
||||
"@vue/cli-plugin-eslint": "^3.5.1",
|
||||
"@vue/cli-service": "^3.5.1",
|
||||
"@vue/cli-plugin-babel": "^3.6.0",
|
||||
"@vue/cli-plugin-eslint": "^3.6.0",
|
||||
"@vue/cli-service": "^3.6.0",
|
||||
"@vue/eslint-config-standard": "^4.0.0",
|
||||
"ajv": "^6.10.0",
|
||||
"babel-core": "^6.26.3",
|
||||
"babel-eslint": "^10.0.1",
|
||||
"babel-loader": "^7.1.4",
|
||||
"babel-loader": "^7.1.5",
|
||||
"babel-plugin-component": "^1.1.1",
|
||||
"babel-plugin-transform-runtime": "^6.23.0",
|
||||
"babel-preset-env": "^1.7.0",
|
||||
@@ -195,30 +201,30 @@
|
||||
"babili-webpack-plugin": "^0.1.2",
|
||||
"cfonts": "^2.4.2",
|
||||
"chalk": "^2.4.2",
|
||||
"copy-webpack-plugin": "^5.0.1",
|
||||
"copy-webpack-plugin": "^5.0.3",
|
||||
"cross-env": "^5.1.6",
|
||||
"css-loader": "^2.1.1",
|
||||
"del": "^4.0.0",
|
||||
"del": "^4.1.0",
|
||||
"devtron": "^1.4.0",
|
||||
"electron": "^4.1.1",
|
||||
"electron-builder": "^20.38.5",
|
||||
"electron": "^4.1.5",
|
||||
"electron-builder": "^20.39.0",
|
||||
"electron-devtools-installer": "^2.2.4",
|
||||
"electron-notarize": "^0.0.5",
|
||||
"electron-osx-sign": "^0.4.11",
|
||||
"electron-store": "^2.0.0",
|
||||
"eslint": "^5.15.3",
|
||||
"eslint": "^5.16.0",
|
||||
"eslint-config-standard": "^12.0.0",
|
||||
"eslint-friendly-formatter": "^4.0.1",
|
||||
"eslint-loader": "^2.1.2",
|
||||
"eslint-plugin-html": "^4.0.6",
|
||||
"eslint-plugin-import": "^2.16.0",
|
||||
"eslint-plugin-import": "^2.17.2",
|
||||
"eslint-plugin-node": "^8.0.1",
|
||||
"eslint-plugin-promise": "^4.0.1",
|
||||
"eslint-plugin-promise": "^4.1.1",
|
||||
"eslint-plugin-standard": "^4.0.0",
|
||||
"eslint-plugin-vue": "^5.2.2",
|
||||
"file-loader": "^3.0.1",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"mini-css-extract-plugin": "0.5.0",
|
||||
"mini-css-extract-plugin": "0.6.0",
|
||||
"multispinner": "^0.2.1",
|
||||
"node-loader": "^0.6.0",
|
||||
"node-sass": "^4.10.0",
|
||||
@@ -230,9 +236,9 @@
|
||||
"vue-loader": "^15.7.0",
|
||||
"vue-style-loader": "^4.1.2",
|
||||
"vue-template-compiler": "^2.6.10",
|
||||
"webpack": "^4.29.6",
|
||||
"webpack-cli": "^3.2.3",
|
||||
"webpack-dev-server": "^3.2.1",
|
||||
"webpack": "^4.30.0",
|
||||
"webpack-cli": "^3.3.1",
|
||||
"webpack-dev-server": "^3.3.1",
|
||||
"webpack-hot-middleware": "^2.24.3",
|
||||
"webpack-merge": "^4.2.1"
|
||||
}
|
||||
|
||||
+5
-3
@@ -23,9 +23,11 @@
|
||||
</section>
|
||||
</div>
|
||||
<!-- Set `__static` path to static files in production -->
|
||||
<script>
|
||||
if (process.env.NODE_ENV !== 'development') window.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
|
||||
</script>
|
||||
<% if (!process.browser) { %>
|
||||
<script>
|
||||
if (process.env.NODE_ENV !== 'development') window.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
|
||||
</script>
|
||||
<% } %>
|
||||
|
||||
<!-- webpack builds are automatically injected -->
|
||||
</body>
|
||||
|
||||
+38
-7
@@ -15,6 +15,7 @@ import WindowManager from './ui/WindowManager'
|
||||
import MenuManager from './ui/MenuManager'
|
||||
import TouchBarManager from './ui/TouchBarManager'
|
||||
import TrayManager from './ui/TrayManager'
|
||||
import ThemeManager from './ui/ThemeManager'
|
||||
|
||||
export default class Application extends EventEmitter {
|
||||
constructor () {
|
||||
@@ -30,6 +31,11 @@ export default class Application extends EventEmitter {
|
||||
this.localeManager = setupLocaleManager(this.locale)
|
||||
this.i18n = this.localeManager.getI18n()
|
||||
|
||||
this.menuManager = new MenuManager()
|
||||
this.menuManager.setup(this.locale)
|
||||
|
||||
this.initTouchBarManager()
|
||||
|
||||
this.windowManager = new WindowManager({
|
||||
userConfig: this.configManager.getUserConfig()
|
||||
})
|
||||
@@ -40,13 +46,10 @@ export default class Application extends EventEmitter {
|
||||
})
|
||||
this.startEngine()
|
||||
|
||||
this.menuManager = new MenuManager()
|
||||
this.menuManager.setup(this.locale)
|
||||
|
||||
this.touchBarManager = new TouchBarManager()
|
||||
|
||||
this.trayManager = new TrayManager()
|
||||
|
||||
this.initThemeManager()
|
||||
|
||||
this.energyManager = new EnergyManager()
|
||||
|
||||
this.initUpdaterManager()
|
||||
@@ -84,7 +87,9 @@ export default class Application extends EventEmitter {
|
||||
this.isReady = true
|
||||
this.emit('ready')
|
||||
})
|
||||
this.touchBarManager.setup(page, win)
|
||||
if (is.macOS()) {
|
||||
this.touchBarManager.setup(page, win)
|
||||
}
|
||||
}
|
||||
|
||||
show (page = 'index') {
|
||||
@@ -110,6 +115,7 @@ export default class Application extends EventEmitter {
|
||||
stop () {
|
||||
this.engine.stop()
|
||||
this.energyManager.stopPowerSaveBlocker()
|
||||
this.trayManager.destroy()
|
||||
}
|
||||
|
||||
sendCommand (command, ...args) {
|
||||
@@ -135,6 +141,21 @@ export default class Application extends EventEmitter {
|
||||
})
|
||||
}
|
||||
|
||||
initThemeManager () {
|
||||
this.themeManager = new ThemeManager()
|
||||
this.themeManager.on('system-theme-changed', (theme) => {
|
||||
this.trayManager.changeIconTheme(theme)
|
||||
this.sendCommandToAll('application:system-theme', theme)
|
||||
})
|
||||
}
|
||||
|
||||
initTouchBarManager () {
|
||||
if (!is.macOS()) {
|
||||
return
|
||||
}
|
||||
this.touchBarManager = new TouchBarManager()
|
||||
}
|
||||
|
||||
initProtocolManager () {
|
||||
if (is.dev() || is.mas()) {
|
||||
return
|
||||
@@ -179,7 +200,12 @@ export default class Application extends EventEmitter {
|
||||
if (is.mas()) {
|
||||
return
|
||||
}
|
||||
this.updateManager = new UpdateManager()
|
||||
this.updateManager = new UpdateManager({
|
||||
autoCheck: this.configManager.getUserConfig('auto-check-update')
|
||||
? (new Date().getTime() - this.configManager.getUserConfig('last-check-update-time') > 7 * 24 * 60 * 60 * 1000)
|
||||
: false,
|
||||
setCheckTime: this.configManager
|
||||
})
|
||||
this.handleUpdaterEvents()
|
||||
}
|
||||
|
||||
@@ -252,6 +278,11 @@ export default class Application extends EventEmitter {
|
||||
this.updateManager.check()
|
||||
})
|
||||
|
||||
this.on('application:change-theme', (theme) => {
|
||||
this.themeManager.updateAppAppearance(theme)
|
||||
this.sendCommandToAll('application:theme', theme)
|
||||
})
|
||||
|
||||
this.on('application:change-locale', (locale) => {
|
||||
logger.info('[Motrix] application:change-locale===>', locale)
|
||||
this.localeManager.changeLanguageByLocale(locale)
|
||||
|
||||
+30
-17
@@ -5,7 +5,7 @@ import is from 'electron-is'
|
||||
import ExceptionHandler from './core/ExceptionHandler'
|
||||
import logger from './core/Logger'
|
||||
import Application from './Application'
|
||||
import { parseArgv } from './utils'
|
||||
import { parseArgvAsUrl, parseArgvAsFile } from './utils'
|
||||
|
||||
const EMPTY_STRING = ''
|
||||
|
||||
@@ -33,10 +33,10 @@ export default class Launcher extends EventEmitter {
|
||||
app.quit()
|
||||
} else {
|
||||
app.on('second-instance', (event, argv, workingDirectory) => {
|
||||
logger.warn('second-instance====>', event, argv, workingDirectory)
|
||||
global.application.showPage('index')
|
||||
if (!is.macOS() && argv.length > 1) { // Windows, Linux
|
||||
this.file = parseArgv(argv)
|
||||
this.sendFileToApplication()
|
||||
this.handleAppLaunchArgv(argv)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -68,33 +68,50 @@ export default class Launcher extends EventEmitter {
|
||||
return
|
||||
}
|
||||
app.on('open-url', (event, url) => {
|
||||
logger.info(`[Motrix] open-url path: ${url}`)
|
||||
logger.info(`[Motrix] open-url: ${url}`)
|
||||
event.preventDefault()
|
||||
this.url = url
|
||||
if (this.url && global.application && global.application.isReady) {
|
||||
global.application.handleProtocol(this.url)
|
||||
this.url = EMPTY_STRING
|
||||
}
|
||||
this.sendUrlToApplication()
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* handleOpenFile [WIP]
|
||||
* handleOpenFile
|
||||
* handle open torrent file
|
||||
*/
|
||||
handleOpenFile () {
|
||||
// macOS
|
||||
if (is.macOS()) {
|
||||
app.on('open-file', (event, path) => {
|
||||
logger.info(`[Motrix] open-file path: ${path}`)
|
||||
logger.info(`[Motrix] open-file: ${path}`)
|
||||
event.preventDefault()
|
||||
this.file = path
|
||||
this.sendFileToApplication()
|
||||
})
|
||||
} else if (process.argv.length > 1) { // Windows, Linux
|
||||
this.file = parseArgv(process.argv)
|
||||
this.handleAppLaunchArgv(process.argv)
|
||||
}
|
||||
}
|
||||
|
||||
handleAppLaunchArgv (argv) {
|
||||
const file = parseArgvAsFile(argv)
|
||||
if (file) {
|
||||
this.file = file
|
||||
this.sendFileToApplication()
|
||||
}
|
||||
|
||||
const url = parseArgvAsUrl(argv)
|
||||
if (url) {
|
||||
this.url = url
|
||||
this.sendUrlToApplication()
|
||||
}
|
||||
}
|
||||
|
||||
sendUrlToApplication () {
|
||||
if (this.url && global.application && global.application.isReady) {
|
||||
global.application.handleProtocol(this.url)
|
||||
this.url = EMPTY_STRING
|
||||
}
|
||||
}
|
||||
|
||||
sendFileToApplication () {
|
||||
@@ -111,13 +128,9 @@ export default class Launcher extends EventEmitter {
|
||||
global.application.start('index')
|
||||
|
||||
global.application.on('ready', () => {
|
||||
if (this.url) {
|
||||
global.application.handleProtocol(this.url)
|
||||
}
|
||||
this.sendUrlToApplication()
|
||||
|
||||
if (this.file) {
|
||||
global.application.handleFile(this.file)
|
||||
}
|
||||
this.sendFileToApplication()
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
export default {
|
||||
'task-list': 'application:task-list',
|
||||
'new-task': 'application:new-task',
|
||||
'new-bt-task': 'application:new-bt-task',
|
||||
'pause-all-task': 'application:pause-all-task',
|
||||
'resume-all-task': 'application:resume-all-task',
|
||||
'preferences': 'application:preferences',
|
||||
|
||||
@@ -2,6 +2,7 @@ import { app } from 'electron'
|
||||
import is from 'electron-is'
|
||||
import Store from 'electron-store'
|
||||
import {
|
||||
getDhtPath,
|
||||
getLogPath,
|
||||
getSessionPath,
|
||||
getUserDownloadsPath
|
||||
@@ -21,30 +22,75 @@ export default class ConfigManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* some aria2 conf
|
||||
* Some aria2 conf
|
||||
* https://aria2.github.io/manual/en/html/aria2c.html
|
||||
*
|
||||
* Best bt trackers
|
||||
* https://github.com/ngosang/trackerslist
|
||||
*/
|
||||
initSystemConfig () {
|
||||
this.systemConfig = new Store({
|
||||
name: 'system',
|
||||
defaults: {
|
||||
dir: getUserDownloadsPath(),
|
||||
// 断点续传
|
||||
continue: true,
|
||||
pause: true,
|
||||
split: 16,
|
||||
'all-proxy': '',
|
||||
'allow-overwrite': true,
|
||||
'auto-file-renaming': true,
|
||||
'bt-tracker': [
|
||||
'udp://62.138.0.158:6969/announce',
|
||||
'udp://188.241.58.209:6969/announce',
|
||||
'udp://188.241.58.209:6969/announce',
|
||||
'udp://208.83.20.20:6969/announce',
|
||||
'udp://151.80.120.115:2710/announce',
|
||||
'udp://185.225.17.100:1337/announce',
|
||||
'udp://151.80.120.113:2710/announce',
|
||||
'udp://62.210.88.151:1337/announce',
|
||||
'http://176.113.71.19:6961/announce',
|
||||
'http://104.27.134.253:8080/announce',
|
||||
'udp://5.2.79.219:1337/announce',
|
||||
'udp://91.216.110.52:451/announce',
|
||||
'udp://5.206.58.23:6969/announce',
|
||||
'udp://159.100.245.181:6969/announce',
|
||||
'udp://5.2.79.22:6969/announce',
|
||||
'udp://176.31.241.153:80/announce',
|
||||
'udp://95.211.168.204:2710/announce',
|
||||
'udp://188.246.227.212:80/announce',
|
||||
'udp://51.38.184.185:6969/announce',
|
||||
'udp://51.15.40.114:80/announce',
|
||||
'udp://tracker.coppersurfer.tk:6969/announce',
|
||||
'udp://tracker.open-internet.nl:6969/announce',
|
||||
'udp://tracker.leechers-paradise.org:6969/announce',
|
||||
'udp://exodus.desync.com:6969/announce',
|
||||
'udp://tracker.internetwarriors.net:1337/announce',
|
||||
'udp://9.rarbg.to:2710/announce',
|
||||
'udp://9.rarbg.me:2710/announce',
|
||||
'udp://tracker.opentrackr.org:1337/announce',
|
||||
'http://tracker3.itzmx.com:6961/announce',
|
||||
'http://tracker1.itzmx.com:8080/announce',
|
||||
'udp://open.demonii.si:1337/announce',
|
||||
'udp://tracker.torrent.eu.org:451/announce',
|
||||
'udp://tracker.tiny-vps.com:6969/announce',
|
||||
'udp://tracker.cyberia.is:6969/announce',
|
||||
'udp://denis.stalker.upeer.me:6969/announce',
|
||||
'udp://thetracker.org:80/announce',
|
||||
'udp://bt.xxx-tracker.com:2710/announce',
|
||||
'udp://open.stealth.si:80/announce',
|
||||
'udp://tracker.port443.xyz:6969/announce',
|
||||
'udp://ipv4.tracker.harry.lu:80/announce'
|
||||
].join(','),
|
||||
'continue': true,
|
||||
'dht-file-path': getDhtPath(4),
|
||||
'dht-file-path6': getDhtPath(6),
|
||||
'dir': getUserDownloadsPath(),
|
||||
'max-concurrent-downloads': 5,
|
||||
'max-connection-per-server': is.macOS() ? 64 : 16,
|
||||
'max-download-limit': 0,
|
||||
'max-overall-download-limit': 0,
|
||||
'max-overall-upload-limit': '128K',
|
||||
'min-split-size': '1M',
|
||||
'pause': true,
|
||||
'rpc-listen-port': 16800,
|
||||
'rpc-secret': '',
|
||||
'auto-file-renaming': true,
|
||||
'allow-overwrite': true,
|
||||
'max-concurrent-downloads': 5,
|
||||
// macOS 版本修改过源码自己编译的,Linux 和 Windows 版本 暂未处理
|
||||
'max-connection-per-server': is.macOS() ? 64 : 16,
|
||||
'min-split-size': '1M',
|
||||
'max-overall-download-limit': 0,
|
||||
'max-overall-upload-limit': 0,
|
||||
'max-download-limit': 0,
|
||||
'all-proxy': '',
|
||||
'split': 16,
|
||||
'user-agent': 'Transmission/2.94'
|
||||
}
|
||||
})
|
||||
@@ -53,18 +99,28 @@ export default class ConfigManager {
|
||||
initUserConfig () {
|
||||
this.userConfig = new Store({
|
||||
name: 'user',
|
||||
// Schema need electron-store upgrade to 3.x.x,
|
||||
// but it will cause the application build to fail.
|
||||
// schema: {
|
||||
// theme: {
|
||||
// type: 'string',
|
||||
// enum: ['auto', 'light', 'dark']
|
||||
// }
|
||||
// },
|
||||
defaults: {
|
||||
'resume-all-when-app-launched': false,
|
||||
'task-notification': true,
|
||||
'hide-app-menu': is.windows() || is.linux(),
|
||||
'new-task-show-downloading': true,
|
||||
'auto-check-for-updates': false,
|
||||
'update-channel': 'latest',
|
||||
'use-proxy': false,
|
||||
'all-proxy-backup': '',
|
||||
'auto-check-update': false,
|
||||
'hide-app-menu': is.windows() || is.linux(),
|
||||
'last-check-update-time': 0,
|
||||
'locale': app.getLocale(),
|
||||
'log-path': getLogPath(),
|
||||
'new-task-show-downloading': true,
|
||||
'resume-all-when-app-launched': false,
|
||||
'session-path': getSessionPath(),
|
||||
'locale': app.getLocale()
|
||||
'task-notification': true,
|
||||
'theme': 'auto',
|
||||
'update-channel': 'latest',
|
||||
'use-proxy': false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -102,6 +102,14 @@ export default class Engine {
|
||||
// })
|
||||
}
|
||||
|
||||
isRunning (pid) {
|
||||
try {
|
||||
return process.kill(pid, 0)
|
||||
} catch (e) {
|
||||
return e.code === 'EPERM'
|
||||
}
|
||||
}
|
||||
|
||||
stop () {
|
||||
const { pid } = this.instance.child
|
||||
try {
|
||||
@@ -116,7 +124,7 @@ export default class Engine {
|
||||
|
||||
forceStop (pid) {
|
||||
try {
|
||||
if (pid) {
|
||||
if (pid && this.isRunning(pid)) {
|
||||
process.kill(pid)
|
||||
}
|
||||
} catch (err) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import is from 'electron-is'
|
||||
import logger from 'electron-log'
|
||||
|
||||
logger.transports.file.level = is.production() ? 'warn' : 'info'
|
||||
logger.transports.file.level = is.production() ? 'warn' : 'silly'
|
||||
logger.info('Logger init')
|
||||
logger.warn('[Motrix] Logger init')
|
||||
|
||||
|
||||
@@ -13,17 +13,43 @@ export default class ProtocolManager extends EventEmitter {
|
||||
}
|
||||
|
||||
init () {
|
||||
// package.json:build.mac.protocols[].schemes[]
|
||||
// package.json:build.protocols[].schemes[]
|
||||
if (!app.isDefaultProtocolClient('mo')) {
|
||||
app.setAsDefaultProtocolClient('mo')
|
||||
}
|
||||
if (!app.isDefaultProtocolClient('motrix')) {
|
||||
app.setAsDefaultProtocolClient('motrix')
|
||||
}
|
||||
if (!app.isDefaultProtocolClient('magnet')) {
|
||||
app.setAsDefaultProtocolClient('magnet')
|
||||
}
|
||||
}
|
||||
|
||||
handle (url) {
|
||||
logger.info(`[Motrix] protocol url: ${url}`)
|
||||
|
||||
if (url.toLowerCase().startsWith('magnet:')) {
|
||||
return this.handleMagnetProtocol(url)
|
||||
}
|
||||
|
||||
if (
|
||||
url.toLowerCase().startsWith('mo:') ||
|
||||
url.toLowerCase().startsWith('motrix:')
|
||||
) {
|
||||
return this.handleMoProtocol(url)
|
||||
}
|
||||
}
|
||||
|
||||
handleMagnetProtocol (url) {
|
||||
if (!url) {
|
||||
return
|
||||
}
|
||||
logger.error(`[Motrix] handleMagnetProtocol url: ${url}`)
|
||||
|
||||
global.application.sendCommandToAll('application:new-task', 'uri', url)
|
||||
}
|
||||
|
||||
handleMoProtocol (url) {
|
||||
const parsed = new URL(url)
|
||||
const { host } = parsed
|
||||
logger.info('[Motrix] protocol parsed:', parsed, host)
|
||||
|
||||
@@ -19,6 +19,10 @@ export default class UpdateManager extends EventEmitter {
|
||||
this.updater = autoUpdater
|
||||
this.updater.autoDownload = false
|
||||
this.updater.logger = logger
|
||||
this.autoCheckData = {
|
||||
checkEnable: this.options.autoCheck,
|
||||
userCheck: false
|
||||
}
|
||||
this.init()
|
||||
}
|
||||
|
||||
@@ -36,9 +40,17 @@ export default class UpdateManager extends EventEmitter {
|
||||
this.updater.on('download-progress', this.updateDownloadProgress.bind(this))
|
||||
this.updater.on('update-downloaded', this.updateDownloaded.bind(this))
|
||||
this.updater.on('error', this.updateError.bind(this))
|
||||
|
||||
if (this.autoCheckData.checkEnable) {
|
||||
this.autoCheckData.userCheck = false
|
||||
this.options.setCheckTime.setUserConfig('last-check-update-time', new Date().getTime())
|
||||
this.updater.checkForUpdates()
|
||||
}
|
||||
}
|
||||
|
||||
check () {
|
||||
this.options.setCheckTime.setUserConfig('last-check-update-time', new Date().getTime())
|
||||
this.autoCheckData.userCheck = true
|
||||
this.updater.checkForUpdates()
|
||||
}
|
||||
|
||||
@@ -63,10 +75,12 @@ export default class UpdateManager extends EventEmitter {
|
||||
|
||||
updateNotAvailable (event, info) {
|
||||
this.emit('update-not-available', info)
|
||||
dialog.showMessageBox({
|
||||
title: this.i18n.t('app.check-for-updates-title'),
|
||||
message: this.i18n.t('app.update-not-available-message')
|
||||
})
|
||||
if (this.autoCheckData.userCheck) {
|
||||
dialog.showMessageBox({
|
||||
title: this.i18n.t('app.check-for-updates-title'),
|
||||
message: this.i18n.t('app.update-not-available-message')
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
import { EventEmitter } from 'events'
|
||||
import { systemPreferences } from 'electron'
|
||||
import is from 'electron-is'
|
||||
import { LIGHT_THEME, DARK_THEME } from '@shared/constants'
|
||||
|
||||
export default class ThemeManager extends EventEmitter {
|
||||
constructor (options = {}) {
|
||||
super()
|
||||
|
||||
this.init()
|
||||
}
|
||||
|
||||
init () {
|
||||
this.handleEvents()
|
||||
}
|
||||
|
||||
getSystemTheme () {
|
||||
let result = LIGHT_THEME
|
||||
if (!is.macOS()) {
|
||||
return result
|
||||
}
|
||||
result = systemPreferences.isDarkMode() ? DARK_THEME : LIGHT_THEME
|
||||
return result
|
||||
}
|
||||
|
||||
handleEvents () {
|
||||
if (!is.macOS()) {
|
||||
return
|
||||
}
|
||||
systemPreferences.subscribeNotification(
|
||||
'AppleInterfaceThemeChangedNotification',
|
||||
() => {
|
||||
const theme = this.getSystemTheme()
|
||||
this.updateAppAppearance(theme)
|
||||
this.emit('system-theme-changed', theme)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
updateAppAppearance (theme) {
|
||||
if (!is.macOS() || theme !== LIGHT_THEME || theme !== DARK_THEME) {
|
||||
return
|
||||
}
|
||||
systemPreferences.setAppLevelAppearance(theme)
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
import { EventEmitter } from 'events'
|
||||
import { join } from 'path'
|
||||
import { Tray, Menu } from 'electron'
|
||||
import { Tray, Menu, systemPreferences } from 'electron'
|
||||
import is from 'electron-is'
|
||||
import { translateTemplate } from '../utils/menu'
|
||||
import { getI18n } from '@/ui/Locale'
|
||||
import { LIGHT_THEME, DARK_THEME } from '@shared/constants'
|
||||
|
||||
let tray = null
|
||||
|
||||
@@ -23,10 +24,11 @@ export default class TrayManager extends EventEmitter {
|
||||
|
||||
load () {
|
||||
this.template = require(`../menus/tray.json`)
|
||||
const theme = systemPreferences.isDarkMode() ? DARK_THEME : LIGHT_THEME
|
||||
|
||||
if (is.macOS()) {
|
||||
this.normalIcon = join(__static, './mo-tray-normal.png')
|
||||
this.activeIcon = join(__static, './mo-tray-active.png')
|
||||
this.normalIcon = join(__static, `./mo-tray-${theme}-normal.png`)
|
||||
this.activeIcon = join(__static, `./mo-tray-${theme}-active.png`)
|
||||
} else {
|
||||
this.normalIcon = join(__static, './mo-tray-colorful-normal.png')
|
||||
this.activeIcon = join(__static, './mo-tray-colorful-active.png')
|
||||
@@ -91,7 +93,27 @@ export default class TrayManager extends EventEmitter {
|
||||
}
|
||||
|
||||
updateStatus (status) {
|
||||
const icon = status ? this.activeIcon : this.normalIcon
|
||||
this.status = status
|
||||
this.updateIcon()
|
||||
}
|
||||
|
||||
updateIcon () {
|
||||
const icon = this.status ? this.activeIcon : this.normalIcon
|
||||
tray.setImage(icon)
|
||||
}
|
||||
|
||||
changeIconTheme (theme = LIGHT_THEME) {
|
||||
if (!is.macOS()) {
|
||||
return
|
||||
}
|
||||
|
||||
this.normalIcon = join(__static, `./mo-tray-${theme}-normal.png`)
|
||||
this.activeIcon = join(__static, `./mo-tray-${theme}-active.png`)
|
||||
|
||||
this.updateIcon()
|
||||
}
|
||||
|
||||
destroy () {
|
||||
tray.destroy()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { join } from 'path'
|
||||
import { EventEmitter } from 'events'
|
||||
import { app, shell, BrowserWindow } from 'electron'
|
||||
import { app, shell, screen, BrowserWindow } from 'electron'
|
||||
import is from 'electron-is'
|
||||
import pageConfig from '../configs/page'
|
||||
import logger from '../core/Logger'
|
||||
@@ -10,7 +10,10 @@ const defaultBrowserOptions = {
|
||||
useContentSize: true,
|
||||
show: false,
|
||||
width: 1024,
|
||||
height: 768
|
||||
height: 768,
|
||||
webPreferences: {
|
||||
nodeIntegration: true
|
||||
}
|
||||
}
|
||||
|
||||
export default class WindowManager extends EventEmitter {
|
||||
@@ -38,6 +41,13 @@ export default class WindowManager extends EventEmitter {
|
||||
result.attrs.frame = false
|
||||
}
|
||||
|
||||
// Optimized for small screen users
|
||||
const { width, height } = screen.getPrimaryDisplay().workAreaSize
|
||||
const widthScale = width >= 1280 ? 1 : 0.875
|
||||
const heightScale = height >= 800 ? 1 : 0.875
|
||||
result.attrs.width *= widthScale
|
||||
result.attrs.height *= heightScale
|
||||
|
||||
// fix AppImage Dock Icon Missing
|
||||
// https://github.com/AppImage/AppImageKit/wiki/Bundling-Electron-apps
|
||||
if (is.linux()) {
|
||||
|
||||
+25
-1
@@ -9,6 +9,11 @@ export function getLogPath () {
|
||||
return logger.transports.file.file
|
||||
}
|
||||
|
||||
export function getDhtPath (protocol) {
|
||||
const name = protocol === 6 ? 'dht6.dat' : 'dht.dat'
|
||||
return resolve(app.getPath('userData'), `./${name}`)
|
||||
}
|
||||
|
||||
export function getSessionPath () {
|
||||
return resolve(app.getPath('userData'), './download.session')
|
||||
}
|
||||
@@ -60,11 +65,30 @@ export function moveAppToApplicationsFolder (errorMsg = '') {
|
||||
})
|
||||
}
|
||||
|
||||
export function parseArgvAsUrl (argv) {
|
||||
let arg = argv[1]
|
||||
if (!arg) {
|
||||
return
|
||||
}
|
||||
|
||||
if (
|
||||
arg.toLowerCase().startsWith('mo:') ||
|
||||
arg.toLowerCase().startsWith('motrix:') ||
|
||||
arg.toLowerCase().startsWith('http:') ||
|
||||
arg.toLowerCase().startsWith('https:') ||
|
||||
arg.toLowerCase().startsWith('ftp:') ||
|
||||
arg.toLowerCase().startsWith('magnet:') ||
|
||||
arg.toLowerCase().startsWith('thunder:')
|
||||
) {
|
||||
return arg
|
||||
}
|
||||
}
|
||||
|
||||
export function isDirectory (path) {
|
||||
return existsSync(path) && lstatSync(path).isDirectory()
|
||||
}
|
||||
|
||||
export function parseArgv (argv) {
|
||||
export function parseArgvAsFile (argv) {
|
||||
let arg = argv[1]
|
||||
if (!arg || isDirectory(arg)) {
|
||||
return
|
||||
|
||||
@@ -9,6 +9,10 @@ import {
|
||||
changeKeysToCamelCase,
|
||||
changeKeysToKebabCase
|
||||
} from '@shared/utils'
|
||||
import {
|
||||
BEST_TRACKERS_URL,
|
||||
BEST_TRACKERS_IP_URL
|
||||
} from '@shared/constants'
|
||||
|
||||
const application = remote.getGlobal('application')
|
||||
|
||||
@@ -268,4 +272,17 @@ export default class Api {
|
||||
stopPowerSaveBlocker () {
|
||||
application.energyManager.stopPowerSaveBlocker()
|
||||
}
|
||||
|
||||
fetchBtTrackerFromGitHub () {
|
||||
const now = Date.now()
|
||||
const promises = [
|
||||
fetch(`${BEST_TRACKERS_IP_URL}?t=${now}`).then((res) => res.text()),
|
||||
fetch(`${BEST_TRACKERS_URL}?t=${now}`).then((res) => res.text())
|
||||
]
|
||||
|
||||
return Promise.all(promises).then((values) => {
|
||||
let result = values.join('\r\n').replace(/^\s*[\r\n]/gm, '')
|
||||
return result
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 3.4 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
@@ -49,13 +49,13 @@
|
||||
<style lang="scss">
|
||||
.app-info {
|
||||
position: relative;
|
||||
padding: 8px 0;
|
||||
margin: 8px 0;
|
||||
.app-version span {
|
||||
display: inline-block;
|
||||
vertical-align: bottom;
|
||||
font-size: $--font-size-large;
|
||||
margin-left: 20px;
|
||||
color: $--color-text-regular;
|
||||
color: $--app-version-color;
|
||||
line-height: 18px;
|
||||
}
|
||||
.app-icon {
|
||||
@@ -72,11 +72,11 @@
|
||||
h4 {
|
||||
font-size: $--font-size-base;
|
||||
font-weight: $--font-weight-secondary;
|
||||
color: $--color-text-regular;
|
||||
color: $--app-engine-title-color;
|
||||
}
|
||||
ul {
|
||||
font-size: 12px;
|
||||
color: $--color-text-secondary;
|
||||
color: $--app-engine-info-color;
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
line-height: 20px;
|
||||
|
||||
@@ -30,15 +30,12 @@
|
||||
width: 100%;
|
||||
font-size: $--font-size-small;
|
||||
a {
|
||||
color: $--color-text-regular;
|
||||
color: $--app-copyright-color;
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
.copyright-left {
|
||||
text-align: left;
|
||||
a {
|
||||
color: $--color-text-regular;
|
||||
}
|
||||
}
|
||||
|
||||
.copyright-right {
|
||||
|
||||
@@ -9,14 +9,29 @@ import { buildFileList } from '@shared/utils'
|
||||
const commands = new CommandManager()
|
||||
const i18n = getLocaleManager().getI18n()
|
||||
|
||||
function updateSystemTheme (theme) {
|
||||
store.dispatch('app/updateSystemTheme', theme)
|
||||
}
|
||||
|
||||
function updateTheme (theme) {
|
||||
store.dispatch('preference/changeThemeConfig', theme)
|
||||
}
|
||||
|
||||
function showAboutPanel () {
|
||||
store.dispatch('app/showAboutPanel')
|
||||
}
|
||||
|
||||
function showAddTask (taskType = 'uri') {
|
||||
function showAddTask (taskType = 'uri', task = '') {
|
||||
if (taskType === 'uri' && task) {
|
||||
store.dispatch('app/updateAddTaskUrl', task)
|
||||
}
|
||||
store.dispatch('app/showAddTaskDialog', taskType)
|
||||
}
|
||||
|
||||
function showAddBtTask () {
|
||||
store.dispatch('app/showAddTaskDialog', 'torrent')
|
||||
}
|
||||
|
||||
function showAddBtTaskWithFile (fileName, base64Data = '') {
|
||||
const blob = base64StringToBlob(base64Data, 'application/x-bittorrent')
|
||||
const file = new File([blob], fileName, { type: 'application/x-bittorrent' })
|
||||
@@ -67,9 +82,11 @@ function resumeAllTask () {
|
||||
store.dispatch('task/resumeAllTask')
|
||||
}
|
||||
|
||||
commands.register('application:system-theme', updateSystemTheme)
|
||||
commands.register('application:theme', updateTheme)
|
||||
commands.register('application:about', showAboutPanel)
|
||||
commands.register('application:new-task', showAddTask)
|
||||
commands.register('application:new-bt-task', showAddTask)
|
||||
commands.register('application:new-bt-task', showAddBtTask)
|
||||
commands.register('application:new-bt-task-with-file', showAddBtTaskWithFile)
|
||||
commands.register('application:task-list', navigateTaskList)
|
||||
commands.register('application:preferences', navigatePreferences)
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
import Icon from '@/components/Icons/Icon'
|
||||
|
||||
Icon.register({
|
||||
'sync': {
|
||||
'width': 24,
|
||||
'height': 24,
|
||||
'raw': `<g stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
|
||||
<path fill="none" stroke-miterlimit="10" d="M3,14V4 c0-0.552,0.448-1,1-1h16c0.552,0,1,0.448,1,1v6"></path>
|
||||
<path fill="none" stroke="#111111" stroke-miterlimit="10" d="M10,18H1v0 c0,1.657,1.343,3,3,3h6"></path>
|
||||
<path data-cap="butt" data-color="color-2" fill="none" stroke-miterlimit="10" d="M14.126,17 c0.444-1.725,2.01-3,3.874-3c1.48,0,2.772,0.804,3.464,1.999"></path>
|
||||
<polygon data-color="color-2" data-stroke="none" points="23.22,13.649 22.792,18 18.522,17.061 " stroke-linejoin="miter" stroke-linecap="square" stroke="none"></polygon>
|
||||
<path data-cap="butt" data-color="color-2" fill="none" stroke-miterlimit="10" d="M21.874,20 c-0.444,1.725-2.01,3-3.874,3c-1.48,0-2.772-0.804-3.464-1.999"></path>
|
||||
<polygon data-color="color-2" data-stroke="none" points="12.78,23.351 13.208,19 17.478,19.939 " stroke-linejoin="miter" stroke-linecap="square" stroke="none"></polygon>
|
||||
</g>`,
|
||||
'g': {
|
||||
'stroke': 'currentColor',
|
||||
'stroke-linecap': 'round',
|
||||
'stroke-linejoin': 'round',
|
||||
'stroke-width': '2'
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -2,7 +2,7 @@
|
||||
<div class="logo">
|
||||
<a target="_blank" href="https://motrix.app/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" :width="width" :height="height" viewBox="0 0 62 14">
|
||||
<g :fill="fill" fill-rule="evenodd">
|
||||
<g fill-rule="evenodd">
|
||||
<path d="M40,2 C40,1 41,1.53477231e-14 42,1.53477231e-14 C42,1.53477231e-14 60,1.27897692e-14 60,1.53477231e-14 C61,1.27897692e-14 62,1 62,2 C62,2 62,12 62,12 C62,13 61,14 60,14 C60,14 42,14 42,14 C41,14 40,13 40,12 C40,12 40,2 40,2 Z M44,3.5 C44,3.5 44,10.5 44,10.5 C44,11 44.5,11.5 45,11.5 C45,11.5 57,11.5 57,11.5 C57.5,11.5 58,11 58,10.5 C58,10.5 58,3.5 58,3.5 C58,3 57.5,2.5 57,2.5 C57,2.5 45,2.5 45,2.5 C44.5,2.5 44,3 44,3.5 Z"/>
|
||||
<rect width="4" height="2" x="32" y="6" rx=".5"/>
|
||||
<path d="M2,0 L26,0 C27,-2.04003481e-15 28,1 28,2 L28,14 L24,14 L24,3.5 C24,3 23.5,2.5 23,2.5 L16,2.5 L16,14 L12,14 L12,2.5 L5,2.5 C4.5,2.5 4,3 4,3.5 L4,14 L0,14 L0,2 C0,1 1,-2.04003481e-15 2,0 Z"/>
|
||||
@@ -23,10 +23,6 @@
|
||||
height: {
|
||||
type: Number,
|
||||
default: 14
|
||||
},
|
||||
fill: {
|
||||
type: String,
|
||||
default: '#4D515A'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -43,6 +39,10 @@
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
font-size: 0;
|
||||
color: $--app-logo-color;
|
||||
}
|
||||
svg {
|
||||
fill: currentColor;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<el-container id="container">
|
||||
<mo-aside />
|
||||
<router-view></router-view>
|
||||
<router-view />
|
||||
<mo-speedometer />
|
||||
<mo-add-task :visible="addTaskVisible" :type="addTaskType" />
|
||||
<mo-about-panel :visible="aboutPanelVisible" />
|
||||
@@ -53,25 +53,4 @@
|
||||
right: 36px;
|
||||
bottom: 24px;
|
||||
}
|
||||
.panel {
|
||||
background: $--panel-background;
|
||||
.panel-header {
|
||||
position: relative;
|
||||
padding: 44px 0 12px;
|
||||
margin: 0 36px;
|
||||
border-bottom: 2px solid $--panel-border-color;
|
||||
h4 {
|
||||
margin: 0;
|
||||
color: $--panel-title-color;
|
||||
font-size: 16px;
|
||||
font-weight: normal;
|
||||
line-height: 24px;
|
||||
}
|
||||
}
|
||||
.panel-content {
|
||||
position: relative;
|
||||
padding: 16px 36px 24px;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
const [{ gid }] = event
|
||||
this.fetchTaskItem({ gid })
|
||||
.then((task) => {
|
||||
this.showTaskCompleteNotify(task)
|
||||
this.handleDownloadComplete(task, false)
|
||||
})
|
||||
},
|
||||
onBtDownloadComplete: function (event) {
|
||||
@@ -116,26 +116,39 @@
|
||||
const [{ gid }] = event
|
||||
this.fetchTaskItem({ gid })
|
||||
.then((task) => {
|
||||
this.showTaskCompleteNotify(task)
|
||||
this.handleDownloadComplete(task, true)
|
||||
})
|
||||
},
|
||||
showTaskCompleteNotify: function (task) {
|
||||
if (!this.taskNotification) {
|
||||
return
|
||||
}
|
||||
|
||||
const taskName = getTaskName(task)
|
||||
handleDownloadComplete: function (task, isBT) {
|
||||
const path = getTaskFullPath(task)
|
||||
|
||||
addToRecentTask(task)
|
||||
openDownloadDock(path)
|
||||
|
||||
const message = this.$t('task.download-complete-message', { taskName })
|
||||
this.$msg.success(message)
|
||||
this.showTaskCompleteNotify(task, isBT, path)
|
||||
},
|
||||
showTaskCompleteNotify: function (task, isBT, path) {
|
||||
const taskName = getTaskName(task)
|
||||
const message = isBT
|
||||
? this.$t('task.bt-download-complete-message', { taskName })
|
||||
: this.$t('task.download-complete-message', { taskName })
|
||||
const tips = isBT
|
||||
? '\n' + this.$t('task.bt-download-complete-tips')
|
||||
: ''
|
||||
|
||||
this.$msg.success(`${message}${tips}`)
|
||||
|
||||
if (!this.taskNotification) {
|
||||
return
|
||||
}
|
||||
|
||||
/* eslint-disable no-new */
|
||||
const notify = new Notification(this.$t('task.download-complete-notify'), {
|
||||
body: taskName
|
||||
const notifyMessage = isBT
|
||||
? this.$t('task.bt-download-complete-notify')
|
||||
: this.$t('task.download-complete-notify')
|
||||
|
||||
const notify = new Notification(notifyMessage, {
|
||||
body: `${taskName}${tips}`
|
||||
})
|
||||
notify.onclick = () => {
|
||||
showItemInFolder(path, {
|
||||
@@ -144,15 +157,15 @@
|
||||
}
|
||||
},
|
||||
showTaskErrorNotify: function (task) {
|
||||
if (!this.taskNotification) {
|
||||
return
|
||||
}
|
||||
|
||||
const taskName = getTaskName(task)
|
||||
|
||||
const message = this.$t('task.download-fail-message', { taskName })
|
||||
this.$msg.success(message)
|
||||
|
||||
if (!this.taskNotification) {
|
||||
return
|
||||
}
|
||||
|
||||
/* eslint-disable no-new */
|
||||
new Notification(this.$t('task.download-fail-notify'), {
|
||||
body: taskName
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<i @click.stop="onFolderClick">
|
||||
<mo-icon name="folder" width="14" height="14" />
|
||||
<mo-icon name="folder" width="10" height="10" />
|
||||
</i>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<li @click="handleMaximize">
|
||||
<mo-icon name="win-maximize" width="12" height="12" />
|
||||
</li>
|
||||
<li @click="handleClose">
|
||||
<li @click="handleClose" class="win-close-btn">
|
||||
<mo-icon name="win-close" width="12" height="12" />
|
||||
</li>
|
||||
</ul>
|
||||
@@ -77,9 +77,14 @@
|
||||
display: inline-block;
|
||||
padding: 5px 10px;
|
||||
margin: 0 5px;
|
||||
color: $--titlebar-actions-color;
|
||||
&:hover {
|
||||
background-color: $--titlebar-actions-active-background;
|
||||
}
|
||||
&.win-close-btn:hover {
|
||||
color: $--titlebar-close-active-color;
|
||||
background-color: $--titlebar-close-active-background;
|
||||
}
|
||||
}
|
||||
}
|
||||
&:hover {
|
||||
|
||||
@@ -6,6 +6,7 @@ import {
|
||||
getTaskFullPath,
|
||||
bytesToSize
|
||||
} from '@shared/utils'
|
||||
import { LIGHT_THEME, DARK_THEME } from '@shared/constants'
|
||||
|
||||
const remote = is.renderer() ? require('electron').remote : {}
|
||||
|
||||
@@ -122,3 +123,12 @@ export function clearRecentTasks () {
|
||||
}
|
||||
remote.app.clearRecentDocuments()
|
||||
}
|
||||
|
||||
export function getSystemTheme () {
|
||||
let result = LIGHT_THEME
|
||||
if (!is.macOS()) {
|
||||
return result
|
||||
}
|
||||
result = remote.systemPreferences.isDarkMode() ? DARK_THEME : LIGHT_THEME
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -11,7 +11,20 @@
|
||||
size="mini"
|
||||
:model="form"
|
||||
:rules="rules">
|
||||
<el-form-item :label="`${$t('preferences.ui')}: `" :label-width="formLabelWidth">
|
||||
<el-form-item :label="`${$t('preferences.appearance')}: `" :label-width="formLabelWidth">
|
||||
<el-col class="form-item-sub" :span="24">
|
||||
<mo-theme-switcher
|
||||
v-model="form.theme"
|
||||
@change="handleThemeChange"
|
||||
/>
|
||||
</el-col>
|
||||
<el-col v-if="showHideAppMenuOption" class="form-item-sub" :span="16">
|
||||
<el-checkbox v-model="form.hideAppMenu">
|
||||
{{ $t('preferences.hide-app-menu') }}
|
||||
</el-checkbox>
|
||||
</el-col>
|
||||
</el-form-item>
|
||||
<el-form-item :label="`${$t('preferences.language')}: `" :label-width="formLabelWidth">
|
||||
<el-col class="form-item-sub" :span="16">
|
||||
<el-select
|
||||
v-model="form.locale"
|
||||
@@ -25,11 +38,6 @@
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-col>
|
||||
<el-col v-if="showHideAppMenuOption" class="form-item-sub" :span="16">
|
||||
<el-checkbox v-model="form.hideAppMenu">
|
||||
{{ $t('preferences.hide-app-menu') }}
|
||||
</el-checkbox>
|
||||
</el-col>
|
||||
</el-form-item>
|
||||
<el-form-item :label="`${$t('preferences.proxy')}: `" :label-width="formLabelWidth">
|
||||
<el-switch
|
||||
@@ -48,6 +56,45 @@
|
||||
</el-input>
|
||||
</el-col>
|
||||
</el-form-item>
|
||||
<el-form-item :label="`${$t('preferences.bt-tracker')}: `" :label-width="formLabelWidth">
|
||||
<div class="bt-tracker">
|
||||
<el-input
|
||||
type="textarea"
|
||||
:autosize="{ minRows: 3, maxRows: 5 }"
|
||||
auto-complete="off"
|
||||
:placeholder="`${$t('preferences.bt-tracker-input-tips')}`"
|
||||
v-model="form.btTracker">
|
||||
</el-input>
|
||||
<div class="sync-tracker">
|
||||
<el-tooltip
|
||||
class="item"
|
||||
effect="dark"
|
||||
:content="$t('preferences.sync-tracker-tips')"
|
||||
placement="bottom"
|
||||
>
|
||||
<el-button
|
||||
@click="syncTrackerFromGitHub"
|
||||
>
|
||||
<mo-icon
|
||||
name="refresh"
|
||||
width="12"
|
||||
height="12"
|
||||
:spin="true"
|
||||
v-if="isSyncTracker"
|
||||
/>
|
||||
<mo-icon name="sync" width="12" height="12" v-else />
|
||||
</el-button>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="el-form-item__info" style="margin-top: 8px;">
|
||||
{{ $t('preferences.bt-tracker-tips') }}
|
||||
<a target="_blank" href="https://github.com/ngosang/trackerslist" rel="noopener noreferrer">
|
||||
https://github.com/ngosang/trackerslist
|
||||
<mo-icon name="link" width="12" height="12" />
|
||||
</a>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="`${$t('preferences.developer')}: `" :label-width="formLabelWidth">
|
||||
<el-col class="form-item-sub" :span="24">
|
||||
{{ $t('preferences.mock-user-agent') }}
|
||||
@@ -102,26 +149,36 @@
|
||||
<script>
|
||||
import is from 'electron-is'
|
||||
import { mapState } from 'vuex'
|
||||
import ThemeSwitcher from '@/components/Preference/ThemeSwitcher'
|
||||
import ShowInFolder from '@/components/Native/ShowInFolder'
|
||||
import userAgentMap from '@shared/ua'
|
||||
import { availableLanguages, getLanguage } from '@shared/locales'
|
||||
import { getLocaleManager } from '@/components/Locale'
|
||||
import {
|
||||
convertToTextRows
|
||||
} from '@shared/utils'
|
||||
import '@/components/Icons/sync'
|
||||
import '@/components/Icons/refresh'
|
||||
|
||||
const initialForm = (config) => {
|
||||
const {
|
||||
locale,
|
||||
hideAppMenu,
|
||||
useProxy,
|
||||
allProxy,
|
||||
allProxyBackup,
|
||||
btTracker,
|
||||
hideAppMenu,
|
||||
locale,
|
||||
theme,
|
||||
useProxy,
|
||||
userAgent
|
||||
} = config
|
||||
const result = {
|
||||
locale,
|
||||
hideAppMenu,
|
||||
useProxy,
|
||||
allProxy,
|
||||
allProxyBackup,
|
||||
btTracker: convertToTextRows(btTracker),
|
||||
hideAppMenu,
|
||||
locale,
|
||||
theme,
|
||||
useProxy,
|
||||
userAgent
|
||||
}
|
||||
return result
|
||||
@@ -130,12 +187,14 @@
|
||||
export default {
|
||||
name: 'mo-preference-advanced',
|
||||
components: {
|
||||
[ThemeSwitcher.name]: ThemeSwitcher,
|
||||
[ShowInFolder.name]: ShowInFolder
|
||||
},
|
||||
data: function () {
|
||||
return {
|
||||
formLabelWidth: '23%',
|
||||
form: initialForm(this.$store.state.preference.config),
|
||||
isSyncTracker: false,
|
||||
rules: {},
|
||||
color: '#c00',
|
||||
locales: availableLanguages
|
||||
@@ -163,6 +222,21 @@
|
||||
getLocaleManager().changeLanguage(lng)
|
||||
this.$electron.ipcRenderer.send('command', 'application:change-locale', lng)
|
||||
},
|
||||
handleThemeChange (theme) {
|
||||
this.form.theme = theme
|
||||
this.$electron.ipcRenderer.send('command', 'application:change-theme', theme)
|
||||
},
|
||||
syncTrackerFromGitHub () {
|
||||
this.isSyncTracker = true
|
||||
this.$store.dispatch('preference/fetchBtTracker')
|
||||
.then((data) => {
|
||||
console.log('syncTrackerFromGitHub data====>', data)
|
||||
this.form.btTracker = data
|
||||
})
|
||||
.finally(() => {
|
||||
this.isSyncTracker = false
|
||||
})
|
||||
},
|
||||
onUseProxyChange (flag) {
|
||||
this.form.allProxy = flag ? this.form.allProxyBackup : ''
|
||||
},
|
||||
@@ -211,6 +285,14 @@
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.bt-tracker {
|
||||
position: relative;
|
||||
.sync-tracker {
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
right: 8px;
|
||||
}
|
||||
}
|
||||
.ua-group {
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
@@ -12,9 +12,20 @@
|
||||
:model="form"
|
||||
:rules="rules">
|
||||
<el-form-item :label="`${$t('preferences.startup')}: `" :label-width="formLabelWidth">
|
||||
<el-checkbox v-model="form.resumeAllWhenAppLaunched">
|
||||
{{ $t('preferences.auto-resume-all') }}
|
||||
</el-checkbox>
|
||||
<el-col class="form-item-sub" :span="24">
|
||||
<el-checkbox v-model="form.resumeAllWhenAppLaunched">
|
||||
{{ $t('preferences.auto-resume-all') }}
|
||||
</el-checkbox>
|
||||
</el-col>
|
||||
<el-col class="form-item-sub" :span="24">
|
||||
<el-checkbox v-model="form.autoCheckUpdate">
|
||||
{{ $t('preferences.auto-check-update') }}
|
||||
</el-checkbox>
|
||||
<div class="el-form-item__info" style="margin-top: 8px;" v-if="form.lastCheckUpdateTime !== 0">
|
||||
{{ $t('preferences.last-check-update-time') + ': ' + (form.lastCheckUpdateTime !== 0 ? new
|
||||
Date(form.lastCheckUpdateTime).toLocaleString() : new Date().toLocaleString()) }}
|
||||
</div>
|
||||
</el-col>
|
||||
</el-form-item>
|
||||
<el-form-item :label="`${$t('preferences.default-dir')}: `" :label-width="formLabelWidth">
|
||||
<el-input placeholder="" v-model="downloadDir" :readonly="isMas()">
|
||||
@@ -25,7 +36,7 @@
|
||||
/>
|
||||
</el-input>
|
||||
<div class="el-form-item__info" v-if="isMas()" style="margin-top: 8px;">
|
||||
{{ $t('preferences.mas-default-dir-tip') }}
|
||||
{{ $t('preferences.mas-default-dir-tips') }}
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="`${$t('preferences.task-manage')}: `" :label-width="formLabelWidth">
|
||||
@@ -88,7 +99,9 @@
|
||||
maxConcurrentDownloads,
|
||||
maxConnectionPerServer,
|
||||
taskNotification,
|
||||
newTaskShowDownloading
|
||||
autoCheckUpdate,
|
||||
newTaskShowDownloading,
|
||||
lastCheckUpdateTime
|
||||
} = config
|
||||
const result = {
|
||||
dir,
|
||||
@@ -98,7 +111,9 @@
|
||||
maxConcurrentDownloads,
|
||||
maxConnectionPerServer,
|
||||
taskNotification,
|
||||
newTaskShowDownloading
|
||||
autoCheckUpdate,
|
||||
newTaskShowDownloading,
|
||||
lastCheckUpdateTime
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<template>
|
||||
<el-container class="content panel" direction="horizontal">
|
||||
<el-aside width="200px" class="subnav">
|
||||
<router-view name="subnav"></router-view>
|
||||
<router-view name="subnav" />
|
||||
</el-aside>
|
||||
<router-view name="form"></router-view>
|
||||
<router-view name="form" />
|
||||
</el-container>
|
||||
</template>
|
||||
|
||||
@@ -28,6 +28,19 @@
|
||||
font-weight: $--font-weight-secondary;
|
||||
color: $--color-text-regular;
|
||||
}
|
||||
.el-form-item {
|
||||
a {
|
||||
color: $--color-text-regular;
|
||||
text-decoration: none;
|
||||
&:hover {
|
||||
color: $--color-text-primary;
|
||||
text-decoration: underline;
|
||||
}
|
||||
&:active {
|
||||
color: $--color-text-primary;
|
||||
}
|
||||
}
|
||||
}
|
||||
.el-form-item.el-form-item--mini {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
@@ -39,22 +52,14 @@
|
||||
&:last-of-type {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
a {
|
||||
color: $--color-text-regular;
|
||||
text-decoration: none;
|
||||
&:hover {
|
||||
color: $--color-text-primary;
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.form-actions {
|
||||
position: absolute;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
left: auto;
|
||||
z-index: 10;
|
||||
box-sizing: border-box;
|
||||
padding: 24px 36px;
|
||||
padding: 24px 36px 24px 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -29,10 +29,10 @@
|
||||
<el-col class="form-item-sub" :span="24">
|
||||
<a target="_blank" href="https://motrix.app/release/BaiduExporter.zip" rel="noopener noreferrer">
|
||||
{{ $t('preferences.baidu-exporter') }}
|
||||
<mo-icon name="link" width="14" height="14" />
|
||||
<mo-icon name="link" width="12" height="12" />
|
||||
</a>
|
||||
<div class="el-form-item__info" style="margin-top: 8px;">
|
||||
{{ $t('preferences.browser-extensions-tip') }}
|
||||
{{ $t('preferences.browser-extensions-tips') }}
|
||||
<a target="_blank" href="https://motrix.app/extensions/baidu" rel="noopener noreferrer">
|
||||
{{ $t('preferences.baidu-exporter-help') }}
|
||||
</a>
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
<template>
|
||||
<div>
|
||||
<ul class="theme-switcher">
|
||||
<li
|
||||
class="theme-item theme-item-auto"
|
||||
:class="{ active: currentValue === 'auto' }"
|
||||
@click.prevent="() => handleChange('auto')"
|
||||
>
|
||||
<div class="theme-thumb"></div>
|
||||
<span>{{ $t('preferences.theme-auto') }}</span>
|
||||
</li>
|
||||
<li
|
||||
class="theme-item theme-item-light"
|
||||
:class="{ active: currentValue === 'light' }"
|
||||
@click.prevent="() => handleChange('light')"
|
||||
>
|
||||
<div class="theme-thumb"></div>
|
||||
<span>{{ $t('preferences.theme-light') }}</span>
|
||||
</li>
|
||||
<li
|
||||
class="theme-item theme-item-dark"
|
||||
:class="{ active: currentValue === 'dark' }"
|
||||
@click.prevent="() => handleChange('dark')"
|
||||
>
|
||||
<div class="theme-thumb"></div>
|
||||
<span>{{ $t('preferences.theme-dark') }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'mo-theme-switcher',
|
||||
components: {
|
||||
},
|
||||
props: {
|
||||
value: {
|
||||
type: String,
|
||||
default: 'auto'
|
||||
}
|
||||
},
|
||||
data: function () {
|
||||
return {
|
||||
currentValue: this.value
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
currentValue: function (val) {
|
||||
this.$emit('change', val)
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleChange (theme) {
|
||||
this.currentValue = theme
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.theme-switcher {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-size: 0;
|
||||
line-height: 0;
|
||||
.theme-item {
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
margin: 0 16px 0 0;
|
||||
cursor: pointer;
|
||||
span {
|
||||
font-size: 13px;
|
||||
line-height: 20px;
|
||||
}
|
||||
&.active {
|
||||
.theme-thumb {
|
||||
border-color: $--color-primary;
|
||||
box-shadow: 0 0 1px $--color-primary;
|
||||
}
|
||||
span {
|
||||
color: $--color-primary;
|
||||
}
|
||||
}
|
||||
&.theme-item-auto .theme-thumb {
|
||||
background: url('~@/assets/theme-auto@2x.png') center center no-repeat;
|
||||
background-size: 68px 44px;
|
||||
}
|
||||
&.theme-item-light .theme-thumb {
|
||||
background: url('~@/assets/theme-light@2x.png') center center no-repeat;
|
||||
background-size: 68px 44px;
|
||||
}
|
||||
&.theme-item-dark .theme-thumb {
|
||||
background: url('~@/assets/theme-dark@2x.png') center center no-repeat;
|
||||
background-size: 68px 44px;
|
||||
}
|
||||
}
|
||||
.theme-thumb {
|
||||
box-sizing: border-box;
|
||||
border: 1px solid #aaa;
|
||||
border-radius: 5px;
|
||||
width: 68px;
|
||||
height: 44px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -47,9 +47,6 @@
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import '../Theme/Variables';
|
||||
@import '../Theme/Darkness/Variables';
|
||||
|
||||
.mo-speedometer {
|
||||
font-size: 12px;
|
||||
position: relative;
|
||||
@@ -144,12 +141,4 @@
|
||||
color: $--speedometer-primary-color;
|
||||
}
|
||||
}
|
||||
|
||||
.darkness .mo-speedometer {
|
||||
border: 1px solid $--dk-speedometer-border-color;
|
||||
background: $--dk-speedometer-background;
|
||||
&:hover {
|
||||
border-color: $--dk-speedometer-hover-border-color;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<el-aside width="200px" class="subnav">
|
||||
<router-view name="subnav"></router-view>
|
||||
<router-view name="subnav" />
|
||||
</el-aside>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
type="textarea"
|
||||
:autosize="{ minRows: 3, maxRows: 5 }"
|
||||
auto-complete="off"
|
||||
:placeholder="$t('task.uri-task-tip')"
|
||||
:placeholder="$t('task.uri-task-tips')"
|
||||
@change="handleUriChange"
|
||||
v-model="form.uris">
|
||||
</el-input>
|
||||
@@ -40,7 +40,7 @@
|
||||
<el-row :gutter="12">
|
||||
<el-col :span="15">
|
||||
<el-form-item :label="`${$t('task.task-out')}: `" :label-width="formLabelWidth">
|
||||
<el-input :placeholder="$t('task.task-out-tip')" v-model="form.out">
|
||||
<el-input :placeholder="$t('task.task-out-tips')" v-model="form.out">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@@ -123,9 +123,10 @@
|
||||
} from '@shared/utils'
|
||||
|
||||
const initialForm = (state) => {
|
||||
const { addTaskUrl } = state.app
|
||||
const { dir, split, newTaskShowDownloading } = state.preference.config
|
||||
const result = {
|
||||
uris: '',
|
||||
uris: addTaskUrl,
|
||||
torrent: '',
|
||||
out: '',
|
||||
userAgent: '',
|
||||
@@ -211,7 +212,9 @@
|
||||
if (!hasResource) {
|
||||
return
|
||||
}
|
||||
this.form.uris = content
|
||||
if (isEmpty(this.form.uris)) {
|
||||
this.form.uris = content
|
||||
}
|
||||
},
|
||||
handleClose (done) {
|
||||
this.$store.dispatch('app/hideAddTaskDialog')
|
||||
@@ -229,7 +232,7 @@
|
||||
if (uris.includes('thunder://')) {
|
||||
this.$msg({
|
||||
type: 'warning',
|
||||
message: this.$t('task.thunder-link-tip'),
|
||||
message: this.$t('task.thunder-link-tips'),
|
||||
duration: 6000
|
||||
})
|
||||
}
|
||||
@@ -391,14 +394,17 @@
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.add-task-dialog {
|
||||
.el-dialog.add-task-dialog {
|
||||
max-width: 632px;
|
||||
.el-tabs__header {
|
||||
user-select: none;
|
||||
}
|
||||
.el-input-number.el-input-number--mini {
|
||||
width: 100%;
|
||||
}
|
||||
.el-dialog__footer {
|
||||
padding-top: 20px;
|
||||
background: #f5f5f5;
|
||||
background-color: $--add-task-dialog-footer-background;
|
||||
border-radius: 0 0 5px 5px;
|
||||
}
|
||||
.dialog-footer {
|
||||
|
||||
@@ -119,9 +119,6 @@
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import '../Theme/Variables';
|
||||
@import '../Theme/Darkness/Variables';
|
||||
|
||||
.task-actions {
|
||||
position: absolute;
|
||||
top: 44px;
|
||||
@@ -132,7 +129,7 @@
|
||||
user-select: none;
|
||||
cursor: default;
|
||||
text-align: right;
|
||||
color: #4D515A;
|
||||
color: $--task-action-color;
|
||||
transition: all 0.25s;
|
||||
&> i {
|
||||
display: inline-block;
|
||||
@@ -142,7 +139,7 @@
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
&:hover {
|
||||
color: $--color-primary;
|
||||
color: $--task-action-hover-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,7 +116,8 @@
|
||||
.task-item {
|
||||
position: relative;
|
||||
padding: 16px 12px;
|
||||
border: 1px solid #ccc;
|
||||
background-color: $--task-item-background;
|
||||
border: 1px solid $--task-item-border-color;
|
||||
border-radius: 6px;
|
||||
margin-bottom: 16px;
|
||||
transition: $--border-transition-base;
|
||||
|
||||
@@ -207,15 +207,15 @@
|
||||
cursor: default;
|
||||
text-align: right;
|
||||
direction: rtl;
|
||||
border: 1px solid #F5F5F5;
|
||||
color: #9B9B9B;
|
||||
background-color: #fff;
|
||||
border: 1px solid $--task-item-action-border-color;
|
||||
color: $--task-item-action-color;
|
||||
background-color: $--task-item-action-background;
|
||||
border-radius: 14px;
|
||||
transition: $--all-transition;
|
||||
&:hover {
|
||||
border-color: $--task-item-hover-border-color;
|
||||
color: #fff;
|
||||
background-color: $--task-item-hover-background;
|
||||
border-color: $--task-item-action-hover-border-color;
|
||||
color: $--task-item-action-hover-color;
|
||||
background-color: $--task-item-action-hover-background;
|
||||
width: auto;
|
||||
}
|
||||
&> i {
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
justify-content: center;
|
||||
font-size: 14px;
|
||||
color: #555;
|
||||
user-select: none;
|
||||
}
|
||||
.no-task-inner {
|
||||
width: 100%;
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
@import '~normalize.css/normalize.css';
|
||||
@import './Variables.scss';
|
||||
@import "~element-ui/packages/theme-chalk/src/index";
|
||||
|
||||
@import './Base.scss';
|
||||
|
||||
/* Theme Capriccio
|
||||
-------------------------- */
|
||||
@import './Default.scss';
|
||||
|
||||
/* Theme Darkness
|
||||
-------------------------- */
|
||||
@import './Darkness.scss';
|
||||
@@ -1,98 +0,0 @@
|
||||
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Monospaced Number', 'Chinese Quote', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
font-variant: tabular-nums;
|
||||
}
|
||||
|
||||
img {
|
||||
width: auto;
|
||||
height: auto;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
.clearfix {
|
||||
@include clearfix();
|
||||
}
|
||||
|
||||
#app,
|
||||
#container {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.draggable {
|
||||
-webkit-app-region: drag;
|
||||
-webkit-user-select: none;
|
||||
}
|
||||
|
||||
.el-progress-bar__inner {
|
||||
transition: all 0.4s cubic-bezier(0.08, 0.82, 0.17, 1) 0s;
|
||||
}
|
||||
|
||||
.el-progress--line.is-text {
|
||||
.el-progress-bar__inner::before {
|
||||
content: '';
|
||||
opacity: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: #fff;
|
||||
border-radius: 10px;
|
||||
animation: mo-progress-active 2.4s cubic-bezier(0.23, 1, 0.32, 1) infinite;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes mo-progress-active {
|
||||
0% {
|
||||
opacity: 0.1;
|
||||
width: 0;
|
||||
}
|
||||
20% {
|
||||
opacity: 0.5;
|
||||
width: 0;
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.el-message-box__wrapper {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.el-message__content {
|
||||
line-height: 18px;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.tab-title-dialog {
|
||||
.el-dialog__header {
|
||||
padding: 0 20px;
|
||||
position: relative;
|
||||
z-index: 10;
|
||||
}
|
||||
.el-dialog__body {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.el-form-item--mini .el-form-item__info {
|
||||
padding-top: 1px;
|
||||
}
|
||||
|
||||
.el-form-item__info {
|
||||
font-size: 12px;
|
||||
line-height: 1;
|
||||
padding-top: 4px;
|
||||
color: $--color-info;
|
||||
}
|
||||
@@ -0,0 +1,335 @@
|
||||
.theme-dark {
|
||||
.title-bar .window-actions > li {
|
||||
color: $--dk-titlebar-actions-color;
|
||||
&:hover {
|
||||
background-color: $--dk-titlebar-actions-active-background;
|
||||
}
|
||||
&.win-close-btn:hover {
|
||||
background-color: $--dk-titlebar-close-active-background;
|
||||
}
|
||||
}
|
||||
|
||||
.logo > a {
|
||||
color: $--dk-app-logo-color;
|
||||
}
|
||||
|
||||
.app-info .app-version span {
|
||||
color: $--dk-app-version-color;
|
||||
}
|
||||
|
||||
.app-info .engine-info {
|
||||
h4 {
|
||||
color: $--dk-app-engine-title-color;
|
||||
}
|
||||
ul {
|
||||
color: $--dk-app-engine-info-color;
|
||||
}
|
||||
}
|
||||
|
||||
.copyright a {
|
||||
color: $--dk-app-copyright-color;
|
||||
}
|
||||
|
||||
.aside {
|
||||
background-color: $--dk-aside-background;
|
||||
}
|
||||
|
||||
.subnav {
|
||||
background-color: $--dk-subnav-background;
|
||||
color: $--dk-subnav-text-color;
|
||||
}
|
||||
|
||||
.subnav-inner {
|
||||
h3 {
|
||||
color: $--dk-subnav-title-color;
|
||||
}
|
||||
ul li {
|
||||
&:hover,
|
||||
&.active {
|
||||
background-color: $--dk-subnav-active-background;
|
||||
|
||||
i,
|
||||
span,
|
||||
svg {
|
||||
color: $--dk-subnav-active-text-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.panel {
|
||||
background-color: $--dk-panel-background;
|
||||
}
|
||||
|
||||
.panel .panel-header {
|
||||
border-bottom-color: rgba(255, 255, 255, 0.1);
|
||||
h4 {
|
||||
color: $--dk-panel-title-color;
|
||||
}
|
||||
}
|
||||
|
||||
.task-item {
|
||||
background-color: $--dk-task-item-backgroud;
|
||||
border-color: $--dk-task-item-border-color;
|
||||
&:hover {
|
||||
border-color: $--dk-task-item-hover-border-color;
|
||||
}
|
||||
}
|
||||
|
||||
.task-name {
|
||||
color: $--dk-task-item-text-color;
|
||||
}
|
||||
|
||||
.task-actions {
|
||||
color: $--dk-task-action-color;
|
||||
}
|
||||
|
||||
.task-item-actions {
|
||||
background-color: $--dk-task-item-action-background;
|
||||
border-color: $--dk-task-item-action-border-color;
|
||||
&:hover {
|
||||
border-color: $--dk-task-item-action-hover-border-color;
|
||||
color: $--dk-task-item-action-hover-color;
|
||||
background-color: $--dk-task-item-action-hover-background;
|
||||
}
|
||||
}
|
||||
|
||||
.mo-speedometer {
|
||||
background-color: $--dk-speedometer-background;
|
||||
border-color: #5f5f5f;
|
||||
}
|
||||
|
||||
.no-task {
|
||||
color: $--dk-no-task-color;
|
||||
}
|
||||
|
||||
/* Element UI
|
||||
-------------------------- */
|
||||
.el-progress-bar__outer {
|
||||
background-color: #4a4a4a;
|
||||
}
|
||||
|
||||
.el-input__inner,
|
||||
.el-textarea__inner {
|
||||
background-color: #373737;
|
||||
border-color: #5f5f5f;
|
||||
color: #eee;
|
||||
&:focus {
|
||||
outline: none;
|
||||
border-color: $--color-primary;
|
||||
}
|
||||
&::placeholder {
|
||||
color: #777;
|
||||
}
|
||||
}
|
||||
|
||||
.el-input.is-disabled .el-input__inner {
|
||||
background-color: #373737;
|
||||
border-color: #5f5f5f;
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
.el-input-group__append,
|
||||
.el-input-group__prepend {
|
||||
background-color: #333;
|
||||
border-color: #5f5f5f;
|
||||
color: #e7e7e7;
|
||||
}
|
||||
|
||||
.el-input-number__increase,
|
||||
.el-input-number__decrease {
|
||||
background-color: #333;
|
||||
color: #e7e7e7;
|
||||
}
|
||||
|
||||
.el-input-number__decrease {
|
||||
border-right-color: #5f5f5f;
|
||||
}
|
||||
|
||||
.el-input-number__increase {
|
||||
border-left-color: #5f5f5f;
|
||||
}
|
||||
|
||||
.el-input-number.is-controls-right .el-input-number__increase {
|
||||
border-left-color: #5f5f5f;
|
||||
border-bottom-color: #5f5f5f;
|
||||
}
|
||||
|
||||
.el-input-number.is-controls-right .el-input-number__decrease {
|
||||
border-left-color: #5f5f5f;
|
||||
}
|
||||
|
||||
.el-form-item__label,
|
||||
.el-checkbox,
|
||||
.el-radio {
|
||||
color: $--dk-preference-form-text-color;
|
||||
}
|
||||
|
||||
.el-switch__core,
|
||||
.el-checkbox__inner {
|
||||
border-color: #606060;
|
||||
background-color: #5c5d5f;
|
||||
}
|
||||
|
||||
.el-select .el-input .el-select__caret {
|
||||
color: #e7e7e7;
|
||||
}
|
||||
|
||||
.el-select-dropdown {
|
||||
background-color: #3d3d3d;
|
||||
border-color: #606060;
|
||||
}
|
||||
|
||||
.el-select-dropdown__item {
|
||||
color: #eee;
|
||||
&.selected {
|
||||
color: $--color-primary;
|
||||
}
|
||||
&.hover,
|
||||
&:hover {
|
||||
background-color: $--color-primary;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
.el-upload-dragger {
|
||||
background-color: #2d2d2d;
|
||||
border-color: #606060;
|
||||
> i,
|
||||
.el-upload__text {
|
||||
color: #a2a3a4;
|
||||
}
|
||||
}
|
||||
|
||||
.el-popper[x-placement^="top"] .popper__arrow {
|
||||
border-top-color: #606060;
|
||||
&:after {
|
||||
border-top-color: #3d3d3d;
|
||||
}
|
||||
}
|
||||
|
||||
.el-popper[x-placement^="right"] .popper__arrow {
|
||||
border-right-color: #606060;
|
||||
&:after {
|
||||
border-right-color: #3d3d3d;
|
||||
}
|
||||
}
|
||||
|
||||
.el-popper[x-placement^="bottom"] .popper__arrow {
|
||||
border-bottom-color: #606060;
|
||||
&:after {
|
||||
border-bottom-color: #3d3d3d;
|
||||
}
|
||||
}
|
||||
|
||||
.el-popper[x-placement^="left"] .popper__arrow {
|
||||
border-left-color: #606060;
|
||||
&:after {
|
||||
border-left-color: #3d3d3d;
|
||||
}
|
||||
}
|
||||
|
||||
.el-button {
|
||||
background-color: #5b5b5b;
|
||||
border-color: #606060;
|
||||
color: #e6e6e6;
|
||||
&:hover,
|
||||
&:focus {
|
||||
color: $--color-primary;
|
||||
border-color: #606060;
|
||||
background-color: #333;
|
||||
}
|
||||
}
|
||||
|
||||
.el-button--primary {
|
||||
color: #eee;
|
||||
background-color: $--color-primary;
|
||||
border-color: $--color-primary;
|
||||
&:hover,
|
||||
&:focus {
|
||||
background: $--color-primary;
|
||||
border-color: $--color-primary;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
.el-button--danger.is-plain {
|
||||
color: #ff6157;
|
||||
background-color: #5b5b5b;
|
||||
border-color: #ffc0bc;
|
||||
}
|
||||
|
||||
.el-button--danger.is-plain:hover,
|
||||
.el-button--danger.is-plain:focus {
|
||||
background-color: #ff6157;
|
||||
border-color: #ff6157;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* Message */
|
||||
.el-message {
|
||||
background-color: #2d2d2d;
|
||||
border-color: #606060;
|
||||
}
|
||||
|
||||
.el-message__closeBtn {
|
||||
color: rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
|
||||
.el-message--info .el-message__content {
|
||||
color: #a2a3a4;
|
||||
}
|
||||
|
||||
.el-message--success {
|
||||
background-color: #2d2d2d;
|
||||
border-color: #606060;
|
||||
.el-message__content {
|
||||
color: #67c23a;
|
||||
}
|
||||
}
|
||||
|
||||
.el-message--warning {
|
||||
background-color: #2d2d2d;
|
||||
border-color: #606060;
|
||||
.el-message__content {
|
||||
color: #e6a23c;
|
||||
}
|
||||
}
|
||||
|
||||
.el-message--error {
|
||||
background-color: #2d2d2d;
|
||||
border-color: #606060;
|
||||
.el-message__content {
|
||||
color: #f56c6c;
|
||||
}
|
||||
}
|
||||
|
||||
/* Dialog */
|
||||
.el-dialog {
|
||||
background-color: $--dk-dialog-background;
|
||||
}
|
||||
|
||||
.add-task-dialog .el-dialog__footer {
|
||||
background-color: $--dk-add-task-dialog-footer-background;
|
||||
}
|
||||
|
||||
/* Tabs */
|
||||
.el-tabs__item {
|
||||
color: #a2a3a4;
|
||||
&.is-active {
|
||||
color: $--color-primary;
|
||||
}
|
||||
}
|
||||
|
||||
.el-tabs__nav-wrap::after {
|
||||
background-color: #606060;
|
||||
}
|
||||
|
||||
.form-preference .el-form-item__content {
|
||||
color: $--dk-preference-form-text-color;
|
||||
}
|
||||
|
||||
.form-preference .el-switch__label {
|
||||
color: $--dk-preference-form-text-color;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
/* App
|
||||
-------------------------- */
|
||||
$--dk-app-background: transparent !default;
|
||||
$--dk-titlebar-actions-color: #eee !default;
|
||||
$--dk-titlebar-close-active-color: #fff !default;
|
||||
$--dk-titlebar-actions-active-background: rgba(0, 0, 0, 0.9) !default;
|
||||
$--dk-titlebar-close-active-background: $--color-danger !default;
|
||||
$--dk-app-logo-color: #eee !default;
|
||||
$--dk-app-version-color: #a2a3a4 !default;
|
||||
$--dk-app-engine-title-color: #a2a3a4 !default;
|
||||
$--dk-app-engine-info-color: #777 !default;
|
||||
$--dk-app-copyright-color: #a2a3a4 !default;
|
||||
|
||||
/* Aside
|
||||
-------------------------- */
|
||||
$--dk-aside-background: rgba(0, 0, 0, 0.9) !default;
|
||||
$--dk-aside-text-color: #fff !default;
|
||||
|
||||
/* SubNav
|
||||
-------------------------- */
|
||||
$--dk-subnav-background: #2D2D2D !default;
|
||||
$--dk-subnav-title-color: #fff !default;
|
||||
$--dk-subnav-text-color: #aaa !default;
|
||||
$--dk-subnav-active-text-color: #fff !default;
|
||||
$--dk-subnav-active-background: #444 !default;
|
||||
|
||||
/* Panel
|
||||
-------------------------- */
|
||||
$--dk-panel-background: #343434 !default;
|
||||
$--dk-panel-title-color: #fff !default;
|
||||
$--dk-panel-border-color: #EBECF0 !default;
|
||||
|
||||
/* Task
|
||||
-------------------------- */
|
||||
$--dk-task-action-color: #eee !default;
|
||||
$--dk-task-action-hover-color: $--color-primary !default;
|
||||
$--dk-task-item-backgroud: #2D2D2D !default;
|
||||
$--dk-task-item-border-color: #555 !default;
|
||||
$--dk-task-item-hover-border-color: $--color-primary !default;
|
||||
$--dk-task-item-hover-background: $--color-primary !default;
|
||||
$--dk-task-item-text-color: #eee !default;
|
||||
$--dk-task-item-action-background: #4a4a4a !default;
|
||||
$--dk-task-item-action-hover-background: $--color-primary !default;
|
||||
$--dk-task-item-action-border-color: #5f5f5f !default;
|
||||
$--dk-task-item-action-hover-border-color: $--color-primary !default;
|
||||
$--dk-task-item-action-color: #eee !default;
|
||||
$--dk-task-item-action-hover-color: #fff !default;
|
||||
$--dk-no-task-color: #aaa !default;
|
||||
$--dk-add-task-dialog-footer-background: #4a4a4a !default;
|
||||
|
||||
/* Preference
|
||||
-------------------------- */
|
||||
$--dk-preference-form-text-color: #dfdfdf;
|
||||
|
||||
/* Speedometer
|
||||
-------------------------- */
|
||||
$--dk-speedometer-background: #333 !default;
|
||||
$--dk-speedometer-border-color: #ccc !default;
|
||||
$--dk-speedometer-hover-border-color: #9b9b9b !default;
|
||||
$--dk-speedometer-primary-color: $--color-primary !default;
|
||||
$--dk-speedometer-stopped-color: #9b9b9b !default;
|
||||
$--dk-speedometer-text-color: #9b9b9b !default;
|
||||
|
||||
/* Element UI
|
||||
-------------------------- */
|
||||
$--dk-dialog-background: #343434 !default;
|
||||
@@ -1 +0,0 @@
|
||||
@import './Darkness/Variables.scss';
|
||||
@@ -1,35 +0,0 @@
|
||||
/* App
|
||||
-------------------------- */
|
||||
$--dk-app-background: transparent !default;
|
||||
|
||||
/* Aside
|
||||
-------------------------- */
|
||||
$--dk-aside-background: rgba(0, 0, 0, 0.75) !default;
|
||||
$--dk-aside-text-color: #fff !default;
|
||||
|
||||
/* SubNav
|
||||
-------------------------- */
|
||||
$--dk-subnav-background: #F4F5F7 !default;
|
||||
$--dk-subnav-title-color: $--color-primary-dark-6 !default;
|
||||
$--dk-subnav-text-color: #4D515A !default;
|
||||
$--dk-subnav-active-text-color: $--color-primary !default;
|
||||
|
||||
/* Panel
|
||||
-------------------------- */
|
||||
$--panel-background: $--color-white !default;
|
||||
$--dk-panel-title-color: $--color-primary-dark-6 !default;
|
||||
$--dk-panel-border-color: #EBECF0 !default;
|
||||
|
||||
/* Task
|
||||
-------------------------- */
|
||||
$--dk-task-item-border-color: #ccc !default;
|
||||
$--dk-task-item-hover-border-color: $--color-primary !default;
|
||||
$--dk-task-item-hover-background: $--color-primary !default;
|
||||
|
||||
/* Speedometer
|
||||
-------------------------- */
|
||||
$--dk-speedometer-background: $--color-white !default;
|
||||
$--dk-speedometer-border-color: #ccc !default;
|
||||
$--dk-speedometer-hover-border-color: #9b9b9b !default;
|
||||
$--dk-speedometer-primary-color: $--color-primary !default;
|
||||
$--dk-speedometer-text-color: #9b9b9b !default;
|
||||
@@ -1,30 +1,106 @@
|
||||
:root {
|
||||
--app-background: '';
|
||||
--aside-background: '';
|
||||
--aside-text-color: '';
|
||||
--subnav-background: '';
|
||||
--subnav-title-color: '';
|
||||
--subnav-text-color: '';
|
||||
--subnav-active-text-color: '';
|
||||
--panel-background: '';
|
||||
--panel-title-color: '';
|
||||
--panel-border-color: '';
|
||||
--task-item-border-color: '';
|
||||
--task-item-hover-border-color: '';
|
||||
--task-item-hover-background: '';
|
||||
--speedometer-background: '';
|
||||
--speedometer-border-color: '';
|
||||
--speedometer-hover-border-color: '';
|
||||
--speedometer-primary-color: '';
|
||||
--speedometer-text-color: '';
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Monospaced Number', 'Chinese Quote', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
font-variant: tabular-nums;
|
||||
}
|
||||
|
||||
img {
|
||||
width: auto;
|
||||
height: auto;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
.clearfix {
|
||||
@include clearfix();
|
||||
}
|
||||
|
||||
/* Element UI
|
||||
-------------------------- */
|
||||
.el-progress-bar__inner {
|
||||
transition: all 0.4s cubic-bezier(0.08, 0.82, 0.17, 1) 0s;
|
||||
}
|
||||
|
||||
.el-progress--line.is-text {
|
||||
.el-progress-bar__inner::before {
|
||||
content: '';
|
||||
opacity: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: #fff;
|
||||
border-radius: 10px;
|
||||
animation: mo-progress-active 2.4s cubic-bezier(0.23, 1, 0.32, 1) infinite;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes mo-progress-active {
|
||||
0% {
|
||||
opacity: 0.1;
|
||||
width: 0;
|
||||
}
|
||||
20% {
|
||||
opacity: 0.5;
|
||||
width: 0;
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.el-message-box__wrapper {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.el-message__content {
|
||||
line-height: 18px;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.tab-title-dialog {
|
||||
.el-dialog__header {
|
||||
padding: 0 20px;
|
||||
position: relative;
|
||||
z-index: 10;
|
||||
}
|
||||
.el-dialog__body {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.el-form-item--mini .el-form-item__info {
|
||||
padding-top: 1px;
|
||||
}
|
||||
|
||||
.el-form-item__info {
|
||||
font-size: 12px;
|
||||
line-height: 1;
|
||||
padding-top: 4px;
|
||||
color: $--color-info;
|
||||
}
|
||||
|
||||
/* App Main
|
||||
-------------------------- */
|
||||
#app,
|
||||
#container {
|
||||
height: 100%;
|
||||
background-color: $--app-background;
|
||||
}
|
||||
|
||||
.draggable {
|
||||
-webkit-app-region: drag;
|
||||
-webkit-user-select: none;
|
||||
}
|
||||
|
||||
.aside {
|
||||
background-color: $--aside-background;
|
||||
color: $--aside-text-color;
|
||||
@@ -38,6 +114,7 @@
|
||||
.subnav-inner {
|
||||
margin-top: 44px;
|
||||
padding: 0 16px;
|
||||
user-select: none;
|
||||
|
||||
h3 {
|
||||
font-size: 16px;
|
||||
@@ -51,7 +128,6 @@
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
user-select: none;
|
||||
cursor: default;
|
||||
|
||||
li {
|
||||
@@ -70,7 +146,7 @@
|
||||
|
||||
&:hover,
|
||||
&.active {
|
||||
background-color: #EAECF0;
|
||||
background-color: $--subnav-active-background;
|
||||
|
||||
i,
|
||||
span,
|
||||
@@ -96,3 +172,26 @@
|
||||
.content {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.panel {
|
||||
background: $--panel-background;
|
||||
.panel-header {
|
||||
position: relative;
|
||||
padding: 44px 0 12px;
|
||||
margin: 0 36px;
|
||||
border-bottom: 2px solid $--panel-border-color;
|
||||
user-select: none;
|
||||
h4 {
|
||||
margin: 0;
|
||||
color: $--panel-title-color;
|
||||
font-size: 16px;
|
||||
font-weight: normal;
|
||||
line-height: 24px;
|
||||
}
|
||||
}
|
||||
.panel-content {
|
||||
position: relative;
|
||||
padding: 16px 36px 52px;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
/* Normalize.css
|
||||
-------------------------- */
|
||||
@import '~normalize.css/normalize.css';
|
||||
@import './Variables.scss';
|
||||
|
||||
/* Element UI
|
||||
-------------------------- */
|
||||
@import "~element-ui/packages/theme-chalk/src/index";
|
||||
|
||||
@import './Base.scss';
|
||||
|
||||
/* Theme Capriccio
|
||||
/* Theme Light (default)
|
||||
-------------------------- */
|
||||
@import './Default.scss';
|
||||
|
||||
/* Theme Darkness
|
||||
/* Theme Dark
|
||||
-------------------------- */
|
||||
@import './Darkness.scss';
|
||||
@import './Dark.scss';
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
/* App
|
||||
-------------------------- */
|
||||
$--app-background: transparent !default;
|
||||
$--titlebar-actions-color: #1f1f1f !default;
|
||||
$--titlebar-actions-active-background: #eee !default;
|
||||
$--titlebar-close-active-color: #fff !default;
|
||||
$--titlebar-close-active-background: $--color-danger !default;
|
||||
$--app-logo-color: #4D515A !default;
|
||||
$--app-version-color: $--color-text-regular !default;
|
||||
$--app-engine-title-color: $--color-text-regular !default;
|
||||
$--app-engine-info-color: $--color-text-secondary !default;
|
||||
$--app-copyright-color: $--color-text-regular !default;
|
||||
|
||||
/* Aside
|
||||
-------------------------- */
|
||||
$--aside-background: rgba(0, 0, 0, 0.8) !default;
|
||||
$--aside-text-color: #fff !default;
|
||||
|
||||
/* SubNav
|
||||
-------------------------- */
|
||||
$--subnav-background: #F4F5F7 !default;
|
||||
$--subnav-title-color: $--color-text-primary !default;
|
||||
$--subnav-text-color: #4D515A !default;
|
||||
$--subnav-active-text-color: $--color-primary !default;
|
||||
$--subnav-active-background: #EAECF0 !default;
|
||||
|
||||
/* Panel
|
||||
-------------------------- */
|
||||
$--panel-background: $--color-white !default;
|
||||
$--panel-title-color: $--color-text-primary !default;
|
||||
$--panel-border-color: rgba(0, 0, 0, 0.1) !default;
|
||||
|
||||
/* Task
|
||||
-------------------------- */
|
||||
$--task-action-color: #4d515a !default;
|
||||
$--task-action-hover-color: $--color-primary !default;
|
||||
$--task-item-background: #fff !default;
|
||||
$--task-item-border-color: #ccc !default;
|
||||
$--task-item-hover-border-color: $--color-primary !default;
|
||||
$--task-item-hover-background: $--color-primary !default;
|
||||
$--task-item-text-color: #505753 !default;
|
||||
$--task-item-action-background: #fff !default;
|
||||
$--task-item-action-hover-background: $--color-primary !default;
|
||||
$--task-item-action-border-color: #F5F5F5 !default;
|
||||
$--task-item-action-hover-border-color: $--color-primary !default;
|
||||
$--task-item-action-color: #9B9B9B !default;
|
||||
$--task-item-action-hover-color: #fff !default;
|
||||
$--no-task-color: #eee !default;
|
||||
$--add-task-dialog-footer-background: #f5f5f5 !default;
|
||||
|
||||
/* Preference
|
||||
-------------------------- */
|
||||
$--preference-form-text-color: #4c4c4c;
|
||||
|
||||
/* Speedometer
|
||||
-------------------------- */
|
||||
$--speedometer-background: $--color-white !default;
|
||||
$--speedometer-border-color: #ccc !default;
|
||||
$--speedometer-hover-border-color: #9b9b9b !default;
|
||||
$--speedometer-primary-color: $--color-primary !default;
|
||||
$--speedometer-stopped-color: #9b9b9b !default;
|
||||
$--speedometer-text-color: #9b9b9b !default;
|
||||
|
||||
/* Element UI
|
||||
-------------------------- */
|
||||
$--dialog-background: #fff !default;
|
||||
@@ -477,7 +477,7 @@ $--switch-button-size: 16px !default;
|
||||
|
||||
/* Dialog
|
||||
-------------------------- */
|
||||
$--dialog-background-color: $--color-primary-light-4 !default;
|
||||
$--dialog-background-color: $--color-white !default;
|
||||
$--dialog-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3) !default;
|
||||
$--dialog-close-hover-color: $--color-primary !default;
|
||||
$--dialog-title-font-size: $--font-size-large !default;
|
||||
@@ -727,45 +727,6 @@ $--breakpoints-spec: (
|
||||
/* 改变 icon 字体路径变量,必需 */
|
||||
$--font-path: '~element-ui/lib/theme-chalk/fonts';
|
||||
|
||||
/* App
|
||||
-------------------------- */
|
||||
$--app-background: transparent !default;
|
||||
// $--app-background: #fff !default;
|
||||
$--titlebar-actions-active-background: #eee !default;
|
||||
|
||||
/* Aside
|
||||
-------------------------- */
|
||||
$--aside-background: rgba(0, 0, 0, 0.8) !default;
|
||||
$--aside-text-color: #fff !default;
|
||||
|
||||
/* SubNav
|
||||
-------------------------- */
|
||||
$--subnav-background: #F4F5F7 !default;
|
||||
$--subnav-title-color: $--color-text-primary !default;
|
||||
$--subnav-text-color: #4D515A !default;
|
||||
$--subnav-active-text-color: $--color-primary !default;
|
||||
|
||||
/* Panel
|
||||
-------------------------- */
|
||||
$--panel-background: $--color-white !default;
|
||||
$--panel-title-color: $--color-text-primary !default;
|
||||
$--panel-border-color: rgba(0, 0, 0, 0.1) !default;
|
||||
|
||||
/* Task
|
||||
-------------------------- */
|
||||
$--task-item-border-color: #ccc !default;
|
||||
$--task-item-hover-border-color: $--color-primary !default;
|
||||
$--task-item-hover-background: $--color-primary !default;
|
||||
|
||||
/* Speedometer
|
||||
-------------------------- */
|
||||
$--speedometer-background: $--color-white !default;
|
||||
$--speedometer-border-color: #ccc !default;
|
||||
$--speedometer-hover-border-color: #9b9b9b !default;
|
||||
$--speedometer-primary-color: $--color-primary !default;
|
||||
$--speedometer-stopped-color: #9b9b9b !default;
|
||||
$--speedometer-text-color: #9b9b9b !default;
|
||||
|
||||
/* Mixin
|
||||
-------------------------- */
|
||||
@mixin clearfix {
|
||||
@@ -775,3 +736,8 @@ $--speedometer-text-color: #9b9b9b !default;
|
||||
clear: both;
|
||||
}
|
||||
}
|
||||
|
||||
/* App Theme Variables
|
||||
-------------------------- */
|
||||
@import './Light/Variables.scss';
|
||||
@import './Dark/Variables.scss';
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
v-if="isRenderer()"
|
||||
:showActions="showWindowActions"
|
||||
/>
|
||||
<router-view></router-view>
|
||||
<router-view />
|
||||
<mo-engine-client
|
||||
:secret="rpcSecret"
|
||||
/>
|
||||
@@ -27,15 +27,45 @@
|
||||
[Ipc.name]: Ipc
|
||||
},
|
||||
computed: {
|
||||
...mapState('app', {
|
||||
systemTheme: state => state.systemTheme
|
||||
}),
|
||||
...mapState('preference', {
|
||||
showWindowActions: state => {
|
||||
return (is.windows() || is.linux()) && state.config.hideAppMenu
|
||||
},
|
||||
rpcSecret: state => state.config.rpcSecret
|
||||
})
|
||||
rpcSecret: state => state.config.rpcSecret,
|
||||
theme: state => state.config.theme,
|
||||
locale: state => state.config.locale
|
||||
}),
|
||||
themeClass: function () {
|
||||
if (this.theme === 'auto') {
|
||||
return `theme-${this.systemTheme}`
|
||||
} else {
|
||||
return `theme-${this.theme}`
|
||||
}
|
||||
},
|
||||
i18nClass: function () {
|
||||
return `i18n-${this.locale}`
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
isRenderer: is.renderer
|
||||
isRenderer: is.renderer,
|
||||
updateRootClassName: function () {
|
||||
const { themeClass = '', i18nClass = '' } = this
|
||||
document.documentElement.className = `${themeClass} ${i18nClass}`
|
||||
}
|
||||
},
|
||||
beforeMount: function () {
|
||||
this.updateRootClassName()
|
||||
},
|
||||
watch: {
|
||||
themeClass: function (val, oldVal) {
|
||||
this.updateRootClassName()
|
||||
},
|
||||
i18nClass: function (val, oldVal) {
|
||||
this.updateRootClassName()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import is from 'electron-is'
|
||||
import api from '@/api'
|
||||
import { getSystemTheme } from '@/components/Native/utils'
|
||||
|
||||
const BASE_INTERVAL = 1000
|
||||
const PER_INTERVAL = 100
|
||||
@@ -7,6 +8,7 @@ const MIN_INTERVAL = 500
|
||||
const MAX_INTERVAL = 6000
|
||||
|
||||
const state = {
|
||||
systemTheme: getSystemTheme(),
|
||||
aboutPanelVisible: false,
|
||||
engineInfo: {
|
||||
version: '',
|
||||
@@ -23,6 +25,7 @@ const state = {
|
||||
},
|
||||
addTaskVisible: false,
|
||||
addTaskType: 'uri',
|
||||
addTaskUrl: '',
|
||||
addTaskTorrents: []
|
||||
}
|
||||
|
||||
@@ -30,6 +33,9 @@ const getters = {
|
||||
}
|
||||
|
||||
const mutations = {
|
||||
CHANGE_SYSTEM_THEME (state, theme) {
|
||||
state.systemTheme = theme
|
||||
},
|
||||
CHANGE_ABOUT_PANEL_VISIBLE (state, visible) {
|
||||
state.aboutPanelVisible = visible
|
||||
},
|
||||
@@ -48,6 +54,9 @@ const mutations = {
|
||||
CHANGE_ADD_TASK_TYPE (state, taskType) {
|
||||
state.addTaskType = taskType
|
||||
},
|
||||
CHANGE_ADD_TASK_URL (state, text) {
|
||||
state.addTaskUrl = text
|
||||
},
|
||||
CHANGE_ADD_TASK_TORRENTS (state, fileList) {
|
||||
state.addTaskTorrents = [...fileList]
|
||||
},
|
||||
@@ -77,6 +86,9 @@ const mutations = {
|
||||
}
|
||||
|
||||
const actions = {
|
||||
updateSystemTheme ({ commit }, theme) {
|
||||
commit('CHANGE_SYSTEM_THEME', theme)
|
||||
},
|
||||
showAboutPanel ({ commit }) {
|
||||
commit('CHANGE_ABOUT_PANEL_VISIBLE', true)
|
||||
},
|
||||
@@ -122,7 +134,7 @@ const actions = {
|
||||
}
|
||||
})
|
||||
},
|
||||
togglePowerSaveBlocker (context, numActive) {
|
||||
togglePowerSaveBlocker (_, numActive) {
|
||||
if (numActive > 0) {
|
||||
api.startPowerSaveBlocker()
|
||||
} else {
|
||||
@@ -138,11 +150,15 @@ const actions = {
|
||||
},
|
||||
hideAddTaskDialog ({ commit }) {
|
||||
commit('CHANGE_ADD_TASK_VISIBLE', false)
|
||||
commit('CHANGE_ADD_TASK_URL', '')
|
||||
commit('CHANGE_ADD_TASK_TORRENTS', [])
|
||||
},
|
||||
changeAddTaskType ({ commit }, taskType) {
|
||||
commit('CHANGE_ADD_TASK_TYPE', taskType)
|
||||
},
|
||||
updateAddTaskUrl ({ commit }, text = '') {
|
||||
commit('CHANGE_ADD_TASK_URL', text)
|
||||
},
|
||||
addTaskAddTorrents ({ commit }, { fileList }) {
|
||||
commit('CHANGE_ADD_TASK_TORRENTS', fileList)
|
||||
},
|
||||
|
||||
@@ -1,36 +1,17 @@
|
||||
import api from '@/api'
|
||||
|
||||
const state = {
|
||||
currentForm: 'basic',
|
||||
engineMode: 'MAX',
|
||||
config: {}
|
||||
}
|
||||
|
||||
const formTitles = {
|
||||
'basic': '基础设置',
|
||||
'advanced': '进阶设置',
|
||||
'lab': '实验室'
|
||||
}
|
||||
|
||||
const getters = {
|
||||
currentFormTitle: (state, getters) => {
|
||||
return formTitles[state.currentForm] ? formTitles[state.currentForm] : ''
|
||||
}
|
||||
}
|
||||
|
||||
const mutations = {
|
||||
UPDATE_PREFERENCE_DATA (state, config) {
|
||||
state.config = { ...state.config, ...config }
|
||||
},
|
||||
CHANGE_CURRENT_FORM (state, currentForm) {
|
||||
state.currentForm = currentForm
|
||||
}
|
||||
}
|
||||
|
||||
const actions = {
|
||||
changeCurrentForm ({ commit }, currentForm) {
|
||||
commit('CHANGE_CURRENT_FORM', currentForm)
|
||||
},
|
||||
fetchPreference ({ commit }) {
|
||||
return new Promise((resolve) => {
|
||||
api.fetchPreference()
|
||||
@@ -40,10 +21,22 @@ const actions = {
|
||||
})
|
||||
})
|
||||
},
|
||||
save ({ commit }, config) {
|
||||
save ({ commit }, data) {
|
||||
let { btTracker } = data
|
||||
btTracker = btTracker.trim().replace(/(?:\r\n|\r|\n)/g, ',')
|
||||
const config = {
|
||||
...data,
|
||||
btTracker
|
||||
}
|
||||
commit('UPDATE_PREFERENCE_DATA', config)
|
||||
return api.savePreference(config)
|
||||
},
|
||||
changeThemeConfig ({ commit }, theme) {
|
||||
commit('UPDATE_PREFERENCE_DATA', { theme })
|
||||
},
|
||||
fetchBtTracker () {
|
||||
return api.fetchBtTrackerFromGitHub()
|
||||
},
|
||||
toggleEngineMode () {
|
||||
|
||||
}
|
||||
@@ -52,7 +45,6 @@ const actions = {
|
||||
export default {
|
||||
namespaced: true,
|
||||
state,
|
||||
getters,
|
||||
mutations,
|
||||
actions
|
||||
}
|
||||
|
||||
@@ -9,7 +9,10 @@ const userKeys = [
|
||||
'all-proxy-backup',
|
||||
'log-path',
|
||||
'session-path',
|
||||
'enable-egg-features'
|
||||
'enable-egg-features',
|
||||
'theme',
|
||||
'auto-check-update',
|
||||
'last-check-update-time'
|
||||
]
|
||||
|
||||
const systemKeys = [
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
export const LIGHT_THEME = 'light'
|
||||
export const DARK_THEME = 'dark'
|
||||
|
||||
export const BEST_TRACKERS_URL = 'https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best.txt'
|
||||
export const BEST_TRACKERS_IP_URL = 'https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best_ip.txt'
|
||||
@@ -1,13 +1,19 @@
|
||||
import eleLocaleDe from 'element-ui/lib/locale/lang/de'
|
||||
import eleLocaleEn from 'element-ui/lib/locale/lang/en'
|
||||
import eleLocaleFa from 'element-ui/lib/locale/lang/fa'
|
||||
import eleLocaleFr from 'element-ui/lib/locale/lang/fr'
|
||||
import eleLocaleJa from 'element-ui/lib/locale/lang/ja'
|
||||
import eleLocaleKo from 'element-ui/lib/locale/lang/ko'
|
||||
import eleLocalePtBR from 'element-ui/lib/locale/lang/pt-br'
|
||||
import eleLocaleTr from 'element-ui/lib/locale/lang/tr-TR'
|
||||
import eleLocaleZhCN from 'element-ui/lib/locale/lang/zh-CN'
|
||||
import eleLocaleZhTW from 'element-ui/lib/locale/lang/zh-TW'
|
||||
import appLocaleDe from '@shared/locales/de'
|
||||
import appLocaleEnUS from '@shared/locales/en-US'
|
||||
import appLocaleFa from '@shared/locales/fa'
|
||||
import appLocaleFr from '@shared/locales/fr'
|
||||
import appLocaleJa from '@shared/locales/ja'
|
||||
import appLocaleKo from '@shared/locales/ko'
|
||||
import appLocalePtBR from '@shared/locales/pt-BR'
|
||||
import appLocaleTr from '@shared/locales/tr'
|
||||
import appLocaleZhCN from '@shared/locales/zh-CN'
|
||||
@@ -27,12 +33,30 @@ const resources = {
|
||||
...appLocaleEnUS
|
||||
}
|
||||
},
|
||||
'fa': {
|
||||
translation: {
|
||||
...eleLocaleFa,
|
||||
...appLocaleFa
|
||||
}
|
||||
},
|
||||
'fr': {
|
||||
translation: {
|
||||
...eleLocaleFr,
|
||||
...appLocaleFr
|
||||
}
|
||||
},
|
||||
'ja': {
|
||||
translation: {
|
||||
...eleLocaleJa,
|
||||
...appLocaleJa
|
||||
}
|
||||
},
|
||||
'ko': {
|
||||
translation: {
|
||||
...eleLocaleKo,
|
||||
...appLocaleKo
|
||||
}
|
||||
},
|
||||
'pt-BR': {
|
||||
translation: {
|
||||
...eleLocalePtBR,
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
import appLocaleDeDE from '@shared/locales/de'
|
||||
import appLocaleDe from '@shared/locales/de'
|
||||
import appLocaleEnUS from '@shared/locales/en-US'
|
||||
import appLocaleFrFR from '@shared/locales/fr'
|
||||
import appLocaleFa from '@shared/locales/fa'
|
||||
import appLocaleFr from '@shared/locales/fr'
|
||||
import appLocaleJa from '@shared/locales/ja'
|
||||
import appLocaleKo from '@shared/locales/ko'
|
||||
import appLocalePtBr from '@shared/locales/pt-BR'
|
||||
import appLocaleTrTR from '@shared/locales/tr'
|
||||
import appLocaleTr from '@shared/locales/tr'
|
||||
import appLocaleZhCN from '@shared/locales/zh-CN'
|
||||
import appLocaleZhTW from '@shared/locales/zh-TW'
|
||||
|
||||
@@ -10,7 +13,7 @@ import appLocaleZhTW from '@shared/locales/zh-TW'
|
||||
const resources = {
|
||||
'de': {
|
||||
translation: {
|
||||
...appLocaleDeDE
|
||||
...appLocaleDe
|
||||
}
|
||||
},
|
||||
'en-US': {
|
||||
@@ -18,9 +21,24 @@ const resources = {
|
||||
...appLocaleEnUS
|
||||
}
|
||||
},
|
||||
'fa': {
|
||||
translation: {
|
||||
...appLocaleFa
|
||||
}
|
||||
},
|
||||
'fr': {
|
||||
translation: {
|
||||
...appLocaleFrFR
|
||||
...appLocaleFr
|
||||
}
|
||||
},
|
||||
'ja': {
|
||||
translation: {
|
||||
...appLocaleJa
|
||||
}
|
||||
},
|
||||
'ko': {
|
||||
translation: {
|
||||
...appLocaleKo
|
||||
}
|
||||
},
|
||||
'pt-BR': {
|
||||
@@ -30,7 +48,7 @@ const resources = {
|
||||
},
|
||||
'tr': {
|
||||
translation: {
|
||||
...appLocaleTrTR
|
||||
...appLocaleTr
|
||||
}
|
||||
},
|
||||
'zh-CN': {
|
||||
|
||||
@@ -7,7 +7,7 @@ export default {
|
||||
'startup': 'Startup',
|
||||
'auto-resume-all': 'Alle nicht abgeschlossenen Aufgaben automatisch fortsetzen',
|
||||
'default-dir': 'Standard Speicherort',
|
||||
'mas-default-dir-tip': 'Aufgrund der Einschränkungen durch Sandbox-Berechtigungen im App Store wird der Download Ordner als Standard empfohlen',
|
||||
'mas-default-dir-tips': 'Aufgrund der Einschränkungen durch Sandbox-Berechtigungen im App Store wird der Download Ordner als Standard empfohlen',
|
||||
'task-manage': 'Aufgaben verwalten',
|
||||
'max-concurrent-downloads': 'Maximal aktive Aufgaben',
|
||||
'max-connection-per-server': 'Maximale Verbindungen pro Server',
|
||||
@@ -16,11 +16,19 @@ export default {
|
||||
'task-completed-notify': 'Benachrichtigung nach abgeschlossenen Download anzeigen',
|
||||
'auto-purge-record': 'Download Protokoll beim Schließen der App löschen',
|
||||
'ui': 'UI',
|
||||
'appearance': 'Erscheinungsbild',
|
||||
'theme-auto': 'Automatischer',
|
||||
'theme-light': 'Hell',
|
||||
'theme-dark': 'Dunkel',
|
||||
'language': 'Sprache',
|
||||
'change-language': 'Sprache ändern',
|
||||
'hide-app-menu': 'App Menü ausblenden (nur auf Windows & Linux)',
|
||||
'proxy': 'Proxy',
|
||||
'use-proxy': 'Proxy aktivieren',
|
||||
'bt-tracker': 'Tracker-Server',
|
||||
'bt-tracker-input-tips': 'Tracker-Server, einer pro Zeile',
|
||||
'bt-tracker-tips': 'Empfehlen:',
|
||||
'sync-tracker-tips': 'Von ngosang/trackerslist synchronisieren',
|
||||
'developer': 'Entwickler',
|
||||
'mock-user-agent': 'User-Agent simulieren',
|
||||
'app-log-path': 'Appprotokollpfad',
|
||||
@@ -32,6 +40,8 @@ export default {
|
||||
'support-more-download-protocols': 'Erweiterte Protokollunterstützung aktivieren',
|
||||
'browser-extensions': 'Erweiterungen',
|
||||
'baidu-exporter': 'Baidu Exporter',
|
||||
'browser-extensions-tip': 'Von der Community bereitgestellt, ',
|
||||
'baidu-exporter-help': 'mehr über die Verwendung zu erfahren'
|
||||
'browser-extensions-tips': 'Von der Community bereitgestellt, ',
|
||||
'baidu-exporter-help': 'mehr über die Verwendung zu erfahren',
|
||||
'auto-check-update': 'Automatische Updates überprüfen',
|
||||
'last-check-update-time': 'letzte kontrolle update - zeit'
|
||||
}
|
||||
|
||||
@@ -7,11 +7,11 @@ export default {
|
||||
'open-file': 'Torrent-Datei öffnen...',
|
||||
'uri-task': 'URL',
|
||||
'torrent-task': 'Torrent',
|
||||
'uri-task-tip': 'Eine Download URL pro Zeile (magnet wird unterstützt)',
|
||||
'thunder-link-tip': 'Tipp: Thunder Links werden möglicherweise nach dem dekodieren nicht heruntergeladen',
|
||||
'uri-task-tips': 'Eine Download URL pro Zeile (magnet wird unterstützt)',
|
||||
'thunder-link-tips': 'Tipp: Thunder Links werden möglicherweise nach dem dekodieren nicht heruntergeladen',
|
||||
'task-name': 'Aufgaben Name',
|
||||
'task-out': 'Umbenennen',
|
||||
'task-out-tip': 'Optional, unterstützt nur Einzelaufgaben',
|
||||
'task-out-tips': 'Optional, unterstützt nur Einzelaufgaben',
|
||||
'task-split': 'Splits',
|
||||
'task-dir': 'Ordner',
|
||||
'pause-task': 'Aufgabe pausieren',
|
||||
@@ -74,6 +74,9 @@ export default {
|
||||
'download-error-message': 'Fehler beim Download von {{taskName}} aufgetreten',
|
||||
'download-complete-message': 'Download von {{taskName}} abgeschlossen',
|
||||
'download-complete-notify': 'Download abgeschlossen',
|
||||
'bt-download-complete-message': 'Download von {{taskName}} abgeschlossen, aussaat...',
|
||||
'bt-download-complete-notify': 'BT Download abgeschlossen, Aussaat...',
|
||||
'bt-download-complete-tips': 'Tipps: Sie können die Aufgabe stoppen, die aussaat zu beenden',
|
||||
'download-fail-message': 'Download von {{taskName}} fehlgeschlagen',
|
||||
'download-fail-notify': 'Download fehlgeschlagen'
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ export default {
|
||||
'startup': 'Startup',
|
||||
'auto-resume-all': 'Auto resume all unfinished tasks',
|
||||
'default-dir': 'Default Dir',
|
||||
'mas-default-dir-tip': 'Due to the sandbox permissions restrictions of the App Store, the default download dir is recommended to be set to Downloads directory',
|
||||
'mas-default-dir-tips': 'Due to the sandbox permissions restrictions of the App Store, the default download dir is recommended to be set to Downloads directory',
|
||||
'task-manage': 'Task Manage',
|
||||
'max-concurrent-downloads': 'Maximum active tasks',
|
||||
'max-connection-per-server': 'Max connection per server',
|
||||
@@ -16,11 +16,19 @@ export default {
|
||||
'task-completed-notify': 'Notification after download is complete',
|
||||
'auto-purge-record': 'Auto purge download record when app exit',
|
||||
'ui': 'UI',
|
||||
'appearance': 'Appearance',
|
||||
'theme-auto': 'Auto',
|
||||
'theme-light': 'Light',
|
||||
'theme-dark': 'Dark',
|
||||
'language': 'Language',
|
||||
'change-language': 'Change language',
|
||||
'hide-app-menu': 'Hide App Menu (Windows & Linux Only)',
|
||||
'proxy': 'Proxy',
|
||||
'use-proxy': 'Enable Proxy',
|
||||
'bt-tracker': 'Tracker Servers',
|
||||
'bt-tracker-input-tips': 'Tracker server, one per line',
|
||||
'bt-tracker-tips': 'Recommend: ',
|
||||
'sync-tracker-tips': 'Sync from ngosang/trackerslist',
|
||||
'developer': 'Developer',
|
||||
'mock-user-agent': 'Mock User-Agent',
|
||||
'app-log-path': 'App log path',
|
||||
@@ -32,6 +40,8 @@ export default {
|
||||
'support-more-download-protocols': 'Enable more download protocols support',
|
||||
'browser-extensions': 'Extensions',
|
||||
'baidu-exporter': 'BaiduExporter',
|
||||
'browser-extensions-tip': 'Provided by the community, ',
|
||||
'baidu-exporter-help': 'Click here for usage'
|
||||
'browser-extensions-tips': 'Provided by the community, ',
|
||||
'baidu-exporter-help': 'Click here for usage',
|
||||
'auto-check-update': 'Auto check update',
|
||||
'last-check-update-time': 'Last Check Update Time'
|
||||
}
|
||||
|
||||
@@ -7,11 +7,11 @@ export default {
|
||||
'open-file': 'Open Torrent File...',
|
||||
'uri-task': 'URL',
|
||||
'torrent-task': 'Torrent',
|
||||
'uri-task-tip': 'One task url per line (support magnet)',
|
||||
'thunder-link-tip': 'Tip: Thunder links may not be downloaded after decoding',
|
||||
'uri-task-tips': 'One task url per line (support magnet)',
|
||||
'thunder-link-tips': 'Tip: Thunder links may not be downloaded after decoding',
|
||||
'task-name': 'Task Name',
|
||||
'task-out': 'Rename',
|
||||
'task-out-tip': 'Optional, support single task',
|
||||
'task-out-tips': 'Optional, support single task',
|
||||
'task-split': 'Splits',
|
||||
'task-dir': 'Dir',
|
||||
'pause-task': 'Pause Task',
|
||||
@@ -74,6 +74,9 @@ export default {
|
||||
'download-error-message': '{{taskName}} download error occurred',
|
||||
'download-complete-message': '{{taskName}} download completed',
|
||||
'download-complete-notify': 'Download Completed',
|
||||
'bt-download-complete-message': '{{taskName}} download completed, seeding',
|
||||
'bt-download-complete-notify': 'BT Download Completed, Seeding...',
|
||||
'bt-download-complete-tips': 'Tips: You can stop the task to end the seeding',
|
||||
'download-fail-message': '{{taskName}} download failed',
|
||||
'download-fail-notify': 'Download Failed'
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
export default {
|
||||
'engine-version': 'نسخهی موتور',
|
||||
'about': 'درباره ما',
|
||||
'release': 'نسخههای منتشر شده',
|
||||
'support': 'حمایت'
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
export default {
|
||||
'task-list': 'لیست تسکها',
|
||||
'add-task': 'اضافه کردن تسک',
|
||||
'about': 'درباره ماتریکس',
|
||||
'preferences': 'تنظیمات دلخواه',
|
||||
'check-for-updates': 'چک کردن آپدیت...',
|
||||
'check-for-updates-title': 'چک کردن آپدیت',
|
||||
'update-available-message': 'نسخهی جدید ماتریکس دردسترس است. آپدیت انجام شود؟',
|
||||
'update-not-available-message': 'شما آخرین نسخه را دارید!',
|
||||
'update-downloaded-message': 'آمادهی نصب...',
|
||||
'update-error-message': 'خطای آپدیت',
|
||||
'engine-damaged-message': 'موتور صدمه دیده است! لطفا دوباره نصب کنید :(',
|
||||
'engine-missing-message': 'موتور گم شده است! لطفا دوباره نصب کنید :(',
|
||||
'system-error-title': 'خطای سیستم',
|
||||
'system-error-message': 'برنامه نتوانست شروع به کار کند: {{message}}',
|
||||
'hide': 'ماتریکس رو پنهان کن',
|
||||
'hide-others': 'بقیه رو پنهان کن',
|
||||
'unhide': 'همه را نشان بده',
|
||||
'show': 'ماتریکس را نشان بده',
|
||||
'quit': 'از ماتریکس خارج شو',
|
||||
'under-development-message': 'ببخشید، این قابلیت در حال توسعه است...',
|
||||
'yes': 'بله',
|
||||
'no': 'خیر',
|
||||
'cancel': 'لغو',
|
||||
'submit': 'ثبت',
|
||||
'gt1d': '> یک روز',
|
||||
'hour': 'ساعت',
|
||||
'minute': 'دقیقه',
|
||||
'second': 'ثانیه'
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
export default {
|
||||
'undo': 'برگردان',
|
||||
'redo': 'دوباره انجام بده',
|
||||
'cut': 'کات',
|
||||
'copy': 'کپی',
|
||||
'paste': 'پیست',
|
||||
'delete': 'حذف',
|
||||
'select-all': 'انتخاب همه'
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'official-website': 'سایت ماتریکس',
|
||||
'manual': 'راهنما',
|
||||
'release-notes': 'نکات نسخه...',
|
||||
'report-problem': 'گزارش مشکل',
|
||||
'toggle-dev-tools': 'رفتن به ابزارهای توسعهدهندگان'
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import about from './about'
|
||||
import app from './app'
|
||||
import edit from './edit'
|
||||
import help from './help'
|
||||
import menu from './menu'
|
||||
import preferences from './preferences'
|
||||
import subnav from './subnav'
|
||||
import task from './task'
|
||||
import window from './window'
|
||||
|
||||
export default {
|
||||
about,
|
||||
app,
|
||||
edit,
|
||||
help,
|
||||
menu,
|
||||
preferences,
|
||||
subnav,
|
||||
task,
|
||||
window
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
export default {
|
||||
'app': 'ماتریکس',
|
||||
'file': 'فایل',
|
||||
'task': 'تسک',
|
||||
'edit': 'ویرایش',
|
||||
'window': 'پنجره',
|
||||
'help': 'راهنما'
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
export default {
|
||||
'basic': 'ساده',
|
||||
'advanced': 'پیشرفته',
|
||||
'lab': 'آزمایشگاه',
|
||||
'save': 'ذخیره و اجرا',
|
||||
'discard': 'لغو',
|
||||
'startup': 'شروع برنامه',
|
||||
'auto-resume-all': 'ادامه دادن اتوماتیک تمام تسکهای ناتمام',
|
||||
'default-dir': 'فولدر پیشفرض',
|
||||
'mas-default-dir-tips': 'بخاطر محدودیتهای دسترسی سندباکس از اپ استور، پیشنهاد میشود فولدر دانلود پیشفرض ست شده باشد.',
|
||||
'task-manage': 'مدیریت تسک',
|
||||
'max-concurrent-downloads': 'حداکثر تسکهای فعال',
|
||||
'max-connection-per-server': 'حداکثر اتصال برای هر سرور',
|
||||
'new-task-show-downloading': 'بعد افزودن تسک به صورت اتوماتیک دانلود را نشان بده',
|
||||
'continue': 'ادامه',
|
||||
'task-completed-notify': 'اعلان پس از اتمام دانلود',
|
||||
'auto-purge-record': 'سابقهی دانلود را اتوماتیک هنگام خروج پاک کن',
|
||||
'ui': 'UI',
|
||||
'appearance': 'ظاهر',
|
||||
'theme-auto': 'اتوماتیک',
|
||||
'theme-light': 'روشن',
|
||||
'theme-dark': 'تیره',
|
||||
'language': 'زبان',
|
||||
'change-language': 'تغییر زبان',
|
||||
'hide-app-menu': 'پنهان کردن منوی برنامه (تنها در ویندوز و لینوکس)',
|
||||
'proxy': 'پراکسی',
|
||||
'use-proxy': 'فعال کردن پراکسی',
|
||||
'bt-tracker': 'ردیاب سرور',
|
||||
'bt-tracker-input-tips': 'ردیاب سرور، در هر خط',
|
||||
'bt-tracker-tips': 'توصیه:',
|
||||
'sync-tracker-tips': 'داده همگام سازی از ngosang/trackerslist',
|
||||
'developer': 'توسعهدهنده',
|
||||
'mock-user-agent': 'Mock User-Agent',
|
||||
'app-log-path': 'ادرس لاگ برنامه',
|
||||
'download-session-path': 'ادرس سشن دانلود',
|
||||
'factory-reset': 'بازگردانی به تنظیمات کارخانه',
|
||||
'factory-reset-confirm': 'آیا شما مطمئن هستید؟',
|
||||
'lab-warning': '⚠️ فعالسازی امکانات آزمایشگاه ممکن است باعث کرش برنامه یا از دست دادن دیتا بشود، خودتون تصمیم بگیرین!',
|
||||
'download-protocol': 'پروتکل',
|
||||
'support-more-download-protocols': 'فعالسازی حمایت از پروتکلهای دانلود بیشتر',
|
||||
'browser-extensions': 'افزونهها',
|
||||
'baidu-exporter': 'BaiduExporter',
|
||||
'browser-extensions-tips': 'تهیه شده توسط انجمن، ',
|
||||
'baidu-exporter-help': 'برای استفاده اینجا کلیک کنید',
|
||||
'auto-check-update': 'اتوماتیک برای آپدیت چک کن',
|
||||
'last-check-update-time': 'آخرین باری که برای آپدیت چک شده'
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
export default {
|
||||
'task-list': 'تسکها',
|
||||
'preferences': 'تنظیمات دلخواه'
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
export default {
|
||||
'active': 'درحال دانلود',
|
||||
'waiting': 'صبرکردن',
|
||||
'stopped': 'متوقف شده',
|
||||
'new-task': 'تسک جدید',
|
||||
'new-bt-task': 'تسک BT جدید',
|
||||
'open-file': 'بازکردن فایل تورنت...',
|
||||
'uri-task': 'آدرس اینترنتی',
|
||||
'torrent-task': 'تورنت',
|
||||
'uri-task-tips': 'یک آدرس دانلود در هر خط',
|
||||
'thunder-link-tips': 'نکته: لینکهای تاندر ممکن هست بعد دیکد کردن دانلود نشوند',
|
||||
'task-name': 'اسم تسک',
|
||||
'task-out': 'تغییرنام',
|
||||
'task-out-tips': 'اختیاری، حمایت تک تسک',
|
||||
'task-split': 'برشها',
|
||||
'task-dir': 'آدرس',
|
||||
'pause-task': 'متوقف کن',
|
||||
'task-ua': 'UA',
|
||||
'task-user-agent': 'User-Agent',
|
||||
'task-referer': 'Referer',
|
||||
'task-cookie': 'Cookie',
|
||||
'navigate-to-downloading': 'برو به دانلودها',
|
||||
'show-advanced-options': 'تنظیمات پیشرفته',
|
||||
'copyright-warning': 'خطر کپیرایت',
|
||||
'copyright-warning-message': 'فایلی که میخواهید دانلود کنید ممکن است صوت یا ویدیوی تحت حمایت قانون کپی رایت باشد، مطمئن شوید که لایسنس کپی رایت را دارید.',
|
||||
'copyright-yes': 'بله، دارم',
|
||||
'copyright-no': 'خیر',
|
||||
'copyright-error-message': 'به دلایل کپیرایت، اضافه کردن تسک انجام نشد',
|
||||
'pause-task-success': 'تسک رو متوقف کن "{{taskName}}" موفقیت',
|
||||
'pause-task-fail': 'تسک رو متوقف کن "{{taskName}}" شکست',
|
||||
'resume-task': 'تسک را ادامه بده',
|
||||
'resume-task-success': 'تسک را ادامه بده "{{taskName}}" موفقیت',
|
||||
'resume-task-fail': 'تسک را ادامه بده "{{taskName}}" شکست',
|
||||
'delete-task': 'حذف کردن تسک',
|
||||
'delete-selected-tasks': 'تسکهای انتخاب شده را حذف کن',
|
||||
'delete-task-confirm': 'آیا مطمئن هستید که "{{taskName}}" تسک حذف شود؟',
|
||||
'delete-task-label': 'همراه فایلها حذف کن',
|
||||
'delete-task-success': 'حذف تسک "{{taskName}}" موفقیت',
|
||||
'delete-task-fail': 'حذف تسک "{{taskName}}" شکست',
|
||||
'remove-task-file-fail': 'تسک حذف نشد، لطفا دستی حذف کنید',
|
||||
'remove-task-config-file-fail': 'فایل کانفیگ تسک حذف نشد، لطفا دستی حذف کنید',
|
||||
'move-task-up': 'تسک را بالا ببر',
|
||||
'move-task-down': 'تسک را بیار پایین',
|
||||
'pause-all-task': 'تمام تسکها را متوقف کن',
|
||||
'pause-all-task-success': 'متوقف کردن تسک ها موفقیت آمیز بود',
|
||||
'pause-all-task-fail': 'تسکها متوقف نشدند',
|
||||
'resume-all-task': 'تمام تسکها را ادامه بده',
|
||||
'resume-all-task-success': 'ادامه دادن تسکها موفقیت آمیز بود',
|
||||
'resume-all-task-fail': 'تسکها ادامه داده نشدند',
|
||||
'clear-recent-tasks': 'تسکهای اخیرا را پاک کن',
|
||||
'purge-record': 'سابقهی تسکها را پاک کن',
|
||||
'purge-record-success': 'پاک کردن سابقه تسکها موفقیت آمیز بود',
|
||||
'purge-record-fail': 'سابقه تسکها پاک نشدند',
|
||||
'refresh-list': 'لیست تسکها را رفرش کن',
|
||||
'no-task': 'دانلود کنونیای نیست',
|
||||
'copy-link': 'کپیکردن لینک',
|
||||
'copy-link-success': 'کپی کردن لینک موفقیت آمیز بود',
|
||||
'remove-record': 'سابقهی تسک را پاک کن',
|
||||
'remove-record-confirm': 'آیا شما مطمئن هستید سابقه "{{taskName}}" حذف شود؟',
|
||||
'remove-record-label': 'با فایلها پاک کن',
|
||||
'remove-record-success': 'سابقهی تسک "{{taskName}}" با موفقیت پاک شد',
|
||||
'remove-record-fail': 'سابقهی تسک "{{taskName}}" پاک نشد',
|
||||
'show-in-folder': 'تسک را در فولدر نشان بده',
|
||||
'file-not-exist': 'فایل وجود ندارد یا حذف شده است',
|
||||
'file-path-error': 'خطای آدرس فایل',
|
||||
'opening-task-message': 'بازکردن "{{taskName}}" ...',
|
||||
'get-task-name': 'اسم تسک را بگیر...',
|
||||
'remaining-prefix': 'باقیمانده',
|
||||
'select-torrent': 'تورنت را به اینجا بکشید یا کلیک کنید تا انتخاب کنید',
|
||||
'task-info-dialog-title': '{{title}} جزئیات',
|
||||
'download-start-message': 'شروع دانلود {{taskName}}',
|
||||
'download-pause-message': 'توقف دانلود {{taskName}}',
|
||||
'download-stop-message': '{{taskName}} متوقف شد',
|
||||
'download-error-message': '{{taskName}} خطای دانلود',
|
||||
'download-complete-message': '{{taskName}} دانلود کامل شد',
|
||||
'download-complete-notify': 'دانلود کامل شد',
|
||||
'bt-download-complete-message': '{{taskName}} download completed, seeding',
|
||||
'bt-download-complete-notify': 'BT Download Completed, Seeding...',
|
||||
'bt-download-complete-tips': 'Tips: You can stop the task to end the seeding',
|
||||
'download-fail-message': '{{taskName}} دانلود شکست خورد',
|
||||
'download-fail-notify': 'دانلود شکست خورد'
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
export default {
|
||||
'reload': 'ریلود',
|
||||
'close': 'بستن',
|
||||
'minimize': 'کوچک کردن',
|
||||
'zoom': 'زوم',
|
||||
'toggle-fullscreen': 'رفتن به حالت فولاسکرین',
|
||||
'front': 'همه را جلو بیار'
|
||||
}
|
||||
@@ -7,7 +7,7 @@ export default {
|
||||
'startup': 'Démarrage',
|
||||
'auto-resume-all': 'Reprendre les tâches non terminées',
|
||||
'default-dir': 'Répertoire par défaut',
|
||||
'mas-default-dir-tip': 'En raison des restrictions d\'autorisations du bac à sable de l\'App Store, il est recommandé de définir le répertoire de téléchargement par défaut sur le répertoire Téléchargements.',
|
||||
'mas-default-dir-tips': 'En raison des restrictions d\'autorisations du bac à sable de l\'App Store, il est recommandé de définir le répertoire de téléchargement par défaut sur le répertoire Téléchargements.',
|
||||
'task-manage': 'Tâches',
|
||||
'max-concurrent-downloads': 'Nombre de tâches active au maximum',
|
||||
'max-connection-per-server': 'Nombre maximum de connexions par serveurs',
|
||||
@@ -16,11 +16,19 @@ export default {
|
||||
'task-completed-notify': 'Notifier à la fin d\'un téléchargement',
|
||||
'auto-purge-record': 'Purger l\'historique de téléchargement lorsque vous quittez l\'application',
|
||||
'ui': 'UI',
|
||||
'appearance': 'Mode d\'apparence',
|
||||
'theme-auto': 'Automatique',
|
||||
'theme-light': 'Clair',
|
||||
'theme-dark': 'Sombre',
|
||||
'language': 'Langues',
|
||||
'change-language': 'Changer la langue',
|
||||
'hide-app-menu': 'Cacher le menu de l\'application (Windows & Linux uniquement)',
|
||||
'proxy': 'Proxy',
|
||||
'use-proxy': 'Activer le Proxy',
|
||||
'bt-tracker': 'Serveurs Tracker',
|
||||
'bt-tracker-input-tips': 'Serveur de suivi, un par ligne',
|
||||
'bt-tracker-tips': 'Recommander:',
|
||||
'sync-tracker-tips': 'Sync de ngosang/trackerslist',
|
||||
'developer': 'Développeur',
|
||||
'mock-user-agent': 'Mock User-Agent',
|
||||
'app-log-path': 'Chemin des logs',
|
||||
@@ -32,6 +40,8 @@ export default {
|
||||
'support-more-download-protocols': 'Activer les protocoles de téléchargement suplémentaires',
|
||||
'browser-extensions': 'Extensions',
|
||||
'baidu-exporter': 'BaiduExporter',
|
||||
'browser-extensions-tip': 'Fourni par la communauté, ',
|
||||
'baidu-exporter-help': 'Cliquez ici pour voir l\'utilisation'
|
||||
'browser-extensions-tips': 'Fourni par la communauté, ',
|
||||
'baidu-exporter-help': 'Cliquez ici pour voir l\'utilisation',
|
||||
'auto-check-update': 'Mise à jour automatique',
|
||||
'last-check-update-time': 'dernier contrôle la mise à jour du temps'
|
||||
}
|
||||
|
||||
@@ -7,11 +7,11 @@ export default {
|
||||
'open-file': 'Ouvrir un fichier torrent...',
|
||||
'uri-task': 'Lien',
|
||||
'torrent-task': 'Torrent',
|
||||
'uri-task-tip': 'Un lien par ligne (supporte les magnets)',
|
||||
'thunder-link-tip': 'Astuce: Les liens Thunder ne doivent pas être téléchargés après décodage',
|
||||
'uri-task-tips': 'Un lien par ligne (supporte les magnets)',
|
||||
'thunder-link-tips': 'Astuce: Les liens Thunder ne doivent pas être téléchargés après décodage',
|
||||
'task-name': 'Nom de la tâche',
|
||||
'task-out': 'Renommer',
|
||||
'task-out-tip': 'Optionel, supporte une seule tâche',
|
||||
'task-out-tips': 'Optionel, supporte une seule tâche',
|
||||
'task-split': 'Découpages',
|
||||
'task-dir': 'Répertoire',
|
||||
'pause-task': 'Mettre en Pause',
|
||||
@@ -74,6 +74,9 @@ export default {
|
||||
'download-error-message': '{{taskName}} une erreur c\'est produite',
|
||||
'download-complete-message': '{{taskName}} téléchargement terminé',
|
||||
'download-complete-notify': 'Téléchargement Terminé',
|
||||
'bt-download-complete-message': '{{taskName}} téléchargement terminé, ensemencement...',
|
||||
'bt-download-complete-notify': 'BT Télécharger Terminé, Ensemencement...',
|
||||
'bt-download-complete-tips': 'Astuces: Vous pouvez arrêter la tâche pour mettre fin à l\'ensemencement',
|
||||
'download-fail-message': '{{taskName}} téléchargement échoué',
|
||||
'download-fail-notify': 'Téléchargement Échoué'
|
||||
}
|
||||
|
||||
@@ -14,10 +14,22 @@ export const availableLanguages = [
|
||||
value: 'en-US',
|
||||
label: 'English'
|
||||
},
|
||||
{
|
||||
value: 'fa',
|
||||
label: 'فارسی'
|
||||
},
|
||||
{
|
||||
value: 'fr',
|
||||
label: 'Français'
|
||||
},
|
||||
{
|
||||
value: 'ja',
|
||||
label: '日本語'
|
||||
},
|
||||
{
|
||||
value: 'ko',
|
||||
label: '한국어'
|
||||
},
|
||||
{
|
||||
value: 'pt-BR',
|
||||
label: 'Português (Brasil)'
|
||||
@@ -44,6 +56,9 @@ function checkLngIsAvailable (locale) {
|
||||
* getLanguage
|
||||
* @param { String } locale
|
||||
* https://electronjs.org/docs/api/locales
|
||||
*
|
||||
* You need to add a fallback when there are
|
||||
* multiple locale keys with the same prefix
|
||||
*/
|
||||
export function getLanguage (locale = 'en-US') {
|
||||
if (checkLngIsAvailable(locale)) {
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
export default {
|
||||
'engine-version': 'バージョンを確認',
|
||||
'about': '私たちについて',
|
||||
'release': 'リリースノート',
|
||||
'support': 'サポート'
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
export default {
|
||||
'task-list': 'タスクリスト',
|
||||
'add-task': 'タスクを追加',
|
||||
'about': 'Motrix について',
|
||||
'preferences': '環境設定...',
|
||||
'check-for-updates': '更新を確認...',
|
||||
'hide': 'Motrix を隠す',
|
||||
'hide-others': 'ほかを隠す',
|
||||
'unhide': 'すべてを表示',
|
||||
'quit': 'Motrix を終了',
|
||||
'under-development-message': 'この機能は開発中です...',
|
||||
'yes': 'はい',
|
||||
'no': 'いいえ',
|
||||
'cancel': 'キャンセル',
|
||||
'submit': '確認',
|
||||
'gt1d': '一日を超える',
|
||||
'hour': '時',
|
||||
'minute': '分',
|
||||
'second': '秒'
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
export default {
|
||||
'undo': '元に戻す',
|
||||
'redo': 'やり直す',
|
||||
'cut': '切り取り',
|
||||
'copy': 'コピー',
|
||||
'paste': '貼り付け',
|
||||
'delete': '削除',
|
||||
'select-all': 'すべてを選択'
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'official-website': 'Motrix 公式サイト',
|
||||
'manual': '使用説明',
|
||||
'release-notes': 'リリースノート...',
|
||||
'report-problem': '問題を報告',
|
||||
'toggle-dev-tools': '開発者ツール'
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import about from './about'
|
||||
import app from './app'
|
||||
import edit from './edit'
|
||||
import help from './help'
|
||||
import menu from './menu'
|
||||
import preferences from './preferences'
|
||||
import subnav from './subnav'
|
||||
import task from './task'
|
||||
import window from './window'
|
||||
|
||||
export default {
|
||||
about,
|
||||
app,
|
||||
edit,
|
||||
help,
|
||||
menu,
|
||||
preferences,
|
||||
subnav,
|
||||
task,
|
||||
window
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
export default {
|
||||
'app': 'Motrix',
|
||||
'file': 'ファイル',
|
||||
'task': 'タスク',
|
||||
'edit': '編集',
|
||||
'window': 'ウィンドウ',
|
||||
'help': 'ヘルプ'
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
export default {
|
||||
'basic': '基本設定',
|
||||
'advanced': '詳細設定',
|
||||
'lab': '実験室',
|
||||
'save': '保存して適用',
|
||||
'discard': '放棄',
|
||||
'startup': '起動',
|
||||
'auto-resume-all': '起動後自動的に未完了タスクを再開',
|
||||
'default-dir': '既定の保存先',
|
||||
'mas-default-dir-tips': 'App Store の Sandbox 制限のため,デフォルトディレクトリ設定は「Download」を推奨します。',
|
||||
'task-manage': 'タスク管理',
|
||||
'max-concurrent-downloads': '最大同時タスク数',
|
||||
'max-connection-per-server': '最大サーバ接続数',
|
||||
'new-task-show-downloading': '新規タスクを作成後自動的にタスク画面に移る',
|
||||
'continue': '続ける',
|
||||
'task-completed-notify': 'タスク完了後に通知する',
|
||||
'auto-purge-record': 'アプリケーション終了後自動的にタスク履歴を削除',
|
||||
'ui': 'UI',
|
||||
'appearance': 'テーマ',
|
||||
'theme-auto': '自動',
|
||||
'theme-light': 'ライト',
|
||||
'theme-dark': 'ダーク',
|
||||
'language': '言語',
|
||||
'change-language': '言語を切り替え',
|
||||
'hide-app-menu': 'メニューバーを隠す(Windows と Linux のみサポート)',
|
||||
'proxy': 'プロキシ',
|
||||
'use-proxy': 'プロキシを使う',
|
||||
'bt-tracker': 'トラッカーサーバー',
|
||||
'bt-tracker-input-tips': 'トラッカーサーバ、一行に一つ',
|
||||
'bt-tracker-tips': 'お勧め:',
|
||||
'sync-tracker-tips': 'ngosang/trackerslist からの同期',
|
||||
'developer': '開発者',
|
||||
'mock-user-agent': '偽装ユーザーエージェント(UA)',
|
||||
'app-log-path': 'ログディレクトリを適用',
|
||||
'download-session-path': 'セッションパスをダウンロード',
|
||||
'factory-reset': '初期設定に戻す',
|
||||
'factory-reset-confirm': '本当に初期設定に戻しますか?',
|
||||
'lab-warning': '⚠️ベータ機能をオンにするとアプリケーションの強制終了やデータが損失する可能性があります。自己責任でお願いします。',
|
||||
'download-protocol': 'プロトコル',
|
||||
'support-more-download-protocols': 'より多くのプロトコルを適用',
|
||||
'browser-extensions': 'ブラウザ拡張機能',
|
||||
'baidu-exporter': 'バイドゥオンラインストレージ拡張機能',
|
||||
'browser-extensions-tips': '他のユーザによって作成されたものです。動作は保証できません。',
|
||||
'baidu-exporter-help': 'ここをクリックし使用説明を見る',
|
||||
'auto-check-update': '更新を自動で確認する',
|
||||
'last-check-update-time': '前回更新確認時間'
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
export default {
|
||||
'task-list': 'タスクリスト',
|
||||
'preferences': '環境設定'
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
export default {
|
||||
'active': 'ダウンロード中',
|
||||
'waiting': '待機中',
|
||||
'stopped': '一時停止中',
|
||||
'new-task': '新規タスク',
|
||||
'new-bt-task': '新規torrentタスク',
|
||||
'open-file': 'torrentファイルを開く...',
|
||||
'uri-task': 'URLタスク',
|
||||
'torrent-task': 'torrentタスク',
|
||||
'uri-task-tips': 'URLを複数追加したとき、一行につき一つのリンクとなります(マグネットリンクをサポート)',
|
||||
'thunder-link-tips': '注意:Thunder(Xunlei)リンク解析後、ダウンロードできるかは保証できません',
|
||||
'task-name': 'タスク名',
|
||||
'task-out': '名前を変更',
|
||||
'task-out-tips': 'オプション(単独タスクのみサポート)',
|
||||
'task-split': 'タスク分割',
|
||||
'task-dir': 'タスク保存先',
|
||||
'task-ua': 'UA',
|
||||
'task-user-agent': 'ユーザーエージェント',
|
||||
'task-referer': 'リファラ',
|
||||
'task-cookie': 'クッキー',
|
||||
'navigate-to-downloading': 'タスク画面に進む',
|
||||
'show-advanced-options': '詳細設定',
|
||||
'copyright-warning': '著作権警告',
|
||||
'copyright-warning-message': 'あなたがダウンロードしようとしているファイルは著作権のある音声・動画の可能性があります。著作権があるかどうか確認してください',
|
||||
'copyright-yes': 'はい、著作権があります',
|
||||
'copyright-no': 'いいえ',
|
||||
'copyright-error-message': '著作権の問題で、タスク追加に失敗',
|
||||
'pause-task': 'タスクを一時停止',
|
||||
'pause-task-success': 'タスク "{{taskName}}" の一時停止に成功',
|
||||
'pause-task-fail': 'タスク "{{taskName}}" の一時停止に失敗',
|
||||
'resume-task': 'タスクを再開',
|
||||
'resume-task-success': 'タスク "{{taskName}}" の再開に成功',
|
||||
'resume-task-fail': '恢复任务 "{{taskName}}" の再開に失敗',
|
||||
'delete-task': 'タスクを削除',
|
||||
'delete-selected-tasks': '選択中のタスクを削除',
|
||||
'delete-task-confirm': '本当にタスク "{{taskName}}" を削除しますか?',
|
||||
'delete-task-label': '同時にタスクを削除',
|
||||
'delete-task-success': 'タスク "{{taskName}}" の削除に成功',
|
||||
'delete-task-fail': 'タスク "{{taskName}}" の削除に失敗',
|
||||
'remove-task-file-fail': 'ダウンロードファイルの削除に失敗、手動で削除してください',
|
||||
'remove-task-config-file-fail': 'タスク設定ファイルの削除に失敗、手動で削除してください',
|
||||
'move-task-up': 'タスクを上に移す',
|
||||
'move-task-down': 'タスクを下に移す',
|
||||
'pause-all-task': 'すべてのタスクを一時停止',
|
||||
'pause-all-task-success': 'すべてのタスクの一時停止に成功',
|
||||
'pause-all-task-fail': 'すべてのタスクの一時停止に失敗',
|
||||
'resume-all-task': 'すべてのタスクを再開',
|
||||
'resume-all-task-success': 'すべてのタスクを再開に成功',
|
||||
'resume-all-task-fail': 'すべてのタスクを再開に失敗',
|
||||
'clear-recent-tasks': '最近のタスク履歴を削除',
|
||||
'purge-record': 'タスク履歴をクリア',
|
||||
'purge-record-success': 'タスク履歴のクリアに成功',
|
||||
'purge-record-fail': 'タスク履歴のクリアに失敗',
|
||||
'refresh-list': 'タスクリストを更新',
|
||||
'no-task': 'タスクはありません',
|
||||
'copy-link': 'リンクをコピー',
|
||||
'copy-link-success': 'リンクのコピーに成功',
|
||||
'remove-record': 'タスク履歴を削除',
|
||||
'remove-record-confirm': '本当に "{{taskName}}" のタスク履歴を削除しますか?',
|
||||
'remove-record-label': 'ダウンロードファイルも同時に削除',
|
||||
'remove-record-success': ' "{{taskName}}" のタスク履歴の削除に成功',
|
||||
'remove-record-fail': ' "{{taskName}}" のタスク履歴の削除に失敗',
|
||||
'show-in-folder': 'フォルダを表示',
|
||||
'file-not-exist': 'お探しのファイルは存在しないか、削除されています。',
|
||||
'file-path-error': 'ファイルパスエラー',
|
||||
'opening-task-message': '現在 "{{taskName}}" を開いています...',
|
||||
'get-task-name': 'タスク名を取得しています...',
|
||||
'remaining-prefix': '残り',
|
||||
'select-torrent': 'torrentファイルをドラッグ&ドロップするか、ここをクリック',
|
||||
'task-info-dialog-title': '{{title}} の詳細',
|
||||
'download-start-message': '{{taskName}}のダウンロードを開始',
|
||||
'download-pause-message': '{{taskName}}のダウンロードを一時停止',
|
||||
'download-stop-message': '{{taskName}} のダウンロードを中止',
|
||||
'download-error-message': '{{taskName}} のダウンロードにエラーが発生',
|
||||
'download-complete-message': '{{taskName}} のダウンロードに成功',
|
||||
'download-complete-notify': 'ダウンロード成功',
|
||||
'bt-download-complete-message': '{{taskName}} のダウンロードに成功、seedを作成中...',
|
||||
'bt-download-complete-notify': 'torrentタスクのダウンロードに成功,seedを作成中...',
|
||||
'bt-download-complete-tips': 'ヒント:タスクを停止しseedの作成を終了することができます',
|
||||
'download-fail-message': '{{taskName}} のダウンロードに失敗',
|
||||
'download-fail-notify': 'ダウンロード失敗'
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
export default {
|
||||
'reload': 'リロード',
|
||||
'close': '閉じる',
|
||||
'minimize': '最小化',
|
||||
'zoom': '拡大',
|
||||
'toggle-fullscreen': 'フルスクリーンにする',
|
||||
'front': '全てを手前に移動'
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
export default {
|
||||
'engine-version': '엔진 버전',
|
||||
'about': '정보',
|
||||
'release': '배포',
|
||||
'support': '지원'
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
export default {
|
||||
'task-list': '작업 목록',
|
||||
'add-task': '작업 추가',
|
||||
'about': 'Motrix 정보',
|
||||
'preferences': '설정...',
|
||||
'check-for-updates': '업데이트 확인...',
|
||||
'check-for-updates-title': '업데이트 확인',
|
||||
'update-available-message': '새 버전의 Motrix를 사용할 수 있습니다, 지금 업데이트 하시겠습니까?',
|
||||
'update-not-available-message': '최신 버전을 사용 중입니다!',
|
||||
'update-downloaded-message': '설치 준비 완료...',
|
||||
'update-error-message': '업데이트 오류',
|
||||
'engine-damaged-message': '엔진이 손상되었으므로 다시 설치하십시오 : (',
|
||||
'engine-missing-message': '엔진이 누락되었으므로 다시 설치하십시오 : (',
|
||||
'system-error-title': '시스템 오류',
|
||||
'system-error-message': '응용 프로그램 시작 실패 : {{message}}',
|
||||
'hide': 'Motrix 숨기기',
|
||||
'hide-others': '다른 항목 숨기기',
|
||||
'unhide': '모두 보기',
|
||||
'show': 'Motrix 보기',
|
||||
'quit': 'Motrix 종료',
|
||||
'under-development-message': '죄송합니다, 이 기능은 개발 중입니다...',
|
||||
'yes': '예',
|
||||
'no': '아니요',
|
||||
'cancel': '취소',
|
||||
'submit': '제출',
|
||||
'gt1d': '> 1 일',
|
||||
'hour': '시간',
|
||||
'minute': '분',
|
||||
'second': '초'
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
export default {
|
||||
'undo': '실행 취소',
|
||||
'redo': '재실행',
|
||||
'cut': '잘라내기',
|
||||
'copy': '복사',
|
||||
'paste': '붙여넣기',
|
||||
'delete': '삭제',
|
||||
'select-all': '모두 선택'
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'official-website': 'Motrix 웹사이트',
|
||||
'manual': '메뉴얼',
|
||||
'release-notes': '배포 정보...',
|
||||
'report-problem': '문제 보고',
|
||||
'toggle-dev-tools': '개발자 도구'
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import about from './about'
|
||||
import app from './app'
|
||||
import edit from './edit'
|
||||
import help from './help'
|
||||
import menu from './menu'
|
||||
import preferences from './preferences'
|
||||
import subnav from './subnav'
|
||||
import task from './task'
|
||||
import window from './window'
|
||||
|
||||
export default {
|
||||
about,
|
||||
app,
|
||||
edit,
|
||||
help,
|
||||
menu,
|
||||
preferences,
|
||||
subnav,
|
||||
task,
|
||||
window
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
export default {
|
||||
'app': 'Motrix',
|
||||
'file': '파일',
|
||||
'task': '작업',
|
||||
'edit': '편집',
|
||||
'window': '창',
|
||||
'help': '?'
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
export default {
|
||||
'basic': '기본',
|
||||
'advanced': '고급',
|
||||
'lab': '실험실',
|
||||
'save': '저장 & 적용',
|
||||
'discard': '포기',
|
||||
'startup': '시작',
|
||||
'auto-resume-all': '완료되지 않은 모든 작업 자동 재개',
|
||||
'default-dir': '기본 폴더',
|
||||
'mas-default-dir-tips': '앱스토어의 샌드박스 사용 권한 제한으로 인해 기본 다운로드 폴더를 다운로드 폴더로 설정하는 것이 권장됩니다.',
|
||||
'task-manage': '작업 관리',
|
||||
'max-concurrent-downloads': '최대 활성 작업',
|
||||
'max-connection-per-server': '서버당 최대 연결 수',
|
||||
'new-task-show-downloading': '작업 추가 후 다운로드 자동 표시',
|
||||
'continue': '계속',
|
||||
'task-completed-notify': '다운로드 완료 후 알림',
|
||||
'auto-purge-record': '앱 종료 시 다운로드 기록 자동 삭제',
|
||||
'ui': 'UI',
|
||||
'appearance': '테마',
|
||||
'theme-auto': '자동',
|
||||
'theme-light': '밝은',
|
||||
'theme-dark': '어두운',
|
||||
'language': '언어',
|
||||
'change-language': '언어 변경',
|
||||
'hide-app-menu': '앱 메뉴 숨기기 (Windows & Linux)',
|
||||
'proxy': '프록시',
|
||||
'use-proxy': '프록시 허용',
|
||||
'bt-tracker': '트래커 서버',
|
||||
'bt-tracker-input-tips': '트래커 서버, 한 줄에 하나씩',
|
||||
'bt-tracker-tips': '추천 :',
|
||||
'sync-tracker-tips': 'ngosang/trackerslist에서 동기화',
|
||||
'developer': '개발자',
|
||||
'mock-user-agent': '사용자 에이전트 흉내',
|
||||
'app-log-path': '앱 로그 경로',
|
||||
'download-session-path': '다운로드 세션 경로',
|
||||
'factory-reset': '공장 초기화',
|
||||
'factory-reset-confirm': '초기 설정으로 되돌리시겠습니까?',
|
||||
'lab-warning': '⚠️ 실험실 기능을 활성화하면 앱 충돌이나 데이터 손실을 초래할 수 있으므로 직접 결정하십시오!',
|
||||
'download-protocol': '프로토콜',
|
||||
'support-more-download-protocols': '더 많은 다운로드 프로토콜 지원 허용',
|
||||
'browser-extensions': '확장 프로그램',
|
||||
'baidu-exporter': 'BaiduExporter',
|
||||
'browser-extensions-tips': '커뮤니티에서 제공하는, ',
|
||||
'baidu-exporter-help': '사용법을 보려면 여기를 클릭하십시오.',
|
||||
'auto-check-update': '업데이트 자동 확인',
|
||||
'last-check-update-time': '마지막 업데이트 확인 시간'
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user