Compare commits
51 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 14223c2204 | |||
| 2cfb6b1914 | |||
| c38cf80589 | |||
| 3ee98eae1d | |||
| d2cff6356a | |||
| 3ee432d683 | |||
| 7f1822bb7e | |||
| 0223e691ff | |||
| 117dba9f37 | |||
| 66f114bf72 | |||
| 44f00483f9 | |||
| 1866e3fd4f | |||
| cfac883cbf | |||
| 1431bab366 | |||
| bb373947ff | |||
| 8f0dc65341 | |||
| 402185e1a2 | |||
| d59b5c9841 | |||
| eb442e4a7a | |||
| e82e567069 | |||
| dc2876098d | |||
| 6287942fbc | |||
| 389dc080b6 | |||
| 45a23d73e6 | |||
| 8303dd305b | |||
| a98292ce1e | |||
| 8df97b8433 | |||
| f29e95c9bc | |||
| 52e045c886 | |||
| 4632c3619a | |||
| 54c48be29b | |||
| 301f1403df | |||
| 88de047778 | |||
| c119de78ce | |||
| 9d381e16da | |||
| e4c6d6a9c0 | |||
| 5bb727cb6f | |||
| 00f3209c68 | |||
| 3f8b0e6f5f | |||
| 0543bc4e2c | |||
| 9ded42f127 | |||
| 834a1ad839 | |||
| 8f830f6a0d | |||
| ee111c92ee | |||
| 74c3a3c696 | |||
| 4d964ae16e | |||
| be2c2e8383 | |||
| 4e6164816f | |||
| fa7daf377f | |||
| afbe364525 | |||
| ece5cea512 |
@@ -93,10 +93,6 @@ let rendererConfig = {
|
||||
'css-loader'
|
||||
]
|
||||
},
|
||||
{
|
||||
test: /\.html$/,
|
||||
use: 'vue-html-loader'
|
||||
},
|
||||
{
|
||||
test: /\.js$/,
|
||||
use: 'babel-loader',
|
||||
@@ -237,13 +233,13 @@ if (!devMode) {
|
||||
rendererConfig.devtool = ''
|
||||
|
||||
rendererConfig.plugins.push(
|
||||
new CopyWebpackPlugin([
|
||||
{
|
||||
new CopyWebpackPlugin({
|
||||
patterns: [{
|
||||
from: path.join(__dirname, '../static'),
|
||||
to: path.join(__dirname, '../dist/electron/static'),
|
||||
ignore: ['.*']
|
||||
}
|
||||
]),
|
||||
globOptions: { ignore: [ '.*' ] }
|
||||
}]
|
||||
}),
|
||||
new webpack.DefinePlugin({
|
||||
'process.env.NODE_ENV': '"production"'
|
||||
}),
|
||||
|
||||
@@ -209,13 +209,13 @@ if (!devMode) {
|
||||
webConfig.devtool = ''
|
||||
|
||||
webConfig.plugins.push(
|
||||
new CopyWebpackPlugin([
|
||||
{
|
||||
new CopyWebpackPlugin({
|
||||
patterns: [{
|
||||
from: path.join(__dirname, '../static'),
|
||||
to: path.join(__dirname, '../dist/web/static'),
|
||||
ignore: ['.*']
|
||||
}
|
||||
]),
|
||||
to: path.join(__dirname, '../dist/electron/static'),
|
||||
globOptions: { ignore: [ '.*' ] }
|
||||
}]
|
||||
}),
|
||||
new webpack.DefinePlugin({
|
||||
'process.env.NODE_ENV': '"production"'
|
||||
}),
|
||||
|
||||
+37
-11
@@ -4,15 +4,15 @@
|
||||
<img src="https://cdn.nlark.com/yuque/0/2018/png/129147/1543735425232-a5d2c99f-d788-43e4-9781-558ff6d21027.png" width="256" alt="App Icon" />
|
||||
</a>
|
||||
|
||||
[English](./README.md) | 简体中文
|
||||
|
||||
## 一款全能的下载工具
|
||||
|
||||
[](https://github.com/agalwood/Motrix/releases)  [](https://travis-ci.com/agalwood/Motrix) [](https://ci.appveyor.com/project/agalwood/motrix/branch/master) [](https://github.com/agalwood/Motrix/releases) 
|
||||
[](https://github.com/agalwood/Motrix/releases)   
|
||||
|
||||
[English](./README.md) | 简体中文
|
||||
|
||||
我是个兴趣使然的桌面应用开发者🤓,利用搬砖之余开发了 Motrix。
|
||||
|
||||
Motrix 是一款全能的下载工具,支持下载 HTTP、FTP、BT、磁力链、某盘等资源。它的界面简洁易用,希望大家喜欢 👻。
|
||||
Motrix 是一款全能的下载工具,支持下载 HTTP、FTP、BT、磁力链等资源。它的界面简洁易用,希望大家喜欢 👻。
|
||||
|
||||
✈️ 去 [官网](https://motrix.app/zh-CN) 逛逛 | 📖 查看 [帮助手册](http://motrix.app/support/issues)
|
||||
|
||||
@@ -41,10 +41,35 @@ brew update && brew cask install motrix
|
||||
|
||||
### Linux
|
||||
|
||||
你可以下载 AppImage(适用于所有 Linux 发行版)软件包或 snap 或从源代码构建安装 Motrix。
|
||||
你可以下载 `AppImage` (适用于所有 Linux 发行版)或 `snap` 来安装 Motrix,更多 Linux 安装包格式请查看 [GitHub/release](https://github.com/agalwood/Motrix/releases) 。
|
||||
|
||||
构建请阅读 **编译打包** 部分。
|
||||
如果你想自己通过编译源码来安装,请阅读 **编译打包** 部分。
|
||||
|
||||
#### AppImage
|
||||
最新版的 Motrix AppImage 需要自己手动进执行桌面集成。请查看 [AppImageLauncher](https://github.com/TheAssassin/AppImageLauncher) 的文档进行操作。
|
||||
|
||||
> 桌面集成
|
||||
> electron-builder v21 之后,桌面集成不再是 AppImage 文件的一部分。
|
||||
> 推荐使用 [AppImageLauncher](https://github.com/TheAssassin/AppImageLauncher) 集成 AppImage。
|
||||
|
||||
Deepin 20 Beta 用户安装 Motrix 失败的问题,请按照以下方法处理:
|
||||
|
||||
打开`终端`,黏贴运行如下命令之后再次安装 Motrix。
|
||||
```bash
|
||||
sudo apt --fix-broken install
|
||||
```
|
||||
|
||||
#### Snap
|
||||
Motrix 已经上架 [Snapcraft](https://snapcraft.io/motrix) ,Ubuntu 用户推荐从 Snap 商店下载。
|
||||
|
||||
v1.5.10 提示
|
||||
|
||||
系统托盘可能无法正常显示指示器,导致退出应用程序不方便。
|
||||
请取消勾选 偏好设置——基本设置——隐藏应用程序菜单(仅限Windows和Linux),点击保存并应用。然后点击 "文件 "菜单中的 "退出",退出应用程序。
|
||||
|
||||
请更新到 v1.5.12 及以上版本,可以使用键盘组合快捷键 <kbd>Ctrl</kbd> + <kbd>q</kbd> 快速退出应用。
|
||||
|
||||
#### AUR
|
||||
对于 Arch Linux 用户,可以使用 [aur](https://aur.archlinux.org/packages/motrix/) 安装 Motrix,感谢维护者 [weearc](https://github.com/weearc)。
|
||||
|
||||
运行以下命令进行安装:
|
||||
@@ -60,7 +85,8 @@ Motrix 在 Linux 中首次启动可能需要使用 `sudo` 运行,因为可能
|
||||
- 🕹 简洁明了的图形操作界面
|
||||
- 🦄 支持BT和磁力链任务
|
||||
- ☑️ 支持选择性下载BT部分文件
|
||||
- 💾 支持下载某盘资源
|
||||
- 📡 每天自动更新 Tracker 服务器列表
|
||||
- 🔌 UPnP & NAT-PMP 端口映射
|
||||
- 🎛 最高支持 10 个任务同时下载
|
||||
- 🚀 单任务最高支持 64 线程下载
|
||||
- 🚥 设置上传/下载限速
|
||||
@@ -71,11 +97,11 @@ Motrix 在 Linux 中首次启动可能需要使用 `sudo` 运行,因为可能
|
||||
- 🌑 深色模式
|
||||
- 🗑 移除任务时可同时删除相关文件
|
||||
- 🌍 国际化,[查看已可选的语言](#-国际化)
|
||||
- 🎏 ...
|
||||
- 🛠 更多特性开发中
|
||||
|
||||
## 🖥 应用界面
|
||||
|
||||

|
||||

|
||||
|
||||
## ⌨️ 本地开发
|
||||
|
||||
@@ -104,8 +130,6 @@ export SASS_BINARY_SITE='https://npm.taobao.org/mirrors/node-sass'
|
||||
|
||||
`Electron` 下载安装失败的问题,解决方式请参考 https://github.com/electron/electron/issues/8466#issuecomment-571425574
|
||||
|
||||
如果喜欢 [Yarn](https://yarnpkg.com/),也可以使用 `yarn` 安装依赖
|
||||
|
||||
### 开发模式
|
||||
|
||||
```bash
|
||||
@@ -145,12 +169,14 @@ npm run build
|
||||
| en-US | English | ✔️ |
|
||||
| fa | فارسی | ✔️ [@Nima-Ra](https://github.com/Nima-Ra) |
|
||||
| fr | Français | ✔️ [@gpatarin](https://github.com/gpatarin) |
|
||||
| id | Indonesia | ✔️ [@aarestu](https://github.com/aarestu) |
|
||||
| ja | 日本語 | ✔️ [@hbkrkzk](https://github.com/hbkrkzk) |
|
||||
| ko | 한국어 | ✔️ [@KOZ39](https://github.com/KOZ39) |
|
||||
| pt-BR | Portuguese (Brazil) | ✔️ [@andrenoberto](https://github.com/andrenoberto) |
|
||||
| ru | Русский | ✔️ [@bladeaweb](https://github.com/bladeaweb) |
|
||||
| tr | Türkçe | ✔️ [@abdullah](https://github.com/abdullah) |
|
||||
| uk | Українська | ✔️ [@bladeaweb](https://github.com/bladeaweb) |
|
||||
| vi | Tiếng Việt | ✔️ [@duythanhvn](https://github.com/duythanhvn) |
|
||||
| zh-CN | 简体中文 | ✔️ |
|
||||
| zh-TW | 繁體中文 | ✔️ [@Yukaii](https://github.com/Yukaii) |
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
## A full-featured download manager
|
||||
|
||||
[](https://github.com/agalwood/Motrix/releases)  [](https://travis-ci.com/agalwood/Motrix) [](https://ci.appveyor.com/project/agalwood/motrix/branch/master) [](https://github.com/agalwood/Motrix/releases) 
|
||||
[](https://github.com/agalwood/Motrix/releases)   
|
||||
|
||||
English | [简体中文](./README-CN.md)
|
||||
|
||||
@@ -41,10 +41,37 @@ 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 to install Motrix.
|
||||
You can download the `AppImage` (for all Linux distributions) or `snap` to install Motrix, see [GitHub/release](https://github.com/agalwood/Motrix/releases) for more Linux installation package formats.
|
||||
|
||||
Please read the **Build** section.
|
||||
If you want to build from source code, please read the **Build** section.
|
||||
|
||||
#### AppImage
|
||||
The latest version of Motrix AppImage requires you to manually perform desktop integration. Please check the documentation of [AppImageLauncher](https://github.com/TheAssassin/AppImageLauncher) .
|
||||
|
||||
> Desktop Integration
|
||||
> Since electron-builder 21 desktop integration is not a part of produced AppImage file.
|
||||
> [AppImageLauncher](https://github.com/TheAssassin/AppImageLauncher) is the recommended way to integrate AppImages.
|
||||
|
||||
Deepin 20 Beta users failed to install Motrix, please follow the steps below:
|
||||
|
||||
Open the `Terminal`, paste and run the following command to install Motrix again.
|
||||
|
||||
```bash
|
||||
sudo apt --fix-broken install
|
||||
```
|
||||
|
||||
#### Snap
|
||||
Motrix has been listed on [Snapcraft](https://snapcraft.io/motrix) , Ubuntu users recommend downloading from the Snap Store.
|
||||
|
||||
Tips for v1.5.10
|
||||
|
||||
The tray may not display the indicator normally, which makes it inconvenient to exit the application.
|
||||
|
||||
Please unchecked Preferences--Basic Settings--Hide App Menu (Windows & Linux Only), click Save & Apply. Then click "Exit" in the File menu to exit the application.
|
||||
|
||||
Please update to v1.5.12 and above, you can use the keyboard shortcut <kbd>Ctrl</kbd> + <kbd>q</kbd> to quickly exit the application.
|
||||
|
||||
#### AUR
|
||||
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:
|
||||
@@ -60,7 +87,8 @@ Motrix may need to run with `sudo` for the first time in Linux because there is
|
||||
- 🕹 Simple and clear user interface
|
||||
- 🦄 Supports BitTorrent & Magnet
|
||||
- ☑️ BitTorrent selective download
|
||||
- 💾 Supports downloading BD Net Disk
|
||||
- 📡 Update tracker list every day automatically
|
||||
- 🔌 UPnP & NAT-PMP Port Mapping
|
||||
- 🎛 Up to 10 concurrent download tasks
|
||||
- 🚀 Supports 64 threads in a single task
|
||||
- 🚥 Supports speed limit
|
||||
@@ -71,11 +99,11 @@ Motrix may need to run with `sudo` for the first time in Linux because there is
|
||||
- 🌑 Dark mode
|
||||
- 🗑 Delete related files when removing tasks (optional)
|
||||
- 🌍 I18n, [View supported languages](#-internationalization).
|
||||
- 🎏 ...
|
||||
- 🛠 More features in development
|
||||
|
||||
## 🖥 User Interface
|
||||
|
||||

|
||||

|
||||
|
||||
## ⌨️ Development
|
||||
|
||||
@@ -96,8 +124,6 @@ npm install
|
||||
|
||||
`Electron` failed to install correctly, please refer to https://github.com/electron/electron/issues/8466#issuecomment-571425574
|
||||
|
||||
If you like [Yarn](https://yarnpkg.com/), you can also use `yarn` to install dependencies.
|
||||
|
||||
### Dev Mode
|
||||
|
||||
```bash
|
||||
@@ -137,12 +163,14 @@ Translations into versions for other languages are welcome 🧐! Please read the
|
||||
| en-US | English | ✔️ |
|
||||
| fa | فارسی | ✔️ [@Nima-Ra](https://github.com/Nima-Ra) |
|
||||
| fr | Français | ✔️ [@gpatarin](https://github.com/gpatarin) |
|
||||
| id | Indonesia | ✔️ [@aarestu](https://github.com/aarestu) |
|
||||
| ja | 日本語 | ✔️ [@hbkrkzk](https://github.com/hbkrkzk) |
|
||||
| ko | 한국어 | ✔️ [@KOZ39](https://github.com/KOZ39) |
|
||||
| pt-BR | Portuguese (Brazil) | ✔️ [@andrenoberto](https://github.com/andrenoberto) |
|
||||
| ru | Русский | ✔️ [@bladeaweb](https://github.com/bladeaweb) |
|
||||
| tr | Türkçe | ✔️ [@abdullah](https://github.com/abdullah) |
|
||||
| uk | Українська | ✔️ [@bladeaweb](https://github.com/bladeaweb) |
|
||||
| vi | Tiếng Việt | ✔️ [@duythanhvn](https://github.com/duythanhvn) |
|
||||
| zh-CN | 简体中文 | ✔️ |
|
||||
| zh-TW | 繁體中文 | ✔️ [@Yukaii](https://github.com/Yukaii) |
|
||||
|
||||
|
||||
Generated
+5146
-2779
File diff suppressed because it is too large
Load Diff
+20
-21
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Motrix",
|
||||
"version": "1.5.10",
|
||||
"version": "1.5.14",
|
||||
"description": "A full-featured download manager",
|
||||
"homepage": "https://motrix.app",
|
||||
"author": {
|
||||
@@ -181,22 +181,22 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.9.6",
|
||||
"@babel/runtime": "^7.10.2",
|
||||
"@panter/vue-i18next": "^0.15.2",
|
||||
"aria2": "^4.1.0",
|
||||
"axios": "^0.19.2",
|
||||
"blob-util": "^2.0.2",
|
||||
"clipboard-polyfill": "^2.8.6",
|
||||
"electron-debug": "^3.0.1",
|
||||
"electron-debug": "^3.1.0",
|
||||
"electron-is": "^3.0.0",
|
||||
"electron-log": "^4.1.2",
|
||||
"electron-log": "^4.2.1",
|
||||
"electron-store": "^5.1.1",
|
||||
"electron-updater": "^4.3.1",
|
||||
"element-ui": "^2.13.1",
|
||||
"forever-monitor": "1.7.2",
|
||||
"i18next": "^19.4.4",
|
||||
"element-ui": "^2.13.2",
|
||||
"forever-monitor": "3.0.0",
|
||||
"i18next": "^19.4.5",
|
||||
"lodash": "^4.17.15",
|
||||
"nat-api": "^0.3.0",
|
||||
"@motrix/nat-api": "^0.3.1",
|
||||
"node-fetch": "^2.6.0",
|
||||
"normalize.css": "^8.0.1",
|
||||
"parse-torrent": "^7.1.3",
|
||||
@@ -204,16 +204,16 @@
|
||||
"svg-innerhtml": "^1.1.0",
|
||||
"vue": "^2.6.11",
|
||||
"vue-electron": "^1.0.6",
|
||||
"vue-router": "^3.1.6",
|
||||
"vue-router": "^3.3.2",
|
||||
"vuex": "^3.4.0",
|
||||
"vuex-router-sync": "^5.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.9.6",
|
||||
"@babel/plugin-proposal-class-properties": "^7.8.3",
|
||||
"@babel/plugin-transform-runtime": "^7.9.6",
|
||||
"@babel/preset-env": "^7.9.6",
|
||||
"@babel/register": "^7.9.0",
|
||||
"@babel/core": "^7.10.2",
|
||||
"@babel/plugin-proposal-class-properties": "^7.10.1",
|
||||
"@babel/plugin-transform-runtime": "^7.10.1",
|
||||
"@babel/preset-env": "^7.10.2",
|
||||
"@babel/register": "^7.10.1",
|
||||
"@vue/eslint-config-standard": "^5.1.2",
|
||||
"ajv": "^6.12.2",
|
||||
"babel-eslint": "^10.1.0",
|
||||
@@ -221,18 +221,18 @@
|
||||
"babel-plugin-component": "^1.1.1",
|
||||
"cfonts": "^2.8.2",
|
||||
"chalk": "^4.0.0",
|
||||
"copy-webpack-plugin": "^5.1.1",
|
||||
"copy-webpack-plugin": "^6.0.2",
|
||||
"cross-env": "^7.0.2",
|
||||
"css-loader": "^3.5.3",
|
||||
"del": "^5.1.0",
|
||||
"devtron": "^1.4.0",
|
||||
"electron": "^8.3.0",
|
||||
"electron-builder": "^22.6.0",
|
||||
"electron": "^8.3.1",
|
||||
"electron-builder": "^22.7.0",
|
||||
"electron-builder-notarize": "^1.1.2",
|
||||
"electron-devtools-installer": "^3.0.0",
|
||||
"electron-notarize": "^0.3.0",
|
||||
"electron-osx-sign": "^0.4.16",
|
||||
"eslint": "^7.0.0",
|
||||
"eslint": "^7.1.0",
|
||||
"eslint-friendly-formatter": "^4.0.1",
|
||||
"eslint-loader": "^4.0.2",
|
||||
"eslint-plugin-import": "^2.20.2",
|
||||
@@ -246,12 +246,11 @@
|
||||
"multispinner": "^0.2.1",
|
||||
"node-loader": "^0.6.0",
|
||||
"optimize-css-assets-webpack-plugin": "^5.0.3",
|
||||
"sass": "^1.26.5",
|
||||
"sass": "^1.26.8",
|
||||
"sass-loader": "^8.0.2",
|
||||
"style-loader": "^1.2.1",
|
||||
"terser-webpack-plugin": "^3.0.1",
|
||||
"terser-webpack-plugin": "^3.0.3",
|
||||
"url-loader": "^4.1.0",
|
||||
"vue-html-loader": "^1.2.4",
|
||||
"vue-loader": "^15.9.2",
|
||||
"vue-style-loader": "^4.1.2",
|
||||
"vue-template-compiler": "^2.6.11",
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
+38
-15
@@ -21,9 +21,16 @@ import TouchBarManager from './ui/TouchBarManager'
|
||||
import TrayManager from './ui/TrayManager'
|
||||
import DockManager from './ui/DockManager'
|
||||
import ThemeManager from './ui/ThemeManager'
|
||||
import { AUTO_SYNC_TRACKER_INTERVAL, AUTO_CHECK_UPDATE_INTERVAL } from '@shared/constants'
|
||||
import {
|
||||
APP_RUN_MODE,
|
||||
AUTO_SYNC_TRACKER_INTERVAL,
|
||||
AUTO_CHECK_UPDATE_INTERVAL
|
||||
} from '@shared/constants'
|
||||
import { checkIsNeedRun } from '@shared/utils'
|
||||
import { convertTrackerDataToComma, fetchBtTrackerFromSource } from '@shared/utils/tracker'
|
||||
import {
|
||||
convertTrackerDataToComma,
|
||||
fetchBtTrackerFromSource
|
||||
} from '@shared/utils/tracker'
|
||||
|
||||
export default class Application extends EventEmitter {
|
||||
constructor () {
|
||||
@@ -51,6 +58,8 @@ export default class Application extends EventEmitter {
|
||||
|
||||
this.initTouchBarManager()
|
||||
|
||||
this.initThemeManager()
|
||||
|
||||
this.initTrayManager()
|
||||
|
||||
this.initDockManager()
|
||||
@@ -59,8 +68,6 @@ export default class Application extends EventEmitter {
|
||||
|
||||
this.energyManager = new EnergyManager()
|
||||
|
||||
this.initThemeManager()
|
||||
|
||||
this.initUpdaterManager()
|
||||
|
||||
this.initProtocolManager()
|
||||
@@ -116,10 +123,12 @@ export default class Application extends EventEmitter {
|
||||
async stopEngine () {
|
||||
try {
|
||||
await this.engineClient.shutdown({ force: true })
|
||||
setImmediate(() => {
|
||||
this.engine.stop()
|
||||
})
|
||||
} catch (err) {
|
||||
logger.warn('[Motrix] shutdown engine fail: ', err.message)
|
||||
} finally {
|
||||
this.engine.stop()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,7 +228,8 @@ export default class Application extends EventEmitter {
|
||||
if (newValue) {
|
||||
this.startUPnPMapping()
|
||||
} else {
|
||||
this.stopUPnPMapping()
|
||||
await this.stopUPnPMapping()
|
||||
this.upnp.closeClient()
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -278,12 +288,25 @@ export default class Application extends EventEmitter {
|
||||
this.windowManager.on('window-resized', (data) => {
|
||||
this.storeWindowState(data)
|
||||
})
|
||||
|
||||
this.windowManager.on('window-moved', (data) => {
|
||||
this.storeWindowState(data)
|
||||
})
|
||||
|
||||
this.windowManager.on('window-closed', (data) => {
|
||||
this.storeWindowState(data)
|
||||
})
|
||||
|
||||
this.windowManager.on('enter-full-screen', (window) => {
|
||||
this.dockManager.show()
|
||||
})
|
||||
|
||||
this.windowManager.on('leave-full-screen', (window) => {
|
||||
const mode = this.configManager.getUserConfig('run-mode')
|
||||
if (mode !== APP_RUN_MODE.STANDARD) {
|
||||
this.dockManager.hide()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
storeWindowState (data = {}) {
|
||||
@@ -327,7 +350,7 @@ export default class Application extends EventEmitter {
|
||||
|
||||
hide (page) {
|
||||
if (page) {
|
||||
this.windowManager.autoHideWindow(page)
|
||||
this.windowManager.hideWindow(page)
|
||||
} else {
|
||||
this.windowManager.hideAllWindow()
|
||||
}
|
||||
@@ -347,9 +370,9 @@ export default class Application extends EventEmitter {
|
||||
|
||||
this.energyManager.stopPowerSaveBlocker()
|
||||
|
||||
this.trayManager.destroy()
|
||||
|
||||
await this.stopEngine()
|
||||
|
||||
this.trayManager.destroy()
|
||||
} catch (err) {
|
||||
logger.warn('[Motrix] stop error: ', err.message)
|
||||
}
|
||||
@@ -385,9 +408,9 @@ export default class Application extends EventEmitter {
|
||||
|
||||
initThemeManager () {
|
||||
this.themeManager = new ThemeManager()
|
||||
this.themeManager.on('system-theme-changed', (theme) => {
|
||||
this.themeManager.on('system-theme-change', (theme) => {
|
||||
this.trayManager.changeIconTheme(theme)
|
||||
this.sendCommandToAll('application:change-system-theme', theme)
|
||||
this.sendCommandToAll('application:update-system-theme', theme)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -559,8 +582,8 @@ export default class Application extends EventEmitter {
|
||||
this.on('application:change-locale', (locale) => {
|
||||
this.localeManager.changeLanguageByLocale(locale)
|
||||
.then(() => {
|
||||
this.menuManager.setup(locale)
|
||||
this.trayManager.setup(locale)
|
||||
this.menuManager.handleLocaleChange(locale)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -639,7 +662,7 @@ export default class Application extends EventEmitter {
|
||||
})
|
||||
}
|
||||
|
||||
handleConfigChanged (configName) {
|
||||
handleConfigChange (configName) {
|
||||
this.sendCommandToAll('application:update-preference-config', configName)
|
||||
}
|
||||
|
||||
@@ -652,8 +675,8 @@ export default class Application extends EventEmitter {
|
||||
this.adjustMenu()
|
||||
})
|
||||
|
||||
this.configManager.userConfig.onDidAnyChange(() => this.handleConfigChanged('user'))
|
||||
this.configManager.systemConfig.onDidAnyChange(() => this.handleConfigChanged('system'))
|
||||
this.configManager.userConfig.onDidAnyChange(() => this.handleConfigChange('user'))
|
||||
this.configManager.systemConfig.onDidAnyChange(() => this.handleConfigChange('system'))
|
||||
|
||||
this.on('download-status-change', (downloading) => {
|
||||
this.trayManager.updateTrayByStatus(downloading)
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
import { app } from 'electron'
|
||||
|
||||
import { LOGIN_SETTING_OPTIONS } from '@shared/constants'
|
||||
|
||||
export default class AutoLaunchManager {
|
||||
enable () {
|
||||
return new Promise((resolve, reject) => {
|
||||
const enabled = app.getLoginItemSettings().openAtLogin
|
||||
const enabled = app.getLoginItemSettings(LOGIN_SETTING_OPTIONS).openAtLogin
|
||||
if (enabled) {
|
||||
resolve()
|
||||
}
|
||||
|
||||
app.setLoginItemSettings({
|
||||
openAtLogin: true,
|
||||
// For Windows
|
||||
args: [
|
||||
'--opened-at-login=1'
|
||||
]
|
||||
...LOGIN_SETTING_OPTIONS,
|
||||
openAtLogin: true
|
||||
})
|
||||
resolve()
|
||||
})
|
||||
@@ -28,7 +27,7 @@ export default class AutoLaunchManager {
|
||||
|
||||
isEnabled () {
|
||||
return new Promise((resolve, reject) => {
|
||||
const enabled = app.getLoginItemSettings().openAtLogin
|
||||
const enabled = app.getLoginItemSettings(LOGIN_SETTING_OPTIONS).openAtLogin
|
||||
resolve(enabled)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -13,9 +13,10 @@ import {
|
||||
APP_RUN_MODE,
|
||||
APP_THEME,
|
||||
EMPTY_STRING,
|
||||
IP_VERSION,
|
||||
LOGIN_SETTING_OPTIONS,
|
||||
NGOSANG_TRACKERS_BEST_IP_URL,
|
||||
NGOSANG_TRACKERS_BEST_URL,
|
||||
IP_VERSION
|
||||
NGOSANG_TRACKERS_BEST_URL
|
||||
} from '@shared/constants'
|
||||
import { separateConfig } from '@shared/utils'
|
||||
|
||||
@@ -140,7 +141,7 @@ export default class ConfigManager {
|
||||
fixUserConfig () {
|
||||
// Fix the value of open-at-login when the user delete
|
||||
// the Motrix self-starting item through startup management.
|
||||
const openAtLogin = app.getLoginItemSettings().openAtLogin
|
||||
const openAtLogin = app.getLoginItemSettings(LOGIN_SETTING_OPTIONS).openAtLogin
|
||||
if (this.getUserConfig('open-at-login') !== openAtLogin) {
|
||||
this.setUserConfig('open-at-login', openAtLogin)
|
||||
}
|
||||
|
||||
@@ -44,10 +44,13 @@ export default class ProtocolManager extends EventEmitter {
|
||||
logger.info(`[Motrix] protocol url: ${url}`)
|
||||
|
||||
if (
|
||||
url.toLowerCase().startsWith('ftp:') ||
|
||||
url.toLowerCase().startsWith('http:') ||
|
||||
url.toLowerCase().startsWith('https:') ||
|
||||
url.toLowerCase().startsWith('magnet:') ||
|
||||
url.toLowerCase().startsWith('thunder:')
|
||||
) {
|
||||
return this.handleMagnetAndThunderProtocol(url)
|
||||
return this.handleResourceProtocol(url)
|
||||
}
|
||||
|
||||
if (
|
||||
@@ -58,7 +61,7 @@ export default class ProtocolManager extends EventEmitter {
|
||||
}
|
||||
}
|
||||
|
||||
handleMagnetAndThunderProtocol (url) {
|
||||
handleResourceProtocol (url) {
|
||||
if (!url) {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import NatAPI from 'nat-api'
|
||||
import NatAPI from '@motrix/nat-api'
|
||||
|
||||
import logger from './Logger'
|
||||
|
||||
let client = null
|
||||
let timer = null
|
||||
const mappingStatus = {}
|
||||
|
||||
export default class UPnPManager {
|
||||
@@ -18,11 +17,12 @@ export default class UPnPManager {
|
||||
return
|
||||
}
|
||||
|
||||
client = new NatAPI()
|
||||
client = new NatAPI({
|
||||
autoUpdate: true
|
||||
})
|
||||
}
|
||||
|
||||
map (port) {
|
||||
this.clearCloseTimer()
|
||||
this.init()
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
@@ -32,24 +32,25 @@ export default class UPnPManager {
|
||||
return
|
||||
}
|
||||
|
||||
client.map(port, (err) => {
|
||||
if (err) {
|
||||
logger.warn(`[Motrix] UPnPManager map ${port} failed, error: `, err)
|
||||
reject(err.message)
|
||||
return
|
||||
}
|
||||
try {
|
||||
client.map(port, (err) => {
|
||||
if (err) {
|
||||
logger.warn(`[Motrix] UPnPManager map ${port} failed, error: `, err)
|
||||
reject(err.message)
|
||||
return
|
||||
}
|
||||
|
||||
mappingStatus[port] = true
|
||||
logger.info(`[Motrix] UPnPManager port ${port} mapping succeeded`)
|
||||
resolve()
|
||||
})
|
||||
}).finally(() => {
|
||||
this.delayCloseClient()
|
||||
mappingStatus[port] = true
|
||||
logger.info(`[Motrix] UPnPManager port ${port} mapping succeeded`)
|
||||
resolve()
|
||||
})
|
||||
} catch (err) {
|
||||
reject(err.message)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
unmap (port) {
|
||||
this.clearCloseTimer()
|
||||
this.init()
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
@@ -64,40 +65,35 @@ export default class UPnPManager {
|
||||
return
|
||||
}
|
||||
|
||||
client.unmap(port, (err) => {
|
||||
if (err) {
|
||||
logger.warn(`[Motrix] UPnPManager unmap ${port} failed, error: `, err)
|
||||
reject(err.message)
|
||||
return
|
||||
}
|
||||
try {
|
||||
client.unmap(port, (err) => {
|
||||
if (err) {
|
||||
logger.warn(`[Motrix] UPnPManager unmap ${port} failed, error: `, err)
|
||||
reject(err.message)
|
||||
return
|
||||
}
|
||||
|
||||
logger.info(`[Motrix] UPnPManager port ${port} unmapping succeeded`)
|
||||
mappingStatus[port] = false
|
||||
resolve()
|
||||
})
|
||||
}).finally(() => {
|
||||
this.delayCloseClient()
|
||||
logger.info(`[Motrix] UPnPManager port ${port} unmapping succeeded`)
|
||||
mappingStatus[port] = false
|
||||
resolve()
|
||||
})
|
||||
} catch (err) {
|
||||
reject(err.message)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
delayCloseClient () {
|
||||
console.log('delayCloseClient===>', timer)
|
||||
timer = setTimeout(() => {
|
||||
this.closeClient()
|
||||
}, 30000)
|
||||
}
|
||||
|
||||
clearCloseTimer () {
|
||||
clearTimeout(timer)
|
||||
}
|
||||
|
||||
closeClient () {
|
||||
console.log('closeClient===>')
|
||||
if (!client) {
|
||||
return
|
||||
}
|
||||
|
||||
client.destroy()
|
||||
client = null
|
||||
try {
|
||||
client.destroy(() => {
|
||||
client = null
|
||||
})
|
||||
} catch (err) {
|
||||
logger.warn('[Motrix] close UPnP client fail', err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,10 +19,18 @@ export default class DockManager extends EventEmitter {
|
||||
}
|
||||
|
||||
show = isMac ? () => {
|
||||
if (app.dock.isVisible()) {
|
||||
return
|
||||
}
|
||||
|
||||
return app.dock.show()
|
||||
} : () => {}
|
||||
|
||||
hide = isMac ? () => {
|
||||
if (!app.dock.isVisible()) {
|
||||
return
|
||||
}
|
||||
|
||||
app.dock.hide()
|
||||
} : () => {}
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ export default class MenuManager extends EventEmitter {
|
||||
this.items = flattenMenuItems(menu)
|
||||
}
|
||||
|
||||
rebuild () {
|
||||
handleLocaleChange (locale) {
|
||||
this.setup()
|
||||
}
|
||||
|
||||
|
||||
+15
-10
@@ -1,40 +1,45 @@
|
||||
import { EventEmitter } from 'events'
|
||||
import { nativeTheme, systemPreferences } from 'electron'
|
||||
|
||||
import is from 'electron-is'
|
||||
|
||||
import { APP_THEME } from '@shared/constants'
|
||||
import { getSystemTheme } from '../utils'
|
||||
|
||||
export default class ThemeManager extends EventEmitter {
|
||||
constructor (options = {}) {
|
||||
super()
|
||||
|
||||
this.options = options
|
||||
this.init()
|
||||
}
|
||||
|
||||
init () {
|
||||
this.systemTheme = getSystemTheme()
|
||||
|
||||
this.handleEvents()
|
||||
}
|
||||
|
||||
getSystemTheme () {
|
||||
let result = APP_THEME.LIGHT
|
||||
if (!is.macOS()) {
|
||||
return result
|
||||
}
|
||||
result = nativeTheme.shouldUseDarkColors ? APP_THEME.DARK : APP_THEME.LIGHT
|
||||
return result
|
||||
return this.systemTheme
|
||||
}
|
||||
|
||||
handleEvents () {
|
||||
if (!is.macOS()) {
|
||||
return
|
||||
}
|
||||
|
||||
nativeTheme.on('updated', () => {
|
||||
const theme = this.getSystemTheme()
|
||||
this.updateAppAppearance(theme)
|
||||
this.emit('system-theme-changed', theme)
|
||||
const theme = getSystemTheme()
|
||||
this.systemTheme = theme
|
||||
console.log('nativeTheme updated===>', theme)
|
||||
this.emit('system-theme-change', theme)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* deprecated
|
||||
* @see https://www.electronjs.org/docs/all#systempreferencessetapplevelappearanceappearance-macos-deprecated
|
||||
*/
|
||||
updateAppAppearance (theme) {
|
||||
if (!is.macOS() || theme !== APP_THEME.LIGHT || theme !== APP_THEME.DARK) {
|
||||
return
|
||||
|
||||
@@ -64,13 +64,7 @@ export default class TrayManager extends EventEmitter {
|
||||
setup () {
|
||||
this.build()
|
||||
|
||||
/**
|
||||
* Linux requires setContextMenu to be called
|
||||
* in order for the context menu to populate correctly
|
||||
*/
|
||||
if (process.platform === 'linux') {
|
||||
tray.setContextMenu(this.menu)
|
||||
}
|
||||
this.updateContextMenu()
|
||||
}
|
||||
|
||||
init () {
|
||||
@@ -79,10 +73,14 @@ export default class TrayManager extends EventEmitter {
|
||||
}
|
||||
|
||||
handleEvents () {
|
||||
// All OS
|
||||
tray.on('click', this.handleTrayClick)
|
||||
|
||||
// macOS, Windows
|
||||
tray.on('double-click', this.handleTrayDbClick)
|
||||
tray.on('right-click', this.handleTrayRightClick)
|
||||
|
||||
// macOS only
|
||||
tray.on('drop-files', this.handleTrayDropFile)
|
||||
}
|
||||
|
||||
@@ -114,6 +112,8 @@ export default class TrayManager extends EventEmitter {
|
||||
updateTray () {
|
||||
const icon = this.status ? this.activeIcon : this.normalIcon
|
||||
tray.setImage(icon)
|
||||
|
||||
this.updateContextMenu()
|
||||
}
|
||||
|
||||
changeIconTheme (theme = APP_THEME.LIGHT) {
|
||||
@@ -128,6 +128,8 @@ export default class TrayManager extends EventEmitter {
|
||||
|
||||
updateMenuStates (visibleStates, enabledStates, checkedStates) {
|
||||
updateStates(this.items, visibleStates, enabledStates, checkedStates)
|
||||
|
||||
this.updateContextMenu()
|
||||
}
|
||||
|
||||
updateMenuItemVisibleState (id, flag) {
|
||||
@@ -144,7 +146,26 @@ export default class TrayManager extends EventEmitter {
|
||||
this.updateMenuStates(null, enabledStates, null)
|
||||
}
|
||||
|
||||
updateContextMenu () {
|
||||
/**
|
||||
* Linux requires setContextMenu to be called
|
||||
* in order for the context menu to populate correctly
|
||||
*/
|
||||
if (process.platform !== 'linux') {
|
||||
return
|
||||
}
|
||||
|
||||
tray.setContextMenu(this.menu)
|
||||
}
|
||||
|
||||
destroy () {
|
||||
if (tray) {
|
||||
tray.removeListener('click', this.handleTrayClick)
|
||||
tray.removeListener('double-click', this.handleTrayDbClick)
|
||||
tray.removeListener('right-click', this.handleTrayRightClick)
|
||||
tray.removeListener('drop-files', this.handleTrayDropFile)
|
||||
}
|
||||
|
||||
tray.destroy()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,6 +105,14 @@ export default class WindowManager extends EventEmitter {
|
||||
}
|
||||
})
|
||||
|
||||
window.on('enter-full-screen', () => {
|
||||
this.emit('enter-full-screen', window)
|
||||
})
|
||||
|
||||
window.on('leave-full-screen', () => {
|
||||
this.emit('leave-full-screen', window)
|
||||
})
|
||||
|
||||
this.handleWindowState(page, window)
|
||||
|
||||
this.handleWindowClose(pageOptions, page, window)
|
||||
@@ -169,7 +177,15 @@ export default class WindowManager extends EventEmitter {
|
||||
window.on('close', (event) => {
|
||||
if (pageOptions.bindCloseToHide && !this.willQuit) {
|
||||
event.preventDefault()
|
||||
window.hide()
|
||||
|
||||
// @see https://github.com/electron/electron/issues/20263
|
||||
if (window.isFullScreen()) {
|
||||
window.once('leave-full-screen', () => window.hide())
|
||||
|
||||
window.setFullScreen(false)
|
||||
} else {
|
||||
window.hide()
|
||||
}
|
||||
}
|
||||
const bounds = window.getBounds()
|
||||
this.emit('window-closed', { page, bounds })
|
||||
@@ -178,15 +194,16 @@ export default class WindowManager extends EventEmitter {
|
||||
|
||||
showWindow (page) {
|
||||
const window = this.getWindow(page)
|
||||
if (!window) {
|
||||
if (!window || window.isVisible()) {
|
||||
return
|
||||
}
|
||||
|
||||
window.show()
|
||||
}
|
||||
|
||||
autoHideWindow (page) {
|
||||
hideWindow (page) {
|
||||
const window = this.getWindow(page)
|
||||
if (!window) {
|
||||
if (!window || !window.isVisible()) {
|
||||
return
|
||||
}
|
||||
window.hide()
|
||||
@@ -203,10 +220,11 @@ export default class WindowManager extends EventEmitter {
|
||||
if (!window) {
|
||||
return
|
||||
}
|
||||
if (window.isVisible()) {
|
||||
window.hide()
|
||||
} else {
|
||||
|
||||
if (!window.isVisible() || window.isFullScreen()) {
|
||||
window.show()
|
||||
} else {
|
||||
window.hide()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+13
-5
@@ -1,12 +1,14 @@
|
||||
import { app } from 'electron'
|
||||
import { app, nativeTheme } from 'electron'
|
||||
import is from 'electron-is'
|
||||
import { resolve } from 'path'
|
||||
import { existsSync, lstatSync } from 'fs'
|
||||
|
||||
import {
|
||||
APP_THEME,
|
||||
ENGINE_MAX_CONNECTION_PER_SERVER,
|
||||
IP_VERSION
|
||||
} from '@shared/constants'
|
||||
|
||||
import logger from '../core/Logger'
|
||||
import engineBinMap from '../configs/engine'
|
||||
|
||||
@@ -100,13 +102,13 @@ export function parseArgvAsUrl (argv) {
|
||||
export function checkIsSupportedSchema (url = '') {
|
||||
const str = url.toLowerCase()
|
||||
if (
|
||||
str.startsWith('mo:') ||
|
||||
str.startsWith('motrix:') ||
|
||||
str.startsWith('ftp:') ||
|
||||
str.startsWith('http:') ||
|
||||
str.startsWith('https:') ||
|
||||
str.startsWith('ftp:') ||
|
||||
str.startsWith('magnet:') ||
|
||||
str.startsWith('thunder:')
|
||||
str.startsWith('thunder:') ||
|
||||
str.startsWith('mo:') ||
|
||||
str.startsWith('motrix:')
|
||||
) {
|
||||
return true
|
||||
} else {
|
||||
@@ -133,3 +135,9 @@ export function parseArgvAsFile (argv) {
|
||||
export const getMaxConnectionPerServer = () => {
|
||||
return ENGINE_MAX_CONNECTION_PER_SERVER
|
||||
}
|
||||
|
||||
export const getSystemTheme = () => {
|
||||
let result = APP_THEME.LIGHT
|
||||
result = nativeTheme.shouldUseDarkColors ? APP_THEME.DARK : APP_THEME.LIGHT
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -9,11 +9,11 @@ export default class CommandManager extends EventEmitter {
|
||||
|
||||
register (id, fn) {
|
||||
if (this.commands[id]) {
|
||||
console.log('Attempting to register an already-registered command: ' + id)
|
||||
console.log('[Motrix] Attempting to register an already-registered command: ' + id)
|
||||
return null
|
||||
}
|
||||
if (!id || !fn) {
|
||||
console.error('Attempting to register a command with a missing id, or command function.')
|
||||
console.error('[Motrix] Attempting to register a command with a missing id, or command function.')
|
||||
return null
|
||||
}
|
||||
this.commands[id] = fn
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
outline: none;
|
||||
text-align: center;
|
||||
font-size: 0;
|
||||
color: $--app-logo-color;
|
||||
|
||||
@@ -39,11 +39,11 @@
|
||||
})
|
||||
},
|
||||
watch: {
|
||||
downloadSpeed (val, oldVal) {
|
||||
downloadSpeed (val) {
|
||||
const speed = val > 0 ? `${bytesToSize(val)}/s` : ''
|
||||
this.$electron.ipcRenderer.send('event', 'download-speed-change', speed)
|
||||
},
|
||||
numActive (val, oldVal) {
|
||||
numActive (val) {
|
||||
this.downloading = val > 0
|
||||
},
|
||||
downloading (val, oldVal) {
|
||||
|
||||
@@ -73,9 +73,11 @@
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
z-index: 5100;
|
||||
font-size: 0;
|
||||
> li {
|
||||
display: inline-block;
|
||||
padding: 5px 15px;
|
||||
padding: 5px 18px;
|
||||
font-size: 16px;
|
||||
margin: 0;
|
||||
color: $--titlebar-actions-color;
|
||||
&:hover {
|
||||
|
||||
@@ -465,8 +465,9 @@
|
||||
const tracker = convertTrackerDataToLine(data)
|
||||
this.form.lastSyncTrackerTime = Date.now()
|
||||
this.form.btTracker = tracker
|
||||
this.trackerSyncing = false
|
||||
})
|
||||
.finally(() => {
|
||||
.catch((_) => {
|
||||
this.trackerSyncing = false
|
||||
})
|
||||
},
|
||||
|
||||
@@ -411,11 +411,15 @@
|
||||
this.$electron.ipcRenderer.send('command',
|
||||
'application:open-at-login', openAtLogin)
|
||||
|
||||
this.$electron.ipcRenderer.send('command',
|
||||
'application:toggle-dock', runMode === APP_RUN_MODE.STANDARD)
|
||||
if ('runMode' in changed) {
|
||||
this.$electron.ipcRenderer.send('command',
|
||||
'application:toggle-dock', runMode === APP_RUN_MODE.STANDARD)
|
||||
}
|
||||
|
||||
this.$electron.ipcRenderer.send('command',
|
||||
'application:auto-hide-window', autoHideWindow)
|
||||
if ('autoHideWindow' in changed) {
|
||||
this.$electron.ipcRenderer.send('command',
|
||||
'application:auto-hide-window', autoHideWindow)
|
||||
}
|
||||
|
||||
if (checkIsNeedRestart(data)) {
|
||||
this.$electron.ipcRenderer.send('command',
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
header,
|
||||
...rest
|
||||
} = options
|
||||
console.log('showAddTaskDialog.options====>', options)
|
||||
console.log('[Motrix] show add task dialog options: ', options)
|
||||
|
||||
const headers = parseHeader(header)
|
||||
const newOptions = {
|
||||
@@ -214,7 +214,7 @@
|
||||
batchDeleteTaskFiles (taskList) {
|
||||
const promises = taskList.map((task, index) => delayDeleteTaskFiles(task, index * 200))
|
||||
Promise.all(promises).then(values => {
|
||||
console.log(values)
|
||||
console.log('[Motrix] batch delete task files: ', values)
|
||||
})
|
||||
},
|
||||
removeTaskItems (gids) {
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
|
||||
parseTorrent.remote(file.raw, (err, parsedTorrent) => {
|
||||
if (err) throw err
|
||||
console.log(parsedTorrent)
|
||||
console.log('[Motrix] parsed torrent: ', parsedTorrent)
|
||||
this.files = listTorrentFiles(parsedTorrent.files)
|
||||
this.$refs.torrentTable.toggleAllSelection()
|
||||
|
||||
|
||||
@@ -3,9 +3,9 @@ import { access, constants } from 'fs'
|
||||
import { Message } from 'element-ui'
|
||||
|
||||
import {
|
||||
isMagnetTask,
|
||||
bytesToSize,
|
||||
getTaskFullPath,
|
||||
bytesToSize
|
||||
isMagnetTask
|
||||
} from '@shared/utils'
|
||||
import { APP_THEME, TASK_STATUS } from '@shared/constants'
|
||||
|
||||
@@ -27,7 +27,7 @@ export function showItemInFolder (fullPath, { errorMsg }) {
|
||||
}
|
||||
|
||||
access(fullPath, constants.F_OK, (err) => {
|
||||
console.log(`${fullPath} ${err ? 'does not exist' : 'exists'}`)
|
||||
console.log(`[Motrix] ${fullPath} ${err ? 'does not exist' : 'exists'}`)
|
||||
if (err) {
|
||||
Message.error(errorMsg)
|
||||
return
|
||||
@@ -67,7 +67,7 @@ export function moveTaskFilesToTrash (task) {
|
||||
|
||||
let deleteResult1 = true
|
||||
access(path, constants.F_OK, (err) => {
|
||||
console.log(`${path} ${err ? 'does not exist' : 'exists'}`)
|
||||
console.log(`[Motrix] ${path} ${err ? 'does not exist' : 'exists'}`)
|
||||
if (!err) {
|
||||
deleteResult1 = remote.shell.moveItemToTrash(path)
|
||||
}
|
||||
@@ -81,7 +81,7 @@ export function moveTaskFilesToTrash (task) {
|
||||
let deleteResult2 = true
|
||||
const extraFilePath = `${path}.aria2`
|
||||
access(extraFilePath, constants.F_OK, (err) => {
|
||||
console.log(`${extraFilePath} ${err ? 'does not exist' : 'exists'}`)
|
||||
console.log(`[Motrix] ${extraFilePath} ${err ? 'does not exist' : 'exists'}`)
|
||||
if (!err) {
|
||||
deleteResult2 = remote.shell.moveItemToTrash(extraFilePath)
|
||||
}
|
||||
|
||||
+14
-2
@@ -88,11 +88,16 @@ export const trackerSourceOptions = [
|
||||
}
|
||||
]
|
||||
|
||||
export const ONE_SECOND = 1000
|
||||
export const ONE_MINUTE = ONE_SECOND * 60
|
||||
export const ONE_HOUR = ONE_MINUTE * 60
|
||||
export const ONE_DAY = ONE_HOUR * 24
|
||||
|
||||
// 12 Hours
|
||||
export const AUTO_SYNC_TRACKER_INTERVAL = 12 * 60 * 60 * 1000
|
||||
export const AUTO_SYNC_TRACKER_INTERVAL = ONE_HOUR * 12
|
||||
|
||||
// One Week
|
||||
export const AUTO_CHECK_UPDATE_INTERVAL = 7 * 24 * 60 * 60 * 1000
|
||||
export const AUTO_CHECK_UPDATE_INTERVAL = ONE_DAY * 7
|
||||
|
||||
export const NONE_SELECTED_FILES = 'none'
|
||||
export const SELECTED_ALL_FILES = 'all'
|
||||
@@ -103,3 +108,10 @@ export const IP_VERSION = {
|
||||
V4: 4,
|
||||
V6: 6
|
||||
}
|
||||
|
||||
export const LOGIN_SETTING_OPTIONS = {
|
||||
// For Windows
|
||||
args: [
|
||||
'--opened-at-login=1'
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"cmd-q": "application:quit",
|
||||
"cmd-n": "application:new-task",
|
||||
"cmd-shift-n": "application:new-bt-task",
|
||||
"cmd-o": "application:open-file",
|
||||
"cmd-,": "application:preferences",
|
||||
"cmd-shift-p": "application:pause-all-task",
|
||||
"cmd-shift-r": "application:resume-all-task",
|
||||
"cmdctrl-q": "application:quit",
|
||||
"cmdctrl-n": "application:new-task",
|
||||
"cmdctrl-shift-n": "application:new-bt-task",
|
||||
"cmdctrl-o": "application:open-file",
|
||||
"cmdctrl-,": "application:preferences",
|
||||
"cmdctrl-shift-p": "application:pause-all-task",
|
||||
"cmdctrl-shift-r": "application:resume-all-task",
|
||||
"ctrl-shift-a": "application:select-all-task"
|
||||
}
|
||||
|
||||
@@ -1,28 +1,34 @@
|
||||
import eleLocaleBg from 'element-ui/lib/locale/lang/bg'
|
||||
import eleLocaleCa from 'element-ui/lib/locale/lang/ca'
|
||||
import eleLocaleDe from 'element-ui/lib/locale/lang/de'
|
||||
import eleLocaleEn from 'element-ui/lib/locale/lang/en'
|
||||
import eleLocaleEs from 'element-ui/lib/locale/lang/es'
|
||||
import eleLocaleFa from 'element-ui/lib/locale/lang/fa'
|
||||
import eleLocaleFr from 'element-ui/lib/locale/lang/fr'
|
||||
import eleLocaleId from 'element-ui/lib/locale/lang/id'
|
||||
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 eleLocaleRu from 'element-ui/lib/locale/lang/ru-RU'
|
||||
import eleLocaleTr from 'element-ui/lib/locale/lang/tr-TR'
|
||||
import eleLocaleVi from 'element-ui/lib/locale/lang/vi'
|
||||
import eleLocaleZhCN from 'element-ui/lib/locale/lang/zh-CN'
|
||||
import eleLocaleZhTW from 'element-ui/lib/locale/lang/zh-TW'
|
||||
import eleLocaleUk from 'element-ui/lib/locale/lang/ua'
|
||||
import appLocaleBg from '@shared/locales/bg'
|
||||
import appLocaleCa from '@shared/locales/ca'
|
||||
import appLocaleDe from '@shared/locales/de'
|
||||
import appLocaleEnUS from '@shared/locales/en-US'
|
||||
import appLocaleEs from '@shared/locales/es'
|
||||
import appLocaleFa from '@shared/locales/fa'
|
||||
import appLocaleFr from '@shared/locales/fr'
|
||||
import appLocaleId from '@shared/locales/id'
|
||||
import appLocaleJa from '@shared/locales/ja'
|
||||
import appLocaleKo from '@shared/locales/ko'
|
||||
import appLocalePtBR from '@shared/locales/pt-BR'
|
||||
import appLocaleRu from '@shared/locales/ru'
|
||||
import appLocaleTr from '@shared/locales/tr'
|
||||
import appLocaleVi from '@shared/locales/vi'
|
||||
import appLocaleZhCN from '@shared/locales/zh-CN'
|
||||
import appLocaleZhTW from '@shared/locales/zh-TW'
|
||||
import appLocaleUk from '@shared/locales/uk'
|
||||
@@ -66,6 +72,12 @@ const resources = {
|
||||
...appLocaleFr
|
||||
}
|
||||
},
|
||||
'id': {
|
||||
translation: {
|
||||
...eleLocaleId,
|
||||
...appLocaleId
|
||||
}
|
||||
},
|
||||
'ja': {
|
||||
translation: {
|
||||
...eleLocaleJa,
|
||||
@@ -96,6 +108,12 @@ const resources = {
|
||||
...appLocaleTr
|
||||
}
|
||||
},
|
||||
'vi': {
|
||||
translation: {
|
||||
...eleLocaleVi,
|
||||
...appLocaleVi
|
||||
}
|
||||
},
|
||||
'zh-CN': {
|
||||
translation: {
|
||||
...eleLocaleZhCN,
|
||||
@@ -113,6 +131,12 @@ const resources = {
|
||||
...eleLocaleUk,
|
||||
...appLocaleUk
|
||||
}
|
||||
},
|
||||
'bg': {
|
||||
translation: {
|
||||
...eleLocaleBg,
|
||||
...appLocaleBg
|
||||
}
|
||||
}
|
||||
}
|
||||
/* eslint-enable quote-props */
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
import appLocaleBg from '@shared/locales/bg'
|
||||
import appLocaleCa from '@shared/locales/ca'
|
||||
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 appLocaleId from '@shared/locales/id'
|
||||
import appLocaleJa from '@shared/locales/ja'
|
||||
import appLocaleKo from '@shared/locales/ko'
|
||||
import appLocalePtBR from '@shared/locales/pt-BR'
|
||||
import appLocaleRu from '@shared/locales/ru'
|
||||
import appLocaleTr from '@shared/locales/tr'
|
||||
import appLocaleVi from '@shared/locales/vi'
|
||||
import appLocaleZhCN from '@shared/locales/zh-CN'
|
||||
import appLocaleZhTW from '@shared/locales/zh-TW'
|
||||
import appLocaleUk from '@shared/locales/uk'
|
||||
@@ -40,6 +43,11 @@ const resources = {
|
||||
...appLocaleFr
|
||||
}
|
||||
},
|
||||
'id': {
|
||||
translation: {
|
||||
...appLocaleId
|
||||
}
|
||||
},
|
||||
'ja': {
|
||||
translation: {
|
||||
...appLocaleJa
|
||||
@@ -65,6 +73,11 @@ const resources = {
|
||||
...appLocaleTr
|
||||
}
|
||||
},
|
||||
'vi': {
|
||||
translation: {
|
||||
...appLocaleVi
|
||||
}
|
||||
},
|
||||
'zh-CN': {
|
||||
translation: {
|
||||
...appLocaleZhCN
|
||||
@@ -79,6 +92,11 @@ const resources = {
|
||||
translation: {
|
||||
...appLocaleUk
|
||||
}
|
||||
},
|
||||
'bg': {
|
||||
translation: {
|
||||
...appLocaleBg
|
||||
}
|
||||
}
|
||||
}
|
||||
/* eslint-enable quote-props */
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'engine-version': 'Версия',
|
||||
'license': 'Лиценз',
|
||||
'about': 'Информация',
|
||||
'release': 'Съобщение',
|
||||
'support': 'Подкрепа'
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
export default {
|
||||
'task-list': 'Списък със задачи',
|
||||
'add-task': 'Добавяне на задача',
|
||||
'about': 'О Motrix',
|
||||
'preferences': 'Меню...',
|
||||
'check-for-updates': 'Проверка на актуализацията...',
|
||||
'check-updates-now': 'Проверете сега',
|
||||
'checking-for-updates': 'Проверка за актуализации...',
|
||||
'check-for-updates-title': 'Проверка за актуализации',
|
||||
'update-available-message': 'Новата версия на Motrix е достъпна за изтегляне, Изтеглете сега?',
|
||||
'update-not-available-message': 'Вече използвате най-новата версия!',
|
||||
'update-downloaded-message': 'Готово за инсталиране...',
|
||||
'update-error-message': 'Грешка при обновяване',
|
||||
'engine-damaged-message': 'Програмата е повредена, моля преинсталирайте :(',
|
||||
'engine-missing-message': 'Програмата е загубена, моля преинсталирайте :(',
|
||||
'system-error-title': 'Грешка',
|
||||
'system-error-message': 'Грешка при стартиране на приложението: {{message}}',
|
||||
'hide': 'Скрия Motrix',
|
||||
'hide-others': 'Скрийте всичко останало',
|
||||
'unhide': 'Показване на всички',
|
||||
'show': 'Показване Motrix',
|
||||
'quit': 'Затваряне Motrix',
|
||||
'under-development-message': 'За съжаление тази функция все още е в процес на разработка...',
|
||||
'yes': 'Да',
|
||||
'no': 'Не',
|
||||
'cancel': 'Отказ',
|
||||
'submit': 'Потвърдя',
|
||||
'gt1d': '> 1 ден',
|
||||
'hour': 'ч',
|
||||
'minute': 'м',
|
||||
'second': 'с'
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
export default {
|
||||
'undo': 'Отказ',
|
||||
'redo': 'Повторя',
|
||||
'cut': 'Нарежа',
|
||||
'copy': 'Копирам',
|
||||
'paste': 'Поставя',
|
||||
'delete': 'Премахна',
|
||||
'select-all': 'Изберете всички'
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'official-website': 'Сайт Motrix',
|
||||
'manual': 'Инструкция',
|
||||
'release-notes': 'Маркировки...',
|
||||
'report-problem': 'Докладвайте за проблем',
|
||||
'toggle-dev-tools': 'Превключване на инструменти за разработчици'
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import about from './about'
|
||||
import app from './app'
|
||||
import edit from './edit'
|
||||
import help from './help'
|
||||
import menu from './menu'
|
||||
import preferences from './preferences'
|
||||
import subnav from './subnav'
|
||||
import task from './task'
|
||||
import window from './window'
|
||||
|
||||
export default {
|
||||
about,
|
||||
app,
|
||||
edit,
|
||||
help,
|
||||
menu,
|
||||
preferences,
|
||||
subnav,
|
||||
task,
|
||||
window
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
export default {
|
||||
'app': 'Motrix',
|
||||
'file': 'Файл',
|
||||
'task': 'Задача',
|
||||
'edit': 'Редктиране',
|
||||
'window': 'Прозорец',
|
||||
'help': 'Грижа'
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
export default {
|
||||
'basic':'Основа',
|
||||
'advanced':'Разширени',
|
||||
'lab':'Лаборатория',
|
||||
'save': 'Съхронване и прилагане',
|
||||
'save-success-message':'настройките са запазени успешно',
|
||||
'save-fail-message': 'грешка при запазване на настройките',
|
||||
'discard': 'Отказ',
|
||||
'startup': 'стартиране',
|
||||
'open-at-login': 'стартиране на програмата заедно със стартирането на операционната система',
|
||||
'keep-window-state':'по време на затваряне на приложението, Запишете розмера и позицията на прозореца',
|
||||
'auto-resume-all':'автоматично възобновяване на всички недовършени задачи',
|
||||
'default-dir':'пея по подразбиране',
|
||||
'mas-default-dir-tips': 'поради ограничения в App Store, препоръчително е да зададете пътя по подразбиране като ~/Downloads',
|
||||
'transfer-settings':'скоростна кутия',
|
||||
'transfer-speed-upload': 'лимит на откат',
|
||||
'transfer-speed-download': 'лимит за изтегляне',
|
||||
'transfer-speed-unlimited':'Unlimited',
|
||||
'task-manage':'мениджър на задачи',
|
||||
'max-concurrent-downloads': 'Максимум активни задачи',
|
||||
'max-connection-per-server': 'максимални връзки към сървъра',
|
||||
'new-task-show-downloading': 'автоматично показване на задача след добавяне',
|
||||
'no-confirm-before-delete-task': 'Не се изисква потвърждение преди изтриване на задача',
|
||||
'continue':'Продължи',
|
||||
'task-completed-notify': 'съобщение след изтеглянето',
|
||||
'auto-purge-record': 'автоматично почистване на записите за изтегляне след затваряне на приложението',
|
||||
'ui': 'UI',
|
||||
'appearance': 'външен вид',
|
||||
'theme-auto':'автоматично',
|
||||
'theme-light':'Светло',
|
||||
'theme-dark':'dark',
|
||||
'run-mode': 'Бягай като',
|
||||
'auto-hide-window': 'Автоматично отваряне на прозорци',
|
||||
'run-mode-standard': 'стандартно приложение',
|
||||
'run-mode-menu-bar': 'лента с менюта на приложението',
|
||||
'language':'Език',
|
||||
'change-language': 'промяна на езика',
|
||||
'hide-app-menu': 'Скриване на менюто на приложението (само за Windows и Linux)',
|
||||
'proxy': 'Proxy',
|
||||
'use-proxy': 'използване на Proxy',
|
||||
'no-proxy-input-tips': 'заобикаляне на настройките на прокси за тези хостове и домейни, един по един на ред',
|
||||
'proxy-tips': 'преглед на ръководството за прокси',
|
||||
'bt-tracker':'Tracker сървър',
|
||||
'bt-tracker-input-tips': 'Tracker сървър, един на ред',
|
||||
'bt-tracker-tips': 'препоръчително:',
|
||||
'sync-tracker-tips':'Синхронизация',
|
||||
'auto-sync-tracker':'актуализиране на списъка с тракери всеки ден автоматично',
|
||||
'port':'портове за слушане',
|
||||
'bt-port':'пристанище на слушане BT',
|
||||
'dht-port':'DHT слушане Порт',
|
||||
'security':'сигурност',
|
||||
'rpc-secret': 'RPC Secret',
|
||||
'rpc-secret-tips': 'Гледайте инструкцията RPC Secret',
|
||||
'developer':'developer',
|
||||
'Mock-user-agent':'оформление User-Agent',
|
||||
'app-log-path': 'път към дневника на приложението',
|
||||
'download-session-path': 'качване на пътя на сесията',
|
||||
'factory-reset': 'Настройки по подразбиране',
|
||||
'factory-reset-confirm': 'Сигурни ли сте, че искате да се върнете към настройките по подразбиране?',
|
||||
'lab-warning': '️ ️ включването на функциите на лабораторията може да доведе до срив на приложението и загуба на данни, решете на свой риск!',
|
||||
'download-protocol':'протоколи',
|
||||
'protocols-default-client':'Задаване като клиент по подразбиране за следните протоколи',
|
||||
'protocols-magnet': 'Magnet [ magnet:// ]',
|
||||
'protocols-thunder': 'Thunder [ thunder:// ]',
|
||||
'browser-extensions': 'Розширения',
|
||||
'baidu-exporter': 'BaiduExporter',
|
||||
'browser-extensions-tips': 'предоставени от общността,',
|
||||
'baidu-exporter-help': 'Кликнете тук, за да използвате',
|
||||
'auto-update':'автоматично обновяване',
|
||||
'auto-check-update':'автоматична проверка на актуализациите',
|
||||
'last-check-update-time': 'последната актуализация е проверена'
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
export default {
|
||||
'task-list':'Задачи',
|
||||
'preferences':'Настройки'
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
export default {
|
||||
'active':'Активен',
|
||||
'waiting':'чакане',
|
||||
'stopped':'спряно',
|
||||
'new-task': 'нова задача',
|
||||
'new-bt-task': 'Нова BT задача',
|
||||
'open-file': 'отваряне на торент файл...',
|
||||
'uri-task': 'URL',
|
||||
'torrent-task': 'Torrent',
|
||||
'uri-task-tips': 'една URL задача в низ (поддръжка на magnet)',
|
||||
'thunder-link-tips': 'съвет: връзките от типа Thunder може да не се зареждат след декодиране',
|
||||
'new-task-uris-required': 'въведете валиден URL адрес на ресурс',
|
||||
'new-task-torrent-required': 'моля, изберете торент файл',
|
||||
'file-name': 'Име на файл',
|
||||
'file-extension':'тип файл',
|
||||
'file-size': 'файлов Розмер',
|
||||
'selected-files-sum': 'избрано: {{selectedFilesCount}} файлове, общ размер {{selectedFilesTotalSize}}',
|
||||
'task-name':'Име на изтегляне',
|
||||
'task-out': 'Преименуване',
|
||||
'task-out-tips':'незадължителен',
|
||||
'task-split': 'разделяне',
|
||||
'task-dir': 'Запазване в',
|
||||
'pause-task': 'пауза на задачата',
|
||||
'task-ua': 'UA',
|
||||
'task-user-agent': 'User-Agent',
|
||||
'task-referer': 'препращане',
|
||||
'task-cookie': 'Cookie',
|
||||
'task-proxy': 'Proxy',
|
||||
'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}}"?',
|
||||
'batch-delete-task-confirm': 'Сигурни ли сте, че искате да изтриете {{count}} задачи за зареждане в партиден режим?',
|
||||
'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': 'грешка при възобновяване на всички задачи',
|
||||
'select-all-task': 'Изберете всички задачи',
|
||||
'clear-recent-tasks': 'Изчистване на последните задачи',
|
||||
'purge-record': 'Изчистване на записките за задачи',
|
||||
'purge-record-success': 'успешно изчистени записи на задачи',
|
||||
'purge-record-fail': 'грешка при изчистване на записите за задачи',
|
||||
'batch-delete-task-success': 'успешно изтриване на задачи в партиден режим',
|
||||
'batch-delete-task-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}}, раздаване',
|
||||
'BT-download-complete-notify': 'BT изтеглянето приключи, раздаване...',
|
||||
'BT-download-complete-tips': 'съвет: можете да спрете задачата, за да спрете раздаването',
|
||||
'download-fail-message': 'не може да бъде изтеглено {{taskName}}',
|
||||
'download-fail-notify': 'грешка при зареждане'
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
export default {
|
||||
'reload': 'Перезагрузить',
|
||||
'close': 'Закрыть',
|
||||
'minimize': 'Свернуть',
|
||||
'zoom': 'Увеличение',
|
||||
'toggle-fullscreen': 'Перейти в полноэкранный режим',
|
||||
'front': 'Поверх всех окон'
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'engine-version': 'Versi Mesin',
|
||||
'license': 'Lisensi',
|
||||
'about': 'Tentang',
|
||||
'release': 'Rilis',
|
||||
'support': 'Bantuan'
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
export default {
|
||||
'task-list': 'Daftar Tugas',
|
||||
'add-task': 'Tambah Tugas',
|
||||
'about': 'Tentang Motrix',
|
||||
'preferences': 'Preferensi...',
|
||||
'check-for-updates': 'Periksa Pembaruan...',
|
||||
'check-updates-now': 'Periksa Sekarang',
|
||||
'checking-for-updates': 'Memeriksa pembaruan...',
|
||||
'check-for-updates-title': 'Periksa Pembaruan',
|
||||
'update-available-message': 'Versi Motrix terbaru telah tersedia, perbarui sekarang?',
|
||||
'update-not-available-message': 'Aplikasi dalam kondisi ter-update!',
|
||||
'update-downloaded-message': 'siap meng-install...',
|
||||
'update-error-message': 'Update Gagal',
|
||||
'engine-damaged-message': 'Mesin rusak, silahkan install ulang : (',
|
||||
'engine-missing-message': 'Mesin hilang, silahkan install ulang : (',
|
||||
'system-error-title': 'System Error',
|
||||
'system-error-message': 'Gagal Menjalankan Aplikasi: {{message}}',
|
||||
'hide': 'Sembungikan Motrix',
|
||||
'hide-others': 'Sembunyikan yang lain',
|
||||
'unhide': 'Tunjukan Semua',
|
||||
'show': 'Tunjukan Motrix',
|
||||
'quit': 'Keluarkan Motrix',
|
||||
'under-development-message': 'Maaf, fitur ini dalam tahap development...',
|
||||
'yes': 'Ya',
|
||||
'no': 'Tidak',
|
||||
'cancel': 'Batal',
|
||||
'submit': 'Kirim',
|
||||
'gt1d': '> 1 hari',
|
||||
'hour': 'h',
|
||||
'minute': 'm',
|
||||
'second': 's'
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
export default {
|
||||
'undo': 'Urungkan',
|
||||
'redo': 'Ulangi',
|
||||
'cut': 'Potong',
|
||||
'copy': 'Salin',
|
||||
'paste': 'Tempel',
|
||||
'delete': 'Hapus',
|
||||
'select-all': 'Pilih Semua'
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'official-website': 'Motrix Website',
|
||||
'manual': 'Panduan',
|
||||
'release-notes': 'Catatan Rilis...',
|
||||
'report-problem': 'Laporkan Masalah',
|
||||
'toggle-dev-tools': 'Alihkan Alat Pengembang'
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import about from './about'
|
||||
import app from './app'
|
||||
import edit from './edit'
|
||||
import help from './help'
|
||||
import menu from './menu'
|
||||
import preferences from './preferences'
|
||||
import subnav from './subnav'
|
||||
import task from './task'
|
||||
import window from './window'
|
||||
|
||||
export default {
|
||||
about,
|
||||
app,
|
||||
edit,
|
||||
help,
|
||||
menu,
|
||||
preferences,
|
||||
subnav,
|
||||
task,
|
||||
window
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
export default {
|
||||
'app': 'Motrix',
|
||||
'file': 'Berlas',
|
||||
'task': 'Tugas',
|
||||
'edit': 'Edit',
|
||||
'window': 'Window',
|
||||
'help': 'Bantuan'
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
export default {
|
||||
'basic': 'Pengaturan Dasar',
|
||||
'advanced': 'Pengaturan Lanjut',
|
||||
'lab': 'Lab',
|
||||
'save': 'Simpan & Terapkan',
|
||||
'save-success-message': 'Berhasil menyimpan pengaturan',
|
||||
'save-fail-message': 'Gagal menyimpan pengaturan',
|
||||
'discard': 'Batal',
|
||||
'startup': 'Memulai',
|
||||
'open-at-login': 'Buka saat login',
|
||||
'keep-window-state': 'Pertahankan ukuran dan posisi jendela aplikasi saat keluar',
|
||||
'auto-resume-all': 'Otomatis lanjutkan semua tugas yang belum selesai',
|
||||
'default-dir': 'Lokasi Bawaan',
|
||||
'mas-default-dir-tips': 'Karena pembatasan dari App Store, direktori unduhan default direkomendasikan untuk disetel ke ~/Downloads',
|
||||
'transfer-settings': 'Transfer Setting',
|
||||
'transfer-speed-upload': 'Limit Unggah',
|
||||
'transfer-speed-download': 'Limit Unduh',
|
||||
'transfer-speed-unlimited': 'Tak Terbatas',
|
||||
'task-manage': 'Pengelola Tugas',
|
||||
'max-concurrent-downloads': 'Maksimal tugas aktif',
|
||||
'max-connection-per-server': 'Maksimal koneksi per server',
|
||||
'new-task-show-downloading': 'Tampilkan pengunduhan secara otomatis setelah menambahkan tugas',
|
||||
'no-confirm-before-delete-task': 'Konfirmasi tidak diperlukan sebelum menghapus tugas',
|
||||
'continue': 'Lanjutkan',
|
||||
'task-completed-notify': 'Pemberitahuan setelah pengunduhan selesai',
|
||||
'auto-purge-record': 'Otomatis bersihkan catatan unduhan saat keluar dari aplikasi',
|
||||
'ui': 'UI',
|
||||
'appearance': 'Penampilan',
|
||||
'theme-auto': 'Auto',
|
||||
'theme-light': 'Terang',
|
||||
'theme-dark': 'Gelap',
|
||||
'run-mode': 'Jalankan Sebagai',
|
||||
'auto-hide-window': 'Sembunyikan Otomatis Jendela',
|
||||
'run-mode-standard': 'Aplikasi Standar',
|
||||
'run-mode-menu-bar': 'Aplikasi Menu Bar',
|
||||
'language': 'Bahasa',
|
||||
'change-language': 'Ubah Bahasa',
|
||||
'hide-app-menu': 'Sembunyikan Menu Aplikasi (hanya: Windows & Linux)',
|
||||
'proxy': 'Proxy',
|
||||
'use-proxy': 'Aktifkan Proxy',
|
||||
'no-proxy-input-tips': 'Abaikan pengaturan proxy untuk Host dan Domain ini, satu per baris',
|
||||
'proxy-tips': 'Lihat Manual Proxy',
|
||||
'bt-tracker': 'Server Pelacak',
|
||||
'bt-tracker-input-tips': 'Server pelacak, satu per baris',
|
||||
'bt-tracker-tips': 'Direkomendasikan: ',
|
||||
'sync-tracker-tips': 'Sinkronkan',
|
||||
'auto-sync-tracker': 'Perbarui daftar pelacak setiap hari secara otomatis',
|
||||
'port': 'Dengarkan Ports',
|
||||
'bt-port': 'Dengarkan Port BT',
|
||||
'dht-port': 'Dengarkan Port DHT',
|
||||
'security': 'Keamanan',
|
||||
'rpc-secret': 'RPC Secret',
|
||||
'rpc-secret-tips': 'Lihat Petunjuk RPC Secret',
|
||||
'developer': 'Developer',
|
||||
'mock-user-agent': 'Mock User-Agent',
|
||||
'app-log-path': 'Lokasi Log Aplikasi',
|
||||
'download-session-path': 'Lokasi Session Unduhan',
|
||||
'factory-reset': 'Reset Pabrik',
|
||||
'factory-reset-confirm': 'Anda yakin ingin kembali ke pengaturan pabrik?',
|
||||
'lab-warning': 'Mengaktifkan fitur lab dapat menyebabkan aplikasi tidak berjalan semestinya atau kehilangan data, risiko ditanggung Anda sendiri!',
|
||||
'download-protocol': 'Protocols',
|
||||
'protocols-default-client': 'Tetapkan sebagai klien untuk Protocol berikut',
|
||||
'protocols-magnet': 'Magnet [ magnet:// ]',
|
||||
'protocols-thunder': 'Thunder [ thunder:// ]',
|
||||
'browser-extensions': 'Ekstensi',
|
||||
'baidu-exporter': 'BaiduExporter',
|
||||
'browser-extensions-tips': 'Disediakan oleh komunitas, ',
|
||||
'baidu-exporter-help': 'Klik di sini untuk penggunaan',
|
||||
'auto-update': 'Pembaruan Otomatis',
|
||||
'auto-check-update': 'Secara otomatis memeriksa pembaruan',
|
||||
'last-check-update-time': 'Terakhir Kali Memeriksa Pembaruan'
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
export default {
|
||||
'task-list': 'Daftar Tugas',
|
||||
'preferences': 'Pengaturan'
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
export default {
|
||||
'active': 'Mengunduh',
|
||||
'waiting': 'Mengunggu',
|
||||
'stopped': 'Terhenti',
|
||||
'new-task': 'Tugas Baru',
|
||||
'new-bt-task': 'Tugas BT baru',
|
||||
'open-file': 'Buka Berkas Torrent...',
|
||||
'uri-task': 'URL',
|
||||
'torrent-task': 'Torrent',
|
||||
'uri-task-tips': 'Satu tugas per baris (mendukung magnet)',
|
||||
'thunder-link-tips': 'Tip: Thunder tautan mungkin tidak dapat diunduh setelah decoding',
|
||||
'new-task-uris-required': 'Silakan masukkan setidaknya satu url yang valid',
|
||||
'new-task-torrent-required': 'Silahkan pilih berkas torrent',
|
||||
'file-name': 'Nama Berkas',
|
||||
'file-extension': 'Tipe Berkas',
|
||||
'file-size': 'Ukuran Berkas',
|
||||
'selected-files-sum': 'Terpilih: {{selectedFilesCount}} berkas, total ukuran {{selectedFilesTotalSize}}',
|
||||
'task-name': 'Nama Tugas',
|
||||
'task-out': 'Ubah Nama',
|
||||
'task-out-tips': 'Opsional',
|
||||
'task-split': 'Pecahan',
|
||||
'task-dir': 'Simpan Ke',
|
||||
'pause-task': 'Tunda Tugas',
|
||||
'task-ua': 'UA',
|
||||
'task-user-agent': 'User-Agent',
|
||||
'task-referer': 'Referer',
|
||||
'task-cookie': 'Cookie',
|
||||
'task-proxy': 'Proxy',
|
||||
'navigate-to-downloading': 'Beralih ke Unduhan',
|
||||
'show-advanced-options': 'Setting Lanjutan',
|
||||
'copyright-warning': 'Peringatan Hak Cipta',
|
||||
'copyright-warning-message': 'File yang ingin Anda unduh mungkin berupa audio atau video yang dilindungi hak cipta, pastikan Anda memiliki izin untuk mengaksesnya.',
|
||||
'copyright-yes': 'Ya, Saya punya izin',
|
||||
'copyright-no': 'Tidak, Saya tidak punya izin',
|
||||
'copyright-error-message': 'Gagal menambahkan tugas karena masalah hak cipta',
|
||||
'pause-task-success': 'Tugas berhasil ditunda "{{taskName}}"',
|
||||
'pause-task-fail': 'Gagal menunda tugas "{{taskName}}"',
|
||||
'resume-task': 'Lanjutkan tugas',
|
||||
'resume-task-success': 'Berhasil melanjutkan tugas "{{taskName}}"',
|
||||
'resume-task-fail': 'Gagal melanjutkan tugas "{{taskName}}"',
|
||||
'delete-task': 'Hapus tugas',
|
||||
'delete-selected-tasks': 'Hapus tugas terpilih',
|
||||
'delete-task-confirm': 'Anda yakin ingin menghapus tugas unduhan "{{taskName}}"?',
|
||||
'batch-delete-task-confirm': 'Anda yakin ingin menghapus {{count}} tugas unduhan (batch)?',
|
||||
'delete-task-label': 'Hapus dengan File',
|
||||
'delete-task-success': 'Tugas "{{taskName}}" berhasil dihapus',
|
||||
'delete-task-fail': 'Tugas "{{taskName}}" gagal dihapus',
|
||||
'remove-task-file-fail': 'Gagal menghapus berkas tugas, silahkan hapus secara manual',
|
||||
'remove-task-config-file-fail': 'Gagal menghapus pengaturan berkas tugas, silahkan hapus secara manual',
|
||||
'move-task-up': 'Pidahkan Tugas ke Atas',
|
||||
'move-task-down': 'Pidahkan Tugas ke Bawah',
|
||||
'pause-all-task': 'Tunda Semua Tugas',
|
||||
'pause-all-task-success': 'Berhasil menunda semua tugas',
|
||||
'pause-all-task-fail': 'Gagal menunda semua tugas',
|
||||
'resume-all-task': 'Lanjutkan Semua Tugas',
|
||||
'resume-all-task-success': 'Berhasil melanjutkan semua tugas',
|
||||
'resume-all-task-fail': 'Gagal melanjutkan semua tugas',
|
||||
'select-all-task': 'Pilih Semua Tugas',
|
||||
'clear-recent-tasks': 'Bersihkan tugas terakhir',
|
||||
'purge-record': 'Bersihkan Catatan Tugas',
|
||||
'purge-record-success': 'Berhasil membersihkan catatan tugas',
|
||||
'purge-record-fail': 'Gagal membersihkan catatan tugas',
|
||||
'batch-delete-task-success': 'Berhasil menghapus tugas (batch)',
|
||||
'batch-delete-task-fail': 'Gagal menghapus tugas (batch)',
|
||||
'refresh-list': 'Muat Ulang Daftar',
|
||||
'no-task': 'Tidak ada tugas',
|
||||
'copy-link': 'Salin Link',
|
||||
'copy-link-success': 'Berhasil menyalin link',
|
||||
'remove-record': 'Hapus Data Tugas',
|
||||
'remove-record-confirm': 'Anda yakin ingin menghapus data unduhan "{{taskName}}"?',
|
||||
'remove-record-label': 'Hapus dengan Berkas',
|
||||
'remove-record-success': 'Catatan tugas berhasil dihapus untuk "{{taskName}}"',
|
||||
'remove-record-fail': 'Gagal menghapus catatan tugas untuk "{{taskName}}"',
|
||||
'show-in-folder': 'Tampilkan Tugas Di Folder',
|
||||
'file-not-exist': 'Berkas target tidak ada atau telah dihapus',
|
||||
'file-path-error': 'Lokasi berkas error',
|
||||
'opening-task-message': 'Membuka "{{taskName}}" ...',
|
||||
'get-task-name': 'Mendapatkan nama tugas...',
|
||||
'remaining-prefix': 'Tersisa',
|
||||
'select-torrent': 'Seret berkas torrent ke sini, atau klik untuk memilih',
|
||||
'task-info-dialog-title': '{{title}} Detail',
|
||||
'download-start-message': 'Memulai mengunduh {{taskName}}',
|
||||
'download-pause-message': 'Menunda mengunduh {{taskName}}',
|
||||
'download-stop-message': 'Berhenti mengunduh {{taskName}}',
|
||||
'download-error-message': 'Terjadi kesalahan saat mengunduh {{taskName}}',
|
||||
'download-complete-message': 'Selesai mengunduh {{taskName}}',
|
||||
'download-complete-notify': 'Unduh Selesai',
|
||||
'bt-download-complete-message': 'Selesai mengunduh {{taskName}}, penyemaian',
|
||||
'bt-download-complete-notify': 'BT Unduh Selesai, penyemaian...',
|
||||
'bt-download-complete-tips': 'Tips: Anda dapat menghentikan tugas untuk mengakhiri penyemaian',
|
||||
'download-fail-message': 'Gagal mengunduh {{taskName}}',
|
||||
'download-fail-notify': 'Unduhan Gagal'
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
export default {
|
||||
'reload': 'Muat Ulang',
|
||||
'close': 'Keluar',
|
||||
'minimize': 'Perkecil',
|
||||
'zoom': 'Zoom',
|
||||
'toggle-fullscreen': 'Layar penuh',
|
||||
'front': 'Bawa Semua ke Depan'
|
||||
}
|
||||
@@ -6,6 +6,10 @@
|
||||
* Please keep the locale key in alphabetical order.
|
||||
*/
|
||||
export const availableLanguages = [
|
||||
{
|
||||
value: 'bg',
|
||||
label: 'Българският език'
|
||||
},
|
||||
{
|
||||
value: 'ca',
|
||||
label: 'Català'
|
||||
@@ -30,6 +34,10 @@ export const availableLanguages = [
|
||||
value: 'fr',
|
||||
label: 'Français'
|
||||
},
|
||||
{
|
||||
value: 'id',
|
||||
label: 'Indonesia'
|
||||
},
|
||||
{
|
||||
value: 'ja',
|
||||
label: '日本語'
|
||||
@@ -50,6 +58,10 @@ export const availableLanguages = [
|
||||
value: 'tr',
|
||||
label: 'Türkçe'
|
||||
},
|
||||
{
|
||||
value: 'vi',
|
||||
label: 'Tiếng Việt'
|
||||
},
|
||||
{
|
||||
value: 'zh-CN',
|
||||
label: '简体中文'
|
||||
|
||||
@@ -11,8 +11,8 @@ export default {
|
||||
'update-not-available-message': 'Вы уже используете самую последнюю версию!',
|
||||
'update-downloaded-message': 'Готово к установке...',
|
||||
'update-error-message': 'Ошибка обновления',
|
||||
'engine-damaged-message': 'Движек поврежден, пожалуйста переустановите : (',
|
||||
'engine-missing-message': 'Движек потерян, пожалуйста переустановите : (',
|
||||
'engine-damaged-message': 'Движок поврежден. Пожалуйста, переустановите его : (',
|
||||
'engine-missing-message': 'Движок потерян. Пожалуйста, переустановите его : (',
|
||||
'system-error-title': 'Системная ошибка',
|
||||
'system-error-message': 'Ошибка запуска приложения: {{message}}',
|
||||
'hide': 'Спрятать Motrix',
|
||||
|
||||
@@ -2,7 +2,7 @@ export default {
|
||||
'app': 'Motrix',
|
||||
'file': 'Файл',
|
||||
'task': 'Задания',
|
||||
'edit': 'Редктировать',
|
||||
'edit': 'Редактировать',
|
||||
'window': 'Окно',
|
||||
'help': 'Помощь'
|
||||
}
|
||||
|
||||
@@ -2,15 +2,15 @@ export default {
|
||||
'basic': 'Основные',
|
||||
'advanced': 'Расширенные',
|
||||
'lab': 'Лаборатория',
|
||||
'save': 'Сохронить и Применить',
|
||||
'save': 'Сохранить и применить',
|
||||
'save-success-message': 'Настройки сохранены успешно',
|
||||
'save-fail-message': 'Ошибка при сохранении настроек',
|
||||
'discard': 'Отмена',
|
||||
'startup': 'Запускать',
|
||||
'open-at-login': 'Запускать програму вместе со стартом операционной системы',
|
||||
'keep-window-state': 'Во время закрытия приложения, сохранять розмер и положения окна',
|
||||
'keep-window-state': 'Во время закрытия приложения, сохранять размер и положение окна',
|
||||
'auto-resume-all': 'Автоматически возобновлять все незавершенные задачи',
|
||||
'default-dir': 'Петь по умолчанию',
|
||||
'default-dir': 'Папка по умолчанию',
|
||||
'mas-default-dir-tips': 'Из-за ограничения в App Store, рекомендуется устанавливать путь по умолчанию как ~/Downloads',
|
||||
'transfer-settings': 'коробка передач',
|
||||
'transfer-speed-upload': 'Лимит отдачи',
|
||||
@@ -21,27 +21,27 @@ export default {
|
||||
'max-connection-per-server': 'Максимум соединений на сервер',
|
||||
'new-task-show-downloading': 'Автоматически отображать задачу после ее добавления',
|
||||
'continue': 'Продолжить',
|
||||
'task-completed-notify': 'Сообщение после окончани загрузки',
|
||||
'task-completed-notify': 'Сообщение после окончания загрузки',
|
||||
'auto-purge-record': 'Автоматически чистить записи о загрузках после закрытия приложения',
|
||||
'ui': 'UI',
|
||||
'appearance': 'Внешний вид',
|
||||
'theme-auto': 'Автоматически',
|
||||
'theme-light': 'Светлый',
|
||||
'theme-dark': 'Темный',
|
||||
'run-mode': 'Беги как',
|
||||
'run-mode': 'Запускать как...',
|
||||
'auto-hide-window': 'Автоскрытие окон',
|
||||
'run-mode-standard': 'Стандартное приложение',
|
||||
'run-mode-menu-bar': 'Панель меню приложения',
|
||||
'language': 'Язык',
|
||||
'change-language': 'Сменить язык',
|
||||
'hide-app-menu': 'Скрыть меню приложения (Только для Windows и Linux)',
|
||||
'hide-app-menu': 'Скрыть меню приложения (только для Windows и Linux)',
|
||||
'proxy': 'Proxy',
|
||||
'use-proxy': 'Использовать Proxy',
|
||||
'no-proxy-input-tips': 'Обойти настройки прокси для этих хостов и доменов, по одному в строке',
|
||||
'proxy-tips': 'Посмотреть руководство по прокси',
|
||||
'bt-tracker': 'Tracker Сервер',
|
||||
'bt-tracker-input-tips': 'Tracker сервера, один в строку',
|
||||
'bt-tracker-tips': 'Рекомендованно: ',
|
||||
'bt-tracker-tips': 'Рекомендовано: ',
|
||||
'sync-tracker-tips': 'Синхронизация',
|
||||
'auto-sync-tracker': 'Обновлять список трекеров каждый день автоматически',
|
||||
'port': 'Порты прослушивания',
|
||||
@@ -56,16 +56,16 @@ export default {
|
||||
'download-session-path': 'Загрузить путь сессии',
|
||||
'factory-reset': 'Настройки по умолчанию',
|
||||
'factory-reset-confirm': 'Вы уверены, что хотите вернуться к настройкам по умолчанию?',
|
||||
'lab-warning': '⚠️ Включения функций лаборатории может привести к сбою приложения и потери данных, решайте на свой риск!',
|
||||
'lab-warning': '⚠️ Включение функций лаборатории может привести к сбоям приложения и потери данных. Вы действуете на свой страх и риск!',
|
||||
'download-protocol': 'Протоколы',
|
||||
'protocols-default-client': 'Установить как клиента по умолчанию для следующих протоколов',
|
||||
'protocols-magnet': 'Magnet [ magnet:// ]',
|
||||
'protocols-thunder': 'Thunder [ thunder:// ]',
|
||||
'browser-extensions': 'Розширения',
|
||||
'browser-extensions': 'Расширения',
|
||||
'baidu-exporter': 'BaiduExporter',
|
||||
'browser-extensions-tips': 'Предоставляются сообществом, ',
|
||||
'baidu-exporter-help': 'Нажмите здесь для использования',
|
||||
'auto-update': 'Автоматическое обновление',
|
||||
'auto-check-update': 'Автоматически проверять обновления',
|
||||
'last-check-update-time': 'В последний раз обновление проверялось'
|
||||
'last-check-update-time': 'Последняя проверка на обновления прошла в'
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
export default {
|
||||
'active': 'Загрузки',
|
||||
'waiting': 'Ожидание',
|
||||
'stopped': 'Остановленно',
|
||||
'new-task': 'Нове задание',
|
||||
'new-bt-task': 'Нове BT задание',
|
||||
'stopped': 'Остановлено',
|
||||
'new-task': 'Новое задание',
|
||||
'new-bt-task': 'Новое BT задание',
|
||||
'open-file': 'Открыть Torrent файл...',
|
||||
'uri-task': 'URL',
|
||||
'torrent-task': 'Torrent',
|
||||
'uri-task-tips': 'Один URL-задания в строку (поддержка magnet)',
|
||||
'thunder-link-tips': 'Совет: Ссылки типа Thunder могут не загружаться после декодированния',
|
||||
'new-task-uris-required': 'Введите хотябы один действительный URL-адрес ресурса',
|
||||
'new-task-torrent-required': 'Пожалуйста выберите torrent файл',
|
||||
'new-task-uris-required': 'Введите хотя бы один действительный URL-адрес ресурса',
|
||||
'new-task-torrent-required': 'Пожалуйста, выберите torrent файл',
|
||||
'file-name': 'Имя файла',
|
||||
'file-extension': 'Тип файла',
|
||||
'file-size': 'Розмер файла',
|
||||
@@ -19,7 +19,7 @@ export default {
|
||||
'task-out': 'Переименовать',
|
||||
'task-out-tips': 'Необязательный',
|
||||
'task-split': 'Разбить',
|
||||
'task-dir': 'Сохранить в',
|
||||
'task-dir': 'Сохранить как',
|
||||
'pause-task': 'Приостановить задание',
|
||||
'task-ua': 'UA',
|
||||
'task-user-agent': 'User-Agent',
|
||||
@@ -33,10 +33,10 @@ export default {
|
||||
'copyright-yes': 'Да, у меня есть права',
|
||||
'copyright-no': 'Нет, у меня нет прав',
|
||||
'copyright-error-message': 'Ошибка при добавлении задачи из-за проблем с авторскими правами',
|
||||
'pause-task-success': 'Успешно приостановленно задание "{{taskName}}"',
|
||||
'pause-task-fail': 'Ошибка во время приостановленния задания "{{taskName}}"',
|
||||
'resume-task': 'Возобновить Задание',
|
||||
'resume-task-success': 'Успешно возобновленно задание "{{taskName}}"',
|
||||
'pause-task-success': 'Успешно остановлено задание "{{taskName}}"',
|
||||
'pause-task-fail': 'Ошибка во время остановки задания "{{taskName}}"',
|
||||
'resume-task': 'Возобновить задание',
|
||||
'resume-task-success': 'Успешно возобновлено задание "{{taskName}}"',
|
||||
'resume-task-fail': 'Ошибка во время возобновления задания "{{taskName}}"',
|
||||
'delete-task': 'Удалить задание',
|
||||
'delete-selected-tasks': 'Удалить выбранные задания',
|
||||
@@ -45,15 +45,15 @@ export default {
|
||||
'delete-task-label': 'Удалить вместе с файлами',
|
||||
'delete-task-success': 'Успешно удалено задание "{{taskName}}"',
|
||||
'delete-task-fail': 'Ошибка во время удаления задания "{{taskName}}"',
|
||||
'remove-task-file-fail': 'Ошибка во время удаления файла(файлов) задания, пожалуйста удалите его(их) самостоятельно',
|
||||
'remove-task-config-file-fail': 'Ошибка при удалении файла конфигурации задания, пожалуйста удалите его самостоятельно',
|
||||
'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': 'Ошибка во время приостановления всех заданий',
|
||||
'pause-all-task-success': 'Успешно приостановлены все задания',
|
||||
'pause-all-task-fail': 'Ошибка во время остановки всех заданий',
|
||||
'resume-all-task': 'Возобновить все задания',
|
||||
'resume-all-task-success': 'Успешно возобновленны все задания',
|
||||
'resume-all-task-success': 'Успешно возобновлены все задания',
|
||||
'resume-all-task-fail': 'Ошибка во время возобновления всех заданий',
|
||||
'select-all-task': 'Выберите все задачи',
|
||||
'clear-recent-tasks': 'Очистить последние задания',
|
||||
@@ -72,7 +72,7 @@ export default {
|
||||
'remove-record-success': 'Успешно удалена запись про задание "{{taskName}}"',
|
||||
'remove-record-fail': 'Ошибка при удалении записи про задание "{{taskName}}"',
|
||||
'show-in-folder': 'Отобразить файлы заданий в папке',
|
||||
'file-not-exist': 'Розыскиваемый файл не существует или был удален',
|
||||
'file-not-exist': 'Запрошенный файл не существует или был удален',
|
||||
'file-path-error': 'Ошибка в пути к файлу',
|
||||
'opening-task-message': 'Открытие "{{taskName}}" ...',
|
||||
'get-task-name': 'Получить имя задания...',
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'engine-version': 'Phiên bản Ứng dụng',
|
||||
'license': 'Giấy phép',
|
||||
'about': 'Về Motrix',
|
||||
'release': 'Phát hành',
|
||||
'support': 'Hỗ trợ'
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
export default {
|
||||
'task-list': 'Danh sách Tác vụ',
|
||||
'add-task': 'Thêm tác vụ',
|
||||
'about': 'Về Motrix',
|
||||
'preferences': 'Cài đặt...',
|
||||
'check-for-updates': 'Kiểm tra Cập nhật...',
|
||||
'check-updates-now': 'Cập nhật ngay',
|
||||
'checking-for-updates': 'Đang kiểm tra Cập nhật...',
|
||||
'check-for-updates-title': 'Kiểm tra Cập nhật',
|
||||
'update-available-message': 'Bạn ơi, đang có một bản cập nhật mới từ Motrix, bạn có muốn cập nhật không?',
|
||||
'update-not-available-message': 'Không có bản cập nhật mới.',
|
||||
'update-downloaded-message': 'Đã sẵn sàng để cài đặt...',
|
||||
'update-error-message': 'Cập nhật lỗi',
|
||||
'engine-damaged-message': 'Ứng dụng bị lỗi, vui lòng cài đặt lại : (',
|
||||
'engine-missing-message': 'Ứng dụng bị thiếu tập tin, vui lòng cài đặt lại : (',
|
||||
'system-error-title': 'Lỗi ứng dụng',
|
||||
'system-error-message': 'Khởi động ứng dụng thất bại: {{message}}',
|
||||
'hide': 'Ẩn Motrix',
|
||||
'hide-others': 'Ẩn tất cả',
|
||||
'unhide': 'Hiển thị tất cả',
|
||||
'show': 'Hiển thị Motrix',
|
||||
'quit': 'Thoát Motrix',
|
||||
'under-development-message': 'Xin lỗi, tính năng này đang được phát triển...',
|
||||
'yes': 'Có',
|
||||
'no': 'Không',
|
||||
'cancel': 'Huỷ',
|
||||
'submit': 'Tải về',
|
||||
'gt1d': '> 1 ngày',
|
||||
'hour': ' giờ',
|
||||
'minute': ' phút',
|
||||
'second': ' giây'
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
export default {
|
||||
'undo': 'Undo',
|
||||
'redo': 'Redo',
|
||||
'cut': 'Cắt',
|
||||
'copy': 'Sao chép',
|
||||
'paste': 'Dán',
|
||||
'delete': 'Xóa',
|
||||
'select-all': 'Xóa tất cả'
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'official-website': 'Trang thông tin chính thức của Motrix',
|
||||
'manual': 'Hướng dẫn sử dụng',
|
||||
'release-notes': 'Ghi chú Phát hành...',
|
||||
'report-problem': 'Báo cáo Vấn đề',
|
||||
'toggle-dev-tools': 'Mở công cụ Dành cho Nhà phát triển'
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import about from './about'
|
||||
import app from './app'
|
||||
import edit from './edit'
|
||||
import help from './help'
|
||||
import menu from './menu'
|
||||
import preferences from './preferences'
|
||||
import subnav from './subnav'
|
||||
import task from './task'
|
||||
import window from './window'
|
||||
|
||||
export default {
|
||||
about,
|
||||
app,
|
||||
edit,
|
||||
help,
|
||||
menu,
|
||||
preferences,
|
||||
subnav,
|
||||
task,
|
||||
window
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
export default {
|
||||
'app': 'Motrix',
|
||||
'file': 'Tập tin',
|
||||
'task': 'Tác vụ',
|
||||
'edit': 'Chỉnh sửa',
|
||||
'window': 'Cửa sổ',
|
||||
'help': 'Trợ giúp'
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
export default {
|
||||
'basic': 'Cơ bản',
|
||||
'advanced': 'Nâng cao',
|
||||
'lab': 'Phòng thí nghiệm',
|
||||
'save': 'Lưu & Áp dụng',
|
||||
'save-success-message': 'Lưu cài đặt thành công',
|
||||
'save-fail-message': 'Lưu cài đặt thất bại',
|
||||
'discard': 'Loại bỏ',
|
||||
'startup': 'Khởi động',
|
||||
'open-at-login': 'Mở khi đăng nhập',
|
||||
'keep-window-state': 'Giữ kích thước và vị trí của cửa sổ khi thoát',
|
||||
'auto-resume-all': 'Tự động tiếp tục tất cả các tác vụ chưa hoàn thành',
|
||||
'default-dir': 'Đường dẫn mặc định',
|
||||
'mas-default-dir-tips': 'Do các hạn chế cấp phép sandbox của App Store, thư mục tải xuống mặc định được khuyến nghị đặt tại ~/Downloads',
|
||||
'transfer-settings': 'Tốc độ truyền',
|
||||
'transfer-speed-upload': 'Giới hạn Tải lên',
|
||||
'transfer-speed-download': 'Giới hạn Tải về',
|
||||
'transfer-speed-unlimited': 'Không giới hạn',
|
||||
'task-manage': 'Quản lý Tác vụ',
|
||||
'max-concurrent-downloads': 'Số tác vụ đang hoạt động tối đa',
|
||||
'max-connection-per-server': 'Số kết nối tối đa trên mỗi máy chủ',
|
||||
'new-task-show-downloading': 'Tự động hiển thị tải xuống sau khi thêm tác vụ',
|
||||
'no-confirm-before-delete-task': 'Không cần xác nhận trước khi xóa tác vụ',
|
||||
'continue': 'Tiếp tục',
|
||||
'task-completed-notify': 'Thông báo sau khi tải xuống hoàn tất',
|
||||
'auto-purge-record': 'Tự động lọc hồ sơ tải xuống khi thoát khỏi ứng dụng',
|
||||
'ui': 'UI',
|
||||
'appearance': 'Giao diện',
|
||||
'theme-auto': 'Tự động',
|
||||
'theme-light': 'Nền sáng',
|
||||
'theme-dark': 'Nền tối',
|
||||
'run-mode': 'Chạy như',
|
||||
'auto-hide-window': 'Tự động ẩn cửa sổ',
|
||||
'run-mode-standard': 'Ứng dụng Tiêu chuẩn',
|
||||
'run-mode-menu-bar': 'Ứng dụng trên thanh Menu',
|
||||
'language': 'Ngôn ngữ',
|
||||
'change-language': 'Thay đổi Ngôn ngữ',
|
||||
'hide-app-menu': 'Ẩn ứng dụng trên thanh Menu (Chỉ có trên Windows & Linux)',
|
||||
'proxy': 'Proxy',
|
||||
'use-proxy': 'Bật Proxy',
|
||||
'no-proxy-input-tips': 'Bỏ qua cài đặt proxy cho các Máy chủ và Miền này, mỗi thông tin trên một dòng',
|
||||
'proxy-tips': 'Xem Proxy thủ công',
|
||||
'bt-tracker': 'Máy chủ theo dõi',
|
||||
'bt-tracker-input-tips': 'Máy chủ theo dõi, mỗi thông tin trên một dòng',
|
||||
'bt-tracker-tips': 'Gợi ý: ',
|
||||
'sync-tracker-tips': 'Đồng bộ',
|
||||
'auto-sync-tracker': 'Cập nhật danh sách theo dõi tự động mỗi ngày',
|
||||
'port': 'Cổng giao tiếp cuối',
|
||||
'bt-port': 'Cổng giao tiếp BT cuối',
|
||||
'dht-port': 'Cổng giao tiếp DHT cuối',
|
||||
'security': 'Bảo mật',
|
||||
'rpc-secret': 'RPC bí mật',
|
||||
'rpc-secret-tips': 'Xem RPC bí mật thủ công',
|
||||
'developer': 'Lập trình viên',
|
||||
'mock-user-agent': 'Mock User-Agent',
|
||||
'app-log-path': 'Đường dẫn nhật ký ứng dụng',
|
||||
'download-session-path': 'Đường dẫn phiên tải về',
|
||||
'factory-reset': 'Khôi phục cài đặt gốc',
|
||||
'factory-reset-confirm': 'Bạn có chắc chắn muốn quay lại cài đặt gốc?',
|
||||
'lab-warning': '⚠️ Kích hoạt các tính năng trong phòng thí nghiệm có thể dẫn đến sự cố ứng dụng hoặc mất dữ liệu, bạn hãy cân nhắc cho quyết định của mình!',
|
||||
'download-protocol': 'Các giao thức',
|
||||
'protocols-default-client': 'Đặt làm máy khách mặc định cho các giao thức sau',
|
||||
'protocols-magnet': 'Magnet [ magnet:// ]',
|
||||
'protocols-thunder': 'Thunder [ thunder:// ]',
|
||||
'browser-extensions': 'Tiện ích mở rộng',
|
||||
'baidu-exporter': 'BaiduExporter',
|
||||
'browser-extensions-tips': 'Được cung cấp bởi Cộng đồng, ',
|
||||
'baidu-exporter-help': 'Nhấn vào đây để sử dụng',
|
||||
'auto-update': 'Tự động cập nhật',
|
||||
'auto-check-update': 'Tự động kiểm tra cập nhật',
|
||||
'last-check-update-time': 'Kiểm tra cập nhật lần cuối'
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
export default {
|
||||
'task-list': 'Tác vụ',
|
||||
'preferences': 'Cài đặt'
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
export default {
|
||||
'active': 'Đang tải về',
|
||||
'waiting': 'Đang đợi',
|
||||
'stopped': 'Ngừng',
|
||||
'new-task': 'Tác vụ mới',
|
||||
'new-bt-task': 'Tác vụ BT mới',
|
||||
'open-file': 'Mở tập tin Torrent...',
|
||||
'uri-task': 'URL',
|
||||
'torrent-task': 'Torrent',
|
||||
'uri-task-tips': 'Mỗi URL Tác vụ nên nằm ở một dòng (hỗ trợ magnet)',
|
||||
'thunder-link-tips': 'Mẹo: Liên kết Thunder có thể không tải được sau khi giải mã',
|
||||
'new-task-uris-required': 'Vui lòng nhập ít nhất một url tài nguyên hợp lệ',
|
||||
'new-task-torrent-required': 'Vui lòng chọn tập tin Torrent',
|
||||
'file-name': 'Tên tập tin',
|
||||
'file-extension': 'Loại tập tin',
|
||||
'file-size': 'Kích thước tập tin',
|
||||
'selected-files-sum': 'Đã lựa chọn: {{selectedFilesCount}} tập tin, tổng kích thước {{selectedFilesTotalSize}}',
|
||||
'task-name': 'Tên Tác vụ',
|
||||
'task-out': 'Đổi tên',
|
||||
'task-out-tips': 'Không bắt buộc',
|
||||
'task-split': 'Chia nhỏ',
|
||||
'task-dir': 'Lưu đến',
|
||||
'pause-task': 'Tạm dừng Tác vụ',
|
||||
'task-ua': 'UA',
|
||||
'task-user-agent': 'User-Agent',
|
||||
'task-referer': 'Referer',
|
||||
'task-cookie': 'Cookie',
|
||||
'task-proxy': 'Proxy',
|
||||
'navigate-to-downloading': 'Điều hướng tải xuống',
|
||||
'show-advanced-options': 'Lựa chọn Nâng cao',
|
||||
'copyright-warning': 'Cảnh báo Bản quyền',
|
||||
'copyright-warning-message': 'Tập tin bạn muốn tải xuống có thể là âm thanh hoặc video có bản quyền, vui lòng đảm bảo rằng bạn có quyền truy cập vào nó.',
|
||||
'copyright-yes': 'Đúng, Tôi được cấp phép',
|
||||
'copyright-no': 'Không, tôi không được cấp phép',
|
||||
'copyright-error-message': 'Không thể thêm Tác vụ vì vấn đề bản quyền',
|
||||
'pause-task-success': 'Dừng Tác vụ thành công "{{taskName}}"',
|
||||
'pause-task-fail': 'Dừng Tác vụ thất bại "{{taskName}}"',
|
||||
'resume-task': 'Tiếp tục Tác vụ',
|
||||
'resume-task-success': 'Tác vụ được tải lại thành công "{{taskName}}"',
|
||||
'resume-task-fail': 'Tác vụ không thể tải lại "{{taskName}}"',
|
||||
'delete-task': 'Xóa Tác vụ',
|
||||
'delete-selected-tasks': 'Xóa những Tác vụ được chọn',
|
||||
'delete-task-confirm': 'Bạn có chắc chắn muốn xóa Tác vụ tải xuống "{{taskName}}"?',
|
||||
'batch-delete-task-confirm': 'Bạn có chắc chắn muốn xóa {{Count}} Tác vụ tải xuống hàng loạt không?',
|
||||
'delete-task-label': 'Xóa kèm tập tin',
|
||||
'delete-task-success': 'Xóa Tác vụ thành công "{{taskName}}"',
|
||||
'delete-task-fail': 'Xóa Tác vụ thất bại "{{taskName}}"',
|
||||
'remove-task-file-fail': 'Không thể xóa (các) tập tin trong Tác vụ, vui lòng xóa chúng theo cách thủ công',
|
||||
'remove-task-config-file-fail': 'Không thể xóa tập tin cấu hình Tác vụ, vui lòng xóa chúng thủ công',
|
||||
'move-task-up': 'Di chuyển Tác vụ lên',
|
||||
'move-task-down': 'Di chuyển Tác vụ xuống',
|
||||
'pause-all-task': 'Dừng Tất cả Tác vụ',
|
||||
'pause-all-task-success': 'Dừng Tất cả Tác vụ Thành công',
|
||||
'pause-all-task-fail': 'Dừng Tất cả Tác vụ Thất bại',
|
||||
'resume-all-task': 'Tải lại Tất cả Tác vụ',
|
||||
'resume-all-task-success': 'Tải lại Tất cả Tác vụ Thành công',
|
||||
'resume-all-task-fail': 'Tải lại Tất cả Tác vụ Thất bại',
|
||||
'select-all-task': 'Chọn Tất cả Tác vụ',
|
||||
'clear-recent-tasks': 'Xóa các Tác vụ gần đây',
|
||||
'purge-record': 'Làm mới Bản ghi Tác vụ',
|
||||
'purge-record-success': 'Làm mới Bản ghi Tác vụ Thành công',
|
||||
'purge-record-fail': 'Làm mới Bản ghi Tác vụ Thất bại',
|
||||
'batch-delete-task-success': 'Xóa các Tác vụ Hàng loạt Thành công',
|
||||
'batch-delete-task-fail': 'Xóa các Tác vụ Hàng loạt Thất bại',
|
||||
'refresh-list': 'Làm mới Danh sách Tác vụ',
|
||||
'no-task': 'Hiện tại không có Tác vụ',
|
||||
'copy-link': 'Sao chép Đường dẫn',
|
||||
'copy-link-success': 'Sao chép Đường dẫn Thành công',
|
||||
'remove-record': 'Xóa Bản ghi Tác vụ',
|
||||
'remove-record-confirm': 'Bạn có chắc chắn muốn xóa bản ghi tải xuống cho "{{taskName}}" không?',
|
||||
'remove-record-label': 'Xóa kèm Tập tin',
|
||||
'remove-record-success': 'Xoá thành công bản ghi tác vụ cho "{{taskName}}"',
|
||||
'remove-record-fail': 'Xoá thất bại bản ghi tác vụ cho "{{taskName}}"',
|
||||
'show-in-folder': 'Hiển thị Tác vụ trong Thư mục',
|
||||
'file-not-exist': 'Tập tin mục tiêu không tồn tại hoặc đã bị xóa',
|
||||
'file-path-error': 'Lỗi đường dẫn tệp',
|
||||
'opening-task-message': 'Đang mở "{{taskName}}" ...',
|
||||
'get-task-name': 'Lấy tên Tác vụ....',
|
||||
'remaining-prefix': 'Còn lại',
|
||||
'select-torrent': 'Kéo thả tập tin torrent vào đây hoặc nhấp để chọn',
|
||||
'task-info-dialog-title': '{{title}} Chi tiết',
|
||||
'download-start-message': 'Bắt đầu tải xuống {{taskName}}',
|
||||
'download-pause-message': 'Tạm dừng tải xuống {{taskName}}',
|
||||
'download-stop-message': 'Đã dừng tải xuống {{taskName}}',
|
||||
'download-error-message': 'Xảy ra lỗi khi tải xuống {{taskName}}',
|
||||
'download-complete-message': 'Đã hoàn tất tải xuống {{taskName}}',
|
||||
'download-complete-notify': 'Tải xuống hoàn tất',
|
||||
'bt-download-complete-message': 'Đã hoàn tất tải xuống {{taskName}}, đang seed',
|
||||
'bt-download-complete-notify': 'BT đã hoàn tất tải xuống, đang seed...',
|
||||
'bt-download-complete-tips': 'Mẹo: Bạn có thể dừng một tác vụ để kết thúc việc seed',
|
||||
'download-fail-message': 'Không thể tải xuống {{taskName}}',
|
||||
'download-fail-notify': 'Tải xuống thất bại'
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
export default {
|
||||
'reload': 'Tải lại',
|
||||
'close': 'Đóng',
|
||||
'minimize': 'Thu nhỏ',
|
||||
'zoom': 'Zoom',
|
||||
'toggle-fullscreen': 'Mở toàn màn hình',
|
||||
'front': 'Đưa tất cả lên phía trước'
|
||||
}
|
||||
Reference in New Issue
Block a user