Compare commits

...

51 Commits

Author SHA1 Message Date
Dr_rOot 14223c2204 chore: bump version 2020-06-05 23:26:11 +08:00
Dr_rOot 2cfb6b1914 Merge pull request #689 from agalwood/hotfix/handle_url_202006051331
fix: open app with url handle fail
2020-06-05 14:04:27 +08:00
Dr_rOot c38cf80589 chore: update deps 2020-06-05 13:40:30 +08:00
Dr_rOot 3ee98eae1d fix: open app with resource url 2020-06-05 13:33:22 +08:00
Dr_rOot d2cff6356a Merge pull request #686 from NickoAilus/master
fix: edited Russian locale
2020-06-01 22:12:46 +08:00
NickoAilus 3ee432d683 Fixed Russian locale 2020-06-01 16:10:36 +03:00
Dmitry Kalinin 7f1822bb7e feat: Added bulgarian (bg) translations (#685)
* Added bulgarian (bg) translations

* Improve structure

* Fixed bugs

* Deleted comma
2020-06-01 17:33:46 +08:00
Dr_rOot 0223e691ff docs: readme i18n add vi 2020-05-31 22:57:56 +08:00
Duy–Thanh Doan 117dba9f37 feat: Add vietnamese translation (#680)
* Add vietnamese translation

* Update app.js and index.js

* Translated about.js

* Translated app.js

* first draft

* final draft

* final update - ready to review

* Update format
2020-05-31 22:52:26 +08:00
Dr_rOot 66f114bf72 Merge pull request #674 from agalwood/hotfix/upnp_cb_202005271904
fix: nat-api autoUpdate cb is not a function
2020-05-28 15:28:28 +08:00
Dr_rOot 44f00483f9 chore: update deps 2020-05-28 14:42:43 +08:00
Dr_rOot 1866e3fd4f fix: nat-api autoUpdate cb is not a function
replace nat-api to @motrix/nat-api

@motrix/nat-api forked from https://github.com/alxhotel/nat-api
2020-05-28 14:42:05 +08:00
Dr_rOot cfac883cbf chore: remove deprecated vue-html-loader 2020-05-28 12:11:30 +08:00
Dr_rOot 1431bab366 Merge pull request #670 from agalwood/hotfix/full_screen_preference_202005271103
fix: full screen save preference issue #663
2020-05-27 11:20:23 +08:00
Dr_rOot bb373947ff fix: full screen save preference issue #663 2020-05-27 11:06:51 +08:00
Dr_rOot 8f0dc65341 refactor: rename auto hide window 2020-05-27 11:06:31 +08:00
Dr_rOot 402185e1a2 chore: bump version 2020-05-25 22:35:09 +08:00
Dr_rOot d59b5c9841 Merge pull request #667 from agalwood/hotfix/refactor_202005231656
fix: upnp client & full screen issues
2020-05-25 22:15:36 +08:00
Dr_rOot eb442e4a7a fix: windows auto launch config lose 2020-05-25 21:55:23 +08:00
Dr_rOot e82e567069 refactor: time constants 2020-05-24 20:15:20 +08:00
Dr_rOot dc2876098d fix: upnp client is destroyed #662 2020-05-24 20:13:43 +08:00
Dr_rOot 6287942fbc fix: full screen mode no traffic light #663 2020-05-24 17:04:08 +08:00
Dr_rOot 389dc080b6 refactor: improve macOS fullscreen mode usability 2020-05-24 15:30:50 +08:00
Dr_rOot 45a23d73e6 fix: code error 2020-05-23 17:16:16 +08:00
Dr_rOot 8303dd305b refactor: fn rename & format 2020-05-23 17:03:45 +08:00
Dr_rOot a98292ce1e refactor: remove title bar buttons spacer 2020-05-23 16:57:01 +08:00
Dr_rOot 8df97b8433 fix: switching system theme will not auto switch app theme 2020-05-22 11:21:45 +08:00
Dr_rOot f29e95c9bc chore: add electron apps banner 2020-05-21 16:32:10 +08:00
Dr_rOot 52e045c886 docs: update readme for github markdown 2020-05-21 08:56:28 +08:00
Dr_rOot 4632c3619a docs: update readme 2020-05-21 08:54:01 +08:00
Dr_rOot 54c48be29b chore: bump version 2020-05-21 07:51:47 +08:00
Dr_rOot 301f1403df Merge pull request #658 from aarestu/translation/indonesia
feat: add Indonesian translations
2020-05-21 07:17:12 +08:00
Dr_rOot 88de047778 Merge pull request #659 from agalwood/hotfix/webpack_copy_202005210655
fix: webpack copy plugin path
2020-05-21 07:07:29 +08:00
Dr_rOot c119de78ce fix: webpack copy plugin path 2020-05-21 06:56:04 +08:00
Restu Suhendar 9d381e16da add translation Indonesia 2020-05-21 04:24:07 +07:00
Dr_rOot e4c6d6a9c0 Merge pull request #655 from agalwood/hotfix/linux_tray_202005202115
fix: linux tray context menu
2020-05-20 21:33:13 +08:00
Dr_rOot 5bb727cb6f chore: update deps 2020-05-20 21:16:35 +08:00
Dr_rOot 00f3209c68 refactor: improve logs 2020-05-20 21:16:11 +08:00
Dr_rOot 3f8b0e6f5f fix: tray popUpContextMenu linux not support 2020-05-20 21:16:01 +08:00
Dr_rOot 0543bc4e2c chore: bump version 2020-05-20 16:32:55 +08:00
Dr_rOot 9ded42f127 chore: update docs 2020-05-20 13:53:20 +08:00
Dr_rOot 834a1ad839 docs: update readme linux section 2020-05-20 11:30:50 +08:00
Dr_rOot 8f830f6a0d fix: too fast to toggle tracker syncing spinner 2020-05-20 11:10:59 +08:00
Dr_rOot ee111c92ee fix: too fast to shut down the engine 2020-05-20 11:09:50 +08:00
Dr_rOot 74c3a3c696 Merge pull request #650 from agalwood/hotfix/linux_tray_20200519
fix: linux tray not support right-click event
2020-05-19 22:06:45 +08:00
Dr_rOot 4d964ae16e fix: tray destroy remove listener 2020-05-19 21:50:36 +08:00
Dr_rOot be2c2e8383 docs: update readme snapcraft markdown 2020-05-19 12:23:31 +08:00
Dr_rOot 4e6164816f fix: linux tray not support right click 2020-05-19 12:23:00 +08:00
Dr_rOot fa7daf377f docs: update app screenshots 2020-05-18 14:24:06 +08:00
Dr_rOot afbe364525 docs: fix release badge 2020-05-18 13:43:36 +08:00
Dr_rOot ece5cea512 docs: update readme 2020-05-18 13:37:36 +08:00
66 changed files with 6345 additions and 2990 deletions
+5 -9
View File
@@ -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"'
}),
+6 -6
View File
@@ -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
View File
@@ -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) | 简体中文
## 一款全能的下载工具
[![GitHub release](https://img.shields.io/github/release/agalwood/Motrix.svg)](https://github.com/agalwood/Motrix/releases) ![Build/release](https://github.com/agalwood/Motrix/workflows/Build/release/badge.svg) [![Build Status](https://travis-ci.com/agalwood/Motrix.svg?branch=master)](https://travis-ci.com/agalwood/Motrix) [![Build status](https://ci.appveyor.com/api/projects/status/l11d5h05xwwcvoux/branch/master?svg=true)](https://ci.appveyor.com/project/agalwood/motrix/branch/master) [![Total Downloads](https://img.shields.io/github/downloads/agalwood/Motrix/total.svg)](https://github.com/agalwood/Motrix/releases) ![Support Platforms](https://camo.githubusercontent.com/a50c47295f350646d08f2e1ccd797ceca3840e52/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6d61634f5325323025374325323057696e646f77732532302537432532304c696e75782d6c69676874677265792e737667)
[![GitHub release](https://img.shields.io/github/v/release/agalwood/Motrix.svg)](https://github.com/agalwood/Motrix/releases) ![Build/release](https://github.com/agalwood/Motrix/workflows/Build/release/badge.svg) ![Total Downloads](https://img.shields.io/github/downloads/agalwood/Motrix/total.svg) ![Support Platforms](https://camo.githubusercontent.com/a50c47295f350646d08f2e1ccd797ceca3840e52/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6d61634f5325323025374325323057696e646f77732532302537432532304c696e75782d6c69676874677265792e737667)
[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` 运行,因为可能
- 🌑 深色模式
- 🗑 移除任务时可同时删除相关文件
- 🌍 国际化,[查看已可选的语言](#-国际化)
- 🎏 ...
- 🛠 更多特性开发中
## 🖥 应用界面
![motrix-screenshot-task-cn.png](https://cdn.nlark.com/yuque/0/2019/png/129147/1550151234585-e513bd4f-e127-402f-accb-1ebbba9b3c41.png)
![motrix-screenshot-task-cn.png](https://cdn.nlark.com/yuque/0/2020/png/129147/1589782239990-fecb9065-19ac-4c35-938b-0be45621ca3a.png)
## ⌨️ 本地开发
@@ -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) |
+36 -8
View File
@@ -6,7 +6,7 @@
## A full-featured download manager
[![GitHub release](https://img.shields.io/github/release/agalwood/Motrix.svg)](https://github.com/agalwood/Motrix/releases) ![Build/release](https://github.com/agalwood/Motrix/workflows/Build/release/badge.svg) [![Build Status](https://travis-ci.com/agalwood/Motrix.svg?branch=master)](https://travis-ci.com/agalwood/Motrix) [![Build status](https://ci.appveyor.com/api/projects/status/l11d5h05xwwcvoux/branch/master?svg=true)](https://ci.appveyor.com/project/agalwood/motrix/branch/master) [![Total Downloads](https://img.shields.io/github/downloads/agalwood/Motrix/total.svg)](https://github.com/agalwood/Motrix/releases) ![Support Platforms](https://camo.githubusercontent.com/a50c47295f350646d08f2e1ccd797ceca3840e52/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6d61634f5325323025374325323057696e646f77732532302537432532304c696e75782d6c69676874677265792e737667)
[![GitHub release](https://img.shields.io/github/v/release/agalwood/Motrix.svg)](https://github.com/agalwood/Motrix/releases) ![Build/release](https://github.com/agalwood/Motrix/workflows/Build/release/badge.svg) ![Total Downloads](https://img.shields.io/github/downloads/agalwood/Motrix/total.svg) ![Support Platforms](https://camo.githubusercontent.com/a50c47295f350646d08f2e1ccd797ceca3840e52/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6d61634f5325323025374325323057696e646f77732532302537432532304c696e75782d6c69676874677265792e737667)
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
![motrix-screenshot-task-en.png](https://cdn.nlark.com/yuque/0/2019/png/129147/1550151166169-94b4bfb0-746e-42b8-aad7-0b6890f89abb.png)
![motrix-screenshot-task-en.png](https://cdn.nlark.com/yuque/0/2020/png/129147/1589782238501-e7b39166-da58-4152-ae34-65a061cafa48.png)
## ⌨️ 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) |
+5146 -2779
View File
File diff suppressed because it is too large Load Diff
+20 -21
View File
@@ -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
View File
@@ -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)
+6 -7
View File
@@ -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)
})
}
+4 -3
View File
@@ -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)
}
+5 -2
View File
@@ -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
}
+39 -43
View File
@@ -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)
}
}
}
+8
View File
@@ -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()
} : () => {}
+1 -1
View File
@@ -47,7 +47,7 @@ export default class MenuManager extends EventEmitter {
this.items = flattenMenuItems(menu)
}
rebuild () {
handleLocaleChange (locale) {
this.setup()
}
+15 -10
View File
@@ -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
+28 -7
View File
@@ -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()
}
}
+25 -7
View File
@@ -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
View File
@@ -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
+1
View File
@@ -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) {
+3 -1
View File
@@ -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
})
},
+8 -4
View File
@@ -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',
+2 -2
View File
@@ -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()
+5 -5
View File
@@ -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
View File
@@ -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'
]
}
+7 -7
View File
@@ -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"
}
+24
View File
@@ -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 */
+18
View File
@@ -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 */
+7
View File
@@ -0,0 +1,7 @@
export default {
'engine-version': 'Версия',
'license': 'Лиценз',
'about': 'Информация',
'release': 'Съобщение',
'support': 'Подкрепа'
}
+32
View File
@@ -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': 'с'
}
+9
View File
@@ -0,0 +1,9 @@
export default {
'undo': 'Отказ',
'redo': 'Повторя',
'cut': 'Нарежа',
'copy': 'Копирам',
'paste': 'Поставя',
'delete': 'Премахна',
'select-all': 'Изберете всички'
}
+7
View File
@@ -0,0 +1,7 @@
export default {
'official-website': 'Сайт Motrix',
'manual': 'Инструкция',
'release-notes': 'Маркировки...',
'report-problem': 'Докладвайте за проблем',
'toggle-dev-tools': 'Превключване на инструменти за разработчици'
}
+21
View File
@@ -0,0 +1,21 @@
import about from './about'
import app from './app'
import edit from './edit'
import help from './help'
import menu from './menu'
import preferences from './preferences'
import subnav from './subnav'
import task from './task'
import window from './window'
export default {
about,
app,
edit,
help,
menu,
preferences,
subnav,
task,
window
}
+8
View File
@@ -0,0 +1,8 @@
export default {
'app': 'Motrix',
'file': 'Файл',
'task': 'Задача',
'edit': 'Редктиране',
'window': 'Прозорец',
'help': 'Грижа'
}
+72
View File
@@ -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': 'последната актуализация е проверена'
}
+4
View File
@@ -0,0 +1,4 @@
export default {
'task-list':'Задачи',
'preferences':'Настройки'
}
+93
View File
@@ -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': 'грешка при зареждане'
}
+8
View File
@@ -0,0 +1,8 @@
export default {
'reload': 'Перезагрузить',
'close': 'Закрыть',
'minimize': 'Свернуть',
'zoom': 'Увеличение',
'toggle-fullscreen': 'Перейти в полноэкранный режим',
'front': 'Поверх всех окон'
}
+7
View File
@@ -0,0 +1,7 @@
export default {
'engine-version': 'Versi Mesin',
'license': 'Lisensi',
'about': 'Tentang',
'release': 'Rilis',
'support': 'Bantuan'
}
+32
View File
@@ -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'
}
+9
View File
@@ -0,0 +1,9 @@
export default {
'undo': 'Urungkan',
'redo': 'Ulangi',
'cut': 'Potong',
'copy': 'Salin',
'paste': 'Tempel',
'delete': 'Hapus',
'select-all': 'Pilih Semua'
}
+7
View File
@@ -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'
}
+21
View File
@@ -0,0 +1,21 @@
import about from './about'
import app from './app'
import edit from './edit'
import help from './help'
import menu from './menu'
import preferences from './preferences'
import subnav from './subnav'
import task from './task'
import window from './window'
export default {
about,
app,
edit,
help,
menu,
preferences,
subnav,
task,
window
}
+8
View File
@@ -0,0 +1,8 @@
export default {
'app': 'Motrix',
'file': 'Berlas',
'task': 'Tugas',
'edit': 'Edit',
'window': 'Window',
'help': 'Bantuan'
}
+72
View File
@@ -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'
}
+4
View File
@@ -0,0 +1,4 @@
export default {
'task-list': 'Daftar Tugas',
'preferences': 'Pengaturan'
}
+93
View File
@@ -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'
}
+8
View File
@@ -0,0 +1,8 @@
export default {
'reload': 'Muat Ulang',
'close': 'Keluar',
'minimize': 'Perkecil',
'zoom': 'Zoom',
'toggle-fullscreen': 'Layar penuh',
'front': 'Bawa Semua ke Depan'
}
+12
View File
@@ -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: '简体中文'
+2 -2
View File
@@ -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',
+1 -1
View File
@@ -2,7 +2,7 @@ export default {
'app': 'Motrix',
'file': 'Файл',
'task': 'Задания',
'edit': 'Редктировать',
'edit': 'Редактировать',
'window': 'Окно',
'help': 'Помощь'
}
+10 -10
View File
@@ -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': 'Последняя проверка на обновления прошла в'
}
+16 -16
View File
@@ -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': 'Получить имя задания...',
+7
View File
@@ -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ợ'
}
+32
View File
@@ -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'
}
+9
View File
@@ -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ả'
}
+7
View File
@@ -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'
}
+21
View File
@@ -0,0 +1,21 @@
import about from './about'
import app from './app'
import edit from './edit'
import help from './help'
import menu from './menu'
import preferences from './preferences'
import subnav from './subnav'
import task from './task'
import window from './window'
export default {
about,
app,
edit,
help,
menu,
preferences,
subnav,
task,
window
}
+8
View File
@@ -0,0 +1,8 @@
export default {
'app': 'Motrix',
'file': 'Tập tin',
'task': 'Tác vụ',
'edit': 'Chỉnh sửa',
'window': 'Cửa sổ',
'help': 'Trợ giúp'
}
+72
View File
@@ -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'
}
+4
View File
@@ -0,0 +1,4 @@
export default {
'task-list': 'Tác vụ',
'preferences': 'Cài đặt'
}
+93
View File
@@ -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'
}
+8
View File
@@ -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'
}