Compare commits

...

74 Commits

Author SHA1 Message Date
Dr_rOot dc3a01fb3c fix: bump version to 1.3.7 2019-04-27 22:02:23 +08:00
KOZ39 591de11072 fix: Improve Korean translation (#238) 2019-04-27 21:54:46 +08:00
Dr_rOot 853c361e6d fix: bump version to 1.3.6 2019-04-27 19:37:35 +08:00
Dr_rOot b0ebc737e2 fix: i18n rename and add some keys 2019-04-27 19:36:02 +08:00
Dr_rOot bc9db25dfd fix: position of the proxy input is incorrect 2019-04-27 19:34:52 +08:00
KOZ39 08c9902759 feat: Add Korean translation (#236)
* Add Korean translation

* Fix typo
2019-04-27 18:31:10 +08:00
Nima Rasooli 8d2f52710d feat: Translated to Persian/Farsi (#235)
* Create about.js

* Rename src/shared/locales/fa-IR/about.js to src/shared/locales/fa/about.js

* Translated

* Translated

* Translated

* Translated

* Create index.js

* Translated

* Translated

* Translated

* translated

* Translated
2019-04-27 18:30:46 +08:00
Dr_rOot dd48fd79db fix: bump version to 1.3.5 2019-04-27 18:03:34 +08:00
Dr_rOot 9e7ad10309 Merge branch 'feature/bt_experience_opt_201904262310' 2019-04-27 18:02:19 +08:00
Dr_rOot 6e17102210 fix: mo protocol new-bt-task 2019-04-27 17:54:27 +08:00
Dr_rOot 5ed3b68a57 fix: handle launch argv 2019-04-27 17:31:56 +08:00
Dr_rOot a705427ce2 fix: open url in win & linux 2019-04-27 15:55:34 +08:00
Dr_rOot c37f7c73ce doc: change Manual link to github wiki 2019-04-27 12:14:05 +08:00
Dr_rOot efcf01d59b feat: handle magnet protocol 2019-04-27 12:13:02 +08:00
Dr_rOot 324b61567d fix: typo tip => tips 2019-04-26 23:57:55 +08:00
Dr_rOot d1e24fced0 fix: i18n preference bt tracker 2019-04-26 23:57:11 +08:00
Dr_rOot cb50d6709b feat: sync bt tracker from github
An updated list of public BitTorrent trackers
https://github.com/ngosang/trackerslist
2019-04-26 23:27:23 +08:00
Dr_rOot 900ac4c8d1 feat: preference advanced add bt tracker input 2019-04-26 23:19:10 +08:00
Dr_rOot 6696b0a538 refactor: move bt-tracker to config manager 2019-04-26 23:15:01 +08:00
Dr_rOot 110c83bcb8 fix: dht config optimization 2019-04-26 23:13:58 +08:00
Dr_rOot 136b4969bd chore: update readme
Add dark mode
2019-04-25 15:45:58 +08:00
weearc a901fdd2b6 docs: readme added linux installation guide (#228)
* add aur helper command in readme

* add aur helper command in readme
2019-04-25 15:07:56 +08:00
Dr_rOot 215bdbc416 fix: prepare for electron 5.0.x
Set webPreferences nodeIntegration to true
2019-04-25 10:53:25 +08:00
Dr_rOot 4e8d226460 fix: optimized for small screen users #48 #224 2019-04-25 10:16:16 +08:00
Dr_rOot 23f3357d27 fix: bump version to 1.3.3 2019-04-24 21:56:38 +08:00
Dr_rOot 7adafab7fe fix: i18n ja 2019-04-24 21:55:39 +08:00
HBKRKZK e3afb14e4a feat: Add Japanese language translation (#225)
* Create darwin.json

* Add files via upload

* Create about.js

* Add files via upload

* Update all.js

* Update app.js

* Update index.js

* fix

* fix preferences.js
2019-04-24 21:48:41 +08:00
Dr_rOot 228cd1fa7d fix: bump version to 1.3.2 2019-04-24 16:29:41 +08:00
Dr_rOot 47a7464bf9 doc: update translation guide 2019-04-24 16:28:04 +08:00
Dr_rOot 8efd86af3d feat: remove similar unuse config key 2019-04-24 11:35:31 +08:00
Dr_rOot ee78ae262e fix: bump version v1.3.1 2019-04-24 10:22:52 +08:00
Dr_rOot 7562f6a7d1 fix: downgrade electron-store 2019-04-24 10:22:32 +08:00
Dr_rOot defacd50e8 fix: build script —experimental-worker 2019-04-24 00:06:01 +08:00
Dr_rOot f5ed0d89cc fix: bump version to 1.3.x 2019-04-23 23:47:14 +08:00
Dr_rOot a3bb1c7ff1 Merge branch 'feature/dark_mode_201904201437' 2019-04-23 23:43:04 +08:00
Dr_rOot d0085b295d refactor: bt complete show seeding tips #179 #134 2019-04-23 23:40:01 +08:00
Dr_rOot 6cb278fd9e chore: manual update tracker 2019-04-23 18:14:50 +08:00
Dr_rOot aeeb9813ed refactor: lint fix 2019-04-23 17:56:45 +08:00
Dr_rOot 359da895e7 fix: migration electron-log from v2 to v3 2019-04-23 17:23:52 +08:00
Dr_rOot 8a3f510c38 refactor: check pid is running before kill it 2019-04-23 17:22:57 +08:00
Dr_rOot 1345994402 feat: add config schema valid 2019-04-23 17:21:56 +08:00
Dr_rOot c770108a6c refactor: electron store sort config key 2019-04-23 17:21:27 +08:00
Dr_rOot 178f2103f1 fix: destroy tray when app exit 2019-04-23 10:41:11 +08:00
Dr_rOot d5c71b50e8 fix: change application module init order 2019-04-23 10:40:30 +08:00
Dr_rOot ce09e76ffb refactor: theme style improve 2019-04-23 10:38:44 +08:00
Dr_rOot 4688b521fa fix: trim after split task link text rows #221
closed #221
2019-04-22 20:52:33 +08:00
Dr_rOot 33960dc264 fix: decrease theme switcher theme text font size 2019-04-22 20:49:15 +08:00
Dr_rOot d29d0d3321 fix: add task dialog background color 2019-04-22 15:42:09 +08:00
Dr_rOot f4c3e7be69 feat: preference advanced add theme switcher 2019-04-22 15:17:48 +08:00
Dr_rOot 338b51975c feat: preference theme switcher i18n 2019-04-22 15:17:23 +08:00
Dr_rOot e1a287350d feat: add preference theme thumb 2019-04-22 15:16:53 +08:00
Dr_rOot afeee1fc86 fix: change theme config 2019-04-21 23:42:52 +08:00
Dr_rOot a39820f8ab refactor: app style 2019-04-21 22:29:27 +08:00
Dr_rOot aea604278c fix: copyright link color 2019-04-21 22:28:40 +08:00
Dr_rOot 0b92e6b96e fix: app info style 2019-04-21 22:28:19 +08:00
Dr_rOot 2ba0040bdd feat: title bar close btn 2019-04-21 22:28:01 +08:00
Dr_rOot 04bf2b6b9d fix: logo svg fill 2019-04-21 22:26:36 +08:00
Dr_rOot cc367f4c5c fix: change show in folder icon size 2019-04-21 22:24:40 +08:00
Dr_rOot 73809a6501 refactor: app theme & add dark theme 2019-04-21 22:23:39 +08:00
Dr_rOot 5067ad7306 feat: app ui respond to system theme changed 2019-04-21 21:36:37 +08:00
Dr_rOot d5b3ad5933 fix: tray icon adapts to the dark mode #206 #207
close #206
close #207
2019-04-21 21:30:07 +08:00
Dr_rOot 7a903e112c feat: theme manager 2019-04-21 21:26:45 +08:00
Dr_rOot 829eb83a4c fix: get task full path error when file path empty 2019-04-17 15:45:20 +08:00
Dr_rOot 886acc2486 fix: thunder link decoding error #201 #209
close #209
2019-04-17 15:12:13 +08:00
Dr_rOot 87440701ab fix: block some ui text selections when drag app 2019-04-10 21:11:10 +08:00
Dr_rOot e880430e3a fix: html tpl 2019-04-07 13:31:00 +08:00
Dr_rOot 2febff883b fix: add missing auto check update TR translation 2019-04-01 21:11:07 +08:00
Bo Yuan 7d8bb443b8 feat: preferences add auto check updates setting
* add auto check update, time out: 1 min.

* fix: add auto check update, check interval: 30 min.

* no message

* no message

* fix: modify update check interval to 7 days, add display of [last check update time] to preference.

* no message

* fix: modified the group of auto-check-update, fix the display of last-check-update-time

* no message

* fix: hide last-check-update-time when never check.
2019-04-01 20:55:30 +08:00
Dr_rOot 1489d58a63 chore: rebuild snap for snapcraft 2019-03-31 11:45:54 +08:00
Dr_rOot 00fdafe824 fix: upgrade electron-builder 2019-03-30 11:46:55 +08:00
Dr_rOot 81c91e8cb1 fix: update readme badges 2019-03-28 22:58:28 +08:00
Dr_rOot 0fd34254de chore: add latest release badge 2019-03-26 20:58:22 +08:00
Dr_rOot d9298f0d46 fix: read me typo 2019-03-25 00:15:34 +08:00
Dr_rOot 83e12a699e docs: update readme add new feature 2019-03-24 21:54:28 +08:00
124 changed files with 4482 additions and 5101 deletions
+1
View File
@@ -9,3 +9,4 @@ npm-debug.log.*
thumbs.db
!.gitkeep
release/*
.idea/
+15 -13
View File
@@ -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
View File
@@ -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
View File
@@ -7,24 +7,43 @@
[English](./README.md) | 简体中文
## 一款全能的下载工具
[![Build Status](https://travis-ci.org/agalwood/Motrix.svg?branch=master)](https://travis-ci.org/agalwood/Motrix) [![Build status](https://ci.appveyor.com/api/projects/status/l11d5h05xwwcvoux/branch/master?svg=true)](https://ci.appveyor.com/project/agalwood/motrix/branch/master) ![Total Downloads](https://img.shields.io/github/downloads/agalwood/Motrix/total.svg) ![Support Platforms](https://camo.githubusercontent.com/a50c47295f350646d08f2e1ccd797ceca3840e52/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6d61634f5325323025374325323057696e646f77732532302537432532304c696e75782d6c69676874677265792e737667)
[![GitHub release](https://img.shields.io/github/release/agalwood/Motrix.svg)](https://github.com/agalwood/Motrix/releases) [![Build Status](https://travis-ci.org/agalwood/Motrix.svg?branch=master)](https://travis-ci.org/agalwood/Motrix) [![Build status](https://ci.appveyor.com/api/projects/status/l11d5h05xwwcvoux/branch/master?svg=true)](https://ci.appveyor.com/project/agalwood/motrix/branch/master) [![Total Downloads](https://img.shields.io/github/downloads/agalwood/Motrix/total.svg)](https://github.com/agalwood/Motrix/releases) ![Support Platforms](https://camo.githubusercontent.com/a50c47295f350646d08f2e1ccd797ceca3840e52/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6d61634f5325323025374325323057696e646f77732532302537432532304c696e75782d6c69676874677265792e737667)
我是个兴趣使然的桌面应用开发者🤓,利用搬砖之余开发了 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 专享)
- 🤖 常驻系统托盘,操作更加便捷
- 🌑 深色模式
- 🗑 移除任务时可同时删除相关文件
- 🌍 国际化,[查看已可选的语言](#-国际化)
- 🎏 ...
## 🖥 应用界面
![motrix-screenshot-task-cn.png](https://cdn.nlark.com/yuque/0/2019/png/129147/1550151234585-e513bd4f-e127-402f-accb-1ebbba9b3c41.png)
## ⌨️ 本地开发
### 克隆代码
```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 位的 aria2cWindows 版使用的 32 位的)
## ☑️ TODO
开发计划请移步 [Trello](https://trello.com/b/qNUzA0bv/motrix) 查看
## 🤝 参与共建 [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
## 🤝 参与共建 [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat)](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) 许可进行开源。
+43 -9
View File
@@ -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.
[![Build Status](https://travis-ci.org/agalwood/Motrix.svg?branch=master)](https://travis-ci.org/agalwood/Motrix) [![Build status](https://ci.appveyor.com/api/projects/status/l11d5h05xwwcvoux/branch/master?svg=true)](https://ci.appveyor.com/project/agalwood/motrix/branch/master) ![Total Downloads](https://img.shields.io/github/downloads/agalwood/Motrix/total.svg) ![Support Platforms](https://camo.githubusercontent.com/a50c47295f350646d08f2e1ccd797ceca3840e52/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6d61634f5325323025374325323057696e646f77732532302537432532304c696e75782d6c69676874677265792e737667)
## A full-featured download manager
[![GitHub release](https://img.shields.io/github/release/agalwood/Motrix.svg)](https://github.com/agalwood/Motrix/releases) [![Build Status](https://travis-ci.org/agalwood/Motrix.svg?branch=master)](https://travis-ci.org/agalwood/Motrix) [![Build status](https://ci.appveyor.com/api/projects/status/l11d5h05xwwcvoux/branch/master?svg=true)](https://ci.appveyor.com/project/agalwood/motrix/branch/master) [![Total Downloads](https://img.shields.io/github/downloads/agalwood/Motrix/total.svg)](https://github.com/agalwood/Motrix/releases) ![Support Platforms](https://camo.githubusercontent.com/a50c47295f350646d08f2e1ccd797ceca3840e52/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6d61634f5325323025374325323057696e646f77732532302537432532304c696e75782d6c69676874677265792e737667)
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
![motrix-screenshot-task-en.png](https://cdn.nlark.com/yuque/0/2019/png/129147/1550151166169-94b4bfb0-746e-42b8-aad7-0b6890f89abb.png)
## ⌨️ 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 [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
## 🤝 Contribute [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat)](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
+9 -9
View File
@@ -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
+9 -9
View File
@@ -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
+9 -9
View File
@@ -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
+2056 -4519
View File
File diff suppressed because it is too large Load Diff
+39 -33
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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',
+80 -24
View File
@@ -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
}
})
}
+9 -1
View File
@@ -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 -1
View File
@@ -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')
+27 -1
View File
@@ -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)
+18 -4
View File
@@ -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')
})
}
}
/**
+46
View File
@@ -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)
}
}
+26 -4
View File
@@ -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()
}
}
+12 -2
View File
@@ -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
View File
@@ -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
+17
View File
@@ -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

+4 -4
View File
@@ -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;
+1 -4
View File
@@ -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 {
+19 -2
View File
@@ -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)
+22
View File
@@ -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'
}
}
})
+5 -5
View File
@@ -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 -22
View File
@@ -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>
+29 -16
View File
@@ -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>
+6 -1
View File
@@ -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 {
+10
View File
@@ -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
}
+94 -12
View File
@@ -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;
}
+21 -6
View File
@@ -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
}
+19 -14
View File
@@ -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>
+2 -2
View File
@@ -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 -1
View File
@@ -1,6 +1,6 @@
<template>
<el-aside width="200px" class="subnav">
<router-view name="subnav"></router-view>
<router-view name="subnav" />
</el-aside>
</template>
+13 -7
View File
@@ -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 {
+2 -5
View File
@@ -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;
}
}
}
+2 -1
View File
@@ -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%;
-13
View File
@@ -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';
-98
View File
@@ -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;
}
+335
View File
@@ -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;
+120 -21
View File
@@ -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%;
}
}
+8 -6
View File
@@ -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;
+6 -40
View File
@@ -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';
+34 -4
View File
@@ -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>
+17 -1
View File
@@ -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)
},
+13 -21
View File
@@ -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
}
+4 -1
View File
@@ -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 = [
+5
View File
@@ -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'
+24
View File
@@ -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,
+24 -6
View File
@@ -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': {
+13 -3
View File
@@ -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'
}
+6 -3
View File
@@ -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'
}
+13 -3
View File
@@ -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'
}
+6 -3
View File
@@ -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'
}
+6
View File
@@ -0,0 +1,6 @@
export default {
'engine-version': 'نسخه‌ی موتور',
'about': 'درباره ما',
'release': 'نسخه‌های منتشر شده',
'support': 'حمایت'
}
+30
View File
@@ -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': 'ثانیه'
}
+9
View File
@@ -0,0 +1,9 @@
export default {
'undo': 'برگردان',
'redo': 'دوباره انجام بده',
'cut': 'کات',
'copy': 'کپی',
'paste': 'پیست',
'delete': 'حذف',
'select-all': 'انتخاب همه'
}
+7
View File
@@ -0,0 +1,7 @@
export default {
'official-website': 'سایت ماتریکس',
'manual': 'راهنما',
'release-notes': 'نکات نسخه...',
'report-problem': 'گزارش مشکل',
'toggle-dev-tools': 'رفتن به ابزارهای توسعه‌دهندگان'
}
+21
View File
@@ -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
}
+8
View File
@@ -0,0 +1,8 @@
export default {
'app': 'ماتریکس',
'file': 'فایل',
'task': 'تسک',
'edit': 'ویرایش',
'window': 'پنجره',
'help': 'راهنما'
}
+47
View File
@@ -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': 'آخرین باری که برای آپدیت چک شده'
}
+4
View File
@@ -0,0 +1,4 @@
export default {
'task-list': 'تسک‌ها',
'preferences': 'تنظیمات دلخواه'
}
+82
View File
@@ -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': 'دانلود شکست خورد'
}
+8
View File
@@ -0,0 +1,8 @@
export default {
'reload': 'ریلود',
'close': 'بستن',
'minimize': 'کوچک کردن',
'zoom': 'زوم',
'toggle-fullscreen': 'رفتن به حالت فول‌اسکرین',
'front': 'همه را جلو بیار'
}
+13 -3
View File
@@ -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'
}
+6 -3
View File
@@ -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é'
}
+15
View File
@@ -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)) {
+6
View File
@@ -0,0 +1,6 @@
export default {
'engine-version': 'バージョンを確認',
'about': '私たちについて',
'release': 'リリースノート',
'support': 'サポート'
}
+20
View File
@@ -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': '秒'
}
+9
View File
@@ -0,0 +1,9 @@
export default {
'undo': '元に戻す',
'redo': 'やり直す',
'cut': '切り取り',
'copy': 'コピー',
'paste': '貼り付け',
'delete': '削除',
'select-all': 'すべてを選択'
}
+7
View File
@@ -0,0 +1,7 @@
export default {
'official-website': 'Motrix 公式サイト',
'manual': '使用説明',
'release-notes': 'リリースノート...',
'report-problem': '問題を報告',
'toggle-dev-tools': '開発者ツール'
}
+21
View File
@@ -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
}
+8
View File
@@ -0,0 +1,8 @@
export default {
'app': 'Motrix',
'file': 'ファイル',
'task': 'タスク',
'edit': '編集',
'window': 'ウィンドウ',
'help': 'ヘルプ'
}
+47
View File
@@ -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': '前回更新確認時間'
}
+4
View File
@@ -0,0 +1,4 @@
export default {
'task-list': 'タスクリスト',
'preferences': '環境設定'
}
+82
View File
@@ -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': 'ダウンロード失敗'
}
+8
View File
@@ -0,0 +1,8 @@
export default {
'reload': 'リロード',
'close': '閉じる',
'minimize': '最小化',
'zoom': '拡大',
'toggle-fullscreen': 'フルスクリーンにする',
'front': '全てを手前に移動'
}
+6
View File
@@ -0,0 +1,6 @@
export default {
'engine-version': '엔진 버전',
'about': '정보',
'release': '배포',
'support': '지원'
}
+30
View File
@@ -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': '초'
}
+9
View File
@@ -0,0 +1,9 @@
export default {
'undo': '실행 취소',
'redo': '재실행',
'cut': '잘라내기',
'copy': '복사',
'paste': '붙여넣기',
'delete': '삭제',
'select-all': '모두 선택'
}
+7
View File
@@ -0,0 +1,7 @@
export default {
'official-website': 'Motrix 웹사이트',
'manual': '메뉴얼',
'release-notes': '배포 정보...',
'report-problem': '문제 보고',
'toggle-dev-tools': '개발자 도구'
}
+21
View File
@@ -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
}
+8
View File
@@ -0,0 +1,8 @@
export default {
'app': 'Motrix',
'file': '파일',
'task': '작업',
'edit': '편집',
'window': '창',
'help': '?'
}
+47
View File
@@ -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