├── .dockerignore
├── .gitignore
├── .prettierignore
├── .prettierrc
├── CONTRIBUTING.md
├── Dockerfile
├── Dockerfile.arm32v7
├── LICENSE
├── README.md
├── app.json
├── directurl.md
├── docker-compose.yml
├── docs
├── app.css
├── app.js
├── flags
│ ├── br.svg
│ ├── cn.svg
│ ├── cz.svg
│ ├── de.svg
│ ├── es.svg
│ ├── fr.svg
│ ├── id.svg
│ ├── ir.svg
│ ├── it.svg
│ ├── nl.svg
│ ├── pl.svg
│ ├── ru.svg
│ ├── th.svg
│ ├── tr.svg
│ ├── tw.svg
│ └── us.svg
├── index.html
├── precache-manifest.b562a874cfed1a8c74df9b49e6f1c2cc.js
├── service-worker.js
└── vendor.js
├── favicon.ico
├── node-server.js
├── package-lock.json
├── package.json
├── postcss.config.js
├── screenshots
└── overview.png
├── src
├── index-template.html
├── js
│ ├── app.js
│ ├── ctrls
│ │ ├── alert.js
│ │ ├── main.js
│ │ ├── modal.js
│ │ ├── nav.js
│ │ └── props.js
│ ├── directives
│ │ ├── chunkbar.js
│ │ ├── dgraph.js
│ │ ├── fileselect.js
│ │ ├── fselect.js
│ │ └── textarea.js
│ ├── filters
│ │ ├── bytes.js
│ │ └── url.js
│ ├── libs
│ │ ├── angularui-bootstrap-tpls.min.js
│ │ ├── bootstrap-filestyle.js
│ │ ├── jquery.flot.min.js
│ │ ├── jquery.flot.resize.min.js
│ │ └── jquery.flot.time.min.js
│ ├── services
│ │ ├── alerts.js
│ │ ├── base64.js
│ │ ├── configuration.js
│ │ ├── deps.js
│ │ ├── errors.js
│ │ ├── modals.js
│ │ ├── rpc
│ │ │ ├── helpers.js
│ │ │ ├── jsoncall.js
│ │ │ ├── rpc.js
│ │ │ ├── sockcall.js
│ │ │ └── syscall.js
│ │ ├── settings
│ │ │ ├── filters.js
│ │ │ └── settings.js
│ │ └── utils.js
│ └── translate
│ │ ├── cs_CZ.js
│ │ ├── de_DE.js
│ │ ├── en_US.js
│ │ ├── es_ES.js
│ │ ├── fa_IR.js
│ │ ├── fr_FR.js
│ │ ├── id_ID.js
│ │ ├── it_IT.js
│ │ ├── nl_NL.js
│ │ ├── pl_PL.js
│ │ ├── pt_BR.js
│ │ ├── ru_RU.js
│ │ ├── template.js
│ │ ├── th_TH.js
│ │ ├── tr_TR.js
│ │ ├── zh_CN.js
│ │ └── zh_TW.js
└── scss
│ ├── _bootstrap-custom.scss
│ ├── _download.scss
│ ├── _flag-icon-css-custom.scss
│ ├── _icon.scss
│ ├── _modals.scss
│ ├── _style.scss
│ └── app.scss
├── static.json
├── webpack.config.js
└── webui-aria2.spec
/.dockerignore:
--------------------------------------------------------------------------------
1 | .git
2 | screenshots
3 | src
4 | .gitignore
5 | .prettierignore
6 | .prettierrc
7 | CONTRIBUTING.md
8 | LICENSE
9 | README.md
10 | app.json
11 | directurl.md
12 | docker-compose.yml
13 | favicon.ico
14 | node-server.js
15 | package-lock.json
16 | package.json
17 | postcss.config.js
18 | static.json
19 | webpack.config.js
20 | webui-aria2.spec
21 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_STORE
2 | .idea
3 | .git
4 | debug.log
5 | stats.json
6 | node_modules
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | build/*
2 | **/*.min.js
3 | **/*.min.css
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 100
3 | }
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | ## Contributor's Guide
2 |
3 | First off, thanks for taking the time to contribute! :tada::+1:
4 |
5 | WebUI-Aria2 is an Angular JS 1.x application bundled with webpack. Follow the [Get Started Guide](#get-started) to setup the development environment. You'll need `Node > 6` and latest version of `npm` to build the source files.
6 |
7 | ## Get Started
8 |
9 | To start developing an awesome feature or to fix a bug [fork and clone the repo](https://help.github.com/articles/fork-a-repo/) and then install Node.js > 6 and npm.
10 |
11 | Next, install this package's dependencies with npm using `npm install` command.
12 |
13 | Then run `npm run dev` command to start an HTTP development server on http://localhost:8888 and to watch and compile the source files.
14 |
15 | Use `npm run build` to create a production ready build from source files.
16 |
17 | ### Useful commands
18 |
19 | | Command | Purpose |
20 | | ------------------------- | --------------------------------------------------------------------------------------------------------- |
21 | | `npm install` | will install required dependencies |
22 | | `npm run dev` | will start an HTTP dev server on http://localhost:8888 and will watch and compile the source files |
23 | | `npm run build` | will create a production build from source files |
24 | | `npm run analyze` | will open a bundle analyzer on port http://localhost:9999. Useful for visualizing contents of your bundle |
25 | | `npm run format --silent` | will format your code for consistency using Prettier |
26 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM debian:8
2 |
3 | # less priviledge user, the id should map the user the downloaded files belongs to
4 | RUN groupadd -r dummy && useradd -r -g dummy dummy -u 1000
5 |
6 | # webui + aria2
7 | RUN apt-get update \
8 | && apt-get install -y aria2 busybox curl \
9 | && rm -rf /var/lib/apt/lists/*
10 |
11 | ADD ./docs /webui-aria2
12 |
13 | # gosu install latest
14 | RUN GITHUB_REPO="https://github.com/tianon/gosu" \
15 | && LATEST=`curl -s $GITHUB_REPO"/releases/latest" | grep -Eo "[0-9].[0-9]*"` \
16 | && curl -L $GITHUB_REPO"/releases/download/"$LATEST"/gosu-amd64" > /usr/local/bin/gosu \
17 | && chmod +x /usr/local/bin/gosu
18 |
19 | # goreman supervisor install latest
20 | RUN GITHUB_REPO="https://github.com/mattn/goreman" \
21 | && LATEST=`curl -s $GITHUB_REPO"/releases/latest" | grep -Eo "v[0-9]*.[0-9]*.[0-9]*"` \
22 | && curl -L $GITHUB_REPO"/releases/download/"$LATEST"/goreman_"$LATEST"_linux_amd64.tar.gz" > goreman.tar.gz \
23 | && tar xvf goreman.tar.gz && mv /goreman*/goreman /usr/local/bin/goreman && rm -R goreman*
24 |
25 | # goreman setup
26 | RUN echo "web: gosu dummy /bin/busybox httpd -f -p 8080 -h /webui-aria2\nbackend: gosu dummy /usr/bin/aria2c --enable-rpc --rpc-listen-all --dir=/data" > Procfile
27 |
28 | # aria2 downloads directory
29 | VOLUME /data
30 |
31 | # aria2 RPC port, map as-is or reconfigure webui
32 | EXPOSE 6800/tcp
33 |
34 | # webui static content web server, map wherever is convenient
35 | EXPOSE 8080/tcp
36 |
37 | CMD ["start"]
38 | ENTRYPOINT ["/usr/local/bin/goreman"]
39 |
--------------------------------------------------------------------------------
/Dockerfile.arm32v7:
--------------------------------------------------------------------------------
1 | # As of 2018-06-29 https://github.com/aria2/aria2/blob/master/Dockerfile.raspberrypi, aria2 is build upon ubuntu trusty (which is debian 8). So pick a debian 8 as well
2 | FROM arm32v7/debian:8.11 AS aria2-builder
3 |
4 | # aria2 build
5 | RUN mkdir -p /builds && mkdir -p /builds/aria2c \
6 | && apt-get update \
7 | && export DEBIAN_FRONTEND=noninteractive \
8 | && apt-get install -y curl git \
9 | make g++ libssl-dev nettle-dev libgmp-dev libssh2-1-dev libc-ares-dev libxml2-dev zlib1g-dev libsqlite3-dev pkg-config libxml2-dev libcppunit-dev autoconf automake autotools-dev autopoint libtool openssl \
10 | && ARIA2_VERSION="1.34.0" \
11 | && mkdir aria_build && cd aria_build \
12 | && curl -L https://github.com/aria2/aria2/releases/download/release-"$ARIA2_VERSION"/aria2-"$ARIA2_VERSION".tar.gz > aria2.tar.gz \
13 | && tar -xzf aria2.tar.gz \
14 | && cd aria2-$ARIA2_VERSION \
15 | && autoreconf -i \
16 | && ./configure --with-ca-bundle='/etc/ssl/certs/ca-certificates.crt' \
17 | && make \
18 | && mv src/aria2c /builds/aria2c \
19 | && cd ../.. \
20 | && rm -rf aria_build \
21 | && rm -rf /var/lib/apt/lists/*
22 |
23 |
24 |
25 | FROM arm32v7/golang:1.10.0-stretch AS go-builder
26 |
27 | # goreman build
28 | RUN mkdir -p /builds && mkdir -p /builds/goreman \
29 | && export GOPATH=`pwd` \
30 | && go get github.com/mattn/goreman \
31 | && go build -o /builds/goreman/goreman github.com/mattn/goreman
32 |
33 | RUN mkdir -p /builds && mkdir -p /builds/gosu \
34 | && apt-get update && apt-get install -y curl \
35 | && GITHUB_REPO="https://github.com/tianon/gosu" \
36 | && LATEST=`curl -s $GITHUB_REPO"/releases/latest" | grep -Eo "[0-9].[0-9]*"` \
37 | && curl -L $GITHUB_REPO"/releases/download/"$LATEST"/gosu-armhf" > /builds/gosu/gosu \
38 | && chmod +x /builds/gosu/gosu \
39 | && unset GITHUB_REPO && unset LATEST \
40 | && rm -rf /var/lib/apt/lists/*
41 |
42 |
43 |
44 | FROM arm32v7/httpd:2.4.33
45 | # BE CAREFULL the arm32v7/httpd image MUST match the version of debian used to build aria2. otherwise shared library versions might not be the same.
46 | # A better approach will be to build static version of aria2.
47 |
48 | # download aria2 dependendies
49 | RUN apt-get update && apt-get install -y --no-install-recommends \
50 | busybox \
51 | ca-certificates \
52 | libc-ares2 \
53 | libssh2-1 \
54 | libxml2 \
55 | openssl \
56 | libsqlite3-0 \
57 | zlib1g \
58 | && rm -rf /var/lib/apt/lists/*
59 |
60 | # Grab aria2c, goreman and gosu binaries
61 | COPY --from=aria2-builder /builds/aria2c/aria2c /usr/bin/
62 | COPY --from=go-builder /builds/goreman/goreman /usr/local/bin/
63 | COPY --from=go-builder /builds/gosu/gosu /usr/local/bin/
64 |
65 | ADD ./docs /webui-aria2
66 |
67 | RUN groupadd -r aria \
68 | && useradd -m -r -g aria aria -u 1000 \
69 | && echo "web: gosu aria /bin/busybox httpd -f -p 8080 -h /webui-aria2\nbackend: gosu aria bash -c 'shopt -s dotglob nullglob && /usr/bin/aria2c --dir=/data/downloads/ --conf-path=/home/aria/.aria2/aria2.conf /data/downloads/*.torrent'" > Procfile
70 |
71 | # aria2 downloads directory
72 | VOLUME /data/downloads
73 |
74 | # aria2 conf directory
75 | VOLUME /home/aria/.aria2
76 |
77 | # webui static content web server and aria2 RPC port
78 | EXPOSE 8080 6800
79 |
80 | CMD ["start"]
81 | ENTRYPOINT ["/usr/local/bin/goreman"]
82 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2012 Hamza Zia
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # WebUI-Aria2
2 |
3 | 
4 |
5 | The aim for this project is to create the worlds best and hottest interface to interact with aria2. aria2 is the worlds best file downloader, but sometimes the command line brings more power than necessary. The project was initially created as part of the GSOC scheme, however it has rapidly grown and changed with tremendous support and feedback from the aria2 community.
6 |
7 | Very simple to use, no build scripts, no installation scripts. First start aria2 in the background either in your local machine or in a remote one. You can do that as follows:
8 |
9 | ```bash
10 | aria2c --enable-rpc --rpc-listen-all
11 | ```
12 |
13 | If aria2 is not installed in your local machine then head on to https://aria2.github.io/ and follow the instructions there.
14 |
15 | Then to use the WebUI-Aria2,
16 |
17 | - You can either download this repository and open index.html from `docs` folder.
18 | - Or you could just head on to https://ziahamza.github.io/webui-aria2 and start downloading files! Once you have visited the URL thanks to [Progressive Web Apps](https://developers.google.com/web/progressive-web-apps/) you can open the same URL even when you are offline.
19 | - Or you can also use NodeJS to create simple server by using the following command from the project folder.
20 |
21 | ```bash
22 | node node-server.js
23 | ```
24 |
25 | # Tips
26 |
27 | 1. You can always select which files to download in case of torrents or metalinks. Just pause a download and a list icon should appear next to the settings button. To select which files to download before starting the download, give the flag --pause-metadata to aria2. See [link](https://aria2.github.io/manual/en/html/aria2c.html#cmdoption--pause-metadata)
28 |
29 | # Configuration
30 |
31 | Read and edit [configuration.js](src/js/services/configuration.js).
32 |
33 | ## DirectURL
34 |
35 | This feature allows users to download files that they download from aria2 directly from the webui dashboard. If you are familiar with how webservers work, setup a http server that points at the configured aria2 download directory, check permissions. Then Specify a full url: `http://server:port/` in the webui directURL configuration.
36 |
37 | If the above is not obvious, keep reading what this is about in [directurl.md](directurl.md)
38 |
39 | # Dependencies
40 |
41 | Well, you need aria2. And a web browser (if that even counts!)
42 |
43 | # Docker support
44 |
45 | There is two Dockerfile in this project, one is a common Dockerfile, which can be use for **testing purpose**.
46 | The second is a **production ready** Dockerfile for arm32v7 platforms (including Raspberry Pi).
47 |
48 | ### For testing purpose
49 |
50 | You can also try or use webui-aria2 in your LAN inside a Docker sandbox.
51 |
52 | Build the image
53 |
54 | ```bash
55 | sudo docker build -t yourname/webui-aria2 .
56 | ```
57 |
58 | ..and run it! It will be available at: `http://localhost:9100`
59 |
60 | ```bash
61 | sudo docker run -v /Downloads:/data -p 6800:6800 -p 9100:8080 --name="webui-aria2" yourname/webui-aria2
62 | ```
63 |
64 | `/Downloads` is the directory in the host where you want to keep the downloaded files
65 |
66 | ### Production ready (ARM platform)
67 |
68 | This image contains both aria2 and webui-aria2.
69 |
70 | Build it (may take several hours due to the aria2 compilation process. Don't panic and grab a coffee).
71 |
72 | ```
73 | docker build -f Dockerfile.arm32v7 -t yourname/webui-aria2 .
74 | ```
75 |
76 | This command will ends up building three images:
77 |
78 | - The first one is just about compiling aria2 and goreman binaries. It MUST be deleted each time the `ARIA2_VERSION` is changed in the Dockerfile, otherwise you won't benefit from the update.
79 | - The second is about building and downloading some go dependencies (goreman and gosu).
80 | - The second one is the acutal aria2 container, the one you must use.
81 |
82 |
83 | Prepare the host volume:
84 | This image required few file to be mounted in the container.
85 | ```
86 | /home/aria/aria2/session.txt (empty file)
87 | /home/aria/aria2/aria2.log (empty file)
88 | /home/aria/aria2/aria2.conf (aria2 configuration file, not webui-aria2 conf) must contains at least `enable-rpc=true` and `rpc-listen-all=true`
89 | /data/downloads/ (where the downloaded files goes)
90 | ```
91 |
92 | Run it
93 |
94 | ```
95 | docker run --restart=always \
96 | -v /home//data/aria2/downloads:/data/downloads \
97 | -v /home//data/aria2/.aria2:/home/aria/.aria2 \
98 | -p 6800:6800 -p 9100:8080 \
99 | --name="webui-aria2" \
100 | -d yourname/webui-aria2
101 | ```
102 |
103 | # Contributing
104 |
105 | Checkout [contributor's guide](CONTRIBUTING.md) to know more about how to contribute to this project.
106 |
107 | # Deploy to Heroku
108 |
109 | [](https://heroku.com/deploy)
110 |
111 | # Support
112 |
113 | For any support, feature request and bug report add an issue in the github project. [link](https://github.com/ziahamza/webui-aria2/issues)
114 |
115 | # License
116 |
117 | Refer to the LICENSE file (MIT License). If the more liberal license is needed then add it as an issue
118 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "webui-aria2",
3 | "description":
4 | "This project is to create the worlds best and hottest interface to interact with aria2.",
5 | "repository": "https://github.com/ziahamza/webui-aria2",
6 | "keywords": ["AngularJS", "aria2", "static"],
7 | "buildpacks": [
8 | {
9 | "url": "https://github.com/heroku/heroku-buildpack-static"
10 | }
11 | ]
12 | }
13 |
--------------------------------------------------------------------------------
/directurl.md:
--------------------------------------------------------------------------------
1 | DirectURL
2 | =========
3 | Consider the following scenarios:
4 |
5 | 1. aria2 is running on a computer that is not locally accessible via the LAN and the files need to be copied from remote aria2 computer to the local computer
6 | 2. aria2 is running locally somewhere and setting up samba/nfs/etc is "meh"
7 |
8 | HTTP to the rescue, already in the browser right?
9 |
10 | Simplest way is to link your download folder or use python to setup an extra http server.
11 |
12 | Steps using linked download folder
13 | ----------------------------------
14 | 1. as part of configuring aria2 to make life easier you will have set the global **dir** option to something like **/home/aria2/downloads**
15 | 2. clearly this folder is owned by the user **aria2**
16 | 3. open a shell session logged in as **aria2**
17 | 4. run ```ln -s /home/aria2/downloads /var/www/aria2/downloads```
18 | 5. go to webui-aria2 in your browser (http://serverip:81 - assuming webui-aria2 is running on port 81)
19 | 6. go to ```Settings > Connection Settings```
20 | 7. scroll down to Direct Download and put ```http://serverip:81/downloads/``` in base URL field _(make sure have the / on the end)_
21 | 8. now that URL has been specified all the files will be converted into clickable links
22 | 9. checkout the ```more info``` on a download and see for yourself
23 | 10. if you click on files that aren't finished downloading **you're going to have a bad day**
24 |
25 | Steps using extra http server
26 | -----------------------------
27 | 1. as part of configuring aria2 to make life easier you will have set the global **dir** option to something like **/home/aria2/downloads**
28 | 2. clearly this folder is owned by the user **aria2**
29 | 3. open a shell session logged in as **aria2**
30 | 4. run ```cd /home/aria2/downloads```
31 | 5. run ```python -m SimpleHTTPServer 8080```
32 | 6. webserver is now running on port 8080 and will serve files from the directory the command was run in
33 | 7. to test open up http://serverip:8080 - should get a directory listing. any browser errors and something hasn't been done properly, check IP/PORT etc
34 | 8. go back to webui-aria2
35 | 9. go to ```Settings > Connection Settings```
36 | 10. scroll down to Direct Download and put ```http://serverip:8080/``` in base URL field _(make sure have the / on the end)_
37 | 11. now that URL has been specified all the files will be converted into clickable links
38 | 13. checkout the ```more info``` on a download and see for yourself
39 | 14. if you click on files that aren't finished downloading **you're going to have a bad day**
40 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | aria2:
2 | image: ndthuan/aria2-alpine
3 | volumes:
4 | - $HOME/Downloads:/downloads
5 | ports:
6 | - "6800:6800"
7 |
8 | httpd:
9 | image: busybox
10 | volumes:
11 | - ./:/usr/html
12 | ports:
13 | - "80:80"
14 | command: /bin/busybox httpd -f -p 80 -h /usr/html
15 |
--------------------------------------------------------------------------------
/docs/flags/cn.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/docs/flags/cz.svg:
--------------------------------------------------------------------------------
1 |
13 |
--------------------------------------------------------------------------------
/docs/flags/de.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/docs/flags/fr.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/docs/flags/id.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/docs/flags/it.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/docs/flags/nl.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/docs/flags/pl.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/docs/flags/ru.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/docs/flags/th.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/docs/flags/tr.svg:
--------------------------------------------------------------------------------
1 |
9 |
--------------------------------------------------------------------------------
/docs/flags/tw.svg:
--------------------------------------------------------------------------------
1 |
15 |
--------------------------------------------------------------------------------
/docs/flags/us.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/docs/precache-manifest.b562a874cfed1a8c74df9b49e6f1c2cc.js:
--------------------------------------------------------------------------------
1 | self.__precacheManifest = [
2 | {
3 | revision: "4eb7af0db693855a4f24cb119a73110d",
4 | url: "flags/de.svg"
5 | },
6 | {
7 | revision: "3b828f54c0e614e18db2c1816c9c2e84",
8 | url: "index.html"
9 | },
10 | {
11 | revision: "3b00bc3b62feafb50a2e",
12 | url: "vendor.js"
13 | },
14 | {
15 | revision: "8020fcd82cc09410f7bad1bc875c115a",
16 | url: "flags/es.svg"
17 | },
18 | {
19 | revision: "617c6a550519013aed310e0fe85bb088",
20 | url: "flags/us.svg"
21 | },
22 | {
23 | revision: "0f6e3867129940ef785c7c8720e0b56d",
24 | url: "flags/ru.svg"
25 | },
26 | {
27 | revision: "09ccf3b3b0a12dd5b3559acedc77858c",
28 | url: "flags/nl.svg"
29 | },
30 | {
31 | revision: "22084f478d0f401fa96288f7790ba8ef",
32 | url: "flags/tw.svg"
33 | },
34 | {
35 | revision: "4a936767fc2ac7335885d90b471d8629",
36 | url: "flags/pl.svg"
37 | },
38 | {
39 | revision: "60fb243496d39972a15bf5a78b6e50ee",
40 | url: "flags/tr.svg"
41 | },
42 | {
43 | revision: "a88d006ab7afa49d76ecd86dd1b11f77",
44 | url: "flags/th.svg"
45 | },
46 | {
47 | revision: "d5204a17fb30a59a4760b4109fbefe0b",
48 | url: "flags/it.svg"
49 | },
50 | {
51 | revision: "5e7a66fb0660b714f1a47859b90767e0",
52 | url: "flags/ir.svg"
53 | },
54 | {
55 | revision: "d107c3019844d2d1f0a4d179cbd8046e",
56 | url: "flags/id.svg"
57 | },
58 | {
59 | revision: "be1df903f0d7711ef8a4e96b6ca56dc0",
60 | url: "flags/fr.svg"
61 | },
62 | {
63 | revision: "5d1c62c220e3dcc85d70e206d44a9d4c",
64 | url: "flags/cz.svg"
65 | },
66 | {
67 | revision: "bedfd890b6c16afeb952546279242cf7",
68 | url: "flags/cn.svg"
69 | },
70 | {
71 | revision: "78de6acf30cc7fa4700207e205a52e88",
72 | url: "flags/br.svg"
73 | },
74 | {
75 | revision: "e1870e757b1b72d20d1f",
76 | url: "app.js"
77 | },
78 | {
79 | revision: "e1870e757b1b72d20d1f",
80 | url: "app.css"
81 | }
82 | ];
83 |
--------------------------------------------------------------------------------
/docs/service-worker.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to your Workbox-powered service worker!
3 | *
4 | * You'll need to register this file in your web app and you should
5 | * disable HTTP caching for this file too.
6 | * See https://goo.gl/nhQhGp
7 | *
8 | * The rest of the code is auto-generated. Please don't update this file
9 | * directly; instead, make changes to your Workbox build configuration
10 | * and re-run your build process.
11 | * See https://goo.gl/2aRDsh
12 | */
13 |
14 | importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.4.1/workbox-sw.js");
15 |
16 | importScripts("precache-manifest.b562a874cfed1a8c74df9b49e6f1c2cc.js");
17 |
18 | /**
19 | * The workboxSW.precacheAndRoute() method efficiently caches and responds to
20 | * requests for URLs in the manifest.
21 | * See https://goo.gl/S9QRab
22 | */
23 | self.__precacheManifest = [].concat(self.__precacheManifest || []);
24 | workbox.precaching.suppressWarnings();
25 | workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
26 |
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ziahamza/webui-aria2/109903f0e2774cf948698cd95a01f77f33d7dd2c/favicon.ico
--------------------------------------------------------------------------------
/node-server.js:
--------------------------------------------------------------------------------
1 | var http = require("http"),
2 | url = require("url"),
3 | path = require("path"),
4 | fs = require("fs");
5 | port = process.argv[2] || 8888;
6 |
7 | http
8 | .createServer(function(request, response) {
9 | var uri = url.parse(request.url).pathname,
10 | filename = path.join(process.cwd(), "docs", uri);
11 |
12 | var extname = path.extname(filename);
13 | var contentType = "text/html";
14 | switch (extname) {
15 | case ".js":
16 | contentType = "text/javascript";
17 | break;
18 | case ".css":
19 | contentType = "text/css";
20 | break;
21 | case ".ico":
22 | contentType = "image/x-icon";
23 | break;
24 | case ".svg":
25 | contentType = "image/svg+xml";
26 | break;
27 | }
28 |
29 | fs.exists(filename, function(exists) {
30 | if (!exists) {
31 | response.writeHead(404, { "Content-Type": "text/plain" });
32 | response.write("404 Not Found\n");
33 | response.end();
34 | return;
35 | }
36 |
37 | if (fs.statSync(filename).isDirectory()) filename += "/index.html";
38 |
39 | fs.readFile(filename, "binary", function(err, file) {
40 | if (err) {
41 | response.writeHead(500, { "Content-Type": "text/plain" });
42 | response.write(err + "\n");
43 | response.end();
44 | return;
45 | }
46 | response.writeHead(200, { "Content-Type": contentType });
47 | response.write(file, "binary");
48 | response.end();
49 | });
50 | });
51 | })
52 | .listen(parseInt(port, 10));
53 |
54 | console.log("WebUI Aria2 Server is running on http://localhost:" + port);
55 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "webui-aria2",
3 | "version": "1.0.0",
4 | "description": "The aim for this project is to create the worlds best and hottest interface to interact with aria2.",
5 | "homepage": "https://github.com/ziahamza/webui-aria2#readme",
6 | "license": "MIT",
7 | "scripts": {
8 | "dev": "webpack -d --watch --progress & node node-server",
9 | "build": "webpack -p --progress",
10 | "analyze": "webpack -p --profile --json > stats.json && webpack-bundle-analyzer stats.json ./docs -p 9999",
11 | "format": "prettier -l --write \"**/*{js,scss}\" "
12 | },
13 | "repository": {
14 | "type": "git",
15 | "url": "git+https://github.com/ziahamza/webui-aria2.git"
16 | },
17 | "bugs": {
18 | "url": "https://github.com/ziahamza/webui-aria2/issues"
19 | },
20 | "husky": {
21 | "hooks": {
22 | "pre-commit": "pretty-quick --staged"
23 | }
24 | },
25 | "dependencies": {
26 | "angular": "^1.7.3",
27 | "angular-translate": "^2.18.1",
28 | "autoprefixer": "^9.1.3",
29 | "bootstrap-sass": "^3.3.7",
30 | "clean-webpack-plugin": "^0.1.19",
31 | "css-loader": "^1.0.0",
32 | "file-loader": "^2.0.0",
33 | "flag-icon-css": "^3.0.0",
34 | "html-webpack-plugin": "^3.2.0",
35 | "jquery": "^3.3.1",
36 | "lodash": "^4.17.10",
37 | "mini-css-extract-plugin": "^0.4.2",
38 | "node-sass": "^4.9.3",
39 | "postcss-loader": "^3.0.0",
40 | "sass-loader": "^7.1.0",
41 | "webpack": "^4.17.1",
42 | "webpack-bundle-analyzer": "^2.13.1",
43 | "webpack-cli": "^3.1.0",
44 | "workbox-webpack-plugin": "^3.4.1"
45 | },
46 | "devDependencies": {
47 | "husky": "^1.0.0-rc.13",
48 | "prettier": "1.14.2",
49 | "pretty-quick": "^1.6.0"
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: [require("autoprefixer")({ browsers: ["> 5%", "IE 11", "last 2 versions"] })]
3 | };
4 |
--------------------------------------------------------------------------------
/screenshots/overview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ziahamza/webui-aria2/109903f0e2774cf948698cd95a01f77f33d7dd2c/screenshots/overview.png
--------------------------------------------------------------------------------
/src/js/app.js:
--------------------------------------------------------------------------------
1 | // WebUI Aria2 is an angular 1.x application
2 | // This file imports all the required modules for the application
3 |
4 | // Vendor libraries
5 | import angular from "angular";
6 | import angularTranslate from "angular-translate";
7 | require("libs/angularui-bootstrap-tpls.min");
8 | require("libs/bootstrap-filestyle");
9 | require("libs/jquery.flot.min");
10 | require("libs/jquery.flot.time.min");
11 |
12 | // Stylesheets
13 | import "app.scss";
14 |
15 | // Services
16 | import serviceAlerts from "services/alerts";
17 | import servideBase64 from "services/base64";
18 | import serviceConfiguration from "services/configuration";
19 | import serviceDeps from "services/deps";
20 | import serviceErrors from "services/errors";
21 | import serviceRpc from "services/rpc/rpc";
22 | import serviceRpcHelpers from "services/rpc/helpers";
23 | import serviceRpcJsoncall from "services/rpc/jsoncall";
24 | import serviceRpcSockcall from "services/rpc/sockcall";
25 | import serviceRpcSyscall from "services/rpc/syscall";
26 | import serviceSettings from "services/settings/settings";
27 | import serviceFilters from "services/settings/filters";
28 | import serviceModals from "services/modals";
29 | import serviceUtils from "services/utils";
30 |
31 | // Filters
32 | import filterBytes from "filters/bytes";
33 | import filterUrl from "filters/url";
34 |
35 | // Directives
36 | import directiveChunkbar from "directives/chunkbar";
37 | import directiveDgraph from "directives/dgraph";
38 | import directiveFselect from "directives/fselect";
39 | import directiveFileselect from "directives/fileselect";
40 | import directiveTextarea from "directives/textarea";
41 |
42 | // Controllers
43 | import ctrlAlert from "ctrls/alert";
44 | import ctrlMain from "ctrls/main";
45 | import ctrlModal from "ctrls/modal";
46 | import ctrlNav from "ctrls/nav";
47 | import ctrlProps from "ctrls/props";
48 |
49 | // Translations
50 | require("translate/nl_NL");
51 | require("translate/en_US");
52 | require("translate/th_TH");
53 | require("translate/zh_CN");
54 | require("translate/zh_TW");
55 | require("translate/pl_PL");
56 | require("translate/fr_FR");
57 | require("translate/de_DE");
58 | require("translate/es_ES");
59 | require("translate/ru_RU");
60 | require("translate/it_IT");
61 | require("translate/tr_TR");
62 | require("translate/cs_CZ");
63 | require("translate/fa_IR");
64 | require("translate/id_ID");
65 | require("translate/pt_BR");
66 |
67 | var webui = angular.module("webui", [
68 | serviceUtils,
69 | serviceDeps,
70 | serviceErrors,
71 | servideBase64,
72 | serviceConfiguration,
73 | serviceRpc,
74 | serviceRpcHelpers,
75 | serviceRpcJsoncall,
76 | serviceRpcSockcall,
77 | serviceRpcSyscall,
78 | serviceModals,
79 | serviceAlerts,
80 | serviceSettings,
81 | serviceFilters,
82 | filterBytes,
83 | filterUrl,
84 | directiveChunkbar,
85 | directiveDgraph,
86 | directiveFselect,
87 | directiveFileselect,
88 | ctrlAlert,
89 | ctrlMain,
90 | ctrlModal,
91 | ctrlNav,
92 | ctrlProps,
93 | // external deps
94 | "ui.bootstrap",
95 | // translate
96 | "pascalprecht.translate"
97 | ]);
98 |
99 | function mergeTranslation(translation, base) {
100 | for (var i in base) {
101 | if (!base.hasOwnProperty(i)) {
102 | continue;
103 | }
104 |
105 | if (!translation[i] || !translation[i].length) {
106 | translation[i] = base[i];
107 | }
108 | }
109 | return translation;
110 | }
111 |
112 | webui.config([
113 | "$translateProvider",
114 | "$locationProvider",
115 | function($translateProvider, $locationProvider) {
116 | $translateProvider
117 | .translations("en_US", translations.en_US)
118 | .translations("nl_NL", mergeTranslation(translations.nl_NL, translations.en_US))
119 | .translations("th_TH", mergeTranslation(translations.th_TH, translations.en_US))
120 | .translations("zh_CN", mergeTranslation(translations.zh_CN, translations.en_US))
121 | .translations("zh_TW", mergeTranslation(translations.zh_TW, translations.en_US))
122 | .translations("pl_PL", mergeTranslation(translations.pl_PL, translations.en_US))
123 | .translations("fr_FR", mergeTranslation(translations.fr_FR, translations.en_US))
124 | .translations("de_DE", mergeTranslation(translations.de_DE, translations.en_US))
125 | .translations("es_ES", mergeTranslation(translations.es_ES, translations.en_US))
126 | .translations("ru_RU", mergeTranslation(translations.ru_RU, translations.en_US))
127 | .translations("it_IT", mergeTranslation(translations.it_IT, translations.en_US))
128 | .translations("tr_TR", mergeTranslation(translations.tr_TR, translations.en_US))
129 | .translations("cs_CZ", mergeTranslation(translations.cs_CZ, translations.en_US))
130 | .translations("fa_IR", mergeTranslation(translations.fa_IR, translations.en_US))
131 | .translations("id_ID", mergeTranslation(translations.id_ID, translations.en_US))
132 | .translations("pt_BR", mergeTranslation(translations.pt_BR, translations.en_US))
133 | .useSanitizeValueStrategy("escapeParameters")
134 | .determinePreferredLanguage();
135 |
136 | $locationProvider.html5Mode({
137 | enabled: true,
138 | requireBase: false
139 | });
140 | }
141 | ]);
142 |
143 | webui.directive("textarea", directiveTextarea);
144 |
145 | if ("serviceWorker" in navigator && location.protocol === "https:") {
146 | window.addEventListener("load", () => {
147 | navigator.serviceWorker
148 | .register("service-worker.js")
149 | .then(registration => {
150 | console.log("SW registered: ", registration);
151 | })
152 | .catch(registrationError => {
153 | console.log("SW registration failed: ", registrationError);
154 | });
155 | });
156 | }
157 |
158 | $(function() {
159 | if (!String.prototype.startsWith) {
160 | Object.defineProperty(String.prototype, "startsWith", {
161 | enumerable: false,
162 | configurable: false,
163 | writable: false,
164 | value: function(searchString, position) {
165 | position = position || 0;
166 | return this.indexOf(searchString, position) === position;
167 | }
168 | });
169 | }
170 | angular.bootstrap(document, ["webui"]);
171 | });
172 |
--------------------------------------------------------------------------------
/src/js/ctrls/alert.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular
4 | .module("webui.ctrls.alert", ["webui.services.alerts"])
5 | .controller("AlertCtrl", [
6 | "$scope",
7 | "$alerts",
8 | "$sce",
9 | function(scope, alerts, sce) {
10 | scope.pendingAlerts = [];
11 |
12 | scope.removeAlert = function(ind) {
13 | this.pendingAlerts.splice(ind, 1);
14 | };
15 |
16 | alerts.addAlerter(function(msg, type) {
17 | type = type || "warning";
18 | var obj = { msg: sce.trustAsHtml(msg), type: type };
19 | scope.pendingAlerts = _.filter(scope.pendingAlerts, function(al) {
20 | return !al.expired;
21 | });
22 | scope.pendingAlerts.push(obj);
23 |
24 | setTimeout(function() {
25 | var ind = scope.pendingAlerts.indexOf(obj);
26 | if (ind != -1) {
27 | scope.pendingAlerts[ind].expired = true;
28 |
29 | // only remove if more notifications are pending in the pipeline
30 | if (scope.pendingAlerts.length > 0) scope.removeAlert(ind);
31 | }
32 | }, type == "error" ? 15000 : 5000);
33 |
34 | scope.$digest();
35 | });
36 | }
37 | ]).name;
38 |
--------------------------------------------------------------------------------
/src/js/ctrls/nav.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular
4 | .module("webui.ctrls.nav", [
5 | "webui.services.configuration",
6 | "webui.services.modals",
7 | "webui.services.rpc",
8 | "webui.services.rpc.helpers",
9 | "webui.services.settings",
10 | "webui.services.utils"
11 | ])
12 | .controller("NavCtrl", [
13 | "$scope",
14 | "$modals",
15 | "$rpc",
16 | "$rpchelpers",
17 | "$fileSettings",
18 | "$globalSettings",
19 | "$globalExclude",
20 | "$utils",
21 | "$translate",
22 | "$filter",
23 | function(
24 | scope,
25 | modals,
26 | rpc,
27 | rhelpers,
28 | fsettings,
29 | gsettings,
30 | gexclude,
31 | utils,
32 | translate,
33 | filter
34 | ) {
35 | scope.isFeatureEnabled = function(f) {
36 | return rhelpers.isFeatureEnabled(f);
37 | };
38 |
39 | // initially collapsed in mobile resolution
40 | scope.collapsed = true;
41 |
42 | scope.onDownloadFilter = function() {
43 | // Forward to MainCtrl.
44 | scope.$parent.downloadFilter = scope.downloadFilter;
45 | scope.$parent.onDownloadFilter();
46 | };
47 |
48 | // manage download functions
49 | scope.forcePauseAll = function() {
50 | rpc.once("forcePauseAll", []);
51 | };
52 |
53 | scope.purgeDownloadResult = function() {
54 | rpc.once("purgeDownloadResult", []);
55 | };
56 |
57 | scope.unpauseAll = function() {
58 | rpc.once("unpauseAll", []);
59 | };
60 |
61 | scope.addUris = function() {
62 | modals.invoke("getUris", _.bind(rhelpers.addUris, rhelpers));
63 | };
64 |
65 | scope.addMetalinks = function() {
66 | modals.invoke("getMetalinks", _.bind(rhelpers.addMetalinks, rhelpers));
67 | };
68 |
69 | scope.addTorrents = function() {
70 | modals.invoke("getTorrents", _.bind(rhelpers.addTorrents, rhelpers));
71 | };
72 |
73 | scope.changeCSettings = function() {
74 | modals.invoke("connection", rpc.getConfiguration(), _.bind(rpc.configure, rpc));
75 | };
76 |
77 | scope.changeGSettings = function() {
78 | rpc.once("getGlobalOption", [], function(data) {
79 | var starred = utils.getCookie("aria2props");
80 | if (!starred || !starred.indexOf) starred = [];
81 | var vals = data[0];
82 | var settings = {};
83 |
84 | // global settings divided into
85 | // file settings + some global specific
86 | // settings
87 |
88 | _.forEach([fsettings, gsettings], function(sets) {
89 | for (var i in sets) {
90 | if (gexclude.indexOf(i) != -1) continue;
91 |
92 | settings[i] = _.cloneDeep(sets[i]);
93 | settings[i].starred = starred.indexOf(i) != -1;
94 | }
95 | });
96 |
97 | for (var i in vals) {
98 | if (i in gexclude) continue;
99 |
100 | if (!(i in settings)) {
101 | settings[i] = { name: i, val: vals[i], desc: "", starred: starred.indexOf(i) != -1 };
102 | } else {
103 | settings[i].val = vals[i];
104 | }
105 | }
106 |
107 | modals.invoke(
108 | "settings",
109 | _.cloneDeep(settings),
110 | filter("translate")("Global Settings"),
111 | filter("translate")("Save"),
112 | function(chsettings) {
113 | var sets = {};
114 | var starred = [];
115 | for (var i in chsettings) {
116 | // no need to change default values
117 | if (settings[i].val != chsettings[i].val) sets[i] = chsettings[i].val;
118 |
119 | if (chsettings[i].starred) {
120 | starred.push(i);
121 | }
122 | }
123 |
124 | console.log("saving aria2 settings:", sets);
125 | console.log("saving aria2 starred:", starred);
126 |
127 | rpc.once("changeGlobalOption", [sets]);
128 | utils.setCookie("aria2props", starred);
129 | }
130 | );
131 | });
132 | };
133 |
134 | scope.showServerInfo = function() {
135 | modals.invoke("server_info");
136 | };
137 |
138 | scope.showAbout = function() {
139 | modals.invoke("about");
140 | };
141 |
142 | scope.changeLanguage = function(langkey) {
143 | translate.use(langkey);
144 | };
145 |
146 | scope.shutDownServer = function() {
147 | rpc.once("shutdown", []);
148 | };
149 | }
150 | ]).name;
151 |
--------------------------------------------------------------------------------
/src/js/ctrls/props.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular
4 | .module("webui.ctrls.props", [
5 | "webui.services.utils",
6 | "webui.services.settings",
7 | "webui.services.deps",
8 | "webui.services.rpc",
9 | "webui.services.configuration"
10 | ])
11 | .controller("StarredPropsCtrl", [
12 | "$scope",
13 | "$_",
14 | "$utils",
15 | "$rpc",
16 | "$globalSettings",
17 | "$fileSettings",
18 | "$starredProps",
19 | function(scope, _, utils, rpc, gsettings, fsettings, starredProps) {
20 | scope._props = [];
21 | scope.dirty = true;
22 | scope.properties = [];
23 | scope.getProps = function() {
24 | var props = utils.getCookie("aria2props");
25 | if (!props || !props.indexOf) props = starredProps; // default properties starred in the global configuration file
26 |
27 | return props;
28 | };
29 |
30 | scope.enabled = function() {
31 | for (var i = 0; i < scope.properties.length; i++) {
32 | if (scope.properties[i]._val != scope.properties[i].val) return true;
33 | }
34 |
35 | return false;
36 | };
37 |
38 | scope.save = function() {
39 | var sets = {};
40 | var found = false;
41 | for (var i = 0; i < scope.properties.length; i++) {
42 | if (scope.properties[i]._val != scope.properties[i].val) {
43 | sets[scope.properties[i].name] = scope.properties[i].val;
44 | found = true;
45 | }
46 | }
47 |
48 | if (found) {
49 | rpc.once("changeGlobalOption", [sets]);
50 | }
51 | };
52 |
53 | rpc.subscribe("getGlobalOption", [], function(data) {
54 | var vals = data[0];
55 | var props = scope.getProps();
56 | var arr = [];
57 |
58 | for (var i = 0; i < props.length; i++) {
59 | var set = {};
60 | if (props[i] in gsettings) {
61 | set = gsettings[props[i]];
62 | if (props[i] in vals) {
63 | set.val = vals[props[i]];
64 | }
65 | set.name = props[i];
66 | arr.push(set);
67 | } else if (props[i] in fsettings) {
68 | set = fsettings[props[i]];
69 | if (props[i] in vals) {
70 | set.val = vals[props[i]];
71 | }
72 | set.name = props[i];
73 | arr.push(set);
74 | } else if (props[i] in vals) {
75 | arr.push({ name: props[i], val: vals[props[i]] });
76 | }
77 | }
78 |
79 | utils.mergeMap(arr, scope.properties, function(prop, nprop) {
80 | nprop = nprop || {};
81 | nprop.name = prop.name;
82 | nprop.options = prop.options;
83 | nprop.multiline = prop.multiline;
84 | if (nprop._val == nprop.val || nprop.val == prop.val) {
85 | nprop._val = prop.val;
86 | nprop.val = prop.val;
87 | } else {
88 | nprop._val = prop.val;
89 | }
90 | nprop.desc = prop.desc;
91 | return nprop;
92 | });
93 | });
94 | }
95 | ]).name;
96 |
--------------------------------------------------------------------------------
/src/js/directives/chunkbar.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | var draw = function(canvas, chunks, fillStyle) {
4 | chunks = chunks || [];
5 | if (!canvas.getContext) {
6 | console.log("use chunk bar on an canvas implementation!");
7 | return;
8 | }
9 | var ctx = canvas.getContext("2d");
10 | ctx.fillStyle = fillStyle || "#149BDF";
11 | ctx.clearRect(0, 0, canvas.width, canvas.height);
12 | var x = 0,
13 | width = canvas.width,
14 | height = canvas.height;
15 | chunks.forEach(function(c) {
16 | var dx = c.ratio * width;
17 | if (c.show) ctx.fillRect(x, 0, dx, height);
18 | x += dx;
19 | });
20 | };
21 | // put chunkbar and bitfield attributes in a canvas element
22 | // to use the directive, draw is optional and canvas is
23 | // only drawn when it is true if given
24 | export default angular
25 | .module("webui.directives.chunkbar", ["webui.services.utils"])
26 | .directive("chunkbar", [
27 | "$utils",
28 | function(utils) {
29 | return function(scope, elem, attrs) {
30 | var bitfield = "",
31 | pieces = 0,
32 | canDraw = true;
33 | var update = function() {
34 | if (canDraw) draw(elem[0], utils.getChunksFromHex(bitfield, pieces), attrs.fillStyle);
35 | };
36 | scope.$watch(attrs.bitfield, function(bf) {
37 | bitfield = bf;
38 | update();
39 | });
40 | scope.$watch(attrs.pieces, function(p) {
41 | pieces = p;
42 | update();
43 | });
44 |
45 | if (attrs.draw) {
46 | scope.$watch(attrs.draw, function(val) {
47 | canDraw = val;
48 | });
49 | }
50 |
51 | update();
52 | };
53 | }
54 | ]).name;
55 |
--------------------------------------------------------------------------------
/src/js/directives/dgraph.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | // graph takes dspeed and uspeed, it queries them every second and draws
4 | // the last 180 secs, it also takes draw as an optional attribute and only
5 | // draws the graph when it is true, if not given then graph is always drawn
6 | export default angular
7 | .module("webui.directives.dgraph", ["webui.filters.bytes", "webui.services.deps"])
8 | .directive("dgraph", [
9 | "$",
10 | "$filter",
11 | "$parse",
12 | function($, filter, parse) {
13 | var ratio = 0.6;
14 | var xfmt = "%H:%M:%S";
15 | var yTicks = 7; // Number of y-axis ticks (sans 0)
16 | var xticks = 10; // Number of x-axis ticks (sans 0)
17 | var yTickBase = 10240; // y-axis ticks must be a multiple of this (bytes).
18 | try {
19 | // Try to detect AM/PM locales.
20 | if (!/16/.test(new Date(2000, 0, 1, 16, 7, 9).toLocaleTimeString())) {
21 | xfmt = "%I:%M:%S %P";
22 | }
23 | } catch (ex) {
24 | // Ignore. Browser does not support toLocaleTimeString.
25 | }
26 |
27 | return function(scope, elem, attrs) {
28 | var canDraw = false;
29 |
30 | var graphSize = 180,
31 | dspeed = 0,
32 | uspeed = 0,
33 | hasSpeeds = false,
34 | dconf = {
35 | label: "DOWN",
36 | data: [],
37 | color: "#00ff00",
38 | lines: { show: true }
39 | },
40 | uconf = {
41 | label: "UP",
42 | data: [],
43 | color: "#0000ff",
44 | lines: { show: true }
45 | };
46 |
47 | // hack for the null height for flot elem
48 | elem.height(elem.width() * ratio);
49 | var graph = $.plot(elem, [dconf, uconf], {
50 | legend: {
51 | show: attrs.nolabel == undefined,
52 | backgroundOpacity: 0,
53 | margin: [10, 20],
54 | labelFormatter: function(label, series) {
55 | if (!series.data.length) {
56 | return label;
57 | }
58 | return label + " (" + filter("bspeed")(series.data[series.data.length - 1][1]) + ")";
59 | },
60 | position: "sw"
61 | },
62 | xaxis: {
63 | show: true,
64 | mode: "time",
65 | timeformat: xfmt,
66 | ticks: +attrs.xticks || xticks, // allow users of the directive to overwride xticks
67 | minTickSize: [30, "second"] // 180 / 30 == 6
68 | },
69 | yaxis: {
70 | position: "right",
71 | ticks: function(axis) {
72 | var res = [0];
73 | var yt = +attrs.yticks || yticks; // allow users of directive to overwride yticks
74 |
75 | var step = yTickBase * Math.max(1, Math.ceil(axis.max / (yt * yTickBase)));
76 |
77 | for (var s = 0; s < yt; s++) {
78 | var c = step * s;
79 | if (c > axis.max) break;
80 |
81 | res.push(step * s);
82 | }
83 |
84 | return res;
85 | },
86 | tickFormatter: function(val, axis) {
87 | return filter("bspeed")(val);
88 | },
89 | min: 0
90 | }
91 | });
92 |
93 | var draw = function() {
94 | var width = elem.width();
95 | if (width == 0) return;
96 |
97 | elem.height(width * ratio);
98 |
99 | graph.setData([dconf, uconf]);
100 | graph.resize();
101 | graph.setupGrid();
102 | graph.draw();
103 | };
104 |
105 | function update() {
106 | if (!hasSpeeds) {
107 | return;
108 | }
109 |
110 | // Convoluted way to get the local date timestamp instead of the UTC one.
111 | var cnt = new Date();
112 | cnt = Date.UTC(
113 | cnt.getFullYear(),
114 | cnt.getMonth(),
115 | cnt.getDate(),
116 | cnt.getHours(),
117 | cnt.getMinutes(),
118 | cnt.getSeconds()
119 | );
120 |
121 | if (dconf.data.length === graphSize) dconf.data.shift();
122 | dconf.data.push([cnt, dspeed]);
123 |
124 | if (uconf.data.length === graphSize) uconf.data.shift();
125 | uconf.data.push([cnt, uspeed]);
126 |
127 | // if any parents is collapsable, then confirm if it isnt
128 | if (canDraw) {
129 | draw();
130 | }
131 | }
132 |
133 | scope.$watch(attrs.dspeed, function(val) {
134 | if (val === undefined) {
135 | return;
136 | }
137 | hasSpeeds = true;
138 | dspeed = parseFloat(val) || 0;
139 | });
140 |
141 | scope.$watch(attrs.uspeed, function(val) {
142 | if (val === undefined) {
143 | return;
144 | }
145 | hasSpeeds = true;
146 | uspeed = parseFloat(val) || 0;
147 | });
148 |
149 | scope.$watch(attrs.draw, function(val) {
150 | canDraw = val;
151 | });
152 |
153 | var interval = setInterval(update, 1000);
154 |
155 | angular.element(window).bind("resize", draw);
156 | elem.bind("$destroy", function() {
157 | clearInterval(interval);
158 | });
159 | };
160 | }
161 | ]).name;
162 |
--------------------------------------------------------------------------------
/src/js/directives/fileselect.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | // watches changes in the file upload control (input[file]) and
4 | // puts the files selected in an attribute
5 | export default angular
6 | .module("webui.directives.fileselect", ["webui.services.deps"])
7 | .directive("indeterminate", [
8 | "$parse",
9 | function syncInput(parse) {
10 | return {
11 | require: "ngModel",
12 | // Restrict the directive so it can only be used as an attribute
13 | restrict: "A",
14 |
15 | link: function link(scope, elem, attr, ngModelCtrl) {
16 | // Whenever the bound value of the attribute changes we update
17 | // use upward emit notification for change to prevent the performance penalty bring by $scope.$watch
18 | var getter = parse(attr["ngModel"]);
19 | // var setter = getter.assign;
20 | var children = []; // cache children input
21 | var cacheSelectedSubInputNumber = 0;
22 | var cacheNoSelectedSubInputNumber = 0;
23 | var get = function() {
24 | return getter(scope);
25 | };
26 | // the internal 'indeterminate' flag on the attached dom element
27 | var setIndeterminateState = function(newValue) {
28 | elem.prop("indeterminate", newValue);
29 | };
30 | var setModelValueWithSideEffect = function(newVal) {
31 | // will cause to emit corresponding events
32 | ngModelCtrl.$setViewValue(newVal);
33 | ngModelCtrl.$render();
34 | };
35 | var passIfIsLeafChild = function(callback) {
36 | // ensure to execute callback only when this input has one or more subinputs
37 | return function() {
38 | if (children.length > 0) {
39 | callback.apply(this, arguments);
40 | }
41 | };
42 | };
43 | var passIfNotIsLeafChild = function(callback) {
44 | // ensure to execute callback only when this input hasn't any subinput
45 | return function() {
46 | if (children.length === 0) {
47 | callback.apply(this, arguments);
48 | }
49 | };
50 | };
51 | var passThroughThisScope = function(callback) {
52 | // pass through the event from the scope where they sent
53 | return function(event) {
54 | if (event.targetScope !== event.currentScope) {
55 | return callback.apply(this, arguments);
56 | }
57 | };
58 | };
59 | var passIfIsIndeterminate = function(callback) {
60 | // pass through the event when this input is indeterminate
61 | return function() {
62 | if (!elem.prop("indeterminate")) {
63 | return callback.apply(this, arguments);
64 | }
65 | };
66 | };
67 | /* var catchEventOnlyOnce = function (callback) { // only fire once, and stop event's propagation
68 | return function (event) {
69 | callback.apply(this, arguments);
70 | return event.stopPropagation();
71 | };
72 | }; */
73 | if (attr["indeterminate"] && parse(attr["indeterminate"]).constant) {
74 | setIndeterminateState(scope.$eval(attr["indeterminate"])); // set to default value (set in template)
75 | }
76 | if (
77 | attr["indeterminate"] &&
78 | parse(attr["indeterminate"]).constant &&
79 | !scope.$eval(attr["indeterminate"])
80 | ) {
81 | // when this input wont have subinput, they will only receive parent change and emit child change event
82 | ngModelCtrl.$viewChangeListeners.push(
83 | passIfNotIsLeafChild(function() {
84 | scope.$emit("childSelectedChange", get()); // notifies parents to change their state
85 | })
86 | );
87 | scope.$on(
88 | "ParentSelectedChange",
89 | passThroughThisScope(
90 | passIfNotIsLeafChild(function(event, newVal) {
91 | setModelValueWithSideEffect(newVal); // set value to parent's value; this will cause listener to emit childChange event; this won't be a infinite loop
92 | })
93 | )
94 | );
95 | // init first time and only once
96 | scope.$emit("i'm child input", get); // traverses upwards toward the root scope notifying the listeners for keep reference to this input's value
97 | scope.$emit("childSelectedChange", get()); // force emitted, and force the parent change their state base on children at first time
98 | } else {
99 | // establish parent-child's relation
100 | // listen for the child emitted token
101 | scope.$on(
102 | "i'm child input",
103 | passThroughThisScope(
104 | // can't apply pass passIfIsLeafChild, at beginning all has not child input
105 | function(event, child) {
106 | children.push(child);
107 | }
108 | )
109 | );
110 | var updateBaseOnChildrenState = function(event, newChildValue) {
111 | if (cacheSelectedSubInputNumber + cacheNoSelectedSubInputNumber !== children.length) {
112 | // cache childern state
113 | cacheSelectedSubInputNumber = 0;
114 | cacheNoSelectedSubInputNumber = 0;
115 | for (var i = 0; i < children.length; i++) {
116 | if (children[i]()) {
117 | cacheSelectedSubInputNumber += 1;
118 | } else {
119 | cacheNoSelectedSubInputNumber += 1;
120 | }
121 | }
122 | } else {
123 | // no need for recalculated children state
124 | // just make a few change to cache value
125 | if (newChildValue) {
126 | cacheSelectedSubInputNumber++;
127 | cacheNoSelectedSubInputNumber--;
128 | } else {
129 | cacheSelectedSubInputNumber--;
130 | cacheNoSelectedSubInputNumber++;
131 | }
132 | }
133 | var allSelected = cacheNoSelectedSubInputNumber === 0; // if doesn't has any no selected input
134 | var anySeleted = cacheSelectedSubInputNumber > 0;
135 | setIndeterminateState(allSelected !== anySeleted); // if at least one is selected, but not all then set input property indeterminate to true
136 | setModelValueWithSideEffect(allSelected); // change binding model value and trigger onchange event
137 | };
138 | // is not leaf input, Only receive child change and parent change event
139 | ngModelCtrl.$viewChangeListeners.push(
140 | passIfIsLeafChild(
141 | passIfIsIndeterminate(function() {
142 | // emit when input property indeterminate is false, prevent recursively emitting event from parent to children, children to parent
143 | scope.$broadcast("ParentSelectedChange", get());
144 | })
145 | )
146 | );
147 | // reset input state base on children inputs
148 | scope.$on(
149 | "childSelectedChange",
150 | passThroughThisScope(passIfIsLeafChild(updateBaseOnChildrenState))
151 | );
152 | }
153 | }
154 | };
155 | }
156 | ]).name;
157 |
--------------------------------------------------------------------------------
/src/js/directives/fselect.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | // watches changes in the file upload control (input[file]) and
4 | // puts the files selected in an attribute
5 | export default angular
6 | .module("webui.directives.fselect", ["webui.services.deps"])
7 | .directive("fselect", [
8 | "$parse",
9 | function(parse) {
10 | return function(scope, elem, attrs) {
11 | var setfiles = parse(attrs.fselect || attrs.files).assign;
12 | elem
13 | .bind("change", function() {
14 | setfiles(scope, elem[0].files);
15 | })
16 | .filestyle({
17 | placeholder: "No file selected"
18 | });
19 | };
20 | }
21 | ]).name;
22 |
--------------------------------------------------------------------------------
/src/js/directives/textarea.js:
--------------------------------------------------------------------------------
1 | function textareaDirective() {
2 | return {
3 | restrict: "E",
4 | link: function(scope, element) {
5 | element
6 | .attr("placeholder", function(index, placeholder) {
7 | if (placeholder !== undefined) {
8 | return placeholder.replace(/\\n/g, "\n");
9 | } else {
10 | return placeholder;
11 | }
12 | })
13 | .bind("keydown keypress", function(event) {
14 | if (event.ctrlKey && event.which === 13) {
15 | event.preventDefault();
16 | scope.$close();
17 | }
18 | });
19 | }
20 | };
21 | }
22 |
23 | export default textareaDirective;
24 |
--------------------------------------------------------------------------------
/src/js/filters/bytes.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular
4 | .module("webui.filters.bytes", ["webui.services.utils"])
5 | .filter("blength", [
6 | "$filter",
7 | "$utils",
8 | function(filter, utils) {
9 | return utils.fmtsize;
10 | }
11 | ])
12 | .filter("bspeed", [
13 | "$filter",
14 | "$utils",
15 | function(filter, utils) {
16 | return utils.fmtspeed;
17 | }
18 | ])
19 | .filter("time", function() {
20 | function pad(f) {
21 | return ("0" + f).substr(-2);
22 | }
23 |
24 | return function(time) {
25 | time = parseInt(time, 10);
26 | if (!time || !isFinite(time)) return "∞";
27 | var secs = time % 60;
28 | if (time < 60) return secs + "s";
29 | var mins = Math.floor((time % 3600) / 60);
30 | if (time < 3600) return pad(mins) + ":" + pad(secs);
31 | var hrs = Math.floor((time % 86400) / 3600);
32 | if (time < 86400) return pad(hrs) + ":" + pad(mins) + ":" + pad(secs);
33 | var days = Math.floor(time / 86400);
34 | return days + "::" + pad(hrs) + ":" + pad(mins) + ":" + pad(secs);
35 | };
36 | }).name;
37 |
--------------------------------------------------------------------------------
/src/js/filters/url.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular
4 | .module("webui.filters.url", ["webui.services.utils"])
5 | .filter("encodeURI", function() {
6 | return window.encodeURI;
7 | }).name;
8 |
--------------------------------------------------------------------------------
/src/js/libs/jquery.flot.resize.min.js:
--------------------------------------------------------------------------------
1 | /* Javascript plotting library for jQuery, version 0.8.3.
2 |
3 | Copyright (c) 2007-2014 IOLA and Ole Laursen.
4 | Licensed under the MIT license.
5 |
6 | */
7 | (function($,e,t){"$:nomunge";var i=[],n=$.resize=$.extend($.resize,{}),a,r=false,s="setTimeout",u="resize",m=u+"-special-event",o="pendingDelay",l="activeDelay",f="throttleWindow";n[o]=200;n[l]=20;n[f]=true;$.event.special[u]={setup:function(){if(!n[f]&&this[s]){return false}var e=$(this);i.push(this);e.data(m,{w:e.width(),h:e.height()});if(i.length===1){a=t;h()}},teardown:function(){if(!n[f]&&this[s]){return false}var e=$(this);for(var t=i.length-1;t>=0;t--){if(i[t]==this){i.splice(t,1);break}}e.removeData(m);if(!i.length){if(r){cancelAnimationFrame(a)}else{clearTimeout(a)}a=null}},add:function(e){if(!n[f]&&this[s]){return false}var i;function a(e,n,a){var r=$(this),s=r.data(m)||{};s.w=n!==t?n:r.width();s.h=a!==t?a:r.height();i.apply(this,arguments)}if($.isFunction(e)){i=e;return a}else{i=e.handler;e.handler=a}}};function h(t){if(r===true){r=t||1}for(var s=i.length-1;s>=0;s--){var l=$(i[s]);if(l[0]==e||l.is(":visible")){var f=l.width(),c=l.height(),d=l.data(m);if(d&&(f!==d.w||c!==d.h)){l.trigger(u,[d.w=f,d.h=c]);r=t||true}}else{d=l.data(m);d.w=0;d.h=0}}if(a!==null){if(r&&(t==null||t-r<1e3)){a=e.requestAnimationFrame(h)}else{a=setTimeout(h,n[o]);r=false}}}if(!e.requestAnimationFrame){e.requestAnimationFrame=function(){return e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t,i){return e.setTimeout(function(){t((new Date).getTime())},n[l])}}()}if(!e.cancelAnimationFrame){e.cancelAnimationFrame=function(){return e.webkitCancelRequestAnimationFrame||e.mozCancelRequestAnimationFrame||e.oCancelRequestAnimationFrame||e.msCancelRequestAnimationFrame||clearTimeout}()}})(jQuery,this);(function($){var options={};function init(plot){function onResize(){var placeholder=plot.getPlaceholder();if(placeholder.width()==0||placeholder.height()==0)return;plot.resize();plot.setupGrid();plot.draw()}function bindEvents(plot,eventHolder){plot.getPlaceholder().resize(onResize)}function shutdown(plot,eventHolder){plot.getPlaceholder().unbind("resize",onResize)}plot.hooks.bindEvents.push(bindEvents);plot.hooks.shutdown.push(shutdown)}$.plot.plugins.push({init:init,options:options,name:"resize",version:"1.0"})})(jQuery);
--------------------------------------------------------------------------------
/src/js/libs/jquery.flot.time.min.js:
--------------------------------------------------------------------------------
1 | /* Javascript plotting library for jQuery, version 0.8.3.
2 |
3 | Copyright (c) 2007-2014 IOLA and Ole Laursen.
4 | Licensed under the MIT license.
5 |
6 | */
7 | (function($){var options={xaxis:{timezone:null,timeformat:null,twelveHourClock:false,monthNames:null}};function floorInBase(n,base){return base*Math.floor(n/base)}function formatDate(d,fmt,monthNames,dayNames){if(typeof d.strftime=="function"){return d.strftime(fmt)}var leftPad=function(n,pad){n=""+n;pad=""+(pad==null?"0":pad);return n.length==1?pad+n:n};var r=[];var escape=false;var hours=d.getHours();var isAM=hours<12;if(monthNames==null){monthNames=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}if(dayNames==null){dayNames=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]}var hours12;if(hours>12){hours12=hours-12}else if(hours==0){hours12=12}else{hours12=hours}for(var i=0;i=minSize){break}}var size=spec[i][0];var unit=spec[i][1];if(unit=="year"){if(opts.minTickSize!=null&&opts.minTickSize[1]=="year"){size=Math.floor(opts.minTickSize[0])}else{var magn=Math.pow(10,Math.floor(Math.log(axis.delta/timeUnitSize.year)/Math.LN10));var norm=axis.delta/timeUnitSize.year/magn;if(norm<1.5){size=1}else if(norm<3){size=2}else if(norm<7.5){size=5}else{size=10}size*=magn}if(size<1){size=1}}axis.tickSize=opts.tickSize||[size,unit];var tickSize=axis.tickSize[0];unit=axis.tickSize[1];var step=tickSize*timeUnitSize[unit];if(unit=="second"){d.setSeconds(floorInBase(d.getSeconds(),tickSize))}else if(unit=="minute"){d.setMinutes(floorInBase(d.getMinutes(),tickSize))}else if(unit=="hour"){d.setHours(floorInBase(d.getHours(),tickSize))}else if(unit=="month"){d.setMonth(floorInBase(d.getMonth(),tickSize))}else if(unit=="quarter"){d.setMonth(3*floorInBase(d.getMonth()/3,tickSize))}else if(unit=="year"){d.setFullYear(floorInBase(d.getFullYear(),tickSize))}d.setMilliseconds(0);if(step>=timeUnitSize.minute){d.setSeconds(0)}if(step>=timeUnitSize.hour){d.setMinutes(0)}if(step>=timeUnitSize.day){d.setHours(0)}if(step>=timeUnitSize.day*4){d.setDate(1)}if(step>=timeUnitSize.month*2){d.setMonth(floorInBase(d.getMonth(),3))}if(step>=timeUnitSize.quarter*2){d.setMonth(floorInBase(d.getMonth(),6))}if(step>=timeUnitSize.year){d.setMonth(0)}var carry=0;var v=Number.NaN;var prev;do{prev=v;v=d.getTime();ticks.push(v);if(unit=="month"||unit=="quarter"){if(tickSize<1){d.setDate(1);var start=d.getTime();d.setMonth(d.getMonth()+(unit=="quarter"?3:1));var end=d.getTime();d.setTime(v+carry*timeUnitSize.hour+(end-start)*tickSize);carry=d.getHours();d.setHours(0)}else{d.setMonth(d.getMonth()+tickSize*(unit=="quarter"?3:1))}}else if(unit=="year"){d.setFullYear(d.getFullYear()+tickSize)}else{d.setTime(v+step)}}while(v 1); i += 1) {
25 | b *= w1;
26 | bs *= w1;
27 | if (i < length) {
28 | c = alpha.indexOf(s.charAt(i));
29 | if (c <= -1 || c >= w1) {
30 | throw new RangeError();
31 | }
32 | sb *= w1;
33 | b += c;
34 | }
35 | while (bs >= w2) {
36 | bs /= w2;
37 | if (sb > 1) {
38 | tmp = b;
39 | b %= bs;
40 | x += beta.charAt((tmp - b) / bs);
41 | sb /= w2;
42 | }
43 | }
44 | }
45 | return x;
46 | }
47 |
48 | obj.btoa = function(s) {
49 | s = code(s, false, a256, a64, 256, 64);
50 | return s + "====".slice(s.length % 4 || 4);
51 | };
52 |
53 | obj.atob = function(s) {
54 | var i;
55 | s = String(s).split("=");
56 | for (i = s.length - 1; i >= 0; i -= 1) {
57 | if (s[i].length % 4 === 1) {
58 | throw new RangeError();
59 | }
60 | s[i] = code(s[i], true, a64, a256, 64, 256);
61 | }
62 | return s.join("");
63 | };
64 |
65 | return obj;
66 | }
67 | ]).name;
68 |
--------------------------------------------------------------------------------
/src/js/services/configuration.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular
4 | .module("webui.services.configuration", [])
5 | .constant("$name", "Aria2 WebUI") // name used across the entire UI
6 | .constant("$titlePattern", "active: {active} - waiting: {waiting} - stopped: {stopped} — {name}")
7 | .constant("$pageSize", 11) // number of downloads shown before pagination kicks in
8 | .constant("$authconf", {
9 | // default authentication configuration, never fill it in case the webui is hosted in public IP as it can be compromised
10 | host: location.protocol.startsWith("http") ? location.hostname : "localhost",
11 | path: "/jsonrpc",
12 | port: 6800,
13 | encrypt: false,
14 | auth: {
15 | // either add the token field or the user and pass field, not both.
16 | // token: '$YOUR_SECRET_TOKEN$'
17 | /*-----------------------------*/
18 | // user: '*YOUR_USERNAME*',
19 | // pass: '*YOUR_SECRET_PASS*'
20 | },
21 | directURL: "" // If supplied, links will be created to enable direct download from the aria2 server, requires appropriate webserver to be configured
22 | })
23 | .constant("$enable", {
24 | torrent: true, // bittorrent support only enabled if supported by aria2 build, set to false otherwise to permanently disable it
25 |
26 | metalink: true, // metalink support only enabled if supported by aria2 build, set to false to permanently disable it
27 |
28 | sidebar: {
29 | // configuration related to the sidebar next to the list of downloads
30 | show: true, // set to false to completely hide the sidebar. Other elements inside will be automatically hidden
31 |
32 | stats: true, // set to false to hide the global statistic section (contains the speed graph for now)
33 |
34 | filters: true, // set to false to hide the Download Filters
35 |
36 | starredProps: true // only shown when at least one property is added to the starred list, set to false to permanently hide the Quick Access Settings inside the sidebar
37 | }
38 | })
39 | .constant("$starredProps", [
40 | // default list of Quick Access Properties. Can be overridden by making modification through the Global Settings dialog
41 | // go to Global Settings dialog to see their description
42 | "dir",
43 | "conf-path",
44 | "auto-file-renaming",
45 | "max-connection-per-server"
46 | ])
47 | .constant("$downloadProps", [
48 | // Similar to starred Quick Access properties but for adding new downloads.
49 | // go to Advance Download Options when adding a new download to view the list of possible options
50 | "header",
51 | "http-user",
52 | "http-passwd",
53 | "pause",
54 | "dir",
55 | "max-connection-per-server"
56 | ])
57 | .constant("$globalTimeout", 1000).name; // interval to update the individual downloads
58 |
--------------------------------------------------------------------------------
/src/js/services/deps.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 | import $ from "jquery";
3 | import _ from "lodash";
4 |
5 | export default angular
6 | .module("webui.services.deps", [])
7 | .value("$", $)
8 | .value("$_", _)
9 | .value("$json", JSON).name;
10 |
--------------------------------------------------------------------------------
/src/js/services/errors.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular
4 | .module("webui.services.errors", [])
5 | .value("$getErrorStatus", function(errorCode) {
6 | // normalize it to 0
7 | errorCode = errorCode - 1;
8 | switch (errorCode) {
9 | case 0:
10 | return "download was unsuccessful";
11 | case 1:
12 | return "unknown error occurred";
13 | case 2:
14 | return "time out occurred";
15 | case 3:
16 | return "resource was not found";
17 | case 4:
18 | return 'aria2 saw the specified number of "resource not found" error. See --max-file-not-found option';
19 | case 5:
20 | return "download aborted because download speed was too slow. See --lowest-speed-limit option";
21 | case 6:
22 | return "there were unfinished downloads";
23 | case 7:
24 | return "remote server did not support resume when resume was required to complete download";
25 | case 8:
26 | return "not enough disk space available";
27 | case 9:
28 | return "piece length was different from one in .aria2 control";
29 | case 10:
30 | return "downloading same file at that moment";
31 | case 11:
32 | return "downloading same info hash torrent at that moment";
33 | case 12:
34 | return "file already existed";
35 | case 13:
36 | return "renaming file failed";
37 | case 14:
38 | return "could not open existing file";
39 | case 15:
40 | return "could not create new file or truncate existing file";
41 | case 16:
42 | return "file I/O error occurred";
43 | case 17:
44 | return "could not create directory";
45 | case 18:
46 | return "name resolution failed";
47 | case 19:
48 | return "could not parse Metalink document";
49 | case 20:
50 | return "FTP command failed";
51 | case 21:
52 | return "HTTP response header was bad or unexpected";
53 | case 22:
54 | return "too many redirects occurred";
55 | case 23:
56 | return "HTTP authorization failed";
57 | case 24:
58 | return "could not parse bencoded file";
59 | case 25:
60 | return ' ".torrent" file was corrupted or missing information ';
61 | case 26:
62 | return "Magnet URI was bad";
63 | case 27:
64 | return "bad/unrecognized option was given or unexpected option argument was given";
65 | case 28:
66 | return "remote server was unable to handle the request due to a temporary overloading or maintenance";
67 | case 29:
68 | return "could not parse JSON-RPC request";
69 | }
70 | }).name;
71 |
--------------------------------------------------------------------------------
/src/js/services/modals.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular.module("webui.services.modals", []).factory("$modals", function() {
4 | var modals = {};
5 | return {
6 | // register a new modal, cb is the function which
7 | // will further recieve the args when called through
8 | // invoke
9 | register: function(name, cb) {
10 | modals[name] = cb;
11 | },
12 | // invoke an already registered modal, false if not found
13 | invoke: function(name, cb) {
14 | if (!modals[name]) return false;
15 | var args = Array.prototype.slice.call(arguments, 1);
16 | return modals[name].apply({}, args);
17 | }
18 | };
19 | }).name;
20 |
--------------------------------------------------------------------------------
/src/js/services/rpc/helpers.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular
4 | .module("webui.services.rpc.helpers", [
5 | "webui.services.deps",
6 | "webui.services.rpc",
7 | "webui.services.alerts"
8 | ])
9 | .factory("$rpchelpers", [
10 | "$_",
11 | "$rpc",
12 | "$alerts",
13 | function(_, rpc, alerts) {
14 | var miscellaneous = { version: "", enabledFeatures: [] };
15 | rpc.once("getVersion", [], function(data) {
16 | miscellaneous = data[0];
17 | });
18 | return {
19 | isFeatureEnabled: function(feature) {
20 | return miscellaneous.enabledFeatures.indexOf(feature) != -1;
21 | },
22 | getAria2Version: function() {
23 | return miscellaneous.version;
24 | },
25 | addUris: function(uris, settings, cb) {
26 | _.each(uris, function(uri) {
27 | var uri_parsed = [];
28 | // parse options passed in the URIs. E.g. http://ex1.com/f1.jpg --out=image.jpg --check-integrity
29 | var uriSettings = _.cloneDeep(settings);
30 | _.each(uri, function(uri_element) {
31 | if (uri_element.startsWith("--")) {
32 | var uri_options = uri_element.split(/--|=(.*)/);
33 | if (uri_options.length > 2) {
34 | uriSettings[uri_options[2]] = uri_options[3] || "true";
35 | }
36 | } else {
37 | uri_parsed.push(uri_element);
38 | }
39 | });
40 | // passing true to batch all the addUri calls
41 | rpc.once("addUri", [uri_parsed, uriSettings], cb, true);
42 | });
43 |
44 | // now dispatch all addUri syscalls
45 | rpc.forceUpdate();
46 | },
47 | addTorrents: function(txts, settings, cb) {
48 | _.each(txts, function(txt) {
49 | // passing true to batch all the addUri calls
50 | rpc.once("addTorrent", [txt, [], settings], cb, true);
51 | });
52 |
53 | // now dispatch all addUri syscalls
54 | rpc.forceUpdate();
55 | },
56 | addMetalinks: function(txts, settings, cb) {
57 | _.each(txts, function(txt) {
58 | // passing true to batch all the addUri calls
59 | rpc.once("addMetalink", [txt, settings], cb, true);
60 | });
61 |
62 | // now dispatch all addUri syscalls
63 | rpc.forceUpdate();
64 | }
65 | };
66 | }
67 | ]).name;
68 |
--------------------------------------------------------------------------------
/src/js/services/rpc/jsoncall.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular
4 | .module("webui.services.rpc.jsoncall", ["webui.services.deps", "webui.services.base64"])
5 | .factory("$jsoncall", [
6 | "$",
7 | "$json",
8 | "$base64",
9 | function($, JSON, base64) {
10 | return {
11 | init: function(conf) {
12 | this.avgTimeout = 2000;
13 | this.serverConf = conf;
14 | },
15 | ariaRequest: function(url, funcName, params, success, error) {
16 | var startTime = new Date();
17 | var conn = this;
18 | $.post({
19 | url: url,
20 | timeout: this.avgTimeout,
21 | contentType: "application/json",
22 | data: JSON.stringify({
23 | jsonrpc: 2.0,
24 | id: "webui",
25 | method: funcName,
26 | params: params
27 | }),
28 | success: function(data) {
29 | conn.avgTimeout = 2000 + 3 * (new Date() - startTime);
30 | return success(data);
31 | },
32 | error: error
33 | });
34 | },
35 | invoke: function(opts) {
36 | var rpc = this;
37 | var scheme = rpc.serverConf.encrypt ? "https" : "http";
38 | rpc.ariaRequest(
39 | scheme +
40 | "://" +
41 | rpc.serverConf.host +
42 | ":" +
43 | rpc.serverConf.port +
44 | (rpc.serverConf.path || "/jsonrpc"),
45 | opts.name,
46 | opts.params,
47 | opts.success,
48 | function() {
49 | // check if authentication details are given, if yes then use a hack to support
50 | // http authentication otherwise emit error
51 | if (!rpc.serverConf.auth || !rpc.serverConf.auth.user) {
52 | console.log("jsonrpc disconnect!!!");
53 | return opts.error();
54 | }
55 |
56 | var authUrl =
57 | scheme +
58 | "://" +
59 | rpc.serverConf.auth.user +
60 | ":" +
61 | rpc.serverConf.auth.pass +
62 | "@" +
63 | rpc.serverConf.host +
64 | ":" +
65 | rpc.serverConf.port +
66 | (rpc.serverConf.path || "/jsonrpc");
67 |
68 | // hack is to basically inject an image with same uri as the aria2 rpc url,
69 | // most browsers will then cache the authentication details and we dont have
70 | // to give them next time we make a request
71 | var img = $("
").attr("src", authUrl);
72 | $("body").append(img);
73 | img.remove();
74 |
75 | // timeout to let the image load and then make a request,
76 | setTimeout(function() {
77 | rpc.ariaRequest(authUrl, opts.name, opts.params, opts.success, function() {
78 | console.log("jsonrpc disconnect!!!");
79 | return opts.error();
80 | });
81 | }, rpc.avgTimeout);
82 | }
83 | );
84 | }
85 | };
86 | }
87 | ]).name;
88 |
--------------------------------------------------------------------------------
/src/js/services/rpc/sockcall.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular
4 | .module("webui.services.rpc.sockcall", [
5 | "webui.services.deps",
6 | "webui.services.utils",
7 | "webui.services.base64",
8 | "webui.services.alerts"
9 | ])
10 | .factory("$sockcall", [
11 | "$_",
12 | "$json",
13 | "$name",
14 | "$utils",
15 | "$alerts",
16 | function(_, JSON, name, utils, alerts) {
17 | var sockRPC = {
18 | // true when sockrpc is ready to be used,
19 | // false when either initializing
20 | // or no support for web sockets
21 | initialized: false,
22 |
23 | // ongoing connection handles containing connection id and callbacks
24 | handles: [],
25 |
26 | // websocket connection socket used for all connections
27 | sock: null,
28 |
29 | // connection configuration
30 | conf: null,
31 |
32 | // socket connection scheme, default to unencrypted connection
33 | scheme: "ws",
34 |
35 | // called when a connection error occurs
36 | onerror: function(ev) {
37 | _.each(sockRPC.handles, function(h) {
38 | h.error();
39 | });
40 | sockRPC.handles = [];
41 | sockRPC.initialized = false;
42 | if (sockRPC.onready) {
43 | sockRPC.onready();
44 | sockRPC.onready = null;
45 | }
46 | },
47 | onclose: function(ev) {
48 | if (sockRPC.handles && sockRPC.handles.length)
49 | sockRPC.onerror("Connection reset while calling aria2");
50 | sockRPC.initialized = false;
51 | if (sockRPC.onready) {
52 | sockRPC.onready();
53 | sockRPC.onready = null;
54 | }
55 | },
56 |
57 | // when connection opens
58 | onopen: function() {
59 | console.log("websocket initialized!!!");
60 | sockRPC.initialized = true;
61 | if (sockRPC.onready) {
62 | sockRPC.onready();
63 | sockRPC.onready = null;
64 | }
65 | },
66 |
67 | // when message is recieved
68 | onmessage: function(message) {
69 | var data = JSON.parse(message.data);
70 |
71 | // reverse loop because we are deleting elements
72 | // while looping over the old items
73 | for (var i = sockRPC.handles.length - 1; i >= 0; i--) {
74 | if (sockRPC.handles[i].id === data.id) {
75 | sockRPC.handles[i].success(data);
76 | sockRPC.handles.splice(i, 1);
77 | return;
78 | }
79 | }
80 | },
81 |
82 | // call to use the rpc
83 | invoke: function(opts) {
84 | var data = {
85 | jsonrpc: 2.0,
86 | id: utils.uuid(),
87 | method: opts.name,
88 | params: opts.params && opts.params.length ? opts.params : undefined
89 | };
90 |
91 | if (data.params && !data.params.length) data.params = undefined;
92 |
93 | sockRPC.handles.push({
94 | success: opts.success || angular.noop,
95 | error: opts.error || angular.noop,
96 | id: data.id
97 | });
98 | sockRPC.sock.send(JSON.stringify(data));
99 | },
100 |
101 | // should be called initially to start using the sock rpc
102 | // onready is called when initial connection is resolved
103 | init: function(conf, onready) {
104 | sockRPC.initialized = false;
105 | if (sockRPC.onready) {
106 | // make previous call is resolved
107 | sockRPC.onready();
108 | sockRPC.onready = null;
109 | }
110 |
111 | if (typeof WebSocket == "undefined") {
112 | alerts.addAlert("Web sockets are not supported! Falling back to JSONP.", "info");
113 | onready();
114 | return;
115 | }
116 | sockRPC.conf = conf || sockRPC.conf;
117 |
118 | sockRPC.scheme = sockRPC.conf.encrypt ? "wss" : "ws";
119 |
120 | if (sockRPC.sock) {
121 | sockRPC.sock.onopen = sockRPC.sock.onmessage = sockRPC.sock.onerror = sockRPC.sock.onclose = null;
122 | sockRPC.onerror({ message: "Changing the websocket aria2 server details" });
123 | }
124 |
125 | try {
126 | var authUrl =
127 | sockRPC.scheme + "://" + conf.host + ":" + conf.port + (conf.path || "/jsonrpc");
128 | if (sockRPC.conf.auth && sockRPC.conf.auth.user && sockRPC.conf.auth.pass) {
129 | authUrl =
130 | sockRPC.scheme +
131 | "://" +
132 | sockRPC.conf.auth.user +
133 | ":" +
134 | sockRPC.conf.auth.pass +
135 | "@" +
136 | sockRPC.conf.host +
137 | ":" +
138 | sockRPC.conf.port +
139 | (conf.path || "/jsonrpc");
140 | }
141 |
142 | sockRPC.sock = new WebSocket(authUrl);
143 | sockRPC.sock.onopen = sockRPC.onopen;
144 | sockRPC.sock.onclose = sockRPC.onclose;
145 | sockRPC.sock.onerror = sockRPC.onerror;
146 | sockRPC.sock.onmessage = sockRPC.onmessage;
147 | sockRPC.onready = onready;
148 | } catch (ex) {
149 | // ignoring IE security exception on local ip addresses
150 | console.log("not using websocket for aria2 rpc due to: ", ex);
151 | alerts.addAlert("Web sockets not working due to " + ex.message, "info");
152 | onready();
153 | }
154 | }
155 | };
156 |
157 | return sockRPC;
158 | }
159 | ]).name;
160 |
--------------------------------------------------------------------------------
/src/js/services/rpc/syscall.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular
4 | .module("webui.services.rpc.syscall", [
5 | "webui.services.rpc.jsoncall",
6 | "webui.services.rpc.sockcall",
7 | "webui.services.utils",
8 | "webui.services.alerts"
9 | ])
10 | .factory("$syscall", [
11 | "$log",
12 | "$jsoncall",
13 | "$sockcall",
14 | "$alerts",
15 | function(log, jsonRPC, sockRPC, alerts) {
16 | return {
17 | state: "none",
18 | // called to initialize the rpc interface, call everytime configuration changes
19 | // conf has the following structure:
20 | // {
21 | // host (string): host for the aria2 server
22 | // port (number): port number for the aria2 server
23 | // encrypt (boolean, optional): true if encryption is enabled in the aria2 server
24 | // auth (optional): {
25 | // token (string): secret token for authentication (--rpc-secret)
26 | // user (string): username for http authentication if enabled
27 | // pass (string): password for the http authentication if enabled
28 | // }
29 | init: function(conf) {
30 | console.log("Syscall is initializing to", conf);
31 | this.state = "initializing";
32 | jsonRPC.init(conf);
33 | var syscall = this;
34 | sockRPC.init(conf, function() {
35 | console.log("Syscall is ready");
36 | syscall.state = "ready";
37 | });
38 | },
39 |
40 | // call this to start an rpc call, opts has the following structure:
41 | // {
42 | // name (string): name of the actual aria2 syscall
43 | // success (function): callback called with (parsed) data if rpc is successfull
44 | // error (function): callback called when an error occurs
45 | // params (array, optional): the params for some syscall (like multicall) and is optional for others
46 | // }
47 | invoke: function(opts) {
48 | opts.success = opts.success || angular.noop;
49 | opts.error = opts.error || angular.noop;
50 |
51 | if (sockRPC.initialized) {
52 | return sockRPC.invoke(opts);
53 | } else {
54 | return jsonRPC.invoke(opts);
55 | }
56 | }
57 | };
58 | }
59 | ]).name;
60 |
--------------------------------------------------------------------------------
/src/js/services/settings/filters.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular
4 | .module("webui.services.settings.filters", [])
5 | .value("$globalsettingsexclude", ["checksum", "index-out", "out", "pause", "select-file"])
6 | .value("$waitingsettingsexclude", [
7 | "dry-run",
8 | "metalink-base-uri",
9 | "parameterized-uri",
10 | "pause",
11 | "piece-length"
12 | ])
13 | .value("$activesettingsfilter", [
14 | "bt-max-peers",
15 | "bt-request-peer-speed-limit",
16 | "bt-remove-unselected-file",
17 | "max-download-limit",
18 | "max-upload-limit"
19 | ]).name;
20 |
--------------------------------------------------------------------------------
/src/js/services/utils.js:
--------------------------------------------------------------------------------
1 | import angular from "angular";
2 |
3 | export default angular
4 | .module("webui.services.utils", ["webui.services.configuration"])
5 | .factory("$utils", [
6 | "$filter",
7 | "$name",
8 | "$titlePattern",
9 | function(filter, $name, $titlePattern) {
10 | var rnd16 = (function() {
11 | "use strict";
12 | var rndBuffer = new Uint8Array(16);
13 | var rnd16Weak = function() {
14 | for (var i = 0, r; i < 16; i++) {
15 | if (!(i % 0x3)) r = (Math.random() * 0x100000000) | 0;
16 | rndBuffer[i] = (r >>> ((i & 0x3) << 0x3)) & 0xff;
17 | }
18 | return rndBuffer;
19 | };
20 |
21 | if (!window.crypto || !crypto.getRandomValues) {
22 | return rnd16Weak;
23 | }
24 | return function() {
25 | try {
26 | crypto.getRandomValues(rndBuffer);
27 | return rndBuffer;
28 | } catch (ex) {
29 | // Entropy might be exhausted
30 | return rnd16Weak();
31 | }
32 | };
33 | })();
34 |
35 | var utils = {
36 | fmtsize: function(len) {
37 | len = +len; // coerce to number
38 | if (len <= 1024) {
39 | return len.toFixed(0) + " B";
40 | }
41 | len /= 1024;
42 | if (len <= 1024) {
43 | return len.toFixed(1) + " KB";
44 | }
45 | len /= 1024;
46 | if (len <= 1024) {
47 | return len.toFixed(2) + " MB";
48 | }
49 | len /= 1024;
50 | return len.toFixed(3) + " GB";
51 | },
52 |
53 | fmtspeed: function(speed) {
54 | return utils.fmtsize(speed) + "/s";
55 | },
56 | // saves the key value pair in cookies
57 | setCookie: function(key, value) {
58 | var exdate = new Date();
59 | exdate.setDate(exdate.getDate() + 30 * 12);
60 | var cvalue = escape(JSON.stringify(value)) + "; expires=" + exdate.toUTCString();
61 | document.cookie = key + "=" + cvalue;
62 | },
63 | // gets a value for a key stored in cookies
64 | getCookie: function(key) {
65 | var chunks = document.cookie.split(";");
66 | for (var i = 0; i < chunks.length; i++) {
67 | var ckey = chunks[i].substr(0, chunks[i].indexOf("=")).replace(/^\s+|\s+$/g, "");
68 | var cvalue = chunks[i].substr(chunks[i].indexOf("=") + 1);
69 | if (key == ckey) {
70 | return JSON.parse(unescape(cvalue));
71 | }
72 | }
73 |
74 | return null;
75 | },
76 | getFileName: function(path) {
77 | var seed = path.split(/[/\\]/);
78 | return seed[seed.length - 1];
79 | },
80 | uuid: (function() {
81 | var bt = [];
82 | for (var i = 0; i < 0x100; ++i) {
83 | bt.push((i + 0x100).toString(16).substr(1));
84 | }
85 | Object.freeze(bt);
86 |
87 | return function() {
88 | var r = rnd16();
89 | r[6] = (r[6] & 0xf) | 0x40; // Version 4
90 | r[8] = (r[8] & 0x3f) | 0x80; // Version 4y
91 | return (
92 | bt[r[0]] +
93 | bt[r[1]] +
94 | bt[r[2]] +
95 | bt[r[3]] +
96 | "-" +
97 | bt[r[4]] +
98 | bt[r[5]] +
99 | "-" +
100 | bt[r[6]] +
101 | bt[r[7]] +
102 | "-" +
103 | bt[r[8]] +
104 | bt[r[9]] +
105 | "-" +
106 | bt[r[10]] +
107 | bt[r[11]] +
108 | bt[r[12]] +
109 | bt[r[13]] +
110 | bt[r[14]] +
111 | bt[r[15]]
112 | );
113 | };
114 | })(),
115 | randStr: function() {
116 | return utils.uuid();
117 | },
118 |
119 | // maps the array in place to the destination
120 | // arr, dest (optional): array
121 | // func: a merge mapping func, see ctrls/download.js
122 | mergeMap: function(arr, dest, func) {
123 | if (!dest) {
124 | dest = [];
125 | }
126 |
127 | for (var i = 0, e = Math.min(arr.length, dest.length); i < e; ++i) {
128 | func(arr[i], dest[i]);
129 | }
130 |
131 | // Insert newly created downloads
132 | while (i < arr.length) {
133 | dest.push(func(arr[i++]));
134 | }
135 |
136 | // Truncate if necessary.
137 | dest.length = arr.length;
138 |
139 | return dest;
140 | },
141 | // get info title from global statistics
142 | getTitle: function(stats) {
143 | if (!stats) {
144 | stats = {};
145 | }
146 | return $titlePattern
147 | .replace("{active}", stats.numActive || "⌛")
148 | .replace("{waiting}", stats.numWaiting || "⌛")
149 | .replace("{download_speed}", utils.fmtspeed(stats.downloadSpeed) || "⌛")
150 | .replace("{upload_speed}", utils.fmtspeed(stats.uploadSpeed) || "⌛")
151 | .replace("{stopped}", stats.numStopped || "⌛")
152 | .replace("{name}", $name);
153 | },
154 |
155 | // get download chunks from aria2 bitfield
156 | getChunksFromHex: function(bitfield, numOfPieces) {
157 | var chunks = [],
158 | len = 0,
159 | numPieces = parseInt(numOfPieces);
160 | if (!bitfield) return [];
161 |
162 | var totalDownloaded = 0;
163 | if (numPieces > 1) {
164 | var chunk_ratio = 1 / numPieces;
165 | var piecesProcessed = 0;
166 | for (var i = 0; i < bitfield.length; i++) {
167 | var hex = parseInt(bitfield[i], 16);
168 | for (var j = 1; j <= 4; j++) {
169 | var bit = hex & (1 << (4 - j));
170 | if (bit) totalDownloaded++;
171 | var prog = !!bit;
172 | if (len >= 1 && chunks[len - 1].show == prog) {
173 | chunks[len - 1].ratio += chunk_ratio;
174 | } else {
175 | chunks.push({
176 | ratio: chunk_ratio,
177 | show: prog
178 | });
179 | len++;
180 | }
181 | piecesProcessed++;
182 | if (piecesProcessed == numPieces) return chunks;
183 | }
184 | }
185 | }
186 | return chunks;
187 | }
188 | };
189 | return utils;
190 | }
191 | ]).name;
192 |
--------------------------------------------------------------------------------
/src/js/translate/cs_CZ.js:
--------------------------------------------------------------------------------
1 | if (typeof translations == "undefined") {
2 | translations = {};
3 | }
4 |
5 | translations.cs_CZ = {
6 | // header
7 | Search: "Hledat",
8 | // Nav menu
9 | Add: "Přidat",
10 | "By URIs": "Z URI",
11 | "By Torrents": "Z torrentu",
12 | "By Metalinks": "Z metalinku",
13 | Manage: "Spravovat",
14 | "Pause All": "Zastavit vše",
15 | "Resume Paused": "Obnovit zastavené",
16 | "Purge Completed": "Odstranit hotové",
17 | "Shutdown Server": "Vypnout server",
18 | Settings: "Nastavení",
19 | "Connection Settings": "Nastavení připojení",
20 | "Global Settings": "Obecné nastavení",
21 | "Server info": "Informace o serveru",
22 | "About and contribute": "Informace",
23 | "Toggle navigation": "Přepnout ovládání",
24 | // body
25 | // nav side bar
26 | Miscellaneous: "Různé",
27 | "Global Statistics": "Globální statistika",
28 | About: "Informace",
29 | Displaying: "Zobrazuji",
30 | of: "z",
31 | downloads: "stahování",
32 | Language: "Jazyk",
33 | // download filters
34 | "Download Filters": "Filtry stahování",
35 | Running: "Stahují se",
36 | Active: "Aktivní",
37 | Waiting: "Čekající",
38 | Complete: "Hotové",
39 | Error: "Chyba",
40 | Paused: "Zastavené",
41 | Removed: "Odstraněné",
42 | "Hide linked meta-data": "Skrýt připojená meta-data",
43 | Toggle: "Prohodit",
44 | "Reset filters": "Smazat filtry",
45 | // download status
46 | Verifying: "Ověřování",
47 | "Verify Pending": "Čekání na ověření",
48 | // starred properties
49 | "Quick Access Settings": "Rychlé nastavení",
50 | Save: "Uložit",
51 | "Save settings": "Uložit nastavení",
52 | "Currently no download in line to display, use the": "Není co zobrazit, použijte",
53 | "download button to start downloading files!": "tlačítko pro stáhnutí souborů!",
54 | Peers: "Zdroje",
55 | "More Info": "Víc informací",
56 | Remove: "Odstranit",
57 | "# of": "# z",
58 | Length: "Délka",
59 | // modals
60 | "Add Downloads By URIs": "Přidat stahování z URI",
61 | "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
62 | "- Můžete začít stahovat více souborů v jeden okamžik, tak že na každý řádek dáte jinou URI",
63 | "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
64 | "- Také můžete přidat více URI (Zrcadel) pro *stejný* soubor, tak že je dáte na jeden řádek oddělené mezerou ",
65 | "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "- URI může být HTTP(S)/FTP/BitTorrent-Magnet.",
66 | "Download settings": "Nastavení stahování",
67 | "Advanced settings": "Pokročilé nastavení",
68 | Cancel: "Zrušit",
69 | Start: "Spustit",
70 | Choose: "Zvolit",
71 | "Quick Access (shown on the main page)": "Rychlý přístup (Zobrazení na hlavní stránce)",
72 | // add torrent modal
73 | "Add Downloads By Torrents": "Přidat stahování z torrentu",
74 | "- Select the torrent from the local filesystem to start the download.":
75 | "- Pro stahování vyberte torrent soubor z disku",
76 | "- You can select multiple torrents to start multiple downloads.":
77 | " - Můžete zvolit víc torrentů pro spuštění více stahování",
78 | "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
79 | '- Pro stahování pomocí BitTorrent-Magnet URL, použijte možnost "Z URI"',
80 | "Select Torrents": "Vyberte torrenty",
81 | "Select a Torrent": "Vyberte torrent",
82 | // add metalink modal
83 | "Add Downloads By Metalinks": "Přidat stahovní pomocí metalinku",
84 | "Select Metalinks": "Výběr metalinků",
85 | "- Select the Metalink from the local filesystem to start the download.":
86 | "- Pro stahování vyberte metalink soubor z disku",
87 | "- You can select multiple Metalinks to start multiple downloads.":
88 | "- Můžete zvolit víc mentalinků pro spuštění více stahování",
89 | "Select a Metalink": "Vyberte metalink",
90 | // select file modal
91 | "Choose files to start download for": "Vyberte soubory pro stažení",
92 | "Select to download": "Vyberte ke stažení",
93 | // settings modal
94 | "Aria2 RPC host and port": "Aria2 RPC host a port",
95 | "Enter the host": "Zadejte hosta",
96 | "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
97 | "Zadejte IP nebo DNS jméno serveru na kterém běží Aria2 RPC (výchozí: localhost)",
98 | "Enter the port": "Zadejte port",
99 | "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
100 | "Zadejte port serveru na kterém běží Aria2 RPC (výchozí: 6800)",
101 | "Enter the RPC path": "Zadejte cestu k RPC",
102 | "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
103 | "Zadejte cestu k endpointu Aria2 RPC (výchozí: /jsonrpc)",
104 | "SSL/TLS encryption": "SSL/TLS šifrování",
105 | "Enable SSL/TLS encryption": "Zapnout SSL/TLS šifrování",
106 | "Enter the secret token (optional)": "Zadejte bezpečnostní token (volitelné)",
107 | "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
108 | "Zadejte bezpečnostní token k Aria2 RPC (nechte prázné pokud autentifikace není nastavena)",
109 | "Enter the username (optional)": "Zadejte uživatelské jméno (volitelné)",
110 | "Enter the Aria2 RPC username (empty if authentication not enabled)":
111 | "Zadejte uživatelské jméno pro Aria2 RPC (nechte prázné pokud autentifikace není nastavena)",
112 | "Enter the password (optional)": "Zadejte heslo (volitelné)",
113 | "Enter the Aria2 RPC password (empty if authentication not enabled)":
114 | "Zadej heslo k Aria2 RPC (nechte prázné pokud autentifikace není nastavena)",
115 | "Enter base URL (optional)": "Zadejte kořenovou URL serveru (volitelné)",
116 | "Direct Download": "Přímé stažení",
117 | "If supplied, links will be created to enable direct download from the Aria2 server.":
118 | "Jestliže je nastaveno, je možné stáhnout soubor přímo z Aria2 serveru.",
119 | "(Requires appropriate webserver to be configured.)":
120 | "(Je třeba udělat patřičnou konfiguraci webserveru)",
121 | "Save Connection configuration": "Uložit nastavení",
122 | Filter: "Filtr",
123 | // server info modal
124 | "Aria2 server info": "Informace o Aria2 serveru",
125 | "Aria2 Version": "Verze Aria2",
126 | "Features Enabled": "Zapnuté funkce",
127 | // about modal
128 | "To download the latest version of the project, add issues or to contribute back, head on to":
129 | "Ke stažení aktuální verze, nahlášení problému či přispění, zamiřte na",
130 | "Or you can open the latest version in the browser through":
131 | "Nebo můžete spustit aktuální verzi pomocí:",
132 | Close: "Zavřít",
133 | // labels
134 | "Download status": "Stav stahování",
135 | "Download Speed": "Rychlost stahování",
136 | "Upload Speed": "Rychlost nahrávání",
137 | "Estimated time": "Odhadovaný čas",
138 | "Download Size": "Velikost",
139 | Downloaded: "Staženo",
140 | Progress: "Průběh",
141 | "Download Path": "Cesta",
142 | Uploaded: "Nahráno",
143 | "Download GID": "GID",
144 | "Number of Pieces": "Počet fragmentů",
145 | "Piece Length": "Délka fragmentu",
146 |
147 | //alerts
148 | "The last connection attempt was unsuccessful. Trying another configuration":
149 | "Poslední pokus o připojení se nezdařil. Zkuste jiné nastavení",
150 | "Oh Snap!": "A sakra!",
151 | "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
152 | "Nemohu se připojit k Aria2 RPC serveru. Zkusím to znovu za 10 sekund. Možná by se to chtělo podívat do Nastavení > Nastavení připojení",
153 | "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
154 | "Během připojování k Aria2 RPC serveru selhala autentifikace. Zkusím to znovu za 10 sekund. Možná by se to chtělo podívat do Nastavení > Nastavení připojení",
155 | "Successfully connected to Aria2 through its remote RPC …":
156 | "Úspěšně připojeno k Aria2 pomocí RPC...",
157 | "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
158 | "Úspěšně připojeno k Aria2 pomocí RPC, ale připojení není zabezpečené. Pro úplné zabezpečení přidejte bezpečnostní token při spuštění Aria2 (pomocí možnosti --rpc-secret) ",
159 | "Trying to connect to aria2 using the new connection configuration":
160 | "Zkouším se připojit k Aria2 za pomocí nového nastavení",
161 | // {{name}} refers to the download name, do not modify.
162 | "Remove {{name}} and associated meta-data?": "Odstranit {{name}} a příslušná meta-data?"
163 | };
164 |
--------------------------------------------------------------------------------
/src/js/translate/de_DE.js:
--------------------------------------------------------------------------------
1 | if (typeof translations == "undefined") {
2 | translations = {};
3 | }
4 |
5 | translations.de_DE = {
6 | // header
7 | Search: "Suche",
8 | // Nav menu
9 | Add: "Hinzufügen",
10 | "By URIs": "mit URIs",
11 | "By Torrents": "mit Torrents",
12 | "By Metalinks": "mit Metalinks",
13 | Manage: "Verwalten",
14 | "Pause All": "Alle anhalten",
15 | "Resume Paused": "Angehaltene fortsetzen",
16 | "Purge Completed": "Fertige entfernen",
17 | Settings: "Einstellungen",
18 | "Connection Settings": "Verbindungseinstellungen",
19 | "Global Settings": "Globale Einstellungen",
20 | "Server info": "Server Information",
21 | "About and contribute": "Über webui-aria2",
22 | "Toggle navigation": "Navigation an/ausschalten",
23 | // body
24 | // nav side bar
25 | Miscellaneous: "Verschiedenes",
26 | "Global Statistics": "Globale Statistiken",
27 | About: "Über",
28 | Displaying: "Anzeige",
29 | of: "von",
30 | downloads: "Downloads",
31 | Language: "Sprache",
32 | // download filters
33 | "Download Filters": "Download Filter",
34 | Running: "Laufende",
35 | Active: "Aktive",
36 | Waiting: "Wartende",
37 | Complete: "Fertige",
38 | Error: "Fehler",
39 | Paused: "Angehaltene",
40 | Removed: "Gelöschte",
41 | "Hide linked meta-data": "Blende verlinkte Meta-Daten aus",
42 | Toggle: "Umschalten",
43 | "Reset filters": "Filter zurücksetzen",
44 | // starred properties
45 | "Quick Access Settings": "Ausgewählte Einstellungen",
46 | "Save settings": "Einstellungen speichern",
47 | "Currently no download in line to display, use the":
48 | "Aktuell sind keine Downloads vorhanden, bitte benutz den",
49 | "download button to start downloading files!":
50 | "Download Link um den Download von Dateien zu beginnen!",
51 | Peers: "Peers",
52 | "More Info": "Mehr Infos",
53 | Remove: "Entfernen",
54 | "# of": "# von",
55 | Length: "Länge",
56 | // modals
57 | "Add Downloads By URIs": "Downloads anhand von URIs hinzufügen",
58 | "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
59 | "- Es können mehrere Downloads (Dateien) gleichzeitig hinzugefügt werden, indem jede URI in eine separate Zeile eingegeben wird.",
60 | "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
61 | "- Es können auch mehrere URIs (Spiegelserver) für *dieselbe* Datei durch Leerzeichen getrennt angegeben werden.",
62 | "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
63 | "- Eine URI kann folgende Protokolle besitzen: HTTP(S)/FTP/BitTorrent-Magnet.",
64 | "Download settings": "Download Einstellungen",
65 | "Advanced settings": "Erweiterte Einstellungen",
66 | Cancel: "Abbrechen",
67 | Start: "Beginnen",
68 | Choose: "Auswählen",
69 | "Quick Access (shown on the main page)": "Schnellzugriff (Anzeige auf der Hauptseite)",
70 | // add torrent modal
71 | "Add Downloads By Torrents": "Downloads mit Torrents hinzufügen",
72 | "- Select the torrent from the local filesystem to start the download.":
73 | "- Wähle ein Torrent vom lokalen Dateisystem um den Download zu starten",
74 | "- You can select multiple torrents to start multiple downloads.":
75 | "- Es können mehrere Torrents ausgewählt werden um mehrere Downloads zu starten",
76 | "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
77 | "- Für BitTorrent-Magnet URLs benutz die Option 'Mit URIs hinzufügen'",
78 | "Select Torrents": "Wähle Torrents",
79 | "Select a Torrent": "Wähle ein Torrent",
80 | // add metalink modal
81 | "Add Downloads By Metalinks": "Download mit Metalinks hinzufügen",
82 | "Select Metalinks": "Wähle Metalinks",
83 | "- Select the Metalink from the local filesystem to start the download.":
84 | "- Wähle ein Metalink vom lokalen Dateisystem um den Download zu starten",
85 | "- You can select multiple Metalinks to start multiple downloads.":
86 | "- Es können mehrere Metalinks ausgewählt werden um mehrere Downloads zu starten",
87 | "Select a Metalink": "Wähle einen Metalink",
88 | // select file modal
89 | "Choose files to start download for": "Wähle Dateien für den Download aus",
90 | "Select to download": "Wähle zum Download",
91 | // settings modal
92 | "Aria2 RPC host and port": "Aria2 RPC host und port",
93 | "Enter the host": "Host",
94 | "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
95 | "Gib die IP oder den DNS Namen des Servers ein, auf dem Aria2 läuft und mit dem du eine RPC-Verbindung etablieren willst (Standard: localhost)",
96 | "Enter the port": "Port",
97 | "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
98 | "Gib den Port des Servers ein, auf dem der RPC-Dienst von Aria2 läuft (Standard: 6800)",
99 | "Enter the RPC path": "RPC Pfad",
100 | "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
101 | "Gib den Pfad zum Aria2 RPC Endpunkt an (Standard: /jsonrpc)",
102 | "SSL/TLS encryption": "SSL/TLS",
103 | "Enable SSL/TLS encryption": "Aktiviere SSL/TLS Verschlüsselung",
104 | "Enter the secret token (optional)": "Secret Token (optional)",
105 | "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
106 | "Gib den Aria2 RPC secret Token ein (leer lassen falls keine Authentifizierung aktiv)",
107 | "Enter the username (optional)": "Benutzername (optional)",
108 | "Enter the Aria2 RPC username (empty if authentication not enabled)":
109 | "Gib den Aria2 RPC Benutzernamen ein (leer lassen falls keine Authentifizierung aktiv)",
110 | "Enter the password (optional)": "Passwort (optional)",
111 | "Enter the Aria2 RPC password (empty if authentication not enabled)":
112 | "Gib das Aria2 RPC Passwort ein (leer lassen falls keine Authentifizierung aktiv)",
113 | "Enter base URL (optional)": "Base URL (optional)",
114 | "Direct Download": "Direkter Download",
115 | "If supplied, links will be created to enable direct download from the Aria2 server.":
116 | "Falls angegeben, werden Links erstellt um einen direkten Download vom Aria2 Server zu ermöglichen",
117 | "(Requires appropriate webserver to be configured.)":
118 | "(Es wird ein entsprechend konfigurierter WebServer benötigt.)",
119 | "Save Connection configuration": "Speichern der Verbindungseinstellung",
120 | Filter: "Filter",
121 | // server info modal
122 | "Aria2 server info": "Aria2 Server Info",
123 | "Aria2 Version": "Aria2 Version",
124 | "Features Enabled": "Aktive Funktionen",
125 | // about modal
126 | "To download the latest version of the project, add issues or to contribute back, head on to":
127 | "Um die neuste Version des Projects zu laden, Fehler zu melden oder sich zu beteiligen, besuch",
128 | "Or you can open the latest version in the browser through":
129 | "Oder du kannst die neueste Version direkt in deinem Browser verwenden",
130 | Close: "Schließen",
131 | // lables
132 | "Download status": "Download Status",
133 | "Download Speed": "Download Geschwindigkeit",
134 | "Upload Speed": "Upload Geschwindigkeit",
135 | "Estimated time": "Geschätzte Zeit",
136 | "Download Size": "Download Größe",
137 | Downloaded: "Heruntergeladen",
138 | Progress: "Fortschritt",
139 | "Download Path": "Download Pfad",
140 | Uploaded: "Hochgeladen",
141 | "Download GID": "Download GID",
142 | "Number of Pieces": "Anzahl der Stücken",
143 | "Piece Length": "Größe der Stücken"
144 | };
145 |
--------------------------------------------------------------------------------
/src/js/translate/en_US.js:
--------------------------------------------------------------------------------
1 | if (typeof translations == "undefined") {
2 | translations = {};
3 | }
4 |
5 | translations.en_US = {
6 | // header
7 | Search: "Search",
8 | // Nav menu
9 | Add: "Add",
10 | "By URIs": "By URIs",
11 | "By Torrents": "By Torrents",
12 | "By Metalinks": "By Metalinks",
13 | Manage: "Manage",
14 | "Pause All": "Pause All",
15 | "Resume Paused": "Resume Paused",
16 | "Purge Completed": "Purge Completed",
17 | Settings: "Settings",
18 | "Connection Settings": "Connection Settings",
19 | "Global Settings": "Global Settings",
20 | "Server info": "Server info",
21 | "About and contribute": "About and contribute",
22 | "Toggle navigation": "Toggle navigation",
23 | // body
24 | // nav side bar
25 | Miscellaneous: "Miscellaneous",
26 | "Global Statistics": "Global Statistics",
27 | About: "About",
28 | Displaying: "Displaying",
29 | of: "of",
30 | downloads: "downloads",
31 | Language: "Language",
32 | // download filters
33 | "Download Filters": "Download Filters",
34 | Running: "Running",
35 | Active: "Active",
36 | Waiting: "Waiting",
37 | Complete: "Complete",
38 | Error: "Error",
39 | Paused: "Paused",
40 | Removed: "Removed",
41 | "Hide linked meta-data": "Hide linked meta-data",
42 | Toggle: "Toggle",
43 | "Reset filters": "Reset filters",
44 | // download status
45 | Verifying: "Verifying",
46 | "Verify Pending": "Verify Pending",
47 | // starred properties
48 | "Quick Access Settings": "Quick Access Settings",
49 | Save: "Save",
50 | "Save settings": "Save settings",
51 | "Currently no download in line to display, use the":
52 | "Currently no download in line to display, use the",
53 | "download button to start downloading files!": "download button to start downloading files!",
54 | Peers: "Peers",
55 | "More Info": "More Info",
56 | Remove: "Remove",
57 | "# of": "# of",
58 | Length: "Length",
59 | // modals
60 | "Add Downloads By URIs": "Add Downloads By URIs",
61 | "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
62 | "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.",
63 | "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
64 | "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.",
65 | "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.",
66 | "Download settings": "Download settings",
67 | "Advanced settings": "Advanced settings",
68 | Cancel: "Cancel",
69 | Start: "Start",
70 | Choose: "Choose",
71 | "Quick Access (shown on the main page)": "Quick Access (shown on the main page)",
72 | // add torrent modal
73 | "Add Downloads By Torrents": "Add Downloads By Torrents",
74 | "- Select the torrent from the local filesystem to start the download.":
75 | "- Select the torrent from the local filesystem to start the download.",
76 | "- You can select multiple torrents to start multiple downloads.":
77 | "- You can select multiple torrents to start multiple downloads.",
78 | "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
79 | "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.",
80 | "Select Torrents": "Select Torrents",
81 | "Select a Torrent": "Select a Torrent",
82 | // add metalink modal
83 | "Add Downloads By Metalinks": "Add Downloads By Metalinks",
84 | "Select Metalinks": "Select Metalinks",
85 | "- Select the Metalink from the local filesystem to start the download.":
86 | "- Select the Metalink from the local filesystem to start the download.",
87 | "- You can select multiple Metalinks to start multiple downloads.":
88 | "- You can select multiple Metalinks to start multiple downloads.",
89 | "Select a Metalink": "Select a Metalink",
90 | // select file modal
91 | "Choose files to start download for": "Choose files to start download for",
92 | "Select to download": "Select to download",
93 | // settings modal
94 | "Aria2 RPC host and port": "Aria2 RPC host and port",
95 | "Enter the host": "Enter the host",
96 | "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
97 | "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)",
98 | "Enter the port": "Enter the port",
99 | "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
100 | "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)",
101 | "Enter the RPC path": "Enter the RPC path",
102 | "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
103 | "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)",
104 | "SSL/TLS encryption": "SSL/TLS encryption",
105 | "Enable SSL/TLS encryption": "Enable SSL/TLS encryption",
106 | "Enter the secret token (optional)": "Enter the secret token (optional)",
107 | "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
108 | "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)",
109 | "Enter the username (optional)": "Enter the username (optional)",
110 | "Enter the Aria2 RPC username (empty if authentication not enabled)":
111 | "Enter the Aria2 RPC username (empty if authentication not enabled)",
112 | "Enter the password (optional)": "Enter the password (optional)",
113 | "Enter the Aria2 RPC password (empty if authentication not enabled)":
114 | "Enter the Aria2 RPC password (empty if authentication not enabled)",
115 | "Enter base URL (optional)": "Enter base URL (optional)",
116 | "Direct Download": "Direct Download",
117 | "If supplied, links will be created to enable direct download from the Aria2 server.":
118 | "If supplied, links will be created to enable direct download from the Aria2 server.",
119 | "(Requires appropriate webserver to be configured.)":
120 | "(Requires appropriate webserver to be configured.)",
121 | "Save Connection configuration": "Save Connection configuration",
122 | Filter: "Filter",
123 | // server info modal
124 | "Aria2 server info": "Aria2 server info",
125 | "Aria2 Version": "Aria2 Version",
126 | "Features Enabled": "Features Enabled",
127 | // about modal
128 | "To download the latest version of the project, add issues or to contribute back, head on to":
129 | "To download the latest version of the project, add issues or to contribute back, head on to",
130 | "Or you can open the latest version in the browser through":
131 | "Or you can open the latest version in the browser through",
132 | Close: "Close",
133 | // lables
134 | "Download status": "Download status",
135 | "Download Speed": "Download Speed",
136 | "Upload Speed": "Upload Speed",
137 | "Estimated time": "Estimated time",
138 | "Download Size": "Download Size",
139 | Downloaded: "Downloaded",
140 | Progress: "Progress",
141 | "Download Path": "Download Path",
142 | Uploaded: "Uploaded",
143 | "Download GID": "Download GID",
144 | "Number of Pieces": "Number of Pieces",
145 | "Piece Length": "Piece Length",
146 | "Shutdown Server": "Shutdown Server",
147 |
148 | "The last connection attempt was unsuccessful. Trying another configuration":
149 | "The last connection attempt was unsuccessful. Trying another configuration",
150 | "Oh Snap!": "Oh Snap!",
151 | "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
152 | "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings",
153 | "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
154 | "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings",
155 | "Successfully connected to Aria2 through its remote RPC …":
156 | "Successfully connected to Aria2 through its remote RPC …",
157 | "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
158 | "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)",
159 | "Trying to connect to aria2 using the new connection configuration":
160 | "Trying to connect to aria2 using the new connection configuration",
161 | "Remove {{name}} and associated meta-data?": "Remove {{name}} and associated meta-data?"
162 | };
163 |
--------------------------------------------------------------------------------
/src/js/translate/it_IT.js:
--------------------------------------------------------------------------------
1 | if (typeof translations == "undefined") {
2 | translations = {};
3 | }
4 |
5 | translations.it_IT = {
6 | // header
7 | Search: "Cerca",
8 | // Nav menu
9 | Add: "Aggiungi",
10 | "By URIs": "Da URIs",
11 | "By Torrents": "Da Torrent",
12 | "By Metalinks": "Da Metalink",
13 | Manage: "Gestione",
14 | "Pause All": "Ferma tutto",
15 | "Resume Paused": "Riprendi fermati",
16 | "Purge Completed": "Togli i completi",
17 | Settings: "Impostazioni",
18 | "Connection Settings": "Impostazioni di connessione",
19 | "Global Settings": "Impostazioni globali",
20 | "Server info": "Informazioni sul server",
21 | "About and contribute": "Crediti e informazioni",
22 | "Toggle navigation": "Cambia navigazione",
23 | // body
24 | // nav side bar
25 | Miscellaneous: "Varie",
26 | "Global Statistics": "Statistiche globali",
27 | About: "Info",
28 | Displaying: "Mostra",
29 | of: "di",
30 | downloads: "downloads",
31 | Language: "Lingua",
32 | // download filters
33 | "Download Filters": "Filtri download",
34 | Running: "In corso",
35 | Active: "Attivi",
36 | Waiting: "In attesa",
37 | Complete: "Completi",
38 | Error: "Errore",
39 | Paused: "In pausa",
40 | Removed: "Rimossi",
41 | "Hide linked meta-data": "Nascondi i meta-data collegati",
42 | Toggle: "Cambia",
43 | "Reset filters": "Reimposta filtri",
44 | // starred properties
45 | "Quick Access Settings": "Accesso rapido",
46 | "Save settings": "Salva impostazioni",
47 | "Currently no download in line to display, use the":
48 | "Attualmente non c'è nessun download da mostrare, usa il pulsante ",
49 | "download button to start downloading files!": "dowload per cominciare a scaricare!",
50 | Peers: "Peers",
51 | "More Info": "Altre informazioni",
52 | Remove: "Rimuovi",
53 | "# of": "# di",
54 | Length: "Lunghezza",
55 | // modals
56 | "Add Downloads By URIs": "Aggiungi Downloads da URIs",
57 | "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
58 | "- Puoi aggungere più download(files) allo stesso tempo mettendo un'URI per riga.",
59 | "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
60 | "- Puoi anche aggiungere più URI di download(mirror) per uno *stesso* file separando i vari mirror da uno spazio.",
61 | "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
62 | "- Un URI può essere un indirizzo HTTP(S)/FTP o un BitTorrent Magnet link.",
63 | "Download settings": "Impostazioni download",
64 | "Advanced settings": "Impostazioni avanzate",
65 | Cancel: "Cancella",
66 | Start: "Aggiungi",
67 | Choose: "Scegli",
68 | "Quick Access (shown on the main page)": "Accesso rapido (mostrato nella pagina principale)",
69 | // add torrent modal
70 | "Add Downloads By Torrents": "Aggiungi Torrent",
71 | "- Select the torrent from the local filesystem to start the download.":
72 | "- Seleziona il file torrent dal tuo computer per iniziare a scaricare.",
73 | "- You can select multiple torrents to start multiple downloads.":
74 | "- Puoi aggiungere anche più file contemporaneamente per iniziare più dowload insieme.",
75 | "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
76 | "- Per aggiungere un Magnet Link BitTorrent utilizza l'opzione Aggiungi da URI.",
77 | "Select Torrents": "Seleziona Torrents",
78 | "Select a Torrent": "Seleziona un Torrent",
79 | // add metalink modal
80 | "Add Downloads By Metalinks": "Aggiungi Torrent da Metalink",
81 | "Select Metalinks": "Seleziona Metalink",
82 | "- Select the Metalink from the local filesystem to start the download.":
83 | "- Seleziona un Metalink dal tuo computer per iniziare il download.",
84 | "- You can select multiple Metalinks to start multiple downloads.":
85 | "- Puoi iniziare anche più download selezionando più Metalink.",
86 | "Select a Metalink": "Seleziona un Metalink",
87 | // select file modal
88 | "Choose files to start download for": "Scegli i file da scaricare",
89 | "Select to download": "Seleziona per scaricare",
90 | // settings modal
91 | "Aria2 RPC host and port": "Host e porta del server RPC di Aria2",
92 | "Enter the host": "Inserisci l'host",
93 | "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
94 | "Inserisci l'IP o il nome DNS del server dov'è in esecuzione l'RPC per Aria2 (default: localhost)",
95 | "Enter the port": "Inserisci la porta",
96 | "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
97 | "Inserisci la porta del server dov'è in esecuzione l'RPC per Aria2 (default: 6800)",
98 | "Enter the RPC path": "Inserisci la path RPC",
99 | "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
100 | "Inserisci la path per l'endpoint RPC di Aria2 (default: /jsonrpc)",
101 | "SSL/TLS encryption": "Cifratura SSL/TLS",
102 | "Enable SSL/TLS encryption": "Abilita la cifratura SSL/TLS",
103 | "Enter the secret token (optional)": "Inserisci il token segreto (opzionale)",
104 | "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
105 | "Inserisci il token segreto per Aria2 (lascia vuoto se non è abilitato)",
106 | "Enter the username (optional)": "Inserisci l'username (opzionale)",
107 | "Enter the Aria2 RPC username (empty if authentication not enabled)":
108 | "Inserisci l'username per l'RPC di Aria2 (lascia vuoto se non è abilitato)",
109 | "Enter the password (optional)": "Inserisci la password (opzionale)",
110 | "Enter the Aria2 RPC password (empty if authentication not enabled)":
111 | "Inserisci la password per l'RPC di Aria2 (vuota se l'autenticazione non è abilitata)",
112 | "Enter base URL (optional)": "Inserisci l'URL di base(opzionale)",
113 | "Direct Download": "Downaload diretto",
114 | "If supplied, links will be created to enable direct download from the Aria2 server.":
115 | "Se inserito, verrano creati dei link per scaricare direttamente i file dal server Aria2.",
116 | "(Requires appropriate webserver to be configured.)":
117 | "(Richiede un webserver correttamente configurato)",
118 | "Save Connection configuration": "Salva la configurazione di connessione",
119 | Filter: "Filtro",
120 | // server info modal
121 | "Aria2 server info": "Informazioni sul server Aria2",
122 | "Aria2 Version": "Versione di Aria2",
123 | "Features Enabled": "Funzionalità abilitate",
124 | // about modal
125 | "To download the latest version of the project, add issues or to contribute back, head on to":
126 | "Per scaricare l'ultima versione del progetto, aggiungere problemi o contribuire, visita ",
127 | "Or you can open the latest version in the browser through":
128 | "Oppure puoi aprire l'ultima versione direttamente nel browser",
129 | Close: "Chiudi",
130 | // lables
131 | "Download status": "Stato download",
132 | "Download Speed": "Velocità download",
133 | "Upload Speed": "Velocità upload",
134 | "Estimated time": "Tempo stimato",
135 | "Download Size": "Dimensione del download",
136 | Downloaded: "Scaricato",
137 | Progress: "Progresso",
138 | "Download Path": "Percorso di download",
139 | Uploaded: "Caricato",
140 | "Download GID": "GID Download",
141 | "Number of Pieces": "Numero di segmenti",
142 | "Piece Length": "Lunghezza segmenti",
143 | "Shutdown Server": "Spegni Server",
144 |
145 | "The last connection attempt was unsuccessful. Trying another configuration":
146 | "L'ultimo tentativo di connessione non è riuscito. Provo un'altra connessione",
147 | "Oh Snap!": "Mannaggia!",
148 | "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
149 | "Non riesco a connettermi al server RPC di Aria2. Riprovo tra 10 secondi. Forse vuoi controllare le impostazioni di connessione in Impostazioni > Impostazioni di connessione",
150 | "Successfully connected to Aria2 through its remote RPC …":
151 | "Connesso con successo a Aria2 mediante RPC remoto …",
152 | "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
153 | "Correttamente connesso al server Aria2 mediante RPC, ma in modo non sicuro. Per una completa sicurezza prova ad aggiungere un token di autorizzazione segreto all'avvio di Aria2 (mediante il flag --rpc-secret)",
154 | "Trying to connect to aria2 using the new connection configuration":
155 | "Provo a connettermi a Aria2 attraverso le nuove impostazioni"
156 | };
157 |
--------------------------------------------------------------------------------
/src/js/translate/nl_NL.js:
--------------------------------------------------------------------------------
1 | if (typeof translations == "undefined") {
2 | translations = {};
3 | }
4 |
5 | translations.nl_NL = {
6 | // header
7 | Search: "Zoeken",
8 | // Nav menu
9 | Add: "Toevoegen",
10 | "By URIs": "met URI",
11 | "By Torrents": "met Torrents",
12 | "By Metalinks": "met Metalinks",
13 | Manage: "Beheren",
14 | "Pause All": "Alles pauzeren",
15 | "Resume Paused": "Hervatten",
16 | "Purge Completed": "Verwijder de voleindigden",
17 | Settings: "Instellingen",
18 | "Connection Settings": "Verbindingsinstellingen",
19 | "Global Settings": "Globale instellingen",
20 | "Server info": "Informatie over de server",
21 | "About and contribute": "Over het project en bijdragen",
22 | "Toggle navigation": "Navigatie omschakelen",
23 | Language: "Taal",
24 | // body
25 | // nav side bar
26 | Miscellaneous: "Overig",
27 | "Global Statistics": "Globale statistieken",
28 | About: "Over het project",
29 | Displaying: " ", // empty because of grammar in the following 2 elements
30 | of: "van",
31 | downloads: "downloads weergegeven",
32 | // download filters
33 | "Download Filters": "Download filters",
34 | Running: "Bezig",
35 | Active: "Actief",
36 | Waiting: "Wachtend",
37 | Complete: "Voleindigd",
38 | Error: "Foutief",
39 | Paused: "Gepauzeerd",
40 | Removed: "Verwijderd",
41 | "Hide linked meta-data": "Gekoppelde metadata verbergen",
42 | Toggle: "Omschakelen",
43 | "Reset filters": "Filters terugzetten",
44 | // starred properties
45 | "Quick Access Settings": "Snelle-toegang instellingen",
46 | "Save settings": "Instellingen opslaan",
47 | "Currently no download in line to display, use the":
48 | "Momenteel geen downloads weer te geven, gebruik de ",
49 | "download button to start downloading files!": "knop om bestanden te gaan downloaden!",
50 | Peers: "Peers",
51 | "More Info": "Meer informatie",
52 | Remove: "Verwijderen",
53 | "# of": "Aantal",
54 | Length: "Lengte",
55 | // modals
56 | "Add Downloads By URIs": "Downloads toevoegen met URI",
57 | "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
58 | "- Je kunt meerdere downloads (bestanden) tezelfdertijd toevoegen door de URIs voor elk bestand op een aparte regel te zetten.",
59 | "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
60 | "- Je kunt ook meerdere URIs (mirrors) voor *hetzelfde* bestand toevoegen. Scheidt hiervoor de URIs met een spatie.",
61 | "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
62 | "- Een URI kan HTTP(S)/FTP/BitTorrent-Magnet zijn.",
63 | "Download settings": "Download instellingen",
64 | "Advanced settings": "Geavanceerde instellingen",
65 | Cancel: "Annuleren",
66 | Start: "Starten",
67 | Choose: "Kiezen",
68 | "Quick Access (shown on the main page)": "Snelle toegang (op de hoofdpagina)",
69 | // add torrent modal
70 | "Add Downloads By Torrents": "Downloads toevoegen met torrents",
71 | "- Select the torrent from the local filesystem to start the download.":
72 | "- Selecteer de torrent van het locale bestandssysteem om de download te starten.",
73 | "- You can select multiple torrents to start multiple downloads.":
74 | "- Je kunt meerdere torrents selecteren voor meerdere downloads.",
75 | "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
76 | "- Om een BitTorrent-Magnet URL toe te voegen, gebruik de Toevoegen met URI optie, en voeg het daar toe.",
77 | "Select Torrents": "Selecteer torrents",
78 | "Select a Torrent": "Selecteer een torrent",
79 | // add metalink modal
80 | "Add Downloads By Metalinks": "Download toevoegen met Metalinks",
81 | "Select Metalinks": "Selecteer Metalinks",
82 | "- Select the Metalink from the local filesystem to start the download.":
83 | "- Selecteer de Metalink van het locale bestandssysteem om de download te starten.",
84 | "- You can select multiple Metalinks to start multiple downloads.":
85 | "- Selecter meerdere Metalinks om meerdere downloads te starten.",
86 | "Select a Metalink": "Selecteer een Metalink",
87 | // select file modal
88 | "Choose files to start download for": "Bestanden kiezen waarvoor het downloaden beginnen moet",
89 | "Select to download": "Selecteer om te downloaden",
90 | // settings modal
91 | "Aria2 RPC host and port": "Aria2 RPC server en poort",
92 | "Enter the host": "Server invoeren",
93 | "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
94 | "Voer de IP of DNS naam van de server waarop de RPC van Aria2 loopt (standaard: localhost)",
95 | "Enter the port": "Poort invoeren",
96 | "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
97 | "Invoeren van de serverpoort waarop de RPC van Aria2 loopt (standaard: 6800)",
98 | "Enter the RPC path": "Invoeren van het RPC pad",
99 | "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
100 | "Invoeren van het eindpunt van het Aria2 RPC pad (standaard: /jsonrpc)",
101 | "SSL/TLS encryption": "SSL/TLS versleuteling",
102 | "Enable SSL/TLS encryption": "SSL/TLS versleuteling inschakelen",
103 | "Enter the secret token (optional)": "Invoeren van het wachtwoord (facultatief)",
104 | "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
105 | "Invoeren van het Aria2 RPC wachtwoord (niet invullen als authenticatie niet is ingeschakeld)",
106 | "Enter the username (optional)": "Invoeren van de gebruikersnaam (facultatief)",
107 | "Enter the Aria2 RPC username (empty if authentication not enabled)":
108 | "Invoeren van de Aria2 RPC gebruikersnaam (niet invullen als authenticatie niet is ingeschakeld)",
109 | "Enter the password (optional)": "Invoeren van het wachtwoord (facultatief)",
110 | "Enter the Aria2 RPC password (empty if authentication not enabled)":
111 | "Invoeren van het Aria2 RPC wachtwoord (niet invullen als authenticatie niet is ingeschakeld)",
112 | "Enter base URL (optional)": "Invoeren van de basis URL (facultatief)",
113 | "Direct Download": "Direct downloaden",
114 | "If supplied, links will be created to enable direct download from the Aria2 server.":
115 | "Als ingevoerd dan worden links aangemaakt die het direct downloaden van de Aria2 server toestaan.",
116 | "(Requires appropriate webserver to be configurured.)":
117 | "Hiervoor moet een geschikte webserver worden ingericht.)",
118 | "Save Connection configuration": "Verbindingsconfiguratie opslaan",
119 | Filter: "Filter",
120 | // server info modal
121 | "Aria2 server info": "Aria2 server informatie",
122 | "Aria2 Version": "Aria2 versie",
123 | "Features Enabled": "Geactiveerde kenmerken",
124 | // about modal
125 | "To download the latest version of the project, add issues or to contribute back, head on to":
126 | "Om de nieuwste versie van het project te downloaden, problemen te rapporteren of bij te dragen, ga naar",
127 | "Or you can open the latest version in the browser through":
128 | "Of je kunt hier de nieuwste versie in je browser openen",
129 | Close: "Afsluiten"
130 | };
131 |
--------------------------------------------------------------------------------
/src/js/translate/pl_PL.js:
--------------------------------------------------------------------------------
1 | if (typeof translations == "undefined") {
2 | translations = {};
3 | }
4 |
5 | translations.pl_PL = {
6 | // header
7 | Search: "Szukaj",
8 | // Nav menu
9 | Add: "Dodaj",
10 | "By URIs": "Przez URL",
11 | "By Torrents": "Przez Torrenty",
12 | "By Metalinks": "Przez Metalinki",
13 | Manage: "Zarządzaj",
14 | "Pause All": "Zatrzymaj wszystkie",
15 | "Resume Paused": "Wznów zatrzymane",
16 | "Purge Completed": "Czyść zakończone",
17 | Settings: "Ustawienia",
18 | "Connection Settings": "Ustawienia połączenia",
19 | "Global Settings": "Ustawienia globalne",
20 | "Server info": "Informacje o serwerze",
21 | "About and contribute": "O projekcie",
22 | "Toggle navigation": "Przełącz nawigację",
23 | // body
24 | // nav side bar
25 | Miscellaneous: "Różne",
26 | "Global Statistics": "Statystyki globalne",
27 | About: "O",
28 | Displaying: "Wyświetlanie",
29 | of: "z",
30 | downloads: "pobranych plików",
31 | Language: "Język",
32 | // download filters
33 | "Download Filters": "Filtry ściągania",
34 | Running: "Uruchomione",
35 | Active: "Aktywne",
36 | Waiting: "Oczekujące",
37 | Complete: "Zakończone",
38 | Error: "Błąd",
39 | Paused: "Zatrzymane",
40 | Removed: "Usunięte",
41 | "Hide linked meta-data": "Ukryj zalinkowane meta-dane",
42 | Toggle: "Przełącz",
43 | "Reset filters": "Reset filtrów",
44 | // starred properties
45 | "Quick Access Settings": "Ustawienia szybkiego dostępu",
46 | "Save settings": "Zapisz ustawienia",
47 | "Currently no download in line to display, use the":
48 | "Obecnie nie można wyświetlić żadnych pobieranych plików. Użyj przycisku",
49 | "download button to start downloading files!": "aby rozpocząć ściąganie plików!",
50 | Peers: "Peerów",
51 | "More Info": "Więcej info",
52 | Remove: "Usuń",
53 | "# of": "# z",
54 | Length: "Długość",
55 | // modals
56 | "Add Downloads By URIs": "Dodaj pobieranie przez URI",
57 | "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
58 | "- Możesz dodać wiele pobrań (plików) w tym samym czasie przez wprowadzenie URI dla każdego w oddzielnej linii.",
59 | "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
60 | "- Możesz także dodać wiele URI (luster) dla tego *samego* pliku. Zrób to, poprzez oddzielenie URI od siebie spacją.",
61 | "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "- URI może być HTTP(S)/FTP/BitTorrent-Magnet.",
62 | "Download settings": "Ustawienia pobierania",
63 | "Advanced settings": "Zaawansowane ustawienia",
64 | Cancel: "Anuluj",
65 | Start: "Rozpocznij",
66 | Choose: "Wybierz",
67 | "Quick Access (shown on the main page)": "Szybki dostęp (pokazywane na głównej stronie)",
68 | // add torrent modal
69 | "Add Downloads By Torrents": "Dodaj pobierania przez Torrenty",
70 | "- Select the torrent from the local filesystem to start the download.":
71 | "- Wybierz torrent z lokalnego systemu plików, aby rozpocząć pobieranie.",
72 | "- You can select multiple torrents to start multiple downloads.":
73 | "- Możesz wybrać wiele torrentów do rozpoczęcia wiele pobrań.",
74 | "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
75 | "- Aby dodać BitTorrent-URL Magnetyczny, użyj opcji dodawania przez URI i dodaj to tutaj.",
76 | "Select Torrents": "Wybierz Torrenty",
77 | "Select a Torrent": "Wybierz Torrent",
78 | // add metalink modal
79 | "Add Downloads By Metalinks": "Dodaj pobierania przez Metalinki",
80 | "Select Metalinks": "Wybierz Metalinki",
81 | "- Select the Metalink from the local filesystem to start the download.":
82 | "- Wybierz Metalinki z lokalnego systemu plików, aby rozpocząć pobieranie.",
83 | "- You can select multiple Metalinks to start multiple downloads.":
84 | "- Możesz wybrać wiele Metalinków, aby rozpocząć wiele pobrań.",
85 | "Select a Metalink": "Wybierz Metalink",
86 | // select file modal
87 | "Choose files to start download for": "Wybierz pliki, aby rozpocząć pobieranie dla",
88 | "Select to download": "Wybierz do pobierania",
89 | // settings modal
90 | "Aria2 RPC host and port": "Aria2 RPC host i port",
91 | "Enter the host": "Wprowadź host",
92 | "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
93 | "Wprowadź IP lub nazwę DNS serwera, na którym jest uruchomiona Aria2 z RPC (domyślnie: localhost)",
94 | "Enter the port": "Wprowadź port",
95 | "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
96 | "Wprowadź port serwera, na którym Aria2 z RPC jest uruchomiona (domyślnie 6800)",
97 | "Enter the RPC path": "Wprowadź ścieżkę RPC",
98 | "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
99 | "Wprowadź ścieżkę dla punktu końcowego Aria2 RPC (domyślnie: /jsonrpc)",
100 | "SSL/TLS encryption": "szyfrowanie SSL/TLS",
101 | "Enable SSL/TLS encryption": "Włącz szyfrowanie SSL/TLS",
102 | "Enter the secret token (optional)": "Wprowadź sekretny token (opcja dodatkowa)",
103 | "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
104 | "Wprowadź sekretny token Aria2 RPC (pozostaw puste, jeżeli uwierzytelnienie nie jest włączone)",
105 | "Enter the username (optional)": "Wprowadź nazwę użytkownika (opcja dodatkowa)",
106 | "Enter the Aria2 RPC username (empty if authentication not enabled)":
107 | "Wprowadź nazwę użytkownika Aria2 RPC (pozostaw puste, jeżeli uwierzytelnienie nie jest włączone)",
108 | "Enter the password (optional)": "Wprowadź hasło (opcja dodatkowa)",
109 | "Enter the Aria2 RPC password (empty if authentication not enabled)":
110 | "Wprowadź hasło Aria2 RPC (pozostaw puste, jeżeli uwierzytelnienie nie jest włączone)",
111 | "Enter base URL (optional)": "Wprowadź podstawowy URL (opcja dodatkowa)",
112 | "Direct Download": "Bezpośrednie pobieranie",
113 | "If supplied, links will be created to enable direct download from the Aria2 server.":
114 | "Jeżeli zaznaczone, linki mogą być utworzone do włączenia bezpośredniego pobierania z serwera Aria2",
115 | "(Requires appropriate webserver to be configured.)":
116 | "(Wymaga właściwej konfiguracji serwera WWW)",
117 | "Save Connection configuration": "Zapisz konfigurację połączenia",
118 | Filter: "Filtr",
119 | // server info modal
120 | "Aria2 server info": "Info o serwerze Aria2",
121 | "Aria2 Version": "Wersja Aria2",
122 | "Features Enabled": "Włączone funkcje",
123 | // about modal
124 | "To download the latest version of the project, add issues or to contribute back, head on to":
125 | "Aby ściągnąć najnowszą wersję projektu, dodać zgłodzenia lub wspomagać projekt, udaj się do",
126 | "Or you can open the latest version in the browser through":
127 | "Lub otwórz najnowszą wersję przez przeglądarkę",
128 | Close: "Zamknij",
129 | // lables
130 | "Download status": "Status pobierania",
131 | "Download Speed": "Szybkość pobierania",
132 | "Upload Speed": "Szybkość wysyłania",
133 | "Estimated time": "Pozostały czas",
134 | "Download Size": "Rozmiar pobierania",
135 | Downloaded: "Pobrane",
136 | Progress: "Postęp",
137 | "Download Path": "Ścieżka pobierania",
138 | Uploaded: "Załadowany",
139 | "Download GID": "GID pobierania",
140 | "Number of Pieces": "Liczba kawałków",
141 | "Piece Length": "Rozmiar kawałka",
142 | "Shutdown Server": "Wyłącz serwer",
143 | "The last connection attempt was unsuccessful. Trying another configuration":
144 | "Ostatnia próba połączenia nie powiodła się. Spróbuj innej konfiguracji",
145 | "Oh Snap!": "O kurczę!",
146 | "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
147 | "Nie można połączyć się z serwerem aria2 przez RPC. Kolejna próba za 10 sekund. Być może potrzebujesz sprawdzić ustawienie połączenia poprzez Ustawienia > Ustawienia połączenia",
148 | "Successfully connected to Aria2 through its remote RPC …":
149 | "Pomyślnie połączono się z Aria2 przez RPC ...",
150 | "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
151 | "Pomyślnie połączono się z Aria2 przez RPC, jednakże połączenie nie jest bezpieczne. Aby zabezpieczyć dodaj sekretny token autoryzacji podczas startu Aria2 (przez użycie flagi --rpc-secret)",
152 | "Trying to connect to aria2 using the new connection configuration":
153 | "Próba połączenia się z Aria2 poprzez użycie nowej konfiguracji połączenia"
154 | };
155 |
--------------------------------------------------------------------------------
/src/js/translate/ru_RU.js:
--------------------------------------------------------------------------------
1 | if (typeof translations == "undefined") {
2 | translations = {};
3 | }
4 |
5 | translations.ru_RU = {
6 | // header
7 | Search: "Поиск",
8 | // Nav menu
9 | Add: "Добавить",
10 | "By URIs": "URL-адреса",
11 | "By Torrents": "Torrent-файлы",
12 | "By Metalinks": "Metalink-файлы",
13 | Manage: "Управление",
14 | "Pause All": "Приостановить всё",
15 | "Resume Paused": "Возобновить всё",
16 | "Purge Completed": "Удалить завершенные",
17 | Settings: "Настройки",
18 | "Connection Settings": "Настройки соединения",
19 | "Global Settings": "Глобальные настройки",
20 | "Server info": "Информация о сервере",
21 | "About and contribute": "Информация и сотрудничество",
22 | "Toggle navigation": "Переключение навигации",
23 | // body
24 | // nav side bar
25 | Miscellaneous: "Разное",
26 | "Global Statistics": "Глобальная статистика",
27 | About: "Об",
28 | Displaying: "Показано",
29 | of: "из",
30 | downloads: "загрузок",
31 | Language: "Язык",
32 | // download filters
33 | "Download Filters": "Фильтр загрузок",
34 | Running: "Запущенные",
35 | Active: "Активные",
36 | Waiting: "Ожидающие",
37 | Complete: "Завершенные",
38 | Error: "С ошибками",
39 | Paused: "Приостановленные",
40 | Removed: "Удаленные",
41 | "Hide linked meta-data": "Скрыть связанные метаданные",
42 | Toggle: "Переключить",
43 | "Reset filters": "Сбросить фильтры",
44 | // starred properties
45 | "Quick Access Settings": "Настройки быстрого доступа",
46 | "Save settings": "Сохранить настройки",
47 | "Currently no download in line to display, use the":
48 | "На данный момент ничего не загружается, используйте кнопку",
49 | "download button to start downloading files!": "чтобы начать загрузку файла!",
50 | Peers: "Пиры",
51 | "More Info": "Информация",
52 | Remove: "Удалить",
53 | "# of": "# из",
54 | Length: "Размер",
55 | // modals
56 | "Add Downloads By URIs": "Добавить загрузки из URL-адресов",
57 | "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
58 | "- Вы можете добавить несколько загрузок (файлов) одновременно, помещая URL-адреса для каждого файла на отдельной строке.",
59 | "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
60 | "- Можно также добавить несколько URL-адресов (зеркал) для *одного* файла. Для этого отделите URL-адреса пробелом.",
61 | "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
62 | "- URL-адрес может быть HTTP(S)/FTP/BitTorrent-Magnet.",
63 | "Download settings": "Настройки загрузки",
64 | "Advanced settings": "Расширенные настройки",
65 | Cancel: "Отмена",
66 | Start: "Начать",
67 | Choose: "Выбрать",
68 | "Quick Access (shown on the main page)": "Простой доступ (смотреть на главной странице)",
69 | // add torrent modal
70 | "Add Downloads By Torrents": "Добавить загрузку из Torrent-файлов",
71 | "- Select the torrent from the local filesystem to start the download.":
72 | "- Выберите Torrent-файлы из локальной файловой системы для начала загрузку.",
73 | "- You can select multiple torrents to start multiple downloads.":
74 | "- Вы можете выбрать несколько Torrent-файлы для запуска нескольких загрузок.",
75 | "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
76 | "- Для добавления BitTorrent-Magnet ссылки воспользуйтесь пунктом меню *Добавить из URL-адреса*",
77 | "Select Torrents": "Выберите торренты",
78 | "Select a Torrent": "Выберите торрент",
79 | // add metalink modal
80 | "Add Downloads By Metalinks": "Добавить загрузку из Metalink-файлов",
81 | "Select Metalinks": "Выбрать Metalink-файлы",
82 | "- Select the Metalink from the local filesystem to start the download.":
83 | "- Выберите Metalink-файлы из локальной файловой системы для начала загрузки",
84 | "- You can select multiple Metalinks to start multiple downloads.":
85 | "- Вы можете выбрать несколько Metalink-файлов для запуска нескольких загрузок.",
86 | "Select a Metalink": "Выберите Metalink",
87 | // select file modal
88 | "Choose files to start download for": "Выберите файлы чтобы начать загрузку для",
89 | "Select to download": "Выберите для загрузки",
90 | // settings modal
91 | "Aria2 RPC host and port": "Aria2 RPC хост и порт",
92 | "Enter the host": "Укажите хост",
93 | "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
94 | "Укажите IP или DNS-имя сервера, на котором запущена Aria2 со включенным RPC (по умолчанию: localhost)",
95 | "Enter the port": "Укажите порт",
96 | "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
97 | "Укажите порт сервера, на котором запущена Aria2 со включенным RPC (по умолчанию: 6800)",
98 | "Enter the RPC path": "Укажите путь RPC",
99 | "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
100 | "Укажите конечный путь для Aria2 RPC (по умолчанию: /jsonrpc)",
101 | "SSL/TLS encryption": "SSL/TLS шифрование",
102 | "Enable SSL/TLS encryption": "Разрешить SSL/TLS шифрование",
103 | "Enter the secret token (optional)": "Укажите секретный токен (необязательно)",
104 | "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
105 | "Укажите секретный токен Aria2 RPC (оставьте пустым, если авторизация не включена)",
106 | "Enter the username (optional)": "Укажите имя пользователя (необязательно)",
107 | "Enter the Aria2 RPC username (empty if authentication not enabled)":
108 | "Укажите имя пользователя Aria2 RPC (оставьте пустым, если авторизация не включена)",
109 | "Enter the password (optional)": "Укажите пароль (необязательно)",
110 | "Enter the Aria2 RPC password (empty if authentication not enabled)":
111 | "Укажите пароль для Aria2 RPC (оставьте пустым, если авторизация не включена)",
112 | "Enter base URL (optional)": "Укажите базовый URL-адрес (необязательно)",
113 | "Direct Download": "Прямая загрузка",
114 | "If supplied, links will be created to enable direct download from the Aria2 server.":
115 | "Ссылки (при наличии) будут созданы для загрузки непосредственно с сервера Aria2.",
116 | "(Requires appropriate webserver to be configured.)":
117 | "(Требуется соответствующий веб-сервер для настройки.)",
118 | "Save Connection configuration": "Сохранить настройки соединения",
119 | Filter: "Фильтр",
120 | // server info modal
121 | "Aria2 server info": "Информация о сервере Aria2",
122 | "Aria2 Version": "Версия Aria2",
123 | "Features Enabled": "Имеющийся функционал",
124 | // about modal
125 | "To download the latest version of the project, add issues or to contribute back, head on to":
126 | "Чтобы загрузить последнюю версию проекта, добавить вопросы или внести свой вклад, передите на",
127 | "Or you can open the latest version in the browser through":
128 | "Или вы можете открыть последнюю версию в браузере через",
129 | Close: "Закрыть",
130 | // lables
131 | "Download status": "Статус загрузки",
132 | "Download Speed": "Скорость загрузки",
133 | "Upload Speed": "Скорость отдачи",
134 | "Estimated time": "Оставшееся время",
135 | "Download Size": "Размер загрузки",
136 | Downloaded: "Загружено",
137 | Progress: "Прогресс",
138 | "Download Path": "Путь к загружаемым файлам",
139 | Uploaded: "Отдано",
140 | "Download GID": "Загруженый GID",
141 | "Number of Pieces": "Количество частей",
142 | "Piece Length": "Размер частей",
143 | "Shutdown Server": "Выключить сервер",
144 |
145 | "The last connection attempt was unsuccessful. Trying another configuration":
146 | "Последняя попытка подключения была неудачной. Попробуйте другую конфигурацию",
147 | "Oh Snap!": "Опаньки!",
148 | "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
149 | "Не удалось подключиться к серверу Aria2 RPC. Попытка будет повторена в течение 10 секунд. Вы можете проверить параметры подключения, перейдя в меню Настройки > Настройки соединения",
150 | "Successfully connected to Aria2 through its remote RPC …":
151 | "Успешное подключение к Aria2 через удаленный RPC …",
152 | "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
153 | "Успешное подключение к Aria2 через удаленный RPC, однако соединение все еще небезопасно. Для обеспечения лучшей безопасности добавьте секретный токен авторизации при запуске aria2 (через флаг --rpc-secret)",
154 | "Trying to connect to aria2 using the new connection configuration":
155 | "Попытка подключиться к aria2 с использованием новой конфигурации"
156 | };
157 |
--------------------------------------------------------------------------------
/src/js/translate/template.js:
--------------------------------------------------------------------------------
1 | // This text is a template of translation list.
2 |
3 | // pre: ll_CC, locale name, examples: en_US, zh_CN
4 | // 1. Copy and rename to ll_CC.js, translate these words.
5 | // 2. in js/init.js:
6 | // Add '.translations('ll_CC', translations.ll_CC)' before '.determinePreferredLanguage();'
7 | // 3. in index.html
8 | // Add '' after ''
9 | // 4. To add Language to changeLanguage button, see "{{ 'Language' | translate }}" in index.html.
10 | // flag-icon usage:
11 | // https://github.com/lipis/flag-icon-css
12 | // 5. Browser determining preferred language automatically.
13 | // http://angular-translate.github.io/docs/en/#/guide/07_multi-language
14 |
15 | if (typeof translations == "undefined") {
16 | translations = {};
17 | }
18 |
19 | translations.en_US = {
20 | // replace en_US to ll_CC, examples: zh_CN, de_AT.
21 | // header
22 | Search: "",
23 | // Nav menu
24 | Add: "",
25 | "By URIs": "",
26 | "By Torrents": "",
27 | "By Metalinks": "",
28 | Manage: "",
29 | "Pause All": "",
30 | "Resume Paused": "",
31 | "Purge Completed": "",
32 | "Shutdown Server": "",
33 | Settings: "",
34 | "Connection Settings": "",
35 | "Global Settings": "",
36 | "Server info": "",
37 | "About and contribute": "",
38 | "Toggle navigation": "",
39 | // body
40 | // nav side bar
41 | Miscellaneous: "",
42 | "Global Statistics": "",
43 | About: "",
44 | Displaying: "",
45 | of: "",
46 | downloads: "",
47 | Language: "",
48 | // download filters
49 | "Download Filters": "",
50 | Running: "",
51 | Active: "",
52 | Waiting: "",
53 | Complete: "",
54 | Error: "",
55 | Paused: "",
56 | Removed: "",
57 | "Hide linked meta-data": "",
58 | Toggle: "",
59 | "Reset filters": "",
60 | // download status
61 | Verifying: "",
62 | "Verify Pending": "",
63 | // starred properties
64 | "Quick Access Settings": "",
65 | Save: "",
66 | "Save settings": "",
67 | "Currently no download in line to display, use the": "",
68 | "download button to start downloading files!": "",
69 | Peers: "",
70 | "More Info": "",
71 | Remove: "",
72 | "# of": "",
73 | Length: "",
74 | // modals
75 | "Add Downloads By URIs": "",
76 | "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
77 | "",
78 | "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
79 | "",
80 | "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "",
81 | "Download settings": "",
82 | "Advanced settings": "",
83 | Cancel: "",
84 | Start: "",
85 | Choose: "",
86 | "Quick Access (shown on the main page)": "",
87 | // add torrent modal
88 | "Add Downloads By Torrents": "",
89 | "- Select the torrent from the local filesystem to start the download.": "",
90 | "- You can select multiple torrents to start multiple downloads.": "",
91 | "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.": "",
92 | "Select Torrents": "",
93 | "Select a Torrent": "",
94 | // add metalink modal
95 | "Add Downloads By Metalinks": "",
96 | "Select Metalinks": "",
97 | "- Select the Metalink from the local filesystem to start the download.": "",
98 | "- You can select multiple Metalinks to start multiple downloads.": "",
99 | "Select a Metalink": "",
100 | // select file modal
101 | "Choose files to start download for": "",
102 | "Select to download": "",
103 | // settings modal
104 | "Aria2 RPC host and port": "",
105 | "Enter the host": "",
106 | "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
107 | "",
108 | "Enter the port": "",
109 | "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)": "",
110 | "Enter the RPC path": "",
111 | "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)": "",
112 | "SSL/TLS encryption": "",
113 | "Enable SSL/TLS encryption": "",
114 | "Enter the secret token (optional)": "",
115 | "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)": "",
116 | "Enter the username (optional)": "",
117 | "Enter the Aria2 RPC username (empty if authentication not enabled)": "",
118 | "Enter the password (optional)": "",
119 | "Enter the Aria2 RPC password (empty if authentication not enabled)": "",
120 | "Enter base URL (optional)": "",
121 | "Direct Download": "",
122 | "If supplied, links will be created to enable direct download from the Aria2 server.": "",
123 | "(Requires appropriate webserver to be configured.)": "",
124 | "Save Connection configuration": "",
125 | Filter: "",
126 | // server info modal
127 | "Aria2 server info": "",
128 | "Aria2 Version": "",
129 | "Features Enabled": "",
130 | // about modal
131 | "To download the latest version of the project, add issues or to contribute back, head on to": "",
132 | "Or you can open the latest version in the browser through": "",
133 | Close: "",
134 | // labels
135 | "Download status": "",
136 | "Download Speed": "",
137 | "Upload Speed": "",
138 | "Estimated time": "",
139 | "Download Size": "",
140 | Downloaded: "",
141 | Progress: "",
142 | "Download Path": "",
143 | Uploaded: "",
144 | "Download GID": "",
145 | "Number of Pieces": "",
146 | "Piece Length": "",
147 |
148 | //alerts
149 | "The last connection attempt was unsuccessful. Trying another configuration": "",
150 | "Oh Snap!": "",
151 | "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
152 | "",
153 | "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
154 | "",
155 | "Successfully connected to Aria2 through its remote RPC …": "",
156 | "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
157 | "",
158 | "Trying to connect to aria2 using the new connection configuration": "",
159 | // {{name}} refers to the download name, do not modify.
160 | "Remove {{name}} and associated meta-data?": ""
161 | };
162 |
--------------------------------------------------------------------------------
/src/js/translate/th_TH.js:
--------------------------------------------------------------------------------
1 | if (typeof translations == "undefined") {
2 | translations = {};
3 | }
4 |
5 | translations.th_TH = {
6 | // header
7 | Search: "ค้นหา",
8 | // Nav menu
9 | Add: "เพื่ม",
10 | "By URIs": "ด้วยยูอาร์ไอ",
11 | "By Torrents": "ด้วยทอร์เรนต์",
12 | "By Metalinks": "ด้วยเมทาลิงค์",
13 | Manage: "บริหาร",
14 | "Pause All": "หยุดชั่วคราวหมด",
15 | "Resume Paused": "ไปต่อหมด",
16 | "Purge Completed": "ลบอันเสร็จ",
17 | Settings: "ตั้งค่า",
18 | "Connection Settings": "ตั้งค่าเชื่อมต่อ",
19 | "Global Settings": "ตั้งค่าทั่วไป",
20 | "Server info": "ข้อมูลเซอร์เวอร์",
21 | "About and contribute": "เกี่ยวกับและช่วย",
22 | "Toggle navigation": "สลับนำทาง",
23 | Language: "ภาษา",
24 | // body
25 | // nav side bar
26 | Miscellaneous: "เบ็ดเตล็ด",
27 | "Global Statistics": "สถิติทั่วไป",
28 | About: "เกี่ยวกับ",
29 | Displaying: "แแสดงดาวน์โหลด",
30 | of: "อันใน",
31 | downloads: "อันทั้งหมด",
32 | // download filters
33 | "Download Filters": "กรองดาวน์โหลด",
34 | Running: "กำลังทำงาน",
35 | Active: "ใช้งานอยู่",
36 | Waiting: "กำลังรอ",
37 | Complete: "เสร็จ",
38 | Error: "ผิดพลาด",
39 | Paused: "หยุดอยู่",
40 | Removed: "ลบแล้ว",
41 | "Hide linked meta-data": "ซ่อนข้อมูลเมตาที่เชื่อมโยง",
42 | Toggle: "สลับ",
43 | "Reset filters": "รีเซตตัวกรอง",
44 | // starred properties
45 | "Quick Access Settings": "ตั้งค่าอย่างรวดเร็ว",
46 | "Save settings": "บันทึกการตั้งค่า",
47 | "Currently no download in line to display, use the":
48 | "ตอนนี้ไม่มีการดาวน์โหลดที่แสดงได้ ก็ใช้ปุ่ม",
49 | "download button to start downloading files!": "ให้เริ่มดาวน์โหลดไฟล์",
50 | Peers: "พีร์ส",
51 | "More Info": "ข้อมูลเพิ่ม",
52 | Remove: "ลบ",
53 | "# of": "จำนวน",
54 | Length: "ความยาว",
55 | // modals
56 | "Add Downloads By URIs": "เพิ่มดาวน์โหลดด้วยยูอาร์ไอ",
57 | "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
58 | "",
59 | "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
60 | "",
61 | "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "",
62 | "Download settings": "ตั้งค่าการดาวน์โหลด",
63 | "Advanced settings": "ตั้งค่าขั้นสูง",
64 | Cancel: "ยกเลิก",
65 | Start: "เริ่มต้น",
66 | Choose: "เลือก",
67 | "Quick Access (shown on the main page)": "ใช้งานอย่างรวดเร็ว (แสดงที่เพจหลัก)",
68 | // add torrent modal
69 | "Add Downloads By Torrents": "เพิ่มดาวน์โหลดด้วยทอร์เรนต์",
70 | "- Select the torrent from the local filesystem to start the download.": "",
71 | "- You can select multiple torrents to start multiple downloads.": "",
72 | "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.": "",
73 | "Select Torrents": "เลือกทอร์เรนต์",
74 | "Select a Torrent": "เลือกทอร์เรนต์",
75 | // add metalink modal
76 | "Add Downloads By Metalinks": "เพิ่มดาวน์โหลดด้วยเมทาลิงค์",
77 | "Select Metalinks": "เลือกเมทาลิงค์",
78 | "- Select the Metalink from the local filesystem to start the download.": "",
79 | "- You can select multiple Metalinks to start multiple downloads.": "",
80 | "Select a Metalink": "เลือกเมทาลิงค์",
81 | // select file modal
82 | "Choose files to start download for": "เลือกไฟล์ที่จะเริ่มดาวน์โหลด",
83 | "Select to download": "เลือกให้ดาวน์โหลด",
84 | // settings modal
85 | "Aria2 RPC host and port": "โฮสต์และพอร์ตของ Aria2 RPC",
86 | "Enter the host": "ป้อนโฮสต์",
87 | "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
88 | "",
89 | "Enter the port": "ป้อนพอร์ต",
90 | "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)": "",
91 | "Enter the RPC path": "ป้อนเส้นทาง RPC",
92 | "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)": "",
93 | "SSL/TLS encryption": "การเข้ารหัสลับ SSL/TLS",
94 | "Enable SSL/TLS encryption": "เปิดใช้การเข้ารหัสลับ SSL/TLS",
95 | "Enter the secret token (optional)": "ป้อนสัญลักษณ์ความลับ (เป็นตัวเลือก)",
96 | "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)": "",
97 | "Enter the username (optional)": "ป้อนเชื่อ (เป็นตัวเลือก)",
98 | "Enter the Aria2 RPC username (empty if authentication not enabled)": "",
99 | "Enter the password (optional)": "ป้อนรหัสผ่าน (เป็นตัวเลือก)",
100 | "Enter the Aria2 RPC password (empty if authentication not enabled)": "",
101 | "Enter base URL (optional)": "ป้อน URL หลัก (เป็นตัวเลือก)",
102 | "Direct Download": "ดาวน์โหลดโดยตรง",
103 | "If supplied, links will be created to enable direct download from the Aria2 server.": "",
104 | "(Requires appropriate webserver to be configured.)": "",
105 | "Save Connection configuration": "บันทึกการตั้งค่าการเชื่อมต่อ",
106 | Filter: "กรอง",
107 | // server info modal
108 | "Aria2 server info": "ข้อมูลเซอร์เวอร์ Aria2",
109 | "Aria2 Version": "รุ่น Aria2",
110 | "Features Enabled": "คุณสมบัติที่เปิดใช้งาน",
111 | // about modal
112 | "To download the latest version of the project, add issues or to contribute back, head on to":
113 | "ให้ดาวน์โหลดรุ่นสุดท้ายของโครงการ เพิ่มปัญหา หรือช่วยเหลือมีส่วนร่วม ไปสู่",
114 | "Or you can open the latest version in the browser through":
115 | "หรือเปิดรุ่นสุดท้ายในเบราว์เซอร์โดยใช้",
116 | Close: "ปิด"
117 | };
118 |
--------------------------------------------------------------------------------
/src/js/translate/tr_TR.js:
--------------------------------------------------------------------------------
1 | if (typeof translations == "undefined") {
2 | translations = {};
3 | }
4 |
5 | translations.tr_TR = {
6 | // header
7 | Search: "Arama",
8 | // Nav menu
9 | Add: "Ekle",
10 | "By URIs": "URI ile",
11 | "By Torrents": "Torrent ile",
12 | "By Metalinks": "Metalink ile",
13 | Manage: "Yönet",
14 | "Pause All": "Hepsini Duraklat",
15 | "Resume Paused": "Devam Et",
16 | "Purge Completed": "Temizleme Tamamlandı",
17 | Settings: "Ayarlar",
18 | "Connection Settings": "Bağlantı Ayarları",
19 | "Global Settings": "Genel Ayarlar",
20 | "Server info": "Sunucu bilgisi",
21 | "About and contribute": "Hakkında ve katkıda bulunanlar",
22 | "Toggle navigation": "Gezinmeyi aç / kapat",
23 | // body
24 | // nav side bar
25 | Miscellaneous: "Çeşitli",
26 | "Global Statistics": "Genel İstatistikler",
27 | About: "Hakkında",
28 | Displaying: "Gösteriliyor",
29 | of: " / ",
30 | downloads: "Indirme",
31 | Language: "Dil",
32 | // download filters
33 | "Download Filters": "İndirme Filtreleri",
34 | Running: "Çalışıyor",
35 | Active: "Aktif",
36 | Waiting: "Bekliyor",
37 | Complete: "Tamamlandı",
38 | Error: "Hata",
39 | Paused: "Duraklatıldı",
40 | Removed: "Silindi",
41 | "Hide linked meta-data": "Bağlı meta verileri gizle",
42 | Toggle: "aç/kapat",
43 | "Reset filters": "Filtreleri sıfırla",
44 | // starred properties
45 | "Quick Access Settings": "Hızlı Erişim Ayarları",
46 | "Save settings": "Ayarları kaydet",
47 | "Currently no download in line to display, use the":
48 | "Şu anda görüntülenebilecek bir indirme yok,",
49 | "download button to start downloading files!": "butonu aracılığı ile dosya indirebilirsiniz!",
50 | Peers: "Peers",
51 | "More Info": "Daha fazla bilgi",
52 | Remove: "Kaldır",
53 | "# of": "# dan",
54 | Length: "Uzunluk",
55 | // modals
56 | "Add Downloads By URIs": "URI kullanarak indirmelere ekle",
57 | "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
58 | "- Ayrı bir satıra her dosya için URI koyarak aynı anda birden fazla dosya indirebilirsiniz.",
59 | "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
60 | "- Aynı dosyalar için birden fazla URI (ayna) da ekleyebilirsiniz. Bunu yapmak için URIları bir boşlukla ayırın.",
61 | "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":
62 | "- Bir URI, HTTP(S)/FTP/BitTorrent-Magnet olabilir.",
63 | "Download settings": "İndirme ayarları",
64 | "Advanced settings": "Gelişmiş Ayarlar",
65 | Cancel: "İptal et",
66 | Start: "Başlat",
67 | Choose: "Seçiniz",
68 | "Quick Access (shown on the main page)": "Hızlı Erişim (ana sayfada gösterilir)",
69 | // add torrent modal
70 | "Add Downloads By Torrents": "Torrent kullanarak indirmelere ekle",
71 | "- Select the torrent from the local filesystem to start the download.":
72 | "- İndirmeyi başlatmak için yerel dosya sisteminden torrenti seçin.",
73 | "- You can select multiple torrents to start multiple downloads.":
74 | "- Birden çok indirmeyi başlatmak için birden çok torrent seçebilirsiniz.",
75 | "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
76 | "- BitTorrent-Magnetli bir URL eklemek için, İstek Üzerine Ekle seçeneğini kullanın ve oraya ekleyin.",
77 | "Select Torrents": "Torrentleri seçin",
78 | "Select a Torrent": "Bir Torrent seçin",
79 | // add metalink modal
80 | "Add Downloads By Metalinks": "Metalink kullanarak indirmelere ekle",
81 | "Select Metalinks": "Metalinkleri seçin",
82 | "- Select the Metalink from the local filesystem to start the download.":
83 | "- İndirmeyi başlatmak için yerel dosya sisteminden Metalinki seçin.",
84 | "- You can select multiple Metalinks to start multiple downloads.":
85 | "- Birden fazla yüklemeye başlamak için birden fazla Metalink seçebilirsiniz.",
86 | "Select a Metalink": "Bir Metalink Seç",
87 | // select file modal
88 | "Choose files to start download for": "Için indirmeye başlamak için dosyaları seçin",
89 | "Select to download": "Indirmek için seçin",
90 | // settings modal
91 | "Aria2 RPC host and port": "Aria2 RPC ana bilgisayar ve bağlantı noktası",
92 | "Enter the host": "Ana bilgisayar(host) girin",
93 | "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
94 | "Aria2 için RPC'nin çalıştığı sunucunun IP veya DNS adını girin (varsayılan: localhost)",
95 | "Enter the port": "Bağlantı noktasını gir",
96 | "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
97 | "Aria2 için RPC'nin çalıştığı sunucunun bağlantı noktasını girin (varsayılan: 6800)",
98 | "Enter the RPC path": "RPC yolunu girin",
99 | "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
100 | "Aria2 RPC bitiş noktası için yolu girin (varsayılan: / jsonrpc)",
101 | "SSL/TLS encryption": "SSL / TLS şifreleme",
102 | "Enable SSL/TLS encryption": "SSL / TLS şifrelemeyi etkinleştir",
103 | "Enter the secret token (optional)": "Gizli simge girin (isteğe bağlı)",
104 | "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
105 | "Aria2 RPC gizli simgesini girin (kimlik doğrulama etkin değilse boş bırakın)",
106 | "Enter the username (optional)": "Kullanıcı adını girin (isteğe bağlı)",
107 | "Enter the Aria2 RPC username (empty if authentication not enabled)":
108 | "Aria2 RPC kullanıcı adını girin (kimlik doğrulama etkin değilse boş bırakın)",
109 | "Enter the password (optional)": "Parolayı girin (isteğe bağlı)",
110 | "Enter the Aria2 RPC password (empty if authentication not enabled)":
111 | "Aria2 RPC şifresini girin (kimlik doğrulama etkin değilse boş bırakın)",
112 | "Enter base URL (optional)": "Temel URL'yi girin (isteğe bağlı)",
113 | "Direct Download": "Direkt indirme",
114 | "If supplied, links will be created to enable direct download from the Aria2 server.":
115 | "Verilen, bağlantıları aria2 sunucudan doğrudan indirmeyi etkinleştirmek için oluşturulur.",
116 | "(Requires appropriate webserver to be configured.)":
117 | "(Uygun web sunucusunun yapılandırılmasını gerektirir.)",
118 | "Save Connection configuration": "Bağlantı yapılandırmasını kaydedin",
119 | Filter: "Filtre",
120 | // server info modal
121 | "Aria2 server info": "Aria2 sunucu bilgisi",
122 | "Aria2 Version": "Aria2 Sürümü",
123 | "Features Enabled": "Aşağıdaki Özellikler Etkin",
124 | // about modal
125 | "To download the latest version of the project, add issues or to contribute back, head on to":
126 | "Projenin en son sürümünü indirmek için sorun ekleyin veya katkıda bulunun;",
127 | "Or you can open the latest version in the browser through":
128 | "Veya en son sürümü tarayıcınız aracılığıyla açabilirsiniz.",
129 | Close: "Kapat",
130 | // lables
131 | "Download status": "İndirme durumu",
132 | "Download Speed": "İndirme hızı",
133 | "Upload Speed": "Yükleme hızı",
134 | "Estimated time": "Tahmini süre",
135 | "Download Size": "İndirme Boyutu",
136 | Downloaded: "İndirildi",
137 | Progress: "İlerleme",
138 | "Download Path": "İndirme Yolu",
139 | Uploaded: "Yüklendi",
140 | "Download GID": "GID'yi indirin",
141 | "Number of Pieces": "Parça sayısı",
142 | "Piece Length": "Parça Uzunluğu",
143 | "Shutdown Server": "Sunucuyu Kapat",
144 |
145 | "The last connection attempt was unsuccessful. Trying another configuration":
146 | "Son bağlantı girişimi başarısız oldu. Başka bir yapılandırma deneyin",
147 | "Oh Snap!": "HAydaaaaa!",
148 | "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
149 | "Aria2 RPC sunucusuna bağlanılamadı. 10 saniye içinde tekrar deneyecek. Bağlantı ayarlarını, Ayarlar> Bağlantı Ayarları bölümüne giderek kontrol etmek isteyebilirsiniz.",
150 | "Successfully connected to Aria2 through its remote RPC …":
151 | "Uzak RPC aracılığıyla Aria2'ye başarıyla bağlandı ...",
152 | "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
153 | "Uzak RPC aracılığıyla Aria2'ye başarıyla bağlandı ancak bağlantı hala güvende değil. Tam güvenlik için, Aria2'yi başlatırken (--rpc-secret bayrağını kullanın) ve bir yetkilendirme gizli simgesi eklemeyi deneyin.",
154 | "Trying to connect to aria2 using the new connection configuration":
155 | "Yeni bağlantı yapılandırmasını kullanarak aria2'ye bağlanmaya çalışılıyor"
156 | };
157 |
--------------------------------------------------------------------------------
/src/js/translate/zh_CN.js:
--------------------------------------------------------------------------------
1 | if (typeof translations == "undefined") {
2 | translations = {};
3 | }
4 |
5 | translations.zh_CN = {
6 | // header
7 | Search: "搜索",
8 | // Nav menu
9 | Add: "添加",
10 | "By URIs": "使用链接",
11 | "By Torrents": "使用种子",
12 | "By Metalinks": "使用 Metalink",
13 | Manage: "管理",
14 | "Pause All": "暂停所有",
15 | "Resume Paused": "恢复下载",
16 | "Purge Completed": "清除已完成",
17 | "Shutdown Server": "关闭服务器",
18 | Settings: "设置",
19 | "Connection Settings": "连接设置",
20 | "Global Settings": "全局设置",
21 | "Server info": "服务器信息",
22 | "About and contribute": "关于和捐助",
23 | "Toggle navigation": "切换导航",
24 | // body
25 | // nav side bar
26 | Miscellaneous: "杂项",
27 | "Global Statistics": "全局统计",
28 | About: "关于",
29 | Displaying: "正在显示",
30 | of: "/",
31 | downloads: "下载",
32 | Language: "语言",
33 | // download filters
34 | "Download Filters": "下载过滤器",
35 | Running: "运行中",
36 | Active: "活动的",
37 | Waiting: "等待中",
38 | Complete: "已完成",
39 | Error: "出错的",
40 | Paused: "已暂停",
41 | Removed: "已删除",
42 | "Hide linked meta-data": "隐藏连接的元数据",
43 | Toggle: "反向选择",
44 | "Reset filters": "重置过滤器",
45 | // download status
46 | Verifying: "正在验证",
47 | "Verify Pending": "等待验证",
48 | // starred properties
49 | "Quick Access Settings": "快速访问设置",
50 | Save: "保存",
51 | "Save settings": "保存设置",
52 | "Currently no download in line to display, use the": "当前没有可显示的下载项,使用",
53 | "download button to start downloading files!": "按钮来开始下载!",
54 | Peers: "Peers",
55 | "More Info": "更多信息",
56 | Remove: "删除",
57 | "# of": "块数",
58 | Length: "块大小",
59 | // modals
60 | "Add Downloads By URIs": "使用链接下载",
61 | "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
62 | "- 你可以同时添加多个文件下载任务,每行下载一个文件;",
63 | "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
64 | "- 你也可以给同一个下载任务添加多个镜像链接,写在一行并用空格分隔每条链接;",
65 | "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "- 链接可以是 HTTP(S)、FTP 和磁力链接。",
66 | "Download settings": "下载设置",
67 | "Advanced settings": "高级设置",
68 | Cancel: "取消",
69 | Start: "开始",
70 | Choose: "选择",
71 | "Quick Access (shown on the main page)": "快速访问(在主页上显示)",
72 | // add torrent modal
73 | "Add Downloads By Torrents": "使用种子下载",
74 | "- Select the torrent from the local filesystem to start the download.":
75 | "- 从本地文件系统选择种子文件开始下载;",
76 | "- You can select multiple torrents to start multiple downloads.":
77 | "- 你可以同时选择多个种子来启动多个下载;",
78 | "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
79 | "- 如果要添加磁力链接,请使用添加链接的方式。",
80 | "Select Torrents": "选择种子文件",
81 | "Select a Torrent": "选择种子文件",
82 | // add metalink modal
83 | "Add Downloads By Metalinks": "使用 Metalink 下载",
84 | "Select Metalinks": "选择 Metalink 文件",
85 | "- Select the Metalink from the local filesystem to start the download.":
86 | "* 从本地文件系统选择 Metalink 文件开始下载;",
87 | "- You can select multiple Metalinks to start multiple downloads.":
88 | "* 你可以同时选择多个 Metalink 文件来启动多个下载。",
89 | "Select a Metalink": "选择 Metalink 文件",
90 | // select file modal
91 | "Choose files to start download for": "请选择要下载的文件",
92 | "Select to download": "选择以下载",
93 | // settings modal
94 | "Aria2 RPC host and port": "Aria2 RPC 主机和端口",
95 | "Enter the host": "主机",
96 | "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
97 | "输入 Aria2 RPC 所在服务器的 IP 或域名(默认:localhost)",
98 | "Enter the port": "端口",
99 | "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
100 | "输入 Aria2 RPC 端口号(默认:6800)",
101 | "Enter the RPC path": "RPC 路径",
102 | "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
103 | "输入 Aria2 RPC 路径(默认:/jsonrpc)",
104 | "SSL/TLS encryption": "SSL/TLS 加密",
105 | "Enable SSL/TLS encryption": "启用 SSL/TLS 加密",
106 | "Enter the secret token (optional)": "密码令牌(可选)",
107 | "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
108 | "输入 Aria2 RPC 密码令牌(如果未启用则留空)",
109 | "Enter the username (optional)": "用户名(可选)",
110 | "Enter the Aria2 RPC username (empty if authentication not enabled)":
111 | "输入 Aria2 RPC 用户名(如果未启用身份验证则留空)",
112 | "Enter the password (optional)": "密码(可选)",
113 | "Enter the Aria2 RPC password (empty if authentication not enabled)":
114 | "输入 Aria2 RPC 密码(如果未启用身份验证则留空)",
115 | "Enter base URL (optional)": "基本链接地址(可选)",
116 | "Direct Download": "直接下载",
117 | "If supplied, links will be created to enable direct download from the Aria2 server.":
118 | "如果指定该选项,将会创建可以直接从 Aria2 服务器上下载文件的链接。",
119 | "(Requires appropriate webserver to be configured.)": "(需要 WEB 服务器配置正确)",
120 | "Save Connection configuration": "保存连接配置",
121 | Filter: "过滤",
122 | // server info modal
123 | "Aria2 server info": "Aria2 服务器信息",
124 | "Aria2 Version": "Aria2 版本",
125 | "Features Enabled": "已启用功能",
126 | // about modal
127 | "To download the latest version of the project, add issues or to contribute back, head on to":
128 | "下载最新版本、提交问题或捐助,请访问",
129 | "Or you can open the latest version in the browser through": "直接在浏览器中使用最新版本,请访问",
130 | Close: "关闭",
131 | // labels
132 | "Download status": "当前下载状态",
133 | "Download Speed": "当前下载速度",
134 | "Upload Speed": "当前上传速度",
135 | "Estimated time": "预计剩余时间",
136 | "Download Size": "下载总大小",
137 | Downloaded: "已下载大小",
138 | Progress: "当前下载进度",
139 | "Download Path": "文件下载路径",
140 | Uploaded: "已上传大小",
141 | "Download GID": "下载的 GID",
142 | "Number of Pieces": "文件块数量",
143 | "Piece Length": "每块大小",
144 |
145 | //alerts
146 | "The last connection attempt was unsuccessful. Trying another configuration":
147 | "上次连接请求未成功,正在尝试使用另一个配置",
148 | "Oh Snap!": "糟糕!",
149 | "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
150 | "无法连接到 Aria2 RPC 服务器,将在10秒后重试。您可能需要检查连接设置,请前往 设置 > 连接设置",
151 | "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
152 | "连接到 Aria2 RPC 服务器时认证失败,将在10秒后重试。您可能需要确认您的身份验证信息,请前往 设置 > 连接设置",
153 | "Successfully connected to Aria2 through its remote RPC …": "通过 RPC 连接到 Aria2 成功!",
154 | "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
155 | "通过 RPC 连接到 Aria2 成功,但是连接并不安全。要想使用安全连接,尝试在启动 Aria2 时添加一个授权密码令牌(通过 --rpc-secret 参数)",
156 | "Trying to connect to aria2 using the new connection configuration":
157 | "正在尝试使用新的连接配置来连接到 Aria2 ……",
158 | "Remove {{name}} and associated meta-data?": "是否删除 {{name}} 和关联的元数据?"
159 | };
160 |
--------------------------------------------------------------------------------
/src/js/translate/zh_TW.js:
--------------------------------------------------------------------------------
1 | if (typeof translations == "undefined") {
2 | translations = {};
3 | }
4 |
5 | translations.zh_TW = {
6 | // header
7 | Search: "搜尋",
8 | // Nav menu
9 | Add: "新增",
10 | "By URIs": "使用連結",
11 | "By Torrents": "使用種子",
12 | "By Metalinks": "使用 Metalink",
13 | Manage: "管理",
14 | "Pause All": "暫停所有",
15 | "Resume Paused": "恢復下載",
16 | "Purge Completed": "清除已完成",
17 | "Shutdown Server": "關閉伺服器",
18 | Settings: "設定",
19 | "Connection Settings": "連線設定",
20 | "Global Settings": "全域性設定",
21 | "Server info": "伺服器資訊",
22 | "About and contribute": "關於和捐助",
23 | "Toggle navigation": "切換導航",
24 | // body
25 | // nav side bar
26 | Miscellaneous: "雜項",
27 | "Global Statistics": "全域性統計",
28 | About: "關於",
29 | Displaying: "正在顯示",
30 | of: "/",
31 | downloads: "下載",
32 | Language: "語言",
33 | // download filters
34 | "Download Filters": "下載過濾器",
35 | Running: "執行中",
36 | Active: "活動的",
37 | Waiting: "等待中",
38 | Complete: "已完成",
39 | Error: "出錯的",
40 | Paused: "已暫停",
41 | Removed: "已刪除",
42 | "Hide linked meta-data": "隱藏連線的元資料",
43 | Toggle: "反向選擇",
44 | "Reset filters": "重置過濾器",
45 | // download status
46 | Verifying: "正在驗證",
47 | "Verify Pending": "等待驗證",
48 | // starred properties
49 | "Quick Access Settings": "快速訪問設定",
50 | Save: "儲存",
51 | "Save settings": "儲存設定",
52 | "Currently no download in line to display, use the": "當前沒有可顯示的下載項,使用",
53 | "download button to start downloading files!": "按鈕來開始下載!",
54 | Peers: "Peers",
55 | "More Info": "更多資訊",
56 | Remove: "刪除",
57 | "# of": "塊數",
58 | Length: "塊大小",
59 | // modals
60 | "Add Downloads By URIs": "使用連結下載",
61 | "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":
62 | "- 你可以同時新增多個檔案下載任務,每行下載一個檔案;",
63 | "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":
64 | "- 你也可以給同一個下載任務新增多個映象連結,寫在一行並用空格分隔每條連結;",
65 | "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "- 連結可以是 HTTP(S)、FTP 和磁力連結。",
66 | "Download settings": "下載設定",
67 | "Advanced settings": "高階設定",
68 | Cancel: "取消",
69 | Start: "開始",
70 | Choose: "選擇",
71 | "Quick Access (shown on the main page)": "快速訪問(在主頁上顯示)",
72 | // add torrent modal
73 | "Add Downloads By Torrents": "使用種子下載",
74 | "- Select the torrent from the local filesystem to start the download.":
75 | "- 從本地檔案系統選擇種子檔案開始下載;",
76 | "- You can select multiple torrents to start multiple downloads.":
77 | "- 你可以同時選擇多個種子來啟動多個下載;",
78 | "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":
79 | "- 如果要新增磁力連結,請使用新增連結的方式。",
80 | "Select Torrents": "選擇種子檔案",
81 | "Select a Torrent": "選擇種子檔案",
82 | // add metalink modal
83 | "Add Downloads By Metalinks": "使用 Metalink 下載",
84 | "Select Metalinks": "選擇 Metalink 檔案",
85 | "- Select the Metalink from the local filesystem to start the download.":
86 | "* 從本地檔案系統選擇 Metalink 檔案開始下載;",
87 | "- You can select multiple Metalinks to start multiple downloads.":
88 | "* 你可以同時選擇多個 Metalink 檔案來啟動多個下載。",
89 | "Select a Metalink": "選擇 Metalink 檔案",
90 | // select file modal
91 | "Choose files to start download for": "請選擇要下載的檔案",
92 | "Select to download": "選擇以下載",
93 | // settings modal
94 | "Aria2 RPC host and port": "Aria2 RPC 主機和埠",
95 | "Enter the host": "主機",
96 | "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":
97 | "輸入 Aria2 RPC 所在伺服器的 IP 或域名(預設:localhost)",
98 | "Enter the port": "埠號",
99 | "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":
100 | "輸入 Aria2 RPC 埠號(預設:6800)",
101 | "Enter the RPC path": "RPC 路徑",
102 | "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":
103 | "輸入 Aria2 RPC 路徑(預設:/jsonrpc)",
104 | "SSL/TLS encryption": "SSL/TLS 加密",
105 | "Enable SSL/TLS encryption": "啟用 SSL/TLS 加密",
106 | "Enter the secret token (optional)": "密碼令牌(可選)",
107 | "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":
108 | "輸入 Aria2 RPC 密碼令牌(如果未啟用則留空)",
109 | "Enter the username (optional)": "使用者名稱(可選)",
110 | "Enter the Aria2 RPC username (empty if authentication not enabled)":
111 | "輸入 Aria2 RPC 使用者名稱(如果未啟用身份驗證則留空)",
112 | "Enter the password (optional)": "密碼(可選)",
113 | "Enter the Aria2 RPC password (empty if authentication not enabled)":
114 | "輸入 Aria2 RPC 密碼(如果未啟用身份驗證則留空)",
115 | "Enter base URL (optional)": "基本連結地址(可選)",
116 | "Direct Download": "直接下載",
117 | "If supplied, links will be created to enable direct download from the Aria2 server.":
118 | "如果指定該選項,將會建立可以直接從 Aria2 伺服器上下載檔案的連結。",
119 | "(Requires appropriate webserver to be configured.)": "(需要 WEB 伺服器配置正確)",
120 | "Save Connection configuration": "儲存連線配置",
121 | Filter: "過濾",
122 | // server info modal
123 | "Aria2 server info": "Aria2 伺服器資訊",
124 | "Aria2 Version": "Aria2 版本",
125 | "Features Enabled": "已啟用功能",
126 | // about modal
127 | "To download the latest version of the project, add issues or to contribute back, head on to":
128 | "下載最新版本、提交問題或捐助,請訪問",
129 | "Or you can open the latest version in the browser through": "直接在瀏覽器中使用最新版本,請訪問",
130 | Close: "關閉",
131 | // labels
132 | "Download status": "當前下載狀態",
133 | "Download Speed": "當前下載速度",
134 | "Upload Speed": "當前上傳速度",
135 | "Estimated time": "預計剩餘時間",
136 | "Download Size": "下載總大小",
137 | Downloaded: "已下載大小",
138 | Progress: "當前下載進度",
139 | "Download Path": "檔案下載路徑",
140 | Uploaded: "已上傳大小",
141 | "Download GID": "下載的 GID",
142 | "Number of Pieces": "檔案塊數量",
143 | "Piece Length": "每塊大小",
144 |
145 | //alerts
146 | "The last connection attempt was unsuccessful. Trying another configuration":
147 | "上次連線請求未成功,正在嘗試使用另一個配置",
148 | "Oh Snap!": "糟糕!",
149 | "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":
150 | "無法連線到 Aria2 RPC 伺服器,將在10秒後重試。您可能需要檢查連線設定,請前往 設定 > 連線設定",
151 | "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":
152 | "連線到 Aria2 RPC 伺服器時認證失敗,將在10秒後重試。您可能需要確認您的身份驗證資訊,請前往 設定 > 連線設定",
153 | "Successfully connected to Aria2 through its remote RPC …": "通過 RPC 連線到 Aria2 成功!",
154 | "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":
155 | "通過 RPC 連線到 Aria2 成功,但是連線並不安全。要想使用安全連線,嘗試在啟動 Aria2 時新增一個授權密碼令牌(通過 --rpc-secret 引數)",
156 | "Trying to connect to aria2 using the new connection configuration":
157 | "正在嘗試使用新的連線配置來連線到 Aria2 ……",
158 | "Remove {{name}} and associated meta-data?": "是否刪除 {{name}} 和關聯的元資料?"
159 | };
160 |
--------------------------------------------------------------------------------
/src/scss/_bootstrap-custom.scss:
--------------------------------------------------------------------------------
1 | // This is a customised bootstrap v3.3.7 file for webui-aria2
2 | // Extra components which are not being used are commented
3 |
4 | // Core variables and mixins
5 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/variables";
6 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/mixins";
7 |
8 | // Reset and dependencies
9 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/normalize";
10 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/print";
11 | //@import "~bootstrap-sass/assets/stylesheets/bootstrap/glyphicons";
12 |
13 | // Core CSS
14 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/scaffolding";
15 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/type";
16 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/code";
17 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/grid";
18 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/tables";
19 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/forms";
20 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/buttons";
21 |
22 | // Components
23 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/component-animations";
24 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/dropdowns";
25 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/button-groups";
26 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/input-groups";
27 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/navs";
28 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/navbar";
29 | //@import "~bootstrap-sass/assets/stylesheets/bootstrap/breadcrumbs";
30 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/pagination";
31 | //@import "~bootstrap-sass/assets/stylesheets/bootstrap/pager";
32 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/labels";
33 | //@import "~bootstrap-sass/assets/stylesheets/bootstrap/badges";
34 | //@import "~bootstrap-sass/assets/stylesheets/bootstrap/jumbotron";
35 | //@import "~bootstrap-sass/assets/stylesheets/bootstrap/thumbnails";
36 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/alerts";
37 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/progress-bars";
38 | //@import "~bootstrap-sass/assets/stylesheets/bootstrap/media";
39 | //@import "~bootstrap-sass/assets/stylesheets/bootstrap/list-group";
40 | //@import "~bootstrap-sass/assets/stylesheets/bootstrap/panels";
41 | //@import "~bootstrap-sass/assets/stylesheets/bootstrap/responsive-embed";
42 | //@import "~bootstrap-sass/assets/stylesheets/bootstrap/wells";
43 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/close";
44 |
45 | // Components w/ JavaScript
46 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/modals";
47 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/tooltip";
48 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/popovers";
49 | //@import "~bootstrap-sass/assets/stylesheets/bootstrap/carousel";
50 |
51 | // Utility classes
52 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/utilities";
53 | @import "~bootstrap-sass/assets/stylesheets/bootstrap/responsive-utilities";
54 |
--------------------------------------------------------------------------------
/src/scss/_download.scss:
--------------------------------------------------------------------------------
1 | .download .label {
2 | box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
3 | -webkit-transition: all 2s;
4 | transition: all 2s;
5 | }
6 |
7 | .download .title {
8 | font-size: 1.2em;
9 | padding: 5px 0;
10 | }
11 |
12 | .download .progress {
13 | background-color: #fff;
14 | box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
15 | width: 100%;
16 | margin: 0;
17 | padding: 0;
18 | }
19 |
20 | .download .progress-bar {
21 | box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
22 | }
23 |
24 | .download-name {
25 | font-weight: bold;
26 | font-size: small;
27 | word-wrap: break-word;
28 | }
29 |
30 | .active-download,
31 | .waiting-download,
32 | .stopped-download,
33 | .download {
34 | cursor: pointer;
35 | width: 100%;
36 | padding: 4px 5px;
37 | background-color: #fff;
38 | margin-bottom: 20px;
39 | box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14),
40 | 0 2px 1px -1px rgba(0, 0, 0, 0.12);
41 | }
42 |
43 | /* fix table layout to break words */
44 | @media (max-width: 767px) {
45 | .active-download,
46 | .waiting-download,
47 | .stopped-download,
48 | .download {
49 | table-layout: fixed;
50 | }
51 | }
52 |
53 | .download-graph {
54 | margin: 0.5em 30px 0.5em 0;
55 | }
56 |
57 | @media (min-width: 1200px) {
58 | .download-graph {
59 | width: 50%;
60 | }
61 | }
62 |
63 | @media (min-width: 767px) and (max-width: 1200px) {
64 | .download-graph {
65 | width: 60%;
66 | }
67 | }
68 |
69 | @media (max-width: 767px) {
70 | .download-graph {
71 | width: 100%;
72 | }
73 | }
74 |
75 | .large-graph {
76 | width: 66%;
77 | }
78 |
79 | .stats {
80 | margin: 0 auto;
81 | padding: 0;
82 | }
83 |
84 | .stats li {
85 | display: inline-block;
86 | margin-bottom: 2px;
87 | padding: 0.75ex;
88 | min-width: 20ex;
89 | text-align: center;
90 | }
91 |
92 | .download-item {
93 | margin: 0;
94 | padding: 0.5ex 6px 0.5ex;
95 | }
96 |
97 | .download-controls .btn-group {
98 | float: right;
99 | }
100 |
101 | .download-controls > .btn-group {
102 | margin: 5px 5px 5px 0;
103 | }
104 |
105 | .download-controls .btn-group .btn {
106 | height: 100%;
107 | }
108 |
109 | .download-controls .btn-group .btn span {
110 | font-size: 14px;
111 | color: gray;
112 | }
113 |
114 | .download-detail h4 {
115 | margin-left: 10px;
116 | }
117 |
118 | .download-files {
119 | margin: 0;
120 | }
121 |
122 | .download-files li {
123 | display: inline-block;
124 | padding: 0.8ex;
125 | max-width: 100%;
126 | margin: 0 6px 6px 0;
127 | overflow: hidden;
128 | text-overflow: ellipsis;
129 | }
130 |
131 | .download-files a {
132 | color: #fff;
133 | }
134 |
135 | .download-empty {
136 | padding: 40px;
137 | background-color: #fff;
138 | border-radius: 2px;
139 | box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14),
140 | 0 2px 1px -1px rgba(0, 0, 0, 0.12);
141 | }
142 |
--------------------------------------------------------------------------------
/src/scss/_flag-icon-css-custom.scss:
--------------------------------------------------------------------------------
1 | $flag-icon-css-path: "~flag-icon-css/flags";
2 |
3 | @import "~flag-icon-css/sass/variables";
4 | @import "~flag-icon-css/sass/flag-icon-base";
5 |
6 | // Include only the required flags
7 | @include flag-icon(us);
8 | @include flag-icon(th);
9 | @include flag-icon(nl);
10 | @include flag-icon(cn);
11 | @include flag-icon(tw);
12 | @include flag-icon(pl);
13 | @include flag-icon(fr);
14 | @include flag-icon(de);
15 | @include flag-icon(es);
16 | @include flag-icon(ru);
17 | @include flag-icon(it);
18 | @include flag-icon(tr);
19 | @include flag-icon(cz);
20 | @include flag-icon(ir);
21 | @include flag-icon(id);
22 | @include flag-icon(br);
23 |
--------------------------------------------------------------------------------
/src/scss/_icon.scss:
--------------------------------------------------------------------------------
1 | .icon {
2 | display: inline-block;
3 | width: 1em;
4 | height: 1em;
5 | stroke-width: 0;
6 | stroke: currentColor;
7 | fill: currentColor;
8 | vertical-align: sub;
9 | margin-bottom: 0.1em;
10 | &.icon-fw {
11 | width: 1.28571429em;
12 | }
13 | }
14 |
15 | .rotate-90 {
16 | transform: rotate(-90deg);
17 | }
18 |
--------------------------------------------------------------------------------
/src/scss/_modals.scss:
--------------------------------------------------------------------------------
1 | .modal-body textarea {
2 | width: 100%;
3 | }
4 |
5 | .modal-advanced-title {
6 | font-weight: bold;
7 | margin-bottom: 0;
8 | background-color: rgb(245, 245, 245);
9 | border: 1px solid rgba(0, 0, 0, 0.05);
10 | border-bottom: 0;
11 | border-radius: 4px 4px 0 0;
12 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
13 | cursor: pointer;
14 | padding: 5px 15px;
15 | }
16 |
17 | .modal-advanced-options {
18 | /*width: 100%;
19 | margin-bottom: 10px;*/
20 | margin-top: 0;
21 | margin-bottom: 2px;
22 | background-color: rgb(245, 245, 245);
23 | border: 1px solid rgba(0, 0, 0, 0.05);
24 | border-top: 0;
25 | border-radius: 0 0 4px 4px;
26 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
27 | }
28 |
29 | .modal-form-input-verylarge {
30 | width: 95%;
31 | }
32 |
33 | .modal-form-input-number {
34 | width: 80px;
35 | }
36 |
37 | .selectFiles div .control-label {
38 | font-weight: normal;
39 | margin-left: 30px;
40 | }
41 |
42 | .selectFiles div .controls {
43 | margin-left: 30px;
44 | }
45 |
46 | .selectFiles div.recursivedir {
47 | width: 100%;
48 | }
49 |
--------------------------------------------------------------------------------
/src/scss/_style.scss:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: "Lato", sans-serif;
3 | overflow-y: scroll;
4 | background-color: #f5f5f5;
5 | padding-bottom: 5em;
6 | }
7 |
8 | input[type="checkbox"],
9 | input[type="radio"] {
10 | vertical-align: middle;
11 | position: relative;
12 | }
13 |
14 | .pagination ul > li:not(.disabled) {
15 | cursor: pointer;
16 | }
17 |
18 | .pagination ul > li.active > a {
19 | color: #fff;
20 | background-color: #428bca;
21 | }
22 |
23 | .label-active,
24 | .badge-active,
25 | .progress-active .bar {
26 | background-color: #62c462;
27 | }
28 |
29 | .progress-success .bar {
30 | background-color: #468847 !important;
31 | }
32 |
33 | .alerts {
34 | position: fixed;
35 | right: 6px;
36 | z-index: 900;
37 | width: 40%;
38 | }
39 |
40 | .alert {
41 | float: right;
42 | clear: right;
43 | margin-bottom: 5px;
44 | margin-top: 5px;
45 | }
46 |
47 | /* fix modal overflow on low resolutions */
48 | .modal {
49 | position: absolute;
50 | }
51 |
52 | #global-graph {
53 | width: 100%;
54 | }
55 |
56 | @media (min-width: 767px) and (max-width: 992px) {
57 | #global-graph {
58 | width: 80%;
59 | }
60 | }
61 |
62 | #download-filter {
63 | margin: 0;
64 | height: auto;
65 | }
66 |
67 | #filters label {
68 | display: inline-block;
69 | white-space: nowrap;
70 | }
71 |
72 | .nav-header {
73 | display: block;
74 | padding: 3px 0;
75 | font-size: 11px;
76 | font-weight: bold;
77 | line-height: 20px;
78 | color: #999;
79 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
80 | text-transform: uppercase;
81 | }
82 |
83 | .main-navbar {
84 | box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.1);
85 | background-color: #00897b;
86 | border-color: #00897b;
87 | }
88 |
89 | .main-navbar .navbar-brand {
90 | color: #fff;
91 | }
92 |
93 | .main-navbar .nav > li > a {
94 | color: #fff;
95 | transition: background-color 0.3s ease-in-out;
96 | }
97 |
98 | .main-navbar .navbar-toggle .icon-bar {
99 | background-color: #fff;
100 | }
101 |
102 | .main-navbar .nav .open > a,
103 | .main-navbar .nav .open > a:hover,
104 | .main-navbar .nav .open > a:focus,
105 | .main-navbar .nav > li > a:focus,
106 | .main-navbar .nav > li > a:hover {
107 | background-color: rgba(0, 0, 0, 0.2);
108 | }
109 |
110 | .sidebar-nav {
111 | margin-bottom: 30px;
112 | background-color: #fff;
113 | padding: 10px 20px 20px;
114 | border-radius: 2px;
115 | box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14),
116 | 0 2px 1px -1px rgba(0, 0, 0, 0.12);
117 | }
118 |
119 | .filter-input-group {
120 | position: relative;
121 | margin-bottom: 30px;
122 | }
123 |
124 | .filter-input-group > .clear-button {
125 | position: absolute;
126 | right: 25px;
127 | top: 6px;
128 | cursor: pointer;
129 | }
130 |
--------------------------------------------------------------------------------
/src/scss/app.scss:
--------------------------------------------------------------------------------
1 | @charset 'utf-8';
2 |
3 | // Vendor Styles
4 | @import "bootstrap-custom";
5 | @import "flag-icon-css-custom";
6 |
7 | // Application Styles
8 | @import "icon";
9 | @import "style";
10 | @import "download";
11 | @import "modals";
12 |
--------------------------------------------------------------------------------
/static.json:
--------------------------------------------------------------------------------
1 | {
2 | "root": "./docs",
3 | "routes": {
4 | "/**": "index.html"
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require("path");
2 | const webpack = require("webpack");
3 |
4 | const MiniCssExtractPlugin = require("mini-css-extract-plugin");
5 | const HtmlWebpackPlugin = require("html-webpack-plugin");
6 | const CleanWebpackPlugin = require("clean-webpack-plugin");
7 | const WorkboxPlugin = require("workbox-webpack-plugin");
8 |
9 | const BUILD_DIR = path.join(__dirname, "docs");
10 | const APP_DIR = path.join(__dirname, "src", "js");
11 |
12 | const config = {
13 | entry: {
14 | app: APP_DIR + "/app.js"
15 | },
16 | module: {
17 | rules: [
18 | {
19 | test: /\.scss$/,
20 | use: [MiniCssExtractPlugin.loader, "css-loader", "postcss-loader", "sass-loader"]
21 | },
22 | {
23 | test: /\.css$/,
24 | use: [MiniCssExtractPlugin.loader, "css-loader", "postcss-loader"]
25 | },
26 | {
27 | test: /\.svg$/,
28 | use: [
29 | {
30 | loader: "file-loader",
31 | options: {
32 | name: "[name].[ext]",
33 | outputPath: "flags/"
34 | }
35 | }
36 | ]
37 | }
38 | ]
39 | },
40 | output: {
41 | path: BUILD_DIR,
42 | filename: "[name].js"
43 | },
44 | plugins: [
45 | new CleanWebpackPlugin(["docs"]),
46 | new webpack.ProvidePlugin({
47 | "window.jQuery": "jquery",
48 | jQuery: "jquery",
49 | $: "jquery"
50 | }),
51 | new HtmlWebpackPlugin({
52 | template: "src/index-template.html",
53 | inject: "head"
54 | }),
55 | new MiniCssExtractPlugin({
56 | filename: "[name].css"
57 | }),
58 | new WorkboxPlugin.GenerateSW()
59 | ],
60 | optimization: {
61 | splitChunks: {
62 | cacheGroups: {
63 | commons: { test: /[\\/]node_modules[\\/]/, name: "vendor", chunks: "all" }
64 | }
65 | }
66 | },
67 | resolve: {
68 | modules: [
69 | path.resolve("./"),
70 | path.resolve("./node_modules"),
71 | path.resolve("./src/js"),
72 | path.resolve("./src/scss")
73 | ]
74 | }
75 | };
76 |
77 | module.exports = config;
78 |
--------------------------------------------------------------------------------
/webui-aria2.spec:
--------------------------------------------------------------------------------
1 | Name: webui-aria2
2 | Version: master
3 | Release: 1%{?dist}
4 | Summary: Web interface for aria2
5 |
6 | License: MIT License
7 | URL: https://codeload.github.com/ziahamza/webui-aria2
8 | Source0: https://codeload.github.com/ziahamza/%{name}/tar.gz/%{name}-%{version}.tar.gz
9 |
10 | #Requires: aria2
11 |
12 | %description
13 | The aim for this project is to create the worlds best and hottest interface to interact with aria2.
14 | aria2 is the worlds best file downloader, but sometimes the command line brings more power than necessary.
15 | The project was initially created as part of the GSOC scheme, however it has rapidly grown and changed with
16 | tremendous support and feedback from the aria2 community
17 |
18 | #%prep
19 | #%setup -q -n %{name}-%{version}
20 |
21 | #%build
22 | #%configure
23 | #make %{?_smp_mflags}
24 |
25 | %install
26 | tar xvzf %{SOURCE0}
27 | #
28 | mkdir -p $RPM_BUILD_ROOT/usr/share/%{name}
29 | cp -R %{name}-%{version}/css $RPM_BUILD_ROOT/usr/share/%{name}/
30 | cp -R %{name}-%{version}/flags $RPM_BUILD_ROOT/usr/share/%{name}/
31 | cp -R %{name}-%{version}/fonts $RPM_BUILD_ROOT/usr/share/%{name}/
32 | cp -R %{name}-%{version}/img $RPM_BUILD_ROOT/usr/share/%{name}/
33 | cp -R %{name}-%{version}/js $RPM_BUILD_ROOT/usr/share/%{name}/
34 | cp %{name}-%{version}/configuration.js $RPM_BUILD_ROOT/usr/share/%{name}/
35 | cp %{name}-%{version}/favicon.ico $RPM_BUILD_ROOT/usr/share/%{name}/
36 | cp %{name}-%{version}/index.html $RPM_BUILD_ROOT/usr/share/%{name}/
37 | cp %{name}-%{version}/LICENSE $RPM_BUILD_ROOT/usr/share/%{name}/
38 | #
39 | find $RPM_BUILD_ROOT/usr/share/%{name} -type d | xargs chmod 755
40 | find $RPM_BUILD_ROOT/usr/share/%{name} -type f | xargs chmod 644
41 | mkdir -p $RPM_BUILD_ROOT/usr/bin
42 | cat > $RPM_BUILD_ROOT/usr/bin/%{name} < $RPM_BUILD_ROOT/usr/lib/systemd/system/%{name}.service < $RPM_BUILD_ROOT/etc/firewalld/services/%{name}.xml <
115 |
116 | WebUI-Aria2
117 | WebUI for Aria2
118 |
119 |
120 | HERE
121 | #
122 | %files
123 | %defattr(-,nobody,nobody)
124 | #
125 | %dir %attr(755,root,root) /usr/share/%{name}
126 | #
127 | %attr(-,nobody,nobody) /usr/share/%{name}/css
128 | %attr(-,nobody,nobody) /usr/share/%{name}/flags
129 | %attr(-,nobody,nobody) /usr/share/%{name}/fonts
130 | %attr(-,nobody,nobody) /usr/share/%{name}/img
131 | %attr(-,nobody,nobody) /usr/share/%{name}/js
132 | %attr(-,nobody,nobody) /usr/share/%{name}/LICENSE
133 | %attr(-,nobody,nobody) /usr/share/%{name}/configuration.js
134 | %attr(-,nobody,nobody) /usr/share/%{name}/favicon.ico
135 | %attr(-,nobody,nobody) /usr/share/%{name}/index.html
136 | #
137 | %attr(644,root,root) /usr/lib/systemd/system/%{name}.service
138 | %attr(644,root,root) /etc/firewalld/services/%{name}.xml
139 | %attr(755,root,root) /usr/bin/%{name}
140 | #
141 | %changelog
142 | * Sun Feb 08 2016 Aleksandr Chernyshev - pull request #183
143 | - Initial release.
144 |
--------------------------------------------------------------------------------