Compare commits
434 Commits
disable-no
...
throw-erro
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb7f7bb4d1 | ||
|
|
389e49183c | ||
|
|
4c1a5f84fa | ||
|
|
b0bb156918 | ||
|
|
5565204273 | ||
|
|
d950a0ef5d | ||
|
|
b2c0f7efc3 | ||
|
|
9e58bc19c4 | ||
|
|
0d7e2afba4 | ||
|
|
e0d063d306 | ||
|
|
ed0ad587dc | ||
|
|
56fe591eee | ||
|
|
7b9693bca4 | ||
|
|
fd0417b14c | ||
|
|
89c12f2585 | ||
|
|
5c71adb137 | ||
|
|
4c23062d1e | ||
|
|
190b45086c | ||
|
|
008983c8e3 | ||
|
|
cb8a375c5e | ||
|
|
848a60aa9b | ||
|
|
88ea794fdb | ||
|
|
870350fd61 | ||
|
|
1e25894f7e | ||
|
|
223e74569a | ||
|
|
0a4d793556 | ||
|
|
5503914abe | ||
|
|
906466d7fb | ||
|
|
e2532de766 | ||
|
|
3ac4390d11 | ||
|
|
389ae7a573 | ||
|
|
176247091d | ||
|
|
e22cc73f32 | ||
|
|
c23ad25899 | ||
|
|
9cc0418769 | ||
|
|
925a2c8e77 | ||
|
|
390734d86e | ||
|
|
218f7be1a7 | ||
|
|
246955b68a | ||
|
|
d24506baed | ||
|
|
b0be2237fa | ||
|
|
945394fb1a | ||
|
|
19886f71f5 | ||
|
|
23855c09dc | ||
|
|
618ab01cd7 | ||
|
|
349d90b60e | ||
|
|
9e7c2dcdbb | ||
|
|
f353589a53 | ||
|
|
fc97929dee | ||
|
|
3d77642a1e | ||
|
|
b55c1a35bf | ||
|
|
5df700a56e | ||
|
|
0c64a86ebe | ||
|
|
644ba46945 | ||
|
|
4ab54f284c | ||
|
|
210c2a8855 | ||
|
|
0ed4f1a9a4 | ||
|
|
7e648840a1 | ||
|
|
5e090778ae | ||
|
|
049ed114fd | ||
|
|
88007a08f2 | ||
|
|
6c4ed282bb | ||
|
|
c8765385df | ||
|
|
0ed22c0be0 | ||
|
|
3ffef4b9fb | ||
|
|
ceeebceb3a | ||
|
|
0338b26d5c | ||
|
|
6577cc0c8c | ||
|
|
586000ca3d | ||
|
|
abc81ebd08 | ||
|
|
cd6c73e487 | ||
|
|
69ad57338f | ||
|
|
cbcf31a4f9 | ||
|
|
b19beac5b4 | ||
|
|
dc6d088e30 | ||
|
|
b0ad27af23 | ||
|
|
5f23c6358a | ||
|
|
da776c935f | ||
|
|
0a315783ef | ||
|
|
65061b0514 | ||
|
|
063e5e359e | ||
|
|
f460afca35 | ||
|
|
66a08ace1d | ||
|
|
68e65e968a | ||
|
|
1ba0ab982b | ||
|
|
8752b8bb3f | ||
|
|
168f86ef89 | ||
|
|
85927853f9 | ||
|
|
57f60bf173 | ||
|
|
d16c3ed40a | ||
|
|
e90f4a2cbf | ||
|
|
d00839ec68 | ||
|
|
ea35d92493 | ||
|
|
beb9894c47 | ||
|
|
5556a996cd | ||
|
|
f7b1dcc271 | ||
|
|
eb226e1dcf | ||
|
|
8332ad0f16 | ||
|
|
06af5a004e | ||
|
|
ce32873ef8 | ||
|
|
99bc230fe6 | ||
|
|
0e3820b634 | ||
|
|
eba84dcd78 | ||
|
|
864f27ef72 | ||
|
|
a8b72d8342 | ||
|
|
15d2cfba90 | ||
|
|
2851d993ad | ||
|
|
3f1d88282e | ||
|
|
cc9ce916c6 | ||
|
|
c7d468578f | ||
|
|
e0f6988eb5 | ||
|
|
09ff370ddc | ||
|
|
32ecf30c82 | ||
|
|
a62adccd3d | ||
|
|
c75bf35f59 | ||
|
|
3013782b7b | ||
|
|
81abebd144 | ||
|
|
140b6c1227 | ||
|
|
ac685f65e9 | ||
|
|
f6b1cbd5d0 | ||
|
|
7db6e43e3f | ||
|
|
6c73614a47 | ||
|
|
b5c54b4e41 | ||
|
|
8f1c84e6d4 | ||
|
|
d1df4af734 | ||
|
|
23cd04fe88 | ||
|
|
dbc7c97e0b | ||
|
|
2313ca8f72 | ||
|
|
9418ba1687 | ||
|
|
233491940c | ||
|
|
7708e7ab08 | ||
|
|
600bd38630 | ||
|
|
f7290dfcb6 | ||
|
|
e22f7583eb | ||
|
|
c0e85f5687 | ||
|
|
3593f67eb6 | ||
|
|
1b251264a6 | ||
|
|
93c1a1d42e | ||
|
|
d7f6b6b018 | ||
|
|
fd99f20404 | ||
|
|
2b1e1b11a3 | ||
|
|
96ac7f9f35 | ||
|
|
33da64a669 | ||
|
|
38eb4ccbc4 | ||
|
|
a57414307e | ||
|
|
7ad111e2f6 | ||
|
|
a402128a7d | ||
|
|
d3ab4a5145 | ||
|
|
4ae77bcef9 | ||
|
|
e84416e56d | ||
|
|
59ccc9d73e | ||
|
|
1533a28817 | ||
|
|
7e4840867e | ||
|
|
f2f3f045e5 | ||
|
|
b12149bafd | ||
|
|
307c1b0b62 | ||
|
|
b201745988 | ||
|
|
352266481e | ||
|
|
c201ea53ba | ||
|
|
958867e92b | ||
|
|
b50de2f2ed | ||
|
|
ad37db4c82 | ||
|
|
c2d91c9544 | ||
|
|
6eedca6e7e | ||
|
|
0bd1d0bb05 | ||
|
|
1f359f5a13 | ||
|
|
fe53b5503c | ||
|
|
d66ef8fe22 | ||
|
|
6ff3a633f7 | ||
|
|
46891437e9 | ||
|
|
b729597728 | ||
|
|
f99d139025 | ||
|
|
b72b917af2 | ||
|
|
749869fdca | ||
|
|
e56a694878 | ||
|
|
8cb4d1dc28 | ||
|
|
68f1351507 | ||
|
|
66205286e4 | ||
|
|
32be373552 | ||
|
|
b1128c17f1 | ||
|
|
319bbd2f81 | ||
|
|
d8fb4f0a87 | ||
|
|
2e195575a6 | ||
|
|
28efeaa4f2 | ||
|
|
137534f901 | ||
|
|
c9594d46af | ||
|
|
1097648f0a | ||
|
|
17e6213448 | ||
|
|
2ea423032e | ||
|
|
2dead1a19b | ||
|
|
e18b10297b | ||
|
|
fd66084388 | ||
|
|
ca27e096f3 | ||
|
|
125997f45f | ||
|
|
da8a2c7bbb | ||
|
|
81ca205caa | ||
|
|
f06d5b973b | ||
|
|
fd890f9c0a | ||
|
|
835237382f | ||
|
|
7dd699370f | ||
|
|
ef8c7184de | ||
|
|
92026c1f98 | ||
|
|
9bd9dcc41c | ||
|
|
81b97ba52f | ||
|
|
ae36777d14 | ||
|
|
3d7ad82f3e | ||
|
|
059796c60d | ||
|
|
b0342b7449 | ||
|
|
b867dd82ca | ||
|
|
a122286d48 | ||
|
|
837db800bc | ||
|
|
44fe39821a | ||
|
|
fbc6b14424 | ||
|
|
9c00140464 | ||
|
|
00d8deda0e | ||
|
|
b84ce6a556 | ||
|
|
f5fb4c6c64 | ||
|
|
ac686fefe1 | ||
|
|
e690e166b0 | ||
|
|
6a02dd8842 | ||
|
|
66e2c01a3e | ||
|
|
7f2176d7fc | ||
|
|
4434889270 | ||
|
|
96afc1a45d | ||
|
|
dbe49610a1 | ||
|
|
62fadb54ee | ||
|
|
3832383936 | ||
|
|
595c3fb833 | ||
|
|
1d25c55c0b | ||
|
|
6376e78e0b | ||
|
|
1f08d2929c | ||
|
|
04953d97ad | ||
|
|
64fe4de3fb | ||
|
|
58008445e2 | ||
|
|
b7f0b054b8 | ||
|
|
3bbd709bd6 | ||
|
|
dbb1e3f5d8 | ||
|
|
8144308aee | ||
|
|
0503d2a9f3 | ||
|
|
fafd4d9396 | ||
|
|
3431a1b1de | ||
|
|
026ea52445 | ||
|
|
1e60b9a322 | ||
|
|
7450cb1f21 | ||
|
|
cdd5a9e935 | ||
|
|
c4cc50ca39 | ||
|
|
9b09d369d9 | ||
|
|
12ab11413f | ||
|
|
352f3640cf | ||
|
|
7940e91cbe | ||
|
|
577a2356a0 | ||
|
|
38ef0b10e7 | ||
|
|
c72d3c4a0e | ||
|
|
eb7e48b059 | ||
|
|
ab62fa1c4f | ||
|
|
a7cf1f6cca | ||
|
|
80d89f31fe | ||
|
|
a0f566fef3 | ||
|
|
c93d362dd4 | ||
|
|
db72f5d011 | ||
|
|
03704384a8 | ||
|
|
5b17ec0b56 | ||
|
|
d4acd03698 | ||
|
|
2ea986326d | ||
|
|
da53de2097 | ||
|
|
cf755dec22 | ||
|
|
d25e5e1849 | ||
|
|
593648780f | ||
|
|
bb04ff5942 | ||
|
|
12db276eb8 | ||
|
|
596fc3e908 | ||
|
|
9c54b94265 | ||
|
|
3c1cfce95a | ||
|
|
2f9f3142e2 | ||
|
|
92070e502c | ||
|
|
48b1154a71 | ||
|
|
bcdfb98454 | ||
|
|
f26c1f8095 | ||
|
|
790a24bdeb | ||
|
|
5d2b9392d5 | ||
|
|
6be242fc15 | ||
|
|
8158c5042b | ||
|
|
c70cdd88c7 | ||
|
|
bc6d6b6550 | ||
|
|
9584d8e16d | ||
|
|
4693c678d0 | ||
|
|
2c7d668f81 | ||
|
|
de2f963717 | ||
|
|
e83da76dc7 | ||
|
|
643730221d | ||
|
|
ab63f9ef31 | ||
|
|
dc870c4cc4 | ||
|
|
dd709dec18 | ||
|
|
cd5b71aedd | ||
|
|
d33cc025ee | ||
|
|
e7159f2803 | ||
|
|
56b8a18820 | ||
|
|
5832794034 | ||
|
|
a26b197687 | ||
|
|
12dba0955a | ||
|
|
7bd425bb3d | ||
|
|
845ad17a04 | ||
|
|
67e8fcaf93 | ||
|
|
aa07ee22cf | ||
|
|
3702e8c6fe | ||
|
|
21bd4edee4 | ||
|
|
31de39a7a4 | ||
|
|
d0fc2569ff | ||
|
|
4fd1631b30 | ||
|
|
0a1614a872 | ||
|
|
1f66d7ef74 | ||
|
|
84b6429ca6 | ||
|
|
212e5ebab5 | ||
|
|
a6106077bd | ||
|
|
fa4ce6b4e6 | ||
|
|
4130136718 | ||
|
|
c7c1b8d4f1 | ||
|
|
25b60a1b90 | ||
|
|
dda4dadfa3 | ||
|
|
570dbc7b47 | ||
|
|
6c122248f5 | ||
|
|
4a369bb3c0 | ||
|
|
95cf57e3bd | ||
|
|
0e6f7a4dc1 | ||
|
|
6f21834e71 | ||
|
|
cf6ad254fb | ||
|
|
fabbecf4c2 | ||
|
|
8262aa4138 | ||
|
|
95d86ebf22 | ||
|
|
6aa7db2358 | ||
|
|
5637c6e651 | ||
|
|
6f705b053a | ||
|
|
1f3f2788d4 | ||
|
|
ed3c202099 | ||
|
|
0396eec398 | ||
|
|
62dcec49e4 | ||
|
|
2f6afb5e86 | ||
|
|
a3a2b2aafb | ||
|
|
4900ce24fa | ||
|
|
135aaf56fd | ||
|
|
62d7abdd9e | ||
|
|
91b079f4df | ||
|
|
2c6cd74dc1 | ||
|
|
68ac18dc98 | ||
|
|
dbc74164ab | ||
|
|
76c7b2ee9c | ||
|
|
d6913c1eb9 | ||
|
|
9aa00b2f0a | ||
|
|
af02917766 | ||
|
|
d93a7b315d | ||
|
|
a813955ad3 | ||
|
|
1e3425fdee | ||
|
|
a2b326e306 | ||
|
|
0fa0e8e3f3 | ||
|
|
dbae7502e5 | ||
|
|
f47552c0c4 | ||
|
|
74836828c9 | ||
|
|
c152243b4d | ||
|
|
2a40c9a595 | ||
|
|
3cea493d49 | ||
|
|
6991d0851f | ||
|
|
fb2a331f79 | ||
|
|
c888524523 | ||
|
|
75c9dbaf6b | ||
|
|
c01a29fe76 | ||
|
|
80417281c4 | ||
|
|
f9b8bc006f | ||
|
|
2c22b0839f | ||
|
|
ec3e67e0d2 | ||
|
|
611e7e9dd8 | ||
|
|
f4e19ac05c | ||
|
|
70663af190 | ||
|
|
ed265cfdcd | ||
|
|
5b82370bc3 | ||
|
|
47690fffc1 | ||
|
|
aa09bbe23d | ||
|
|
a09fbad8b0 | ||
|
|
357ba2f4f6 | ||
|
|
b32dd746a6 | ||
|
|
b4ea1ccc23 | ||
|
|
2aecbfbb67 | ||
|
|
6d3b907307 | ||
|
|
55da1e3e92 | ||
|
|
f3aa0d6428 | ||
|
|
ad89be7523 | ||
|
|
49a7c16de5 | ||
|
|
e414476c6e | ||
|
|
391690d570 | ||
|
|
1be4af733b | ||
|
|
e3222d99ac | ||
|
|
5b19d33387 | ||
|
|
272c85c062 | ||
|
|
7101af764a | ||
|
|
e582d25654 | ||
|
|
9991c4507d | ||
|
|
37b3248202 | ||
|
|
0585131f78 | ||
|
|
7e351b21bc | ||
|
|
440549fcc5 | ||
|
|
f7b557eed1 | ||
|
|
bdfe317e20 | ||
|
|
19805b91d9 | ||
|
|
420c458b6a | ||
|
|
6de449811d | ||
|
|
081fd541af | ||
|
|
7dcd5035c0 | ||
|
|
0f1bb3fb3b | ||
|
|
78c447829a | ||
|
|
3da0287ede | ||
|
|
ea3331840d | ||
|
|
3fc0f72f3a | ||
|
|
ea3abe6069 | ||
|
|
e66b317f02 | ||
|
|
aa8758dec2 | ||
|
|
ad6b29c09f | ||
|
|
09a585c93b | ||
|
|
8e4959a621 | ||
|
|
1e3f4ed398 | ||
|
|
7048193f00 | ||
|
|
17ae2648ed | ||
|
|
c952754c8c | ||
|
|
bf054dfda5 | ||
|
|
59654289cb | ||
|
|
cf13c11236 | ||
|
|
8ec992a8a3 | ||
|
|
f8b29674b2 | ||
|
|
fe55141a7b | ||
|
|
9205ccc124 | ||
|
|
00df3e2c40 | ||
|
|
a2578ac6b4 | ||
|
|
1fee636afa | ||
|
|
154bca4635 | ||
|
|
c584e31657 | ||
|
|
66340281e6 |
@@ -77,10 +77,6 @@ Metrics/CyclomaticComplexity:
|
|||||||
# process_video_params(query, preferences) => [20/10]
|
# process_video_params(query, preferences) => [20/10]
|
||||||
- src/invidious/videos.cr
|
- src/invidious/videos.cr
|
||||||
|
|
||||||
# produce_search_params(page, sort, ...) => [29/10]
|
|
||||||
# process_search_query(query, page, ...) => [14/10]
|
|
||||||
- src/invidious/search.cr
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#src/invidious/playlists.cr:327:5
|
#src/invidious/playlists.cr:327:5
|
||||||
|
|||||||
23
.github/workflows/ci.yml
vendored
23
.github/workflows/ci.yml
vendored
@@ -38,23 +38,26 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
stable: [true]
|
stable: [true]
|
||||||
crystal:
|
crystal:
|
||||||
- 1.0.0
|
|
||||||
- 1.1.1
|
|
||||||
- 1.2.2
|
- 1.2.2
|
||||||
|
- 1.3.2
|
||||||
|
- 1.4.0
|
||||||
|
- 1.5.0
|
||||||
include:
|
include:
|
||||||
- crystal: nightly
|
- crystal: nightly
|
||||||
stable: false
|
stable: false
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
|
||||||
- name: Install Crystal
|
- name: Install Crystal
|
||||||
uses: crystal-lang/install-crystal@v1.5.3
|
uses: crystal-lang/install-crystal@v1.6.0
|
||||||
with:
|
with:
|
||||||
crystal: ${{ matrix.crystal }}
|
crystal: ${{ matrix.crystal }}
|
||||||
|
|
||||||
- name: Cache Shards
|
- name: Cache Shards
|
||||||
uses: actions/cache@v2
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: ./lib
|
path: ./lib
|
||||||
key: shards-${{ hashFiles('shard.lock') }}
|
key: shards-${{ hashFiles('shard.lock') }}
|
||||||
@@ -84,7 +87,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Build Docker
|
- name: Build Docker
|
||||||
run: docker-compose build --build-arg release=0
|
run: docker-compose build --build-arg release=0
|
||||||
@@ -100,18 +103,18 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v2
|
||||||
with:
|
with:
|
||||||
platforms: arm64
|
platforms: arm64
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v2
|
||||||
|
|
||||||
- name: Build Docker ARM64 image
|
- name: Build Docker ARM64 image
|
||||||
uses: docker/build-push-action@v2
|
uses: docker/build-push-action@v3
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: docker/Dockerfile.arm64
|
file: docker/Dockerfile.arm64
|
||||||
|
|||||||
22
.github/workflows/container-release.yml
vendored
22
.github/workflows/container-release.yml
vendored
@@ -15,20 +15,20 @@ on:
|
|||||||
- screenshots/*
|
- screenshots/*
|
||||||
- .github/ISSUE_TEMPLATE/*
|
- .github/ISSUE_TEMPLATE/*
|
||||||
- kubernetes/**
|
- kubernetes/**
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install Crystal
|
- name: Install Crystal
|
||||||
uses: oprypin/install-crystal@v1.2.4
|
uses: crystal-lang/install-crystal@v1.6.0
|
||||||
with:
|
with:
|
||||||
crystal: 1.2.2
|
crystal: 1.5.0
|
||||||
|
|
||||||
- name: Run lint
|
- name: Run lint
|
||||||
run: |
|
run: |
|
||||||
if ! crystal tool format --check; then
|
if ! crystal tool format --check; then
|
||||||
@@ -38,15 +38,15 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v2
|
||||||
with:
|
with:
|
||||||
platforms: arm64
|
platforms: arm64
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v2
|
||||||
|
|
||||||
- name: Login to registry
|
- name: Login to registry
|
||||||
uses: docker/login-action@v1
|
uses: docker/login-action@v2
|
||||||
with:
|
with:
|
||||||
registry: quay.io
|
registry: quay.io
|
||||||
username: ${{ secrets.QUAY_USERNAME }}
|
username: ${{ secrets.QUAY_USERNAME }}
|
||||||
@@ -54,7 +54,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build and push Docker AMD64 image for Push Event
|
- name: Build and push Docker AMD64 image for Push Event
|
||||||
if: github.ref == 'refs/heads/master'
|
if: github.ref == 'refs/heads/master'
|
||||||
uses: docker/build-push-action@v2
|
uses: docker/build-push-action@v3
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: docker/Dockerfile
|
file: docker/Dockerfile
|
||||||
@@ -66,7 +66,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build and push Docker ARM64 image for Push Event
|
- name: Build and push Docker ARM64 image for Push Event
|
||||||
if: github.ref == 'refs/heads/master'
|
if: github.ref == 'refs/heads/master'
|
||||||
uses: docker/build-push-action@v2
|
uses: docker/build-push-action@v3
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: docker/Dockerfile.arm64
|
file: docker/Dockerfile.arm64
|
||||||
|
|||||||
4
.github/workflows/stale.yml
vendored
4
.github/workflows/stale.yml
vendored
@@ -10,11 +10,11 @@ jobs:
|
|||||||
stale:
|
stale:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v3
|
- uses: actions/stale@v5
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
days-before-stale: 365
|
days-before-stale: 365
|
||||||
days-before-pr-stale: 45 # PRs should be active. Anything that hasn't had activity in more than 45 days should be considered abandoned.
|
days-before-pr-stale: 45 # PRs should be active. Anything that hasn't had activity in more than 45 days should be considered abandoned.
|
||||||
days-before-close: 30
|
days-before-close: 30
|
||||||
exempt-pr-labels: blocked
|
exempt-pr-labels: blocked
|
||||||
stale-issue-message: 'This issue has been automatically marked as stale and will be closed in 30 days because it has not had recent activity and is much likely outdated. If you think this issue is still relevant and applicable, you just have to post a comment and it will be unmarked.'
|
stale-issue-message: 'This issue has been automatically marked as stale and will be closed in 30 days because it has not had recent activity and is much likely outdated. If you think this issue is still relevant and applicable, you just have to post a comment and it will be unmarked.'
|
||||||
|
|||||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "mocks"]
|
||||||
|
path = mocks
|
||||||
|
url = ../mocks
|
||||||
22
README.md
22
README.md
@@ -20,7 +20,7 @@
|
|||||||
<a href="https://hosted.weblate.org/engage/invidious/">
|
<a href="https://hosted.weblate.org/engage/invidious/">
|
||||||
<img alt="Translation Status" src="https://hosted.weblate.org/widgets/invidious/-/translations/svg-badge.svg">
|
<img alt="Translation Status" src="https://hosted.weblate.org/widgets/invidious/-/translations/svg-badge.svg">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="https://github.com/humanetech-community/awesome-humane-tech">
|
<a href="https://github.com/humanetech-community/awesome-humane-tech">
|
||||||
<img alt="Awesome Humane Tech" src="https://raw.githubusercontent.com/humanetech-community/awesome-humane-tech/main/humane-tech-badge.svg?sanitize=true">
|
<img alt="Awesome Humane Tech" src="https://raw.githubusercontent.com/humanetech-community/awesome-humane-tech/main/humane-tech-badge.svg?sanitize=true">
|
||||||
</a>
|
</a>
|
||||||
@@ -28,17 +28,17 @@
|
|||||||
<h3>An open source alternative front-end to YouTube</h3>
|
<h3>An open source alternative front-end to YouTube</h3>
|
||||||
|
|
||||||
<a href="https://invidious.io/">Website</a>
|
<a href="https://invidious.io/">Website</a>
|
||||||
•
|
•
|
||||||
<a href="https://instances.invidious.io/">Instances list</a>
|
<a href="https://instances.invidious.io/">Instances list</a>
|
||||||
•
|
•
|
||||||
<a href="https://docs.invidious.io/FAQ.md">FAQ</a>
|
<a href="https://docs.invidious.io/faq/">FAQ</a>
|
||||||
•
|
•
|
||||||
<a href="https://docs.invidious.io/">Documentation</a>
|
<a href="https://docs.invidious.io/">Documentation</a>
|
||||||
•
|
•
|
||||||
<a href="#contribute">Contribute</a>
|
<a href="#contribute">Contribute</a>
|
||||||
•
|
•
|
||||||
<a href="https://invidious.io/donate/">Donate</a>
|
<a href="https://invidious.io/donate/">Donate</a>
|
||||||
|
|
||||||
<h5>Chat with us:</h5>
|
<h5>Chat with us:</h5>
|
||||||
<a href="https://matrix.to/#/#invidious:matrix.org">
|
<a href="https://matrix.to/#/#invidious:matrix.org">
|
||||||
<img alt="Matrix" src="https://img.shields.io/matrix/invidious:matrix.org?label=Matrix&color=darkgreen">
|
<img alt="Matrix" src="https://img.shields.io/matrix/invidious:matrix.org?label=Matrix&color=darkgreen">
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
<a rel="me" href="https://social.tchncs.de/@invidious">
|
<a rel="me" href="https://social.tchncs.de/@invidious">
|
||||||
<img alt="Mastodon: @invidious@social.tchncs.de" src="https://img.shields.io/badge/Mastodon-%40invidious%40social.tchncs.de-darkgreen">
|
<img alt="Fediverse: @invidious@social.tchncs.de" src="https://img.shields.io/badge/Fediverse-%40invidious%40social.tchncs.de-darkgreen">
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
<a href="https://invidious.io/contact/">
|
<a href="https://invidious.io/contact/">
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
|
|
||||||
**Technical features**
|
**Technical features**
|
||||||
- Embedded video support
|
- Embedded video support
|
||||||
- [Developer API](https://docs.invidious.io/API.md)
|
- [Developer API](https://docs.invidious.io/api/)
|
||||||
- Does not use official YouTube APIs
|
- Does not use official YouTube APIs
|
||||||
- No Contributor License Agreement (CLA)
|
- No Contributor License Agreement (CLA)
|
||||||
|
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
|
|
||||||
**Hosting invidious:**
|
**Hosting invidious:**
|
||||||
|
|
||||||
- [Follow the installation instructions](https://docs.invidious.io/Installation.md)
|
- [Follow the installation instructions](https://docs.invidious.io/installation/)
|
||||||
|
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
@@ -119,7 +119,7 @@ embedded youtube videos on other websites with invidious.
|
|||||||
|
|
||||||
The documentation contains a list of browser extensions that we recommended to use along with Invidious.
|
The documentation contains a list of browser extensions that we recommended to use along with Invidious.
|
||||||
|
|
||||||
You can read more here: https://docs.invidious.io/Extensions.md
|
You can read more here: https://docs.invidious.io/applications/
|
||||||
|
|
||||||
|
|
||||||
## Contribute
|
## Contribute
|
||||||
@@ -150,6 +150,10 @@ Weblate also allows you to log-in with major SSO providers like Github, Gitlab,
|
|||||||
- [PeerTubeify](https://gitlab.com/Cha_deL/peertubeify): On YouTube, displays a link to the same video on PeerTube, if it exists.
|
- [PeerTubeify](https://gitlab.com/Cha_deL/peertubeify): On YouTube, displays a link to the same video on PeerTube, if it exists.
|
||||||
- [MusicPiped](https://github.com/deep-gaurav/MusicPiped): A material design music player that streams music from YouTube.
|
- [MusicPiped](https://github.com/deep-gaurav/MusicPiped): A material design music player that streams music from YouTube.
|
||||||
- [HoloPlay](https://github.com/stephane-r/HoloPlay): Funny Android application connecting on Invidious API's with search, playlists and favorites.
|
- [HoloPlay](https://github.com/stephane-r/HoloPlay): Funny Android application connecting on Invidious API's with search, playlists and favorites.
|
||||||
|
- [WatchTube](https://github.com/WatchTubeTeam/WatchTube): Powerful YouTube client for Apple Watch.
|
||||||
|
- [Yattee](https://github.com/yattee/yattee): Alternative YouTube frontend for iPhone, iPad, Mac and Apple TV.
|
||||||
|
- [TubiTui](https://codeberg.org/777/TubiTui): A lightweight, libre, TUI-based YouTube client.
|
||||||
|
- [Ytfzf](https://github.com/pystardust/ytfzf): A posix script to find and watch youtube videos from the terminal. (Without API)
|
||||||
|
|
||||||
|
|
||||||
## Liability
|
## Liability
|
||||||
|
|||||||
@@ -15,6 +15,11 @@ body {
|
|||||||
background-color: rgb(255, 0, 0, 0.5);
|
background-color: rgb(255, 0, 0, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.underlined {
|
||||||
|
border-bottom: 1px solid;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
.channel-profile > * {
|
.channel-profile > * {
|
||||||
font-size: 1.17em;
|
font-size: 1.17em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@@ -199,7 +204,8 @@ img.thumbnail {
|
|||||||
margin: 1px;
|
margin: 1px;
|
||||||
|
|
||||||
border: 1px solid;
|
border: 1px solid;
|
||||||
border-color: #0000 #0000 #CCC #0000;
|
border-color: rgba(0,0,0,0);
|
||||||
|
border-bottom-color: #CCC;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
|
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
@@ -209,7 +215,8 @@ img.thumbnail {
|
|||||||
.searchbar input[type="search"]:focus {
|
.searchbar input[type="search"]:focus {
|
||||||
margin: 0 0 0.5px 0;
|
margin: 0 0 0.5px 0;
|
||||||
border: 2px solid;
|
border: 2px solid;
|
||||||
border-color: #0000 #0000 #FED #0000;
|
border-color: rgba(0,0,0,0);
|
||||||
|
border-bottom-color: #FED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* https://stackoverflow.com/a/55170420 */
|
/* https://stackoverflow.com/a/55170420 */
|
||||||
@@ -229,7 +236,7 @@ input[type="search"]::-webkit-search-cancel-button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.user-field div {
|
.user-field div {
|
||||||
width: initial;
|
width: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-field div:not(:last-child) {
|
.user-field div:not(:last-child) {
|
||||||
@@ -286,7 +293,7 @@ input[type="search"]::-webkit-search-cancel-button {
|
|||||||
|
|
||||||
.flexible { display: flex; }
|
.flexible { display: flex; }
|
||||||
.flex-left { flex: 1 1 100%; flex-wrap: wrap; }
|
.flex-left { flex: 1 1 100%; flex-wrap: wrap; }
|
||||||
.flex-right { flex: 1 0 max-content; flex-wrap: nowrap; }
|
.flex-right { flex: 1 0 auto; flex-wrap: nowrap; }
|
||||||
|
|
||||||
p.channel-name { margin: 0; }
|
p.channel-name { margin: 0; }
|
||||||
p.video-data { margin: 0; font-weight: bold; font-size: 80%; }
|
p.video-data { margin: 0; font-weight: bold; font-size: 80%; }
|
||||||
@@ -475,30 +482,6 @@ body.dark-theme {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#filters {
|
|
||||||
display: inline;
|
|
||||||
margin-top: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#filters > div {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
#filters > summary {
|
|
||||||
display: block;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#filters > summary::before {
|
|
||||||
content: "[ + ]";
|
|
||||||
font-size: 1.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#filters[open] > summary::before {
|
|
||||||
content: "[ - ]";
|
|
||||||
font-size: 1.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*With commit d9528f5 all contents of the page is now within a flexbox. However,
|
/*With commit d9528f5 all contents of the page is now within a flexbox. However,
|
||||||
the hr element is rendered improperly within one.
|
the hr element is rendered improperly within one.
|
||||||
See https://stackoverflow.com/a/34372979 for more info */
|
See https://stackoverflow.com/a/34372979 for more info */
|
||||||
@@ -546,3 +529,9 @@ p,
|
|||||||
|
|
||||||
/* Center the "invidious" logo on the search page */
|
/* Center the "invidious" logo on the search page */
|
||||||
#logo > h1 { text-align: center; }
|
#logo > h1 { text-align: center; }
|
||||||
|
|
||||||
|
/* IE11 fixes */
|
||||||
|
:-ms-input-placeholder { color: #888; }
|
||||||
|
|
||||||
|
/* Wider settings name to less word wrap */
|
||||||
|
.pure-form-aligned .pure-control-group label { width: 19em; }
|
||||||
|
|||||||
@@ -70,6 +70,9 @@
|
|||||||
margin-bottom: 2em;
|
margin-bottom: 2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.video-js.player-style-youtube .vjs-progress-control .vjs-progress-holder, .video-js.player-style-youtube .vjs-progress-control {height: 5px;
|
||||||
|
margin-bottom: 10px;}
|
||||||
|
|
||||||
ul.vjs-menu-content::-webkit-scrollbar {
|
ul.vjs-menu-content::-webkit-scrollbar {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
@@ -98,23 +101,27 @@ ul.vjs-menu-content::-webkit-scrollbar {
|
|||||||
order: 2;
|
order: 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.vjs-quality-selector,
|
.vjs-audio-button {
|
||||||
.video-js .vjs-http-source-selector {
|
|
||||||
order: 3;
|
order: 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
.vjs-playback-rate {
|
.vjs-quality-selector,
|
||||||
|
.video-js .vjs-http-source-selector {
|
||||||
order: 4;
|
order: 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
.vjs-share-control {
|
.vjs-playback-rate {
|
||||||
order: 5;
|
order: 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.vjs-fullscreen-control {
|
.vjs-share-control {
|
||||||
order: 6;
|
order: 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.vjs-fullscreen-control {
|
||||||
|
order: 7;
|
||||||
|
}
|
||||||
|
|
||||||
.vjs-playback-rate > .vjs-menu {
|
.vjs-playback-rate > .vjs-menu {
|
||||||
width: 50px;
|
width: 50px;
|
||||||
}
|
}
|
||||||
|
|||||||
121
assets/css/search.css
Normal file
121
assets/css/search.css
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
summary {
|
||||||
|
/* This should hide the marker */
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
font-size: 1.17em;
|
||||||
|
font-weight: bold;
|
||||||
|
margin: 0 auto 10px auto;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
summary::-webkit-details-marker,
|
||||||
|
summary::marker { display: none; }
|
||||||
|
|
||||||
|
summary:before {
|
||||||
|
border-radius: 5px;
|
||||||
|
content: "[ + ]";
|
||||||
|
margin: -2px 10px 0 10px;
|
||||||
|
padding: 1px 0 3px 0;
|
||||||
|
text-align: center;
|
||||||
|
width: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
details[open] > summary:before { content: "[ − ]"; }
|
||||||
|
|
||||||
|
|
||||||
|
#filters-box {
|
||||||
|
padding: 10px 20px 20px 10px;
|
||||||
|
margin: 10px 15px;
|
||||||
|
}
|
||||||
|
#filters-flex {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: flex-start;
|
||||||
|
align-content: flex-start;
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fieldset, legend {
|
||||||
|
display: contents !important;
|
||||||
|
border: none !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.filter-column {
|
||||||
|
display: inline-block;
|
||||||
|
display: inline-flex;
|
||||||
|
width: max-content;
|
||||||
|
min-width: max-content;
|
||||||
|
max-width: 16em;
|
||||||
|
margin: 15px;
|
||||||
|
flex-grow: 2;
|
||||||
|
flex-basis: auto;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
.filter-name, .filter-options {
|
||||||
|
display: block;
|
||||||
|
padding: 5px 10px;
|
||||||
|
margin: 0;
|
||||||
|
text-align: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-options div { margin: 6px 0; }
|
||||||
|
.filter-options div * { vertical-align: middle; }
|
||||||
|
.filter-options label { margin: 0 10px; }
|
||||||
|
|
||||||
|
|
||||||
|
#filters-apply {
|
||||||
|
text-align: right; /* IE11 only */
|
||||||
|
text-align: end; /* Override for compatible browsers */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Error message */
|
||||||
|
|
||||||
|
.no-results-error {
|
||||||
|
text-align: center;
|
||||||
|
line-height: 180%;
|
||||||
|
font-size: 110%;
|
||||||
|
padding: 15px 15px 125px 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Responsive rules */
|
||||||
|
|
||||||
|
@media only screen and (max-width: 800px) {
|
||||||
|
summary { font-size: 1.30em; }
|
||||||
|
#filters-box {
|
||||||
|
margin: 10px 0 0 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
#filters-apply {
|
||||||
|
text-align: center;
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Light theme */
|
||||||
|
|
||||||
|
.light-theme #filters-box {
|
||||||
|
background: #dfdfdf;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: light) {
|
||||||
|
.no-theme #filters-box {
|
||||||
|
background: #dfdfdf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dark theme */
|
||||||
|
|
||||||
|
.dark-theme #filters-box {
|
||||||
|
background: #373737;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
.no-theme #filters-box {
|
||||||
|
background: #373737;
|
||||||
|
}
|
||||||
|
}
|
||||||
249
assets/js/_helpers.js
Normal file
249
assets/js/_helpers.js
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
'use strict';
|
||||||
|
// Contains only auxiliary methods
|
||||||
|
// May be included and executed unlimited number of times without any consequences
|
||||||
|
|
||||||
|
// Polyfills for IE11
|
||||||
|
Array.prototype.find = Array.prototype.find || function (condition) {
|
||||||
|
return this.filter(condition)[0];
|
||||||
|
};
|
||||||
|
Array.from = Array.from || function (source) {
|
||||||
|
return Array.prototype.slice.call(source);
|
||||||
|
};
|
||||||
|
NodeList.prototype.forEach = NodeList.prototype.forEach || function (callback) {
|
||||||
|
Array.from(this).forEach(callback);
|
||||||
|
};
|
||||||
|
String.prototype.includes = String.prototype.includes || function (searchString) {
|
||||||
|
return this.indexOf(searchString) >= 0;
|
||||||
|
};
|
||||||
|
String.prototype.startsWith = String.prototype.startsWith || function (prefix) {
|
||||||
|
return this.substr(0, prefix.length) === prefix;
|
||||||
|
};
|
||||||
|
Math.sign = Math.sign || function(x) {
|
||||||
|
x = +x;
|
||||||
|
if (!x) return x; // 0 and NaN
|
||||||
|
return x > 0 ? 1 : -1;
|
||||||
|
};
|
||||||
|
if (!window.hasOwnProperty('HTMLDetailsElement') && !window.hasOwnProperty('mockHTMLDetailsElement')) {
|
||||||
|
window.mockHTMLDetailsElement = true;
|
||||||
|
const style = 'details:not([open]) > :not(summary) {display: none}';
|
||||||
|
document.head.appendChild(document.createElement('style')).textContent = style;
|
||||||
|
|
||||||
|
addEventListener('click', function (e) {
|
||||||
|
if (e.target.nodeName !== 'SUMMARY') return;
|
||||||
|
const details = e.target.parentElement;
|
||||||
|
if (details.hasAttribute('open'))
|
||||||
|
details.removeAttribute('open');
|
||||||
|
else
|
||||||
|
details.setAttribute('open', '');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Monstrous global variable for handy code
|
||||||
|
// Includes: clamp, xhr, storage.{get,set,remove}
|
||||||
|
window.helpers = window.helpers || {
|
||||||
|
/**
|
||||||
|
* https://en.wikipedia.org/wiki/Clamping_(graphics)
|
||||||
|
* @param {Number} num Source number
|
||||||
|
* @param {Number} min Low border
|
||||||
|
* @param {Number} max High border
|
||||||
|
* @returns {Number} Clamped value
|
||||||
|
*/
|
||||||
|
clamp: function (num, min, max) {
|
||||||
|
if (max < min) {
|
||||||
|
var t = max; max = min; min = t; // swap max and min
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max < num)
|
||||||
|
return max;
|
||||||
|
if (min > num)
|
||||||
|
return min;
|
||||||
|
return num;
|
||||||
|
},
|
||||||
|
|
||||||
|
/** @private */
|
||||||
|
_xhr: function (method, url, options, callbacks) {
|
||||||
|
const xhr = new XMLHttpRequest();
|
||||||
|
xhr.open(method, url);
|
||||||
|
|
||||||
|
// Default options
|
||||||
|
xhr.responseType = 'json';
|
||||||
|
xhr.timeout = 10000;
|
||||||
|
// Default options redefining
|
||||||
|
if (options.responseType)
|
||||||
|
xhr.responseType = options.responseType;
|
||||||
|
if (options.timeout)
|
||||||
|
xhr.timeout = options.timeout;
|
||||||
|
|
||||||
|
if (method === 'POST')
|
||||||
|
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
|
||||||
|
// better than onreadystatechange because of 404 codes https://stackoverflow.com/a/36182963
|
||||||
|
xhr.onloadend = function () {
|
||||||
|
if (xhr.status === 200) {
|
||||||
|
if (callbacks.on200) {
|
||||||
|
// fix for IE11. It doesn't convert response to JSON
|
||||||
|
if (xhr.responseType === '' && typeof(xhr.response) === 'string')
|
||||||
|
callbacks.on200(JSON.parse(xhr.response));
|
||||||
|
else
|
||||||
|
callbacks.on200(xhr.response);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// handled by onerror
|
||||||
|
if (xhr.status === 0) return;
|
||||||
|
|
||||||
|
if (callbacks.onNon200)
|
||||||
|
callbacks.onNon200(xhr);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
xhr.ontimeout = function () {
|
||||||
|
if (callbacks.onTimeout)
|
||||||
|
callbacks.onTimeout(xhr);
|
||||||
|
};
|
||||||
|
|
||||||
|
xhr.onerror = function () {
|
||||||
|
if (callbacks.onError)
|
||||||
|
callbacks.onError(xhr);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (options.payload)
|
||||||
|
xhr.send(options.payload);
|
||||||
|
else
|
||||||
|
xhr.send();
|
||||||
|
},
|
||||||
|
/** @private */
|
||||||
|
_xhrRetry: function(method, url, options, callbacks) {
|
||||||
|
if (options.retries <= 0) {
|
||||||
|
console.warn('Failed to pull', options.entity_name);
|
||||||
|
if (callbacks.onTotalFail)
|
||||||
|
callbacks.onTotalFail();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
helpers._xhr(method, url, options, callbacks);
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @callback callbackXhrOn200
|
||||||
|
* @param {Object} response - xhr.response
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @callback callbackXhrError
|
||||||
|
* @param {XMLHttpRequest} xhr
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @param {'GET'|'POST'} method - 'GET' or 'POST'
|
||||||
|
* @param {String} url - URL to send request to
|
||||||
|
* @param {Object} options - other XHR options
|
||||||
|
* @param {XMLHttpRequestBodyInit} [options.payload=null] - payload for POST-requests
|
||||||
|
* @param {'arraybuffer'|'blob'|'document'|'json'|'text'} [options.responseType=json]
|
||||||
|
* @param {Number} [options.timeout=10000]
|
||||||
|
* @param {Number} [options.retries=1]
|
||||||
|
* @param {String} [options.entity_name='unknown'] - string to log
|
||||||
|
* @param {Number} [options.retry_timeout=1000]
|
||||||
|
* @param {Object} callbacks - functions to execute on events fired
|
||||||
|
* @param {callbackXhrOn200} [callbacks.on200]
|
||||||
|
* @param {callbackXhrError} [callbacks.onNon200]
|
||||||
|
* @param {callbackXhrError} [callbacks.onTimeout]
|
||||||
|
* @param {callbackXhrError} [callbacks.onError]
|
||||||
|
* @param {callbackXhrError} [callbacks.onTotalFail] - if failed after all retries
|
||||||
|
*/
|
||||||
|
xhr: function(method, url, options, callbacks) {
|
||||||
|
if (!options.retries || options.retries <= 1) {
|
||||||
|
helpers._xhr(method, url, options, callbacks);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!options.entity_name) options.entity_name = 'unknown';
|
||||||
|
if (!options.retry_timeout) options.retry_timeout = 1000;
|
||||||
|
const retries_total = options.retries;
|
||||||
|
let currentTry = 1;
|
||||||
|
|
||||||
|
const retry = function () {
|
||||||
|
console.warn('Pulling ' + options.entity_name + ' failed... ' + (currentTry++) + '/' + retries_total);
|
||||||
|
setTimeout(function () {
|
||||||
|
options.retries--;
|
||||||
|
helpers._xhrRetry(method, url, options, callbacks);
|
||||||
|
}, options.retry_timeout);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Pack retry() call into error handlers
|
||||||
|
callbacks._onError = callbacks.onError;
|
||||||
|
callbacks.onError = function (xhr) {
|
||||||
|
if (callbacks._onError)
|
||||||
|
callbacks._onError(xhr);
|
||||||
|
retry();
|
||||||
|
};
|
||||||
|
callbacks._onTimeout = callbacks.onTimeout;
|
||||||
|
callbacks.onTimeout = function (xhr) {
|
||||||
|
if (callbacks._onTimeout)
|
||||||
|
callbacks._onTimeout(xhr);
|
||||||
|
retry();
|
||||||
|
};
|
||||||
|
|
||||||
|
helpers._xhrRetry(method, url, options, callbacks);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} invidiousStorage
|
||||||
|
* @property {(key:String) => Object} get
|
||||||
|
* @property {(key:String, value:Object)} set
|
||||||
|
* @property {(key:String)} remove
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Universal storage, stores and returns JS objects. Uses inside localStorage or cookies
|
||||||
|
* @type {invidiousStorage}
|
||||||
|
*/
|
||||||
|
storage: (function () {
|
||||||
|
// access to localStorage throws exception in Tor Browser, so try is needed
|
||||||
|
let localStorageIsUsable = false;
|
||||||
|
try{localStorageIsUsable = !!localStorage.setItem;}catch(e){}
|
||||||
|
|
||||||
|
if (localStorageIsUsable) {
|
||||||
|
return {
|
||||||
|
get: function (key) {
|
||||||
|
if (!localStorage[key]) return;
|
||||||
|
try {
|
||||||
|
return JSON.parse(decodeURIComponent(localStorage[key]));
|
||||||
|
} catch(e) {
|
||||||
|
// Erase non parsable value
|
||||||
|
helpers.storage.remove(key);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
set: function (key, value) { localStorage[key] = encodeURIComponent(JSON.stringify(value)); },
|
||||||
|
remove: function (key) { localStorage.removeItem(key); }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: fire 'storage' event for cookies
|
||||||
|
console.info('Storage: localStorage is disabled or unaccessible. Cookies used as fallback');
|
||||||
|
return {
|
||||||
|
get: function (key) {
|
||||||
|
const cookiePrefix = key + '=';
|
||||||
|
function findCallback(cookie) {return cookie.startsWith(cookiePrefix);}
|
||||||
|
const matchedCookie = document.cookie.split('; ').find(findCallback);
|
||||||
|
if (matchedCookie) {
|
||||||
|
const cookieBody = matchedCookie.replace(cookiePrefix, '');
|
||||||
|
if (cookieBody.length === 0) return;
|
||||||
|
try {
|
||||||
|
return JSON.parse(decodeURIComponent(cookieBody));
|
||||||
|
} catch(e) {
|
||||||
|
// Erase non parsable value
|
||||||
|
helpers.storage.remove(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
set: function (key, value) {
|
||||||
|
const cookie_data = encodeURIComponent(JSON.stringify(value));
|
||||||
|
|
||||||
|
// Set expiration in 2 year
|
||||||
|
const date = new Date();
|
||||||
|
date.setFullYear(date.getFullYear()+2);
|
||||||
|
|
||||||
|
document.cookie = key + '=' + cookie_data + '; expires=' + date.toGMTString();
|
||||||
|
},
|
||||||
|
remove: function (key) {
|
||||||
|
document.cookie = key + '=; Max-Age=0';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})()
|
||||||
|
};
|
||||||
@@ -1,19 +1,13 @@
|
|||||||
var community_data = JSON.parse(document.getElementById('community_data').innerHTML);
|
'use strict';
|
||||||
|
var community_data = JSON.parse(document.getElementById('community_data').textContent);
|
||||||
String.prototype.supplant = function (o) {
|
|
||||||
return this.replace(/{([^{}]*)}/g, function (a, b) {
|
|
||||||
var r = o[b];
|
|
||||||
return typeof r === 'string' || typeof r === 'number' ? r : a;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function hide_youtube_replies(event) {
|
function hide_youtube_replies(event) {
|
||||||
var target = event.target;
|
var target = event.target;
|
||||||
|
|
||||||
sub_text = target.getAttribute('data-inner-text');
|
var sub_text = target.getAttribute('data-inner-text');
|
||||||
inner_text = target.getAttribute('data-sub-text');
|
var inner_text = target.getAttribute('data-sub-text');
|
||||||
|
|
||||||
body = target.parentNode.parentNode.children[1];
|
var body = target.parentNode.parentNode.children[1];
|
||||||
body.style.display = 'none';
|
body.style.display = 'none';
|
||||||
|
|
||||||
target.innerHTML = sub_text;
|
target.innerHTML = sub_text;
|
||||||
@@ -25,10 +19,10 @@ function hide_youtube_replies(event) {
|
|||||||
function show_youtube_replies(event) {
|
function show_youtube_replies(event) {
|
||||||
var target = event.target;
|
var target = event.target;
|
||||||
|
|
||||||
sub_text = target.getAttribute('data-inner-text');
|
var sub_text = target.getAttribute('data-inner-text');
|
||||||
inner_text = target.getAttribute('data-sub-text');
|
var inner_text = target.getAttribute('data-sub-text');
|
||||||
|
|
||||||
body = target.parentNode.parentNode.children[1];
|
var body = target.parentNode.parentNode.children[1];
|
||||||
body.style.display = '';
|
body.style.display = '';
|
||||||
|
|
||||||
target.innerHTML = sub_text;
|
target.innerHTML = sub_text;
|
||||||
@@ -37,13 +31,6 @@ function show_youtube_replies(event) {
|
|||||||
target.setAttribute('data-sub-text', sub_text);
|
target.setAttribute('data-sub-text', sub_text);
|
||||||
}
|
}
|
||||||
|
|
||||||
function number_with_separator(val) {
|
|
||||||
while (/(\d+)(\d{3})/.test(val.toString())) {
|
|
||||||
val = val.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2');
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_youtube_replies(target, load_more) {
|
function get_youtube_replies(target, load_more) {
|
||||||
var continuation = target.getAttribute('data-continuation');
|
var continuation = target.getAttribute('data-continuation');
|
||||||
|
|
||||||
@@ -57,47 +44,39 @@ function get_youtube_replies(target, load_more) {
|
|||||||
'&hl=' + community_data.preferences.locale +
|
'&hl=' + community_data.preferences.locale +
|
||||||
'&thin_mode=' + community_data.preferences.thin_mode +
|
'&thin_mode=' + community_data.preferences.thin_mode +
|
||||||
'&continuation=' + continuation;
|
'&continuation=' + continuation;
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('GET', url, true);
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
helpers.xhr('GET', url, {}, {
|
||||||
if (xhr.readyState == 4) {
|
on200: function (response) {
|
||||||
if (xhr.status == 200) {
|
if (load_more) {
|
||||||
if (load_more) {
|
body = body.parentNode.parentNode;
|
||||||
body = body.parentNode.parentNode;
|
body.removeChild(body.lastElementChild);
|
||||||
body.removeChild(body.lastElementChild);
|
body.innerHTML += response.contentHtml;
|
||||||
body.innerHTML += xhr.response.contentHtml;
|
|
||||||
} else {
|
|
||||||
body.removeChild(body.lastElementChild);
|
|
||||||
|
|
||||||
var p = document.createElement('p');
|
|
||||||
var a = document.createElement('a');
|
|
||||||
p.appendChild(a);
|
|
||||||
|
|
||||||
a.href = 'javascript:void(0)';
|
|
||||||
a.onclick = hide_youtube_replies;
|
|
||||||
a.setAttribute('data-sub-text', community_data.hide_replies_text);
|
|
||||||
a.setAttribute('data-inner-text', community_data.show_replies_text);
|
|
||||||
a.innerText = community_data.hide_replies_text;
|
|
||||||
|
|
||||||
var div = document.createElement('div');
|
|
||||||
div.innerHTML = xhr.response.contentHtml;
|
|
||||||
|
|
||||||
body.appendChild(p);
|
|
||||||
body.appendChild(div);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
body.innerHTML = fallback;
|
body.removeChild(body.lastElementChild);
|
||||||
|
|
||||||
|
var p = document.createElement('p');
|
||||||
|
var a = document.createElement('a');
|
||||||
|
p.appendChild(a);
|
||||||
|
|
||||||
|
a.href = 'javascript:void(0)';
|
||||||
|
a.onclick = hide_youtube_replies;
|
||||||
|
a.setAttribute('data-sub-text', community_data.hide_replies_text);
|
||||||
|
a.setAttribute('data-inner-text', community_data.show_replies_text);
|
||||||
|
a.textContent = community_data.hide_replies_text;
|
||||||
|
|
||||||
|
var div = document.createElement('div');
|
||||||
|
div.innerHTML = response.contentHtml;
|
||||||
|
|
||||||
|
body.appendChild(p);
|
||||||
|
body.appendChild(div);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
onNon200: function (xhr) {
|
||||||
|
body.innerHTML = fallback;
|
||||||
|
},
|
||||||
|
onTimeout: function (xhr) {
|
||||||
|
console.warn('Pulling comments failed');
|
||||||
|
body.innerHTML = fallback;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
xhr.ontimeout = function () {
|
|
||||||
console.log('Pulling comments failed.');
|
|
||||||
body.innerHTML = fallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.send();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,103 +1,62 @@
|
|||||||
var video_data = JSON.parse(document.getElementById('video_data').innerHTML);
|
'use strict';
|
||||||
|
var video_data = JSON.parse(document.getElementById('video_data').textContent);
|
||||||
function get_playlist(plid, retries) {
|
|
||||||
if (retries == undefined) retries = 5;
|
|
||||||
|
|
||||||
if (retries <= 0) {
|
|
||||||
console.log('Failed to pull playlist');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
function get_playlist(plid) {
|
||||||
|
var plid_url;
|
||||||
if (plid.startsWith('RD')) {
|
if (plid.startsWith('RD')) {
|
||||||
var plid_url = '/api/v1/mixes/' + plid +
|
plid_url = '/api/v1/mixes/' + plid +
|
||||||
'?continuation=' + video_data.id +
|
'?continuation=' + video_data.id +
|
||||||
'&format=html&hl=' + video_data.preferences.locale;
|
'&format=html&hl=' + video_data.preferences.locale;
|
||||||
} else {
|
} else {
|
||||||
var plid_url = '/api/v1/playlists/' + plid +
|
plid_url = '/api/v1/playlists/' + plid +
|
||||||
'?index=' + video_data.index +
|
'?index=' + video_data.index +
|
||||||
'&continuation' + video_data.id +
|
'&continuation' + video_data.id +
|
||||||
'&format=html&hl=' + video_data.preferences.locale;
|
'&format=html&hl=' + video_data.preferences.locale;
|
||||||
}
|
}
|
||||||
|
|
||||||
var xhr = new XMLHttpRequest();
|
helpers.xhr('GET', plid_url, {retries: 5, entity_name: 'playlist'}, {
|
||||||
xhr.responseType = 'json';
|
on200: function (response) {
|
||||||
xhr.timeout = 10000;
|
if (!response.nextVideo)
|
||||||
xhr.open('GET', plid_url, true);
|
return;
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
player.on('ended', function () {
|
||||||
if (xhr.readyState === 4) {
|
var url = new URL('https://example.com/embed/' + response.nextVideo);
|
||||||
if (xhr.status === 200) {
|
|
||||||
if (xhr.response.nextVideo) {
|
|
||||||
player.on('ended', function () {
|
|
||||||
var url = new URL('https://example.com/embed/' + xhr.response.nextVideo);
|
|
||||||
|
|
||||||
url.searchParams.set('list', plid);
|
url.searchParams.set('list', plid);
|
||||||
if (!plid.startsWith('RD')) {
|
if (!plid.startsWith('RD'))
|
||||||
url.searchParams.set('index', xhr.response.index);
|
url.searchParams.set('index', response.index);
|
||||||
}
|
if (video_data.params.autoplay || video_data.params.continue_autoplay)
|
||||||
|
url.searchParams.set('autoplay', '1');
|
||||||
|
if (video_data.params.listen !== video_data.preferences.listen)
|
||||||
|
url.searchParams.set('listen', video_data.params.listen);
|
||||||
|
if (video_data.params.speed !== video_data.preferences.speed)
|
||||||
|
url.searchParams.set('speed', video_data.params.speed);
|
||||||
|
if (video_data.params.local !== video_data.preferences.local)
|
||||||
|
url.searchParams.set('local', video_data.params.local);
|
||||||
|
|
||||||
if (video_data.params.autoplay || video_data.params.continue_autoplay) {
|
location.assign(url.pathname + url.search);
|
||||||
url.searchParams.set('autoplay', '1');
|
});
|
||||||
}
|
|
||||||
|
|
||||||
if (video_data.params.listen !== video_data.preferences.listen) {
|
|
||||||
url.searchParams.set('listen', video_data.params.listen);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (video_data.params.speed !== video_data.preferences.speed) {
|
|
||||||
url.searchParams.set('speed', video_data.params.speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (video_data.params.local !== video_data.preferences.local) {
|
|
||||||
url.searchParams.set('local', video_data.params.local);
|
|
||||||
}
|
|
||||||
|
|
||||||
location.assign(url.pathname + url.search);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
xhr.onerror = function () {
|
|
||||||
console.log('Pulling playlist failed... ' + retries + '/5');
|
|
||||||
setTimeout(function () { get_playlist(plid, retries - 1) }, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.ontimeout = function () {
|
|
||||||
console.log('Pulling playlist failed... ' + retries + '/5');
|
|
||||||
get_playlist(plid, retries - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.send();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener('load', function (e) {
|
addEventListener('load', function (e) {
|
||||||
if (video_data.plid) {
|
if (video_data.plid) {
|
||||||
get_playlist(video_data.plid);
|
get_playlist(video_data.plid);
|
||||||
} else if (video_data.video_series) {
|
} else if (video_data.video_series) {
|
||||||
player.on('ended', function () {
|
player.on('ended', function () {
|
||||||
var url = new URL('https://example.com/embed/' + video_data.video_series.shift());
|
var url = new URL('https://example.com/embed/' + video_data.video_series.shift());
|
||||||
|
|
||||||
if (video_data.params.autoplay || video_data.params.continue_autoplay) {
|
if (video_data.params.autoplay || video_data.params.continue_autoplay)
|
||||||
url.searchParams.set('autoplay', '1');
|
url.searchParams.set('autoplay', '1');
|
||||||
}
|
if (video_data.params.listen !== video_data.preferences.listen)
|
||||||
|
|
||||||
if (video_data.params.listen !== video_data.preferences.listen) {
|
|
||||||
url.searchParams.set('listen', video_data.params.listen);
|
url.searchParams.set('listen', video_data.params.listen);
|
||||||
}
|
if (video_data.params.speed !== video_data.preferences.speed)
|
||||||
|
|
||||||
if (video_data.params.speed !== video_data.preferences.speed) {
|
|
||||||
url.searchParams.set('speed', video_data.params.speed);
|
url.searchParams.set('speed', video_data.params.speed);
|
||||||
}
|
if (video_data.params.local !== video_data.preferences.local)
|
||||||
|
|
||||||
if (video_data.params.local !== video_data.preferences.local) {
|
|
||||||
url.searchParams.set('local', video_data.params.local);
|
url.searchParams.set('local', video_data.params.local);
|
||||||
}
|
if (video_data.video_series.length !== 0)
|
||||||
|
url.searchParams.set('playlist', video_data.video_series.join(','));
|
||||||
if (video_data.video_series.length !== 0) {
|
|
||||||
url.searchParams.set('playlist', video_data.video_series.join(','))
|
|
||||||
}
|
|
||||||
|
|
||||||
location.assign(url.pathname + url.search);
|
location.assign(url.pathname + url.search);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
var n2a = function (n) { return Array.prototype.slice.call(n); };
|
|
||||||
|
|
||||||
var video_player = document.getElementById('player_html5_api');
|
var video_player = document.getElementById('player_html5_api');
|
||||||
if (video_player) {
|
if (video_player) {
|
||||||
video_player.onmouseenter = function () { video_player['data-title'] = video_player['title']; video_player['title'] = ''; };
|
video_player.onmouseenter = function () { video_player['data-title'] = video_player['title']; video_player['title'] = ''; };
|
||||||
@@ -11,140 +9,124 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// For dynamically inserted elements
|
// For dynamically inserted elements
|
||||||
document.addEventListener('click', function (e) {
|
addEventListener('click', function (e) {
|
||||||
if (!e || !e.target) { return; }
|
if (!e || !e.target) return;
|
||||||
e = e.target;
|
|
||||||
var handler_name = e.getAttribute('data-onclick');
|
var t = e.target;
|
||||||
|
var handler_name = t.getAttribute('data-onclick');
|
||||||
|
|
||||||
switch (handler_name) {
|
switch (handler_name) {
|
||||||
case 'jump_to_time':
|
case 'jump_to_time':
|
||||||
var time = e.getAttribute('data-jump-time');
|
e.preventDefault();
|
||||||
|
var time = t.getAttribute('data-jump-time');
|
||||||
player.currentTime(time);
|
player.currentTime(time);
|
||||||
break;
|
break;
|
||||||
case 'get_youtube_replies':
|
case 'get_youtube_replies':
|
||||||
var load_more = e.getAttribute('data-load-more') !== null;
|
var load_more = t.getAttribute('data-load-more') !== null;
|
||||||
var load_replies = e.getAttribute('data-load-replies') !== null;
|
var load_replies = t.getAttribute('data-load-replies') !== null;
|
||||||
get_youtube_replies(e, load_more, load_replies);
|
get_youtube_replies(t, load_more, load_replies);
|
||||||
break;
|
break;
|
||||||
case 'toggle_parent':
|
case 'toggle_parent':
|
||||||
toggle_parent(e);
|
e.preventDefault();
|
||||||
|
toggle_parent(t);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
n2a(document.querySelectorAll('[data-mouse="switch_classes"]')).forEach(function (e) {
|
document.querySelectorAll('[data-mouse="switch_classes"]').forEach(function (el) {
|
||||||
var classes = e.getAttribute('data-switch-classes').split(',');
|
var classes = el.getAttribute('data-switch-classes').split(',');
|
||||||
var ec = classes[0];
|
var classOnEnter = classes[0];
|
||||||
var lc = classes[1];
|
var classOnLeave = classes[1];
|
||||||
var onoff = function (on, off) {
|
function toggle_classes(toAdd, toRemove) {
|
||||||
var cs = e.getAttribute('class');
|
el.classList.add(toAdd);
|
||||||
cs = cs.split(off).join(on);
|
el.classList.remove(toRemove);
|
||||||
e.setAttribute('class', cs);
|
}
|
||||||
};
|
el.onmouseenter = function () { toggle_classes(classOnEnter, classOnLeave); };
|
||||||
e.onmouseenter = function () { onoff(ec, lc); };
|
el.onmouseleave = function () { toggle_classes(classOnLeave, classOnEnter); };
|
||||||
e.onmouseleave = function () { onoff(lc, ec); };
|
|
||||||
});
|
});
|
||||||
|
|
||||||
n2a(document.querySelectorAll('[data-onsubmit="return_false"]')).forEach(function (e) {
|
document.querySelectorAll('[data-onsubmit="return_false"]').forEach(function (el) {
|
||||||
e.onsubmit = function () { return false; };
|
el.onsubmit = function () { return false; };
|
||||||
});
|
});
|
||||||
|
|
||||||
n2a(document.querySelectorAll('[data-onclick="mark_watched"]')).forEach(function (e) {
|
document.querySelectorAll('[data-onclick="mark_watched"]').forEach(function (el) {
|
||||||
e.onclick = function () { mark_watched(e); };
|
el.onclick = function () { mark_watched(el); };
|
||||||
});
|
});
|
||||||
n2a(document.querySelectorAll('[data-onclick="mark_unwatched"]')).forEach(function (e) {
|
document.querySelectorAll('[data-onclick="mark_unwatched"]').forEach(function (el) {
|
||||||
e.onclick = function () { mark_unwatched(e); };
|
el.onclick = function () { mark_unwatched(el); };
|
||||||
});
|
});
|
||||||
n2a(document.querySelectorAll('[data-onclick="add_playlist_video"]')).forEach(function (e) {
|
document.querySelectorAll('[data-onclick="add_playlist_video"]').forEach(function (el) {
|
||||||
e.onclick = function () { add_playlist_video(e); };
|
el.onclick = function () { add_playlist_video(el); };
|
||||||
});
|
});
|
||||||
n2a(document.querySelectorAll('[data-onclick="add_playlist_item"]')).forEach(function (e) {
|
document.querySelectorAll('[data-onclick="add_playlist_item"]').forEach(function (el) {
|
||||||
e.onclick = function () { add_playlist_item(e); };
|
el.onclick = function () { add_playlist_item(el); };
|
||||||
});
|
});
|
||||||
n2a(document.querySelectorAll('[data-onclick="remove_playlist_item"]')).forEach(function (e) {
|
document.querySelectorAll('[data-onclick="remove_playlist_item"]').forEach(function (el) {
|
||||||
e.onclick = function () { remove_playlist_item(e); };
|
el.onclick = function () { remove_playlist_item(el); };
|
||||||
});
|
});
|
||||||
n2a(document.querySelectorAll('[data-onclick="revoke_token"]')).forEach(function (e) {
|
document.querySelectorAll('[data-onclick="revoke_token"]').forEach(function (el) {
|
||||||
e.onclick = function () { revoke_token(e); };
|
el.onclick = function () { revoke_token(el); };
|
||||||
});
|
});
|
||||||
n2a(document.querySelectorAll('[data-onclick="remove_subscription"]')).forEach(function (e) {
|
document.querySelectorAll('[data-onclick="remove_subscription"]').forEach(function (el) {
|
||||||
e.onclick = function () { remove_subscription(e); };
|
el.onclick = function () { remove_subscription(el); };
|
||||||
});
|
});
|
||||||
n2a(document.querySelectorAll('[data-onclick="notification_requestPermission"]')).forEach(function (e) {
|
document.querySelectorAll('[data-onclick="notification_requestPermission"]').forEach(function (el) {
|
||||||
e.onclick = function () { Notification.requestPermission(); };
|
el.onclick = function () { Notification.requestPermission(); };
|
||||||
});
|
});
|
||||||
|
|
||||||
n2a(document.querySelectorAll('[data-onrange="update_volume_value"]')).forEach(function (e) {
|
document.querySelectorAll('[data-onrange="update_volume_value"]').forEach(function (el) {
|
||||||
var cb = function () { update_volume_value(e); }
|
function update_volume_value() {
|
||||||
e.oninput = cb;
|
document.getElementById('volume-value').textContent = el.value;
|
||||||
e.onchange = cb;
|
}
|
||||||
|
el.oninput = update_volume_value;
|
||||||
|
el.onchange = update_volume_value;
|
||||||
});
|
});
|
||||||
|
|
||||||
function update_volume_value(element) {
|
|
||||||
document.getElementById('volume-value').innerText = element.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
function revoke_token(target) {
|
function revoke_token(target) {
|
||||||
var row = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
var row = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
||||||
row.style.display = 'none';
|
row.style.display = 'none';
|
||||||
var count = document.getElementById('count');
|
var count = document.getElementById('count');
|
||||||
count.innerText = count.innerText - 1;
|
count.textContent--;
|
||||||
|
|
||||||
var referer = window.encodeURIComponent(document.location.href);
|
|
||||||
var url = '/token_ajax?action_revoke_token=1&redirect=false' +
|
var url = '/token_ajax?action_revoke_token=1&redirect=false' +
|
||||||
'&referer=' + referer +
|
'&referer=' + encodeURIComponent(location.href) +
|
||||||
'&session=' + target.getAttribute('data-session');
|
'&session=' + target.getAttribute('data-session');
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('POST', url, true);
|
|
||||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
var payload = 'csrf_token=' + target.parentNode.querySelector('input[name="csrf_token"]').value;
|
||||||
if (xhr.readyState == 4) {
|
|
||||||
if (xhr.status != 200) {
|
helpers.xhr('POST', url, {payload: payload}, {
|
||||||
count.innerText = parseInt(count.innerText) + 1;
|
onNon200: function (xhr) {
|
||||||
row.style.display = '';
|
count.textContent++;
|
||||||
}
|
row.style.display = '';
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
var csrf_token = target.parentNode.querySelector('input[name="csrf_token"]').value;
|
|
||||||
xhr.send('csrf_token=' + csrf_token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function remove_subscription(target) {
|
function remove_subscription(target) {
|
||||||
var row = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
var row = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
||||||
row.style.display = 'none';
|
row.style.display = 'none';
|
||||||
var count = document.getElementById('count');
|
var count = document.getElementById('count');
|
||||||
count.innerText = count.innerText - 1;
|
count.textContent--;
|
||||||
|
|
||||||
var referer = window.encodeURIComponent(document.location.href);
|
|
||||||
var url = '/subscription_ajax?action_remove_subscriptions=1&redirect=false' +
|
var url = '/subscription_ajax?action_remove_subscriptions=1&redirect=false' +
|
||||||
'&referer=' + referer +
|
'&referer=' + encodeURIComponent(location.href) +
|
||||||
'&c=' + target.getAttribute('data-ucid');
|
'&c=' + target.getAttribute('data-ucid');
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('POST', url, true);
|
|
||||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
var payload = 'csrf_token=' + target.parentNode.querySelector('input[name="csrf_token"]').value;
|
||||||
if (xhr.readyState == 4) {
|
|
||||||
if (xhr.status != 200) {
|
helpers.xhr('POST', url, {payload: payload}, {
|
||||||
count.innerText = parseInt(count.innerText) + 1;
|
onNon200: function (xhr) {
|
||||||
row.style.display = '';
|
count.textContent++;
|
||||||
}
|
row.style.display = '';
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
var csrf_token = target.parentNode.querySelector('input[name="csrf_token"]').value;
|
|
||||||
xhr.send('csrf_token=' + csrf_token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle keypresses
|
// Handle keypresses
|
||||||
window.addEventListener('keydown', (event) => {
|
addEventListener('keydown', function (event) {
|
||||||
// Ignore modifier keys
|
// Ignore modifier keys
|
||||||
if (event.ctrlKey || event.metaKey) return;
|
if (event.ctrlKey || event.metaKey) return;
|
||||||
|
|
||||||
@@ -152,14 +134,14 @@
|
|||||||
let focused_tag = document.activeElement.tagName.toLowerCase();
|
let focused_tag = document.activeElement.tagName.toLowerCase();
|
||||||
const allowed = /^(button|checkbox|file|radio|submit)$/;
|
const allowed = /^(button|checkbox|file|radio|submit)$/;
|
||||||
|
|
||||||
if (focused_tag === "textarea") return;
|
if (focused_tag === 'textarea') return;
|
||||||
if (focused_tag === "input") {
|
if (focused_tag === 'input') {
|
||||||
let focused_type = document.activeElement.type.toLowerCase();
|
let focused_type = document.activeElement.type.toLowerCase();
|
||||||
if (!focused_type.match(allowed)) return;
|
if (!focused_type.match(allowed)) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Focus search bar on '/'
|
// Focus search bar on '/'
|
||||||
if (event.key == "/") {
|
if (event.key === '/') {
|
||||||
document.getElementById('searchbox').focus();
|
document.getElementById('searchbox').focus();
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,46 +1,30 @@
|
|||||||
var notification_data = JSON.parse(document.getElementById('notification_data').innerHTML);
|
'use strict';
|
||||||
|
var notification_data = JSON.parse(document.getElementById('notification_data').textContent);
|
||||||
|
|
||||||
|
/** Boolean meaning 'some tab have stream' */
|
||||||
|
const STORAGE_KEY_STREAM = 'stream';
|
||||||
|
/** Number of notifications. May be increased or reset */
|
||||||
|
const STORAGE_KEY_NOTIF_COUNT = 'notification_count';
|
||||||
|
|
||||||
var notifications, delivered;
|
var notifications, delivered;
|
||||||
|
var notifications_mock = { close: function () { } };
|
||||||
|
|
||||||
function get_subscriptions(callback, retries) {
|
function get_subscriptions() {
|
||||||
if (retries == undefined) retries = 5;
|
helpers.xhr('GET', '/api/v1/auth/subscriptions?fields=authorId', {
|
||||||
|
retries: 5,
|
||||||
if (retries <= 0) {
|
entity_name: 'subscriptions'
|
||||||
return;
|
}, {
|
||||||
}
|
on200: create_notification_stream
|
||||||
|
});
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('GET', '/api/v1/auth/subscriptions?fields=authorId', true);
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
|
||||||
if (xhr.readyState === 4) {
|
|
||||||
if (xhr.status === 200) {
|
|
||||||
subscriptions = xhr.response;
|
|
||||||
callback(subscriptions);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.onerror = function () {
|
|
||||||
console.log('Pulling subscriptions failed... ' + retries + '/5');
|
|
||||||
setTimeout(function () { get_subscriptions(callback, retries - 1) }, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.ontimeout = function () {
|
|
||||||
console.log('Pulling subscriptions failed... ' + retries + '/5');
|
|
||||||
get_subscriptions(callback, retries - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.send();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function create_notification_stream(subscriptions) {
|
function create_notification_stream(subscriptions) {
|
||||||
|
// sse.js can't be replaced to EventSource in place as it lack support of payload and headers
|
||||||
|
// see https://developer.mozilla.org/en-US/docs/Web/API/EventSource/EventSource
|
||||||
notifications = new SSE(
|
notifications = new SSE(
|
||||||
'/api/v1/auth/notifications?fields=videoId,title,author,authorId,publishedText,published,authorThumbnails,liveNow', {
|
'/api/v1/auth/notifications?fields=videoId,title,author,authorId,publishedText,published,authorThumbnails,liveNow', {
|
||||||
withCredentials: true,
|
withCredentials: true,
|
||||||
payload: 'topics=' + subscriptions.map(function (subscription) { return subscription.authorId }).join(','),
|
payload: 'topics=' + subscriptions.map(function (subscription) { return subscription.authorId; }).join(','),
|
||||||
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
|
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
|
||||||
});
|
});
|
||||||
delivered = [];
|
delivered = [];
|
||||||
@@ -48,96 +32,100 @@ function create_notification_stream(subscriptions) {
|
|||||||
var start_time = Math.round(new Date() / 1000);
|
var start_time = Math.round(new Date() / 1000);
|
||||||
|
|
||||||
notifications.onmessage = function (event) {
|
notifications.onmessage = function (event) {
|
||||||
if (!event.id) {
|
if (!event.id) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var notification = JSON.parse(event.data);
|
var notification = JSON.parse(event.data);
|
||||||
console.log('Got notification:', notification);
|
console.info('Got notification:', notification);
|
||||||
|
|
||||||
if (start_time < notification.published && !delivered.includes(notification.videoId)) {
|
// Ignore not actual and delivered notifications
|
||||||
if (Notification.permission === 'granted') {
|
if (start_time > notification.published || delivered.includes(notification.videoId)) return;
|
||||||
var system_notification =
|
|
||||||
new Notification((notification.liveNow ? notification_data.live_now_text : notification_data.upload_text).replace('`x`', notification.author), {
|
|
||||||
body: notification.title,
|
|
||||||
icon: '/ggpht' + new URL(notification.authorThumbnails[2].url).pathname,
|
|
||||||
img: '/ggpht' + new URL(notification.authorThumbnails[4].url).pathname,
|
|
||||||
tag: notification.videoId
|
|
||||||
});
|
|
||||||
|
|
||||||
system_notification.onclick = function (event) {
|
delivered.push(notification.videoId);
|
||||||
window.open('/watch?v=' + event.currentTarget.tag, '_blank');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delivered.push(notification.videoId);
|
let notification_count = helpers.storage.get(STORAGE_KEY_NOTIF_COUNT) || 0;
|
||||||
localStorage.setItem('notification_count', parseInt(localStorage.getItem('notification_count') || '0') + 1);
|
notification_count++;
|
||||||
var notification_ticker = document.getElementById('notification_ticker');
|
helpers.storage.set(STORAGE_KEY_NOTIF_COUNT, notification_count);
|
||||||
|
|
||||||
if (parseInt(localStorage.getItem('notification_count')) > 0) {
|
update_ticker_count();
|
||||||
notification_ticker.innerHTML =
|
|
||||||
'<span id="notification_count">' + localStorage.getItem('notification_count') + '</span> <i class="icon ion-ios-notifications"></i>';
|
// permission for notifications handled on settings page. JS handler is in handlers.js
|
||||||
} else {
|
if (window.Notification && Notification.permission === 'granted') {
|
||||||
notification_ticker.innerHTML =
|
var notification_text = notification.liveNow ? notification_data.live_now_text : notification_data.upload_text;
|
||||||
'<i class="icon ion-ios-notifications-outline"></i>';
|
notification_text = notification_text.replace('`x`', notification.author);
|
||||||
}
|
|
||||||
|
var system_notification = new Notification(notification_text, {
|
||||||
|
body: notification.title,
|
||||||
|
icon: '/ggpht' + new URL(notification.authorThumbnails[2].url).pathname,
|
||||||
|
img: '/ggpht' + new URL(notification.authorThumbnails[4].url).pathname
|
||||||
|
});
|
||||||
|
|
||||||
|
system_notification.onclick = function (e) {
|
||||||
|
open('/watch?v=' + notification.videoId, '_blank');
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
|
notifications.addEventListener('error', function (e) {
|
||||||
|
console.warn('Something went wrong with notifications, trying to reconnect...');
|
||||||
|
notifications = notifications_mock;
|
||||||
|
setTimeout(get_subscriptions, 1000);
|
||||||
|
});
|
||||||
|
|
||||||
notifications.addEventListener('error', handle_notification_error);
|
|
||||||
notifications.stream();
|
notifications.stream();
|
||||||
}
|
}
|
||||||
|
|
||||||
function handle_notification_error(event) {
|
function update_ticker_count() {
|
||||||
console.log('Something went wrong with notifications, trying to reconnect...');
|
var notification_ticker = document.getElementById('notification_ticker');
|
||||||
notifications = { close: function () { } };
|
|
||||||
setTimeout(function () { get_subscriptions(create_notification_stream) }, 1000);
|
const notification_count = helpers.storage.get(STORAGE_KEY_STREAM);
|
||||||
|
if (notification_count > 0) {
|
||||||
|
notification_ticker.innerHTML =
|
||||||
|
'<span id="notification_count">' + notification_count + '</span> <i class="icon ion-ios-notifications"></i>';
|
||||||
|
} else {
|
||||||
|
notification_ticker.innerHTML =
|
||||||
|
'<i class="icon ion-ios-notifications-outline"></i>';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener('load', function (e) {
|
function start_stream_if_needed() {
|
||||||
localStorage.setItem('notification_count', document.getElementById('notification_count') ? document.getElementById('notification_count').innerText : '0');
|
// random wait for other tabs set 'stream' flag
|
||||||
|
setTimeout(function () {
|
||||||
if (localStorage.getItem('stream')) {
|
if (!helpers.storage.get(STORAGE_KEY_STREAM)) {
|
||||||
localStorage.removeItem('stream');
|
// if no one set 'stream', set it by yourself and start stream
|
||||||
} else {
|
helpers.storage.set(STORAGE_KEY_STREAM, true);
|
||||||
setTimeout(function () {
|
notifications = notifications_mock;
|
||||||
if (!localStorage.getItem('stream')) {
|
get_subscriptions();
|
||||||
notifications = { close: function () { } };
|
|
||||||
localStorage.setItem('stream', true);
|
|
||||||
get_subscriptions(create_notification_stream);
|
|
||||||
}
|
|
||||||
}, Math.random() * 1000 + 50);
|
|
||||||
}
|
|
||||||
|
|
||||||
window.addEventListener('storage', function (e) {
|
|
||||||
if (e.key === 'stream' && !e.newValue) {
|
|
||||||
if (notifications) {
|
|
||||||
localStorage.setItem('stream', true);
|
|
||||||
} else {
|
|
||||||
setTimeout(function () {
|
|
||||||
if (!localStorage.getItem('stream')) {
|
|
||||||
notifications = { close: function () { } };
|
|
||||||
localStorage.setItem('stream', true);
|
|
||||||
get_subscriptions(create_notification_stream);
|
|
||||||
}
|
|
||||||
}, Math.random() * 1000 + 50);
|
|
||||||
}
|
|
||||||
} else if (e.key === 'notification_count') {
|
|
||||||
var notification_ticker = document.getElementById('notification_ticker');
|
|
||||||
|
|
||||||
if (parseInt(e.newValue) > 0) {
|
|
||||||
notification_ticker.innerHTML =
|
|
||||||
'<span id="notification_count">' + e.newValue + '</span> <i class="icon ion-ios-notifications"></i>';
|
|
||||||
} else {
|
|
||||||
notification_ticker.innerHTML =
|
|
||||||
'<i class="icon ion-ios-notifications-outline"></i>';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
}, Math.random() * 1000 + 50); // [0.050 .. 1.050) second
|
||||||
});
|
}
|
||||||
|
|
||||||
window.addEventListener('unload', function (e) {
|
|
||||||
if (notifications) {
|
addEventListener('storage', function (e) {
|
||||||
localStorage.removeItem('stream');
|
if (e.key === STORAGE_KEY_NOTIF_COUNT)
|
||||||
|
update_ticker_count();
|
||||||
|
|
||||||
|
// if 'stream' key was removed
|
||||||
|
if (e.key === STORAGE_KEY_STREAM && !helpers.storage.get(STORAGE_KEY_STREAM)) {
|
||||||
|
if (notifications) {
|
||||||
|
// restore it if we have active stream
|
||||||
|
helpers.storage.set(STORAGE_KEY_STREAM, true);
|
||||||
|
} else {
|
||||||
|
start_stream_if_needed();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
addEventListener('load', function () {
|
||||||
|
var notification_count_el = document.getElementById('notification_count');
|
||||||
|
var notification_count = notification_count_el ? parseInt(notification_count_el.textContent) : 0;
|
||||||
|
helpers.storage.set(STORAGE_KEY_NOTIF_COUNT, notification_count);
|
||||||
|
|
||||||
|
if (helpers.storage.get(STORAGE_KEY_STREAM))
|
||||||
|
helpers.storage.remove(STORAGE_KEY_STREAM);
|
||||||
|
start_stream_if_needed();
|
||||||
|
});
|
||||||
|
|
||||||
|
addEventListener('unload', function () {
|
||||||
|
// let chance to other tabs to be a streamer via firing 'storage' event
|
||||||
|
if (notifications) helpers.storage.remove(STORAGE_KEY_STREAM);
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
var player_data = JSON.parse(document.getElementById('player_data').innerHTML);
|
'use strict';
|
||||||
var video_data = JSON.parse(document.getElementById('video_data').innerHTML);
|
var player_data = JSON.parse(document.getElementById('player_data').textContent);
|
||||||
|
var video_data = JSON.parse(document.getElementById('video_data').textContent);
|
||||||
|
|
||||||
var options = {
|
var options = {
|
||||||
preload: 'auto',
|
preload: 'auto',
|
||||||
@@ -16,6 +17,7 @@ var options = {
|
|||||||
'remainingTimeDisplay',
|
'remainingTimeDisplay',
|
||||||
'Spacer',
|
'Spacer',
|
||||||
'captionsButton',
|
'captionsButton',
|
||||||
|
'audioTrackButton',
|
||||||
'qualitySelector',
|
'qualitySelector',
|
||||||
'playbackRateMenuButton',
|
'playbackRateMenuButton',
|
||||||
'fullscreenToggle'
|
'fullscreenToggle'
|
||||||
@@ -27,7 +29,7 @@ var options = {
|
|||||||
overrideNative: true
|
overrideNative: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
if (player_data.aspect_ratio) {
|
if (player_data.aspect_ratio) {
|
||||||
options.aspectRatio = player_data.aspect_ratio;
|
options.aspectRatio = player_data.aspect_ratio;
|
||||||
@@ -38,21 +40,66 @@ embed_url.searchParams.delete('v');
|
|||||||
var short_url = location.origin + '/' + video_data.id + embed_url.search;
|
var short_url = location.origin + '/' + video_data.id + embed_url.search;
|
||||||
embed_url = location.origin + '/embed/' + video_data.id + embed_url.search;
|
embed_url = location.origin + '/embed/' + video_data.id + embed_url.search;
|
||||||
|
|
||||||
var save_player_pos_key = "save_player_pos";
|
var save_player_pos_key = 'save_player_pos';
|
||||||
|
|
||||||
videojs.Vhs.xhr.beforeRequest = function(options) {
|
videojs.Vhs.xhr.beforeRequest = function(options) {
|
||||||
if (options.uri.indexOf('videoplayback') === -1 && options.uri.indexOf('local=true') === -1) {
|
// set local if requested not videoplayback
|
||||||
options.uri = options.uri + '?local=true';
|
if (!options.uri.includes('videoplayback')) {
|
||||||
|
if (!options.uri.includes('local=true'))
|
||||||
|
options.uri += '?local=true';
|
||||||
}
|
}
|
||||||
return options;
|
return options;
|
||||||
};
|
};
|
||||||
|
|
||||||
var player = videojs('player', options);
|
var player = videojs('player', options);
|
||||||
|
|
||||||
|
player.on('error', function () {
|
||||||
|
if (video_data.params.quality === 'dash') return;
|
||||||
|
|
||||||
|
var localNotDisabled = (
|
||||||
|
!player.currentSrc().includes('local=true') && !video_data.local_disabled
|
||||||
|
);
|
||||||
|
var reloadMakesSense = (
|
||||||
|
player.error().code === MediaError.MEDIA_ERR_NETWORK ||
|
||||||
|
player.error().code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED
|
||||||
|
);
|
||||||
|
|
||||||
|
if (localNotDisabled) {
|
||||||
|
// add local=true to all current sources
|
||||||
|
player.src(player.currentSources().map(function (source) {
|
||||||
|
source.src += '&local=true';
|
||||||
|
return source;
|
||||||
|
}));
|
||||||
|
} else if (reloadMakesSense) {
|
||||||
|
setTimeout(function () {
|
||||||
|
console.warn('An error occurred in the player, reloading...');
|
||||||
|
|
||||||
|
// After load() all parameters are reset. Save them
|
||||||
|
var currentTime = player.currentTime();
|
||||||
|
var playbackRate = player.playbackRate();
|
||||||
|
var paused = player.paused();
|
||||||
|
|
||||||
|
player.load();
|
||||||
|
|
||||||
|
if (currentTime > 0.5) currentTime -= 0.5;
|
||||||
|
|
||||||
|
player.currentTime(currentTime);
|
||||||
|
player.playbackRate(playbackRate);
|
||||||
|
if (!paused) player.play();
|
||||||
|
}, 5000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (video_data.params.quality === 'dash') {
|
||||||
|
player.reloadSourceOnError({
|
||||||
|
errorInterval: 10
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function for add time argument to url
|
* Function for add time argument to url
|
||||||
* @param {String} url
|
* @param {String} url
|
||||||
* @returns urlWithTimeArg
|
* @returns {URL} urlWithTimeArg
|
||||||
*/
|
*/
|
||||||
function addCurrentTimeToURL(url) {
|
function addCurrentTimeToURL(url) {
|
||||||
var urlUsed = new URL(url);
|
var urlUsed = new URL(url);
|
||||||
@@ -75,18 +122,12 @@ var shareOptions = {
|
|||||||
description: player_data.description,
|
description: player_data.description,
|
||||||
image: player_data.thumbnail,
|
image: player_data.thumbnail,
|
||||||
get embedCode() {
|
get embedCode() {
|
||||||
|
// Single quotes inside here required. HTML inserted as is into value attribute of input
|
||||||
return "<iframe id='ivplayer' width='640' height='360' src='" +
|
return "<iframe id='ivplayer' width='640' height='360' src='" +
|
||||||
addCurrentTimeToURL(embed_url) + "' style='border:none;'></iframe>";
|
addCurrentTimeToURL(embed_url) + "' style='border:none;'></iframe>";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const storage = (() => {
|
|
||||||
try { if (localStorage.length !== -1) return localStorage; }
|
|
||||||
catch (e) { console.info('No storage available: ' + e); }
|
|
||||||
|
|
||||||
return undefined;
|
|
||||||
})();
|
|
||||||
|
|
||||||
if (location.pathname.startsWith('/embed/')) {
|
if (location.pathname.startsWith('/embed/')) {
|
||||||
var overlay_content = '<h1><a rel="noopener" target="_blank" href="' + location.origin + '/watch?v=' + video_data.id + '">' + player_data.title + '</a></h1>';
|
var overlay_content = '<h1><a rel="noopener" target="_blank" href="' + location.origin + '/watch?v=' + video_data.id + '">' + player_data.title + '</a></h1>';
|
||||||
player.overlay({
|
player.overlay({
|
||||||
@@ -101,78 +142,58 @@ if (location.pathname.startsWith('/embed/')) {
|
|||||||
// Detection code taken from https://stackoverflow.com/a/20293441
|
// Detection code taken from https://stackoverflow.com/a/20293441
|
||||||
|
|
||||||
function isMobile() {
|
function isMobile() {
|
||||||
try{ document.createEvent("TouchEvent"); return true; }
|
try{ document.createEvent('TouchEvent'); return true; }
|
||||||
catch(e){ return false; }
|
catch(e){ return false; }
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isMobile()) {
|
if (isMobile()) {
|
||||||
player.mobileUi();
|
player.mobileUi({ touchControls: { seekSeconds: 5 * player.playbackRate() } });
|
||||||
|
|
||||||
buttons = ["playToggle", "volumePanel", "captionsButton"];
|
var buttons = ['playToggle', 'volumePanel', 'captionsButton'];
|
||||||
|
|
||||||
if (video_data.params.quality !== 'dash') buttons.push("qualitySelector")
|
if (!video_data.params.listen && video_data.params.quality === 'dash') buttons.push('audioTrackButton');
|
||||||
|
if (video_data.params.listen || video_data.params.quality !== 'dash') buttons.push('qualitySelector');
|
||||||
|
|
||||||
// Create new control bar object for operation buttons
|
// Create new control bar object for operation buttons
|
||||||
const ControlBar = videojs.getComponent("controlBar");
|
const ControlBar = videojs.getComponent('controlBar');
|
||||||
let operations_bar = new ControlBar(player, {
|
let operations_bar = new ControlBar(player, {
|
||||||
children: [],
|
children: [],
|
||||||
playbackRates: [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0]
|
playbackRates: [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0]
|
||||||
});
|
});
|
||||||
buttons.slice(1).forEach(child => operations_bar.addChild(child))
|
buttons.slice(1).forEach(function (child) {operations_bar.addChild(child);});
|
||||||
|
|
||||||
// Remove operation buttons from primary control bar
|
// Remove operation buttons from primary control bar
|
||||||
primary_control_bar = player.getChild("controlBar");
|
var primary_control_bar = player.getChild('controlBar');
|
||||||
buttons.forEach(child => primary_control_bar.removeChild(child));
|
buttons.forEach(function (child) {primary_control_bar.removeChild(child);});
|
||||||
|
|
||||||
operations_bar_element = operations_bar.el();
|
var operations_bar_element = operations_bar.el();
|
||||||
operations_bar_element.className += " mobile-operations-bar"
|
operations_bar_element.classList.add('mobile-operations-bar');
|
||||||
player.addChild(operations_bar)
|
player.addChild(operations_bar);
|
||||||
|
|
||||||
// Playback menu doesn't work when it's initialized outside of the primary control bar
|
// Playback menu doesn't work when it's initialized outside of the primary control bar
|
||||||
playback_element = document.getElementsByClassName("vjs-playback-rate")[0]
|
var playback_element = document.getElementsByClassName('vjs-playback-rate')[0];
|
||||||
operations_bar_element.append(playback_element)
|
operations_bar_element.append(playback_element);
|
||||||
|
|
||||||
// The share and http source selector element can't be fetched till the players ready.
|
// The share and http source selector element can't be fetched till the players ready.
|
||||||
player.one("playing", () => {
|
player.one('playing', function () {
|
||||||
share_element = document.getElementsByClassName("vjs-share-control")[0]
|
var share_element = document.getElementsByClassName('vjs-share-control')[0];
|
||||||
operations_bar_element.append(share_element)
|
operations_bar_element.append(share_element);
|
||||||
|
|
||||||
if (video_data.params.quality === 'dash') {
|
if (!video_data.params.listen && video_data.params.quality === 'dash') {
|
||||||
http_source_selector = document.getElementsByClassName("vjs-http-source-selector vjs-menu-button")[0]
|
var http_source_selector = document.getElementsByClassName('vjs-http-source-selector vjs-menu-button')[0];
|
||||||
operations_bar_element.append(http_source_selector)
|
operations_bar_element.append(http_source_selector);
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
player.on('error', function (event) {
|
|
||||||
if (player.error().code === 2 || player.error().code === 4) {
|
|
||||||
setTimeout(function (event) {
|
|
||||||
console.log('An error occurred in the player, reloading...');
|
|
||||||
|
|
||||||
var currentTime = player.currentTime();
|
|
||||||
var playbackRate = player.playbackRate();
|
|
||||||
var paused = player.paused();
|
|
||||||
|
|
||||||
player.load();
|
|
||||||
|
|
||||||
if (currentTime > 0.5) currentTime -= 0.5;
|
|
||||||
|
|
||||||
player.currentTime(currentTime);
|
|
||||||
player.playbackRate(playbackRate);
|
|
||||||
|
|
||||||
if (!paused) player.play();
|
|
||||||
}, 5000);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Enable VR video support
|
// Enable VR video support
|
||||||
if (!video_data.params.listen && video_data.vr && video_data.params.vr_mode) {
|
if (!video_data.params.listen && video_data.vr && video_data.params.vr_mode) {
|
||||||
player.crossOrigin("anonymous")
|
player.crossOrigin('anonymous');
|
||||||
switch (video_data.projection_type) {
|
switch (video_data.projection_type) {
|
||||||
case "EQUIRECTANGULAR":
|
case 'EQUIRECTANGULAR':
|
||||||
player.vr({projection: "equirectangular"});
|
player.vr({projection: 'equirectangular'});
|
||||||
default: // Should only be "MESH" but we'll use this as a fallback.
|
default: // Should only be 'MESH' but we'll use this as a fallback.
|
||||||
player.vr({projection: "EAC"});
|
player.vr({projection: 'EAC'});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -200,9 +221,76 @@ if (video_data.params.video_start > 0 || video_data.params.video_end > 0) {
|
|||||||
player.volume(video_data.params.volume / 100);
|
player.volume(video_data.params.volume / 100);
|
||||||
player.playbackRate(video_data.params.speed);
|
player.playbackRate(video_data.params.speed);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method for getting the contents of a cookie
|
||||||
|
*
|
||||||
|
* @param {String} name Name of cookie
|
||||||
|
* @returns {String|null} cookieValue
|
||||||
|
*/
|
||||||
|
function getCookieValue(name) {
|
||||||
|
var cookiePrefix = name + '=';
|
||||||
|
var matchedCookie = document.cookie.split(';').find(function (item) {return item.includes(cookiePrefix);});
|
||||||
|
if (matchedCookie)
|
||||||
|
return matchedCookie.replace(cookiePrefix, '');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method for updating the 'PREFS' cookie (or creating it if missing)
|
||||||
|
*
|
||||||
|
* @param {number} newVolume New volume defined (null if unchanged)
|
||||||
|
* @param {number} newSpeed New speed defined (null if unchanged)
|
||||||
|
*/
|
||||||
|
function updateCookie(newVolume, newSpeed) {
|
||||||
|
var volumeValue = newVolume !== null ? newVolume : video_data.params.volume;
|
||||||
|
var speedValue = newSpeed !== null ? newSpeed : video_data.params.speed;
|
||||||
|
|
||||||
|
var cookieValue = getCookieValue('PREFS');
|
||||||
|
var cookieData;
|
||||||
|
|
||||||
|
if (cookieValue !== null) {
|
||||||
|
var cookieJson = JSON.parse(decodeURIComponent(cookieValue));
|
||||||
|
cookieJson.volume = volumeValue;
|
||||||
|
cookieJson.speed = speedValue;
|
||||||
|
cookieData = encodeURIComponent(JSON.stringify(cookieJson));
|
||||||
|
} else {
|
||||||
|
cookieData = encodeURIComponent(JSON.stringify({ 'volume': volumeValue, 'speed': speedValue }));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set expiration in 2 year
|
||||||
|
var date = new Date();
|
||||||
|
date.setFullYear(date.getFullYear() + 2);
|
||||||
|
|
||||||
|
var ipRegex = /^((\d+\.){3}\d+|[A-Fa-f0-9]*:[A-Fa-f0-9:]*:[A-Fa-f0-9:]+)$/;
|
||||||
|
var domainUsed = location.hostname;
|
||||||
|
|
||||||
|
// Fix for a bug in FF where the leading dot in the FQDN is not ignored
|
||||||
|
if (domainUsed.charAt(0) !== '.' && !ipRegex.test(domainUsed) && domainUsed !== 'localhost')
|
||||||
|
domainUsed = '.' + location.hostname;
|
||||||
|
|
||||||
|
var secure = location.protocol.startsWith("https") ? " Secure;" : "";
|
||||||
|
|
||||||
|
document.cookie = 'PREFS=' + cookieData + '; SameSite=Lax; path=/; domain=' +
|
||||||
|
domainUsed + '; expires=' + date.toGMTString() + ';' + secure;
|
||||||
|
|
||||||
|
video_data.params.volume = volumeValue;
|
||||||
|
video_data.params.speed = speedValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
player.on('ratechange', function () {
|
||||||
|
updateCookie(null, player.playbackRate());
|
||||||
|
if (isMobile()) {
|
||||||
|
player.mobileUi({ touchControls: { seekSeconds: 5 * player.playbackRate() } });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
player.on('volumechange', function () {
|
||||||
|
updateCookie(Math.ceil(player.volume() * 100), null);
|
||||||
|
});
|
||||||
|
|
||||||
player.on('waiting', function () {
|
player.on('waiting', function () {
|
||||||
if (player.playbackRate() > 1 && player.liveTracker.isLive() && player.liveTracker.atLiveEdge()) {
|
if (player.playbackRate() > 1 && player.liveTracker.isLive() && player.liveTracker.atLiveEdge()) {
|
||||||
console.log('Player has caught up to source, resetting playbackRate.')
|
console.info('Player has caught up to source, resetting playbackRate');
|
||||||
player.playbackRate(1);
|
player.playbackRate(1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -213,13 +301,13 @@ if (video_data.premiere_timestamp && Math.round(new Date() / 1000) < video_data.
|
|||||||
|
|
||||||
if (video_data.params.save_player_pos) {
|
if (video_data.params.save_player_pos) {
|
||||||
const url = new URL(location);
|
const url = new URL(location);
|
||||||
const hasTimeParam = url.searchParams.has("t");
|
const hasTimeParam = url.searchParams.has('t');
|
||||||
const remeberedTime = get_video_time();
|
const rememberedTime = get_video_time();
|
||||||
let lastUpdated = 0;
|
let lastUpdated = 0;
|
||||||
|
|
||||||
if(!hasTimeParam) set_seconds_after_start(remeberedTime);
|
if(!hasTimeParam) set_seconds_after_start(rememberedTime);
|
||||||
|
|
||||||
const updateTime = () => {
|
player.on('timeupdate', function () {
|
||||||
const raw = player.currentTime();
|
const raw = player.currentTime();
|
||||||
const time = Math.floor(raw);
|
const time = Math.floor(raw);
|
||||||
|
|
||||||
@@ -227,9 +315,7 @@ if (video_data.params.save_player_pos) {
|
|||||||
save_video_time(time);
|
save_video_time(time);
|
||||||
lastUpdated = time;
|
lastUpdated = time;
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
player.on("timeupdate", updateTime);
|
|
||||||
}
|
}
|
||||||
else remove_all_video_times();
|
else remove_all_video_times();
|
||||||
|
|
||||||
@@ -239,13 +325,13 @@ if (video_data.params.autoplay) {
|
|||||||
|
|
||||||
player.ready(function () {
|
player.ready(function () {
|
||||||
new Promise(function (resolve, reject) {
|
new Promise(function (resolve, reject) {
|
||||||
setTimeout(() => resolve(1), 1);
|
setTimeout(function () {resolve(1);}, 1);
|
||||||
}).then(function (result) {
|
}).then(function (result) {
|
||||||
var promise = player.play();
|
var promise = player.play();
|
||||||
|
|
||||||
if (promise !== undefined) {
|
if (promise !== undefined) {
|
||||||
promise.then(_ => {
|
promise.then(function () {
|
||||||
}).catch(error => {
|
}).catch(function (error) {
|
||||||
bpb.show();
|
bpb.show();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -256,67 +342,47 @@ if (video_data.params.autoplay) {
|
|||||||
if (!video_data.params.listen && video_data.params.quality === 'dash') {
|
if (!video_data.params.listen && video_data.params.quality === 'dash') {
|
||||||
player.httpSourceSelector();
|
player.httpSourceSelector();
|
||||||
|
|
||||||
if (video_data.params.quality_dash != "auto") {
|
if (video_data.params.quality_dash !== 'auto') {
|
||||||
player.ready(() => {
|
player.ready(function () {
|
||||||
player.on("loadedmetadata", () => {
|
player.on('loadedmetadata', function () {
|
||||||
const qualityLevels = Array.from(player.qualityLevels()).sort((a, b) => a.height - b.height);
|
const qualityLevels = Array.from(player.qualityLevels()).sort(function (a, b) {return a.height - b.height;});
|
||||||
let targetQualityLevel;
|
let targetQualityLevel;
|
||||||
switch (video_data.params.quality_dash) {
|
switch (video_data.params.quality_dash) {
|
||||||
case "best":
|
case 'best':
|
||||||
targetQualityLevel = qualityLevels.length - 1;
|
targetQualityLevel = qualityLevels.length - 1;
|
||||||
break;
|
break;
|
||||||
case "worst":
|
case 'worst':
|
||||||
targetQualityLevel = 0;
|
targetQualityLevel = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
const targetHeight = Number.parseInt(video_data.params.quality_dash, 10);
|
const targetHeight = parseInt(video_data.params.quality_dash);
|
||||||
for (let i = 0; i < qualityLevels.length; i++) {
|
for (let i = 0; i < qualityLevels.length; i++) {
|
||||||
if (qualityLevels[i].height <= targetHeight) {
|
if (qualityLevels[i].height <= targetHeight)
|
||||||
targetQualityLevel = i;
|
targetQualityLevel = i;
|
||||||
} else {
|
else
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (let i = 0; i < qualityLevels.length; i++) {
|
qualityLevels.forEach(function (level, index) {
|
||||||
qualityLevels[i].enabled = (i == targetQualityLevel);
|
level.enabled = (index === targetQualityLevel);
|
||||||
}
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player.vttThumbnails({
|
player.vttThumbnails({
|
||||||
src: location.origin + '/api/v1/storyboards/' + video_data.id + '?height=90',
|
src: '/api/v1/storyboards/' + video_data.id + '?height=90',
|
||||||
showTimestamp: true
|
showTimestamp: true
|
||||||
});
|
});
|
||||||
|
|
||||||
// Enable annotations
|
// Enable annotations
|
||||||
if (!video_data.params.listen && video_data.params.annotations) {
|
if (!video_data.params.listen && video_data.params.annotations) {
|
||||||
window.addEventListener('load', function (e) {
|
addEventListener('load', function (e) {
|
||||||
var video_container = document.getElementById('player');
|
addEventListener('__ar_annotation_click', function (e) {
|
||||||
let xhr = new XMLHttpRequest();
|
const url = e.detail.url,
|
||||||
xhr.responseType = 'text';
|
target = e.detail.target,
|
||||||
xhr.timeout = 60000;
|
seconds = e.detail.seconds;
|
||||||
xhr.open('GET', '/api/v1/annotations/' + video_data.id, true);
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
|
||||||
if (xhr.readyState === 4) {
|
|
||||||
if (xhr.status === 200) {
|
|
||||||
videojs.registerPlugin('youtubeAnnotationsPlugin', youtubeAnnotationsPlugin);
|
|
||||||
if (!player.paused()) {
|
|
||||||
player.youtubeAnnotationsPlugin({ annotationXml: xhr.response, videoContainer: video_container });
|
|
||||||
} else {
|
|
||||||
player.one('play', function (event) {
|
|
||||||
player.youtubeAnnotationsPlugin({ annotationXml: xhr.response, videoContainer: video_container });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
window.addEventListener('__ar_annotation_click', e => {
|
|
||||||
const { url, target, seconds } = e.detail;
|
|
||||||
var path = new URL(url);
|
var path = new URL(url);
|
||||||
|
|
||||||
if (path.href.startsWith('https://www.youtube.com/watch?') && seconds) {
|
if (path.href.startsWith('https://www.youtube.com/watch?') && seconds) {
|
||||||
@@ -326,41 +392,48 @@ if (!video_data.params.listen && video_data.params.annotations) {
|
|||||||
path = path.pathname + path.search;
|
path = path.pathname + path.search;
|
||||||
|
|
||||||
if (target === 'current') {
|
if (target === 'current') {
|
||||||
window.location.href = path;
|
location.href = path;
|
||||||
} else if (target === 'new') {
|
} else if (target === 'new') {
|
||||||
window.open(path, '_blank');
|
open(path, '_blank');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
helpers.xhr('GET', '/api/v1/annotations/' + video_data.id, {
|
||||||
|
responseType: 'text',
|
||||||
|
timeout: 60000
|
||||||
|
}, {
|
||||||
|
on200: function (response) {
|
||||||
|
var video_container = document.getElementById('player');
|
||||||
|
videojs.registerPlugin('youtubeAnnotationsPlugin', youtubeAnnotationsPlugin);
|
||||||
|
if (player.paused()) {
|
||||||
|
player.one('play', function (event) {
|
||||||
|
player.youtubeAnnotationsPlugin({ annotationXml: response, videoContainer: video_container });
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
player.youtubeAnnotationsPlugin({ annotationXml: response, videoContainer: video_container });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
xhr.send();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function increase_volume(delta) {
|
function change_volume(delta) {
|
||||||
const curVolume = player.volume();
|
const curVolume = player.volume();
|
||||||
let newVolume = curVolume + delta;
|
let newVolume = curVolume + delta;
|
||||||
if (newVolume > 1) {
|
newVolume = helpers.clamp(newVolume, 0, 1);
|
||||||
newVolume = 1;
|
|
||||||
} else if (newVolume < 0) {
|
|
||||||
newVolume = 0;
|
|
||||||
}
|
|
||||||
player.volume(newVolume);
|
player.volume(newVolume);
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggle_muted() {
|
function toggle_muted() {
|
||||||
const isMuted = player.muted();
|
player.muted(!player.muted());
|
||||||
player.muted(!isMuted);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function skip_seconds(delta) {
|
function skip_seconds(delta) {
|
||||||
const duration = player.duration();
|
const duration = player.duration();
|
||||||
const curTime = player.currentTime();
|
const curTime = player.currentTime();
|
||||||
let newTime = curTime + delta;
|
let newTime = curTime + delta;
|
||||||
if (newTime > duration) {
|
newTime = helpers.clamp(newTime, 0, duration);
|
||||||
newTime = duration;
|
|
||||||
} else if (newTime < 0) {
|
|
||||||
newTime = 0;
|
|
||||||
}
|
|
||||||
player.currentTime(newTime);
|
player.currentTime(newTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -370,57 +443,21 @@ function set_seconds_after_start(delta) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function save_video_time(seconds) {
|
function save_video_time(seconds) {
|
||||||
const videoId = video_data.id;
|
|
||||||
const all_video_times = get_all_video_times();
|
const all_video_times = get_all_video_times();
|
||||||
|
all_video_times[video_data.id] = seconds;
|
||||||
all_video_times[videoId] = seconds;
|
helpers.storage.set(save_player_pos_key, all_video_times);
|
||||||
|
|
||||||
set_all_video_times(all_video_times);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_video_time() {
|
function get_video_time() {
|
||||||
try {
|
return get_all_video_times()[video_data.id] || 0;
|
||||||
const videoId = video_data.id;
|
|
||||||
const all_video_times = get_all_video_times();
|
|
||||||
const timestamp = all_video_times[videoId];
|
|
||||||
|
|
||||||
return timestamp || 0;
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function set_all_video_times(times) {
|
|
||||||
if (storage) {
|
|
||||||
if (times) {
|
|
||||||
try {
|
|
||||||
storage.setItem(save_player_pos_key, JSON.stringify(times));
|
|
||||||
} catch (e) {
|
|
||||||
console.debug('set_all_video_times: ' + e);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
storage.removeItem(save_player_pos_key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_all_video_times() {
|
function get_all_video_times() {
|
||||||
if (storage) {
|
return helpers.storage.get(save_player_pos_key) || {};
|
||||||
const raw = storage.getItem(save_player_pos_key);
|
|
||||||
if (raw !== null) {
|
|
||||||
try {
|
|
||||||
return JSON.parse(raw);
|
|
||||||
} catch (e) {
|
|
||||||
console.debug('get_all_video_times: ' + e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function remove_all_video_times() {
|
function remove_all_video_times() {
|
||||||
set_all_video_times(null);
|
helpers.storage.remove(save_player_pos_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
function set_time_percent(percent) {
|
function set_time_percent(percent) {
|
||||||
@@ -436,21 +473,23 @@ function toggle_play() { player.paused() ? play() : pause(); }
|
|||||||
|
|
||||||
const toggle_captions = (function () {
|
const toggle_captions = (function () {
|
||||||
let toggledTrack = null;
|
let toggledTrack = null;
|
||||||
const onChange = function (e) {
|
|
||||||
toggledTrack = null;
|
function bindChange(onOrOff) {
|
||||||
};
|
player.textTracks()[onOrOff]('change', function (e) {
|
||||||
const bindChange = function (onOrOff) {
|
toggledTrack = null;
|
||||||
player.textTracks()[onOrOff]('change', onChange);
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
// Wrapper function to ignore our own emitted events and only listen
|
// Wrapper function to ignore our own emitted events and only listen
|
||||||
// to events emitted by Video.js on click on the captions menu items.
|
// to events emitted by Video.js on click on the captions menu items.
|
||||||
const setMode = function (track, mode) {
|
function setMode(track, mode) {
|
||||||
bindChange('off');
|
bindChange('off');
|
||||||
track.mode = mode;
|
track.mode = mode;
|
||||||
window.setTimeout(function () {
|
setTimeout(function () {
|
||||||
bindChange('on');
|
bindChange('on');
|
||||||
}, 0);
|
}, 0);
|
||||||
};
|
}
|
||||||
|
|
||||||
bindChange('on');
|
bindChange('on');
|
||||||
return function () {
|
return function () {
|
||||||
if (toggledTrack !== null) {
|
if (toggledTrack !== null) {
|
||||||
@@ -498,15 +537,11 @@ function increase_playback_rate(steps) {
|
|||||||
const maxIndex = options.playbackRates.length - 1;
|
const maxIndex = options.playbackRates.length - 1;
|
||||||
const curIndex = options.playbackRates.indexOf(player.playbackRate());
|
const curIndex = options.playbackRates.indexOf(player.playbackRate());
|
||||||
let newIndex = curIndex + steps;
|
let newIndex = curIndex + steps;
|
||||||
if (newIndex > maxIndex) {
|
newIndex = helpers.clamp(newIndex, 0, maxIndex);
|
||||||
newIndex = maxIndex;
|
|
||||||
} else if (newIndex < 0) {
|
|
||||||
newIndex = 0;
|
|
||||||
}
|
|
||||||
player.playbackRate(options.playbackRates[newIndex]);
|
player.playbackRate(options.playbackRates[newIndex]);
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener('keydown', e => {
|
addEventListener('keydown', function (e) {
|
||||||
if (e.target.tagName.toLowerCase() === 'input') {
|
if (e.target.tagName.toLowerCase() === 'input') {
|
||||||
// Ignore input when focus is on certain elements, e.g. form fields.
|
// Ignore input when focus is on certain elements, e.g. form fields.
|
||||||
return;
|
return;
|
||||||
@@ -539,10 +574,10 @@ window.addEventListener('keydown', e => {
|
|||||||
case 'MediaStop': action = stop; break;
|
case 'MediaStop': action = stop; break;
|
||||||
|
|
||||||
case 'ArrowUp':
|
case 'ArrowUp':
|
||||||
if (isPlayerFocused) action = increase_volume.bind(this, 0.1);
|
if (isPlayerFocused) action = change_volume.bind(this, 0.1);
|
||||||
break;
|
break;
|
||||||
case 'ArrowDown':
|
case 'ArrowDown':
|
||||||
if (isPlayerFocused) action = increase_volume.bind(this, -0.1);
|
if (isPlayerFocused) action = change_volume.bind(this, -0.1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'm':
|
case 'm':
|
||||||
@@ -593,12 +628,11 @@ window.addEventListener('keydown', e => {
|
|||||||
// TODO: Add support to play back previous video.
|
// TODO: Add support to play back previous video.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '.':
|
// TODO: More precise step. Now FPS is taken equal to 29.97
|
||||||
// TODO: Add support for next-frame-stepping.
|
// Common FPS: https://forum.videohelp.com/threads/81868#post323588
|
||||||
break;
|
// Possible solution is new HTMLVideoElement.requestVideoFrameCallback() https://wicg.github.io/video-rvfc/
|
||||||
case ',':
|
case ',': action = function () { pause(); skip_seconds(-1/29.97); }; break;
|
||||||
// TODO: Add support for previous-frame-stepping.
|
case '.': action = function () { pause(); skip_seconds( 1/29.97); }; break;
|
||||||
break;
|
|
||||||
|
|
||||||
case '>': action = increase_playback_rate.bind(this, 1); break;
|
case '>': action = increase_playback_rate.bind(this, 1); break;
|
||||||
case '<': action = increase_playback_rate.bind(this, -1); break;
|
case '<': action = increase_playback_rate.bind(this, -1); break;
|
||||||
@@ -617,84 +651,77 @@ window.addEventListener('keydown', e => {
|
|||||||
// Add support for controlling the player volume by scrolling over it. Adapted from
|
// Add support for controlling the player volume by scrolling over it. Adapted from
|
||||||
// https://github.com/ctd1500/videojs-hotkeys/blob/bb4a158b2e214ccab87c2e7b95f42bc45c6bfd87/videojs.hotkeys.js#L292-L328
|
// https://github.com/ctd1500/videojs-hotkeys/blob/bb4a158b2e214ccab87c2e7b95f42bc45c6bfd87/videojs.hotkeys.js#L292-L328
|
||||||
(function () {
|
(function () {
|
||||||
const volumeStep = 0.05;
|
|
||||||
const enableVolumeScroll = true;
|
|
||||||
const enableHoverScroll = true;
|
|
||||||
const doc = document;
|
|
||||||
const pEl = document.getElementById('player');
|
const pEl = document.getElementById('player');
|
||||||
|
|
||||||
var volumeHover = false;
|
var volumeHover = false;
|
||||||
var volumeSelector = pEl.querySelector('.vjs-volume-menu-button') || pEl.querySelector('.vjs-volume-panel');
|
var volumeSelector = pEl.querySelector('.vjs-volume-menu-button') || pEl.querySelector('.vjs-volume-panel');
|
||||||
if (volumeSelector != null) {
|
if (volumeSelector !== null) {
|
||||||
volumeSelector.onmouseover = function () { volumeHover = true; };
|
volumeSelector.onmouseover = function () { volumeHover = true; };
|
||||||
volumeSelector.onmouseout = function () { volumeHover = false; };
|
volumeSelector.onmouseout = function () { volumeHover = false; };
|
||||||
}
|
}
|
||||||
|
|
||||||
var mouseScroll = function mouseScroll(event) {
|
function mouseScroll(event) {
|
||||||
var activeEl = doc.activeElement;
|
|
||||||
if (enableHoverScroll) {
|
|
||||||
// If we leave this undefined then it can match non-existent elements below
|
|
||||||
activeEl = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// When controls are disabled, hotkeys will be disabled as well
|
// When controls are disabled, hotkeys will be disabled as well
|
||||||
if (player.controls()) {
|
if (!player.controls() || !volumeHover) return;
|
||||||
if (volumeHover) {
|
|
||||||
if (enableVolumeScroll) {
|
|
||||||
event = window.event || event;
|
|
||||||
var delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail)));
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
if (delta == 1) {
|
event.preventDefault();
|
||||||
increase_volume(volumeStep);
|
var wheelMove = event.wheelDelta || -event.detail;
|
||||||
} else if (delta == -1) {
|
var volumeSign = Math.sign(wheelMove);
|
||||||
increase_volume(-volumeStep);
|
|
||||||
}
|
change_volume(volumeSign * 0.05); // decrease/increase by 5%
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
player.on('mousewheel', mouseScroll);
|
player.on('mousewheel', mouseScroll);
|
||||||
player.on("DOMMouseScroll", mouseScroll);
|
player.on('DOMMouseScroll', mouseScroll);
|
||||||
}());
|
}());
|
||||||
|
|
||||||
// Since videojs-share can sometimes be blocked, we defer it until last
|
// Since videojs-share can sometimes be blocked, we defer it until last
|
||||||
if (player.share) {
|
if (player.share) player.share(shareOptions);
|
||||||
player.share(shareOptions);
|
|
||||||
}
|
|
||||||
|
|
||||||
// show the preferred caption by default
|
// show the preferred caption by default
|
||||||
if (player_data.preferred_caption_found) {
|
if (player_data.preferred_caption_found) {
|
||||||
player.ready(() => {
|
player.ready(function () {
|
||||||
player.textTracks()[1].mode = 'showing';
|
if (!video_data.params.listen && video_data.params.quality === 'dash') {
|
||||||
|
// play.textTracks()[0] on DASH mode is showing some debug messages
|
||||||
|
player.textTracks()[1].mode = 'showing';
|
||||||
|
} else {
|
||||||
|
player.textTracks()[0].mode = 'showing';
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Safari audio double duration fix
|
// Safari audio double duration fix
|
||||||
if (navigator.vendor == "Apple Computer, Inc." && video_data.params.listen) {
|
if (navigator.vendor === 'Apple Computer, Inc.' && video_data.params.listen) {
|
||||||
player.on('loadedmetadata', function () {
|
player.on('loadedmetadata', function () {
|
||||||
player.on('timeupdate', function () {
|
player.on('timeupdate', function () {
|
||||||
if (player.remainingTime() < player.duration() / 2) {
|
if (player.remainingTime() < player.duration() / 2 && player.remainingTime() >= 2) {
|
||||||
player.currentTime(player.duration() + 1);
|
player.currentTime(player.duration() - 1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Watch on Invidious link
|
// Watch on Invidious link
|
||||||
if (window.location.pathname.startsWith("/embed/")) {
|
if (location.pathname.startsWith('/embed/')) {
|
||||||
const Button = videojs.getComponent('Button');
|
const Button = videojs.getComponent('Button');
|
||||||
let watch_on_invidious_button = new Button(player);
|
let watch_on_invidious_button = new Button(player);
|
||||||
|
|
||||||
// Create hyperlink for current instance
|
// Create hyperlink for current instance
|
||||||
redirect_element = document.createElement("a");
|
var redirect_element = document.createElement('a');
|
||||||
redirect_element.setAttribute("href", `http://${window.location.host}/watch?v=${window.location.pathname.replace("/embed/","")}`)
|
redirect_element.setAttribute('href', location.pathname.replace('/embed/', '/watch?v='));
|
||||||
redirect_element.appendChild(document.createTextNode("Invidious"))
|
redirect_element.appendChild(document.createTextNode('Invidious'));
|
||||||
|
|
||||||
watch_on_invidious_button.el().appendChild(redirect_element)
|
watch_on_invidious_button.el().appendChild(redirect_element);
|
||||||
watch_on_invidious_button.addClass("watch-on-invidious")
|
watch_on_invidious_button.addClass('watch-on-invidious');
|
||||||
|
|
||||||
cb = player.getChild('ControlBar')
|
var cb = player.getChild('ControlBar');
|
||||||
cb.addChild(watch_on_invidious_button)
|
cb.addChild(watch_on_invidious_button);
|
||||||
};
|
}
|
||||||
|
|
||||||
|
addEventListener('DOMContentLoaded', function () {
|
||||||
|
// Save time during redirection on another instance
|
||||||
|
const changeInstanceLink = document.querySelector('#watch-on-another-invidious-instance > a');
|
||||||
|
if (changeInstanceLink) changeInstanceLink.addEventListener('click', function () {
|
||||||
|
changeInstanceLink.href = addCurrentTimeToURL(changeInstanceLink.href);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
var playlist_data = JSON.parse(document.getElementById('playlist_data').innerHTML);
|
'use strict';
|
||||||
|
var playlist_data = JSON.parse(document.getElementById('playlist_data').textContent);
|
||||||
|
var payload = 'csrf_token=' + playlist_data.csrf_token;
|
||||||
|
|
||||||
function add_playlist_video(target) {
|
function add_playlist_video(target) {
|
||||||
var select = target.parentNode.children[0].children[1];
|
var select = target.parentNode.children[0].children[1];
|
||||||
@@ -7,21 +9,12 @@ function add_playlist_video(target) {
|
|||||||
var url = '/playlist_ajax?action_add_video=1&redirect=false' +
|
var url = '/playlist_ajax?action_add_video=1&redirect=false' +
|
||||||
'&video_id=' + target.getAttribute('data-id') +
|
'&video_id=' + target.getAttribute('data-id') +
|
||||||
'&playlist_id=' + option.getAttribute('data-plid');
|
'&playlist_id=' + option.getAttribute('data-plid');
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('POST', url, true);
|
|
||||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
helpers.xhr('POST', url, {payload: payload}, {
|
||||||
if (xhr.readyState == 4) {
|
on200: function (response) {
|
||||||
if (xhr.status == 200) {
|
option.textContent = '✓' + option.textContent;
|
||||||
option.innerText = '✓' + option.innerText;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
xhr.send('csrf_token=' + playlist_data.csrf_token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function add_playlist_item(target) {
|
function add_playlist_item(target) {
|
||||||
@@ -31,21 +24,12 @@ function add_playlist_item(target) {
|
|||||||
var url = '/playlist_ajax?action_add_video=1&redirect=false' +
|
var url = '/playlist_ajax?action_add_video=1&redirect=false' +
|
||||||
'&video_id=' + target.getAttribute('data-id') +
|
'&video_id=' + target.getAttribute('data-id') +
|
||||||
'&playlist_id=' + target.getAttribute('data-plid');
|
'&playlist_id=' + target.getAttribute('data-plid');
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('POST', url, true);
|
|
||||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
helpers.xhr('POST', url, {payload: payload}, {
|
||||||
if (xhr.readyState == 4) {
|
onNon200: function (xhr) {
|
||||||
if (xhr.status != 200) {
|
tile.style.display = '';
|
||||||
tile.style.display = '';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
xhr.send('csrf_token=' + playlist_data.csrf_token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function remove_playlist_item(target) {
|
function remove_playlist_item(target) {
|
||||||
@@ -55,19 +39,10 @@ function remove_playlist_item(target) {
|
|||||||
var url = '/playlist_ajax?action_remove_video=1&redirect=false' +
|
var url = '/playlist_ajax?action_remove_video=1&redirect=false' +
|
||||||
'&set_video_id=' + target.getAttribute('data-index') +
|
'&set_video_id=' + target.getAttribute('data-index') +
|
||||||
'&playlist_id=' + target.getAttribute('data-plid');
|
'&playlist_id=' + target.getAttribute('data-plid');
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('POST', url, true);
|
|
||||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
helpers.xhr('POST', url, {payload: payload}, {
|
||||||
if (xhr.readyState == 4) {
|
onNon200: function (xhr) {
|
||||||
if (xhr.status != 200) {
|
tile.style.display = '';
|
||||||
tile.style.display = '';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
}
|
||||||
xhr.send('csrf_token=' + playlist_data.csrf_token);
|
|
||||||
}
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,7 +1,9 @@
|
|||||||
var subscribe_data = JSON.parse(document.getElementById('subscribe_data').innerHTML);
|
'use strict';
|
||||||
|
var subscribe_data = JSON.parse(document.getElementById('subscribe_data').textContent);
|
||||||
|
var payload = 'csrf_token=' + subscribe_data.csrf_token;
|
||||||
|
|
||||||
var subscribe_button = document.getElementById('subscribe');
|
var subscribe_button = document.getElementById('subscribe');
|
||||||
subscribe_button.parentNode['action'] = 'javascript:void(0)';
|
subscribe_button.parentNode.action = 'javascript:void(0)';
|
||||||
|
|
||||||
if (subscribe_button.getAttribute('data-type') === 'subscribe') {
|
if (subscribe_button.getAttribute('data-type') === 'subscribe') {
|
||||||
subscribe_button.onclick = subscribe;
|
subscribe_button.onclick = subscribe;
|
||||||
@@ -9,82 +11,34 @@ if (subscribe_button.getAttribute('data-type') === 'subscribe') {
|
|||||||
subscribe_button.onclick = unsubscribe;
|
subscribe_button.onclick = unsubscribe;
|
||||||
}
|
}
|
||||||
|
|
||||||
function subscribe(retries = 5) {
|
function subscribe() {
|
||||||
if (retries <= 0) {
|
|
||||||
console.log('Failed to subscribe.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var url = '/subscription_ajax?action_create_subscription_to_channel=1&redirect=false' +
|
|
||||||
'&c=' + subscribe_data.ucid;
|
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('POST', url, true);
|
|
||||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
||||||
|
|
||||||
var fallback = subscribe_button.innerHTML;
|
var fallback = subscribe_button.innerHTML;
|
||||||
subscribe_button.onclick = unsubscribe;
|
subscribe_button.onclick = unsubscribe;
|
||||||
subscribe_button.innerHTML = '<b>' + subscribe_data.unsubscribe_text + ' | ' + subscribe_data.sub_count_text + '</b>';
|
subscribe_button.innerHTML = '<b>' + subscribe_data.unsubscribe_text + ' | ' + subscribe_data.sub_count_text + '</b>';
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
var url = '/subscription_ajax?action_create_subscription_to_channel=1&redirect=false' +
|
||||||
if (xhr.readyState == 4) {
|
'&c=' + subscribe_data.ucid;
|
||||||
if (xhr.status != 200) {
|
|
||||||
subscribe_button.onclick = subscribe;
|
helpers.xhr('POST', url, {payload: payload, retries: 5, entity_name: 'subscribe request'}, {
|
||||||
subscribe_button.innerHTML = fallback;
|
onNon200: function (xhr) {
|
||||||
}
|
subscribe_button.onclick = subscribe;
|
||||||
|
subscribe_button.innerHTML = fallback;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
xhr.onerror = function () {
|
|
||||||
console.log('Subscribing failed... ' + retries + '/5');
|
|
||||||
setTimeout(function () { subscribe(retries - 1) }, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.ontimeout = function () {
|
|
||||||
console.log('Subscribing failed... ' + retries + '/5');
|
|
||||||
subscribe(retries - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.send('csrf_token=' + subscribe_data.csrf_token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function unsubscribe(retries = 5) {
|
function unsubscribe() {
|
||||||
if (retries <= 0) {
|
|
||||||
console.log('Failed to subscribe');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var url = '/subscription_ajax?action_remove_subscriptions=1&redirect=false' +
|
|
||||||
'&c=' + subscribe_data.ucid;
|
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('POST', url, true);
|
|
||||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
||||||
|
|
||||||
var fallback = subscribe_button.innerHTML;
|
var fallback = subscribe_button.innerHTML;
|
||||||
subscribe_button.onclick = subscribe;
|
subscribe_button.onclick = subscribe;
|
||||||
subscribe_button.innerHTML = '<b>' + subscribe_data.subscribe_text + ' | ' + subscribe_data.sub_count_text + '</b>';
|
subscribe_button.innerHTML = '<b>' + subscribe_data.subscribe_text + ' | ' + subscribe_data.sub_count_text + '</b>';
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
var url = '/subscription_ajax?action_remove_subscriptions=1&redirect=false' +
|
||||||
if (xhr.readyState == 4) {
|
'&c=' + subscribe_data.ucid;
|
||||||
if (xhr.status != 200) {
|
|
||||||
subscribe_button.onclick = unsubscribe;
|
helpers.xhr('POST', url, {payload: payload, retries: 5, entity_name: 'unsubscribe request'}, {
|
||||||
subscribe_button.innerHTML = fallback;
|
onNon200: function (xhr) {
|
||||||
}
|
subscribe_button.onclick = unsubscribe;
|
||||||
|
subscribe_button.innerHTML = fallback;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
xhr.onerror = function () {
|
|
||||||
console.log('Unsubscribing failed... ' + retries + '/5');
|
|
||||||
setTimeout(function () { unsubscribe(retries - 1) }, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.ontimeout = function () {
|
|
||||||
console.log('Unsubscribing failed... ' + retries + '/5');
|
|
||||||
unsubscribe(retries - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.send('csrf_token=' + subscribe_data.csrf_token);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,91 +1,44 @@
|
|||||||
|
'use strict';
|
||||||
var toggle_theme = document.getElementById('toggle_theme');
|
var toggle_theme = document.getElementById('toggle_theme');
|
||||||
toggle_theme.href = 'javascript:void(0);';
|
toggle_theme.href = 'javascript:void(0)';
|
||||||
|
|
||||||
|
const STORAGE_KEY_THEME = 'dark_mode';
|
||||||
|
const THEME_DARK = 'dark';
|
||||||
|
const THEME_LIGHT = 'light';
|
||||||
|
|
||||||
|
// TODO: theme state controlled by system
|
||||||
toggle_theme.addEventListener('click', function () {
|
toggle_theme.addEventListener('click', function () {
|
||||||
var dark_mode = document.body.classList.contains("light-theme");
|
const isDarkTheme = helpers.storage.get(STORAGE_KEY_THEME) === THEME_DARK;
|
||||||
|
const newTheme = isDarkTheme ? THEME_LIGHT : THEME_DARK;
|
||||||
var url = '/toggle_theme?redirect=false';
|
setTheme(newTheme);
|
||||||
var xhr = new XMLHttpRequest();
|
helpers.storage.set(STORAGE_KEY_THEME, newTheme);
|
||||||
xhr.responseType = 'json';
|
helpers.xhr('GET', '/toggle_theme?redirect=false', {}, {});
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('GET', url, true);
|
|
||||||
|
|
||||||
set_mode(dark_mode);
|
|
||||||
try {
|
|
||||||
window.localStorage.setItem('dark_mode', dark_mode ? 'dark' : 'light');
|
|
||||||
} catch {}
|
|
||||||
|
|
||||||
xhr.send();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
window.addEventListener('storage', function (e) {
|
/** @param {THEME_DARK|THEME_LIGHT} theme */
|
||||||
if (e.key === 'dark_mode') {
|
function setTheme(theme) {
|
||||||
update_mode(e.newValue);
|
// By default body element has .no-theme class that uses OS theme via CSS @media rules
|
||||||
}
|
// It rewrites using hard className below
|
||||||
});
|
if (theme === THEME_DARK) {
|
||||||
|
toggle_theme.children[0].className = 'icon ion-ios-sunny';
|
||||||
window.addEventListener('DOMContentLoaded', function () {
|
document.body.className = 'dark-theme';
|
||||||
const dark_mode = document.getElementById('dark_mode_pref').textContent;
|
|
||||||
try {
|
|
||||||
// Update localStorage if dark mode preference changed on preferences page
|
|
||||||
window.localStorage.setItem('dark_mode', dark_mode);
|
|
||||||
} catch {}
|
|
||||||
update_mode(dark_mode);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
var darkScheme = window.matchMedia('(prefers-color-scheme: dark)');
|
|
||||||
var lightScheme = window.matchMedia('(prefers-color-scheme: light)');
|
|
||||||
|
|
||||||
darkScheme.addListener(scheme_switch);
|
|
||||||
lightScheme.addListener(scheme_switch);
|
|
||||||
|
|
||||||
function scheme_switch (e) {
|
|
||||||
// ignore this method if we have a preference set
|
|
||||||
try {
|
|
||||||
if (localStorage.getItem('dark_mode')) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} catch {}
|
|
||||||
if (e.matches) {
|
|
||||||
if (e.media.includes("dark")) {
|
|
||||||
set_mode(true);
|
|
||||||
} else if (e.media.includes("light")) {
|
|
||||||
set_mode(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function set_mode (bool) {
|
|
||||||
if (bool) {
|
|
||||||
// dark
|
|
||||||
toggle_theme.children[0].setAttribute('class', 'icon ion-ios-sunny');
|
|
||||||
document.body.classList.remove('no-theme');
|
|
||||||
document.body.classList.remove('light-theme');
|
|
||||||
document.body.classList.add('dark-theme');
|
|
||||||
} else {
|
} else {
|
||||||
// light
|
toggle_theme.children[0].className = 'icon ion-ios-moon';
|
||||||
toggle_theme.children[0].setAttribute('class', 'icon ion-ios-moon');
|
document.body.className = 'light-theme';
|
||||||
document.body.classList.remove('no-theme');
|
|
||||||
document.body.classList.remove('dark-theme');
|
|
||||||
document.body.classList.add('light-theme');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function update_mode (mode) {
|
// Handles theme change event caused by other tab
|
||||||
if (mode === 'true' /* for backwards compatibility */ || mode === 'dark') {
|
addEventListener('storage', function (e) {
|
||||||
// If preference for dark mode indicated
|
if (e.key === STORAGE_KEY_THEME)
|
||||||
set_mode(true);
|
setTheme(helpers.storage.get(STORAGE_KEY_THEME));
|
||||||
}
|
});
|
||||||
else if (mode === 'false' /* for backwards compatibility */ || mode === 'light') {
|
|
||||||
// If preference for light mode indicated
|
|
||||||
set_mode(false);
|
|
||||||
}
|
|
||||||
else if (document.getElementById('dark_mode_pref').textContent === '' && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
|
||||||
// If no preference indicated here and no preference indicated on the preferences page (backend), but the browser tells us that the operating system has a dark theme
|
|
||||||
set_mode(true);
|
|
||||||
}
|
|
||||||
// else do nothing, falling back to the mode defined by the `dark_mode` preference on the preferences page (backend)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
// Set theme from preferences on page load
|
||||||
|
addEventListener('DOMContentLoaded', function () {
|
||||||
|
const prefTheme = document.getElementById('dark_mode_pref').textContent;
|
||||||
|
if (prefTheme) {
|
||||||
|
setTheme(prefTheme);
|
||||||
|
helpers.storage.set(STORAGE_KEY_THEME, prefTheme);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,32 +1,35 @@
|
|||||||
var video_data = JSON.parse(document.getElementById('video_data').innerHTML);
|
'use strict';
|
||||||
|
var video_data = JSON.parse(document.getElementById('video_data').textContent);
|
||||||
|
var spinnerHTML = '<h3 style="text-align:center"><div class="loading"><i class="icon ion-ios-refresh"></i></div></h3>';
|
||||||
|
var spinnerHTMLwithHR = spinnerHTML + '<hr>';
|
||||||
|
|
||||||
String.prototype.supplant = function (o) {
|
String.prototype.supplant = function (o) {
|
||||||
return this.replace(/{([^{}]*)}/g, function (a, b) {
|
return this.replace(/{([^{}]*)}/g, function (a, b) {
|
||||||
var r = o[b];
|
var r = o[b];
|
||||||
return typeof r === 'string' || typeof r === 'number' ? r : a;
|
return typeof r === 'string' || typeof r === 'number' ? r : a;
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
function toggle_parent(target) {
|
function toggle_parent(target) {
|
||||||
body = target.parentNode.parentNode.children[1];
|
var body = target.parentNode.parentNode.children[1];
|
||||||
if (body.style.display === null || body.style.display === '') {
|
if (body.style.display === 'none') {
|
||||||
target.innerHTML = '[ + ]';
|
target.textContent = '[ − ]';
|
||||||
body.style.display = 'none';
|
|
||||||
} else {
|
|
||||||
target.innerHTML = '[ - ]';
|
|
||||||
body.style.display = '';
|
body.style.display = '';
|
||||||
|
} else {
|
||||||
|
target.textContent = '[ + ]';
|
||||||
|
body.style.display = 'none';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggle_comments(event) {
|
function toggle_comments(event) {
|
||||||
var target = event.target;
|
var target = event.target;
|
||||||
body = target.parentNode.parentNode.parentNode.children[1];
|
var body = target.parentNode.parentNode.parentNode.children[1];
|
||||||
if (body.style.display === null || body.style.display === '') {
|
if (body.style.display === 'none') {
|
||||||
target.innerHTML = '[ + ]';
|
target.textContent = '[ − ]';
|
||||||
body.style.display = 'none';
|
|
||||||
} else {
|
|
||||||
target.innerHTML = '[ - ]';
|
|
||||||
body.style.display = '';
|
body.style.display = '';
|
||||||
|
} else {
|
||||||
|
target.textContent = '[ + ]';
|
||||||
|
body.style.display = 'none';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,13 +46,13 @@ function swap_comments(event) {
|
|||||||
function hide_youtube_replies(event) {
|
function hide_youtube_replies(event) {
|
||||||
var target = event.target;
|
var target = event.target;
|
||||||
|
|
||||||
sub_text = target.getAttribute('data-inner-text');
|
var sub_text = target.getAttribute('data-inner-text');
|
||||||
inner_text = target.getAttribute('data-sub-text');
|
var inner_text = target.getAttribute('data-sub-text');
|
||||||
|
|
||||||
body = target.parentNode.parentNode.children[1];
|
var body = target.parentNode.parentNode.children[1];
|
||||||
body.style.display = 'none';
|
body.style.display = 'none';
|
||||||
|
|
||||||
target.innerHTML = sub_text;
|
target.textContent = sub_text;
|
||||||
target.onclick = show_youtube_replies;
|
target.onclick = show_youtube_replies;
|
||||||
target.setAttribute('data-inner-text', inner_text);
|
target.setAttribute('data-inner-text', inner_text);
|
||||||
target.setAttribute('data-sub-text', sub_text);
|
target.setAttribute('data-sub-text', sub_text);
|
||||||
@@ -58,13 +61,13 @@ function hide_youtube_replies(event) {
|
|||||||
function show_youtube_replies(event) {
|
function show_youtube_replies(event) {
|
||||||
var target = event.target;
|
var target = event.target;
|
||||||
|
|
||||||
sub_text = target.getAttribute('data-inner-text');
|
var sub_text = target.getAttribute('data-inner-text');
|
||||||
inner_text = target.getAttribute('data-sub-text');
|
var inner_text = target.getAttribute('data-sub-text');
|
||||||
|
|
||||||
body = target.parentNode.parentNode.children[1];
|
var body = target.parentNode.parentNode.children[1];
|
||||||
body.style.display = '';
|
body.style.display = '';
|
||||||
|
|
||||||
target.innerHTML = sub_text;
|
target.textContent = sub_text;
|
||||||
target.onclick = hide_youtube_replies;
|
target.onclick = hide_youtube_replies;
|
||||||
target.setAttribute('data-inner-text', inner_text);
|
target.setAttribute('data-inner-text', inner_text);
|
||||||
target.setAttribute('data-sub-text', sub_text);
|
target.setAttribute('data-sub-text', sub_text);
|
||||||
@@ -78,287 +81,186 @@ if (continue_button) {
|
|||||||
function next_video() {
|
function next_video() {
|
||||||
var url = new URL('https://example.com/watch?v=' + video_data.next_video);
|
var url = new URL('https://example.com/watch?v=' + video_data.next_video);
|
||||||
|
|
||||||
if (video_data.params.autoplay || video_data.params.continue_autoplay) {
|
if (video_data.params.autoplay || video_data.params.continue_autoplay)
|
||||||
url.searchParams.set('autoplay', '1');
|
url.searchParams.set('autoplay', '1');
|
||||||
}
|
if (video_data.params.listen !== video_data.preferences.listen)
|
||||||
|
|
||||||
if (video_data.params.listen !== video_data.preferences.listen) {
|
|
||||||
url.searchParams.set('listen', video_data.params.listen);
|
url.searchParams.set('listen', video_data.params.listen);
|
||||||
}
|
if (video_data.params.speed !== video_data.preferences.speed)
|
||||||
|
|
||||||
if (video_data.params.speed !== video_data.preferences.speed) {
|
|
||||||
url.searchParams.set('speed', video_data.params.speed);
|
url.searchParams.set('speed', video_data.params.speed);
|
||||||
}
|
if (video_data.params.local !== video_data.preferences.local)
|
||||||
|
|
||||||
if (video_data.params.local !== video_data.preferences.local) {
|
|
||||||
url.searchParams.set('local', video_data.params.local);
|
url.searchParams.set('local', video_data.params.local);
|
||||||
}
|
|
||||||
|
|
||||||
url.searchParams.set('continue', '1');
|
url.searchParams.set('continue', '1');
|
||||||
|
|
||||||
location.assign(url.pathname + url.search);
|
location.assign(url.pathname + url.search);
|
||||||
}
|
}
|
||||||
|
|
||||||
function continue_autoplay(event) {
|
function continue_autoplay(event) {
|
||||||
if (event.target.checked) {
|
if (event.target.checked) {
|
||||||
player.on('ended', function () {
|
player.on('ended', next_video);
|
||||||
next_video();
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
player.off('ended');
|
player.off('ended');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function number_with_separator(val) {
|
function get_playlist(plid) {
|
||||||
while (/(\d+)(\d{3})/.test(val.toString())) {
|
var playlist = document.getElementById('playlist');
|
||||||
val = val.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2');
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_playlist(plid, retries) {
|
playlist.innerHTML = spinnerHTMLwithHR;
|
||||||
if (retries == undefined) retries = 5;
|
|
||||||
playlist = document.getElementById('playlist');
|
|
||||||
|
|
||||||
if (retries <= 0) {
|
|
||||||
console.log('Failed to pull playlist');
|
|
||||||
playlist.innerHTML = '';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
playlist.innerHTML = ' \
|
|
||||||
<h3 style="text-align:center"><div class="loading"><i class="icon ion-ios-refresh"></i></div></h3> \
|
|
||||||
<hr>'
|
|
||||||
|
|
||||||
|
var plid_url;
|
||||||
if (plid.startsWith('RD')) {
|
if (plid.startsWith('RD')) {
|
||||||
var plid_url = '/api/v1/mixes/' + plid +
|
plid_url = '/api/v1/mixes/' + plid +
|
||||||
'?continuation=' + video_data.id +
|
'?continuation=' + video_data.id +
|
||||||
'&format=html&hl=' + video_data.preferences.locale;
|
'&format=html&hl=' + video_data.preferences.locale;
|
||||||
} else {
|
} else {
|
||||||
var plid_url = '/api/v1/playlists/' + plid +
|
plid_url = '/api/v1/playlists/' + plid +
|
||||||
'?index=' + video_data.index +
|
'?index=' + video_data.index +
|
||||||
'&continuation=' + video_data.id +
|
'&continuation=' + video_data.id +
|
||||||
'&format=html&hl=' + video_data.preferences.locale;
|
'&format=html&hl=' + video_data.preferences.locale;
|
||||||
}
|
}
|
||||||
|
|
||||||
var xhr = new XMLHttpRequest();
|
helpers.xhr('GET', plid_url, {retries: 5, entity_name: 'playlist'}, {
|
||||||
xhr.responseType = 'json';
|
on200: function (response) {
|
||||||
xhr.timeout = 10000;
|
playlist.innerHTML = response.playlistHtml;
|
||||||
xhr.open('GET', plid_url, true);
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
if (!response.nextVideo) return;
|
||||||
if (xhr.readyState == 4) {
|
|
||||||
if (xhr.status == 200) {
|
|
||||||
playlist.innerHTML = xhr.response.playlistHtml;
|
|
||||||
var nextVideo = document.getElementById(xhr.response.nextVideo);
|
|
||||||
nextVideo.parentNode.parentNode.scrollTop = nextVideo.offsetTop;
|
|
||||||
|
|
||||||
if (xhr.response.nextVideo) {
|
var nextVideo = document.getElementById(response.nextVideo);
|
||||||
player.on('ended', function () {
|
nextVideo.parentNode.parentNode.scrollTop = nextVideo.offsetTop;
|
||||||
var url = new URL('https://example.com/watch?v=' + xhr.response.nextVideo);
|
|
||||||
|
|
||||||
url.searchParams.set('list', plid);
|
player.on('ended', function () {
|
||||||
if (!plid.startsWith('RD')) {
|
var url = new URL('https://example.com/watch?v=' + response.nextVideo);
|
||||||
url.searchParams.set('index', xhr.response.index);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (video_data.params.autoplay || video_data.params.continue_autoplay) {
|
url.searchParams.set('list', plid);
|
||||||
url.searchParams.set('autoplay', '1');
|
if (!plid.startsWith('RD'))
|
||||||
}
|
url.searchParams.set('index', response.index);
|
||||||
|
if (video_data.params.autoplay || video_data.params.continue_autoplay)
|
||||||
|
url.searchParams.set('autoplay', '1');
|
||||||
|
if (video_data.params.listen !== video_data.preferences.listen)
|
||||||
|
url.searchParams.set('listen', video_data.params.listen);
|
||||||
|
if (video_data.params.speed !== video_data.preferences.speed)
|
||||||
|
url.searchParams.set('speed', video_data.params.speed);
|
||||||
|
if (video_data.params.local !== video_data.preferences.local)
|
||||||
|
url.searchParams.set('local', video_data.params.local);
|
||||||
|
|
||||||
if (video_data.params.listen !== video_data.preferences.listen) {
|
location.assign(url.pathname + url.search);
|
||||||
url.searchParams.set('listen', video_data.params.listen);
|
});
|
||||||
}
|
},
|
||||||
|
onNon200: function (xhr) {
|
||||||
if (video_data.params.speed !== video_data.preferences.speed) {
|
playlist.innerHTML = '';
|
||||||
url.searchParams.set('speed', video_data.params.speed);
|
document.getElementById('continue').style.display = '';
|
||||||
}
|
},
|
||||||
|
onError: function (xhr) {
|
||||||
if (video_data.params.local !== video_data.preferences.local) {
|
playlist.innerHTML = spinnerHTMLwithHR;
|
||||||
url.searchParams.set('local', video_data.params.local);
|
},
|
||||||
}
|
onTimeout: function (xhr) {
|
||||||
|
playlist.innerHTML = spinnerHTMLwithHR;
|
||||||
location.assign(url.pathname + url.search);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
playlist.innerHTML = '';
|
|
||||||
document.getElementById('continue').style.display = '';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
xhr.onerror = function () {
|
|
||||||
playlist = document.getElementById('playlist');
|
|
||||||
playlist.innerHTML =
|
|
||||||
'<h3 style="text-align:center"><div class="loading"><i class="icon ion-ios-refresh"></i></div></h3><hr>';
|
|
||||||
|
|
||||||
console.log('Pulling playlist timed out... ' + retries + '/5');
|
|
||||||
setTimeout(function () { get_playlist(plid, retries - 1) }, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.ontimeout = function () {
|
|
||||||
playlist = document.getElementById('playlist');
|
|
||||||
playlist.innerHTML =
|
|
||||||
'<h3 style="text-align:center"><div class="loading"><i class="icon ion-ios-refresh"></i></div></h3><hr>';
|
|
||||||
|
|
||||||
console.log('Pulling playlist timed out... ' + retries + '/5');
|
|
||||||
get_playlist(plid, retries - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.send();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_reddit_comments(retries) {
|
function get_reddit_comments() {
|
||||||
if (retries == undefined) retries = 5;
|
var comments = document.getElementById('comments');
|
||||||
comments = document.getElementById('comments');
|
|
||||||
|
|
||||||
if (retries <= 0) {
|
|
||||||
console.log('Failed to pull comments');
|
|
||||||
comments.innerHTML = '';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var fallback = comments.innerHTML;
|
var fallback = comments.innerHTML;
|
||||||
comments.innerHTML =
|
comments.innerHTML = spinnerHTML;
|
||||||
'<h3 style="text-align:center"><div class="loading"><i class="icon ion-ios-refresh"></i></div></h3>';
|
|
||||||
|
|
||||||
var url = '/api/v1/comments/' + video_data.id +
|
var url = '/api/v1/comments/' + video_data.id +
|
||||||
'?source=reddit&format=html' +
|
'?source=reddit&format=html' +
|
||||||
'&hl=' + video_data.preferences.locale;
|
'&hl=' + video_data.preferences.locale;
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('GET', url, true);
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
var onNon200 = function (xhr) { comments.innerHTML = fallback; };
|
||||||
if (xhr.readyState == 4) {
|
if (video_data.params.comments[1] === 'youtube')
|
||||||
if (xhr.status == 200) {
|
onNon200 = function (xhr) {};
|
||||||
comments.innerHTML = ' \
|
|
||||||
<div> \
|
helpers.xhr('GET', url, {retries: 5, entity_name: ''}, {
|
||||||
<h3> \
|
on200: function (response) {
|
||||||
<a href="javascript:void(0)">[ - ]</a> \
|
comments.innerHTML = ' \
|
||||||
{title} \
|
<div> \
|
||||||
</h3> \
|
<h3> \
|
||||||
<p> \
|
<a href="javascript:void(0)">[ − ]</a> \
|
||||||
<b> \
|
{title} \
|
||||||
<a href="javascript:void(0)" data-comments="youtube"> \
|
</h3> \
|
||||||
{youtubeCommentsText} \
|
<p> \
|
||||||
</a> \
|
|
||||||
</b> \
|
|
||||||
</p> \
|
|
||||||
<b> \
|
<b> \
|
||||||
<a rel="noopener" target="_blank" href="https://reddit.com{permalink}">{redditPermalinkText}</a> \
|
<a href="javascript:void(0)" data-comments="youtube"> \
|
||||||
|
{youtubeCommentsText} \
|
||||||
|
</a> \
|
||||||
</b> \
|
</b> \
|
||||||
</div> \
|
</p> \
|
||||||
<div>{contentHtml}</div> \
|
<b> \
|
||||||
<hr>'.supplant({
|
<a rel="noopener" target="_blank" href="https://reddit.com{permalink}">{redditPermalinkText}</a> \
|
||||||
title: xhr.response.title,
|
</b> \
|
||||||
youtubeCommentsText: video_data.youtube_comments_text,
|
</div> \
|
||||||
redditPermalinkText: video_data.reddit_permalink_text,
|
<div>{contentHtml}</div> \
|
||||||
permalink: xhr.response.permalink,
|
<hr>'.supplant({
|
||||||
contentHtml: xhr.response.contentHtml
|
title: response.title,
|
||||||
});
|
youtubeCommentsText: video_data.youtube_comments_text,
|
||||||
|
redditPermalinkText: video_data.reddit_permalink_text,
|
||||||
|
permalink: response.permalink,
|
||||||
|
contentHtml: response.contentHtml
|
||||||
|
});
|
||||||
|
|
||||||
comments.children[0].children[0].children[0].onclick = toggle_comments;
|
comments.children[0].children[0].children[0].onclick = toggle_comments;
|
||||||
comments.children[0].children[1].children[0].onclick = swap_comments;
|
comments.children[0].children[1].children[0].onclick = swap_comments;
|
||||||
} else {
|
},
|
||||||
if (video_data.params.comments[1] === 'youtube') {
|
onNon200: onNon200, // declared above
|
||||||
console.log('Pulling comments failed... ' + retries + '/5');
|
});
|
||||||
setTimeout(function () { get_youtube_comments(retries - 1) }, 1000);
|
|
||||||
} else {
|
|
||||||
comments.innerHTML = fallback;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.onerror = function () {
|
|
||||||
console.log('Pulling comments failed... ' + retries + '/5');
|
|
||||||
setTimeout(function () { get_reddit_comments(retries - 1) }, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.ontimeout = function () {
|
|
||||||
console.log('Pulling comments failed... ' + retries + '/5');
|
|
||||||
get_reddit_comments(retries - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.send();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_youtube_comments(retries) {
|
function get_youtube_comments() {
|
||||||
if (retries == undefined) retries = 5;
|
var comments = document.getElementById('comments');
|
||||||
comments = document.getElementById('comments');
|
|
||||||
|
|
||||||
if (retries <= 0) {
|
|
||||||
console.log('Failed to pull comments');
|
|
||||||
comments.innerHTML = '';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var fallback = comments.innerHTML;
|
var fallback = comments.innerHTML;
|
||||||
comments.innerHTML =
|
comments.innerHTML = spinnerHTML;
|
||||||
'<h3 style="text-align:center"><div class="loading"><i class="icon ion-ios-refresh"></i></div></h3>';
|
|
||||||
|
|
||||||
var url = '/api/v1/comments/' + video_data.id +
|
var url = '/api/v1/comments/' + video_data.id +
|
||||||
'?format=html' +
|
'?format=html' +
|
||||||
'&hl=' + video_data.preferences.locale +
|
'&hl=' + video_data.preferences.locale +
|
||||||
'&thin_mode=' + video_data.preferences.thin_mode;
|
'&thin_mode=' + video_data.preferences.thin_mode;
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('GET', url, true);
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
var onNon200 = function (xhr) { comments.innerHTML = fallback; };
|
||||||
if (xhr.readyState == 4) {
|
if (video_data.params.comments[1] === 'youtube')
|
||||||
if (xhr.status == 200) {
|
onNon200 = function (xhr) {};
|
||||||
comments.innerHTML = ' \
|
|
||||||
<div> \
|
|
||||||
<h3> \
|
|
||||||
<a href="javascript:void(0)">[ - ]</a> \
|
|
||||||
{commentsText} \
|
|
||||||
</h3> \
|
|
||||||
<b> \
|
|
||||||
<a href="javascript:void(0)" data-comments="reddit"> \
|
|
||||||
{redditComments} \
|
|
||||||
</a> \
|
|
||||||
</b> \
|
|
||||||
</div> \
|
|
||||||
<div>{contentHtml}</div> \
|
|
||||||
<hr>'.supplant({
|
|
||||||
contentHtml: xhr.response.contentHtml,
|
|
||||||
redditComments: video_data.reddit_comments_text,
|
|
||||||
commentsText: video_data.comments_text.supplant(
|
|
||||||
{ commentCount: number_with_separator(xhr.response.commentCount) }
|
|
||||||
)
|
|
||||||
});
|
|
||||||
|
|
||||||
comments.children[0].children[0].children[0].onclick = toggle_comments;
|
helpers.xhr('GET', url, {retries: 5, entity_name: 'comments'}, {
|
||||||
comments.children[0].children[1].children[0].onclick = swap_comments;
|
on200: function (response) {
|
||||||
} else {
|
comments.innerHTML = ' \
|
||||||
if (video_data.params.comments[1] === 'youtube') {
|
<div> \
|
||||||
setTimeout(function () { get_youtube_comments(retries - 1) }, 1000);
|
<h3> \
|
||||||
} else {
|
<a href="javascript:void(0)">[ − ]</a> \
|
||||||
comments.innerHTML = '';
|
{commentsText} \
|
||||||
}
|
</h3> \
|
||||||
}
|
<b> \
|
||||||
|
<a href="javascript:void(0)" data-comments="reddit"> \
|
||||||
|
{redditComments} \
|
||||||
|
</a> \
|
||||||
|
</b> \
|
||||||
|
</div> \
|
||||||
|
<div>{contentHtml}</div> \
|
||||||
|
<hr>'.supplant({
|
||||||
|
contentHtml: response.contentHtml,
|
||||||
|
redditComments: video_data.reddit_comments_text,
|
||||||
|
commentsText: video_data.comments_text.supplant({
|
||||||
|
// toLocaleString correctly splits number with local thousands separator. e.g.:
|
||||||
|
// '1,234,567.89' for user with English locale
|
||||||
|
// '1 234 567,89' for user with Russian locale
|
||||||
|
// '1.234.567,89' for user with Portuguese locale
|
||||||
|
commentCount: response.commentCount.toLocaleString()
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
comments.children[0].children[0].children[0].onclick = toggle_comments;
|
||||||
|
comments.children[0].children[1].children[0].onclick = swap_comments;
|
||||||
|
},
|
||||||
|
onNon200: onNon200, // declared above
|
||||||
|
onError: function (xhr) {
|
||||||
|
comments.innerHTML = spinnerHTML;
|
||||||
|
},
|
||||||
|
onTimeout: function (xhr) {
|
||||||
|
comments.innerHTML = spinnerHTML;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
xhr.onerror = function () {
|
|
||||||
comments.innerHTML =
|
|
||||||
'<h3 style="text-align:center"><div class="loading"><i class="icon ion-ios-refresh"></i></div></h3>';
|
|
||||||
console.log('Pulling comments failed... ' + retries + '/5');
|
|
||||||
setTimeout(function () { get_youtube_comments(retries - 1) }, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.ontimeout = function () {
|
|
||||||
comments.innerHTML =
|
|
||||||
'<h3 style="text-align:center"><div class="loading"><i class="icon ion-ios-refresh"></i></div></h3>';
|
|
||||||
console.log('Pulling comments failed... ' + retries + '/5');
|
|
||||||
get_youtube_comments(retries - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.send();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_youtube_replies(target, load_more, load_replies) {
|
function get_youtube_replies(target, load_more, load_replies) {
|
||||||
@@ -366,91 +268,72 @@ function get_youtube_replies(target, load_more, load_replies) {
|
|||||||
|
|
||||||
var body = target.parentNode.parentNode;
|
var body = target.parentNode.parentNode;
|
||||||
var fallback = body.innerHTML;
|
var fallback = body.innerHTML;
|
||||||
body.innerHTML =
|
body.innerHTML = spinnerHTML;
|
||||||
'<h3 style="text-align:center"><div class="loading"><i class="icon ion-ios-refresh"></i></div></h3>';
|
|
||||||
|
|
||||||
var url = '/api/v1/comments/' + video_data.id +
|
var url = '/api/v1/comments/' + video_data.id +
|
||||||
'?format=html' +
|
'?format=html' +
|
||||||
'&hl=' + video_data.preferences.locale +
|
'&hl=' + video_data.preferences.locale +
|
||||||
'&thin_mode=' + video_data.preferences.thin_mode +
|
'&thin_mode=' + video_data.preferences.thin_mode +
|
||||||
'&continuation=' + continuation
|
'&continuation=' + continuation;
|
||||||
if (load_replies) {
|
if (load_replies) url += '&action=action_get_comment_replies';
|
||||||
url += '&action=action_get_comment_replies';
|
|
||||||
}
|
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('GET', url, true);
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
helpers.xhr('GET', url, {}, {
|
||||||
if (xhr.readyState == 4) {
|
on200: function (response) {
|
||||||
if (xhr.status == 200) {
|
if (load_more) {
|
||||||
if (load_more) {
|
body = body.parentNode.parentNode;
|
||||||
body = body.parentNode.parentNode;
|
body.removeChild(body.lastElementChild);
|
||||||
body.removeChild(body.lastElementChild);
|
body.innerHTML += response.contentHtml;
|
||||||
body.innerHTML += xhr.response.contentHtml;
|
|
||||||
} else {
|
|
||||||
body.removeChild(body.lastElementChild);
|
|
||||||
|
|
||||||
var p = document.createElement('p');
|
|
||||||
var a = document.createElement('a');
|
|
||||||
p.appendChild(a);
|
|
||||||
|
|
||||||
a.href = 'javascript:void(0)';
|
|
||||||
a.onclick = hide_youtube_replies;
|
|
||||||
a.setAttribute('data-sub-text', video_data.hide_replies_text);
|
|
||||||
a.setAttribute('data-inner-text', video_data.show_replies_text);
|
|
||||||
a.innerText = video_data.hide_replies_text;
|
|
||||||
|
|
||||||
var div = document.createElement('div');
|
|
||||||
div.innerHTML = xhr.response.contentHtml;
|
|
||||||
|
|
||||||
body.appendChild(p);
|
|
||||||
body.appendChild(div);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
body.innerHTML = fallback;
|
body.removeChild(body.lastElementChild);
|
||||||
|
|
||||||
|
var p = document.createElement('p');
|
||||||
|
var a = document.createElement('a');
|
||||||
|
p.appendChild(a);
|
||||||
|
|
||||||
|
a.href = 'javascript:void(0)';
|
||||||
|
a.onclick = hide_youtube_replies;
|
||||||
|
a.setAttribute('data-sub-text', video_data.hide_replies_text);
|
||||||
|
a.setAttribute('data-inner-text', video_data.show_replies_text);
|
||||||
|
a.textContent = video_data.hide_replies_text;
|
||||||
|
|
||||||
|
var div = document.createElement('div');
|
||||||
|
div.innerHTML = response.contentHtml;
|
||||||
|
|
||||||
|
body.appendChild(p);
|
||||||
|
body.appendChild(div);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
onNon200: function (xhr) {
|
||||||
|
body.innerHTML = fallback;
|
||||||
|
},
|
||||||
|
onTimeout: function (xhr) {
|
||||||
|
console.warn('Pulling comments failed');
|
||||||
|
body.innerHTML = fallback;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
xhr.ontimeout = function () {
|
|
||||||
console.log('Pulling comments failed.');
|
|
||||||
body.innerHTML = fallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.send();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (video_data.play_next) {
|
if (video_data.play_next) {
|
||||||
player.on('ended', function () {
|
player.on('ended', function () {
|
||||||
var url = new URL('https://example.com/watch?v=' + video_data.next_video);
|
var url = new URL('https://example.com/watch?v=' + video_data.next_video);
|
||||||
|
|
||||||
if (video_data.params.autoplay || video_data.params.continue_autoplay) {
|
if (video_data.params.autoplay || video_data.params.continue_autoplay)
|
||||||
url.searchParams.set('autoplay', '1');
|
url.searchParams.set('autoplay', '1');
|
||||||
}
|
if (video_data.params.listen !== video_data.preferences.listen)
|
||||||
|
|
||||||
if (video_data.params.listen !== video_data.preferences.listen) {
|
|
||||||
url.searchParams.set('listen', video_data.params.listen);
|
url.searchParams.set('listen', video_data.params.listen);
|
||||||
}
|
if (video_data.params.speed !== video_data.preferences.speed)
|
||||||
|
|
||||||
if (video_data.params.speed !== video_data.preferences.speed) {
|
|
||||||
url.searchParams.set('speed', video_data.params.speed);
|
url.searchParams.set('speed', video_data.params.speed);
|
||||||
}
|
if (video_data.params.local !== video_data.preferences.local)
|
||||||
|
|
||||||
if (video_data.params.local !== video_data.preferences.local) {
|
|
||||||
url.searchParams.set('local', video_data.params.local);
|
url.searchParams.set('local', video_data.params.local);
|
||||||
}
|
|
||||||
|
|
||||||
url.searchParams.set('continue', '1');
|
url.searchParams.set('continue', '1');
|
||||||
|
|
||||||
location.assign(url.pathname + url.search);
|
location.assign(url.pathname + url.search);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener('load', function (e) {
|
addEventListener('load', function (e) {
|
||||||
if (video_data.plid) {
|
if (video_data.plid)
|
||||||
get_playlist(video_data.plid);
|
get_playlist(video_data.plid);
|
||||||
}
|
|
||||||
|
|
||||||
if (video_data.params.comments[0] === 'youtube') {
|
if (video_data.params.comments[0] === 'youtube') {
|
||||||
get_youtube_comments();
|
get_youtube_comments();
|
||||||
@@ -461,7 +344,7 @@ window.addEventListener('load', function (e) {
|
|||||||
} else if (video_data.params.comments[1] === 'reddit') {
|
} else if (video_data.params.comments[1] === 'reddit') {
|
||||||
get_reddit_comments();
|
get_reddit_comments();
|
||||||
} else {
|
} else {
|
||||||
comments = document.getElementById('comments');
|
var comments = document.getElementById('comments');
|
||||||
comments.innerHTML = '';
|
comments.innerHTML = '';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
var watched_data = JSON.parse(document.getElementById('watched_data').innerHTML);
|
'use strict';
|
||||||
|
var watched_data = JSON.parse(document.getElementById('watched_data').textContent);
|
||||||
|
var payload = 'csrf_token=' + watched_data.csrf_token;
|
||||||
|
|
||||||
function mark_watched(target) {
|
function mark_watched(target) {
|
||||||
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
||||||
@@ -6,45 +8,27 @@ function mark_watched(target) {
|
|||||||
|
|
||||||
var url = '/watch_ajax?action_mark_watched=1&redirect=false' +
|
var url = '/watch_ajax?action_mark_watched=1&redirect=false' +
|
||||||
'&id=' + target.getAttribute('data-id');
|
'&id=' + target.getAttribute('data-id');
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('POST', url, true);
|
|
||||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
helpers.xhr('POST', url, {payload: payload}, {
|
||||||
if (xhr.readyState == 4) {
|
onNon200: function (xhr) {
|
||||||
if (xhr.status != 200) {
|
tile.style.display = '';
|
||||||
tile.style.display = '';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
xhr.send('csrf_token=' + watched_data.csrf_token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function mark_unwatched(target) {
|
function mark_unwatched(target) {
|
||||||
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
||||||
tile.style.display = 'none';
|
tile.style.display = 'none';
|
||||||
var count = document.getElementById('count')
|
var count = document.getElementById('count');
|
||||||
count.innerText = count.innerText - 1;
|
count.textContent--;
|
||||||
|
|
||||||
var url = '/watch_ajax?action_mark_unwatched=1&redirect=false' +
|
var url = '/watch_ajax?action_mark_unwatched=1&redirect=false' +
|
||||||
'&id=' + target.getAttribute('data-id');
|
'&id=' + target.getAttribute('data-id');
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.timeout = 10000;
|
|
||||||
xhr.open('POST', url, true);
|
|
||||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function () {
|
helpers.xhr('POST', url, {payload: payload}, {
|
||||||
if (xhr.readyState == 4) {
|
onNon200: function (xhr) {
|
||||||
if (xhr.status != 200) {
|
count.textContent++;
|
||||||
count.innerText = count.innerText - 1 + 2;
|
tile.style.display = '';
|
||||||
tile.style.display = '';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
}
|
||||||
xhr.send('csrf_token=' + watched_data.csrf_token);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -349,13 +349,16 @@ feed_threads: 1
|
|||||||
## Enable/Disable the polling job that keeps the decryption
|
## Enable/Disable the polling job that keeps the decryption
|
||||||
## function (for "secured" videos) up to date.
|
## function (for "secured" videos) up to date.
|
||||||
##
|
##
|
||||||
## Note: This part of the code is currently broken, so changing
|
## Note: This part of the code generate a small amount of data every minute.
|
||||||
|
## This may not be desired if you have bandwidth limits set by your ISP.
|
||||||
|
##
|
||||||
|
## Note 2: This part of the code is currently broken, so changing
|
||||||
## this setting has no impact.
|
## this setting has no impact.
|
||||||
##
|
##
|
||||||
## Accepted values: true, false
|
## Accepted values: true, false
|
||||||
## Default: true
|
## Default: false
|
||||||
##
|
##
|
||||||
#decrypt_polling: true
|
#decrypt_polling: false
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# Using it will build an image from the locally cloned repository.
|
# Using it will build an image from the locally cloned repository.
|
||||||
#
|
#
|
||||||
# If you want to use Invidious in production, see the docker-compose.yml file provided
|
# If you want to use Invidious in production, see the docker-compose.yml file provided
|
||||||
# in the installation documentation: https://docs.invidious.io/Installation.md
|
# in the installation documentation: https://docs.invidious.io/installation/
|
||||||
|
|
||||||
version: "3"
|
version: "3"
|
||||||
services:
|
services:
|
||||||
@@ -39,7 +39,7 @@ services:
|
|||||||
- invidious-db
|
- invidious-db
|
||||||
|
|
||||||
invidious-db:
|
invidious-db:
|
||||||
image: docker.io/library/postgres:14
|
image: docker.io/library/postgres:13
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- postgresdata:/var/lib/postgresql/data
|
- postgresdata:/var/lib/postgresql/data
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM crystallang/crystal:1.2.2-alpine AS builder
|
FROM crystallang/crystal:1.4.1-alpine AS builder
|
||||||
RUN apk add --no-cache sqlite-static yaml-static
|
RUN apk add --no-cache sqlite-static yaml-static
|
||||||
|
|
||||||
ARG release
|
ARG release
|
||||||
@@ -42,7 +42,7 @@ RUN addgroup -g 1000 -S invidious && \
|
|||||||
adduser -u 1000 -S invidious -G invidious
|
adduser -u 1000 -S invidious -G invidious
|
||||||
COPY --chown=invidious ./config/config.* ./config/
|
COPY --chown=invidious ./config/config.* ./config/
|
||||||
RUN mv -n config/config.example.yml config/config.yml
|
RUN mv -n config/config.example.yml config/config.yml
|
||||||
RUN sed -i 's/host: \(127.0.0.1\|localhost\)/host: postgres/' config/config.yml
|
RUN sed -i 's/host: \(127.0.0.1\|localhost\)/host: invidious-db/' config/config.yml
|
||||||
COPY ./config/sql/ ./config/sql/
|
COPY ./config/sql/ ./config/sql/
|
||||||
COPY ./locales/ ./locales/
|
COPY ./locales/ ./locales/
|
||||||
COPY --from=builder /invidious/assets ./assets/
|
COPY --from=builder /invidious/assets ./assets/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
FROM alpine:3.15 AS builder
|
FROM alpine:3.16 AS builder
|
||||||
RUN apk add --no-cache 'crystal=1.2.2-r0' shards sqlite-static yaml-static yaml-dev libxml2-dev zlib-static openssl-libs-static openssl-dev musl-dev
|
RUN apk add --no-cache 'crystal=1.4.1-r0' shards sqlite-static yaml-static yaml-dev libxml2-dev zlib-static openssl-libs-static openssl-dev musl-dev
|
||||||
|
|
||||||
ARG release
|
ARG release
|
||||||
|
|
||||||
@@ -34,14 +34,14 @@ RUN if [ ${release} == 1 ] ; then \
|
|||||||
--link-flags "-lxml2 -llzma"; \
|
--link-flags "-lxml2 -llzma"; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
FROM alpine:3.15
|
FROM alpine:3.16
|
||||||
RUN apk add --no-cache librsvg ttf-opensans
|
RUN apk add --no-cache librsvg ttf-opensans
|
||||||
WORKDIR /invidious
|
WORKDIR /invidious
|
||||||
RUN addgroup -g 1000 -S invidious && \
|
RUN addgroup -g 1000 -S invidious && \
|
||||||
adduser -u 1000 -S invidious -G invidious
|
adduser -u 1000 -S invidious -G invidious
|
||||||
COPY --chown=invidious ./config/config.* ./config/
|
COPY --chown=invidious ./config/config.* ./config/
|
||||||
RUN mv -n config/config.example.yml config/config.yml
|
RUN mv -n config/config.example.yml config/config.yml
|
||||||
RUN sed -i 's/host: \(127.0.0.1\|localhost\)/host: postgres/' config/config.yml
|
RUN sed -i 's/host: \(127.0.0.1\|localhost\)/host: invidious-db/' config/config.yml
|
||||||
COPY ./config/sql/ ./config/sql/
|
COPY ./config/sql/ ./config/sql/
|
||||||
COPY ./locales/ ./locales/
|
COPY ./locales/ ./locales/
|
||||||
COPY --from=builder /invidious/assets ./assets/
|
COPY --from=builder /invidious/assets ./assets/
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
- name: postgresql
|
- name: postgresql
|
||||||
repository: https://kubernetes-charts.storage.googleapis.com/
|
repository: https://charts.bitnami.com/bitnami/
|
||||||
version: 8.3.0
|
version: 11.1.3
|
||||||
digest: sha256:1feec3c396cbf27573dc201831ccd3376a4a6b58b2e7618ce30a89b8f5d707fd
|
digest: sha256:79061645472b6fb342d45e8e5b3aacd018ef5067193e46a060bccdc99fe7f6e1
|
||||||
generated: "2020-02-07T13:39:38.624846+01:00"
|
generated: "2022-03-02T05:57:20.081432389+13:00"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
name: invidious
|
name: invidious
|
||||||
description: Invidious is an alternative front-end to YouTube
|
description: Invidious is an alternative front-end to YouTube
|
||||||
version: 1.1.0
|
version: 1.1.1
|
||||||
appVersion: 0.20.1
|
appVersion: 0.20.1
|
||||||
keywords:
|
keywords:
|
||||||
- youtube
|
- youtube
|
||||||
@@ -17,6 +17,6 @@ maintainers:
|
|||||||
email: mail@leonklingele.de
|
email: mail@leonklingele.de
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: postgresql
|
- name: postgresql
|
||||||
version: ~8.3.0
|
version: ~11.1.3
|
||||||
repository: "https://kubernetes-charts.storage.googleapis.com/"
|
repository: "https://charts.bitnami.com/bitnami/"
|
||||||
engine: gotpl
|
engine: gotpl
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ autoscaling:
|
|||||||
targetCPUUtilizationPercentage: 50
|
targetCPUUtilizationPercentage: 50
|
||||||
|
|
||||||
service:
|
service:
|
||||||
type: clusterIP
|
type: ClusterIP
|
||||||
port: 3000
|
port: 3000
|
||||||
#loadBalancerIP:
|
#loadBalancerIP:
|
||||||
|
|
||||||
@@ -32,14 +32,19 @@ securityContext:
|
|||||||
runAsGroup: 1000
|
runAsGroup: 1000
|
||||||
fsGroup: 1000
|
fsGroup: 1000
|
||||||
|
|
||||||
# See https://github.com/helm/charts/tree/master/stable/postgresql
|
# See https://github.com/bitnami/charts/tree/master/bitnami/postgresql
|
||||||
postgresql:
|
postgresql:
|
||||||
postgresqlUsername: kemal
|
image:
|
||||||
postgresqlPassword: kemal
|
registry: quay.io
|
||||||
postgresqlDatabase: invidious
|
auth:
|
||||||
initdbUsername: kemal
|
username: kemal
|
||||||
initdbPassword: kemal
|
password: kemal
|
||||||
initdbScriptsConfigMap: invidious-postgresql-init
|
database: invidious
|
||||||
|
primary:
|
||||||
|
initdb:
|
||||||
|
username: kemal
|
||||||
|
password: kemal
|
||||||
|
scriptsConfigMap: invidious-postgresql-init
|
||||||
|
|
||||||
# Adapted from ../config/config.yml
|
# Adapted from ../config/config.yml
|
||||||
config:
|
config:
|
||||||
|
|||||||
198
locales/ar.json
198
locales/ar.json
@@ -21,15 +21,15 @@
|
|||||||
"No": "لا",
|
"No": "لا",
|
||||||
"Import and Export Data": "اِستيراد البيانات وتصديرها",
|
"Import and Export Data": "اِستيراد البيانات وتصديرها",
|
||||||
"Import": "استيراد",
|
"Import": "استيراد",
|
||||||
"Import Invidious data": "استيراد بيانات انفيدياس",
|
"Import Invidious data": "استيراد بيانات JSON Invidious",
|
||||||
"Import YouTube subscriptions": "استيراد اشتراكات يوتيوب",
|
"Import YouTube subscriptions": "استيراد اشتراكات YouTube/OPML",
|
||||||
"Import FreeTube subscriptions (.db)": "استيراد اشتراكات فريتيوب (.db)",
|
"Import FreeTube subscriptions (.db)": "استيراد اشتراكات فريتيوب (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "استيراد اشتراكات نيو بايب (.json)",
|
"Import NewPipe subscriptions (.json)": "استيراد اشتراكات نيو بايب (.json)",
|
||||||
"Import NewPipe data (.zip)": "استيراد بيانات نيو بايب (.zip)",
|
"Import NewPipe data (.zip)": "استيراد بيانات نيو بايب (.zip)",
|
||||||
"Export": "تصدير",
|
"Export": "تصدير",
|
||||||
"Export subscriptions as OPML": "تصدير الاشتراكات كـOPML",
|
"Export subscriptions as OPML": "تصدير الاشتراكات كـOPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "تصدير الاشتراكات كـOPML (لِنيو بايب و فريتيوب)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "تصدير الاشتراكات كـOPML (لِنيو بايب و فريتيوب)",
|
||||||
"Export data as JSON": "تصدير البيانات بتنسيق JSON",
|
"Export data as JSON": "تصدير بيانات Invidious كـ JSON",
|
||||||
"Delete account?": "حذف الحساب؟",
|
"Delete account?": "حذف الحساب؟",
|
||||||
"History": "السِّجل",
|
"History": "السِّجل",
|
||||||
"An alternative front-end to YouTube": "واجهة أمامية بديلة لموقع يوتيوب",
|
"An alternative front-end to YouTube": "واجهة أمامية بديلة لموقع يوتيوب",
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
"preferences_related_videos_label": "اعرض الفيديوهات ذات الصلة: ",
|
"preferences_related_videos_label": "اعرض الفيديوهات ذات الصلة: ",
|
||||||
"preferences_annotations_label": "اعرض الملاحظات في الفيديو تلقائيا: ",
|
"preferences_annotations_label": "اعرض الملاحظات في الفيديو تلقائيا: ",
|
||||||
"preferences_extend_desc_label": "توسيع وصف الفيديو تلقائيا: ",
|
"preferences_extend_desc_label": "توسيع وصف الفيديو تلقائيا: ",
|
||||||
"preferences_vr_mode_label": "مقاطع فيديو تفاعلية ب درجة 360: ",
|
"preferences_vr_mode_label": "مقاطع فيديو تفاعلية بزاوية 360 درجة (تتطلب WebGL): ",
|
||||||
"preferences_category_visual": "التفضيلات المرئية",
|
"preferences_category_visual": "التفضيلات المرئية",
|
||||||
"preferences_player_style_label": "شكل مشغل الفيديوهات: ",
|
"preferences_player_style_label": "شكل مشغل الفيديوهات: ",
|
||||||
"Dark mode: ": "الوضع الليلي: ",
|
"Dark mode: ": "الوضع الليلي: ",
|
||||||
@@ -108,9 +108,9 @@
|
|||||||
"preferences_show_nick_label": "إظهار اللقب في الأعلى: ",
|
"preferences_show_nick_label": "إظهار اللقب في الأعلى: ",
|
||||||
"Top enabled: ": "تفعيل 'الأفضل' ؟ ",
|
"Top enabled: ": "تفعيل 'الأفضل' ؟ ",
|
||||||
"CAPTCHA enabled: ": "تفعيل الكابتشا: ",
|
"CAPTCHA enabled: ": "تفعيل الكابتشا: ",
|
||||||
"Login enabled: ": "تفعيل الولوج: ",
|
"Login enabled: ": "تمكين تسجيل الدخول: ",
|
||||||
"Registration enabled: ": "تفعيل التسجيل: ",
|
"Registration enabled: ": "تفعيل التسجيل: ",
|
||||||
"Report statistics: ": "الإبلاغ عن الإحصائيات: ",
|
"Report statistics: ": "تقرير الإحصائيات: ",
|
||||||
"Save preferences": "حفظ الإعدادات",
|
"Save preferences": "حفظ الإعدادات",
|
||||||
"Subscription manager": "مدير الاشتراكات",
|
"Subscription manager": "مدير الاشتراكات",
|
||||||
"Token manager": "إداره الرمز",
|
"Token manager": "إداره الرمز",
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
"Subscriptions": "الاشتراكات",
|
"Subscriptions": "الاشتراكات",
|
||||||
"search": "بحث",
|
"search": "بحث",
|
||||||
"Log out": "تسجيل الخروج",
|
"Log out": "تسجيل الخروج",
|
||||||
"Released under the AGPLv3 on Github.": "صدر تحت AGPLv3 على Github.",
|
"Released under the AGPLv3 on Github.": "صدر تحت AGPLv3 على GitHub.",
|
||||||
"Source available here.": "الأكواد متوفرة هنا.",
|
"Source available here.": "الأكواد متوفرة هنا.",
|
||||||
"View JavaScript license information.": "مشاهدة معلومات حول تراخيص الجافاسكريبت.",
|
"View JavaScript license information.": "مشاهدة معلومات حول تراخيص الجافاسكريبت.",
|
||||||
"View privacy policy.": "عرض سياسة الخصوصية.",
|
"View privacy policy.": "عرض سياسة الخصوصية.",
|
||||||
@@ -141,7 +141,6 @@
|
|||||||
"Show less": "عرض اقل",
|
"Show less": "عرض اقل",
|
||||||
"Watch on YouTube": "مشاهدة الفيديو على اليوتيوب",
|
"Watch on YouTube": "مشاهدة الفيديو على اليوتيوب",
|
||||||
"Switch Invidious Instance": "تبديل المثيل Invidious",
|
"Switch Invidious Instance": "تبديل المثيل Invidious",
|
||||||
"Broken? Try another Invidious Instance": "معطل؟ جرب مثيل Invidious آخر",
|
|
||||||
"Hide annotations": "إخفاء الملاحظات في الفيديو",
|
"Hide annotations": "إخفاء الملاحظات في الفيديو",
|
||||||
"Show annotations": "عرض الملاحظات في الفيديو",
|
"Show annotations": "عرض الملاحظات في الفيديو",
|
||||||
"Genre: ": "النوع: ",
|
"Genre: ": "النوع: ",
|
||||||
@@ -175,7 +174,7 @@
|
|||||||
"User ID is a required field": "مكان اسم المستخدم مطلوب",
|
"User ID is a required field": "مكان اسم المستخدم مطلوب",
|
||||||
"Password is a required field": "مكان كلمة السر مطلوب",
|
"Password is a required field": "مكان كلمة السر مطلوب",
|
||||||
"Wrong username or password": "اسم المستخدم او كلمة السر غير صحيح",
|
"Wrong username or password": "اسم المستخدم او كلمة السر غير صحيح",
|
||||||
"Please sign in using 'Log in with Google'": "الرجاء تسجيل الدخول 'تسجيل الدخول بواسطة جوجل'",
|
"Please sign in using 'Log in with Google'": "الرجاء تسجيل الدخول باستخدام \"تسجيل الدخول باستخدام Google\"",
|
||||||
"Password cannot be empty": "لا يمكن أن تكون كلمة السر فارغة",
|
"Password cannot be empty": "لا يمكن أن تكون كلمة السر فارغة",
|
||||||
"Password cannot be longer than 55 characters": "يجب أن لا تتعدى كلمة السر 55 حرفًا",
|
"Password cannot be longer than 55 characters": "يجب أن لا تتعدى كلمة السر 55 حرفًا",
|
||||||
"Please log in": "الرجاء تسجيل الدخول",
|
"Please log in": "الرجاء تسجيل الدخول",
|
||||||
@@ -187,7 +186,7 @@
|
|||||||
"Could not fetch comments": "لم يتمكن من إحضار التعليقات",
|
"Could not fetch comments": "لم يتمكن من إحضار التعليقات",
|
||||||
"`x` ago": "`x` منذ",
|
"`x` ago": "`x` منذ",
|
||||||
"Load more": "عرض المزيد",
|
"Load more": "عرض المزيد",
|
||||||
"Could not create mix.": "لم يستطع عمل خلط.",
|
"Could not create mix.": "تعذر إنشاء مزيج.",
|
||||||
"Empty playlist": "قائمة التشغيل فارغة",
|
"Empty playlist": "قائمة التشغيل فارغة",
|
||||||
"Not a playlist.": "قائمة التشغيل غير صالحة.",
|
"Not a playlist.": "قائمة التشغيل غير صالحة.",
|
||||||
"Playlist does not exist.": "قائمة التشغيل غير موجودة.",
|
"Playlist does not exist.": "قائمة التشغيل غير موجودة.",
|
||||||
@@ -195,7 +194,7 @@
|
|||||||
"Hidden field \"challenge\" is a required field": "مكان مخفي \"تحدي\" مكان مطلوب",
|
"Hidden field \"challenge\" is a required field": "مكان مخفي \"تحدي\" مكان مطلوب",
|
||||||
"Hidden field \"token\" is a required field": "مكان مخفي \"رمز\" مكان مطلوب",
|
"Hidden field \"token\" is a required field": "مكان مخفي \"رمز\" مكان مطلوب",
|
||||||
"Erroneous challenge": "تحدي غير صالح",
|
"Erroneous challenge": "تحدي غير صالح",
|
||||||
"Erroneous token": "روز غير صالح",
|
"Erroneous token": "رمز مميز خاطئ",
|
||||||
"No such user": "مستخدم غير صالح",
|
"No such user": "مستخدم غير صالح",
|
||||||
"Token is expired, please try again": "الرمز منتهى الصلاحية، الرجاء المحاولة مرة اخرى",
|
"Token is expired, please try again": "الرمز منتهى الصلاحية، الرجاء المحاولة مرة اخرى",
|
||||||
"English": "إنجليزي",
|
"English": "إنجليزي",
|
||||||
@@ -329,48 +328,47 @@
|
|||||||
"Videos": "الفيديوهات",
|
"Videos": "الفيديوهات",
|
||||||
"Playlists": "قوائم التشغيل",
|
"Playlists": "قوائم التشغيل",
|
||||||
"Community": "المجتمع",
|
"Community": "المجتمع",
|
||||||
"relevance": "ملاؤم",
|
"search_filters_sort_option_relevance": "ملاؤم",
|
||||||
"rating": "تقييم",
|
"search_filters_sort_option_rating": "تقييم",
|
||||||
"date": "التاريخ",
|
"search_filters_sort_option_date": "التاريخ",
|
||||||
"views": "مشاهدات",
|
"search_filters_sort_option_views": "مشاهدات",
|
||||||
"content_type": "نوع المحتوى",
|
"search_filters_type_label": "نوع المحتوى",
|
||||||
"duration": "المدة الزمنية",
|
"search_filters_duration_label": "المدة الزمنية",
|
||||||
"features": "الميزات",
|
"search_filters_features_label": "الميزات",
|
||||||
"sort": "فرز",
|
"search_filters_sort_label": "فرز",
|
||||||
"hour": "ساعة",
|
"search_filters_date_option_hour": "آخر ساعة",
|
||||||
"today": "اليوم",
|
"search_filters_date_option_today": "اليوم",
|
||||||
"week": "هذا الأسبوع",
|
"search_filters_date_option_week": "هذا الأسبوع",
|
||||||
"month": "هذا الشهر",
|
"search_filters_date_option_month": "هذا الشهر",
|
||||||
"year": "هذه السنة",
|
"search_filters_date_option_year": "هذه السنة",
|
||||||
"video": "فيديو",
|
"search_filters_type_option_video": "فيديو",
|
||||||
"channel": "قناة",
|
"search_filters_type_option_channel": "قناة",
|
||||||
"playlist": "قائمة التشغيل",
|
"search_filters_type_option_playlist": "قائمة التشغيل",
|
||||||
"movie": "فيلم",
|
"search_filters_type_option_movie": "فيلم",
|
||||||
"show": "عرض",
|
"search_filters_type_option_show": "عرض",
|
||||||
"hd": "عالية الدقة",
|
"search_filters_features_option_hd": "عالية الدقة",
|
||||||
"subtitles": "ترجمات",
|
"search_filters_features_option_subtitles": "ترجمات",
|
||||||
"creative_commons": "المشاع الإبداعي",
|
"search_filters_features_option_c_commons": "المشاع الإبداعي",
|
||||||
"3d": "ثلاثي الأبعاد",
|
"search_filters_features_option_three_d": "ثلاثي الأبعاد",
|
||||||
"live": "مباشر",
|
"search_filters_features_option_live": "مباشر",
|
||||||
"4k": "4k",
|
"search_filters_features_option_four_k": "4k",
|
||||||
"location": "الأماكن",
|
"search_filters_features_option_location": "الأماكن",
|
||||||
"hdr": "وضع التباين العالي",
|
"search_filters_features_option_hdr": "وضع التباين العالي",
|
||||||
"filter": "معامل الفرز",
|
|
||||||
"Current version: ": "الإصدار الحالي: ",
|
"Current version: ": "الإصدار الحالي: ",
|
||||||
"next_steps_error_message": "بعد ذلك يجب أن تحاول: ",
|
"next_steps_error_message": "بعد ذلك يجب أن تحاول: ",
|
||||||
"next_steps_error_message_refresh": "تحديث",
|
"next_steps_error_message_refresh": "تحديث",
|
||||||
"next_steps_error_message_go_to_youtube": "انتقل إلى يوتيوب",
|
"next_steps_error_message_go_to_youtube": "انتقل إلى يوتيوب",
|
||||||
"short": "قصير (< 4 دقائق)",
|
"search_filters_duration_option_short": "قصير (< 4 دقائق)",
|
||||||
"long": "طويل (> 20 دقيقة)",
|
"search_filters_duration_option_long": "طويل (> 20 دقيقة)",
|
||||||
"footer_source_code": "شفرة المصدر",
|
"footer_source_code": "شفرة المصدر",
|
||||||
"footer_original_source_code": "شفرة المصدر الأصلية",
|
"footer_original_source_code": "كود المصدر الأصلي",
|
||||||
"footer_modfied_source_code": "شفرة المصدر المعدلة",
|
"footer_modfied_source_code": "شفرة المصدر المعدلة",
|
||||||
"adminprefs_modified_source_code_url_label": "URL إلى مستودع التعليمات البرمجية المصدرية المعدلة",
|
"adminprefs_modified_source_code_url_label": "URL إلى مستودع التعليمات البرمجية المصدرية المعدلة",
|
||||||
"footer_documentation": "التوثيق",
|
"footer_documentation": "التوثيق",
|
||||||
"footer_donate_page": "تبرّع",
|
"footer_donate_page": "تبرّع",
|
||||||
"preferences_region_label": "بلد المحتوى: ",
|
"preferences_region_label": "بلد المحتوى: ",
|
||||||
"preferences_quality_dash_label": "جودة فيديو DASH المفضلة: ",
|
"preferences_quality_dash_label": "جودة فيديو DASH المفضلة: ",
|
||||||
"preferences_quality_option_dash": "DASH (جودة تكييفية)",
|
"preferences_quality_option_dash": "DASH (الجودة التلقائية)",
|
||||||
"preferences_quality_option_hd720": "HD720",
|
"preferences_quality_option_hd720": "HD720",
|
||||||
"preferences_quality_option_medium": "متوسطة",
|
"preferences_quality_option_medium": "متوسطة",
|
||||||
"preferences_quality_option_small": "صغيرة",
|
"preferences_quality_option_small": "صغيرة",
|
||||||
@@ -386,7 +384,7 @@
|
|||||||
"preferences_quality_dash_option_360p": "360p",
|
"preferences_quality_dash_option_360p": "360p",
|
||||||
"preferences_quality_dash_option_240p": "240p",
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
"preferences_quality_dash_option_144p": "144p",
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
"purchased": "تم شراؤها",
|
"search_filters_features_option_purchased": "تم شراؤها",
|
||||||
"none": "لاشيء",
|
"none": "لاشيء",
|
||||||
"videoinfo_started_streaming_x_ago": "بدأ البث منذ `x`",
|
"videoinfo_started_streaming_x_ago": "بدأ البث منذ `x`",
|
||||||
"videoinfo_watch_on_youTube": "مشاهدة على يوتيوب",
|
"videoinfo_watch_on_youTube": "مشاهدة على يوتيوب",
|
||||||
@@ -395,10 +393,10 @@
|
|||||||
"user_created_playlists": "'x' إنشاء قوائم التشغيل",
|
"user_created_playlists": "'x' إنشاء قوائم التشغيل",
|
||||||
"user_saved_playlists": "قوائم التشغيل المحفوظة 'x'",
|
"user_saved_playlists": "قوائم التشغيل المحفوظة 'x'",
|
||||||
"Video unavailable": "الفيديو غير متوفر",
|
"Video unavailable": "الفيديو غير متوفر",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"download_subtitles": "ترجمات - 'x' (.vtt)",
|
"download_subtitles": "ترجمات - 'x' (.vtt)",
|
||||||
"invidious": "الخيالي",
|
"invidious": "الخيالي",
|
||||||
"preferences_save_player_pos_label": "احفظ وقت الفيديو الحالي: ",
|
"preferences_save_player_pos_label": "حفظ موضع التشغيل: ",
|
||||||
"crash_page_you_found_a_bug": "يبدو أنك قد وجدت خطأً برمجيًّا في Invidious!",
|
"crash_page_you_found_a_bug": "يبدو أنك قد وجدت خطأً برمجيًّا في Invidious!",
|
||||||
"generic_videos_count_0": "لا فيديوهات",
|
"generic_videos_count_0": "لا فيديوهات",
|
||||||
"generic_videos_count_1": "فيديو واحد",
|
"generic_videos_count_1": "فيديو واحد",
|
||||||
@@ -429,5 +427,113 @@
|
|||||||
"generic_playlists_count_2": "قائمتا تشغيل",
|
"generic_playlists_count_2": "قائمتا تشغيل",
|
||||||
"generic_playlists_count_3": "{{count}} قوائم تشغيل",
|
"generic_playlists_count_3": "{{count}} قوائم تشغيل",
|
||||||
"generic_playlists_count_4": "{{count}} قائمة تشغيل",
|
"generic_playlists_count_4": "{{count}} قائمة تشغيل",
|
||||||
"generic_playlists_count_5": "{{count}} قائمة تشغيل"
|
"generic_playlists_count_5": "{{count}} قائمة تشغيل",
|
||||||
|
"English (United States)": "الإنجليزية (الولايات المتحدة)",
|
||||||
|
"Indonesian (auto-generated)": "إندونيسي (مُنشأ تلقائيًا)",
|
||||||
|
"Interlingue": "إنترلينغوي",
|
||||||
|
"Italian (auto-generated)": "الإيطالية (مُنشأة تلقائيًا)",
|
||||||
|
"Spanish (auto-generated)": "الأسبانية (تم إنشاؤه تلقائيًا)",
|
||||||
|
"crash_page_before_reporting": "قبل الإبلاغ عن خطأ، تأكد من وجود:",
|
||||||
|
"French (auto-generated)": "الفرنسية (مُنشأة تلقائيًا)",
|
||||||
|
"Portuguese (auto-generated)": "البرتغالية (تم إنشاؤه تلقائيًا)",
|
||||||
|
"Turkish (auto-generated)": "التركية (تم إنشاؤها تلقائيًا)",
|
||||||
|
"crash_page_refresh": "حاول <a href=\"`x`\"> تحديث الصفحة </a>",
|
||||||
|
"crash_page_switch_instance": "حاول <a href=\"`x`\"> استخدام مثيل آخر </a>",
|
||||||
|
"Korean (auto-generated)": "كوري (تم إنشاؤه تلقائيًا)",
|
||||||
|
"Spanish (Mexico)": "الإسبانية (المكسيك)",
|
||||||
|
"Vietnamese (auto-generated)": "فيتنامي (تم إنشاؤه تلقائيًا)",
|
||||||
|
"crash_page_report_issue": "إذا لم يساعد أي مما سبق، يرجى فتح <a href=\"`x`\"> مشكلة جديدة على GitHub </a> (ويفضل أن يكون باللغة الإنجليزية) وتضمين النص التالي في رسالتك (لا تترجم هذا النص):",
|
||||||
|
"crash_page_read_the_faq": "قراءة <a href=\"`x`\"> الأسئلة المتكررة (الأسئلة الشائعة) </a>",
|
||||||
|
"preferences_watch_history_label": "تمكين سجل المشاهدة: ",
|
||||||
|
"English (United Kingdom)": "الإنجليزية (المملكة المتحدة)",
|
||||||
|
"Cantonese (Hong Kong)": "الكانتونية (هونغ كونغ)",
|
||||||
|
"Chinese": "الصينية",
|
||||||
|
"Chinese (China)": "الصينية (الصين)",
|
||||||
|
"Chinese (Hong Kong)": "الصينية (هونج كونج)",
|
||||||
|
"Chinese (Taiwan)": "الصينية (تايوان)",
|
||||||
|
"Dutch (auto-generated)": "هولندي (تم إنشاؤه تلقائيًا)",
|
||||||
|
"German (auto-generated)": "ألماني (تم إنشاؤه تلقائيًا)",
|
||||||
|
"Japanese (auto-generated)": "اليابانية (مُنشأة تلقائيًا)",
|
||||||
|
"Portuguese (Brazil)": "البرتغالية (البرازيل)",
|
||||||
|
"Russian (auto-generated)": "الروسية (منشأة تلقائيا)",
|
||||||
|
"Spanish (Spain)": "الإسبانية (إسبانيا)",
|
||||||
|
"crash_page_search_issue": "بحثت عن <a href=\"`x`\"> المشكلات الموجودة على GitHub </a>",
|
||||||
|
"search_filters_title": "معامل الفرز",
|
||||||
|
"search_message_no_results": "لا توجد نتائج.",
|
||||||
|
"search_message_change_filters_or_query": "حاول توسيع استعلام البحث و / أو تغيير عوامل التصفية.",
|
||||||
|
"search_filters_date_label": "تاريخ الرفع",
|
||||||
|
"generic_count_weeks_0": "{{count}} أسبوع",
|
||||||
|
"generic_count_weeks_1": "{{count}} أسبوع",
|
||||||
|
"generic_count_weeks_2": "{{count}} أسبوع",
|
||||||
|
"generic_count_weeks_3": "{{count}} أسبوع",
|
||||||
|
"generic_count_weeks_4": "{{count}} أسابيع",
|
||||||
|
"generic_count_weeks_5": "{{count}} أسبوع",
|
||||||
|
"Popular enabled: ": "تم تمكين الشعبية: ",
|
||||||
|
"search_filters_duration_option_medium": "متوسط (4-20 دقيقة)",
|
||||||
|
"search_filters_date_option_none": "أي تاريخ",
|
||||||
|
"search_filters_type_option_all": "أي نوع",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"generic_count_minutes_0": "{{count}} دقيقة",
|
||||||
|
"generic_count_minutes_1": "{{count}} دقيقة",
|
||||||
|
"generic_count_minutes_2": "{{count}} دقيقة",
|
||||||
|
"generic_count_minutes_3": "{{count}} دقيقة",
|
||||||
|
"generic_count_minutes_4": "{{count}} دقائق",
|
||||||
|
"generic_count_minutes_5": "{{count}} دقيقة",
|
||||||
|
"generic_count_hours_0": "{{count}} ساعة",
|
||||||
|
"generic_count_hours_1": "{{count}} ساعة",
|
||||||
|
"generic_count_hours_2": "{{count}} ساعة",
|
||||||
|
"generic_count_hours_3": "{{count}} ساعة",
|
||||||
|
"generic_count_hours_4": "{{count}} ساعات",
|
||||||
|
"generic_count_hours_5": "{{count}} ساعة",
|
||||||
|
"comments_view_x_replies_0": "عرض رد {{count}}",
|
||||||
|
"comments_view_x_replies_1": "عرض رد {{count}}",
|
||||||
|
"comments_view_x_replies_2": "عرض رد {{count}}",
|
||||||
|
"comments_view_x_replies_3": "عرض رد {{count}}",
|
||||||
|
"comments_view_x_replies_4": "عرض الردود {{count}}",
|
||||||
|
"comments_view_x_replies_5": "عرض رد {{count}}",
|
||||||
|
"search_message_use_another_instance": " يمكنك أيضًا البحث عن <a href=\"`x`\"> في مثيل آخر </a>.",
|
||||||
|
"comments_points_count_0": "{{count}} نقطة",
|
||||||
|
"comments_points_count_1": "{{count}} نقطة",
|
||||||
|
"comments_points_count_2": "{{count}} نقطة",
|
||||||
|
"comments_points_count_3": "{{count}} نقطة",
|
||||||
|
"comments_points_count_4": "{{count}} نقاط",
|
||||||
|
"comments_points_count_5": "{{count}} نقطة",
|
||||||
|
"generic_count_years_0": "{{count}} السنة",
|
||||||
|
"generic_count_years_1": "{{count}} السنة",
|
||||||
|
"generic_count_years_2": "{{count}} السنة",
|
||||||
|
"generic_count_years_3": "{{count}} السنة",
|
||||||
|
"generic_count_years_4": "{{count}} سنوات",
|
||||||
|
"generic_count_years_5": "{{count}} السنة",
|
||||||
|
"tokens_count_0": "الرمز المميز {{count}}",
|
||||||
|
"tokens_count_1": "الرمز المميز {{count}}",
|
||||||
|
"tokens_count_2": "الرمز المميز {{count}}",
|
||||||
|
"tokens_count_3": "الرمز المميز {{count}}",
|
||||||
|
"tokens_count_4": "الرموز المميزة {{count}}",
|
||||||
|
"tokens_count_5": "الرمز المميز {{count}}",
|
||||||
|
"search_filters_apply_button": "تطبيق الفلاتر المحددة",
|
||||||
|
"search_filters_duration_option_none": "أي مدة",
|
||||||
|
"subscriptions_unseen_notifs_count_0": "{{count}} إشعار غير مرئي",
|
||||||
|
"subscriptions_unseen_notifs_count_1": "{{count}} إشعار غير مرئي",
|
||||||
|
"subscriptions_unseen_notifs_count_2": "{{count}} إشعار غير مرئي",
|
||||||
|
"subscriptions_unseen_notifs_count_3": "{{count}} إشعار غير مرئي",
|
||||||
|
"subscriptions_unseen_notifs_count_4": "{{count}} إشعارات غير مرئية",
|
||||||
|
"subscriptions_unseen_notifs_count_5": "{{count}} إشعار غير مرئي",
|
||||||
|
"generic_count_days_0": "{{count}} يوم",
|
||||||
|
"generic_count_days_1": "{{count}} يوم",
|
||||||
|
"generic_count_days_2": "{{count}} يوم",
|
||||||
|
"generic_count_days_3": "{{count}} يوم",
|
||||||
|
"generic_count_days_4": "{{count}} أيام",
|
||||||
|
"generic_count_days_5": "{{count}} يوم",
|
||||||
|
"generic_count_months_0": "{{count}} شهر",
|
||||||
|
"generic_count_months_1": "{{count}} شهر",
|
||||||
|
"generic_count_months_2": "{{count}} شهر",
|
||||||
|
"generic_count_months_3": "{{count}} شهر",
|
||||||
|
"generic_count_months_4": "{{count}} شهور",
|
||||||
|
"generic_count_months_5": "{{count}} شهر",
|
||||||
|
"generic_count_seconds_0": "{{count}} ثانية",
|
||||||
|
"generic_count_seconds_1": "{{count}} ثانية",
|
||||||
|
"generic_count_seconds_2": "{{count}} ثانية",
|
||||||
|
"generic_count_seconds_3": "{{count}} ثانية",
|
||||||
|
"generic_count_seconds_4": "{{count}} ثوانٍ",
|
||||||
|
"generic_count_seconds_5": "{{count}} ثانية"
|
||||||
}
|
}
|
||||||
|
|||||||
97
locales/bn.json
Normal file
97
locales/bn.json
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
{
|
||||||
|
"Subscribe": "সাবস্ক্রাইব",
|
||||||
|
"View channel on YouTube": "ইউটিউবে চ্যানেল দেখুন",
|
||||||
|
"View playlist on YouTube": "ইউটিউবে প্লেলিস্ট দেখুন",
|
||||||
|
"newest": "সর্ব-নতুন",
|
||||||
|
"oldest": "পুরানতম",
|
||||||
|
"popular": "জনপ্রিয়",
|
||||||
|
"last": "শেষটা",
|
||||||
|
"Next page": "পরের পৃষ্ঠা",
|
||||||
|
"Previous page": "আগের পৃষ্ঠা",
|
||||||
|
"Clear watch history?": "দেখার ইতিহাস সাফ করবেন?",
|
||||||
|
"New password": "নতুন পাসওয়ার্ড",
|
||||||
|
"New passwords must match": "নতুন পাসওয়ার্ড অবশ্যই মিলতে হবে",
|
||||||
|
"Cannot change password for Google accounts": "গুগল অ্যাকাউন্টগুলোর জন্য পাসওয়ার্ড পরিবর্তন করা যায় না",
|
||||||
|
"Authorize token?": "টোকেন অনুমোদন করবেন?",
|
||||||
|
"Authorize token for `x`?": "`x` -এর জন্য টোকেন অনুমোদন?",
|
||||||
|
"Yes": "হ্যাঁ",
|
||||||
|
"No": "না",
|
||||||
|
"Import and Export Data": "তথ্য আমদানি ও রপ্তানি",
|
||||||
|
"Import": "আমদানি",
|
||||||
|
"Import Invidious data": "ইনভিডিয়াস তথ্য আমদানি",
|
||||||
|
"Import YouTube subscriptions": "ইউটিউব সাবস্ক্রিপশন আনুন",
|
||||||
|
"Import FreeTube subscriptions (.db)": "ফ্রিটিউব সাবস্ক্রিপশন (.db) আনুন",
|
||||||
|
"Import NewPipe subscriptions (.json)": "নতুন পাইপ সাবস্ক্রিপশন আনুন (.json)",
|
||||||
|
"Import NewPipe data (.zip)": "নিউপাইপ তথ্য আনুন (.zip)",
|
||||||
|
"Export": "তথ্য বের করুন",
|
||||||
|
"Export subscriptions as OPML": "সাবস্ক্রিপশন OPML হিসাবে আনুন",
|
||||||
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "OPML-এ সাবস্ক্রিপশন বের করুন(নিউ পাইপ এবং ফ্রিউটিউব এর জন্য)",
|
||||||
|
"Export data as JSON": "JSON হিসাবে তথ্য বের করুন",
|
||||||
|
"Delete account?": "অ্যাকাউন্ট মুছে ফেলবেন?",
|
||||||
|
"History": "ইতিহাস",
|
||||||
|
"An alternative front-end to YouTube": "ইউটিউবের একটি বিকল্পস্বরূপ সম্মুখ-প্রান্ত",
|
||||||
|
"JavaScript license information": "জাভাস্ক্রিপ্ট লাইসেন্সের তথ্য",
|
||||||
|
"source": "সূত্র",
|
||||||
|
"Log in": "লগ ইন",
|
||||||
|
"Log in/register": "লগ ইন/রেজিস্টার",
|
||||||
|
"Log in with Google": "গুগল দিয়ে লগ ইন করুন",
|
||||||
|
"User ID": "ইউজার আইডি",
|
||||||
|
"Password": "পাসওয়ার্ড",
|
||||||
|
"Time (h:mm:ss):": "সময় (ঘণ্টা:মিনিট:সেকেন্ড):",
|
||||||
|
"Text CAPTCHA": "টেক্সট ক্যাপচা",
|
||||||
|
"Image CAPTCHA": "চিত্র ক্যাপচা",
|
||||||
|
"Sign In": "সাইন ইন",
|
||||||
|
"Register": "নিবন্ধন",
|
||||||
|
"E-mail": "ই-মেইল",
|
||||||
|
"Google verification code": "গুগল যাচাইকরণ কোড",
|
||||||
|
"Preferences": "পছন্দসমূহ",
|
||||||
|
"preferences_category_player": "প্লেয়ারের পছন্দসমূহ",
|
||||||
|
"preferences_video_loop_label": "সর্বদা লুপ: ",
|
||||||
|
"preferences_autoplay_label": "স্বয়ংক্রিয় চালু: ",
|
||||||
|
"preferences_continue_label": "ডিফল্টভাবে পরবর্তী চালাও: ",
|
||||||
|
"preferences_continue_autoplay_label": "পরবর্তী ভিডিও স্বয়ংক্রিয়ভাবে চালাও: ",
|
||||||
|
"preferences_listen_label": "সহজাতভাবে শোনো: ",
|
||||||
|
"preferences_local_label": "ভিডিও প্রক্সি করো: ",
|
||||||
|
"preferences_speed_label": "সহজাত গতি: ",
|
||||||
|
"preferences_quality_label": "পছন্দের ভিডিও মান: ",
|
||||||
|
"preferences_volume_label": "প্লেয়ার শব্দের মাত্রা: ",
|
||||||
|
"LIVE": "লাইভ",
|
||||||
|
"Shared `x` ago": "`x` আগে শেয়ার করা হয়েছে",
|
||||||
|
"Unsubscribe": "আনসাবস্ক্রাইব",
|
||||||
|
"generic_views_count": "{{count}}জন দেখেছে",
|
||||||
|
"generic_views_count_plural": "{{count}}জন দেখেছে",
|
||||||
|
"generic_videos_count": "{{count}}টি ভিডিও",
|
||||||
|
"generic_videos_count_plural": "{{count}}টি ভিডিও",
|
||||||
|
"generic_subscribers_count": "{{count}}জন অনুসরণকারী",
|
||||||
|
"generic_subscribers_count_plural": "{{count}}জন অনুসরণকারী",
|
||||||
|
"preferences_watch_history_label": "দেখার ইতিহাস চালু করো: ",
|
||||||
|
"preferences_quality_option_dash": "ড্যাশ (সময়োপযোগী মান)",
|
||||||
|
"preferences_quality_dash_option_auto": "স্বয়ংক্রিয়",
|
||||||
|
"preferences_quality_dash_option_best": "সেরা",
|
||||||
|
"preferences_quality_dash_option_worst": "মন্দতম",
|
||||||
|
"preferences_quality_dash_option_4320p": "৪৩২০পি",
|
||||||
|
"preferences_quality_dash_option_2160p": "২১৬০পি",
|
||||||
|
"preferences_quality_dash_option_1440p": "১৪৪০পি",
|
||||||
|
"preferences_quality_dash_option_480p": "৪৮০পি",
|
||||||
|
"preferences_quality_dash_option_360p": "৩৬০পি",
|
||||||
|
"preferences_quality_dash_option_240p": "২৪০পি",
|
||||||
|
"preferences_quality_dash_option_144p": "১৪৪পি",
|
||||||
|
"preferences_comments_label": "সহজাত মন্তব্য: ",
|
||||||
|
"youtube": "ইউটিউব",
|
||||||
|
"Fallback captions: ": "বিকল্প উপাখ্যান: ",
|
||||||
|
"preferences_related_videos_label": "সম্পর্কিত ভিডিও দেখাও: ",
|
||||||
|
"preferences_annotations_label": "সহজাতভাবে টীকা দেখাও ",
|
||||||
|
"preferences_quality_option_hd720": "উচ্চ৭২০",
|
||||||
|
"preferences_quality_dash_label": "পছন্দের ড্যাশ ভিডিও মান: ",
|
||||||
|
"preferences_captions_label": "সহজাত উপাখ্যান: ",
|
||||||
|
"generic_playlists_count": "{{count}}টি চালুতালিকা",
|
||||||
|
"generic_playlists_count_plural": "{{count}}টি চালুতালিকা",
|
||||||
|
"reddit": "রেডিট",
|
||||||
|
"invidious": "ইনভিডিয়াস",
|
||||||
|
"generic_subscriptions_count": "{{count}}টি অনুসরণ",
|
||||||
|
"generic_subscriptions_count_plural": "{{count}}টি অনুসরণ",
|
||||||
|
"preferences_quality_option_medium": "মধ্যম",
|
||||||
|
"preferences_quality_option_small": "ছোট",
|
||||||
|
"preferences_quality_dash_option_1080p": "১০৮০পি",
|
||||||
|
"preferences_quality_dash_option_720p": "৭২০পি"
|
||||||
|
}
|
||||||
@@ -52,16 +52,16 @@
|
|||||||
"Download": "Descarrega",
|
"Download": "Descarrega",
|
||||||
"Download as: ": "Descarrega com: ",
|
"Download as: ": "Descarrega com: ",
|
||||||
"Videos": "Vídeos",
|
"Videos": "Vídeos",
|
||||||
"content_type": "Tipus",
|
"search_filters_type_label": "Tipus",
|
||||||
"duration": "Duració",
|
"search_filters_duration_label": "Duració",
|
||||||
"sort": "Ordena per",
|
"search_filters_sort_label": "Ordena per",
|
||||||
"week": "Aquesta setmana",
|
"search_filters_date_option_week": "Aquesta setmana",
|
||||||
"month": "Aquest mes",
|
"search_filters_date_option_month": "Aquest mes",
|
||||||
"year": "Aquest any",
|
"search_filters_date_option_year": "Aquest any",
|
||||||
"video": "Vídeo",
|
"search_filters_type_option_video": "Vídeo",
|
||||||
"channel": "Canal",
|
"search_filters_type_option_channel": "Canal",
|
||||||
"short": "Curt (< 4 minuts)",
|
"search_filters_duration_option_short": "Curt (< 4 minuts)",
|
||||||
"long": "Llarg (> 20 minuts)",
|
"search_filters_duration_option_long": "Llarg (> 20 minuts)",
|
||||||
"Current version: ": "Versió actual: ",
|
"Current version: ": "Versió actual: ",
|
||||||
"Malay": "Malai",
|
"Malay": "Malai",
|
||||||
"Persian": "Persa",
|
"Persian": "Persa",
|
||||||
@@ -93,11 +93,11 @@
|
|||||||
"Spanish": "Castellà",
|
"Spanish": "Castellà",
|
||||||
"Vietnamese": "Vietnamita",
|
"Vietnamese": "Vietnamita",
|
||||||
"News": "Notícies",
|
"News": "Notícies",
|
||||||
"show": "Mostra",
|
"search_filters_type_option_show": "Mostra",
|
||||||
"footer_documentation": "Documentació",
|
"footer_documentation": "Documentació",
|
||||||
"Thai": "Tailandès",
|
"Thai": "Tailandès",
|
||||||
"Music": "Música",
|
"Music": "Música",
|
||||||
"relevance": "Rellevància",
|
"search_filters_sort_option_relevance": "Rellevància",
|
||||||
"hour": "Última hora",
|
"search_filters_date_option_hour": "Última hora",
|
||||||
"today": "Avui"
|
"search_filters_date_option_today": "Avui"
|
||||||
}
|
}
|
||||||
|
|||||||
301
locales/cs.json
301
locales/cs.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"LIVE": "ŽIVĚ",
|
"LIVE": "ŽIVĚ",
|
||||||
"Shared `x` ago": "Sdíleno před `x`",
|
"Shared `x` ago": "Zveřejněno před `x`",
|
||||||
"Unsubscribe": "Odhlásit odběr",
|
"Unsubscribe": "Odhlásit odběr",
|
||||||
"Subscribe": "Odebírat",
|
"Subscribe": "Odebírat",
|
||||||
"View channel on YouTube": "Otevřít kanál na YouTube",
|
"View channel on YouTube": "Otevřít kanál na YouTube",
|
||||||
@@ -19,17 +19,17 @@
|
|||||||
"Authorize token for `x`?": "Autorizovat token pro `x`?",
|
"Authorize token for `x`?": "Autorizovat token pro `x`?",
|
||||||
"Yes": "Ano",
|
"Yes": "Ano",
|
||||||
"No": "Ne",
|
"No": "Ne",
|
||||||
"Import and Export Data": "Import a Export údajů",
|
"Import and Export Data": "Import a export dat",
|
||||||
"Import": "Inport",
|
"Import": "Importovat",
|
||||||
"Import Invidious data": "Importovat údaje Invidious",
|
"Import Invidious data": "Importovat JSON údaje Invidious",
|
||||||
"Import YouTube subscriptions": "Importovat odběry z YouTube",
|
"Import YouTube subscriptions": "Importovat odběry z YouTube/OPML",
|
||||||
"Import FreeTube subscriptions (.db)": "Importovat odběry z FreeTube (.db)",
|
"Import FreeTube subscriptions (.db)": "Importovat odběry z FreeTube (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "Importovat odběry z NewPipe (.json)",
|
"Import NewPipe subscriptions (.json)": "Importovat odběry z NewPipe (.json)",
|
||||||
"Import NewPipe data (.zip)": "Importovat údeje z NewPipe (.zip)",
|
"Import NewPipe data (.zip)": "Importovat údeje z NewPipe (.zip)",
|
||||||
"Export": "Exportovat",
|
"Export": "Exportovat",
|
||||||
"Export subscriptions as OPML": "Exportovat odběry jako OPML",
|
"Export subscriptions as OPML": "Exportovat odběry jako OPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportovat údaje jako OPML (na NewPipe a FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportovat údaje jako OPML (na NewPipe a FreeTube)",
|
||||||
"Export data as JSON": "Exportovat data jako JSON",
|
"Export data as JSON": "Exportovat data Invidious jako JSON",
|
||||||
"Delete account?": "Smazat účet?",
|
"Delete account?": "Smazat účet?",
|
||||||
"History": "Historie",
|
"History": "Historie",
|
||||||
"An alternative front-end to YouTube": "Alternativní front-end pro YouTube",
|
"An alternative front-end to YouTube": "Alternativní front-end pro YouTube",
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
"Log in": "Přihlásit se",
|
"Log in": "Přihlásit se",
|
||||||
"Log in/register": "Přihlásit se/vytvořit účet",
|
"Log in/register": "Přihlásit se/vytvořit účet",
|
||||||
"Log in with Google": "Přihlásit se s Googlem",
|
"Log in with Google": "Přihlásit se s Googlem",
|
||||||
"User ID": "Uživatelské IČ",
|
"User ID": "ID uživatele",
|
||||||
"Password": "Heslo",
|
"Password": "Heslo",
|
||||||
"Time (h:mm:ss):": "Čas (h:mm:ss):",
|
"Time (h:mm:ss):": "Čas (h:mm:ss):",
|
||||||
"Text CAPTCHA": "Textové CAPTCHA",
|
"Text CAPTCHA": "Textové CAPTCHA",
|
||||||
@@ -51,17 +51,17 @@
|
|||||||
"preferences_category_player": "Nastavení přehravače",
|
"preferences_category_player": "Nastavení přehravače",
|
||||||
"preferences_video_loop_label": "Vždy opakovat: ",
|
"preferences_video_loop_label": "Vždy opakovat: ",
|
||||||
"preferences_autoplay_label": "Automatické přehrávání: ",
|
"preferences_autoplay_label": "Automatické přehrávání: ",
|
||||||
"preferences_continue_label": "Přehrát další ve výchozím stavu: ",
|
"preferences_continue_label": "Automaticky přehrát další: ",
|
||||||
"preferences_continue_autoplay_label": "Automaticky přehrát další video: ",
|
"preferences_continue_autoplay_label": "Automaticky přehrát další video: ",
|
||||||
"preferences_listen_label": "Poslouchat ve výchozím nastavení: ",
|
"preferences_listen_label": "Poslouchat ve výchozím nastavení: ",
|
||||||
"preferences_local_label": "Video přes proxy: ",
|
"preferences_local_label": "Video přes proxy: ",
|
||||||
"preferences_speed_label": "Základní Rychlost: ",
|
"preferences_speed_label": "Výchozí rychlost: ",
|
||||||
"preferences_quality_label": "Preferovaná kvalita videa: ",
|
"preferences_quality_label": "Preferovaná kvalita videa: ",
|
||||||
"preferences_volume_label": "Hlasitost přehrávače: ",
|
"preferences_volume_label": "Hlasitost přehrávače: ",
|
||||||
"preferences_comments_label": "Předpřipravené komentáře: ",
|
"preferences_comments_label": "Předpřipravené komentáře: ",
|
||||||
"youtube": "YouTube",
|
"youtube": "YouTube",
|
||||||
"reddit": "reddit",
|
"reddit": "Reddit",
|
||||||
"preferences_captions_label": "Standartní Titulky: ",
|
"preferences_captions_label": "Výchozí titulky: ",
|
||||||
"Fallback captions: ": "Záložní titulky: ",
|
"Fallback captions: ": "Záložní titulky: ",
|
||||||
"preferences_related_videos_label": "Zobrazit podobné videa: ",
|
"preferences_related_videos_label": "Zobrazit podobné videa: ",
|
||||||
"preferences_annotations_label": "Zobrazovat poznámky ve výchozím nastavení: ",
|
"preferences_annotations_label": "Zobrazovat poznámky ve výchozím nastavení: ",
|
||||||
@@ -88,28 +88,28 @@
|
|||||||
"Only show latest unwatched video from channel: ": "Zobrazit jen nejnovější nezhlédnuté video z daného kanálu: ",
|
"Only show latest unwatched video from channel: ": "Zobrazit jen nejnovější nezhlédnuté video z daného kanálu: ",
|
||||||
"preferences_unseen_only_label": "Zobrazit jen již nezhlédnuté: ",
|
"preferences_unseen_only_label": "Zobrazit jen již nezhlédnuté: ",
|
||||||
"preferences_notifications_only_label": "Zobrazit pouze upozornění (pokud nějaká jsou): ",
|
"preferences_notifications_only_label": "Zobrazit pouze upozornění (pokud nějaká jsou): ",
|
||||||
"Enable web notifications": "Povolit webové upozornění",
|
"Enable web notifications": "Povolit webová upozornění",
|
||||||
"`x` uploaded a video": "`x` nahrál(a) video",
|
"`x` uploaded a video": "`x` nahrál(a) video",
|
||||||
"`x` is live": "`x` je živě",
|
"`x` is live": "`x` je živě",
|
||||||
"preferences_category_data": "Nastavení dat",
|
"preferences_category_data": "Nastavení dat",
|
||||||
"Clear watch history": "Smazat historii",
|
"Clear watch history": "Smazat historii",
|
||||||
"Import/export data": "importovat/exportovat data",
|
"Import/export data": "Importovat/exportovat data",
|
||||||
"Change password": "Změnit heslo",
|
"Change password": "Změnit heslo",
|
||||||
"Manage subscriptions": "Spravovat odebírané kanály",
|
"Manage subscriptions": "Spravovat odebírané kanály",
|
||||||
"Manage tokens": "Spravovat klíče",
|
"Manage tokens": "Spravovat tokeny",
|
||||||
"Watch history": "Historie Sledování",
|
"Watch history": "Historie sledování",
|
||||||
"Delete account": "Smazat Účet",
|
"Delete account": "Smazat účet",
|
||||||
"preferences_category_admin": "Administrátorská nastavení",
|
"preferences_category_admin": "Administrátorská nastavení",
|
||||||
"preferences_default_home_label": "Základní domovská stránka: ",
|
"preferences_default_home_label": "Základní domovská stránka: ",
|
||||||
"preferences_feed_menu_label": "Menu doporučených: ",
|
"preferences_feed_menu_label": "Menu doporučených: ",
|
||||||
"CAPTCHA enabled: ": "CAPTCHA povolen: ",
|
"CAPTCHA enabled: ": "CAPTCHA povolena: ",
|
||||||
"Login enabled: ": "Přihlášení povoleno: ",
|
"Login enabled: ": "Přihlášení povoleno: ",
|
||||||
"Registration enabled: ": "Registrace povolena ",
|
"Registration enabled: ": "Registrace povolena ",
|
||||||
"Report statistics: ": "Oznámit statistiky: ",
|
"Report statistics: ": "Oznámit statistiky: ",
|
||||||
"Save preferences": "Uložit nastavení",
|
"Save preferences": "Uložit nastavení",
|
||||||
"Subscription manager": "Správa Odběrů",
|
"Subscription manager": "Správa odběrů",
|
||||||
"Token manager": "Správa klíčů",
|
"Token manager": "Správa tokenů",
|
||||||
"Token": "Klíč",
|
"Token": "Token",
|
||||||
"Import/export": "Importovat/exportovat",
|
"Import/export": "Importovat/exportovat",
|
||||||
"unsubscribe": "odhlásit odběr",
|
"unsubscribe": "odhlásit odběr",
|
||||||
"revoke": "vrátit zpět",
|
"revoke": "vrátit zpět",
|
||||||
@@ -118,10 +118,10 @@
|
|||||||
"Log out": "Odhlásit se",
|
"Log out": "Odhlásit se",
|
||||||
"Source available here.": "Zdrojový kód dostupný zde.",
|
"Source available here.": "Zdrojový kód dostupný zde.",
|
||||||
"View JavaScript license information.": "Zobrazit informace o licenci JavaScript .",
|
"View JavaScript license information.": "Zobrazit informace o licenci JavaScript .",
|
||||||
"View privacy policy.": "Zobrazit Zásady ochrany osobních údajů.",
|
"View privacy policy.": "Zobrazit zásady ochrany osobních údajů.",
|
||||||
"Trending": "Trendy",
|
"Trending": "Trendy",
|
||||||
"Public": "Veřejné",
|
"Public": "Veřejné",
|
||||||
"Unlisted": "Nevypsáno",
|
"Unlisted": "Neveřejné",
|
||||||
"Private": "Soukromé",
|
"Private": "Soukromé",
|
||||||
"View all playlists": "Zobrazit všechny playlisty",
|
"View all playlists": "Zobrazit všechny playlisty",
|
||||||
"Updated `x` ago": "Aktualizováno před `x`",
|
"Updated `x` ago": "Aktualizováno před `x`",
|
||||||
@@ -133,12 +133,12 @@
|
|||||||
"Show more": "Zobrazit více",
|
"Show more": "Zobrazit více",
|
||||||
"Show less": "Zobrazit méně",
|
"Show less": "Zobrazit méně",
|
||||||
"Watch on YouTube": "Sledovat na YouTube",
|
"Watch on YouTube": "Sledovat na YouTube",
|
||||||
"Hide annotations": "Skrýt vysvětlivky",
|
"Hide annotations": "Skrýt poznámky",
|
||||||
"Show annotations": "Zobrazit vysvětlivky",
|
"Show annotations": "Zobrazit poznámky",
|
||||||
"Genre: ": "Žánr: ",
|
"Genre: ": "Žánr: ",
|
||||||
"License: ": "Licence: ",
|
"License: ": "Licence: ",
|
||||||
"Family friendly? ": "Vhodné pro děti? ",
|
"Family friendly? ": "Vhodné pro rodiny? ",
|
||||||
"Engagement: ": "Závaznost: ",
|
"Engagement: ": "Zapojení: ",
|
||||||
"English": "Angličtina",
|
"English": "Angličtina",
|
||||||
"English (auto-generated)": "Angličtina (automaticky generováno)",
|
"English (auto-generated)": "Angličtina (automaticky generováno)",
|
||||||
"Afrikaans": "Afrikánština",
|
"Afrikaans": "Afrikánština",
|
||||||
@@ -262,27 +262,230 @@
|
|||||||
"Video mode": "Videový režim",
|
"Video mode": "Videový režim",
|
||||||
"Videos": "Videa",
|
"Videos": "Videa",
|
||||||
"Community": "Komunita",
|
"Community": "Komunita",
|
||||||
"rating": "hodnocení",
|
"search_filters_sort_option_rating": "Hodnocení",
|
||||||
"date": "datum",
|
"search_filters_sort_option_date": "Datum nahrání",
|
||||||
"views": "zhlédnutí",
|
"search_filters_sort_option_views": "Počet zhlédnutí",
|
||||||
"duration": "délka",
|
"search_filters_duration_label": "Délka",
|
||||||
"hour": "hodina",
|
"search_filters_date_option_hour": "Poslední hodina",
|
||||||
"today": "dnes",
|
"search_filters_date_option_today": "Dnes",
|
||||||
"week": "týden",
|
"search_filters_date_option_week": "Tento týden",
|
||||||
"month": "měsíc",
|
"search_filters_date_option_month": "Tento měsíc",
|
||||||
"year": "rok",
|
"search_filters_date_option_year": "Tento rok",
|
||||||
"video": "video",
|
"search_filters_type_option_video": "Video",
|
||||||
"channel": "kanál",
|
"search_filters_type_option_channel": "Kanál",
|
||||||
"playlist": "playlist",
|
"search_filters_type_option_playlist": "Playlist",
|
||||||
"movie": "film",
|
"search_filters_type_option_movie": "Film",
|
||||||
"show": "zobrazit",
|
"search_filters_type_option_show": "Seriál",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "titulky",
|
"search_filters_features_option_subtitles": "Titulky",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "živě",
|
"search_filters_features_option_live": "Živě",
|
||||||
"4k": "4k",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "umístění",
|
"search_filters_features_option_location": "Umístění",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "filtr"
|
"generic_count_days_0": "{{count}} dnem",
|
||||||
|
"generic_count_days_1": "{{count}} dny",
|
||||||
|
"generic_count_days_2": "{{count}} dny",
|
||||||
|
"generic_count_hours_0": "{{count}} hodinou",
|
||||||
|
"generic_count_hours_1": "{{count}} hodinami",
|
||||||
|
"generic_count_hours_2": "{{count}} hodinami",
|
||||||
|
"crash_page_refresh": "zkusili <a href=\"`x`\">obnovit stránku</a>",
|
||||||
|
"crash_page_switch_instance": "zkusili <a href=\"`x`\">použít jinou instanci</a>",
|
||||||
|
"preferences_vr_mode_label": "Interaktivní 360-stupňová videa (vyžaduje WebGL): ",
|
||||||
|
"English (United Kingdom)": "Angličtina (Spojené království)",
|
||||||
|
"Chinese (China)": "Čínština (Čína)",
|
||||||
|
"Chinese (Hong Kong)": "Čínština (Hong Kong)",
|
||||||
|
"Chinese (Taiwan)": "Čínština (Taiwan)",
|
||||||
|
"Portuguese (auto-generated)": "Portugalština (automaticky generováno)",
|
||||||
|
"Spanish (auto-generated)": "Španělština (automaticky generováno)",
|
||||||
|
"Spanish (Mexico)": "Španělština (Mexiko)",
|
||||||
|
"Spanish (Spain)": "Španělština (Španělsko)",
|
||||||
|
"generic_count_years_0": "{{count}} rokem",
|
||||||
|
"generic_count_years_1": "{{count}} lety",
|
||||||
|
"generic_count_years_2": "{{count}} lety",
|
||||||
|
"Fallback comments: ": "Záložní komentáře: ",
|
||||||
|
"Search": "Hledat",
|
||||||
|
"Top": "Nejlepší",
|
||||||
|
"Playlists": "Playlisty",
|
||||||
|
"videoinfo_started_streaming_x_ago": "Stream spuštěn před `x`",
|
||||||
|
"videoinfo_watch_on_youTube": "Sledovat na YouTube",
|
||||||
|
"videoinfo_youTube_embed_link": "Vložení",
|
||||||
|
"crash_page_read_the_faq": "si přečetli <a href=\"`x`\">často kladené otázky (FAQ)</a>",
|
||||||
|
"crash_page_before_reporting": "Před nahlášením chyby se ujistěte, že jste:",
|
||||||
|
"preferences_quality_option_hd720": "HD720",
|
||||||
|
"preferences_quality_option_dash": "DASH (adaptivní kvalita)",
|
||||||
|
"generic_views_count_0": "{{count}} zhlédnutí",
|
||||||
|
"generic_views_count_1": "{{count}} zhlédnutí",
|
||||||
|
"generic_views_count_2": "{{count}} zhlédnutí",
|
||||||
|
"generic_subscriptions_count_0": "{{count}} odběr",
|
||||||
|
"generic_subscriptions_count_1": "{{count}} odběry",
|
||||||
|
"generic_subscriptions_count_2": "{{count}} odběrů",
|
||||||
|
"preferences_quality_dash_option_4320p": "4320p",
|
||||||
|
"generic_videos_count_0": "{{count}} video",
|
||||||
|
"generic_videos_count_1": "{{count}} videa",
|
||||||
|
"generic_videos_count_2": "{{count}} videí",
|
||||||
|
"preferences_quality_option_small": "Nízká",
|
||||||
|
"preferences_quality_dash_option_2160p": "2160p",
|
||||||
|
"preferences_quality_dash_option_1080p": "1080p",
|
||||||
|
"preferences_quality_dash_option_720p": "720p",
|
||||||
|
"preferences_quality_dash_option_360p": "360p",
|
||||||
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
|
"preferences_quality_option_medium": "Střední",
|
||||||
|
"preferences_quality_dash_option_1440p": "1440p",
|
||||||
|
"invidious": "Invidious",
|
||||||
|
"View more comments on Reddit": "Zobrazit více komentářů na Redditu",
|
||||||
|
"Invalid TFA code": "Nesprávný TFA kód",
|
||||||
|
"generic_playlists_count_0": "{{count}} playlist",
|
||||||
|
"generic_playlists_count_1": "{{count}} playlisty",
|
||||||
|
"generic_playlists_count_2": "{{count}} playlistů",
|
||||||
|
"generic_subscribers_count_0": "{{count}} odběratel",
|
||||||
|
"generic_subscribers_count_1": "{{count}} odběratelé",
|
||||||
|
"generic_subscribers_count_2": "{{count}} odběratelů",
|
||||||
|
"preferences_watch_history_label": "Povolit historii sledování: ",
|
||||||
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
|
"preferences_region_label": "Země obsahu: ",
|
||||||
|
"subscriptions_unseen_notifs_count_0": "{{count}} nezobrazené oznámení",
|
||||||
|
"subscriptions_unseen_notifs_count_1": "{{count}} nezobrazená oznámení",
|
||||||
|
"subscriptions_unseen_notifs_count_2": "{{count}} nezobrazených oznámení",
|
||||||
|
"Show replies": "Zobrazit odpovědi",
|
||||||
|
"Quota exceeded, try again in a few hours": "Kvóta překročena, zkuste to znovu za pár hodin",
|
||||||
|
"Password cannot be longer than 55 characters": "Heslo nesmí být delší než 55 znaků",
|
||||||
|
"comments_view_x_replies_0": "Zobrazit {{count}} odpověď",
|
||||||
|
"comments_view_x_replies_1": "Zobrazit {{count}} odpovědi",
|
||||||
|
"comments_view_x_replies_2": "Zobrazit {{count}} odpovědí",
|
||||||
|
"comments_points_count_0": "{{count}} bod",
|
||||||
|
"comments_points_count_1": "{{count}} body",
|
||||||
|
"comments_points_count_2": "{{count}} bodů",
|
||||||
|
"German (auto-generated)": "Němčina (automaticky generováno)",
|
||||||
|
"Indonesian (auto-generated)": "Indonéština (automaticky generováno)",
|
||||||
|
"Interlingue": "Interlingue",
|
||||||
|
"Italian (auto-generated)": "Italština (automaticky generováno)",
|
||||||
|
"Japanese (auto-generated)": "Japonština (automaticky generováno)",
|
||||||
|
"Korean (auto-generated)": "Korejština (automaticky generováno)",
|
||||||
|
"Russian (auto-generated)": "Ruština (automaticky generováno)",
|
||||||
|
"generic_count_months_0": "{{count}} měsícem",
|
||||||
|
"generic_count_months_1": "{{count}} měsíci",
|
||||||
|
"generic_count_months_2": "{{count}} měsíci",
|
||||||
|
"generic_count_weeks_0": "{{count}} týdnem",
|
||||||
|
"generic_count_weeks_1": "{{count}} týdny",
|
||||||
|
"generic_count_weeks_2": "{{count}} týdny",
|
||||||
|
"generic_count_minutes_0": "{{count}} minutou",
|
||||||
|
"generic_count_minutes_1": "{{count}} minutami",
|
||||||
|
"generic_count_minutes_2": "{{count}} minutami",
|
||||||
|
"footer_documentation": "Dokumentace",
|
||||||
|
"next_steps_error_message_refresh": "Obnovit stránku",
|
||||||
|
"Chinese": "Čínština",
|
||||||
|
"Dutch (auto-generated)": "Nizozemština (automaticky generováno)",
|
||||||
|
"Erroneous token": "Chybný token",
|
||||||
|
"tokens_count_0": "{{count}} token",
|
||||||
|
"tokens_count_1": "{{count}} tokeny",
|
||||||
|
"tokens_count_2": "{{count}} tokenů",
|
||||||
|
"Portuguese (Brazil)": "Portugalština (Brazílie)",
|
||||||
|
"Token is expired, please try again": "Token vypršel, zkuste to prosím znovu",
|
||||||
|
"English (United States)": "Angličtina (Spojené státy)",
|
||||||
|
"Cantonese (Hong Kong)": "Kantonština (Hong Kong)",
|
||||||
|
"French (auto-generated)": "Francouzština (automaticky generováno)",
|
||||||
|
"Turkish (auto-generated)": "Turečtina (automaticky generováno)",
|
||||||
|
"Vietnamese (auto-generated)": "Vietnamština (automaticky generováno)",
|
||||||
|
"Current version: ": "Aktuální verze: ",
|
||||||
|
"next_steps_error_message": "Měli byste zkusit: ",
|
||||||
|
"footer_donate_page": "Přispět",
|
||||||
|
"download_subtitles": "Titulky - `x` (.vtt)",
|
||||||
|
"%A %B %-d, %Y": "%A %B %-d, %Y",
|
||||||
|
"YouTube comment permalink": "Permanentní odkaz YouTube komentáře",
|
||||||
|
"permalink": "permalink",
|
||||||
|
"footer_original_source_code": "Původní zdrojový kód",
|
||||||
|
"adminprefs_modified_source_code_url_label": "URL repozitáře s upraveným zdrojovým kódem",
|
||||||
|
"Video unavailable": "Video není dostupné",
|
||||||
|
"next_steps_error_message_go_to_youtube": "Jít na YouTube",
|
||||||
|
"footer_modfied_source_code": "Upravený zdrojový kód",
|
||||||
|
"none": "žádné",
|
||||||
|
"videoinfo_invidious_embed_link": "Odkaz na vložení",
|
||||||
|
"user_saved_playlists": "`x` uložených playlistů",
|
||||||
|
"crash_page_you_found_a_bug": "Vypadá to, že jste našli chybu v Invidious!",
|
||||||
|
"user_created_playlists": "`x` vytvořených playlistů",
|
||||||
|
"crash_page_search_issue": "vyhledali <a href=\"`x`\">existující problémy na GitHubu</a>",
|
||||||
|
"crash_page_report_issue": "Pokud nepomohlo nic z výše uvedeného, <a href=\"`x`\">otevřete prosím nový problém na GitHubu</a> (pokud možno v angličtině) a zahrňte do zprávy následující text (NEpřekládejte jej):",
|
||||||
|
"preferences_quality_dash_label": "Preferovaná kvalita videí DASH: ",
|
||||||
|
"preferences_quality_dash_option_auto": "Automatická",
|
||||||
|
"preferences_quality_dash_option_best": "Nejlepší",
|
||||||
|
"preferences_quality_dash_option_worst": "Nejhorší",
|
||||||
|
"preferences_quality_dash_option_480p": "480p",
|
||||||
|
"Top enabled: ": "Povoleny nejlepší: ",
|
||||||
|
"generic_count_seconds_0": "{{count}} sekundou",
|
||||||
|
"generic_count_seconds_1": "{{count}} sekundami",
|
||||||
|
"generic_count_seconds_2": "{{count}} sekundami",
|
||||||
|
"preferences_save_player_pos_label": "Uložit pozici přehrávání: ",
|
||||||
|
"Incorrect password": "Nesprávné heslo",
|
||||||
|
"View as playlist": "Zobrazit jako playlist",
|
||||||
|
"View Reddit comments": "Zobrazit komentáře z Redditu",
|
||||||
|
"No such user": "Uživatel nenalezen",
|
||||||
|
"Playlist privacy": "Soukromí playlistu",
|
||||||
|
"Wrong answer": "Špatná odpověď",
|
||||||
|
"Could not pull trending pages.": "Nepodařilo se získat trendy stránky.",
|
||||||
|
"Erroneous CAPTCHA": "Chybná CAPTCHA",
|
||||||
|
"Password is a required field": "Heslo je vyžadované pole",
|
||||||
|
"preferences_automatic_instance_redirect_label": "Automatické přesměrování instance (fallback na redirect.invidious.io): ",
|
||||||
|
"Switch Invidious Instance": "Přepnout instanci Invidious",
|
||||||
|
"Empty playlist": "Prázdný playlist",
|
||||||
|
"footer_source_code": "Zdrojový kód",
|
||||||
|
"View YouTube comments": "Zobrazit YouTube komentáře",
|
||||||
|
"Blacklisted regions: ": "Oblasti na černé listině: ",
|
||||||
|
"Wrong username or password": "Nesprávné uživatelské jméno nebo heslo",
|
||||||
|
"Please sign in using 'Log in with Google'": "Přihlaste se prosím pomocí Googlu",
|
||||||
|
"Password cannot be empty": "Heslo nemůže být prázné",
|
||||||
|
"preferences_category_misc": "Různá nastavení",
|
||||||
|
"preferences_show_nick_label": "Zobrazit přezdívku na vrchu: ",
|
||||||
|
"Whitelisted regions: ": "Oblasti na bílé listině: ",
|
||||||
|
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Zdravíme! Zdá se, že máte vypnutý JavaScript. Klikněte sem pro zobrazení komentářů - nezapomeňte, že se mohou načítat trochu déle.",
|
||||||
|
"User ID is a required field": "ID uživatele je vyžadované pole",
|
||||||
|
"Please log in": "Přihlaste se prosím",
|
||||||
|
"Invidious Private Feed for `x`": "Soukromý kanál Invidious pro `x`",
|
||||||
|
"Deleted or invalid channel": "Smazaný nebo neplatný kanál",
|
||||||
|
"This channel does not exist.": "Tento kanál neexistuje.",
|
||||||
|
"Hidden field \"token\" is a required field": "Skryté pole \"token\" je vyžadované",
|
||||||
|
"Wilson score: ": "Skóre Wilson: ",
|
||||||
|
"Shared `x`": "Zveřejněno `x`",
|
||||||
|
"Premieres in `x`": "Premiéra za `x`",
|
||||||
|
"View `x` comments": {
|
||||||
|
"([^.,0-9]|^)1([^.,0-9]|$)": "Zobrazit `x` komentář",
|
||||||
|
"": "Zobrazit `x` komentářů"
|
||||||
|
},
|
||||||
|
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Nepodařilo se přihlásit, ujistěte se, že je povoleno dvoufázové ověřování (autentifikátor nebo SMS).",
|
||||||
|
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Přihlášení selhalo. Toto se může stát, když není na vašem účtu povolené dvoufázové ověřování.",
|
||||||
|
"Could not get channel info.": "Nepodařilo se získat informace o kanálu.",
|
||||||
|
"Could not fetch comments": "Nepodařilo se získat komentáře",
|
||||||
|
"Could not create mix.": "Nepodařilo se vytvořit mix.",
|
||||||
|
"Hidden field \"challenge\" is a required field": "Skryté pole \"challenge\" je vyžadované",
|
||||||
|
"Released under the AGPLv3 on Github.": "Vydáno pod licencí AGPLv3 na GitHubu.",
|
||||||
|
"Hide replies": "Skrýt odpovědi",
|
||||||
|
"channel:`x`": "kanál: `x`",
|
||||||
|
"Load more": "Načíst další",
|
||||||
|
"Not a playlist.": "Není playlist.",
|
||||||
|
"Playlist does not exist.": "Playlist neexistuje.",
|
||||||
|
"Erroneous challenge": "Chybná výzva",
|
||||||
|
"Premieres `x`": "Premiéra `x`",
|
||||||
|
"CAPTCHA is a required field": "CAPTCHA je vyžadované pole",
|
||||||
|
"`x` ago": "Před `x`",
|
||||||
|
"search_message_change_filters_or_query": "Zkuste rozšířit vyhledávaný dotaz a/nebo změnit filtry.",
|
||||||
|
"search_filters_date_option_none": "Jakékoli datum",
|
||||||
|
"search_filters_date_label": "Datum nahrání",
|
||||||
|
"search_filters_type_option_all": "Jakýkoli typ",
|
||||||
|
"search_filters_duration_option_none": "Jakákoli délka",
|
||||||
|
"search_filters_type_label": "Typ",
|
||||||
|
"search_filters_duration_option_short": "Krátká (< 4 minuty)",
|
||||||
|
"search_message_no_results": "Nenalezeny žádné výsledky.",
|
||||||
|
"search_filters_title": "Filtry",
|
||||||
|
"search_filters_duration_option_medium": "Střední (4 - 20 minut)",
|
||||||
|
"search_filters_duration_option_long": "Dlouhá (> 20 minut)",
|
||||||
|
"search_message_use_another_instance": " Můžete také <a href=\"`x`\">hledat na jiné instanci</a>.",
|
||||||
|
"search_filters_features_label": "Vlastnosti",
|
||||||
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_features_option_purchased": "Zakoupeno",
|
||||||
|
"search_filters_sort_label": "Řadit dle",
|
||||||
|
"search_filters_sort_option_relevance": "Relevantnost",
|
||||||
|
"search_filters_apply_button": "Použít vybrané filtry",
|
||||||
|
"Popular enabled: ": "Populární povoleno: "
|
||||||
}
|
}
|
||||||
|
|||||||
140
locales/da.json
140
locales/da.json
@@ -21,15 +21,15 @@
|
|||||||
"No": "Nej",
|
"No": "Nej",
|
||||||
"Import and Export Data": "Importer og Eksporter Data",
|
"Import and Export Data": "Importer og Eksporter Data",
|
||||||
"Import": "Importer",
|
"Import": "Importer",
|
||||||
"Import Invidious data": "Importer Invidious data",
|
"Import Invidious data": "Importer Invidious JSON-data",
|
||||||
"Import YouTube subscriptions": "Importer YouTube abonnementer",
|
"Import YouTube subscriptions": "Importer YouTube/OPML-abonnementer",
|
||||||
"Import FreeTube subscriptions (.db)": "Importer FreeTube abonnementer (.db)",
|
"Import FreeTube subscriptions (.db)": "Importer FreeTube abonnementer (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "Importer NewPipe abonnementer (.json)",
|
"Import NewPipe subscriptions (.json)": "Importer NewPipe abonnementer (.json)",
|
||||||
"Import NewPipe data (.zip)": "Importer NewPipe data (.zip)",
|
"Import NewPipe data (.zip)": "Importer NewPipe data (.zip)",
|
||||||
"Export": "Exporter",
|
"Export": "Exporter",
|
||||||
"Export subscriptions as OPML": "Exporter abonnementer som OPML",
|
"Export subscriptions as OPML": "Exporter abonnementer som OPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exporter abonnementer som OPML (til NewPipe & FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exporter abonnementer som OPML (til NewPipe & FreeTube)",
|
||||||
"Export data as JSON": "Exporter data som JSON",
|
"Export data as JSON": "Eksporter Invidious-data som JSON",
|
||||||
"Delete account?": "Slet konto?",
|
"Delete account?": "Slet konto?",
|
||||||
"History": "Historik",
|
"History": "Historik",
|
||||||
"An alternative front-end to YouTube": "Et alternativt front-end til YouTube",
|
"An alternative front-end to YouTube": "Et alternativt front-end til YouTube",
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
"preferences_related_videos_label": "Vis relaterede videoer: ",
|
"preferences_related_videos_label": "Vis relaterede videoer: ",
|
||||||
"preferences_annotations_label": "Vis annotationer som standard: ",
|
"preferences_annotations_label": "Vis annotationer som standard: ",
|
||||||
"preferences_extend_desc_label": "Automatisk udvid videoens beskrivelse: ",
|
"preferences_extend_desc_label": "Automatisk udvid videoens beskrivelse: ",
|
||||||
"preferences_vr_mode_label": "Interaktiv 360 graders videoer: ",
|
"preferences_vr_mode_label": "Interaktive 360 graders videoer (kræver WebGL): ",
|
||||||
"preferences_category_visual": "Visuelle præferencer",
|
"preferences_category_visual": "Visuelle præferencer",
|
||||||
"preferences_player_style_label": "Afspiller stil: ",
|
"preferences_player_style_label": "Afspiller stil: ",
|
||||||
"Dark mode: ": "Mørk tilstand: ",
|
"Dark mode: ": "Mørk tilstand: ",
|
||||||
@@ -202,7 +202,7 @@
|
|||||||
"Hidden field \"challenge\" is a required field": "Det skjulte felt \"challenge\" er et påkrævet felt",
|
"Hidden field \"challenge\" is a required field": "Det skjulte felt \"challenge\" er et påkrævet felt",
|
||||||
"Albanian": "Albansk",
|
"Albanian": "Albansk",
|
||||||
"preferences_quality_dash_label": "Fortrukket DASH video kvalitet: ",
|
"preferences_quality_dash_label": "Fortrukket DASH video kvalitet: ",
|
||||||
"live": "Direkte",
|
"search_filters_features_option_live": "Direkte",
|
||||||
"Lao": "Lao-tse",
|
"Lao": "Lao-tse",
|
||||||
"Filipino": "Filippinsk",
|
"Filipino": "Filippinsk",
|
||||||
"Greek": "Græsk",
|
"Greek": "Græsk",
|
||||||
@@ -213,23 +213,22 @@
|
|||||||
"preferences_locale_label": "Sprog: ",
|
"preferences_locale_label": "Sprog: ",
|
||||||
"News": "Nyheder",
|
"News": "Nyheder",
|
||||||
"permalink": "permalink",
|
"permalink": "permalink",
|
||||||
"date": "Upload dato",
|
"search_filters_sort_option_date": "Upload dato",
|
||||||
"features": "Funktioner",
|
"search_filters_features_label": "Funktioner",
|
||||||
"filter": "Filter",
|
|
||||||
"Khmer": "Khmer",
|
"Khmer": "Khmer",
|
||||||
"Finnish": "Finsk",
|
"Finnish": "Finsk",
|
||||||
"week": "Denne uge",
|
"search_filters_date_option_week": "Denne uge",
|
||||||
"Korean": "Koreansk",
|
"Korean": "Koreansk",
|
||||||
"Telugu": "Telugu",
|
"Telugu": "Telugu",
|
||||||
"Malayalam": "Malayalam",
|
"Malayalam": "Malayalam",
|
||||||
"View as playlist": "Se som spilleliste",
|
"View as playlist": "Se som spilleliste",
|
||||||
"Hungarian": "Ungarsk",
|
"Hungarian": "Ungarsk",
|
||||||
"Welsh": "Walisisk",
|
"Welsh": "Walisisk",
|
||||||
"subtitles": "Undertekster/CC",
|
"search_filters_features_option_subtitles": "Undertekster/CC",
|
||||||
"Bosnian": "Bosnisk",
|
"Bosnian": "Bosnisk",
|
||||||
"Yiddish": "Jiddisch",
|
"Yiddish": "Jiddisch",
|
||||||
"Belarusian": "Belarussisk",
|
"Belarusian": "Belarussisk",
|
||||||
"today": "I dag",
|
"search_filters_date_option_today": "I dag",
|
||||||
"Shona": "Shona",
|
"Shona": "Shona",
|
||||||
"Slovenian": "Slovensk",
|
"Slovenian": "Slovensk",
|
||||||
"Gaming": "Gaming",
|
"Gaming": "Gaming",
|
||||||
@@ -246,35 +245,35 @@
|
|||||||
"footer_documentation": "Dokumentation",
|
"footer_documentation": "Dokumentation",
|
||||||
"Pashto": "Pashto",
|
"Pashto": "Pashto",
|
||||||
"footer_modfied_source_code": "Modificeret Kildekode",
|
"footer_modfied_source_code": "Modificeret Kildekode",
|
||||||
"Released under the AGPLv3 on Github.": "Udgivet under AGPLv3 på Github.",
|
"Released under the AGPLv3 on Github.": "Udgivet under AGPLv3 på GitHub.",
|
||||||
"Tajik": "Tadsjikisk",
|
"Tajik": "Tadsjikisk",
|
||||||
"month": "Denne måned",
|
"search_filters_date_option_month": "Denne måned",
|
||||||
"Hebrew": "Hebraisk",
|
"Hebrew": "Hebraisk",
|
||||||
"Kannada": "Kannada",
|
"Kannada": "Kannada",
|
||||||
"Current version: ": "Nuværende version: ",
|
"Current version: ": "Nuværende version: ",
|
||||||
"Amharic": "Amharisk",
|
"Amharic": "Amharisk",
|
||||||
"Swedish": "Svensk",
|
"Swedish": "Svensk",
|
||||||
"Corsican": "Korsikansk",
|
"Corsican": "Korsikansk",
|
||||||
"movie": "Film",
|
"search_filters_type_option_movie": "Film",
|
||||||
"Could not pull trending pages.": "Kunne ikke hente trending sider.",
|
"Could not pull trending pages.": "Kunne ikke hente trending sider.",
|
||||||
"English": "Engelsk",
|
"English": "Engelsk",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"Hausa": "Islandsk",
|
"Hausa": "Islandsk",
|
||||||
"year": "Dette år",
|
"search_filters_date_option_year": "Dette år",
|
||||||
"Japanese": "Japansk",
|
"Japanese": "Japansk",
|
||||||
"content_type": "Type",
|
"search_filters_type_label": "Type",
|
||||||
"Icelandic": "Islandsk",
|
"Icelandic": "Islandsk",
|
||||||
"Basque": "Baskisk",
|
"Basque": "Baskisk",
|
||||||
"rating": "Bedømmelse",
|
"search_filters_sort_option_rating": "Bedømmelse",
|
||||||
"Yoruba": "Yoruba",
|
"Yoruba": "Yoruba",
|
||||||
"Erroneous token": "Fejlagtig token",
|
"Erroneous token": "Fejlagtig token",
|
||||||
"Videos": "Videoer",
|
"Videos": "Videoer",
|
||||||
"show": "Vis",
|
"search_filters_type_option_show": "Vis",
|
||||||
"Luxembourgish": "Luxemboursk",
|
"Luxembourgish": "Luxemboursk",
|
||||||
"Vietnamese": "Vietnamesisk",
|
"Vietnamese": "Vietnamesisk",
|
||||||
"Latvian": "Lettisk",
|
"Latvian": "Lettisk",
|
||||||
"Indonesian": "Indonesisk",
|
"Indonesian": "Indonesisk",
|
||||||
"duration": "Varighed",
|
"search_filters_duration_label": "Varighed",
|
||||||
"footer_original_source_code": "Original kildekode",
|
"footer_original_source_code": "Original kildekode",
|
||||||
"Search": "Søg",
|
"Search": "Søg",
|
||||||
"Serbian": "Serbisk",
|
"Serbian": "Serbisk",
|
||||||
@@ -289,8 +288,8 @@
|
|||||||
"Rating: ": "Bedømmelse: ",
|
"Rating: ": "Bedømmelse: ",
|
||||||
"Movies": "Film",
|
"Movies": "Film",
|
||||||
"YouTube comment permalink": "Youtube kommentarer permalink",
|
"YouTube comment permalink": "Youtube kommentarer permalink",
|
||||||
"location": "Lokation",
|
"search_filters_features_option_location": "Lokation",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"Cebuano": "Cebuano (Sugbuanon)",
|
"Cebuano": "Cebuano (Sugbuanon)",
|
||||||
"Nyanja": "Nyanja",
|
"Nyanja": "Nyanja",
|
||||||
"Chinese (Simplified)": "Kinesisk (forenklet)",
|
"Chinese (Simplified)": "Kinesisk (forenklet)",
|
||||||
@@ -306,11 +305,11 @@
|
|||||||
"German": "Tysk",
|
"German": "Tysk",
|
||||||
"Maori": "Maori",
|
"Maori": "Maori",
|
||||||
"Slovak": "Slovakisk",
|
"Slovak": "Slovakisk",
|
||||||
"relevance": "Relevans",
|
"search_filters_sort_option_relevance": "Relevans",
|
||||||
"hour": "Sidste time",
|
"search_filters_date_option_hour": "Sidste time",
|
||||||
"playlist": "Spilleliste",
|
"search_filters_type_option_playlist": "Spilleliste",
|
||||||
"long": "Lang (> 20 minutter)",
|
"search_filters_duration_option_long": "Lang (> 20 minutter)",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"Marathi": "Marathi",
|
"Marathi": "Marathi",
|
||||||
"Sindhi": "Sindhi",
|
"Sindhi": "Sindhi",
|
||||||
"preferences_category_misc": "Diverse indstillinger",
|
"preferences_category_misc": "Diverse indstillinger",
|
||||||
@@ -327,8 +326,8 @@
|
|||||||
"Western Frisian": "Vestfrisisk",
|
"Western Frisian": "Vestfrisisk",
|
||||||
"Top": "Top",
|
"Top": "Top",
|
||||||
"Music": "Musik",
|
"Music": "Musik",
|
||||||
"views": "Antal visninger",
|
"search_filters_sort_option_views": "Antal visninger",
|
||||||
"sort": "Sorter efter",
|
"search_filters_sort_label": "Sorter efter",
|
||||||
"Zulu": "Zulu",
|
"Zulu": "Zulu",
|
||||||
"Invidious Private Feed for `x`": "Invidious Privat Feed til `x`",
|
"Invidious Private Feed for `x`": "Invidious Privat Feed til `x`",
|
||||||
"English (auto-generated)": "Engelsk (autogenereret)",
|
"English (auto-generated)": "Engelsk (autogenereret)",
|
||||||
@@ -349,7 +348,6 @@
|
|||||||
"next_steps_error_message": "Efter det burde du prøve at: ",
|
"next_steps_error_message": "Efter det burde du prøve at: ",
|
||||||
"Sinhala": "Singalesisk (Sinhala)",
|
"Sinhala": "Singalesisk (Sinhala)",
|
||||||
"Thai": "Thai",
|
"Thai": "Thai",
|
||||||
"Broken? Try another Invidious Instance": "I stykker? Prøv en anden Invidious instans",
|
|
||||||
"No such user": "Brugeren findes ikke",
|
"No such user": "Brugeren findes ikke",
|
||||||
"Token is expired, please try again": "Token er udløbet, prøv igen",
|
"Token is expired, please try again": "Token er udløbet, prøv igen",
|
||||||
"Catalan": "Catalansk",
|
"Catalan": "Catalansk",
|
||||||
@@ -359,16 +357,16 @@
|
|||||||
"Scottish Gaelic": "Skotsk Gælisk",
|
"Scottish Gaelic": "Skotsk Gælisk",
|
||||||
"Default": "Standard",
|
"Default": "Standard",
|
||||||
"Video mode": "Videotilstand",
|
"Video mode": "Videotilstand",
|
||||||
"short": "Kort (< 4 minutter)",
|
"search_filters_duration_option_short": "Kort (< 4 minutter)",
|
||||||
"Hidden field \"token\" is a required field": "Det skjulte felt \"token\" er et påkrævet felt",
|
"Hidden field \"token\" is a required field": "Det skjulte felt \"token\" er et påkrævet felt",
|
||||||
"Azerbaijani": "Aserbajdsjansk",
|
"Azerbaijani": "Aserbajdsjansk",
|
||||||
"Georgian": "Georgisk",
|
"Georgian": "Georgisk",
|
||||||
"Italian": "Italiensk",
|
"Italian": "Italiensk",
|
||||||
"Audio mode": "Lydtilstand",
|
"Audio mode": "Lydtilstand",
|
||||||
"video": "Video",
|
"search_filters_type_option_video": "Video",
|
||||||
"channel": "Kanal",
|
"search_filters_type_option_channel": "Kanal",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"Hmong": "Hmong",
|
"Hmong": "Hmong",
|
||||||
"preferences_quality_option_medium": "Medium",
|
"preferences_quality_option_medium": "Medium",
|
||||||
"preferences_quality_option_small": "Lille",
|
"preferences_quality_option_small": "Lille",
|
||||||
@@ -381,8 +379,8 @@
|
|||||||
"preferences_quality_dash_option_360p": "360p",
|
"preferences_quality_dash_option_360p": "360p",
|
||||||
"preferences_quality_dash_option_144p": "144p",
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
"invidious": "Invidious",
|
"invidious": "Invidious",
|
||||||
"purchased": "Købt",
|
"search_filters_features_option_purchased": "Købt",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"none": "ingen",
|
"none": "ingen",
|
||||||
"videoinfo_started_streaming_x_ago": "Streamen blev startet for `x`siden",
|
"videoinfo_started_streaming_x_ago": "Streamen blev startet for `x`siden",
|
||||||
"videoinfo_watch_on_youTube": "Se på YouTube",
|
"videoinfo_watch_on_youTube": "Se på YouTube",
|
||||||
@@ -392,11 +390,75 @@
|
|||||||
"user_created_playlists": "`x`opretede spillelister",
|
"user_created_playlists": "`x`opretede spillelister",
|
||||||
"user_saved_playlists": "´x`gemte spillelister",
|
"user_saved_playlists": "´x`gemte spillelister",
|
||||||
"Video unavailable": "Video ikke tilgængelig",
|
"Video unavailable": "Video ikke tilgængelig",
|
||||||
"preferences_save_player_pos_label": "Gem den nuværende videotid: ",
|
"preferences_save_player_pos_label": "Gem afspilningsposition: ",
|
||||||
"preferences_quality_dash_option_auto": "Auto",
|
"preferences_quality_dash_option_auto": "Auto",
|
||||||
"preferences_quality_option_hd720": "HD720",
|
"preferences_quality_option_hd720": "HD720",
|
||||||
"preferences_quality_dash_option_2160p": "2160p",
|
"preferences_quality_dash_option_2160p": "2160p",
|
||||||
"preferences_quality_option_dash": "DASH (adaptiv kvalitet)",
|
"preferences_quality_option_dash": "DASH (adaptiv kvalitet)",
|
||||||
"preferences_quality_dash_option_1440p": "1440p",
|
"preferences_quality_dash_option_1440p": "1440p",
|
||||||
"preferences_quality_dash_option_240p": "240p"
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
|
"subscriptions_unseen_notifs_count": "{{count}} uset notifikation",
|
||||||
|
"subscriptions_unseen_notifs_count_plural": "{{count}} usete notifikationer",
|
||||||
|
"comments_view_x_replies": "Vis {{count}} svar",
|
||||||
|
"comments_view_x_replies_plural": "Vis {{count}} svar",
|
||||||
|
"comments_points_count": "{{count}} point",
|
||||||
|
"comments_points_count_plural": "{{count}} point",
|
||||||
|
"generic_count_years": "{{count}} år",
|
||||||
|
"generic_count_years_plural": "{{count}} år",
|
||||||
|
"generic_count_months": "{{count}} måned",
|
||||||
|
"generic_count_months_plural": "{{count}} måneder",
|
||||||
|
"generic_count_days": "{{count}} dag",
|
||||||
|
"generic_count_days_plural": "{{count}} dage",
|
||||||
|
"generic_count_minutes": "{{count}} minut",
|
||||||
|
"generic_count_minutes_plural": "{{count}} minutter",
|
||||||
|
"generic_count_seconds": "{{count}} sekund",
|
||||||
|
"generic_count_seconds_plural": "{{count}} sekunder",
|
||||||
|
"generic_subscribers_count": "{{count}} abonnent",
|
||||||
|
"generic_subscribers_count_plural": "{{count}} abonnenter",
|
||||||
|
"generic_subscriptions_count": "{{count}} abonnement",
|
||||||
|
"generic_subscriptions_count_plural": "{{count}} abonnementer",
|
||||||
|
"generic_videos_count": "{{count}} video",
|
||||||
|
"generic_videos_count_plural": "{{count}} videoer",
|
||||||
|
"English (United States)": "Engelsk (USA)",
|
||||||
|
"French (auto-generated)": "Fransk (autogenereret)",
|
||||||
|
"Spanish (auto-generated)": "Spansk (autogenereret)",
|
||||||
|
"crash_page_before_reporting": "Før du rapporterer en fejl, skal du sikre dig, at du har:",
|
||||||
|
"crash_page_refresh": "forsøgte at <a href=\"`x`\">opdatere siden</a>",
|
||||||
|
"generic_playlists_count": "{{count}} spilleliste",
|
||||||
|
"generic_playlists_count_plural": "{{count}} spillelister",
|
||||||
|
"preferences_watch_history_label": "Aktiver afspilningshistorik: ",
|
||||||
|
"tokens_count": "{{count}} token",
|
||||||
|
"tokens_count_plural": "{{count}} tokens",
|
||||||
|
"Cantonese (Hong Kong)": "Kantonesisk (Hongkong)",
|
||||||
|
"Chinese": "Kinesisk",
|
||||||
|
"Chinese (China)": "Kinesisk (Kina)",
|
||||||
|
"Chinese (Hong Kong)": "Kinesisk (Hongkong)",
|
||||||
|
"Chinese (Taiwan)": "Kinesisk (Taiwan)",
|
||||||
|
"Dutch (auto-generated)": "Hollandsk (autogenereret)",
|
||||||
|
"Indonesian (auto-generated)": "Indonesisk (autogenereret)",
|
||||||
|
"Interlingue": "Interlingue",
|
||||||
|
"Japanese (auto-generated)": "Japansk (autogenereret)",
|
||||||
|
"Korean (auto-generated)": "Koreansk (autogenereret)",
|
||||||
|
"Russian (auto-generated)": "Russisk (autogenereret)",
|
||||||
|
"Turkish (auto-generated)": "Tyrkisk (autogenereret)",
|
||||||
|
"Vietnamese (auto-generated)": "Vietnamesisk (autogenereret)",
|
||||||
|
"crash_page_report_issue": "Hvis intet af ovenstående hjalp, bedes du <a href=\"`x`\">åbne et nyt problem på GitHub</a> (helst på engelsk) og inkludere følgende tekst i din besked (oversæt IKKE denne tekst):",
|
||||||
|
"English (United Kingdom)": "Engelsk (Storbritannien)",
|
||||||
|
"Italian (auto-generated)": "Italiensk (autogenereret)",
|
||||||
|
"Portuguese (auto-generated)": "Portugisisk (autogenereret)",
|
||||||
|
"Portuguese (Brazil)": "Portugisisk (Brasilien)",
|
||||||
|
"generic_views_count": "{{count}} visning",
|
||||||
|
"generic_views_count_plural": "{{count}} visninger",
|
||||||
|
"generic_count_hours": "{{count}} time",
|
||||||
|
"generic_count_hours_plural": "{{count}} timer",
|
||||||
|
"Spanish (Spain)": "Spansk (Spanien)",
|
||||||
|
"crash_page_switch_instance": "forsøgte at <a href=\"`x`\">bruge en anden instans</a>",
|
||||||
|
"German (auto-generated)": "Tysk (autogenereret)",
|
||||||
|
"Spanish (Mexico)": "Spansk (Mexico)",
|
||||||
|
"generic_count_weeks": "{{count}} uge",
|
||||||
|
"generic_count_weeks_plural": "{{count}} uger",
|
||||||
|
"crash_page_you_found_a_bug": "Det ser ud til, at du har fundet en fejl i Invidious!",
|
||||||
|
"crash_page_read_the_faq": "læs <a href=\"`x`\">Ofte stillede spørgsmål (FAQ)</a>",
|
||||||
|
"crash_page_search_issue": "søgte efter <a href=\"`x`\">eksisterende problemer på GitHub</a>",
|
||||||
|
"search_filters_title": "Filter"
|
||||||
}
|
}
|
||||||
|
|||||||
165
locales/de.json
165
locales/de.json
@@ -21,15 +21,15 @@
|
|||||||
"No": "Nein",
|
"No": "Nein",
|
||||||
"Import and Export Data": "Daten importieren und exportieren",
|
"Import and Export Data": "Daten importieren und exportieren",
|
||||||
"Import": "Importieren",
|
"Import": "Importieren",
|
||||||
"Import Invidious data": "Invidious Daten importieren",
|
"Import Invidious data": "Invidious-JSON-Daten importieren",
|
||||||
"Import YouTube subscriptions": "YouTube Abonnements importieren",
|
"Import YouTube subscriptions": "YouTube-/OPML-Abonnements importieren",
|
||||||
"Import FreeTube subscriptions (.db)": "FreeTube Abonnements importieren (.db)",
|
"Import FreeTube subscriptions (.db)": "FreeTube Abonnements importieren (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "NewPipe Abonnements importieren (.json)",
|
"Import NewPipe subscriptions (.json)": "NewPipe Abonnements importieren (.json)",
|
||||||
"Import NewPipe data (.zip)": "NewPipe Daten importieren (.zip)",
|
"Import NewPipe data (.zip)": "NewPipe Daten importieren (.zip)",
|
||||||
"Export": "Exportieren",
|
"Export": "Exportieren",
|
||||||
"Export subscriptions as OPML": "Abonnements als OPML exportieren",
|
"Export subscriptions as OPML": "Abonnements als OPML exportieren",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Abonnements als OPML exportieren (für NewPipe & FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Abonnements als OPML exportieren (für NewPipe & FreeTube)",
|
||||||
"Export data as JSON": "Daten als JSON exportieren",
|
"Export data as JSON": "Invidious-Daten als JSON exportieren",
|
||||||
"Delete account?": "Konto löschen?",
|
"Delete account?": "Konto löschen?",
|
||||||
"History": "Verlauf",
|
"History": "Verlauf",
|
||||||
"An alternative front-end to YouTube": "Eine alternative Oberfläche für YouTube",
|
"An alternative front-end to YouTube": "Eine alternative Oberfläche für YouTube",
|
||||||
@@ -51,10 +51,10 @@
|
|||||||
"preferences_category_player": "Wiedergabeeinstellungen",
|
"preferences_category_player": "Wiedergabeeinstellungen",
|
||||||
"preferences_video_loop_label": "Immer wiederholen: ",
|
"preferences_video_loop_label": "Immer wiederholen: ",
|
||||||
"preferences_autoplay_label": "Automatisch abspielen: ",
|
"preferences_autoplay_label": "Automatisch abspielen: ",
|
||||||
"preferences_continue_label": "Immer automatisch nächstes Video spielen: ",
|
"preferences_continue_label": "Immer automatisch nächstes Video abspielen: ",
|
||||||
"preferences_continue_autoplay_label": "nächstes Video automatisch abspielen: ",
|
"preferences_continue_autoplay_label": "Nächstes Video automatisch abspielen: ",
|
||||||
"preferences_listen_label": "Nur Ton als Standard: ",
|
"preferences_listen_label": "Nur Ton als Standard: ",
|
||||||
"preferences_local_label": "Proxy-Videos: ",
|
"preferences_local_label": "Videos durch Proxy leiten: ",
|
||||||
"preferences_speed_label": "Standardgeschwindigkeit: ",
|
"preferences_speed_label": "Standardgeschwindigkeit: ",
|
||||||
"preferences_quality_label": "Bevorzugte Videoqualität: ",
|
"preferences_quality_label": "Bevorzugte Videoqualität: ",
|
||||||
"preferences_volume_label": "Wiedergabelautstärke: ",
|
"preferences_volume_label": "Wiedergabelautstärke: ",
|
||||||
@@ -63,12 +63,12 @@
|
|||||||
"reddit": "Reddit",
|
"reddit": "Reddit",
|
||||||
"preferences_captions_label": "Standarduntertitel: ",
|
"preferences_captions_label": "Standarduntertitel: ",
|
||||||
"Fallback captions: ": "Ersatzuntertitel: ",
|
"Fallback captions: ": "Ersatzuntertitel: ",
|
||||||
"preferences_related_videos_label": "Ähnliche Videos anzeigen? ",
|
"preferences_related_videos_label": "Ähnliche Videos anzeigen: ",
|
||||||
"preferences_annotations_label": "Standardmäßig Anmerkungen anzeigen? ",
|
"preferences_annotations_label": "Anmerkungen standardmäßig anzeigen: ",
|
||||||
"preferences_extend_desc_label": "Videobeschreibung automatisch erweitern: ",
|
"preferences_extend_desc_label": "Videobeschreibung automatisch erweitern: ",
|
||||||
"preferences_vr_mode_label": "Interaktive 360 Grad Videos: ",
|
"preferences_vr_mode_label": "Interaktive 360-Grad-Videos (erfordert WebGL): ",
|
||||||
"preferences_category_visual": "Anzeigeeinstellungen",
|
"preferences_category_visual": "Anzeigeeinstellungen",
|
||||||
"preferences_player_style_label": "Abspielgeräterstil: ",
|
"preferences_player_style_label": "Player-Stil: ",
|
||||||
"Dark mode: ": "Nachtmodus: ",
|
"Dark mode: ": "Nachtmodus: ",
|
||||||
"preferences_dark_mode_label": "Modus: ",
|
"preferences_dark_mode_label": "Modus: ",
|
||||||
"dark": "Nachtmodus",
|
"dark": "Nachtmodus",
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
"Subscriptions": "Abonnements",
|
"Subscriptions": "Abonnements",
|
||||||
"search": "Suchen",
|
"search": "Suchen",
|
||||||
"Log out": "Abmelden",
|
"Log out": "Abmelden",
|
||||||
"Released under the AGPLv3 on Github.": "Auf Github unter der AGPLv3 Lizenz veröffentlicht.",
|
"Released under the AGPLv3 on Github.": "Auf GitHub unter der AGPLv3 Lizenz veröffentlicht.",
|
||||||
"Source available here.": "Quellcode verfügbar hier.",
|
"Source available here.": "Quellcode verfügbar hier.",
|
||||||
"View JavaScript license information.": "Javascript Lizenzinformationen anzeigen.",
|
"View JavaScript license information.": "Javascript Lizenzinformationen anzeigen.",
|
||||||
"View privacy policy.": "Datenschutzerklärung einsehen.",
|
"View privacy policy.": "Datenschutzerklärung einsehen.",
|
||||||
@@ -141,7 +141,6 @@
|
|||||||
"Show less": "Weniger anzeigen",
|
"Show less": "Weniger anzeigen",
|
||||||
"Watch on YouTube": "Video auf YouTube ansehen",
|
"Watch on YouTube": "Video auf YouTube ansehen",
|
||||||
"Switch Invidious Instance": "Invidious Instanz wechseln",
|
"Switch Invidious Instance": "Invidious Instanz wechseln",
|
||||||
"Broken? Try another Invidious Instance": "Funktioniert nicht? Probiere eine andere Invidious Instanz aus",
|
|
||||||
"Hide annotations": "Anmerkungen ausblenden",
|
"Hide annotations": "Anmerkungen ausblenden",
|
||||||
"Show annotations": "Anmerkungen anzeigen",
|
"Show annotations": "Anmerkungen anzeigen",
|
||||||
"Genre: ": "Genre: ",
|
"Genre: ": "Genre: ",
|
||||||
@@ -329,47 +328,46 @@
|
|||||||
"Videos": "Videos",
|
"Videos": "Videos",
|
||||||
"Playlists": "Wiedergabelisten",
|
"Playlists": "Wiedergabelisten",
|
||||||
"Community": "Gemeinschaft",
|
"Community": "Gemeinschaft",
|
||||||
"relevance": "Relevanz",
|
"search_filters_sort_option_relevance": "Relevanz",
|
||||||
"rating": "Bewertung",
|
"search_filters_sort_option_rating": "Bewertung",
|
||||||
"date": "Datum",
|
"search_filters_sort_option_date": "Datum",
|
||||||
"views": "Aufrufe",
|
"search_filters_sort_option_views": "Aufrufe",
|
||||||
"content_type": "Inhaltstyp",
|
"search_filters_type_label": "Inhaltstyp",
|
||||||
"duration": "Dauer",
|
"search_filters_duration_label": "Dauer",
|
||||||
"features": "Eigenschaften",
|
"search_filters_features_label": "Eigenschaften",
|
||||||
"sort": "sortieren",
|
"search_filters_sort_label": "sortieren",
|
||||||
"hour": "Letzte Stunde",
|
"search_filters_date_option_hour": "Letzte Stunde",
|
||||||
"today": "Heute",
|
"search_filters_date_option_today": "Heute",
|
||||||
"week": "Diese Woche",
|
"search_filters_date_option_week": "Diese Woche",
|
||||||
"month": "Diesen Monat",
|
"search_filters_date_option_month": "Diesen Monat",
|
||||||
"year": "Dieses Jahr",
|
"search_filters_date_option_year": "Dieses Jahr",
|
||||||
"video": "Video",
|
"search_filters_type_option_video": "Video",
|
||||||
"channel": "Kanal",
|
"search_filters_type_option_channel": "Kanal",
|
||||||
"playlist": "Wiedergabeliste",
|
"search_filters_type_option_playlist": "Wiedergabeliste",
|
||||||
"movie": "Film",
|
"search_filters_type_option_movie": "Film",
|
||||||
"show": "Anzeigen",
|
"search_filters_type_option_show": "Anzeigen",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "Untertitel / CC",
|
"search_filters_features_option_subtitles": "Untertitel / CC",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "Live",
|
"search_filters_features_option_live": "Live",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "Standort",
|
"search_filters_features_option_location": "Standort",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "Filtern",
|
|
||||||
"Current version: ": "Aktuelle Version: ",
|
"Current version: ": "Aktuelle Version: ",
|
||||||
"next_steps_error_message": "Danach folgendes versuchen: ",
|
"next_steps_error_message": "Danach folgendes versuchen: ",
|
||||||
"next_steps_error_message_refresh": "Aktualisieren",
|
"next_steps_error_message_refresh": "Aktualisieren",
|
||||||
"next_steps_error_message_go_to_youtube": "Zu YouTube gehen",
|
"next_steps_error_message_go_to_youtube": "Zu YouTube gehen",
|
||||||
"footer_donate_page": "Spende",
|
"footer_donate_page": "Spende",
|
||||||
"long": "Lang (> 20 Minuten)",
|
"search_filters_duration_option_long": "Lang (> 20 Minuten)",
|
||||||
"footer_original_source_code": "Original Quellcode",
|
"footer_original_source_code": "Original Quellcode",
|
||||||
"footer_modfied_source_code": "Modifizierter Quellcode",
|
"footer_modfied_source_code": "Modifizierter Quellcode",
|
||||||
"footer_documentation": "Dokumentation",
|
"footer_documentation": "Dokumentation",
|
||||||
"footer_source_code": "Quellcode",
|
"footer_source_code": "Quellcode",
|
||||||
"adminprefs_modified_source_code_url_label": "URL zum Repositorie des modifizierten Quellcodes",
|
"adminprefs_modified_source_code_url_label": "URL zum Repositorie des modifizierten Quellcodes",
|
||||||
"short": "Kurz (< 4 Minuten)",
|
"search_filters_duration_option_short": "Kurz (< 4 Minuten)",
|
||||||
"preferences_region_label": "Land der Inhalte: ",
|
"preferences_region_label": "Land der Inhalte: ",
|
||||||
"preferences_quality_option_dash": "DASH (automatische Qualität)",
|
"preferences_quality_option_dash": "DASH (adaptive Qualität)",
|
||||||
"preferences_quality_option_hd720": "HD720",
|
"preferences_quality_option_hd720": "HD720",
|
||||||
"preferences_quality_option_medium": "Mittel",
|
"preferences_quality_option_medium": "Mittel",
|
||||||
"preferences_quality_option_small": "Niedrig",
|
"preferences_quality_option_small": "Niedrig",
|
||||||
@@ -388,15 +386,90 @@
|
|||||||
"Video unavailable": "Video nicht verfügbar",
|
"Video unavailable": "Video nicht verfügbar",
|
||||||
"user_created_playlists": "`x` Wiedergabelisten erstellt",
|
"user_created_playlists": "`x` Wiedergabelisten erstellt",
|
||||||
"user_saved_playlists": "`x` Wiedergabelisten gespeichert",
|
"user_saved_playlists": "`x` Wiedergabelisten gespeichert",
|
||||||
"preferences_save_player_pos_label": "Aktuelle Position speichern: ",
|
"preferences_save_player_pos_label": "Wiedergabeposition speichern: ",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"preferences_quality_dash_option_best": "Höchste",
|
"preferences_quality_dash_option_best": "Höchste",
|
||||||
"preferences_quality_dash_option_worst": "Niedrigste",
|
"preferences_quality_dash_option_worst": "Niedrigste",
|
||||||
"preferences_quality_dash_option_1440p": "1440p",
|
"preferences_quality_dash_option_1440p": "1440p",
|
||||||
"videoinfo_youTube_embed_link": "Eingebettet",
|
"videoinfo_youTube_embed_link": "Eingebettet",
|
||||||
"purchased": "Gekauft",
|
"search_filters_features_option_purchased": "Gekauft",
|
||||||
"none": "keine",
|
"none": "keine",
|
||||||
"videoinfo_started_streaming_x_ago": "Stream begann vor `x`",
|
"videoinfo_started_streaming_x_ago": "Stream begann vor `x`",
|
||||||
"videoinfo_watch_on_youTube": "Auf YouTube ansehen",
|
"videoinfo_watch_on_youTube": "Auf YouTube ansehen",
|
||||||
"preferences_quality_dash_label": "Bevorzugte DASH-Videoqualität: "
|
"preferences_quality_dash_label": "Bevorzugte DASH-Videoqualität: ",
|
||||||
|
"generic_subscribers_count": "{{count}} Abonnent",
|
||||||
|
"generic_subscribers_count_plural": "{{count}} Abonnenten",
|
||||||
|
"generic_videos_count": "{{count}} Video",
|
||||||
|
"generic_videos_count_plural": "{{count}} Videos",
|
||||||
|
"subscriptions_unseen_notifs_count": "{{count}} ungesehene Benachrichtung",
|
||||||
|
"subscriptions_unseen_notifs_count_plural": "{{count}} ungesehene Benachrichtungen",
|
||||||
|
"crash_page_refresh": "Versucht haben, <a href=\"`x`\">die Seite neu zu laden</a>",
|
||||||
|
"comments_view_x_replies": "{{count}} Antwort anzeigen",
|
||||||
|
"comments_view_x_replies_plural": "{{count}} Antworten anzeigen",
|
||||||
|
"generic_count_years": "{{count}} Jahr",
|
||||||
|
"generic_count_years_plural": "{{count}} Jahre",
|
||||||
|
"generic_count_weeks": "{{count}} Woche",
|
||||||
|
"generic_count_weeks_plural": "{{count}} Wochen",
|
||||||
|
"generic_count_days": "{{count}} Tag",
|
||||||
|
"generic_count_days_plural": "{{count}} Tage",
|
||||||
|
"crash_page_before_reporting": "Bevor Sie einen Bug melden, stellen Sie sicher, dass Sie:",
|
||||||
|
"crash_page_switch_instance": "Eine <a href=\"`x`\">andere Instanz</a> versucht haben",
|
||||||
|
"generic_count_hours": "{{count}} Stunde",
|
||||||
|
"generic_count_hours_plural": "{{count}} Stunden",
|
||||||
|
"generic_count_minutes": "{{count}} Minute",
|
||||||
|
"generic_count_minutes_plural": "{{count}} Minuten",
|
||||||
|
"crash_page_read_the_faq": "Das <a href=\"`x`\">FAQ</a> gelesen haben",
|
||||||
|
"crash_page_search_issue": "Nach <a href=\"`x`\">bereits gemeldeten Bugs auf GitHub</a> gesucht haben",
|
||||||
|
"crash_page_report_issue": "Wenn all dies nicht geholfen hat, <a href=\"`x`\">öffnen Sie bitte ein neues Problem (issue) auf Github</a> (vorzugsweise auf Englisch) und fügen Sie den folgenden Text in Ihre Nachricht ein (bitte übersetzen Sie diesen Text NICHT):",
|
||||||
|
"generic_views_count": "{{count}} Aufruf",
|
||||||
|
"generic_views_count_plural": "{{count}} Aufrufe",
|
||||||
|
"generic_count_seconds": "{{count}} Sekunde",
|
||||||
|
"generic_count_seconds_plural": "{{count}} Sekunden",
|
||||||
|
"generic_subscriptions_count": "{{count}} Abo",
|
||||||
|
"generic_subscriptions_count_plural": "{{count}} Abos",
|
||||||
|
"tokens_count": "{{count}} Token",
|
||||||
|
"tokens_count_plural": "{{count}} Tokens",
|
||||||
|
"comments_points_count": "{{count}} Punkt",
|
||||||
|
"comments_points_count_plural": "{{count}} Punkte",
|
||||||
|
"crash_page_you_found_a_bug": "Anscheinend haben Sie einen Fehler in Invidious gefunden!",
|
||||||
|
"generic_count_months": "{{count}} Monat",
|
||||||
|
"generic_count_months_plural": "{{count}} Monate",
|
||||||
|
"Cantonese (Hong Kong)": "Kantonesisch (Hong Kong)",
|
||||||
|
"Chinese (Hong Kong)": "Chinesisch (Hong Kong)",
|
||||||
|
"generic_playlists_count": "{{count}} Wiedergabeliste",
|
||||||
|
"generic_playlists_count_plural": "{{count}} Wiedergabelisten",
|
||||||
|
"preferences_watch_history_label": "Wiedergabeverlauf aktivieren: ",
|
||||||
|
"English (United Kingdom)": "Englisch (Vereinigtes Königreich)",
|
||||||
|
"English (United States)": "Englisch (Vereinigte Staaten)",
|
||||||
|
"Dutch (auto-generated)": "Niederländisch (automatisch generiert)",
|
||||||
|
"French (auto-generated)": "Französisch (automatisch generiert)",
|
||||||
|
"German (auto-generated)": "Deutsch (automatisch generiert)",
|
||||||
|
"Indonesian (auto-generated)": "Indonesisch (automatisch generiert)",
|
||||||
|
"Interlingue": "Interlingue",
|
||||||
|
"Italian (auto-generated)": "Italienisch (automatisch generiert)",
|
||||||
|
"Japanese (auto-generated)": "Japanisch (automatisch generiert)",
|
||||||
|
"Spanish (Mexico)": "Spanisch (Mexiko)",
|
||||||
|
"Spanish (Spain)": "Spanisch (Spanien)",
|
||||||
|
"Vietnamese (auto-generated)": "Vietnamesisch (automatisch generiert)",
|
||||||
|
"Russian (auto-generated)": "Russisch (automatisch generiert)",
|
||||||
|
"Chinese": "Chinesisch",
|
||||||
|
"Portuguese (Brazil)": "Portugiesisch (Brasilien)",
|
||||||
|
"Spanish (auto-generated)": "Spanisch (automatisch generiert)",
|
||||||
|
"Turkish (auto-generated)": "Türkisch (automatisch generiert)",
|
||||||
|
"Chinese (China)": "Chinesisch (China)",
|
||||||
|
"Chinese (Taiwan)": "Chinesisch (Taiwan)",
|
||||||
|
"Korean (auto-generated)": "Koreanisch (automatisch generiert)",
|
||||||
|
"Portuguese (auto-generated)": "Portugiesisch (automatisch generiert)",
|
||||||
|
"search_filters_title": "Filtern",
|
||||||
|
"search_message_change_filters_or_query": "Versuchen Sie, Ihre Suchanfrage zu erweitern und/oder die Filter zu ändern.",
|
||||||
|
"search_message_use_another_instance": " Sie können auch <a href=\"`x`\">auf einer anderen Instanz suchen</a>.",
|
||||||
|
"Popular enabled: ": "„Beliebt“-Seite aktiviert: ",
|
||||||
|
"search_message_no_results": "Keine Ergebnisse gefunden.",
|
||||||
|
"search_filters_duration_option_medium": "Mittel (4 - 20 Minuten)",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_type_option_all": "Beliebiger Typ",
|
||||||
|
"search_filters_apply_button": "Ausgewählte Filter anwenden",
|
||||||
|
"search_filters_duration_option_none": "Beliebige Länge",
|
||||||
|
"search_filters_date_label": "Upload-Datum",
|
||||||
|
"search_filters_date_option_none": "Beliebiges Datum"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -358,7 +358,7 @@
|
|||||||
"crash_page_before_reporting": "Πριν αναφέρετε ένα σφάλμα, βεβαιωθείτε ότι έχετε:",
|
"crash_page_before_reporting": "Πριν αναφέρετε ένα σφάλμα, βεβαιωθείτε ότι έχετε:",
|
||||||
"crash_page_refresh": "προσπαθήσει να <a href=\"`x`\">ανανεώσετε τη σελίδα</a>",
|
"crash_page_refresh": "προσπαθήσει να <a href=\"`x`\">ανανεώσετε τη σελίδα</a>",
|
||||||
"crash_page_read_the_faq": "διαβάσει τις <a href=\"`x`\">Συχνές Ερωτήσεις (ΣΕ)</a>",
|
"crash_page_read_the_faq": "διαβάσει τις <a href=\"`x`\">Συχνές Ερωτήσεις (ΣΕ)</a>",
|
||||||
"crash_page_search_issue": "αναζητήσει για <a href=\"`x`\">υπάρχοντα θέματα στο Github</a>",
|
"crash_page_search_issue": "αναζητήσει για <a href=\"`x`\">υπάρχοντα θέματα στο GitHub</a>",
|
||||||
"generic_views_count": "{{count}} προβολή",
|
"generic_views_count": "{{count}} προβολή",
|
||||||
"generic_views_count_plural": "{{count}} προβολές",
|
"generic_views_count_plural": "{{count}} προβολές",
|
||||||
"generic_videos_count": "{{count}} βίντεο",
|
"generic_videos_count": "{{count}} βίντεο",
|
||||||
@@ -373,51 +373,50 @@
|
|||||||
"preferences_region_label": "Χώρα περιεχομένου: ",
|
"preferences_region_label": "Χώρα περιεχομένου: ",
|
||||||
"preferences_category_misc": "Διάφορες προτιμήσεις",
|
"preferences_category_misc": "Διάφορες προτιμήσεις",
|
||||||
"Show more": "Εμφάνιση περισσότερων",
|
"Show more": "Εμφάνιση περισσότερων",
|
||||||
"today": "Σήμερα",
|
"search_filters_date_option_today": "Σήμερα",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"videoinfo_started_streaming_x_ago": "Ξεκίνησε η ροή `x` πριν από",
|
"videoinfo_started_streaming_x_ago": "Ξεκίνησε η ροή `x` πριν από",
|
||||||
"videoinfo_watch_on_youTube": "Παρακολουθήστε στο YouTube",
|
"videoinfo_watch_on_youTube": "Παρακολουθήστε στο YouTube",
|
||||||
"download_subtitles": "Υπότιτλοι - `x` (.vtt)",
|
"download_subtitles": "Υπότιτλοι - `x` (.vtt)",
|
||||||
"user_created_playlists": "`x` δημιουργημένες λίστες αναπαραγωγής",
|
"user_created_playlists": "`x` δημιουργημένες λίστες αναπαραγωγής",
|
||||||
"user_saved_playlists": "`x` αποθηκευμένες λίστες αναπαραγωγής",
|
"user_saved_playlists": "`x` αποθηκευμένες λίστες αναπαραγωγής",
|
||||||
"rating": "Αξιολόγηση",
|
"search_filters_sort_option_rating": "Αξιολόγηση",
|
||||||
"relevance": "Συνάφεια",
|
"search_filters_sort_option_relevance": "Συνάφεια",
|
||||||
"purchased": "Αγορασμένο",
|
"search_filters_features_option_purchased": "Αγορασμένο",
|
||||||
"date": "Ημερομηνία μεταφόρτωσης",
|
"search_filters_sort_option_date": "Ημερομηνία μεταφόρτωσης",
|
||||||
"content_type": "Τύπος",
|
"search_filters_type_label": "Τύπος",
|
||||||
"duration": "Διάρκεια",
|
"search_filters_duration_label": "Διάρκεια",
|
||||||
"week": "Αυτή την εβδομάδα",
|
"search_filters_date_option_week": "Αυτή την εβδομάδα",
|
||||||
"year": "Φέτος",
|
"search_filters_date_option_year": "Φέτος",
|
||||||
"channel": "Κανάλι",
|
"search_filters_type_option_channel": "Κανάλι",
|
||||||
"playlist": "Λίστα αναπαραγωγής",
|
"search_filters_type_option_playlist": "Λίστα αναπαραγωγής",
|
||||||
"long": "Μεγάλο (> 20 λεπτά)",
|
"search_filters_duration_option_long": "Μεγάλο (> 20 λεπτά)",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"location": "Τοποθεσία",
|
"search_filters_features_option_location": "Τοποθεσία",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"next_steps_error_message": "Μετά από αυτό θα πρέπει να προσπαθήσετε να: ",
|
"next_steps_error_message": "Μετά από αυτό θα πρέπει να προσπαθήσετε να: ",
|
||||||
"next_steps_error_message_go_to_youtube": "Μεταβείτε στο YouTube",
|
"next_steps_error_message_go_to_youtube": "Μεταβείτε στο YouTube",
|
||||||
"footer_donate_page": "Δωρεά",
|
"footer_donate_page": "Δωρεά",
|
||||||
"footer_original_source_code": "Πρωτότυπος πηγαίος κώδικας",
|
"footer_original_source_code": "Πρωτότυπος πηγαίος κώδικας",
|
||||||
"preferences_show_nick_label": "Εμφάνιση ψευδώνυμου στην κορυφή: ",
|
"preferences_show_nick_label": "Εμφάνιση ψευδώνυμου στην κορυφή: ",
|
||||||
"hour": "Τελευταία ώρα",
|
"search_filters_date_option_hour": "Τελευταία ώρα",
|
||||||
"adminprefs_modified_source_code_url_label": "URL σε αποθετήριο τροποποιημένου πηγαίου κώδικα",
|
"adminprefs_modified_source_code_url_label": "URL σε αποθετήριο τροποποιημένου πηγαίου κώδικα",
|
||||||
"subtitles": "Υπότιτλοι/CC",
|
"search_filters_features_option_subtitles": "Υπότιτλοι/CC",
|
||||||
"month": "Αυτόν τον μήνα",
|
"search_filters_date_option_month": "Αυτόν τον μήνα",
|
||||||
"Released under the AGPLv3 on Github.": "Κυκλοφορεί υπό την AGPLv3 στο Github.",
|
"Released under the AGPLv3 on Github.": "Κυκλοφορεί υπό την AGPLv3 στο GitHub.",
|
||||||
"sort": "Ταξινόμηση κατά",
|
"search_filters_sort_label": "Ταξινόμηση κατά",
|
||||||
"filter": "Φίλτρο",
|
"search_filters_type_option_movie": "Ταινία",
|
||||||
"movie": "Ταινία",
|
|
||||||
"footer_modfied_source_code": "Τροποποιημένος πηγαίος κώδικας",
|
"footer_modfied_source_code": "Τροποποιημένος πηγαίος κώδικας",
|
||||||
"features": "Χαρακτηριστικά",
|
"search_filters_features_label": "Χαρακτηριστικά",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"footer_documentation": "Τεκμηρίωση",
|
"footer_documentation": "Τεκμηρίωση",
|
||||||
"short": "Σύντομο (< 4 λεπτά)",
|
"search_filters_duration_option_short": "Σύντομο (< 4 λεπτά)",
|
||||||
"next_steps_error_message_refresh": "Ανανέωση",
|
"next_steps_error_message_refresh": "Ανανέωση",
|
||||||
"video": "Βίντεο",
|
"search_filters_type_option_video": "Βίντεο",
|
||||||
"live": "Ζωντανά",
|
"search_filters_features_option_live": "Ζωντανά",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"Search": "Αναζήτηση",
|
"Search": "Αναζήτηση",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"preferences_extend_desc_label": "Αυτόματη επέκταση της περιγραφής του βίντεο: ",
|
"preferences_extend_desc_label": "Αυτόματη επέκταση της περιγραφής του βίντεο: ",
|
||||||
"preferences_vr_mode_label": "Διαδραστικά βίντεο 360 μοιρών (απαιτεί WebGL): ",
|
"preferences_vr_mode_label": "Διαδραστικά βίντεο 360 μοιρών (απαιτεί WebGL): ",
|
||||||
"Show less": "Εμφάνιση λιγότερων",
|
"Show less": "Εμφάνιση λιγότερων",
|
||||||
@@ -448,5 +447,8 @@
|
|||||||
"none": "κανένα",
|
"none": "κανένα",
|
||||||
"videoinfo_youTube_embed_link": "Ενσωμάτωση",
|
"videoinfo_youTube_embed_link": "Ενσωμάτωση",
|
||||||
"videoinfo_invidious_embed_link": "Σύνδεσμος Ενσωμάτωσης",
|
"videoinfo_invidious_embed_link": "Σύνδεσμος Ενσωμάτωσης",
|
||||||
"show": "Μπάρα προόδου διαβάσματος"
|
"search_filters_type_option_show": "Μπάρα προόδου διαβάσματος",
|
||||||
|
"preferences_watch_history_label": "Ενεργοποίηση ιστορικού παρακολούθησης: ",
|
||||||
|
"search_filters_title": "Φίλτρο",
|
||||||
|
"search_message_no_results": "Δεν"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@
|
|||||||
"preferences_watch_history_label": "Enable watch history: ",
|
"preferences_watch_history_label": "Enable watch history: ",
|
||||||
"preferences_speed_label": "Default speed: ",
|
"preferences_speed_label": "Default speed: ",
|
||||||
"preferences_quality_label": "Preferred video quality: ",
|
"preferences_quality_label": "Preferred video quality: ",
|
||||||
"preferences_quality_option_dash": "DASH (adaptative quality)",
|
"preferences_quality_option_dash": "DASH (adaptive quality)",
|
||||||
"preferences_quality_option_hd720": "HD720",
|
"preferences_quality_option_hd720": "HD720",
|
||||||
"preferences_quality_option_medium": "Medium",
|
"preferences_quality_option_medium": "Medium",
|
||||||
"preferences_quality_option_small": "Small",
|
"preferences_quality_option_small": "Small",
|
||||||
@@ -136,6 +136,7 @@
|
|||||||
"preferences_default_home_label": "Default homepage: ",
|
"preferences_default_home_label": "Default homepage: ",
|
||||||
"preferences_feed_menu_label": "Feed menu: ",
|
"preferences_feed_menu_label": "Feed menu: ",
|
||||||
"preferences_show_nick_label": "Show nickname on top: ",
|
"preferences_show_nick_label": "Show nickname on top: ",
|
||||||
|
"Popular enabled: ": "Popular enabled: ",
|
||||||
"Top enabled: ": "Top enabled: ",
|
"Top enabled: ": "Top enabled: ",
|
||||||
"CAPTCHA enabled: ": "CAPTCHA enabled: ",
|
"CAPTCHA enabled: ": "CAPTCHA enabled: ",
|
||||||
"Login enabled: ": "Login enabled: ",
|
"Login enabled: ": "Login enabled: ",
|
||||||
@@ -155,7 +156,7 @@
|
|||||||
"subscriptions_unseen_notifs_count_plural": "{{count}} unseen notifications",
|
"subscriptions_unseen_notifs_count_plural": "{{count}} unseen notifications",
|
||||||
"search": "search",
|
"search": "search",
|
||||||
"Log out": "Log out",
|
"Log out": "Log out",
|
||||||
"Released under the AGPLv3 on Github.": "Released under the AGPLv3 on Github.",
|
"Released under the AGPLv3 on Github.": "Released under the AGPLv3 on GitHub.",
|
||||||
"Source available here.": "Source available here.",
|
"Source available here.": "Source available here.",
|
||||||
"View JavaScript license information.": "View JavaScript license information.",
|
"View JavaScript license information.": "View JavaScript license information.",
|
||||||
"View privacy policy.": "View privacy policy.",
|
"View privacy policy.": "View privacy policy.",
|
||||||
@@ -175,7 +176,9 @@
|
|||||||
"Show less": "Show less",
|
"Show less": "Show less",
|
||||||
"Watch on YouTube": "Watch on YouTube",
|
"Watch on YouTube": "Watch on YouTube",
|
||||||
"Switch Invidious Instance": "Switch Invidious Instance",
|
"Switch Invidious Instance": "Switch Invidious Instance",
|
||||||
"Broken? Try another Invidious Instance": "Broken? Try another Invidious Instance",
|
"search_message_no_results": "No results found.",
|
||||||
|
"search_message_change_filters_or_query": "Try widening your search query and/or changing the filters.",
|
||||||
|
"search_message_use_another_instance": " You can also <a href=\"`x`\">search on another instance</a>.",
|
||||||
"Hide annotations": "Hide annotations",
|
"Hide annotations": "Hide annotations",
|
||||||
"Show annotations": "Show annotations",
|
"Show annotations": "Show annotations",
|
||||||
"Genre: ": "Genre: ",
|
"Genre: ": "Genre: ",
|
||||||
@@ -404,37 +407,44 @@
|
|||||||
"Videos": "Videos",
|
"Videos": "Videos",
|
||||||
"Playlists": "Playlists",
|
"Playlists": "Playlists",
|
||||||
"Community": "Community",
|
"Community": "Community",
|
||||||
"relevance": "Relevance",
|
"search_filters_title": "Filters",
|
||||||
"rating": "Rating",
|
"search_filters_date_label": "Upload date",
|
||||||
"date": "Upload date",
|
"search_filters_date_option_none": "Any date",
|
||||||
"views": "View count",
|
"search_filters_date_option_hour": "Last Hour",
|
||||||
"content_type": "Type",
|
"search_filters_date_option_today": "Today",
|
||||||
"duration": "Duration",
|
"search_filters_date_option_week": "This week",
|
||||||
"features": "Features",
|
"search_filters_date_option_month": "This month",
|
||||||
"sort": "Sort By",
|
"search_filters_date_option_year": "This year",
|
||||||
"hour": "Last Hour",
|
"search_filters_type_label": "Type",
|
||||||
"today": "Today",
|
"search_filters_type_option_all": "Any type",
|
||||||
"week": "This week",
|
"search_filters_type_option_video": "Video",
|
||||||
"month": "This month",
|
"search_filters_type_option_channel": "Channel",
|
||||||
"year": "This year",
|
"search_filters_type_option_playlist": "Playlist",
|
||||||
"video": "Video",
|
"search_filters_type_option_movie": "Movie",
|
||||||
"channel": "Channel",
|
"search_filters_type_option_show": "Show",
|
||||||
"playlist": "Playlist",
|
"search_filters_duration_label": "Duration",
|
||||||
"movie": "Movie",
|
"search_filters_duration_option_none": "Any duration",
|
||||||
"show": "Show",
|
"search_filters_duration_option_short": "Short (< 4 minutes)",
|
||||||
"short": "Short (< 4 minutes)",
|
"search_filters_duration_option_medium": "Medium (4 - 20 minutes)",
|
||||||
"long": "Long (> 20 minutes)",
|
"search_filters_duration_option_long": "Long (> 20 minutes)",
|
||||||
"hd": "HD",
|
"search_filters_features_label": "Features",
|
||||||
"subtitles": "Subtitles/CC",
|
"search_filters_features_option_live": "Live",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"3d": "3D",
|
"search_filters_features_option_hd": "HD",
|
||||||
"live": "Live",
|
"search_filters_features_option_subtitles": "Subtitles/CC",
|
||||||
"4k": "4K",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"location": "Location",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_vr180": "VR180",
|
||||||
"purchased": "Purchased",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"360": "360°",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "Filter",
|
"search_filters_features_option_location": "Location",
|
||||||
|
"search_filters_features_option_purchased": "Purchased",
|
||||||
|
"search_filters_sort_label": "Sort By",
|
||||||
|
"search_filters_sort_option_relevance": "Relevance",
|
||||||
|
"search_filters_sort_option_rating": "Rating",
|
||||||
|
"search_filters_sort_option_date": "Upload Date",
|
||||||
|
"search_filters_sort_option_views": "View count",
|
||||||
|
"search_filters_apply_button": "Apply selected filters",
|
||||||
"Current version: ": "Current version: ",
|
"Current version: ": "Current version: ",
|
||||||
"next_steps_error_message": "After which you should try to: ",
|
"next_steps_error_message": "After which you should try to: ",
|
||||||
"next_steps_error_message_refresh": "Refresh",
|
"next_steps_error_message_refresh": "Refresh",
|
||||||
@@ -459,7 +469,7 @@
|
|||||||
"crash_page_before_reporting": "Before reporting a bug, make sure that you have:",
|
"crash_page_before_reporting": "Before reporting a bug, make sure that you have:",
|
||||||
"crash_page_refresh": "tried to <a href=\"`x`\">refresh the page</a>",
|
"crash_page_refresh": "tried to <a href=\"`x`\">refresh the page</a>",
|
||||||
"crash_page_switch_instance": "tried to <a href=\"`x`\">use another instance</a>",
|
"crash_page_switch_instance": "tried to <a href=\"`x`\">use another instance</a>",
|
||||||
"crash_page_read_the_faq": "read the <a href=\"`x`\">Frenquently Asked Questions (FAQ)</a>",
|
"crash_page_read_the_faq": "read the <a href=\"`x`\">Frequently Asked Questions (FAQ)</a>",
|
||||||
"crash_page_search_issue": "searched for <a href=\"`x`\">existing issues on Github</a>",
|
"crash_page_search_issue": "searched for <a href=\"`x`\">existing issues on GitHub</a>",
|
||||||
"crash_page_report_issue": "If none of the above helped, please <a href=\"`x`\">open a new issue on GitHub</a> (preferably in English) and include the following text in your message (do NOT translate that text):"
|
"crash_page_report_issue": "If none of the above helped, please <a href=\"`x`\">open a new issue on GitHub</a> (preferably in English) and include the following text in your message (do NOT translate that text):"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,7 +121,7 @@
|
|||||||
"Subscriptions": "Abonoj",
|
"Subscriptions": "Abonoj",
|
||||||
"search": "serĉi",
|
"search": "serĉi",
|
||||||
"Log out": "Elsaluti",
|
"Log out": "Elsaluti",
|
||||||
"Released under the AGPLv3 on Github.": "Eldonita sub la AGPLv3 en Github.",
|
"Released under the AGPLv3 on Github.": "Eldonita sub la AGPLv3 en GitHub.",
|
||||||
"Source available here.": "Fonto havebla ĉi tie.",
|
"Source available here.": "Fonto havebla ĉi tie.",
|
||||||
"View JavaScript license information.": "Vidi Ĝavoskriptan licencan informon.",
|
"View JavaScript license information.": "Vidi Ĝavoskriptan licencan informon.",
|
||||||
"View privacy policy.": "Vidi regularon pri privateco.",
|
"View privacy policy.": "Vidi regularon pri privateco.",
|
||||||
@@ -141,7 +141,6 @@
|
|||||||
"Show less": "Montri malpli",
|
"Show less": "Montri malpli",
|
||||||
"Watch on YouTube": "Vidi filmeton en JuTubo",
|
"Watch on YouTube": "Vidi filmeton en JuTubo",
|
||||||
"Switch Invidious Instance": "Ŝanĝi instalaĵon de Indivious",
|
"Switch Invidious Instance": "Ŝanĝi instalaĵon de Indivious",
|
||||||
"Broken? Try another Invidious Instance": "Ĉu misfunkcio? Provu alian instalaĵon de Indivious",
|
|
||||||
"Hide annotations": "Kaŝi prinotojn",
|
"Hide annotations": "Kaŝi prinotojn",
|
||||||
"Show annotations": "Montri prinotojn",
|
"Show annotations": "Montri prinotojn",
|
||||||
"Genre: ": "Ĝenro: ",
|
"Genre: ": "Ĝenro: ",
|
||||||
@@ -329,39 +328,38 @@
|
|||||||
"Videos": "Filmetoj",
|
"Videos": "Filmetoj",
|
||||||
"Playlists": "Ludlistoj",
|
"Playlists": "Ludlistoj",
|
||||||
"Community": "Komunumo",
|
"Community": "Komunumo",
|
||||||
"relevance": "rilateco",
|
"search_filters_sort_option_relevance": "rilateco",
|
||||||
"rating": "takso",
|
"search_filters_sort_option_rating": "takso",
|
||||||
"date": "dato",
|
"search_filters_sort_option_date": "dato",
|
||||||
"views": "vidoj",
|
"search_filters_sort_option_views": "vidoj",
|
||||||
"content_type": "enhavtipo",
|
"search_filters_type_label": "enhavtipo",
|
||||||
"duration": "daŭro",
|
"search_filters_duration_label": "daŭro",
|
||||||
"features": "trajtoj",
|
"search_filters_features_label": "trajtoj",
|
||||||
"sort": "ordigi",
|
"search_filters_sort_label": "ordigi",
|
||||||
"hour": "horo",
|
"search_filters_date_option_hour": "horo",
|
||||||
"today": "hodiaŭ",
|
"search_filters_date_option_today": "hodiaŭ",
|
||||||
"week": "semajno",
|
"search_filters_date_option_week": "semajno",
|
||||||
"month": "monato",
|
"search_filters_date_option_month": "monato",
|
||||||
"year": "jaro",
|
"search_filters_date_option_year": "jaro",
|
||||||
"video": "filmeto",
|
"search_filters_type_option_video": "filmeto",
|
||||||
"channel": "kanalo",
|
"search_filters_type_option_channel": "kanalo",
|
||||||
"playlist": "ludlisto",
|
"search_filters_type_option_playlist": "ludlisto",
|
||||||
"movie": "filmo",
|
"search_filters_type_option_movie": "filmo",
|
||||||
"show": "spektaĵo",
|
"search_filters_type_option_show": "spektaĵo",
|
||||||
"hd": "altdistingiva",
|
"search_filters_features_option_hd": "altdistingiva",
|
||||||
"subtitles": "subtekstoj",
|
"search_filters_features_option_subtitles": "subtekstoj",
|
||||||
"creative_commons": "Krea Komunaĵo",
|
"search_filters_features_option_c_commons": "Krea Komunaĵo",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "nuna",
|
"search_filters_features_option_live": "nuna",
|
||||||
"4k": "4k",
|
"search_filters_features_option_four_k": "4k",
|
||||||
"location": "loko",
|
"search_filters_features_option_location": "loko",
|
||||||
"hdr": "granddinamikgama",
|
"search_filters_features_option_hdr": "granddinamikgama",
|
||||||
"filter": "filtri",
|
|
||||||
"Current version: ": "Nuna versio: ",
|
"Current version: ": "Nuna versio: ",
|
||||||
"next_steps_error_message": "Poste, vi provu: ",
|
"next_steps_error_message": "Poste, vi provu: ",
|
||||||
"next_steps_error_message_refresh": "Reŝargi",
|
"next_steps_error_message_refresh": "Reŝargi",
|
||||||
"next_steps_error_message_go_to_youtube": "Iri al JuTubo",
|
"next_steps_error_message_go_to_youtube": "Iri al JuTubo",
|
||||||
"long": "Longa (> 20 minutos)",
|
"search_filters_duration_option_long": "Longa (> 20 minutos)",
|
||||||
"short": "Mallonga (< 4 minutos)",
|
"search_filters_duration_option_short": "Mallonga (< 4 minutos)",
|
||||||
"footer_documentation": "Dokumentaro",
|
"footer_documentation": "Dokumentaro",
|
||||||
"footer_source_code": "Fontkodo",
|
"footer_source_code": "Fontkodo",
|
||||||
"adminprefs_modified_source_code_url_label": "URL al modifita deponejo de fontkodo",
|
"adminprefs_modified_source_code_url_label": "URL al modifita deponejo de fontkodo",
|
||||||
@@ -369,5 +367,6 @@
|
|||||||
"footer_original_source_code": "Originala fontkodo",
|
"footer_original_source_code": "Originala fontkodo",
|
||||||
"footer_donate_page": "Donaci",
|
"footer_donate_page": "Donaci",
|
||||||
"preferences_region_label": "Lando de la enhavo: ",
|
"preferences_region_label": "Lando de la enhavo: ",
|
||||||
"preferences_quality_dash_label": "Preferata DASH-a videkvalito: "
|
"preferences_quality_dash_label": "Preferata DASH-a videkvalito: ",
|
||||||
|
"search_filters_title": "Filtri"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,7 +121,7 @@
|
|||||||
"Subscriptions": "Suscripciones",
|
"Subscriptions": "Suscripciones",
|
||||||
"search": "buscar",
|
"search": "buscar",
|
||||||
"Log out": "Cerrar la sesión",
|
"Log out": "Cerrar la sesión",
|
||||||
"Released under the AGPLv3 on Github.": "Publicado bajo la AGPLv3 en Github.",
|
"Released under the AGPLv3 on Github.": "Publicado bajo la AGPLv3 en GitHub.",
|
||||||
"Source available here.": "Código fuente disponible aquí.",
|
"Source available here.": "Código fuente disponible aquí.",
|
||||||
"View JavaScript license information.": "Ver información de licencia de JavaScript.",
|
"View JavaScript license information.": "Ver información de licencia de JavaScript.",
|
||||||
"View privacy policy.": "Ver la política de privacidad.",
|
"View privacy policy.": "Ver la política de privacidad.",
|
||||||
@@ -141,7 +141,6 @@
|
|||||||
"Show less": "Mostrar menos",
|
"Show less": "Mostrar menos",
|
||||||
"Watch on YouTube": "Ver el vídeo en YouTube",
|
"Watch on YouTube": "Ver el vídeo en YouTube",
|
||||||
"Switch Invidious Instance": "Cambiar Instancia de Invidious",
|
"Switch Invidious Instance": "Cambiar Instancia de Invidious",
|
||||||
"Broken? Try another Invidious Instance": "¿Algún error? Prueba otra instancia de Invidious",
|
|
||||||
"Hide annotations": "Ocultar anotaciones",
|
"Hide annotations": "Ocultar anotaciones",
|
||||||
"Show annotations": "Mostrar anotaciones",
|
"Show annotations": "Mostrar anotaciones",
|
||||||
"Genre: ": "Género: ",
|
"Genre: ": "Género: ",
|
||||||
@@ -196,7 +195,7 @@
|
|||||||
"Hidden field \"token\" is a required field": "El campo oculto «símbolo» es un campo obligatorio",
|
"Hidden field \"token\" is a required field": "El campo oculto «símbolo» es un campo obligatorio",
|
||||||
"Erroneous challenge": "Desafío no válido",
|
"Erroneous challenge": "Desafío no válido",
|
||||||
"Erroneous token": "Símbolo no válido",
|
"Erroneous token": "Símbolo no válido",
|
||||||
"No such user": "Usuario no válido",
|
"No such user": "Usuario no existe",
|
||||||
"Token is expired, please try again": "El símbolo ha caducado, inténtelo de nuevo",
|
"Token is expired, please try again": "El símbolo ha caducado, inténtelo de nuevo",
|
||||||
"English": "Inglés",
|
"English": "Inglés",
|
||||||
"English (auto-generated)": "Inglés (generados automáticamente)",
|
"English (auto-generated)": "Inglés (generados automáticamente)",
|
||||||
@@ -329,39 +328,38 @@
|
|||||||
"Videos": "Vídeos",
|
"Videos": "Vídeos",
|
||||||
"Playlists": "Listas de reproducción",
|
"Playlists": "Listas de reproducción",
|
||||||
"Community": "Comunidad",
|
"Community": "Comunidad",
|
||||||
"relevance": "relevancia",
|
"search_filters_sort_option_relevance": "relevancia",
|
||||||
"rating": "valoración",
|
"search_filters_sort_option_rating": "valoración",
|
||||||
"date": "fecha",
|
"search_filters_sort_option_date": "fecha",
|
||||||
"views": "visualizaciones",
|
"search_filters_sort_option_views": "visualizaciones",
|
||||||
"content_type": "content_type",
|
"search_filters_type_label": "content_type",
|
||||||
"duration": "duración",
|
"search_filters_duration_label": "duración",
|
||||||
"features": "funcionalidades",
|
"search_filters_features_label": "funcionalidades",
|
||||||
"sort": "ordenar",
|
"search_filters_sort_label": "ordenar",
|
||||||
"hour": "hora",
|
"search_filters_date_option_hour": "hora",
|
||||||
"today": "hoy",
|
"search_filters_date_option_today": "hoy",
|
||||||
"week": "semana",
|
"search_filters_date_option_week": "semana",
|
||||||
"month": "mes",
|
"search_filters_date_option_month": "mes",
|
||||||
"year": "año",
|
"search_filters_date_option_year": "año",
|
||||||
"video": "vídeo",
|
"search_filters_type_option_video": "vídeo",
|
||||||
"channel": "canal",
|
"search_filters_type_option_channel": "canal",
|
||||||
"playlist": "lista de reproducción",
|
"search_filters_type_option_playlist": "lista de reproducción",
|
||||||
"movie": "película",
|
"search_filters_type_option_movie": "película",
|
||||||
"show": "programa",
|
"search_filters_type_option_show": "programa",
|
||||||
"hd": "hd",
|
"search_filters_features_option_hd": "hd",
|
||||||
"subtitles": "subtítulos",
|
"search_filters_features_option_subtitles": "subtítulos",
|
||||||
"creative_commons": "creative_commons",
|
"search_filters_features_option_c_commons": "creative_commons",
|
||||||
"3d": "3d",
|
"search_filters_features_option_three_d": "3d",
|
||||||
"live": "directo",
|
"search_filters_features_option_live": "directo",
|
||||||
"4k": "4k",
|
"search_filters_features_option_four_k": "4k",
|
||||||
"location": "ubicación",
|
"search_filters_features_option_location": "ubicación",
|
||||||
"hdr": "hdr",
|
"search_filters_features_option_hdr": "hdr",
|
||||||
"filter": "filtro",
|
|
||||||
"Current version: ": "Versión actual: ",
|
"Current version: ": "Versión actual: ",
|
||||||
"next_steps_error_message": "Después de lo cual deberías intentar: ",
|
"next_steps_error_message": "Después de lo cual deberías intentar: ",
|
||||||
"next_steps_error_message_refresh": "Recargar",
|
"next_steps_error_message_refresh": "Recargar la página",
|
||||||
"next_steps_error_message_go_to_youtube": "Ir a YouTube",
|
"next_steps_error_message_go_to_youtube": "Ir a YouTube",
|
||||||
"short": "Corto (< 4 minutos)",
|
"search_filters_duration_option_short": "Corto (< 4 minutos)",
|
||||||
"long": "Largo (> 20 minutos)",
|
"search_filters_duration_option_long": "Largo (> 20 minutos)",
|
||||||
"footer_documentation": "Documentación",
|
"footer_documentation": "Documentación",
|
||||||
"footer_original_source_code": "Código fuente original",
|
"footer_original_source_code": "Código fuente original",
|
||||||
"adminprefs_modified_source_code_url_label": "URL al repositorio de código fuente modificado",
|
"adminprefs_modified_source_code_url_label": "URL al repositorio de código fuente modificado",
|
||||||
@@ -395,8 +393,8 @@
|
|||||||
"preferences_quality_dash_option_worst": "La peor",
|
"preferences_quality_dash_option_worst": "La peor",
|
||||||
"videoinfo_invidious_embed_link": "Enlace para Insertar",
|
"videoinfo_invidious_embed_link": "Enlace para Insertar",
|
||||||
"preferences_quality_dash_option_1080p": "1080p",
|
"preferences_quality_dash_option_1080p": "1080p",
|
||||||
"purchased": "Comprado",
|
"search_filters_features_option_purchased": "Comprado",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"videoinfo_watch_on_youTube": "Ver en YouTube",
|
"videoinfo_watch_on_youTube": "Ver en YouTube",
|
||||||
"preferences_save_player_pos_label": "Guardar posición de reproducción: ",
|
"preferences_save_player_pos_label": "Guardar posición de reproducción: ",
|
||||||
"generic_views_count": "{{count}} visualización",
|
"generic_views_count": "{{count}} visualización",
|
||||||
@@ -432,7 +430,7 @@
|
|||||||
"crash_page_before_reporting": "Antes de notificar un error asegúrate de que has:",
|
"crash_page_before_reporting": "Antes de notificar un error asegúrate de que has:",
|
||||||
"crash_page_switch_instance": "probado a <a href=\"`x`\">usar otra instancia</a>",
|
"crash_page_switch_instance": "probado a <a href=\"`x`\">usar otra instancia</a>",
|
||||||
"crash_page_read_the_faq": "leído las <a href=\"`x`\">Preguntas Frecuentes</a>",
|
"crash_page_read_the_faq": "leído las <a href=\"`x`\">Preguntas Frecuentes</a>",
|
||||||
"crash_page_search_issue": "buscado <a href=\"`x`\">problemas existentes en Github</a>",
|
"crash_page_search_issue": "buscado <a href=\"`x`\">problemas existentes en GitHub</a>",
|
||||||
"crash_page_you_found_a_bug": "¡Parece que has encontrado un error en Invidious!",
|
"crash_page_you_found_a_bug": "¡Parece que has encontrado un error en Invidious!",
|
||||||
"crash_page_refresh": "probado a <a href=\"`x`\">recargar la página</a>",
|
"crash_page_refresh": "probado a <a href=\"`x`\">recargar la página</a>",
|
||||||
"crash_page_report_issue": "Si nada de lo anterior ha sido de ayuda, por favor, <a href=\"`x`\">abre una nueva incidencia en GitHub</a> (preferiblemente en inglés) e incluye el siguiente texto en tu mensaje (NO traduzcas este texto):",
|
"crash_page_report_issue": "Si nada de lo anterior ha sido de ayuda, por favor, <a href=\"`x`\">abre una nueva incidencia en GitHub</a> (preferiblemente en inglés) e incluye el siguiente texto en tu mensaje (NO traduzcas este texto):",
|
||||||
@@ -459,5 +457,18 @@
|
|||||||
"Korean (auto-generated)": "Coreano (generados automáticamente)",
|
"Korean (auto-generated)": "Coreano (generados automáticamente)",
|
||||||
"Spanish (Mexico)": "Español (Méjico)",
|
"Spanish (Mexico)": "Español (Méjico)",
|
||||||
"Spanish (auto-generated)": "Español (generados automáticamente)",
|
"Spanish (auto-generated)": "Español (generados automáticamente)",
|
||||||
"preferences_watch_history_label": "Habilitar historial de reproducciones: "
|
"preferences_watch_history_label": "Habilitar historial de reproducciones: ",
|
||||||
|
"search_message_no_results": "No se han encontrado resultados.",
|
||||||
|
"search_message_change_filters_or_query": "Pruebe ampliar la consulta de búsqueda y/o a cambiar los filtros.",
|
||||||
|
"search_filters_title": "Filtros",
|
||||||
|
"search_filters_date_label": "Fecha de subida",
|
||||||
|
"search_filters_date_option_none": "Cualquier fecha",
|
||||||
|
"search_filters_type_option_all": "Cualquier tipo",
|
||||||
|
"search_filters_duration_option_none": "Cualquier duración",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_apply_button": "Aplicar filtros seleccionados",
|
||||||
|
"tokens_count": "{{count}} token",
|
||||||
|
"tokens_count_plural": "{{count}} tokens",
|
||||||
|
"search_message_use_another_instance": " También puede <a href=\"`x`\">buscar en otra instancia</a>.",
|
||||||
|
"search_filters_duration_option_medium": "Medio (4 - 20 minutes)"
|
||||||
}
|
}
|
||||||
|
|||||||
338
locales/et.json
Normal file
338
locales/et.json
Normal file
@@ -0,0 +1,338 @@
|
|||||||
|
{
|
||||||
|
"generic_playlists_count": "{{count}} esitusloend",
|
||||||
|
"generic_playlists_count_plural": "{{count}} esindusloendit",
|
||||||
|
"LIVE": "OTSEÜLEKANNE",
|
||||||
|
"View channel on YouTube": "Vaata kanalit YouTube'is",
|
||||||
|
"Log in": "Logi sisse",
|
||||||
|
"Log in/register": "Logi sisse/registreeru",
|
||||||
|
"Dark mode: ": "Tume režiim: ",
|
||||||
|
"generic_videos_count": "{{count}} video",
|
||||||
|
"generic_videos_count_plural": "{{count}} videot",
|
||||||
|
"generic_subscribers_count": "{{count}} tellija",
|
||||||
|
"generic_subscribers_count_plural": "{{count}} tellijat",
|
||||||
|
"generic_subscriptions_count": "{{count}} tellimus",
|
||||||
|
"generic_subscriptions_count_plural": "{{count}} tellimust",
|
||||||
|
"Shared `x` ago": "Jagatud `x` tagasi",
|
||||||
|
"Unsubscribe": "Loobu tellimusest",
|
||||||
|
"Subscribe": "Telli",
|
||||||
|
"View playlist on YouTube": "Vaata esitusloendit YouTube'is",
|
||||||
|
"newest": "uusimad",
|
||||||
|
"oldest": "vanimad",
|
||||||
|
"popular": "populaarsed",
|
||||||
|
"last": "viimane",
|
||||||
|
"Next page": "Järgmine leht",
|
||||||
|
"Previous page": "Eelmine leht",
|
||||||
|
"Clear watch history?": "Kustuta vaatamiste ajalugu?",
|
||||||
|
"New password": "Uus salasõna",
|
||||||
|
"New passwords must match": "Uued salasõnad peavad ühtima",
|
||||||
|
"Cannot change password for Google accounts": "Google'i kasutaja salasõna ei saa muuta",
|
||||||
|
"Import and Export Data": "Impordi ja ekspordi andmed",
|
||||||
|
"Import": "Impordi",
|
||||||
|
"Import YouTube subscriptions": "Impordi tellimused Youtube'ist/OPML-ist",
|
||||||
|
"Import FreeTube subscriptions (.db)": "Impordi tellimused FreeTube'ist (.db)",
|
||||||
|
"Import NewPipe data (.zip)": "Impordi NewPipe'i andmed (.zip)",
|
||||||
|
"Export": "Ekspordi",
|
||||||
|
"Export subscriptions as OPML": "Ekspordi tellimused OPML-ina",
|
||||||
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Ekspordi tellimused OPML-ina (NewPipe'i ja FreeTube'i jaoks)",
|
||||||
|
"Delete account?": "Kustuta kasutaja?",
|
||||||
|
"History": "Ajalugu",
|
||||||
|
"JavaScript license information": "JavaScripti litsentsi info",
|
||||||
|
"source": "allikas",
|
||||||
|
"Log in with Google": "Logi sisse Google'iga",
|
||||||
|
"User ID": "Kasutada ID",
|
||||||
|
"Password": "Salasõna",
|
||||||
|
"Time (h:mm:ss):": "Aeg (h:mm:ss):",
|
||||||
|
"Text CAPTCHA": "CAPTCHA-tekst",
|
||||||
|
"Image CAPTCHA": "CAPTCHA-foto",
|
||||||
|
"Sign In": "Logi sisse",
|
||||||
|
"Register": "Registreeru",
|
||||||
|
"E-mail": "E-post",
|
||||||
|
"Preferences": "Eelistused",
|
||||||
|
"preferences_category_player": "Mängija eelistused",
|
||||||
|
"preferences_continue_autoplay_label": "Mängi järgmine video automaatselt: ",
|
||||||
|
"preferences_quality_label": "Eelistatud videokvaliteet: ",
|
||||||
|
"preferences_quality_option_dash": "DASH (kohanduv kvaliteet)",
|
||||||
|
"preferences_quality_option_hd720": "HD720",
|
||||||
|
"preferences_quality_option_medium": "Keskmine",
|
||||||
|
"preferences_quality_option_small": "Väike",
|
||||||
|
"preferences_quality_dash_label": "Eelistatav DASH-video kvaliteet: ",
|
||||||
|
"preferences_quality_dash_option_auto": "Automaatne",
|
||||||
|
"preferences_quality_dash_option_best": "Parim",
|
||||||
|
"preferences_quality_dash_option_worst": "Halvim",
|
||||||
|
"preferences_volume_label": "Video helitugevus: ",
|
||||||
|
"youtube": "YouTube",
|
||||||
|
"reddit": "Reddit",
|
||||||
|
"preferences_related_videos_label": "Näita sarnaseid videosid: ",
|
||||||
|
"preferences_vr_mode_label": "Interaktiivne 360-kraadine video (vajalik WebGL): ",
|
||||||
|
"preferences_dark_mode_label": "Teema: ",
|
||||||
|
"dark": "tume",
|
||||||
|
"light": "hele",
|
||||||
|
"preferences_category_subscription": "Tellimuse seaded",
|
||||||
|
"preferences_max_results_label": "Avalehel näidatavate videote arv: ",
|
||||||
|
"preferences_sort_label": "Sorteeri: ",
|
||||||
|
"published": "avaldatud",
|
||||||
|
"alphabetically": "tähestikulises järjekorras",
|
||||||
|
"alphabetically - reverse": "vastupidi tähestikulises järjekorras",
|
||||||
|
"channel name": "kanali nimi",
|
||||||
|
"preferences_unseen_only_label": "Näita ainult vaatamata videosid: ",
|
||||||
|
"Only show latest video from channel: ": "Näita ainult viimast videot: ",
|
||||||
|
"preferences_notifications_only_label": "Näita ainult teavitusi (kui neid on): ",
|
||||||
|
"Enable web notifications": "Luba veebiteavitused",
|
||||||
|
"`x` uploaded a video": "`x` laadis video üles",
|
||||||
|
"`x` is live": "`x` teeb otseülekannet",
|
||||||
|
"preferences_category_data": "Andme-eelistused",
|
||||||
|
"Clear watch history": "Puhasta vaatamisajalugu",
|
||||||
|
"Import/export data": "Impordi/ekspordi andmed",
|
||||||
|
"Change password": "Muuda salasõna",
|
||||||
|
"Watch history": "Vaatamisajalugu",
|
||||||
|
"Delete account": "Kustuta kasutaja",
|
||||||
|
"Save preferences": "Salvesta eelistused",
|
||||||
|
"Token": "Token",
|
||||||
|
"Import/export": "Imprort/eksport",
|
||||||
|
"unsubscribe": "loobu tellimusest",
|
||||||
|
"Subscriptions": "Tellimused",
|
||||||
|
"search": "otsi",
|
||||||
|
"Source available here.": "Allikas on kättesaadaval siin.",
|
||||||
|
"View privacy policy.": "Vaata privaatsuspoliitikat.",
|
||||||
|
"Public": "Avalik",
|
||||||
|
"Private": "Privaatne",
|
||||||
|
"View all playlists": "Vaata kõiki esitusloendeid",
|
||||||
|
"Updated `x` ago": "Uuendas `x` tagasi",
|
||||||
|
"Delete playlist `x`?": "Kustuta esitusloend `x`?",
|
||||||
|
"Delete playlist": "Kustuta esitusloend",
|
||||||
|
"Create playlist": "Loo esitlusloend",
|
||||||
|
"Title": "Pealkiri",
|
||||||
|
"Playlist privacy": "Esitusloendi privaatsus",
|
||||||
|
"Show more": "Näita rohkem",
|
||||||
|
"Show less": "Näita vähem",
|
||||||
|
"Watch on YouTube": "Vaata YouTube'is",
|
||||||
|
"search_message_no_results": "Tulemusi ei leitud.",
|
||||||
|
"search_message_change_filters_or_query": "Proovi otsingut laiendada või filtreid muuta.",
|
||||||
|
"Genre: ": "Žanr: ",
|
||||||
|
"License: ": "Litsents: ",
|
||||||
|
"Family friendly? ": "Peresõbralik? ",
|
||||||
|
"Shared `x`": "Jagas `x`",
|
||||||
|
"Premieres in `x`": "Esilinastub `x`",
|
||||||
|
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Tundub, et oled JavaScripti välja lülitanud. Vajuta siia, et kommentaare vaadata; nende laadimine võib võtta natukene rohkem aega.",
|
||||||
|
"View Reddit comments": "Vaata Redditi kommentaare",
|
||||||
|
"Hide replies": "Peida vastused",
|
||||||
|
"Show replies": "Näita vastuseid",
|
||||||
|
"Incorrect password": "Vale salasõna",
|
||||||
|
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Sisselogimine ei õnnestunud. Asi võib olla selles, et",
|
||||||
|
"Wrong answer": "Vale vastus",
|
||||||
|
"User ID is a required field": "Kasutaja ID on kohustuslik väli",
|
||||||
|
"Password is a required field": "Salasõna on kohustuslik väli",
|
||||||
|
"Wrong username or password": "Vale kasutajanimi või salasõna",
|
||||||
|
"Please sign in using 'Log in with Google'": "Palun kasutage 'Logi sisse Google'iga'",
|
||||||
|
"Password cannot be longer than 55 characters": "Salasõna ei tohi olla pikem kui 55 tähemärki",
|
||||||
|
"Password cannot be empty": "Salasõna ei tohi olla tühi",
|
||||||
|
"Please log in": "Palun logige sisse",
|
||||||
|
"channel:`x`": "kanal:`x`",
|
||||||
|
"Deleted or invalid channel": "Kanal on kustutatud või seda ei leitud",
|
||||||
|
"This channel does not exist.": "Sellist kanalit pole olemas.",
|
||||||
|
"comments_view_x_replies": "{{count}} vastus",
|
||||||
|
"comments_view_x_replies_plural": "{{count}} vastust",
|
||||||
|
"`x` ago": "`x` tagasi",
|
||||||
|
"Load more": "Laadi rohkem",
|
||||||
|
"Empty playlist": "Tühi esitusloend",
|
||||||
|
"Not a playlist.": "Tegu pole esitusloendiga.",
|
||||||
|
"Playlist does not exist.": "Seda esitusloendit pole olemas.",
|
||||||
|
"No such user": "Sellist kasutajat pole",
|
||||||
|
"English": "Inglise",
|
||||||
|
"English (United Kingdom)": "Inglise (Suurbritannia)",
|
||||||
|
"English (United States)": "Inglise (USA)",
|
||||||
|
"English (auto-generated)": "Inglise (automaatselt koostatud)",
|
||||||
|
"Afrikaans": "Afrikaani",
|
||||||
|
"Albanian": "Albaania",
|
||||||
|
"Arabic": "Araabia",
|
||||||
|
"Armenian": "Armeenia",
|
||||||
|
"Bangla": "Bengali",
|
||||||
|
"Basque": "Baski",
|
||||||
|
"Belarusian": "Valgevene",
|
||||||
|
"Bulgarian": "Bulgaaria",
|
||||||
|
"Burmese": "Birma",
|
||||||
|
"Cantonese (Hong Kong)": "Kantoni (Hong Konk)",
|
||||||
|
"Chinese (China)": "Hiina (Hiina)",
|
||||||
|
"Chinese (Hong Kong)": "Hiina (Hong Kong)",
|
||||||
|
"Chinese (Simplified)": "Hiina (lihtsustatud)",
|
||||||
|
"Chinese (Taiwan)": "Hiina (Taiwan)",
|
||||||
|
"Croatian": "Horvaatia",
|
||||||
|
"Czech": "Tšehhi",
|
||||||
|
"Danish": "Taani",
|
||||||
|
"Dutch": "Hollandi",
|
||||||
|
"Esperanto": "Esperanto",
|
||||||
|
"Estonian": "Eesti",
|
||||||
|
"Filipino": "Filipiini",
|
||||||
|
"Finnish": "Soome",
|
||||||
|
"French": "Prantsuse",
|
||||||
|
"French (auto-generated)": "Prantsuse (automaatne)",
|
||||||
|
"Dutch (auto-generated)": "Hollandi (automaatne)",
|
||||||
|
"Galician": "Kaliitsia",
|
||||||
|
"Georgian": "Gruusia",
|
||||||
|
"Haitian Creole": "Haiti kreool",
|
||||||
|
"Hausa": "Hausa",
|
||||||
|
"Hawaiian": "Havaii",
|
||||||
|
"Hebrew": "Heebrea",
|
||||||
|
"Hindi": "Hindi",
|
||||||
|
"Hungarian": "Ungari",
|
||||||
|
"Icelandic": "Islandi",
|
||||||
|
"Indonesian": "Indoneesia",
|
||||||
|
"Japanese (auto-generated)": "Jaapani (automaatne)",
|
||||||
|
"Kannada": "Kannada",
|
||||||
|
"Kazakh": "Kasahhi",
|
||||||
|
"Luxembourgish": "Luksemburgi",
|
||||||
|
"Macedonian": "Makedoonia",
|
||||||
|
"Malay": "Malai",
|
||||||
|
"Maltese": "Malta",
|
||||||
|
"Maori": "Maori",
|
||||||
|
"Marathi": "Marathi",
|
||||||
|
"Mongolian": "Mongoli",
|
||||||
|
"Nepali": "Nepaali",
|
||||||
|
"Norwegian Bokmål": "Norra (Bokmål)",
|
||||||
|
"Persian": "Pärsia",
|
||||||
|
"Polish": "Poola",
|
||||||
|
"Portuguese": "Portugali",
|
||||||
|
"Portuguese (auto-generated)": "Portugali (automaatne)",
|
||||||
|
"Portuguese (Brazil)": "Portugali (Brasiilia)",
|
||||||
|
"Romanian": "Rumeenia",
|
||||||
|
"Russian": "Vene",
|
||||||
|
"Russian (auto-generated)": "Vene (automaatne)",
|
||||||
|
"Scottish Gaelic": "Šoti (Gaeli)",
|
||||||
|
"Serbian": "Serbia",
|
||||||
|
"Slovak": "Slovaki",
|
||||||
|
"Slovenian": "Sloveeni",
|
||||||
|
"Somali": "Somaali",
|
||||||
|
"Spanish": "Hispaania",
|
||||||
|
"Spanish (auto-generated)": "Hispaania (automaatne)",
|
||||||
|
"Spanish (Latin America)": "Hispaania (Ladina-Ameerika)",
|
||||||
|
"Spanish (Mexico)": "Hispaania (Mehhiko)",
|
||||||
|
"Spanish (Spain)": "Hispaania (Hispaania)",
|
||||||
|
"Swahili": "Suahili",
|
||||||
|
"Swedish": "Rootsi",
|
||||||
|
"Tajik": "Tadžiki",
|
||||||
|
"Tamil": "Tamiili",
|
||||||
|
"Thai": "Tai",
|
||||||
|
"Turkish": "Türgi",
|
||||||
|
"Turkish (auto-generated)": "Türgi (automaatne)",
|
||||||
|
"Ukrainian": "Ukraina",
|
||||||
|
"Uzbek": "Usbeki",
|
||||||
|
"Vietnamese": "Vietnami",
|
||||||
|
"Vietnamese (auto-generated)": "Vietnami (automaatne)",
|
||||||
|
"generic_count_years": "{{count}} aasta",
|
||||||
|
"generic_count_years_plural": "{{count}} aastat",
|
||||||
|
"generic_count_months": "{{count}} kuu",
|
||||||
|
"generic_count_months_plural": "{{count}} kuud",
|
||||||
|
"generic_count_weeks": "{{count}} nädal",
|
||||||
|
"generic_count_weeks_plural": "{{count}} nädalat",
|
||||||
|
"generic_count_days": "{{count}} päev",
|
||||||
|
"generic_count_days_plural": "{{count}} päeva",
|
||||||
|
"generic_count_hours": "{{count}} tund",
|
||||||
|
"generic_count_hours_plural": "{{count}} tundi",
|
||||||
|
"generic_count_minutes": "{{count}} minut",
|
||||||
|
"generic_count_minutes_plural": "{{count}} minutit",
|
||||||
|
"Popular": "Populaarne",
|
||||||
|
"Search": "Otsi",
|
||||||
|
"Top": "Top",
|
||||||
|
"About": "Leheküljest",
|
||||||
|
"preferences_locale_label": "Keel: ",
|
||||||
|
"View as playlist": "Vaata esitusloendina",
|
||||||
|
"Movies": "Filmid",
|
||||||
|
"Download as: ": "Laadi kui: ",
|
||||||
|
"(edited)": "(muudetud)",
|
||||||
|
"`x` marked it with a ❤": "`x` märkis ❤",
|
||||||
|
"Audio mode": "Audiorežiim",
|
||||||
|
"Video mode": "Videorežiim",
|
||||||
|
"search_filters_date_label": "Üleslaadimise kuupäev",
|
||||||
|
"search_filters_date_option_none": "Ükskõik mis kuupäev",
|
||||||
|
"search_filters_date_option_today": "Täna",
|
||||||
|
"search_filters_date_option_week": "Sel nädalal",
|
||||||
|
"search_filters_date_option_hour": "Viimasel tunnil",
|
||||||
|
"search_filters_date_option_month": "Sel kuul",
|
||||||
|
"search_filters_date_option_year": "Sel aastal",
|
||||||
|
"search_filters_type_label": "Tüüp",
|
||||||
|
"search_filters_type_option_all": "Ükskõik mis tüüp",
|
||||||
|
"search_filters_duration_label": "Kestus",
|
||||||
|
"search_filters_type_option_show": "Näita",
|
||||||
|
"search_filters_duration_option_none": "Ükskõik mis kestus",
|
||||||
|
"search_filters_duration_option_short": "Lühike (alla 4 minuti)",
|
||||||
|
"search_filters_duration_option_medium": "Keskmine (4 - 20 minutit)",
|
||||||
|
"search_filters_duration_option_long": "Pikk (üle 20 minuti)",
|
||||||
|
"search_filters_features_option_live": "Otseülekanne",
|
||||||
|
"search_filters_features_option_four_k": "4K",
|
||||||
|
"search_filters_features_option_hd": "HD",
|
||||||
|
"search_filters_features_option_subtitles": "Subtiitrid",
|
||||||
|
"search_filters_features_option_location": "Asukoht",
|
||||||
|
"search_filters_sort_label": "Sorteeri",
|
||||||
|
"search_filters_sort_option_views": "Vaatamiste arv",
|
||||||
|
"next_steps_error_message": "Pärast mida võiksite proovida: ",
|
||||||
|
"videoinfo_started_streaming_x_ago": "Alustas otseülekannet `x` tagasi",
|
||||||
|
"Yes": "Jah",
|
||||||
|
"generic_views_count": "{{count}} vaatamine",
|
||||||
|
"generic_views_count_plural": "{{count}} vaatamist",
|
||||||
|
"Import NewPipe subscriptions (.json)": "Impordi tellimused NewPipe'ist (.json)",
|
||||||
|
"No": "Ei",
|
||||||
|
"preferences_region_label": "Riik: ",
|
||||||
|
"View YouTube comments": "Vaata YouTube'i kommentaare",
|
||||||
|
"preferences_extend_desc_label": "Ava video kirjeldus automaatselt: ",
|
||||||
|
"German (auto-generated)": "Saksa (automaatne)",
|
||||||
|
"Italian": "Itaalia",
|
||||||
|
"preferences_player_style_label": "Mängija stiil: ",
|
||||||
|
"subscriptions_unseen_notifs_count": "{{count}} lugemata teavitus",
|
||||||
|
"subscriptions_unseen_notifs_count_plural": "{{count}} lugemata teavitust",
|
||||||
|
"View more comments on Reddit": "Vaata teisi kommentaare Redditis",
|
||||||
|
"Only show latest unwatched video from channel: ": "Näita ainult viimast vaatamata videot: ",
|
||||||
|
"tokens_count": "{{count}} token",
|
||||||
|
"tokens_count_plural": "{{count}} tokenit",
|
||||||
|
"Log out": "Logi välja",
|
||||||
|
"Premieres `x`": "Linastub`x`",
|
||||||
|
"View `x` comments": {
|
||||||
|
"([^.,0-9]|^)1([^.,0-9]|$)": "Vaata `x` kommentaari",
|
||||||
|
"": "Vaata `x` kommentaare"
|
||||||
|
},
|
||||||
|
"Khmer": "Khmeeri",
|
||||||
|
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Sisselogimine ei õnnestunud. Kontrollige, kas two-factor authentication (Authenticator või SMS) on sisselülitatud.",
|
||||||
|
"Invalid TFA code": "Vale TFA-kood",
|
||||||
|
"Bosnian": "Bosnia",
|
||||||
|
"Corsican": "Korsika",
|
||||||
|
"Javanese": "Jaava",
|
||||||
|
"Lithuanian": "Leedu",
|
||||||
|
"Videos": "Videod",
|
||||||
|
"Community": "Kogukond",
|
||||||
|
"CAPTCHA is a required field": "CAPTCHA on kohustuslik väli",
|
||||||
|
"comments_points_count": "{{count}} punkt",
|
||||||
|
"comments_points_count_plural": "{{count}} punkti",
|
||||||
|
"Chinese": "Hiina",
|
||||||
|
"German": "Saksa",
|
||||||
|
"Indonesian (auto-generated)": "Indoneesia (automaatne)",
|
||||||
|
"Italian (auto-generated)": "Itaalia (automaatne)",
|
||||||
|
"Kyrgyz": "Kirkiisi",
|
||||||
|
"Latin": "Ladina",
|
||||||
|
"generic_count_seconds": "{{count}} sekund",
|
||||||
|
"generic_count_seconds_plural": "{{count}} sekundit",
|
||||||
|
"Catalan": "Katalaani",
|
||||||
|
"Chinese (Traditional)": "Hiina (traditsiooniline)",
|
||||||
|
"Greek": "Kreeka",
|
||||||
|
"Kurdish": "Kurdi",
|
||||||
|
"Latvian": "Läti",
|
||||||
|
"Irish": "Iiri",
|
||||||
|
"Korean": "Korea",
|
||||||
|
"Japanese": "Jaapani",
|
||||||
|
"Korean (auto-generated)": "Korea (automaatne)",
|
||||||
|
"Music": "Muusika",
|
||||||
|
"Playlists": "Esitusloendid",
|
||||||
|
"search_filters_type_option_video": "Video",
|
||||||
|
"search_filters_sort_option_date": "Üleslaadimise kuupäev",
|
||||||
|
"Current version: ": "Praegune versioon: ",
|
||||||
|
"footer_documentation": "Dokumentatsioon",
|
||||||
|
"Gaming": "Mängud",
|
||||||
|
"News": "Uudised",
|
||||||
|
"Download": "Laadi alla",
|
||||||
|
"search_filters_title": "Filtrid",
|
||||||
|
"search_filters_type_option_channel": "Kanal",
|
||||||
|
"search_filters_type_option_playlist": "Esitusloend",
|
||||||
|
"search_filters_type_option_movie": "Film",
|
||||||
|
"next_steps_error_message_go_to_youtube": "Minna YouTube'i",
|
||||||
|
"next_steps_error_message_refresh": "Laadida uuesti",
|
||||||
|
"footer_donate_page": "Anneta",
|
||||||
|
"videoinfo_watch_on_youTube": "Vaata YouTube'is"
|
||||||
|
}
|
||||||
221
locales/eu.json
221
locales/eu.json
@@ -20,15 +20,15 @@
|
|||||||
"No": "Ez",
|
"No": "Ez",
|
||||||
"Import and Export Data": "Datuak inportatu eta esportatu",
|
"Import and Export Data": "Datuak inportatu eta esportatu",
|
||||||
"Import": "Inportatu",
|
"Import": "Inportatu",
|
||||||
"Import Invidious data": "Inportatu Invidiouseko datuak",
|
"Import Invidious data": "Inportatu Invidiouseko JSON datuak",
|
||||||
"Import YouTube subscriptions": "Inportatu YouTubeko harpidetzak",
|
"Import YouTube subscriptions": "Inportatu YouTubeko/OPML harpidetzak",
|
||||||
"Import FreeTube subscriptions (.db)": "Inportatu FreeTubeko harpidetzak (.db)",
|
"Import FreeTube subscriptions (.db)": "Inportatu FreeTubeko harpidetzak (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "Inportatu NewPipeko harpidetzak (.json)",
|
"Import NewPipe subscriptions (.json)": "Inportatu NewPipeko harpidetzak (.json)",
|
||||||
"Import NewPipe data (.zip)": "Inportatu NewPipeko datuak (.zip)",
|
"Import NewPipe data (.zip)": "Inportatu NewPipeko datuak (.zip)",
|
||||||
"Export": "Esportatu",
|
"Export": "Esportatu",
|
||||||
"Export subscriptions as OPML": "Esportatu harpidetzak OPML bezala",
|
"Export subscriptions as OPML": "Esportatu harpidetzak OPML bezala",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Esportatu harpidetzak OPML bezala (NewPipe eta FreeTuberako)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Esportatu harpidetzak OPML bezala (NewPipe eta FreeTuberako)",
|
||||||
"Export data as JSON": "Esportatu datuak JSON bezala",
|
"Export data as JSON": "Esportatu Invidious datuak JSON gisa",
|
||||||
"Delete account?": "Kontua ezabatu?",
|
"Delete account?": "Kontua ezabatu?",
|
||||||
"History": "Historia",
|
"History": "Historia",
|
||||||
"An alternative front-end to YouTube": "YouTuberako interfaze alternatibo bat",
|
"An alternative front-end to YouTube": "YouTuberako interfaze alternatibo bat",
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
"preferences_volume_label": "Erreproduzigailuaren bolumena: ",
|
"preferences_volume_label": "Erreproduzigailuaren bolumena: ",
|
||||||
"preferences_comments_label": "Lehenetsitako iruzkinak: ",
|
"preferences_comments_label": "Lehenetsitako iruzkinak: ",
|
||||||
"youtube": "YouTube",
|
"youtube": "YouTube",
|
||||||
"reddit": "reddit",
|
"reddit": "Reddit",
|
||||||
"preferences_captions_label": "Lehenetsitako azpitituluak: ",
|
"preferences_captions_label": "Lehenetsitako azpitituluak: ",
|
||||||
"preferences_related_videos_label": "Erakutsi erlazionatutako bideoak: ",
|
"preferences_related_videos_label": "Erakutsi erlazionatutako bideoak: ",
|
||||||
"preferences_annotations_label": "Erakutsi oharrak modu lehenetsian: ",
|
"preferences_annotations_label": "Erakutsi oharrak modu lehenetsian: ",
|
||||||
@@ -62,5 +62,216 @@
|
|||||||
"Dark mode: ": "Gai iluna: ",
|
"Dark mode: ": "Gai iluna: ",
|
||||||
"preferences_dark_mode_label": "Gaia: ",
|
"preferences_dark_mode_label": "Gaia: ",
|
||||||
"dark": "iluna",
|
"dark": "iluna",
|
||||||
"light": "argia"
|
"light": "argia",
|
||||||
|
"generic_subscriptions_count": "{{count}} harpidetza",
|
||||||
|
"generic_subscriptions_count_plural": "{{count}} harpidetzak",
|
||||||
|
"tokens_count": "{{count}} tokena",
|
||||||
|
"tokens_count_plural": "{{count}} tokenak",
|
||||||
|
"comments_points_count": "{{count}} puntua",
|
||||||
|
"comments_points_count_plural": "{{count}} puntuak",
|
||||||
|
"View more comments on Reddit": "Iruzkin gehiago Redditen",
|
||||||
|
"Fallback captions: ": "Ordezko azpitituluak: ",
|
||||||
|
"generic_subscribers_count": "{{count}} harpidedun",
|
||||||
|
"generic_subscribers_count_plural": "{{count}} harpidedunak",
|
||||||
|
"preferences_quality_option_dash": "DASH (kalitate egokitua)",
|
||||||
|
"preferences_listen_label": "Lehenetsiz jo: ",
|
||||||
|
"preferences_speed_label": "Abiadura lehenetsia: ",
|
||||||
|
"preferences_quality_dash_option_2160p": "2160p",
|
||||||
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
|
"preferences_quality_dash_option_auto": "Auto",
|
||||||
|
"preferences_quality_dash_option_worst": "Txarrena",
|
||||||
|
"preferences_quality_dash_option_best": "Hoberena",
|
||||||
|
"preferences_quality_dash_option_4320p": "4320p",
|
||||||
|
"preferences_quality_dash_option_480p": "480p",
|
||||||
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
|
"preferences_extend_desc_label": "Bideoaren azalpena automatikoki zabaldu: ",
|
||||||
|
"preferences_annotations_subscribed_label": "Harpidetutako kanalen oharrak erakutsi lehenetsiz? ",
|
||||||
|
"Redirect homepage to feed: ": "Hasierako orrira bidali jarraitzeko: ",
|
||||||
|
"channel name - reverse": "kanalaren izena - alderantziz",
|
||||||
|
"preferences_notifications_only_label": "Jakinarazpenak soilik erakutsi (baldin badago): ",
|
||||||
|
"Top enabled: ": "Goikoa gaitu: ",
|
||||||
|
"Import/export data": "Inportatu/exportatu data",
|
||||||
|
"Create playlist": "Zerrenda sortu",
|
||||||
|
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Aditu! JavaScript itzalita dakazula ematen du. Hemen sakatu iruzkinak ikusteko. Denbora luza leikeela kontuan hartu.",
|
||||||
|
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Ezinezkoa izena eman. Ziurtatu berresteko bi faktoreak (Authenticator edo SMS) piztuta daudela.",
|
||||||
|
"generic_views_count": "{{count}}ikusia",
|
||||||
|
"generic_views_count_plural": "{{count}}ikusiak",
|
||||||
|
"generic_playlists_count": "{{count}}zerrenda",
|
||||||
|
"generic_playlists_count_plural": "{{count}}zerrendak",
|
||||||
|
"Could not fetch comments": "Iruzkinei ezin heldu",
|
||||||
|
"Erroneous token": "Token okerra",
|
||||||
|
"Albanian": "Albaniarra",
|
||||||
|
"Azerbaijani": "Azerbaitarra",
|
||||||
|
"No such user": "Ez dago erabiltzailerik",
|
||||||
|
"Bulgarian": "Bulgariarra",
|
||||||
|
"Filipino": "Filipinera",
|
||||||
|
"French": "Frantsesa",
|
||||||
|
"French (auto-generated)": "Frantsesa (auto-sortua)",
|
||||||
|
"Show more": "Erakutsi gehiago",
|
||||||
|
"Show less": "Erakutsi gutxiago",
|
||||||
|
"Delete playlist": "Zerrenda ezabatu",
|
||||||
|
"Delete account": "Kontua ezabatu",
|
||||||
|
"User ID is a required field": "Erabiltzailearen IDa beharrezkoa da",
|
||||||
|
"English (United Kingdom)": "Ingelesa (Britania Handia",
|
||||||
|
"preferences_vr_mode_label": "360 graduko bideo interaktiboak (WebGL beharko): ",
|
||||||
|
"English (United States)": "Estatu batuarra (AEB)",
|
||||||
|
"English (auto-generated)": "Ingelesa (autosortua)",
|
||||||
|
"Arabic": "Arabiarra",
|
||||||
|
"Armenian": "Armeniarra",
|
||||||
|
"Bangla": "Banglera",
|
||||||
|
"Belarusian": "Bielorrusiara",
|
||||||
|
"Burmese": "Burmesera",
|
||||||
|
"Chinese (Simplified)": "Txinera (sinplifikatua)",
|
||||||
|
"preferences_watch_history_label": "Baimendu historia ikusi ",
|
||||||
|
"generic_videos_count": "{{count}}bideo",
|
||||||
|
"generic_videos_count_plural": "{{count}}bideoak",
|
||||||
|
"View privacy policy.": "Pribatutasun politika ikusi.",
|
||||||
|
"Cantonese (Hong Kong)": "Kantoniera (Hong Kong)",
|
||||||
|
"subscriptions_unseen_notifs_count": "{{count}} ezikusitako oharra",
|
||||||
|
"subscriptions_unseen_notifs_count_plural": "{{count}} ezikusitako oharrak",
|
||||||
|
"Trending": "Joera",
|
||||||
|
"Playlist privacy": "Zerrendaren privatutasuna",
|
||||||
|
"Switch Invidious Instance": "Invidious adibidea aldatu",
|
||||||
|
"Genre: ": "Genero: ",
|
||||||
|
"License: ": "Lizentzia: ",
|
||||||
|
"Family friendly? ": "Adeikorra familiarekin? ",
|
||||||
|
"Wilson score: ": "Wilsonen puntuazioa: ",
|
||||||
|
"Quota exceeded, try again in a few hours": "Kuota gaindituta, ordu batzuren bueltan berriro saiatu",
|
||||||
|
"comments_view_x_replies": "{{count}} erantzuna ikusi",
|
||||||
|
"comments_view_x_replies_plural": "{{count}} erantzunak ikusi",
|
||||||
|
"Catalan": "Katalaniera",
|
||||||
|
"Chinese": "Txinera",
|
||||||
|
"Chinese (China)": "Txinatarra",
|
||||||
|
"Chinese (Hong Kong)": "Hongkondarra",
|
||||||
|
"Chinese (Taiwan)": "Taiwandarra",
|
||||||
|
"Corsican": "Korsikera",
|
||||||
|
"Dutch (auto-generated)": "Alemaniera (auto-sortua)",
|
||||||
|
"Estonian": "Estoniera",
|
||||||
|
"Finnish": "Finlandiera",
|
||||||
|
"Galician": "Galizera",
|
||||||
|
"German (auto-generated)": "Alemaiera (auto-sortua)",
|
||||||
|
"Greek": "Greziera",
|
||||||
|
"crash_page_report_issue": "Aurreko ezerk ez badizu lagundu, arren <a href=\"`x`\"> GitHuben gai berri bat zabaldu </a> (ingelesez ahal bada) eta zure mezuan hurrengo testua sartu (testuari EZ itzulpena egin):",
|
||||||
|
"crash_page_search_issue": "GitHuben dauden gaiak <a href=\"`x`\"> buruz</a>",
|
||||||
|
"preferences_quality_option_medium": "Erdixka",
|
||||||
|
"preferences_quality_option_small": "Txikia",
|
||||||
|
"preferences_quality_dash_label": "DASH bideo kalitate lehenetsia: ",
|
||||||
|
"preferences_quality_dash_option_1440p": "1440p",
|
||||||
|
"preferences_quality_dash_option_1080p": "1080p",
|
||||||
|
"preferences_quality_dash_option_720p": "720p",
|
||||||
|
"preferences_quality_option_hd720": "HD720",
|
||||||
|
"preferences_quality_dash_option_360p": "360p",
|
||||||
|
"invidious": "Invidious",
|
||||||
|
"Source available here.": "Iturburua hemen eskura.",
|
||||||
|
"View JavaScript license information.": "JavaScriptaren lizentzi adierazpena ikusi.",
|
||||||
|
"Blacklisted regions: ": "zerrenda beltzaren zonaldeak: ",
|
||||||
|
"Premieres `x`": "'x' estrenaldiak",
|
||||||
|
"Wrong answer": "Erantzun ez zuzena",
|
||||||
|
"Password is a required field": "Pasahitza beharrezkoa da",
|
||||||
|
"Wrong username or password": "Pasahitza edo ezizena gaizki",
|
||||||
|
"Password cannot be longer than 55 characters": "Pasahitza 55 karaktere baino luzeagoa ezin da izan",
|
||||||
|
"This channel does not exist.": "Kanal hau ez dago.",
|
||||||
|
"`x` ago": "duela 'x'",
|
||||||
|
"Czech": "Txekiera",
|
||||||
|
"preferences_region_label": "Herrialdeko edukiera: ",
|
||||||
|
"preferences_sort_label": "Bideoak ordenatu: ",
|
||||||
|
"published": "argitaratuta",
|
||||||
|
"Only show latest video from channel: ": "Kanalaren azken bideoa soilik erakutsi ",
|
||||||
|
"preferences_category_admin": "Administratzailearen lehentasunak",
|
||||||
|
"Registration enabled: ": "Harpidetza gaituta: ",
|
||||||
|
"Save preferences": "Baloreak gorde",
|
||||||
|
"Token manager": "Token kudeatzailea",
|
||||||
|
"unsubscribe": "Baja eman",
|
||||||
|
"search": "Bilatu",
|
||||||
|
"Log out": "Irten",
|
||||||
|
"English": "Ingelesa",
|
||||||
|
"Afrikaans": "Afrikarra",
|
||||||
|
"Amharic": "Amharerra",
|
||||||
|
"Basque": "Euskera",
|
||||||
|
"Bosnian": "Bosniarra",
|
||||||
|
"Cebuano": "Zebuera",
|
||||||
|
"Chinese (Traditional)": "Txinera (Tradizionala)",
|
||||||
|
"Croatian": "Croaziera",
|
||||||
|
"Danish": "Daniera",
|
||||||
|
"Dutch": "Alemaniera",
|
||||||
|
"Esperanto": "Esperanto",
|
||||||
|
"Erroneous challenge": "Erronka okerra",
|
||||||
|
"View all playlists": "Zerrenda guztiak ikusi",
|
||||||
|
"Show annotations": "Oharrak erakutsi",
|
||||||
|
"Empty playlist": "Zerrenda hutsik",
|
||||||
|
"Please log in": "Sartu, mesedez",
|
||||||
|
"CAPTCHA is a required field": "CAPTCHA beharrezko eremua da",
|
||||||
|
"preferences_category_data": "Dataren lehentasunak",
|
||||||
|
"preferences_default_home_label": "Homepage lehenetsia: ",
|
||||||
|
"preferences_automatic_instance_redirect_label": "berbideratze adibide automatikoa (atzera egin berbideratzeko: invidious.io) ",
|
||||||
|
"Please sign in using 'Log in with Google'": "'Log in Googlerekin' erabili",
|
||||||
|
"`x` uploaded a video": "' x'(e)k bideo bat igo du",
|
||||||
|
"published - reverse": "argitaratuta - alderantziz",
|
||||||
|
"Could not get channel info.": "Kanalaren adierazpena ezin lortu.",
|
||||||
|
"alphabetically - reverse": "alfabetikoki - alderantziz",
|
||||||
|
"Public": "Orokorra",
|
||||||
|
"Unlisted": "Ez zerrendatua",
|
||||||
|
"Subscription manager": "Harpidetzen kudeatzailea",
|
||||||
|
"Updated `x` ago": "Duela 'x' eguneratua",
|
||||||
|
"Hide replies": "Erantzunak izkutatu",
|
||||||
|
"preferences_thin_mode_label": "Urri eran: ",
|
||||||
|
"Show replies": "Erantzunak erakutsi",
|
||||||
|
"Watch on YouTube": "YouTuben ikusi",
|
||||||
|
"Premieres in `x`": "'x'eko estrenaldiak",
|
||||||
|
"Delete playlist `x`?": "'x' zerrenda ezabatu nahi?",
|
||||||
|
"Token is expired, please try again": "Token kadukatua, saiatu berriro",
|
||||||
|
"Invalid TFA code": "TFA kodea ez da zuzena",
|
||||||
|
"CAPTCHA enabled: ": "CAPTCHA gaitu: ",
|
||||||
|
"Released under the AGPLv3 on Github.": "GitHubeko AGPLv3pean argitaratuta.",
|
||||||
|
"channel:`x`": "Kanal: 'x'",
|
||||||
|
"Georgian": "Georgiera",
|
||||||
|
"Incorrect password": "Pasahitza gaizki",
|
||||||
|
"Playlist does not exist.": "Zerrenda ez da existitzen.",
|
||||||
|
"preferences_category_misc": "Askotariko lehentasunak",
|
||||||
|
"View `x` comments": {
|
||||||
|
"([^.,0-9]|^)1([^.,0-9]|$)": "'x' iruzkina ikusi",
|
||||||
|
"": "'x' iruzkinak ikusi"
|
||||||
|
},
|
||||||
|
"Report statistics: ": "Estatistikak adierazi: ",
|
||||||
|
"preferences_max_results_label": "Jotzeko bideo zerrendaren luzera: ",
|
||||||
|
"Subscriptions": "Harpidetzak",
|
||||||
|
"Load more": "Gehiago atera",
|
||||||
|
"Change password": "Pasahitza aldatu",
|
||||||
|
"preferences_show_nick_label": "Erakutsi ezizena goian: ",
|
||||||
|
"View Reddit comments": "Redditeko iruzkinak ikusi",
|
||||||
|
"preferences_category_subscription": "Harpidetzaren lehentasunak",
|
||||||
|
"Hidden field \"challenge\" is a required field": "\"challenge\" eremu ezkutua beharrezkoa da",
|
||||||
|
"German": "Alemaniarra",
|
||||||
|
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Ezin izena eman. Izan leike zure konturako berresteko bi faktoreak piztuta ez daudela.",
|
||||||
|
"View YouTube comments": "YouTubeko iruzkinak ikusi",
|
||||||
|
"Google verification code": "Googleren berresteko kodea",
|
||||||
|
"`x` is live": "'x' bizirik darrai",
|
||||||
|
"Password cannot be empty": "Pasahitza ezin da hutsik utzi",
|
||||||
|
"preferences_video_loop_label": "Beti begiztatu: ",
|
||||||
|
"Only show latest unwatched video from channel: ": "kanalaren azken bideo ezikusia erakutsi soilik ",
|
||||||
|
"Enable web notifications": "Webaren jakinarazpenak baimendu",
|
||||||
|
"revoke": "ukatu",
|
||||||
|
"preferences_continue_label": "Hurrengo lehenetsia jo: ",
|
||||||
|
"Whitelisted regions: ": "Zuri zerrendaren zonaldeak: ",
|
||||||
|
"Erroneous CAPTCHA": "CAPTCHA gaizki",
|
||||||
|
"Deleted or invalid channel": "Ezgai edota ezabatutako kanala",
|
||||||
|
"Could not create mix.": "Nahastea ezin sortu.",
|
||||||
|
"Not a playlist.": "Ez da zerrenda.",
|
||||||
|
"Hidden field \"token\" is a required field": "\"token\" eremu ezkutua beharrezkoa da",
|
||||||
|
"Import/export": "Inportatu/esportatu",
|
||||||
|
"alphabetically": "alfabetikoki",
|
||||||
|
"preferences_unseen_only_label": "Ezikusiak besterik ez erakutsi: ",
|
||||||
|
"Clear watch history": "Historia ezabatu",
|
||||||
|
"Manage subscriptions": "Harpidetzak kudeatu",
|
||||||
|
"Manage tokens": "Fitxak kudeatu",
|
||||||
|
"Watch history": "Historia ikusi",
|
||||||
|
"Login enabled: ": "Login gaitu: ",
|
||||||
|
"Hide annotations": "Oharrak izkutatu",
|
||||||
|
"Title": "Titulua",
|
||||||
|
"channel name": "Kanalaren izena",
|
||||||
|
"Authorize token for `x`?": "Baimendu tokena 'x'tzako?",
|
||||||
|
"Private": "Pribatua",
|
||||||
|
"Editing playlist `x`": "'x' zerrenda editatu",
|
||||||
|
"Could not pull trending pages.": "Ezin ekarri orri arrakastatsuak.",
|
||||||
|
"crash_page_read_the_faq": "Bide <a href=\"`x`\"> (FAQ) ohiko galderak</a>"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,7 +148,6 @@
|
|||||||
"Show less": "نمایش کمتر",
|
"Show less": "نمایش کمتر",
|
||||||
"Watch on YouTube": "تماشا در یوتیوب",
|
"Watch on YouTube": "تماشا در یوتیوب",
|
||||||
"Switch Invidious Instance": "تعویض نمونه اینویدیوس",
|
"Switch Invidious Instance": "تعویض نمونه اینویدیوس",
|
||||||
"Broken? Try another Invidious Instance": "کار نمیکند؟ نمونه دیگری از اینویدیوس را امتحان کنید",
|
|
||||||
"Hide annotations": "مخفی کردن حاشیه نویسی ها",
|
"Hide annotations": "مخفی کردن حاشیه نویسی ها",
|
||||||
"Show annotations": "نمایش حاشیه نویسی ها",
|
"Show annotations": "نمایش حاشیه نویسی ها",
|
||||||
"Genre: ": "ژانر: ",
|
"Genre: ": "ژانر: ",
|
||||||
@@ -345,33 +344,32 @@
|
|||||||
"Videos": "ویدیو ها",
|
"Videos": "ویدیو ها",
|
||||||
"Playlists": "سیاهههای پخش",
|
"Playlists": "سیاهههای پخش",
|
||||||
"Community": "اجتماع",
|
"Community": "اجتماع",
|
||||||
"relevance": "مرتبط بودن",
|
"search_filters_sort_option_relevance": "مرتبط بودن",
|
||||||
"rating": "امتیاز",
|
"search_filters_sort_option_rating": "امتیاز",
|
||||||
"date": "تاریخ بارگذاری",
|
"search_filters_sort_option_date": "تاریخ بارگذاری",
|
||||||
"views": "تعداد بازدید",
|
"search_filters_sort_option_views": "تعداد بازدید",
|
||||||
"content_type": "نوع",
|
"search_filters_type_label": "نوع",
|
||||||
"duration": "مدت",
|
"search_filters_duration_label": "مدت",
|
||||||
"features": "ویژگیها",
|
"search_filters_features_label": "ویژگیها",
|
||||||
"sort": "به ترتیب",
|
"search_filters_sort_label": "به ترتیب",
|
||||||
"hour": "یک ساعت گذشته",
|
"search_filters_date_option_hour": "یک ساعت گذشته",
|
||||||
"today": "امروز",
|
"search_filters_date_option_today": "امروز",
|
||||||
"week": "این هفته",
|
"search_filters_date_option_week": "این هفته",
|
||||||
"month": "این ماه",
|
"search_filters_date_option_month": "این ماه",
|
||||||
"year": "امسال",
|
"search_filters_date_option_year": "امسال",
|
||||||
"video": "ویدئو",
|
"search_filters_type_option_video": "ویدئو",
|
||||||
"channel": "کانال",
|
"search_filters_type_option_channel": "کانال",
|
||||||
"playlist": "سیاههٔ پخش",
|
"search_filters_type_option_playlist": "سیاههٔ پخش",
|
||||||
"movie": "فیلم",
|
"search_filters_type_option_movie": "فیلم",
|
||||||
"show": "نمایش",
|
"search_filters_type_option_show": "نمایش",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "زیرنویس",
|
"search_filters_features_option_subtitles": "زیرنویس",
|
||||||
"creative_commons": "کریتیو کامونز",
|
"search_filters_features_option_c_commons": "کریتیو کامونز",
|
||||||
"3d": "سهبعدی",
|
"search_filters_features_option_three_d": "سهبعدی",
|
||||||
"live": "زنده",
|
"search_filters_features_option_live": "زنده",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "مکان",
|
"search_filters_features_option_location": "مکان",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "پالایه",
|
|
||||||
"Current version: ": "نسخه فعلی: ",
|
"Current version: ": "نسخه فعلی: ",
|
||||||
"next_steps_error_message": "اکنون بایستی یکی از این موارد را امتحان کنید: ",
|
"next_steps_error_message": "اکنون بایستی یکی از این موارد را امتحان کنید: ",
|
||||||
"next_steps_error_message_refresh": "تازهسازی",
|
"next_steps_error_message_refresh": "تازهسازی",
|
||||||
@@ -393,7 +391,7 @@
|
|||||||
"preferences_quality_dash_option_240p": "240p",
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
"preferences_quality_dash_option_144p": "144p",
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
"invidious": "اینویدیوس",
|
"invidious": "اینویدیوس",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"footer_donate_page": "کمک مالی",
|
"footer_donate_page": "کمک مالی",
|
||||||
"footer_source_code": "کد منبع",
|
"footer_source_code": "کد منبع",
|
||||||
"footer_modfied_source_code": "کد منبع ویرایش شده",
|
"footer_modfied_source_code": "کد منبع ویرایش شده",
|
||||||
@@ -405,12 +403,13 @@
|
|||||||
"download_subtitles": "زیرنویسها - `x` (.vtt)",
|
"download_subtitles": "زیرنویسها - `x` (.vtt)",
|
||||||
"Video unavailable": "ویدئو دردسترس نیست",
|
"Video unavailable": "ویدئو دردسترس نیست",
|
||||||
"preferences_save_player_pos_label": "ذخیره زمان کنونی ویدئو: ",
|
"preferences_save_player_pos_label": "ذخیره زمان کنونی ویدئو: ",
|
||||||
"purchased": "خریداری شده",
|
"search_filters_features_option_purchased": "خریداری شده",
|
||||||
"preferences_quality_dash_label": "کیفیت ترجیحی ویدئو DASH: ",
|
"preferences_quality_dash_label": "کیفیت ترجیحی ویدئو DASH: ",
|
||||||
"preferences_region_label": "کشور محتوا: ",
|
"preferences_region_label": "کشور محتوا: ",
|
||||||
"footer_documentation": "مستندات",
|
"footer_documentation": "مستندات",
|
||||||
"footer_original_source_code": "کد منبع اصلی",
|
"footer_original_source_code": "کد منبع اصلی",
|
||||||
"long": "بلند (> 20 دقیقه)",
|
"search_filters_duration_option_long": "بلند (> 20 دقیقه)",
|
||||||
"adminprefs_modified_source_code_url_label": "URL مخزن کد منبع ویریش شده",
|
"adminprefs_modified_source_code_url_label": "URL مخزن کد منبع ویریش شده",
|
||||||
"short": "کوتاه (< 4 دقیقه)"
|
"search_filters_duration_option_short": "کوتاه (< 4 دقیقه)",
|
||||||
|
"search_filters_title": "پالایه"
|
||||||
}
|
}
|
||||||
|
|||||||
110
locales/fi.json
110
locales/fi.json
@@ -21,15 +21,15 @@
|
|||||||
"No": "Ei",
|
"No": "Ei",
|
||||||
"Import and Export Data": "Tuo ja vie tietoja",
|
"Import and Export Data": "Tuo ja vie tietoja",
|
||||||
"Import": "Tuo",
|
"Import": "Tuo",
|
||||||
"Import Invidious data": "Tuo Invidious-tietoja",
|
"Import Invidious data": "Tuo Invidiousin JSON-tietoja",
|
||||||
"Import YouTube subscriptions": "Tuo YouTube-tilaukset",
|
"Import YouTube subscriptions": "Tuo YouTube/OPML-tilaukset",
|
||||||
"Import FreeTube subscriptions (.db)": "Tuo FreeTube-tilaukset (.db)",
|
"Import FreeTube subscriptions (.db)": "Tuo FreeTube-tilaukset (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "Tuo NewPipe-tilaukset (.json)",
|
"Import NewPipe subscriptions (.json)": "Tuo NewPipe-tilaukset (.json)",
|
||||||
"Import NewPipe data (.zip)": "Tuo NewPipe-tietoja (.zip)",
|
"Import NewPipe data (.zip)": "Tuo NewPipe-tietoja (.zip)",
|
||||||
"Export": "Vie",
|
"Export": "Vie",
|
||||||
"Export subscriptions as OPML": "Vie tilaukset OPML-muodossa",
|
"Export subscriptions as OPML": "Vie tilaukset OPML-muodossa",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Vie tilaukset OPML-muodossa (NewPipe & FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Vie tilaukset OPML-muodossa (NewPipe & FreeTube)",
|
||||||
"Export data as JSON": "Vie data JSON-muodossa",
|
"Export data as JSON": "Vie Invidious-data JSON-muodossa",
|
||||||
"Delete account?": "Poista tili?",
|
"Delete account?": "Poista tili?",
|
||||||
"History": "Historia",
|
"History": "Historia",
|
||||||
"An alternative front-end to YouTube": "Vaihtoehtoinen front-end YouTubelle",
|
"An alternative front-end to YouTube": "Vaihtoehtoinen front-end YouTubelle",
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
"preferences_related_videos_label": "Näytä aiheeseen liittyviä videoita: ",
|
"preferences_related_videos_label": "Näytä aiheeseen liittyviä videoita: ",
|
||||||
"preferences_annotations_label": "Näytä huomautukset oletuksena: ",
|
"preferences_annotations_label": "Näytä huomautukset oletuksena: ",
|
||||||
"preferences_extend_desc_label": "Laajenna automaattisesti videon kuvausta: ",
|
"preferences_extend_desc_label": "Laajenna automaattisesti videon kuvausta: ",
|
||||||
"preferences_vr_mode_label": "Interaktiiviset 360-asteiset videot: ",
|
"preferences_vr_mode_label": "Interaktiiviset 360-asteiset videot (vaatii WebGL:n): ",
|
||||||
"preferences_category_visual": "Visuaaliset asetukset",
|
"preferences_category_visual": "Visuaaliset asetukset",
|
||||||
"preferences_player_style_label": "Soittimen tyyli: ",
|
"preferences_player_style_label": "Soittimen tyyli: ",
|
||||||
"Dark mode: ": "Tumma tila: ",
|
"Dark mode: ": "Tumma tila: ",
|
||||||
@@ -140,7 +140,6 @@
|
|||||||
"Show less": "Näytä vähemmän",
|
"Show less": "Näytä vähemmän",
|
||||||
"Watch on YouTube": "Katso YouTubessa",
|
"Watch on YouTube": "Katso YouTubessa",
|
||||||
"Switch Invidious Instance": "Vaihda Invidious-instanssia",
|
"Switch Invidious Instance": "Vaihda Invidious-instanssia",
|
||||||
"Broken? Try another Invidious Instance": "Rikki? Kokeile toista Invidious-instanssia",
|
|
||||||
"Hide annotations": "Piilota merkkaukset",
|
"Hide annotations": "Piilota merkkaukset",
|
||||||
"Show annotations": "Näytä merkkaukset",
|
"Show annotations": "Näytä merkkaukset",
|
||||||
"Genre: ": "Genre: ",
|
"Genre: ": "Genre: ",
|
||||||
@@ -328,33 +327,32 @@
|
|||||||
"Videos": "Videot",
|
"Videos": "Videot",
|
||||||
"Playlists": "Soittolistat",
|
"Playlists": "Soittolistat",
|
||||||
"Community": "Yhteisö",
|
"Community": "Yhteisö",
|
||||||
"relevance": "Osuvuus",
|
"search_filters_sort_option_relevance": "Osuvuus",
|
||||||
"rating": "Arvostelu",
|
"search_filters_sort_option_rating": "Arvostelu",
|
||||||
"date": "Latauspäivämäärä",
|
"search_filters_sort_option_date": "Latauspäivämäärä",
|
||||||
"views": "Katselukerrat",
|
"search_filters_sort_option_views": "Katselukerrat",
|
||||||
"content_type": "Tyyppi",
|
"search_filters_type_label": "Tyyppi",
|
||||||
"duration": "Kesto",
|
"search_filters_duration_label": "Kesto",
|
||||||
"features": "Ominaisuudet",
|
"search_filters_features_label": "Ominaisuudet",
|
||||||
"sort": "Luokittele",
|
"search_filters_sort_label": "Luokittele",
|
||||||
"hour": "Viimeisin tunti",
|
"search_filters_date_option_hour": "Viimeisin tunti",
|
||||||
"today": "Tänään",
|
"search_filters_date_option_today": "Tänään",
|
||||||
"week": "Tämä viikko",
|
"search_filters_date_option_week": "Tämä viikko",
|
||||||
"month": "Tämä kuukausi",
|
"search_filters_date_option_month": "Tämä kuukausi",
|
||||||
"year": "Tämä vuosi",
|
"search_filters_date_option_year": "Tämä vuosi",
|
||||||
"video": "Video",
|
"search_filters_type_option_video": "Video",
|
||||||
"channel": "Kanava",
|
"search_filters_type_option_channel": "Kanava",
|
||||||
"playlist": "Soittolista",
|
"search_filters_type_option_playlist": "Soittolista",
|
||||||
"movie": "Elokuva",
|
"search_filters_type_option_movie": "Elokuva",
|
||||||
"show": "Ohjelma",
|
"search_filters_type_option_show": "Ohjelma",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "Tekstitys/CC",
|
"search_filters_features_option_subtitles": "Tekstitys/CC",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "Suora lähetys",
|
"search_filters_features_option_live": "Suora lähetys",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "Sijainti",
|
"search_filters_features_option_location": "Sijainti",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "Suodatin",
|
|
||||||
"Current version: ": "Tämänhetkinen versio: ",
|
"Current version: ": "Tämänhetkinen versio: ",
|
||||||
"next_steps_error_message": "Sinun tulisi kokeilla seuraavia: ",
|
"next_steps_error_message": "Sinun tulisi kokeilla seuraavia: ",
|
||||||
"next_steps_error_message_refresh": "Päivitä",
|
"next_steps_error_message_refresh": "Päivitä",
|
||||||
@@ -390,7 +388,7 @@
|
|||||||
"crash_page_before_reporting": "Varmista ennen bugin ilmoittamista, että sinä olet:",
|
"crash_page_before_reporting": "Varmista ennen bugin ilmoittamista, että sinä olet:",
|
||||||
"crash_page_refresh": "yrittänyt <a href=\"`x`\">päivittää sivun</a>",
|
"crash_page_refresh": "yrittänyt <a href=\"`x`\">päivittää sivun</a>",
|
||||||
"crash_page_read_the_faq": "lukenut <a href=\"`x`\">Usein kysytyt kysymykset (FAQ)</a>",
|
"crash_page_read_the_faq": "lukenut <a href=\"`x`\">Usein kysytyt kysymykset (FAQ)</a>",
|
||||||
"crash_page_search_issue": "etsinyt <a href=\"`x`\">olemassa olevia issueita Githubissa</a>",
|
"crash_page_search_issue": "etsinyt <a href=\"`x`\">olemassa olevia issueita GitHubissa</a>",
|
||||||
"generic_views_count": "{{count}} katselu",
|
"generic_views_count": "{{count}} katselu",
|
||||||
"generic_views_count_plural": "{{count}} katselua",
|
"generic_views_count_plural": "{{count}} katselua",
|
||||||
"preferences_quality_dash_option_720p": "720p",
|
"preferences_quality_dash_option_720p": "720p",
|
||||||
@@ -423,8 +421,8 @@
|
|||||||
"preferences_quality_dash_label": "Haluttava DASH-videolaatu: ",
|
"preferences_quality_dash_label": "Haluttava DASH-videolaatu: ",
|
||||||
"generic_count_years": "{{count}} vuosi",
|
"generic_count_years": "{{count}} vuosi",
|
||||||
"generic_count_years_plural": "{{count}} vuotta",
|
"generic_count_years_plural": "{{count}} vuotta",
|
||||||
"purchased": "Ostettu",
|
"search_filters_features_option_purchased": "Ostettu",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"videoinfo_watch_on_youTube": "Katso YouTubessa",
|
"videoinfo_watch_on_youTube": "Katso YouTubessa",
|
||||||
"none": "ei mikään",
|
"none": "ei mikään",
|
||||||
"videoinfo_started_streaming_x_ago": "Striimaaminen aloitettu `x` sitten",
|
"videoinfo_started_streaming_x_ago": "Striimaaminen aloitettu `x` sitten",
|
||||||
@@ -433,9 +431,45 @@
|
|||||||
"footer_source_code": "Lähdekoodi",
|
"footer_source_code": "Lähdekoodi",
|
||||||
"adminprefs_modified_source_code_url_label": "URL muokattuun lähdekoodirepositoryyn",
|
"adminprefs_modified_source_code_url_label": "URL muokattuun lähdekoodirepositoryyn",
|
||||||
"Released under the AGPLv3 on Github.": "Julkaistu AGPLv3-lisenssin alla GitHubissa.",
|
"Released under the AGPLv3 on Github.": "Julkaistu AGPLv3-lisenssin alla GitHubissa.",
|
||||||
"short": "Lyhyt (< 4 minuuttia)",
|
"search_filters_duration_option_short": "Lyhyt (< 4 minuuttia)",
|
||||||
"long": "Pitkä (> 20 minuuttia)",
|
"search_filters_duration_option_long": "Pitkä (> 20 minuuttia)",
|
||||||
"footer_documentation": "Dokumentaatio",
|
"footer_documentation": "Dokumentaatio",
|
||||||
"footer_original_source_code": "Alkuperäinen lähdekoodi",
|
"footer_original_source_code": "Alkuperäinen lähdekoodi",
|
||||||
"footer_modfied_source_code": "Muokattu lähdekoodi"
|
"footer_modfied_source_code": "Muokattu lähdekoodi",
|
||||||
|
"Japanese (auto-generated)": "Japani (automaattisesti luotu)",
|
||||||
|
"German (auto-generated)": "Saksa (automaattisesti luotu)",
|
||||||
|
"Portuguese (auto-generated)": "portugali (automaattisesti luotu)",
|
||||||
|
"Russian (auto-generated)": "Venäjä (automaattisesti luotu)",
|
||||||
|
"preferences_watch_history_label": "Ota katseluhistoria käyttöön: ",
|
||||||
|
"English (United Kingdom)": "Englanti (Iso-Britannia)",
|
||||||
|
"English (United States)": "Englanti (Yhdysvallat)",
|
||||||
|
"Cantonese (Hong Kong)": "Kantoninkiina (Hong Kong)",
|
||||||
|
"Chinese": "Kiina",
|
||||||
|
"Chinese (China)": "Kiina (Kiina)",
|
||||||
|
"Chinese (Hong Kong)": "Kiina (Hong Kong)",
|
||||||
|
"Chinese (Taiwan)": "Kiina (Taiwan)",
|
||||||
|
"Dutch (auto-generated)": "Hollanti (automaattisesti luotu)",
|
||||||
|
"French (auto-generated)": "Ranska (automaattisesti luotu)",
|
||||||
|
"Indonesian (auto-generated)": "Indonesia (automaattisesti luotu)",
|
||||||
|
"Interlingue": "Interlingue",
|
||||||
|
"Italian (auto-generated)": "Italia (automaattisesti luotu)",
|
||||||
|
"Korean (auto-generated)": "Korea (automaattisesti luotu)",
|
||||||
|
"Portuguese (Brazil)": "portugali (Brasilia)",
|
||||||
|
"Spanish (auto-generated)": "Espanja (automaattisesti luotu)",
|
||||||
|
"Spanish (Mexico)": "Espanja (Meksiko)",
|
||||||
|
"Spanish (Spain)": "Espanja (Espanja)",
|
||||||
|
"Turkish (auto-generated)": "Turkki (automaattisesti luotu)",
|
||||||
|
"Vietnamese (auto-generated)": "Vietnam (automaattisesti luotu)",
|
||||||
|
"search_filters_title": "Suodatin",
|
||||||
|
"search_message_no_results": "Ei tuloksia löydetty.",
|
||||||
|
"search_message_change_filters_or_query": "Yritä hakukyselysi laajentamista ja/tai suodattimien muuttamista.",
|
||||||
|
"search_filters_duration_option_none": "Mikä tahansa kesto",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_apply_button": "Ota valitut suodattimet käyttöön",
|
||||||
|
"search_filters_date_label": "Latausaika",
|
||||||
|
"search_filters_duration_option_medium": "Keskipituinen (4 - 20 minuuttia)",
|
||||||
|
"search_message_use_another_instance": " Voit myös <a href=\"`x`\">hakea toisella instanssilla</a>.",
|
||||||
|
"search_filters_date_option_none": "Milloin tahansa",
|
||||||
|
"search_filters_type_option_all": "Mikä tahansa tyyppi",
|
||||||
|
"Popular enabled: ": "Suosittu käytössä: "
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,6 +116,7 @@
|
|||||||
"preferences_default_home_label": "Page d'accueil par défaut : ",
|
"preferences_default_home_label": "Page d'accueil par défaut : ",
|
||||||
"preferences_feed_menu_label": "Préferences des abonnements : ",
|
"preferences_feed_menu_label": "Préferences des abonnements : ",
|
||||||
"preferences_show_nick_label": "Afficher le nom d'utilisateur en haut à droite : ",
|
"preferences_show_nick_label": "Afficher le nom d'utilisateur en haut à droite : ",
|
||||||
|
"Popular enabled: ": "Page \"populaire\" activée: ",
|
||||||
"Top enabled: ": "Top activé : ",
|
"Top enabled: ": "Top activé : ",
|
||||||
"CAPTCHA enabled: ": "CAPTCHA activé : ",
|
"CAPTCHA enabled: ": "CAPTCHA activé : ",
|
||||||
"Login enabled: ": "Autoriser l'ouverture de sessions utilisateur : ",
|
"Login enabled: ": "Autoriser l'ouverture de sessions utilisateur : ",
|
||||||
@@ -135,7 +136,7 @@
|
|||||||
"subscriptions_unseen_notifs_count_plural": "{{count}} notifications non vues",
|
"subscriptions_unseen_notifs_count_plural": "{{count}} notifications non vues",
|
||||||
"search": "rechercher",
|
"search": "rechercher",
|
||||||
"Log out": "Se déconnecter",
|
"Log out": "Se déconnecter",
|
||||||
"Released under the AGPLv3 on Github.": "Publié sous licence AGPLv3 sur Github.",
|
"Released under the AGPLv3 on Github.": "Publié sous licence AGPLv3 sur GitHub.",
|
||||||
"Source available here.": "Code source disponible ici.",
|
"Source available here.": "Code source disponible ici.",
|
||||||
"View JavaScript license information.": "Informations des licences JavaScript.",
|
"View JavaScript license information.": "Informations des licences JavaScript.",
|
||||||
"View privacy policy.": "Politique de confidentialité.",
|
"View privacy policy.": "Politique de confidentialité.",
|
||||||
@@ -155,7 +156,6 @@
|
|||||||
"Show less": "Afficher moins",
|
"Show less": "Afficher moins",
|
||||||
"Watch on YouTube": "Voir la vidéo sur Youtube",
|
"Watch on YouTube": "Voir la vidéo sur Youtube",
|
||||||
"Switch Invidious Instance": "Changer d'instance",
|
"Switch Invidious Instance": "Changer d'instance",
|
||||||
"Broken? Try another Invidious Instance": "Instance Invidious défectueuse ? Essayez-en une autre",
|
|
||||||
"Hide annotations": "Masquer les annotations",
|
"Hide annotations": "Masquer les annotations",
|
||||||
"Show annotations": "Afficher les annotations",
|
"Show annotations": "Afficher les annotations",
|
||||||
"Genre: ": "Genre : ",
|
"Genre: ": "Genre : ",
|
||||||
@@ -361,33 +361,32 @@
|
|||||||
"Videos": "Vidéos",
|
"Videos": "Vidéos",
|
||||||
"Playlists": "Listes de lecture",
|
"Playlists": "Listes de lecture",
|
||||||
"Community": "Communauté",
|
"Community": "Communauté",
|
||||||
"relevance": "pertinence",
|
"search_filters_sort_option_relevance": "Pertinence",
|
||||||
"rating": "évaluation",
|
"search_filters_sort_option_rating": "Notation",
|
||||||
"date": "date",
|
"search_filters_sort_option_date": "Date d'ajout",
|
||||||
"views": "nombre de vues",
|
"search_filters_sort_option_views": "Nombre de vues",
|
||||||
"content_type": "type",
|
"search_filters_type_label": "Type de contenu",
|
||||||
"duration": "durée",
|
"search_filters_duration_label": "Durée",
|
||||||
"features": "fonctionnalités",
|
"search_filters_features_label": "Fonctionnalités",
|
||||||
"sort": "Trier par",
|
"search_filters_sort_label": "Trier par",
|
||||||
"hour": "dernière heure",
|
"search_filters_date_option_hour": "Dernière heure",
|
||||||
"today": "aujourd'hui",
|
"search_filters_date_option_today": "Aujourd'hui",
|
||||||
"week": "semaine",
|
"search_filters_date_option_week": "Cette semaine",
|
||||||
"month": "mois",
|
"search_filters_date_option_month": "Ce mois-ci",
|
||||||
"year": "année",
|
"search_filters_date_option_year": "Cette année",
|
||||||
"video": "vidéo",
|
"search_filters_type_option_video": "Vidéo",
|
||||||
"channel": "chaîne",
|
"search_filters_type_option_channel": "Chaîne",
|
||||||
"playlist": "liste de lecture",
|
"search_filters_type_option_playlist": "Liste de lecture",
|
||||||
"movie": "film",
|
"search_filters_type_option_movie": "Film",
|
||||||
"show": "émission",
|
"search_filters_type_option_show": "Émission",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "sous-titres / CC",
|
"search_filters_features_option_subtitles": "Sous-titres (CC)",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "en direct",
|
"search_filters_features_option_live": "En direct",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "emplacement",
|
"search_filters_features_option_location": "emplacement",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "filtrer",
|
|
||||||
"Current version: ": "Version actuelle : ",
|
"Current version: ": "Version actuelle : ",
|
||||||
"next_steps_error_message": "Vous pouvez essayer de : ",
|
"next_steps_error_message": "Vous pouvez essayer de : ",
|
||||||
"next_steps_error_message_refresh": "Rafraîchir la page",
|
"next_steps_error_message_refresh": "Rafraîchir la page",
|
||||||
@@ -397,8 +396,8 @@
|
|||||||
"preferences_region_label": "Pays du contenu : ",
|
"preferences_region_label": "Pays du contenu : ",
|
||||||
"footer_donate_page": "Faire un don",
|
"footer_donate_page": "Faire un don",
|
||||||
"footer_modfied_source_code": "Code source modifié",
|
"footer_modfied_source_code": "Code source modifié",
|
||||||
"short": "Courte (< 4 minutes)",
|
"search_filters_duration_option_short": "Courte (< 4 minutes)",
|
||||||
"long": "Longue (> 20 minutes)",
|
"search_filters_duration_option_long": "Longue (> 20 minutes)",
|
||||||
"adminprefs_modified_source_code_url_label": "URL du dépôt du code source modifié",
|
"adminprefs_modified_source_code_url_label": "URL du dépôt du code source modifié",
|
||||||
"footer_documentation": "Documentation",
|
"footer_documentation": "Documentation",
|
||||||
"footer_original_source_code": "Code source original",
|
"footer_original_source_code": "Code source original",
|
||||||
@@ -415,12 +414,12 @@
|
|||||||
"preferences_quality_dash_option_240p": "240p",
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
"preferences_quality_dash_option_144p": "144p",
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
"invidious": "Invidious",
|
"invidious": "Invidious",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"none": "aucun",
|
"none": "aucun",
|
||||||
"videoinfo_started_streaming_x_ago": "En stream depuis `x`",
|
"videoinfo_started_streaming_x_ago": "En stream depuis `x`",
|
||||||
"videoinfo_watch_on_youTube": "Regarder sur YouTube",
|
"videoinfo_watch_on_youTube": "Regarder sur YouTube",
|
||||||
"videoinfo_youTube_embed_link": "Intégrer",
|
"videoinfo_youTube_embed_link": "Intégrer",
|
||||||
"purchased": "Acheter",
|
"search_filters_features_option_purchased": "Acheté",
|
||||||
"videoinfo_invidious_embed_link": "Lien intégré",
|
"videoinfo_invidious_embed_link": "Lien intégré",
|
||||||
"download_subtitles": "Sous-titres - `x` (.vtt)",
|
"download_subtitles": "Sous-titres - `x` (.vtt)",
|
||||||
"user_saved_playlists": "`x` listes de lecture sauvegardées",
|
"user_saved_playlists": "`x` listes de lecture sauvegardées",
|
||||||
@@ -435,7 +434,7 @@
|
|||||||
"crash_page_refresh": "tenté de <a href=\"`x`\">rafraîchir la page</a>",
|
"crash_page_refresh": "tenté de <a href=\"`x`\">rafraîchir la page</a>",
|
||||||
"crash_page_switch_instance": "essayé d'<a href=\"`x`\">utiliser une autre instance</a>",
|
"crash_page_switch_instance": "essayé d'<a href=\"`x`\">utiliser une autre instance</a>",
|
||||||
"crash_page_read_the_faq": "lu la <a href=\"`x`\">Foire Aux Questions (FAQ)</a>",
|
"crash_page_read_the_faq": "lu la <a href=\"`x`\">Foire Aux Questions (FAQ)</a>",
|
||||||
"crash_page_search_issue": "<a href=\"`x`\">cherché ce bug sur Github</a>",
|
"crash_page_search_issue": "<a href=\"`x`\">cherché ce bug sur GitHub</a>",
|
||||||
"crash_page_before_reporting": "Avant de signaler un bug, veuillez vous assurez que vous avez :",
|
"crash_page_before_reporting": "Avant de signaler un bug, veuillez vous assurez que vous avez :",
|
||||||
"crash_page_report_issue": "Si aucune des solutions proposées ci-dessus ne vous a aidé, veuillez <a href=\"`x`\">ouvrir une \"issue\" sur GitHub</a> (de préférence en anglais) et d'y inclure le message suivant (ne PAS traduire le texte) :",
|
"crash_page_report_issue": "Si aucune des solutions proposées ci-dessus ne vous a aidé, veuillez <a href=\"`x`\">ouvrir une \"issue\" sur GitHub</a> (de préférence en anglais) et d'y inclure le message suivant (ne PAS traduire le texte) :",
|
||||||
"English (United States)": "Anglais (Etats-Unis)",
|
"English (United States)": "Anglais (Etats-Unis)",
|
||||||
@@ -461,5 +460,16 @@
|
|||||||
"Vietnamese (auto-generated)": "Vietnamien (auto-généré)",
|
"Vietnamese (auto-generated)": "Vietnamien (auto-généré)",
|
||||||
"Russian (auto-generated)": "Russe (auto-généré)",
|
"Russian (auto-generated)": "Russe (auto-généré)",
|
||||||
"Spanish (Spain)": "Espagnol (Espagne)",
|
"Spanish (Spain)": "Espagnol (Espagne)",
|
||||||
"preferences_watch_history_label": "Activer l'historique de visionnage : "
|
"preferences_watch_history_label": "Activer l'historique de visionnage : ",
|
||||||
|
"search_filters_title": "Filtres",
|
||||||
|
"search_message_change_filters_or_query": "Essayez d'élargir votre recherche et/ou de changer les filtres.",
|
||||||
|
"search_filters_date_option_none": "Toutes les dates",
|
||||||
|
"search_filters_duration_option_medium": "Moyenne (de 4 à 20 minutes)",
|
||||||
|
"search_filters_apply_button": "Appliquer les filtres",
|
||||||
|
"search_message_no_results": "Aucun résultat.",
|
||||||
|
"search_message_use_another_instance": " Vous pouvez également <a href=\"`x`\">effectuer votre recherche sur une autre instance</a>.",
|
||||||
|
"search_filters_type_option_all": "Tous les types",
|
||||||
|
"search_filters_date_label": "Date d'ajout",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_duration_option_none": "Toutes les durées"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -274,32 +274,32 @@
|
|||||||
"Videos": "סרטונים",
|
"Videos": "סרטונים",
|
||||||
"Playlists": "פלייליסטים",
|
"Playlists": "פלייליסטים",
|
||||||
"Community": "קהילה",
|
"Community": "קהילה",
|
||||||
"relevance": "רלוונטיות",
|
"search_filters_sort_option_relevance": "רלוונטיות",
|
||||||
"rating": "דירוג",
|
"search_filters_sort_option_rating": "דירוג",
|
||||||
"date": "תאריך העלאה",
|
"search_filters_sort_option_date": "תאריך העלאה",
|
||||||
"views": "מספר צפיות",
|
"search_filters_sort_option_views": "מספר צפיות",
|
||||||
"content_type": "סוג",
|
"search_filters_type_label": "סוג",
|
||||||
"duration": "משך זמן",
|
"search_filters_duration_label": "משך זמן",
|
||||||
"features": "תכונות",
|
"search_filters_features_label": "תכונות",
|
||||||
"sort": "מיון לפי",
|
"search_filters_sort_label": "מיון לפי",
|
||||||
"hour": "השעה האחרונה",
|
"search_filters_date_option_hour": "השעה האחרונה",
|
||||||
"today": "היום",
|
"search_filters_date_option_today": "היום",
|
||||||
"week": "השבוע",
|
"search_filters_date_option_week": "השבוע",
|
||||||
"month": "החודש",
|
"search_filters_date_option_month": "החודש",
|
||||||
"year": "השנה",
|
"search_filters_date_option_year": "השנה",
|
||||||
"video": "סרטון",
|
"search_filters_type_option_video": "סרטון",
|
||||||
"channel": "ערוץ",
|
"search_filters_type_option_channel": "ערוץ",
|
||||||
"playlist": "פלייליסט",
|
"search_filters_type_option_playlist": "פלייליסט",
|
||||||
"movie": "סרט",
|
"search_filters_type_option_movie": "סרט",
|
||||||
"show": "תכנית טלוויזיה",
|
"search_filters_type_option_show": "תכנית טלוויזיה",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "כתוביות",
|
"search_filters_features_option_subtitles": "כתוביות",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "Live",
|
"search_filters_features_option_live": "Live",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "מיקום",
|
"search_filters_features_option_location": "מיקום",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "סינון",
|
"Current version: ": "הגרסה הנוכחית: ",
|
||||||
"Current version: ": "הגרסה הנוכחית: "
|
"search_filters_title": "סינון"
|
||||||
}
|
}
|
||||||
|
|||||||
474
locales/hi.json
Normal file
474
locales/hi.json
Normal file
@@ -0,0 +1,474 @@
|
|||||||
|
{
|
||||||
|
"last": "आखिरी",
|
||||||
|
"Yes": "हाँ",
|
||||||
|
"No": "नहीं",
|
||||||
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "OPML के रूप में सदस्यताएँ निर्यात करें (NewPipe और FreeTube के लिए)",
|
||||||
|
"Log in/register": "लॉग-इन/पंजीकृत करें",
|
||||||
|
"Log in with Google": "Google के साथ लॉग-इन करें",
|
||||||
|
"preferences_autoplay_label": "अपने आप चलाने की सुविधा: ",
|
||||||
|
"preferences_dark_mode_label": "थीम: ",
|
||||||
|
"preferences_default_home_label": "डिफ़ॉल्ट मुखपृष्ठ: ",
|
||||||
|
"Could not fetch comments": "टिप्पणियाँ प्राप्त न की जा सकीं",
|
||||||
|
"comments_points_count": "{{count}} पॉइंट",
|
||||||
|
"comments_points_count_plural": "{{count}} पॉइंट्स",
|
||||||
|
"Subscription manager": "सदस्यता प्रबंधन",
|
||||||
|
"License: ": "लाइसेंस: ",
|
||||||
|
"Wilson score: ": "Wilson स्कोर: ",
|
||||||
|
"Wrong answer": "गलत जवाब",
|
||||||
|
"Erroneous CAPTCHA": "गलत CAPTCHA",
|
||||||
|
"Please log in": "कृपया लॉग-इन करें",
|
||||||
|
"Bosnian": "बोस्नियाई",
|
||||||
|
"Bulgarian": "बुल्गारियाई",
|
||||||
|
"Burmese": "बर्मी",
|
||||||
|
"Chinese (Traditional)": "चीनी (पारंपरिक)",
|
||||||
|
"Kurdish": "कुर्द",
|
||||||
|
"Punjabi": "पंजाबी",
|
||||||
|
"Sinhala": "सिंहली",
|
||||||
|
"Slovak": "स्लोवाक",
|
||||||
|
"generic_count_days": "{{count}} दिन",
|
||||||
|
"generic_count_days_plural": "{{count}} दिन",
|
||||||
|
"generic_count_hours": "{{count}} घंटे",
|
||||||
|
"generic_count_hours_plural": "{{count}} घंटे",
|
||||||
|
"generic_count_minutes": "{{count}} मिनट",
|
||||||
|
"generic_count_minutes_plural": "{{count}} मिनट",
|
||||||
|
"generic_count_seconds": "{{count}} सेकंड",
|
||||||
|
"generic_count_seconds_plural": "{{count}} सेकंड",
|
||||||
|
"generic_playlists_count": "{{count}} प्लेलिस्ट",
|
||||||
|
"generic_playlists_count_plural": "{{count}} प्लेलिस्ट्स",
|
||||||
|
"crash_page_report_issue": "अगर इनमें से कुछ भी काम नहीं करता, कृपया <a href=\"`x`\">GitHub पर एक नया मुद्दा खोल दें</a> (अंग्रेज़ी में) और अपने संदेश में यह टेक्स्ट दर्ज करें (इसे अनुवादित न करें!):",
|
||||||
|
"generic_views_count": "{{count}} बार देखा गया",
|
||||||
|
"generic_views_count_plural": "{{count}} बार देखा गया",
|
||||||
|
"generic_videos_count": "{{count}} वीडियो",
|
||||||
|
"generic_videos_count_plural": "{{count}} वीडियो",
|
||||||
|
"generic_subscribers_count": "{{count}} सदस्य",
|
||||||
|
"generic_subscribers_count_plural": "{{count}} सदस्य",
|
||||||
|
"generic_subscriptions_count": "{{count}} सदस्यता",
|
||||||
|
"generic_subscriptions_count_plural": "{{count}} सदस्यताएँ",
|
||||||
|
"LIVE": "लाइव",
|
||||||
|
"Shared `x` ago": "`x` पहले बाँटा गया",
|
||||||
|
"Unsubscribe": "सदस्यता छोड़ें",
|
||||||
|
"Subscribe": "सदस्यता लें",
|
||||||
|
"View channel on YouTube": "चैनल YouTube पर देखें",
|
||||||
|
"View playlist on YouTube": "प्लेलिस्ट YouTube पर देखें",
|
||||||
|
"newest": "सबसे नया",
|
||||||
|
"oldest": "सबसे पुराना",
|
||||||
|
"popular": "सर्वाधिक लोकप्रिय",
|
||||||
|
"Next page": "अगला पृष्ठ",
|
||||||
|
"Previous page": "पिछला पृष्ठ",
|
||||||
|
"Clear watch history?": "देखने का इतिहास मिटाएँ?",
|
||||||
|
"New password": "नया पासवर्ड",
|
||||||
|
"New passwords must match": "पासवर्ड्स को मेल खाना होगा",
|
||||||
|
"Cannot change password for Google accounts": "Google खातों के लिए पासवर्ड नहीं बदल सकते",
|
||||||
|
"Authorize token?": "टोकन को प्रमाणित करें?",
|
||||||
|
"Authorize token for `x`?": "`x` के लिए टोकन को प्रमाणित करें?",
|
||||||
|
"Import and Export Data": "डेटा को आयात और निर्यात करें",
|
||||||
|
"Import": "आयात करें",
|
||||||
|
"Import Invidious data": "Invidious JSON डेटा आयात करें",
|
||||||
|
"Import YouTube subscriptions": "YouTube/OPML सदस्यताएँ आयात करें",
|
||||||
|
"Import FreeTube subscriptions (.db)": "FreeTube सदस्यताएँ आयात करें (.db)",
|
||||||
|
"Import NewPipe subscriptions (.json)": "NewPipe सदस्यताएँ आयात करें (.json)",
|
||||||
|
"Import NewPipe data (.zip)": "NewPipe डेटा आयात करें (.zip)",
|
||||||
|
"Export": "निर्यात करें",
|
||||||
|
"Export subscriptions as OPML": "OPML के रूप में सदस्यताएँ निर्यात करें",
|
||||||
|
"Export data as JSON": "Invidious डेटा को JSON के रूप में निर्यात करें",
|
||||||
|
"Delete account?": "खाता हटाएँ?",
|
||||||
|
"History": "देखे गए वीडियो",
|
||||||
|
"An alternative front-end to YouTube": "YouTube का एक वैकल्पिक फ्रंट-एंड",
|
||||||
|
"JavaScript license information": "जावास्क्रिप्ट लाइसेंस की जानकारी",
|
||||||
|
"source": "स्रोत",
|
||||||
|
"Log in": "लॉग-इन करें",
|
||||||
|
"User ID": "सदस्य ID",
|
||||||
|
"Password": "पासवर्ड",
|
||||||
|
"Register": "पंजीकृत करें",
|
||||||
|
"E-mail": "ईमेल",
|
||||||
|
"Google verification code": "Google प्रमाणीकरण कोड",
|
||||||
|
"Time (h:mm:ss):": "समय (घं:मिमि:सेसे):",
|
||||||
|
"Text CAPTCHA": "टेक्स्ट CAPTCHA",
|
||||||
|
"Image CAPTCHA": "चित्र CAPTCHA",
|
||||||
|
"Sign In": "साइन इन करें",
|
||||||
|
"Preferences": "प्राथमिकताएँ",
|
||||||
|
"preferences_category_player": "प्लेयर की प्राथमिकताएँ",
|
||||||
|
"preferences_video_loop_label": "हमेशा लूप करें: ",
|
||||||
|
"preferences_continue_label": "डिफ़ॉल्ट से अगला चलाएँ: ",
|
||||||
|
"preferences_continue_autoplay_label": "अगला वीडियो अपने आप चलाएँ: ",
|
||||||
|
"preferences_listen_label": "डिफ़ॉल्ट से सुनें: ",
|
||||||
|
"preferences_local_label": "प्रॉक्सी वीडियो: ",
|
||||||
|
"preferences_watch_history_label": "देखने का इतिहास सक्षम करें: ",
|
||||||
|
"preferences_speed_label": "वीडियो चलाने की डिफ़ॉल्ट रफ़्तार: ",
|
||||||
|
"preferences_quality_label": "वीडियो की प्राथमिक क्वालिटी: ",
|
||||||
|
"preferences_quality_option_dash": "DASH (अनुकूली गुणवत्ता)",
|
||||||
|
"preferences_quality_option_hd720": "HD720",
|
||||||
|
"preferences_quality_option_medium": "मध्यम",
|
||||||
|
"preferences_quality_option_small": "छोटा",
|
||||||
|
"preferences_quality_dash_label": "प्राथमिक DASH वीडियो क्वालिटी: ",
|
||||||
|
"preferences_quality_dash_option_720p": "720p",
|
||||||
|
"preferences_quality_dash_option_auto": "अपने-आप",
|
||||||
|
"preferences_quality_dash_option_best": "सबसे अच्छा",
|
||||||
|
"preferences_quality_dash_option_worst": "सबसे खराब",
|
||||||
|
"preferences_quality_dash_option_4320p": "4320p",
|
||||||
|
"preferences_quality_dash_option_2160p": "2160p",
|
||||||
|
"preferences_quality_dash_option_1440p": "1440p",
|
||||||
|
"preferences_quality_dash_option_1080p": "1080p",
|
||||||
|
"preferences_quality_dash_option_480p": "480p",
|
||||||
|
"preferences_quality_dash_option_360p": "360p",
|
||||||
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
|
"preferences_comments_label": "डिफ़ॉल्ट टिप्पणियाँ: ",
|
||||||
|
"preferences_volume_label": "प्लेयर का वॉल्यूम: ",
|
||||||
|
"youtube": "YouTube",
|
||||||
|
"reddit": "Reddit",
|
||||||
|
"invidious": "Invidious",
|
||||||
|
"preferences_captions_label": "डिफ़ॉल्ट कैप्शन: ",
|
||||||
|
"Fallback captions: ": "वैकल्पिक कैप्शन: ",
|
||||||
|
"preferences_related_videos_label": "संबंधित वीडियो दिखाएँ: ",
|
||||||
|
"preferences_annotations_label": "डिफ़ॉल्ट से टिप्पणियाँ दिखाएँ: ",
|
||||||
|
"preferences_extend_desc_label": "अपने आप वीडियो के विवरण का विस्तार करें: ",
|
||||||
|
"preferences_vr_mode_label": "उत्तरदायी 360 डिग्री वीडियो (WebGL की ज़रूरत है): ",
|
||||||
|
"preferences_category_visual": "यथादृश्य प्राथमिकताएँ",
|
||||||
|
"preferences_region_label": "सामग्री का राष्ट्र: ",
|
||||||
|
"preferences_player_style_label": "प्लेयर का स्टाइल: ",
|
||||||
|
"Dark mode: ": "डार्क मोड: ",
|
||||||
|
"dark": "डार्क",
|
||||||
|
"light": "लाइट",
|
||||||
|
"preferences_thin_mode_label": "हल्का मोड: ",
|
||||||
|
"preferences_category_misc": "विविध प्राथमिकताएँ",
|
||||||
|
"preferences_automatic_instance_redirect_label": "अपने आप अनुप्रेषित करें (redirect.invidious.io पर फ़ॉलबैक करें): ",
|
||||||
|
"preferences_category_subscription": "सदस्यताओं की प्राथमिकताएँ",
|
||||||
|
"preferences_annotations_subscribed_label": "सदस्यता लिए गए चैनलों पर डिफ़ॉल्ट से टिप्पणियाँ दिखाएँ? ",
|
||||||
|
"Redirect homepage to feed: ": "फ़ीड पर मुखपृष्ठ को अनुप्रेषित करें: ",
|
||||||
|
"preferences_max_results_label": "फ़ीड में दिखाए जाने वाले वीडियों की संख्या: ",
|
||||||
|
"preferences_sort_label": "वीडियों को इस मानदंड पर छाँटें: ",
|
||||||
|
"published": "प्रकाशित",
|
||||||
|
"published - reverse": "प्रकाशित - उल्टा",
|
||||||
|
"Only show latest video from channel: ": "चैनल से सिर्फ नवीनतम वीडियो ही दिखाएँ: ",
|
||||||
|
"alphabetically": "वर्णक्रमानुसार",
|
||||||
|
"Only show latest unwatched video from channel: ": "चैनल से सिर्फ न देखा गया नवीनतम वीडियो ही दिखाएँ: ",
|
||||||
|
"alphabetically - reverse": "वर्णक्रमानुसार - उल्टा",
|
||||||
|
"channel name": "चैनल का नाम",
|
||||||
|
"channel name - reverse": "चैनल का नाम - उल्टा",
|
||||||
|
"preferences_unseen_only_label": "सिर्फ न देखे गए वीडियो ही दिखाएँ: ",
|
||||||
|
"preferences_notifications_only_label": "सिर्फ सूचनाएँ दिखाएँ (अगर हो तो): ",
|
||||||
|
"Enable web notifications": "वेब सूचनाएँ सक्षम करें",
|
||||||
|
"`x` uploaded a video": "`x` ने वीडियो अपलोड किया",
|
||||||
|
"`x` is live": "`x` लाइव हैं",
|
||||||
|
"preferences_category_data": "डेटा की प्राथमिकताएँ",
|
||||||
|
"Clear watch history": "देखने का इतिहास साफ़ करें",
|
||||||
|
"Import/export data": "डेटा को आयात/निर्यात करें",
|
||||||
|
"Change password": "पासवर्ड बदलें",
|
||||||
|
"Manage subscriptions": "सदस्यताएँ प्रबंधित करें",
|
||||||
|
"Manage tokens": "टोकन प्रबंधित करें",
|
||||||
|
"Watch history": "देखने का इतिहास",
|
||||||
|
"Delete account": "खाता हटाएँ",
|
||||||
|
"preferences_category_admin": "प्रबंधक प्राथमिकताएँ",
|
||||||
|
"preferences_feed_menu_label": "फ़ीड मेन्यू: ",
|
||||||
|
"preferences_show_nick_label": "ऊपर उपनाम दिखाएँ: ",
|
||||||
|
"Top enabled: ": "ऊपर का हिस्सा सक्षम है: ",
|
||||||
|
"CAPTCHA enabled: ": "CAPTCHA सक्षम है: ",
|
||||||
|
"Login enabled: ": "लॉग-इन सक्षम है: ",
|
||||||
|
"Registration enabled: ": "पंजीकरण सक्षम है: ",
|
||||||
|
"Report statistics: ": "सांख्यिकी रिपोर्ट करें: ",
|
||||||
|
"Released under the AGPLv3 on Github.": "GitHub पर AGPLv3 के अंतर्गत प्रकाशित।",
|
||||||
|
"Save preferences": "प्राथमिकताएँ सहेजें",
|
||||||
|
"Token manager": "टोकन प्रबंधन",
|
||||||
|
"Token": "टोकन",
|
||||||
|
"tokens_count": "{{count}} टोकन",
|
||||||
|
"tokens_count_plural": "{{count}} टोकन",
|
||||||
|
"Import/export": "आयात/निर्यात करें",
|
||||||
|
"unsubscribe": "सदस्यता छोड़ें",
|
||||||
|
"revoke": "हटाएँ",
|
||||||
|
"Subscriptions": "सदस्यताएँ",
|
||||||
|
"subscriptions_unseen_notifs_count": "{{count}} अपठित सूचना",
|
||||||
|
"subscriptions_unseen_notifs_count_plural": "{{count}} अपठित सूचना",
|
||||||
|
"search": "खोजें",
|
||||||
|
"Log out": "लॉग-आउट करें",
|
||||||
|
"Source available here.": "स्रोत यहाँ उपलब्ध है।",
|
||||||
|
"View JavaScript license information.": "जावास्क्रिप्ट लाइसेंस की जानकारी देखें।",
|
||||||
|
"View privacy policy.": "निजता नीति देखें।",
|
||||||
|
"Trending": "रुझान में",
|
||||||
|
"Public": "सार्वजनिक",
|
||||||
|
"Unlisted": "सबके लिए उपलब्ध नहीं",
|
||||||
|
"Private": "निजी",
|
||||||
|
"View all playlists": "सभी प्लेलिस्ट देखें",
|
||||||
|
"Create playlist": "प्लेलिस्ट बनाएँ",
|
||||||
|
"Updated `x` ago": "`x` पहले अपडेट किया गया",
|
||||||
|
"Delete playlist `x`?": "प्लेलिस्ट `x` हटाएँ?",
|
||||||
|
"Delete playlist": "प्लेलिस्ट हटाएँ",
|
||||||
|
"Title": "शीर्षक",
|
||||||
|
"Playlist privacy": "प्लेलिस्ट की निजता",
|
||||||
|
"Editing playlist `x`": "प्लेलिस्ट `x` को संपादित किया जा रहा है",
|
||||||
|
"Show more": "अधिक देखें",
|
||||||
|
"Show less": "कम देखें",
|
||||||
|
"Watch on YouTube": "YouTube पर देखें",
|
||||||
|
"Switch Invidious Instance": "Invidious उदाहरण बदलें",
|
||||||
|
"search_message_no_results": "कोई परिणाम नहीं मिला।",
|
||||||
|
"search_message_change_filters_or_query": "अपने खोज क्वेरी को और चौड़ा करें और/या फ़िल्टर बदलें।",
|
||||||
|
"search_message_use_another_instance": " आप <a href=\"`x`\">दूसरे उदाहरण पर भी खोज सकते हैं</a>।",
|
||||||
|
"Hide annotations": "टिप्पणियाँ छिपाएँ",
|
||||||
|
"Show annotations": "टिप्पणियाँ दिखाएँ",
|
||||||
|
"Genre: ": "श्रेणी: ",
|
||||||
|
"Family friendly? ": "परिवार के लिए ठीक है? ",
|
||||||
|
"Engagement: ": "सगाई: ",
|
||||||
|
"Whitelisted regions: ": "स्वीकृत क्षेत्र: ",
|
||||||
|
"Blacklisted regions: ": "अस्वीकृत क्षेत्र: ",
|
||||||
|
"Shared `x`": "`x` बाँटा गया",
|
||||||
|
"Premieres in `x`": "`x` बाद प्रीमियर होगा",
|
||||||
|
"Premieres `x`": "`x` को प्रीमिर होगा",
|
||||||
|
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "नमस्कार! ऐसा लगता है कि आपका जावास्क्रिप्ट अक्षम है। टिप्पणियाँ देखने के लिए यहाँ क्लिक करें, लेकिन याद रखें कि इन्हें लोड होने में थोड़ा ज़्यादा समय लग सकता है।",
|
||||||
|
"View YouTube comments": "YouTube टिप्पणियाँ देखें",
|
||||||
|
"View more comments on Reddit": "Reddit पर अधिक टिप्पणियाँ देखें",
|
||||||
|
"View `x` comments": {
|
||||||
|
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` टिप्पणी देखें",
|
||||||
|
"": "`x` टिप्पणियाँ देखें"
|
||||||
|
},
|
||||||
|
"View Reddit comments": "Reddit पर टिप्पणियाँ",
|
||||||
|
"Hide replies": "जवाब छिपाएँ",
|
||||||
|
"Show replies": "जवाब दिखाएँ",
|
||||||
|
"Incorrect password": "गलत पासवर्ड",
|
||||||
|
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "लॉग-इन नहीं किया जा सका, सुनिश्चित करें कि दो-कारक प्रमाणीकरण (Authenticator या SMS) सक्षम है।",
|
||||||
|
"Invalid TFA code": "अमान्य TFA कोड",
|
||||||
|
"Login failed. This may be because two-factor authentication is not turned on for your account.": "लॉग-इन नाकाम रहा। ऐसा इसलिए हो सकता है कि दो-कारक प्रमाणीकरण आपके खाते पर सक्षम नहीं है।",
|
||||||
|
"Quota exceeded, try again in a few hours": "कोटा पार हो चुका है, कृपया कुछ घंटों में फिर कोशिश करें",
|
||||||
|
"CAPTCHA is a required field": "CAPTCHA एक ज़रूरी फ़ील्ड है",
|
||||||
|
"User ID is a required field": "सदस्य ID एक ज़रूरी फ़ील्ड है",
|
||||||
|
"Password is a required field": "पासवर्ड एक ज़रूरी फ़ील्ड है",
|
||||||
|
"Wrong username or password": "गलत सदस्यनाम या पासवर्ड",
|
||||||
|
"Please sign in using 'Log in with Google'": "कृपया 'Google के साथ लॉग-इन करें' के साथ साइन-इन करें",
|
||||||
|
"Password cannot be empty": "पासवर्ड खाली नहीं हो सकता",
|
||||||
|
"Password cannot be longer than 55 characters": "पासवर्ड में अधिकतम 55 अक्षर हो सकते हैं",
|
||||||
|
"Invidious Private Feed for `x`": "`x` के लिए Invidious निजी फ़ीड",
|
||||||
|
"channel:`x`": "चैनल:`x`",
|
||||||
|
"Deleted or invalid channel": "हटाया गया या अमान्य चैनल",
|
||||||
|
"This channel does not exist.": "यह चैनल मौजूद नहीं है।",
|
||||||
|
"Could not get channel info.": "चैनल की जानकारी प्राप्त न की जा सकी।",
|
||||||
|
"comments_view_x_replies": "{{count}} टिप्पणी देखें",
|
||||||
|
"comments_view_x_replies_plural": "{{count}} टिप्पणियाँ देखें",
|
||||||
|
"`x` ago": "`x` पहले",
|
||||||
|
"Load more": "अधिक लोड करें",
|
||||||
|
"Could not create mix.": "मिक्स न बनाया जा सका।",
|
||||||
|
"Empty playlist": "खाली प्लेलिस्ट",
|
||||||
|
"Not a playlist.": "यह प्लेलिस्ट नहीं है।",
|
||||||
|
"Playlist does not exist.": "प्लेलिस्ट मौजूद नहीं है।",
|
||||||
|
"Could not pull trending pages.": "रुझान के पृष्ठ प्राप्त न किए जा सके।",
|
||||||
|
"Hidden field \"challenge\" is a required field": "छिपाया गया फ़ील्ड \"चुनौती\" एक आवश्यक फ़ील्ड है",
|
||||||
|
"Hidden field \"token\" is a required field": "छिपाया गया फ़ील्ड \"टोकन\" एक आवश्यक फ़ील्ड है",
|
||||||
|
"Erroneous challenge": "त्रुटिपूर्ण चुनौती",
|
||||||
|
"Erroneous token": "त्रुटिपूर्ण टोकन",
|
||||||
|
"No such user": "यह सदस्य मौजूद नहीं हैं",
|
||||||
|
"Token is expired, please try again": "टोकन की समय-सीमा समाप्त हो चुकी है, कृपया दोबारा कोशिश करें",
|
||||||
|
"English": "अंग्रेज़ी",
|
||||||
|
"English (United Kingdom)": "अंग्रेज़ी (यूनाइटेड किंग्डम)",
|
||||||
|
"English (United States)": "अंग्रेज़ी (संयुक्त राष्ट्र)",
|
||||||
|
"English (auto-generated)": "अंग्रेज़ी (अपने-आप जनरेट हुआ)",
|
||||||
|
"Afrikaans": "अफ़्रीकी",
|
||||||
|
"Albanian": "अल्बानियाई",
|
||||||
|
"Amharic": "अम्हेरी",
|
||||||
|
"Arabic": "अरबी",
|
||||||
|
"Armenian": "आर्मेनियाई",
|
||||||
|
"Belarusian": "बेलारूसी",
|
||||||
|
"Azerbaijani": "अज़रबैजानी",
|
||||||
|
"Bangla": "बंगाली",
|
||||||
|
"Basque": "बास्क",
|
||||||
|
"Cantonese (Hong Kong)": "कैंटोनीज़ (हाँग काँग)",
|
||||||
|
"Catalan": "कातालान",
|
||||||
|
"Cebuano": "सेबुआनो",
|
||||||
|
"Chinese": "चीनी",
|
||||||
|
"Chinese (China)": "चीनी (चीन)",
|
||||||
|
"Chinese (Hong Kong)": "चीनी (हाँग काँग)",
|
||||||
|
"Chinese (Simplified)": "चीनी (सरलीकृत)",
|
||||||
|
"Chinese (Taiwan)": "चीनी (ताइवान)",
|
||||||
|
"Corsican": "कोर्सिकन",
|
||||||
|
"Croatian": "क्रोएशियाई",
|
||||||
|
"Czech": "चेक",
|
||||||
|
"Danish": "डेनिश",
|
||||||
|
"Dutch": "डच",
|
||||||
|
"Dutch (auto-generated)": "डच (अपने-आप जनरेट हुआ)",
|
||||||
|
"Esperanto": "एस्पेरांतो",
|
||||||
|
"Estonian": "एस्टोनियाई",
|
||||||
|
"Filipino": "फ़िलिपीनो",
|
||||||
|
"Finnish": "फ़िनिश",
|
||||||
|
"French": "फ़्रेंच",
|
||||||
|
"French (auto-generated)": "फ़्रेंच (अपने-आप जनरेट हुआ)",
|
||||||
|
"Galician": "गैलिशियन",
|
||||||
|
"Georgian": "जॉर्जियाई",
|
||||||
|
"German": "जर्मन",
|
||||||
|
"German (auto-generated)": "जर्मन (अपने-आप जनरेट हुआ)",
|
||||||
|
"Greek": "यूनानी",
|
||||||
|
"Gujarati": "गुजराती",
|
||||||
|
"Haitian Creole": "हैती क्रियोल",
|
||||||
|
"Hausa": "हौसा",
|
||||||
|
"Hawaiian": "हवाई",
|
||||||
|
"Hebrew": "हीब्रू",
|
||||||
|
"Hindi": "हिन्दी",
|
||||||
|
"Hmong": "हमोंग",
|
||||||
|
"Hungarian": "हंगेरी",
|
||||||
|
"Icelandic": "आइसलैंडिक",
|
||||||
|
"Igbo": "इग्बो",
|
||||||
|
"Indonesian": "इंडोनेशियाई",
|
||||||
|
"Indonesian (auto-generated)": "इंडोनेशियाई (अपने-आप जनरेट हुआ)",
|
||||||
|
"Interlingue": "इंटरलिंगुआ",
|
||||||
|
"Irish": "आयरिश",
|
||||||
|
"Italian": "इतालवी",
|
||||||
|
"Italian (auto-generated)": "इतालवी (अपने-आप जनरेट हुआ)",
|
||||||
|
"Japanese": "जापानी",
|
||||||
|
"Japanese (auto-generated)": "जापानी (अपने-आप जनरेट हुआ)",
|
||||||
|
"Javanese": "जावानीज़",
|
||||||
|
"Kannada": "कन्नड़",
|
||||||
|
"Kazakh": "कज़ाख़",
|
||||||
|
"Khmer": "खमेर",
|
||||||
|
"Korean": "कोरियाई",
|
||||||
|
"Korean (auto-generated)": "कोरियाई (अपने-आप जनरेट हुआ)",
|
||||||
|
"Kyrgyz": "किर्गीज़",
|
||||||
|
"Lao": "लाओ",
|
||||||
|
"Latin": "लैटिन",
|
||||||
|
"Latvian": "लातवियाई",
|
||||||
|
"Lithuanian": "लिथुएनियाई",
|
||||||
|
"Luxembourgish": "लग्ज़मबर्गी",
|
||||||
|
"Macedonian": "मकादूनियाई",
|
||||||
|
"Malagasy": "मालागासी",
|
||||||
|
"Malay": "मलय",
|
||||||
|
"Malayalam": "मलयालम",
|
||||||
|
"Maltese": "माल्टीज़",
|
||||||
|
"Maori": "माओरी",
|
||||||
|
"Marathi": "मराठी",
|
||||||
|
"Mongolian": "मंगोलियाई",
|
||||||
|
"Nepali": "नेपाली",
|
||||||
|
"Norwegian Bokmål": "नॉर्वेजियाई",
|
||||||
|
"Nyanja": "न्यानजा",
|
||||||
|
"Pashto": "पश्तो",
|
||||||
|
"Persian": "फ़ारसी",
|
||||||
|
"Polish": "पोलिश",
|
||||||
|
"Portuguese": "पुर्तगाली",
|
||||||
|
"Portuguese (auto-generated)": "पुर्तगाली (अपने-आप जनरेट हुआ)",
|
||||||
|
"Portuguese (Brazil)": "पुर्तगाली (ब्राज़ील)",
|
||||||
|
"Romanian": "रोमेनियाई",
|
||||||
|
"Russian": "रूसी",
|
||||||
|
"Russian (auto-generated)": "रूसी (अपने-आप जनरेट हुआ)",
|
||||||
|
"Samoan": "सामोन",
|
||||||
|
"Scottish Gaelic": "स्कॉटिश गाएलिक",
|
||||||
|
"Serbian": "सर्बियाई",
|
||||||
|
"Shona": "शोणा",
|
||||||
|
"Sindhi": "सिंधी",
|
||||||
|
"Slovenian": "स्लोवेनियाई",
|
||||||
|
"Somali": "सोमाली",
|
||||||
|
"Southern Sotho": "दक्षिणी सोथो",
|
||||||
|
"Spanish": "स्पेनी",
|
||||||
|
"Spanish (auto-generated)": "स्पेनी (अपने-आप जनरेट हुआ)",
|
||||||
|
"Spanish (Latin America)": "स्पेनी (लातिन अमेरिकी)",
|
||||||
|
"Spanish (Mexico)": "स्पेनी (मेक्सिको)",
|
||||||
|
"Spanish (Spain)": "स्पेनी (स्पेन)",
|
||||||
|
"Sundanese": "सुंडानी",
|
||||||
|
"Swahili": "स्वाहिली",
|
||||||
|
"Swedish": "स्वीडिश",
|
||||||
|
"Tajik": "ताजीक",
|
||||||
|
"Tamil": "तमिल",
|
||||||
|
"Telugu": "तेलुगु",
|
||||||
|
"Thai": "थाई",
|
||||||
|
"Turkish": "तुर्की",
|
||||||
|
"Turkish (auto-generated)": "तुर्की (अपने-आप जनरेट हुआ)",
|
||||||
|
"Ukrainian": "यूक्रेनी",
|
||||||
|
"Urdu": "उर्दू",
|
||||||
|
"Uzbek": "उज़्बेक",
|
||||||
|
"Vietnamese": "वियतनामी",
|
||||||
|
"Vietnamese (auto-generated)": "वियतनामी (अपने-आप जनरेट हुआ)",
|
||||||
|
"Welsh": "Welsh",
|
||||||
|
"Western Frisian": "पश्चिमी फ़्रिसियाई",
|
||||||
|
"Xhosa": "खोसा",
|
||||||
|
"Yiddish": "यहूदी",
|
||||||
|
"generic_count_years": "{{count}} वर्ष",
|
||||||
|
"generic_count_years_plural": "{{count}} वर्ष",
|
||||||
|
"Yoruba": "योरुबा",
|
||||||
|
"generic_count_months": "{{count}} महीने",
|
||||||
|
"generic_count_months_plural": "{{count}} महीने",
|
||||||
|
"Zulu": "ज़ूलू",
|
||||||
|
"generic_count_weeks": "{{count}} हफ़्ते",
|
||||||
|
"generic_count_weeks_plural": "{{count}} हफ़्ते",
|
||||||
|
"Fallback comments: ": "फ़ॉलबैक टिप्पणियाँ: ",
|
||||||
|
"Popular": "प्रसिद्ध",
|
||||||
|
"Search": "खोजें",
|
||||||
|
"Top": "ऊपर",
|
||||||
|
"About": "जानकारी",
|
||||||
|
"Rating: ": "रेटिंग: ",
|
||||||
|
"preferences_locale_label": "भाषा: ",
|
||||||
|
"View as playlist": "प्लेलिस्ट के रूप में देखें",
|
||||||
|
"Default": "डिफ़ॉल्ट",
|
||||||
|
"Download": "डाउनलोड करें",
|
||||||
|
"Download as: ": "इस रूप में डाउनलोड करें: ",
|
||||||
|
"%A %B %-d, %Y": "%A %B %-d, %Y",
|
||||||
|
"Music": "संगीत",
|
||||||
|
"Gaming": "गेमिंग",
|
||||||
|
"News": "समाचार",
|
||||||
|
"Movies": "फ़िल्में",
|
||||||
|
"(edited)": "(संपादित)",
|
||||||
|
"YouTube comment permalink": "YouTube पर टिप्पणी की स्थायी कड़ी",
|
||||||
|
"permalink": "स्थायी कड़ी",
|
||||||
|
"Videos": "वीडियो",
|
||||||
|
"`x` marked it with a ❤": "`x` ने इसे एक ❤ से चिह्नित किया",
|
||||||
|
"Audio mode": "ऑडियो मोड",
|
||||||
|
"Playlists": "प्लेलिस्ट्स",
|
||||||
|
"Video mode": "वीडियो मोड",
|
||||||
|
"Community": "समुदाय",
|
||||||
|
"search_filters_title": "फ़िल्टर",
|
||||||
|
"search_filters_date_label": "अपलोड करने का समय",
|
||||||
|
"search_filters_date_option_none": "कोई भी समय",
|
||||||
|
"search_filters_date_option_week": "इस हफ़्ते",
|
||||||
|
"search_filters_date_option_month": "इस महीने",
|
||||||
|
"search_filters_date_option_hour": "पिछला घंटा",
|
||||||
|
"search_filters_date_option_today": "आज",
|
||||||
|
"search_filters_date_option_year": "इस साल",
|
||||||
|
"search_filters_type_label": "प्रकार",
|
||||||
|
"search_filters_type_option_all": "कोई भी प्रकार",
|
||||||
|
"search_filters_type_option_video": "वीडियो",
|
||||||
|
"search_filters_type_option_channel": "चैनल",
|
||||||
|
"search_filters_sort_option_relevance": "प्रासंगिकता",
|
||||||
|
"search_filters_type_option_playlist": "प्लेलिस्ट",
|
||||||
|
"search_filters_type_option_movie": "फ़िल्म",
|
||||||
|
"search_filters_type_option_show": "शो",
|
||||||
|
"search_filters_duration_label": "अवधि",
|
||||||
|
"search_filters_duration_option_none": "कोई भी अवधि",
|
||||||
|
"search_filters_duration_option_short": "4 मिनट से कम",
|
||||||
|
"search_filters_duration_option_medium": "4 से 20 मिनट तक",
|
||||||
|
"search_filters_duration_option_long": "20 मिनट से ज़्यादा",
|
||||||
|
"search_filters_features_label": "सुविधाएँ",
|
||||||
|
"search_filters_features_option_live": "लाइव",
|
||||||
|
"search_filters_sort_option_rating": "रेटिंग",
|
||||||
|
"search_filters_features_option_four_k": "4K",
|
||||||
|
"search_filters_features_option_hd": "HD",
|
||||||
|
"search_filters_features_option_subtitles": "उपशीर्षक/कैप्शन",
|
||||||
|
"search_filters_features_option_c_commons": "क्रिएटिव कॉमन्स",
|
||||||
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_features_option_three_d": "3D",
|
||||||
|
"search_filters_features_option_hdr": "HDR",
|
||||||
|
"search_filters_features_option_location": "जगह",
|
||||||
|
"search_filters_features_option_purchased": "खरीदा गया",
|
||||||
|
"search_filters_sort_label": "इस क्रम से लगाएँ",
|
||||||
|
"search_filters_sort_option_date": "अपलोड की ताऱीख",
|
||||||
|
"search_filters_sort_option_views": "देखे जाने की संख्या",
|
||||||
|
"search_filters_apply_button": "चयनित फ़िल्टर लागू करें",
|
||||||
|
"footer_documentation": "प्रलेख",
|
||||||
|
"footer_source_code": "स्रोत कोड",
|
||||||
|
"footer_original_source_code": "मूल स्रोत कोड",
|
||||||
|
"footer_modfied_source_code": "बदला गया स्रोत कोड",
|
||||||
|
"Current version: ": "वर्तमान संस्करण: ",
|
||||||
|
"next_steps_error_message": "इसके बाद आपके ये आज़माने चाहिए: ",
|
||||||
|
"next_steps_error_message_refresh": "साफ़ करें",
|
||||||
|
"next_steps_error_message_go_to_youtube": "YouTube पर जाएँ",
|
||||||
|
"footer_donate_page": "दान करें",
|
||||||
|
"adminprefs_modified_source_code_url_label": "बदले गए स्रोत कोड के रिपॉज़िटरी का URL",
|
||||||
|
"none": "कुछ नहीं",
|
||||||
|
"videoinfo_started_streaming_x_ago": "`x` पहले स्ट्रीम करना शुरू किया",
|
||||||
|
"videoinfo_watch_on_youTube": "YouTube पर देखें",
|
||||||
|
"Video unavailable": "वीडियो उपलब्ध नहीं है",
|
||||||
|
"preferences_save_player_pos_label": "यहाँ से चलाना शुरू करें: ",
|
||||||
|
"crash_page_you_found_a_bug": "शायद आपको Invidious में कोई बग नज़र आ गया है!",
|
||||||
|
"videoinfo_youTube_embed_link": "एम्बेड करें",
|
||||||
|
"videoinfo_invidious_embed_link": "एम्बेड करने की कड़ी",
|
||||||
|
"download_subtitles": "उपशीर्षक - `x` (.vtt)",
|
||||||
|
"user_created_playlists": "बनाए गए `x` प्लेलिस्ट्स",
|
||||||
|
"user_saved_playlists": "सहेजे गए `x` प्लेलिस्ट्स",
|
||||||
|
"crash_page_before_reporting": "बग रिपोर्ट करने से पहले:",
|
||||||
|
"crash_page_switch_instance": "<a href=\"`x`\">किसी दूसरे उदाहरण का इस्तेमाल करें</a>",
|
||||||
|
"crash_page_read_the_faq": "<a href=\"`x`\">अक्सर पूछे जाने वाले प्रश्न (FAQ)</a> पढ़ें",
|
||||||
|
"crash_page_refresh": "<a href=\"`x`\">पृष्ठ को एक बार साफ़ करें</a>",
|
||||||
|
"crash_page_search_issue": "<a href=\"`x`\">GitHub पर मौजूदा मुद्दे</a> ढूँढ़ें"
|
||||||
|
}
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
"channel name": "ime kanala",
|
"channel name": "ime kanala",
|
||||||
"channel name - reverse": "ime kanala – obrnuto",
|
"channel name - reverse": "ime kanala – obrnuto",
|
||||||
"Only show latest video from channel: ": "Prikaži samo najnovija videa kanala: ",
|
"Only show latest video from channel: ": "Prikaži samo najnovija videa kanala: ",
|
||||||
"Only show latest unwatched video from channel: ": "Prikaži samo najnovija nepogledana videa kanala: ",
|
"Only show latest unwatched video from channel: ": "Prikaži samo najnovija nepogledana videa od kanala: ",
|
||||||
"preferences_unseen_only_label": "Prikaži samo nepogledane: ",
|
"preferences_unseen_only_label": "Prikaži samo nepogledane: ",
|
||||||
"preferences_notifications_only_label": "Prikaži samo obavijesti (ako ih ima): ",
|
"preferences_notifications_only_label": "Prikaži samo obavijesti (ako ih ima): ",
|
||||||
"Enable web notifications": "Aktiviraj web-obavijesti",
|
"Enable web notifications": "Aktiviraj web-obavijesti",
|
||||||
@@ -107,7 +107,7 @@
|
|||||||
"preferences_feed_menu_label": "Izbornik za feedove: ",
|
"preferences_feed_menu_label": "Izbornik za feedove: ",
|
||||||
"preferences_show_nick_label": "Prikaži nadimak na vrhu: ",
|
"preferences_show_nick_label": "Prikaži nadimak na vrhu: ",
|
||||||
"Top enabled: ": "Najbolji aktivirani: ",
|
"Top enabled: ": "Najbolji aktivirani: ",
|
||||||
"CAPTCHA enabled: ": "Aktivirani CAPTCHA: ",
|
"CAPTCHA enabled: ": "CAPTCHA aktiviran: ",
|
||||||
"Login enabled: ": "Prijava aktivirana: ",
|
"Login enabled: ": "Prijava aktivirana: ",
|
||||||
"Registration enabled: ": "Registracija aktivirana: ",
|
"Registration enabled: ": "Registracija aktivirana: ",
|
||||||
"Report statistics: ": "Izvještaj o statistici: ",
|
"Report statistics: ": "Izvještaj o statistici: ",
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
"Subscriptions": "Pretplate",
|
"Subscriptions": "Pretplate",
|
||||||
"search": "traži",
|
"search": "traži",
|
||||||
"Log out": "Odjavi se",
|
"Log out": "Odjavi se",
|
||||||
"Released under the AGPLv3 on Github.": "Izdano pod licencom AGPLv3 na Github-u.",
|
"Released under the AGPLv3 on Github.": "Izdano pod licencom AGPLv3 na GitHub-u.",
|
||||||
"Source available here.": "Izvor je ovdje dostupan.",
|
"Source available here.": "Izvor je ovdje dostupan.",
|
||||||
"View JavaScript license information.": "Prikaži informacije o JavaScript licenci.",
|
"View JavaScript license information.": "Prikaži informacije o JavaScript licenci.",
|
||||||
"View privacy policy.": "Prikaži politiku privatnosti.",
|
"View privacy policy.": "Prikaži politiku privatnosti.",
|
||||||
@@ -137,11 +137,10 @@
|
|||||||
"Title": "Naslov",
|
"Title": "Naslov",
|
||||||
"Playlist privacy": "Privatnost zbirke",
|
"Playlist privacy": "Privatnost zbirke",
|
||||||
"Editing playlist `x`": "Uređivanje zbirke `x`",
|
"Editing playlist `x`": "Uređivanje zbirke `x`",
|
||||||
"Show more": "Pokaži više",
|
"Show more": "Prikaži više",
|
||||||
"Show less": "Pokaži manje",
|
"Show less": "Prikaži manje",
|
||||||
"Watch on YouTube": "Gledaj na YouTubeu",
|
"Watch on YouTube": "Gledaj na YouTubeu",
|
||||||
"Switch Invidious Instance": "Promijeni Invidious instancu",
|
"Switch Invidious Instance": "Promijeni Invidious instancu",
|
||||||
"Broken? Try another Invidious Instance": "Pokvarena? Probaj jednu drugu Invidious instancu",
|
|
||||||
"Hide annotations": "Sakrij napomene",
|
"Hide annotations": "Sakrij napomene",
|
||||||
"Show annotations": "Prikaži napomene",
|
"Show annotations": "Prikaži napomene",
|
||||||
"Genre: ": "Žanr: ",
|
"Genre: ": "Žanr: ",
|
||||||
@@ -319,7 +318,7 @@
|
|||||||
"Movies": "Filmovi",
|
"Movies": "Filmovi",
|
||||||
"Download": "Preuzmi",
|
"Download": "Preuzmi",
|
||||||
"Download as: ": "Preuzmi kao: ",
|
"Download as: ": "Preuzmi kao: ",
|
||||||
"%A %B %-d, %Y": "%A, %-d. %B %Y",
|
"%A %B %-d, %Y": "%A, %-d. %B %Y.",
|
||||||
"(edited)": "(uređeno)",
|
"(edited)": "(uređeno)",
|
||||||
"YouTube comment permalink": "Stalna poveznica YouTube komentara",
|
"YouTube comment permalink": "Stalna poveznica YouTube komentara",
|
||||||
"permalink": "stalna poveznica",
|
"permalink": "stalna poveznica",
|
||||||
@@ -329,41 +328,40 @@
|
|||||||
"Videos": "Videa",
|
"Videos": "Videa",
|
||||||
"Playlists": "Zbirke",
|
"Playlists": "Zbirke",
|
||||||
"Community": "Zajednica",
|
"Community": "Zajednica",
|
||||||
"relevance": "značaj",
|
"search_filters_sort_option_relevance": "Značaj",
|
||||||
"rating": "ocjena",
|
"search_filters_sort_option_rating": "Ocjena",
|
||||||
"date": "datum",
|
"search_filters_sort_option_date": "Datum prijenosa",
|
||||||
"views": "prikazi",
|
"search_filters_sort_option_views": "Broj gledanja",
|
||||||
"content_type": "vrsta_sadržaja",
|
"search_filters_type_label": "Vrsta",
|
||||||
"duration": "trajanje",
|
"search_filters_duration_label": "Trajanje",
|
||||||
"features": "funkcije",
|
"search_filters_features_label": "Funkcije",
|
||||||
"sort": "redoslijed",
|
"search_filters_sort_label": "Redoslijed",
|
||||||
"hour": "sat",
|
"search_filters_date_option_hour": "Zadnjih sat vremena",
|
||||||
"today": "danas",
|
"search_filters_date_option_today": "Danas",
|
||||||
"week": "tjedan",
|
"search_filters_date_option_week": "Ovaj tjedan",
|
||||||
"month": "mjesec",
|
"search_filters_date_option_month": "Ovaj mjesec",
|
||||||
"year": "godina",
|
"search_filters_date_option_year": "Ova godina",
|
||||||
"video": "video",
|
"search_filters_type_option_video": "Video",
|
||||||
"channel": "kanal",
|
"search_filters_type_option_channel": "Kanal",
|
||||||
"playlist": "Zbirka",
|
"search_filters_type_option_playlist": "Zbirka",
|
||||||
"movie": "film",
|
"search_filters_type_option_movie": "Film",
|
||||||
"show": "emisija",
|
"search_filters_type_option_show": "Emisija",
|
||||||
"hd": "hd",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "titlovi",
|
"search_filters_features_option_subtitles": "Titlovi/CC",
|
||||||
"creative_commons": "creative_commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3d",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "uživo",
|
"search_filters_features_option_live": "Uživo",
|
||||||
"4k": "4k",
|
"search_filters_features_option_four_k": "4k",
|
||||||
"location": "lokacija",
|
"search_filters_features_option_location": "Lokacija",
|
||||||
"hdr": "hdr",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "filtar",
|
|
||||||
"Current version: ": "Trenutačna verzija: ",
|
"Current version: ": "Trenutačna verzija: ",
|
||||||
"next_steps_error_message": "Nakon toga bi trebali pokušati sljedeće: ",
|
"next_steps_error_message": "Nakon toga bi trebali pokušati sljedeće: ",
|
||||||
"next_steps_error_message_refresh": "Aktualiziraj stranicu",
|
"next_steps_error_message_refresh": "Aktualiziraj stranicu",
|
||||||
"next_steps_error_message_go_to_youtube": "Idi na YouTube",
|
"next_steps_error_message_go_to_youtube": "Idi na YouTube",
|
||||||
"footer_donate_page": "Doniraj",
|
"footer_donate_page": "Doniraj",
|
||||||
"adminprefs_modified_source_code_url_label": "URL do repozitorija izmijenjenog izvornog koda",
|
"adminprefs_modified_source_code_url_label": "URL do repozitorija izmijenjenog izvornog koda",
|
||||||
"short": "Kratki (< 4 minute)",
|
"search_filters_duration_option_short": "Kratko (< 4 minute)",
|
||||||
"long": "Dugi (> 20 minute)",
|
"search_filters_duration_option_long": "Dugo (> 20 minute)",
|
||||||
"footer_source_code": "Izvorni kod",
|
"footer_source_code": "Izvorni kod",
|
||||||
"footer_modfied_source_code": "Izmijenjeni izvorni kod",
|
"footer_modfied_source_code": "Izmijenjeni izvorni kod",
|
||||||
"footer_documentation": "Dokumentacija",
|
"footer_documentation": "Dokumentacija",
|
||||||
@@ -382,12 +380,12 @@
|
|||||||
"preferences_quality_dash_option_240p": "240 p",
|
"preferences_quality_dash_option_240p": "240 p",
|
||||||
"preferences_quality_dash_option_144p": "144 p",
|
"preferences_quality_dash_option_144p": "144 p",
|
||||||
"invidious": "Invidious",
|
"invidious": "Invidious",
|
||||||
"purchased": "Kupljeno",
|
"search_filters_features_option_purchased": "Kupljeno",
|
||||||
"360": "360 °",
|
"search_filters_features_option_three_sixty": "360 °",
|
||||||
"none": "bez",
|
"none": "bez",
|
||||||
"videoinfo_youTube_embed_link": "Ugradi",
|
"videoinfo_youTube_embed_link": "Ugradi",
|
||||||
"user_created_playlists": "`x` stvorene zbirke",
|
"user_created_playlists": "`x` je stvorio/la zbirke",
|
||||||
"user_saved_playlists": "`x` spremljene zbirke",
|
"user_saved_playlists": "`x` je spremio/la zbirke",
|
||||||
"Video unavailable": "Video nedostupan",
|
"Video unavailable": "Video nedostupan",
|
||||||
"preferences_save_player_pos_label": "Spremi mjesto reprodukcije: ",
|
"preferences_save_player_pos_label": "Spremi mjesto reprodukcije: ",
|
||||||
"videoinfo_watch_on_youTube": "Gledaj na YouTubeu",
|
"videoinfo_watch_on_youTube": "Gledaj na YouTubeu",
|
||||||
@@ -434,7 +432,7 @@
|
|||||||
"generic_subscriptions_count_2": "{{count}} pretplata",
|
"generic_subscriptions_count_2": "{{count}} pretplata",
|
||||||
"generic_playlists_count_0": "{{count}} zbirka",
|
"generic_playlists_count_0": "{{count}} zbirka",
|
||||||
"generic_playlists_count_1": "{{count}} zbirke",
|
"generic_playlists_count_1": "{{count}} zbirke",
|
||||||
"generic_playlists_count_2": "{{count}} zbirka",
|
"generic_playlists_count_2": "{{count}} zbiraka",
|
||||||
"generic_videos_count_0": "{{count}} video",
|
"generic_videos_count_0": "{{count}} video",
|
||||||
"generic_videos_count_1": "{{count}} videa",
|
"generic_videos_count_1": "{{count}} videa",
|
||||||
"generic_videos_count_2": "{{count}} videa",
|
"generic_videos_count_2": "{{count}} videa",
|
||||||
@@ -452,7 +450,7 @@
|
|||||||
"crash_page_refresh": "pokušaj <a href=\"`x`\">aktualizirati stranicu</a>",
|
"crash_page_refresh": "pokušaj <a href=\"`x`\">aktualizirati stranicu</a>",
|
||||||
"crash_page_switch_instance": "pokušaj <a href=\"`x`\">koristiti jednu drugu instancu</a>",
|
"crash_page_switch_instance": "pokušaj <a href=\"`x`\">koristiti jednu drugu instancu</a>",
|
||||||
"crash_page_read_the_faq": "pročitaj <a href=\"`x`\">Često postavljena pitanja (ČPP)</a>",
|
"crash_page_read_the_faq": "pročitaj <a href=\"`x`\">Često postavljena pitanja (ČPP)</a>",
|
||||||
"crash_page_search_issue": "pretraži <a href=\"`x`\">postojeće probleme na Github-u</a>",
|
"crash_page_search_issue": "pretraži <a href=\"`x`\">postojeće probleme na GitHub-u</a>",
|
||||||
"crash_page_report_issue": "Ako ništa od gore navedenog ne pomaže, <a href=\"`x`\">prijavi novi problem na GitHub-u</a> (po mogućnosti na engleskom) i uključi sljedeći tekst u poruku (NEMOJ prevoditi taj tekst):",
|
"crash_page_report_issue": "Ako ništa od gore navedenog ne pomaže, <a href=\"`x`\">prijavi novi problem na GitHub-u</a> (po mogućnosti na engleskom) i uključi sljedeći tekst u poruku (NEMOJ prevoditi taj tekst):",
|
||||||
"English (United Kingdom)": "Engleski (Ujedinjeno Kraljevstvo)",
|
"English (United Kingdom)": "Engleski (Ujedinjeno Kraljevstvo)",
|
||||||
"English (United States)": "Engleski (Sjedinjene Američke Države)",
|
"English (United States)": "Engleski (Sjedinjene Američke Države)",
|
||||||
@@ -476,5 +474,18 @@
|
|||||||
"Chinese (Hong Kong)": "Kineski (Hong Kong)",
|
"Chinese (Hong Kong)": "Kineski (Hong Kong)",
|
||||||
"Korean (auto-generated)": "Korejski (automatski generiran)",
|
"Korean (auto-generated)": "Korejski (automatski generiran)",
|
||||||
"Portuguese (auto-generated)": "Portugalski (automatski generiran)",
|
"Portuguese (auto-generated)": "Portugalski (automatski generiran)",
|
||||||
"Spanish (auto-generated)": "Španjolski (automatski generiran)"
|
"Spanish (auto-generated)": "Španjolski (automatski generiran)",
|
||||||
|
"preferences_watch_history_label": "Aktiviraj povijest gledanja: ",
|
||||||
|
"search_filters_title": "Filtri",
|
||||||
|
"search_filters_date_option_none": "Bilo koji datum",
|
||||||
|
"search_filters_date_label": "Datum prijenosa",
|
||||||
|
"search_message_no_results": "Nema rezultata.",
|
||||||
|
"search_message_use_another_instance": " Također možeš <a href=\"`x`\">tražiti na jednoj drugoj instanci</a>.",
|
||||||
|
"search_message_change_filters_or_query": "Pokušaj proširiti upit za pretragu i/ili promijeni filtre.",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_duration_option_none": "Bilo koje duljine",
|
||||||
|
"search_filters_duration_option_medium": "Srednje (4 – 20 minuta)",
|
||||||
|
"search_filters_apply_button": "Primijeni odabrane filtre",
|
||||||
|
"search_filters_type_option_all": "Bilo koja vrsta",
|
||||||
|
"Popular enabled: ": "Popularni aktivirani: "
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,15 +31,15 @@
|
|||||||
"No": "Nem",
|
"No": "Nem",
|
||||||
"Import and Export Data": "Adatok importálása és exportálása",
|
"Import and Export Data": "Adatok importálása és exportálása",
|
||||||
"Import": "Importálás",
|
"Import": "Importálás",
|
||||||
"Import Invidious data": "Az Invidious adatainak importálása",
|
"Import Invidious data": "Az Invidious JSON-adatainak importálása",
|
||||||
"Import YouTube subscriptions": "YouTube-feliratkozások importálása",
|
"Import YouTube subscriptions": "YouTube- vagy OPML-feliratkozások importálása",
|
||||||
"Import FreeTube subscriptions (.db)": "FreeTube-feliratkozások importálása (.db)",
|
"Import FreeTube subscriptions (.db)": "FreeTube-feliratkozások importálása (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "NewPipe-feliratkozások importálása (.json)",
|
"Import NewPipe subscriptions (.json)": "NewPipe-feliratkozások importálása (.json)",
|
||||||
"Import NewPipe data (.zip)": "NewPipe adatainak importálása (.zip)",
|
"Import NewPipe data (.zip)": "NewPipe adatainak importálása (.zip)",
|
||||||
"Export": "Exportálás",
|
"Export": "Exportálás",
|
||||||
"Export subscriptions as OPML": "Feliratkozások exportálása OPML-ként",
|
"Export subscriptions as OPML": "Feliratkozások exportálása OPML-ként",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Feliratkozások exportálása OPML-ként (NewPipe-hoz és FreeTube-hoz)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Feliratkozások exportálása OPML-ként (NewPipe-hoz és FreeTube-hoz)",
|
||||||
"Export data as JSON": "Adat exportálása JSON-ként",
|
"Export data as JSON": "Az Invidious JSON-adatainak exportálása",
|
||||||
"Delete account?": "Törlésre kerüljön a fiók?",
|
"Delete account?": "Törlésre kerüljön a fiók?",
|
||||||
"History": "Megnézett videók naplója",
|
"History": "Megnézett videók naplója",
|
||||||
"An alternative front-end to YouTube": "Ez az oldal egyike a YouTube alternatív kezelőfelületeinek",
|
"An alternative front-end to YouTube": "Ez az oldal egyike a YouTube alternatív kezelőfelületeinek",
|
||||||
@@ -159,7 +159,7 @@
|
|||||||
"Engagement: ": "Visszajelzési mutató: ",
|
"Engagement: ": "Visszajelzési mutató: ",
|
||||||
"Whitelisted regions: ": "Engedélyezett régiók: ",
|
"Whitelisted regions: ": "Engedélyezett régiók: ",
|
||||||
"Blacklisted regions: ": "Tiltott régiók: ",
|
"Blacklisted regions: ": "Tiltott régiók: ",
|
||||||
"Shared `x`": "`x` napon osztották meg",
|
"Shared `x`": "`x` dátummal osztották meg",
|
||||||
"Premieres in `x`": "`x` később lesz a premierje",
|
"Premieres in `x`": "`x` később lesz a premierje",
|
||||||
"Premieres `x`": "`x` lesz a premierje",
|
"Premieres `x`": "`x` lesz a premierje",
|
||||||
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Helló! Úgy tűnik a JavaScript ki van kapcsolva a böngészőben. Ide kattintva lehet olvasni a hozzászólásokat, de a betöltésük így kicsit több időbe telik.",
|
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Helló! Úgy tűnik a JavaScript ki van kapcsolva a böngészőben. Ide kattintva lehet olvasni a hozzászólásokat, de a betöltésük így kicsit több időbe telik.",
|
||||||
@@ -365,14 +365,14 @@
|
|||||||
"preferences_quality_dash_option_144p": "144p",
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
"invidious": "Invidious",
|
"invidious": "Invidious",
|
||||||
"videoinfo_started_streaming_x_ago": "`x` ezelőtt kezdte streamelni",
|
"videoinfo_started_streaming_x_ago": "`x` ezelőtt kezdte streamelni",
|
||||||
"views": "Mennyien látták",
|
"search_filters_sort_option_views": "Mennyien látták",
|
||||||
"purchased": "Megvásárolva",
|
"search_filters_features_option_purchased": "Megvásárolt",
|
||||||
"360": "360°-os",
|
"search_filters_features_option_three_sixty": "360°-os virtuális valóság",
|
||||||
"footer_original_source_code": "Eredeti forráskód",
|
"footer_original_source_code": "Eredeti forráskód",
|
||||||
"none": "egyik sem",
|
"none": "egyik sem",
|
||||||
"videoinfo_watch_on_youTube": "YouTube-on megnézni",
|
"videoinfo_watch_on_youTube": "YouTube-on megnézni",
|
||||||
"videoinfo_youTube_embed_link": "beágyazva",
|
"videoinfo_youTube_embed_link": "beágyazva",
|
||||||
"videoinfo_invidious_embed_link": "Beágyazás linkje",
|
"videoinfo_invidious_embed_link": "Beágyazott hivatkozás",
|
||||||
"download_subtitles": "Felirat – `x` (.vtt)",
|
"download_subtitles": "Felirat – `x` (.vtt)",
|
||||||
"user_created_playlists": "`x` létrehozott lejátszási lista",
|
"user_created_playlists": "`x` létrehozott lejátszási lista",
|
||||||
"user_saved_playlists": "`x` mentett lejátszási lista",
|
"user_saved_playlists": "`x` mentett lejátszási lista",
|
||||||
@@ -382,14 +382,13 @@
|
|||||||
"preferences_quality_dash_option_1440p": "1440p",
|
"preferences_quality_dash_option_1440p": "1440p",
|
||||||
"preferences_quality_dash_label": "DASH-videó minősége: ",
|
"preferences_quality_dash_label": "DASH-videó minősége: ",
|
||||||
"preferences_quality_option_small": "Rossz",
|
"preferences_quality_option_small": "Rossz",
|
||||||
"date": "Feltöltés dátuma",
|
"search_filters_sort_option_date": "Feltöltés dátuma",
|
||||||
"Video unavailable": "A videó nem érhető el",
|
"Video unavailable": "A videó nem érhető el",
|
||||||
"preferences_save_player_pos_label": "A videó folytatása onnan, ahol félbe lett hagyva: ",
|
"preferences_save_player_pos_label": "A videó folytatása onnan, ahol félbe lett hagyva: ",
|
||||||
"preferences_show_nick_label": "Becenév mutatása felül: ",
|
"preferences_show_nick_label": "Becenév mutatása felül: ",
|
||||||
"Released under the AGPLv3 on Github.": "AGPLv3 licenc alapján a GitHubon",
|
"Released under the AGPLv3 on Github.": "AGPLv3 licenc alapján a GitHubon",
|
||||||
"3d": "3D-ben",
|
"search_filters_features_option_three_d": "3D-ben",
|
||||||
"live": "Élőben",
|
"search_filters_features_option_live": "Élőben",
|
||||||
"filter": "Szűrők",
|
|
||||||
"next_steps_error_message_refresh": "Újratöltés",
|
"next_steps_error_message_refresh": "Újratöltés",
|
||||||
"footer_donate_page": "Adakozás",
|
"footer_donate_page": "Adakozás",
|
||||||
"footer_source_code": "Forráskód",
|
"footer_source_code": "Forráskód",
|
||||||
@@ -397,40 +396,39 @@
|
|||||||
"adminprefs_modified_source_code_url_label": "A módosított forráskód repositoryjának URL-je:",
|
"adminprefs_modified_source_code_url_label": "A módosított forráskód repositoryjának URL-je:",
|
||||||
"preferences_automatic_instance_redirect_label": "Váltáskor másik Invidious oldal automatikus betöltése (redirect.invidious.io töltődik, ha nem működne): ",
|
"preferences_automatic_instance_redirect_label": "Váltáskor másik Invidious oldal automatikus betöltése (redirect.invidious.io töltődik, ha nem működne): ",
|
||||||
"preferences_region_label": "Ország tartalmainak mutatása: ",
|
"preferences_region_label": "Ország tartalmainak mutatása: ",
|
||||||
"relevance": "Relevancia",
|
"search_filters_sort_option_relevance": "Relevancia",
|
||||||
"rating": "Pontszám",
|
"search_filters_sort_option_rating": "Pontszám",
|
||||||
"content_type": "Típus",
|
"search_filters_type_label": "Típus",
|
||||||
"today": "Mai napon",
|
"search_filters_date_option_today": "Mai napon",
|
||||||
"channel": "Csatorna",
|
"search_filters_type_option_channel": "Csatorna",
|
||||||
"video": "Videó",
|
"search_filters_type_option_video": "Videó",
|
||||||
"playlist": "Lejátszási lista",
|
"search_filters_type_option_playlist": "Lejátszási lista",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"features": "Jellemzők",
|
"search_filters_features_label": "Jellemzők",
|
||||||
"sort": "Rendezés módja",
|
"search_filters_sort_label": "Rendezés módja",
|
||||||
"preferences_category_misc": "További beállítások",
|
"preferences_category_misc": "További beállítások",
|
||||||
"%A %B %-d, %Y": "%Y. %B %-d %A",
|
"%A %B %-d, %Y": "%Y. %B %-d %A",
|
||||||
"long": "Hosszú (20 percnél hosszabb)",
|
"search_filters_duration_option_long": "Hosszú (20 percnél hosszabb)",
|
||||||
"year": "Ebben az évben",
|
"search_filters_date_option_year": "Ebben az évben",
|
||||||
"hour": "Az elmúlt órában",
|
"search_filters_date_option_hour": "Az elmúlt órában",
|
||||||
"movie": "Film",
|
"search_filters_type_option_movie": "Film",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"Broken? Try another Invidious Instance": "Nem működik? Próbáld meg egy másik Invidious oldallal.",
|
"search_filters_duration_label": "Játékidő",
|
||||||
"duration": "Játékidő",
|
|
||||||
"next_steps_error_message": "Az alábbi lehetőségek állnak rendelkezésre: ",
|
"next_steps_error_message": "Az alábbi lehetőségek állnak rendelkezésre: ",
|
||||||
"Xhosa": "xhosza",
|
"Xhosa": "xhosza",
|
||||||
"Switch Invidious Instance": "Váltás másik Invidious-oldalra",
|
"Switch Invidious Instance": "Váltás másik Invidious-oldalra",
|
||||||
"Urdu": "urdu",
|
"Urdu": "urdu",
|
||||||
"week": "Ezen a héten",
|
"search_filters_date_option_week": "Ezen a héten",
|
||||||
"Invalid TFA code": "A kétlépéses hitelesítés kódja nem megfelelő",
|
"Invalid TFA code": "A kétlépéses hitelesítés kódja nem megfelelő",
|
||||||
"footer_documentation": "Dokumentáció",
|
"footer_documentation": "Dokumentáció",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"next_steps_error_message_go_to_youtube": "Ugrás a YouTube-ra",
|
"next_steps_error_message_go_to_youtube": "Ugrás a YouTube-ra",
|
||||||
"show": "Műsor",
|
"search_filters_type_option_show": "Műsor",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"short": "Rövid (4 percnél nem több)",
|
"search_filters_duration_option_short": "Rövid (4 percnél nem több)",
|
||||||
"month": "Ebben a hónapban",
|
"search_filters_date_option_month": "Ebben a hónapban",
|
||||||
"subtitles": "Felirattal",
|
"search_filters_features_option_subtitles": "Felirattal",
|
||||||
"location": "Közelben",
|
"search_filters_features_option_location": "Közelben",
|
||||||
"crash_page_you_found_a_bug": "Úgy néz ki, találtál egy hibát az Invidiousban.",
|
"crash_page_you_found_a_bug": "Úgy néz ki, találtál egy hibát az Invidiousban.",
|
||||||
"crash_page_before_reporting": "Mielőtt jelentenéd a hibát:",
|
"crash_page_before_reporting": "Mielőtt jelentenéd a hibát:",
|
||||||
"crash_page_read_the_faq": "olvasd el a <a href=\"`x`\">Gyakran Ismételt Kérdéseket (GYIK)</a>",
|
"crash_page_read_the_faq": "olvasd el a <a href=\"`x`\">Gyakran Ismételt Kérdéseket (GYIK)</a>",
|
||||||
@@ -460,5 +458,17 @@
|
|||||||
"Italian (auto-generated)": "olasz (automatikusan generált)",
|
"Italian (auto-generated)": "olasz (automatikusan generált)",
|
||||||
"Dutch (auto-generated)": "holland (automatikusan generált)",
|
"Dutch (auto-generated)": "holland (automatikusan generált)",
|
||||||
"French (auto-generated)": "francia (automatikusan generált)",
|
"French (auto-generated)": "francia (automatikusan generált)",
|
||||||
"Vietnamese (auto-generated)": "vietnámi (automatikusan generált)"
|
"Vietnamese (auto-generated)": "vietnámi (automatikusan generált)",
|
||||||
|
"search_filters_title": "Szűrők",
|
||||||
|
"preferences_watch_history_label": "Megnézett videók naplózása: ",
|
||||||
|
"search_message_no_results": "Nincs találat.",
|
||||||
|
"search_message_change_filters_or_query": "Próbálj meg bővebben rákeresni vagy a szűrőkön állítani.",
|
||||||
|
"search_message_use_another_instance": " Megpróbálhatod <a href=\"`x`\">egy másik</a> Invidious-oldalon is a keresést.",
|
||||||
|
"search_filters_date_label": "Feltöltés ideje",
|
||||||
|
"search_filters_date_option_none": "Mindegy mikor",
|
||||||
|
"search_filters_type_option_all": "Bármilyen",
|
||||||
|
"search_filters_duration_option_none": "Mindegy",
|
||||||
|
"search_filters_duration_option_medium": "Átlagos (4 és 20 perc között)",
|
||||||
|
"search_filters_features_option_vr180": "180°-os virtuális valóság",
|
||||||
|
"search_filters_apply_button": "Keresés a megadott szűrőkkel"
|
||||||
}
|
}
|
||||||
|
|||||||
110
locales/id.json
110
locales/id.json
@@ -26,15 +26,15 @@
|
|||||||
"No": "Tidak",
|
"No": "Tidak",
|
||||||
"Import and Export Data": "Impor dan Ekspor Data",
|
"Import and Export Data": "Impor dan Ekspor Data",
|
||||||
"Import": "Impor",
|
"Import": "Impor",
|
||||||
"Import Invidious data": "Impor data Invidious",
|
"Import Invidious data": "Impor JSON data Invidious",
|
||||||
"Import YouTube subscriptions": "Impor langganan YouTube",
|
"Import YouTube subscriptions": "Impor langganan YouTube/OPML",
|
||||||
"Import FreeTube subscriptions (.db)": "Impor langganan FreeTube (.db)",
|
"Import FreeTube subscriptions (.db)": "Impor langganan FreeTube (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "Impor langganan NewPipe (.json)",
|
"Import NewPipe subscriptions (.json)": "Impor langganan NewPipe (.json)",
|
||||||
"Import NewPipe data (.zip)": "Impor data NewPipe (.zip)",
|
"Import NewPipe data (.zip)": "Impor data NewPipe (.zip)",
|
||||||
"Export": "Ekspor",
|
"Export": "Ekspor",
|
||||||
"Export subscriptions as OPML": "Ekspor langganan sebagai OPML",
|
"Export subscriptions as OPML": "Ekspor langganan sebagai OPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Ekspor langganan sebagai OPML (untuk NewPipe & FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Ekspor langganan sebagai OPML (untuk NewPipe & FreeTube)",
|
||||||
"Export data as JSON": "Ekspor data sebagai JSON",
|
"Export data as JSON": "Ekspor data Invidious sebagai JSON",
|
||||||
"Delete account?": "Hapus akun?",
|
"Delete account?": "Hapus akun?",
|
||||||
"History": "Riwayat",
|
"History": "Riwayat",
|
||||||
"An alternative front-end to YouTube": "Sebuah alternatif layar depan untuk YouTube",
|
"An alternative front-end to YouTube": "Sebuah alternatif layar depan untuk YouTube",
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
"preferences_related_videos_label": "Tampilkan video terkait: ",
|
"preferences_related_videos_label": "Tampilkan video terkait: ",
|
||||||
"preferences_annotations_label": "Tampilkan anotasi secara baku: ",
|
"preferences_annotations_label": "Tampilkan anotasi secara baku: ",
|
||||||
"preferences_extend_desc_label": "Perluas deskripsi video secara otomatis: ",
|
"preferences_extend_desc_label": "Perluas deskripsi video secara otomatis: ",
|
||||||
"preferences_vr_mode_label": "Video interaktif 360°: ",
|
"preferences_vr_mode_label": "Video interaktif 360° (memerlukan WebGL): ",
|
||||||
"preferences_category_visual": "Preferensi visual",
|
"preferences_category_visual": "Preferensi visual",
|
||||||
"preferences_player_style_label": "Gaya pemutar: ",
|
"preferences_player_style_label": "Gaya pemutar: ",
|
||||||
"Dark mode: ": "Mode gelap: ",
|
"Dark mode: ": "Mode gelap: ",
|
||||||
@@ -126,9 +126,9 @@
|
|||||||
"revoke": "cabut",
|
"revoke": "cabut",
|
||||||
"Subscriptions": "Langganan",
|
"Subscriptions": "Langganan",
|
||||||
"subscriptions_unseen_notifs_count_0": "{{count}} pemberitahuan belum dilihat",
|
"subscriptions_unseen_notifs_count_0": "{{count}} pemberitahuan belum dilihat",
|
||||||
"search": "cari",
|
"search": "Telusuri",
|
||||||
"Log out": "Keluar",
|
"Log out": "Keluar",
|
||||||
"Released under the AGPLv3 on Github.": "Dirilis di bawah AGPLv3 di Github.",
|
"Released under the AGPLv3 on Github.": "Dirilis di bawah AGPLv3 di GitHub.",
|
||||||
"Source available here.": "Sumber tersedia di sini.",
|
"Source available here.": "Sumber tersedia di sini.",
|
||||||
"View JavaScript license information.": "Tampilkan informasi lisensi JavaScript.",
|
"View JavaScript license information.": "Tampilkan informasi lisensi JavaScript.",
|
||||||
"View privacy policy.": "Lihat kebijakan privasi.",
|
"View privacy policy.": "Lihat kebijakan privasi.",
|
||||||
@@ -148,7 +148,6 @@
|
|||||||
"Show less": "Tampilkan lebih sedikit",
|
"Show less": "Tampilkan lebih sedikit",
|
||||||
"Watch on YouTube": "Tonton di YouTube",
|
"Watch on YouTube": "Tonton di YouTube",
|
||||||
"Switch Invidious Instance": "Ganti peladen Invidious",
|
"Switch Invidious Instance": "Ganti peladen Invidious",
|
||||||
"Broken? Try another Invidious Instance": "Rusak? Coba peladen Invidious yang lain",
|
|
||||||
"Hide annotations": "Sembunyikan anotasi",
|
"Hide annotations": "Sembunyikan anotasi",
|
||||||
"Show annotations": "Tampilkan anotasi",
|
"Show annotations": "Tampilkan anotasi",
|
||||||
"Genre: ": "Genre: ",
|
"Genre: ": "Genre: ",
|
||||||
@@ -345,33 +344,32 @@
|
|||||||
"Videos": "Video",
|
"Videos": "Video",
|
||||||
"Playlists": "Daftar putar",
|
"Playlists": "Daftar putar",
|
||||||
"Community": "Komunitas",
|
"Community": "Komunitas",
|
||||||
"relevance": "Relevansi",
|
"search_filters_sort_option_relevance": "Relevansi",
|
||||||
"rating": "Penilaian",
|
"search_filters_sort_option_rating": "Penilaian",
|
||||||
"date": "Tanggal unggah",
|
"search_filters_sort_option_date": "Tanggal Unggah",
|
||||||
"views": "Jumlah ditonton",
|
"search_filters_sort_option_views": "Jumlah ditonton",
|
||||||
"content_type": "Tipe",
|
"search_filters_type_label": "Tipe",
|
||||||
"duration": "Durasi",
|
"search_filters_duration_label": "Durasi",
|
||||||
"features": "Fitur",
|
"search_filters_features_label": "Fitur",
|
||||||
"sort": "Urut Berdasarkan",
|
"search_filters_sort_label": "Urut Berdasarkan",
|
||||||
"hour": "Jam Terakhir",
|
"search_filters_date_option_hour": "Jam Terakhir",
|
||||||
"today": "Hari Ini",
|
"search_filters_date_option_today": "Hari Ini",
|
||||||
"week": "Pekan Ini",
|
"search_filters_date_option_week": "Pekan Ini",
|
||||||
"month": "Bulan Ini",
|
"search_filters_date_option_month": "Bulan Ini",
|
||||||
"year": "Tahun Ini",
|
"search_filters_date_option_year": "Tahun Ini",
|
||||||
"video": "Video",
|
"search_filters_type_option_video": "Video",
|
||||||
"channel": "Kanal",
|
"search_filters_type_option_channel": "Kanal",
|
||||||
"playlist": "Daftar Putar",
|
"search_filters_type_option_playlist": "Daftar Putar",
|
||||||
"movie": "Film",
|
"search_filters_type_option_movie": "Film",
|
||||||
"show": "Pertunjukan/Acara",
|
"search_filters_type_option_show": "Pertunjukan/Acara",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "Takarir",
|
"search_filters_features_option_subtitles": "Takarir",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "Siaran Langsung",
|
"search_filters_features_option_live": "Siaran Langsung",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "Lokasi",
|
"search_filters_features_option_location": "Lokasi",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "Saring",
|
|
||||||
"Current version: ": "Versi saat ini: ",
|
"Current version: ": "Versi saat ini: ",
|
||||||
"next_steps_error_message": "Setelah itu Anda harus mencoba: ",
|
"next_steps_error_message": "Setelah itu Anda harus mencoba: ",
|
||||||
"next_steps_error_message_refresh": "Segarkan",
|
"next_steps_error_message_refresh": "Segarkan",
|
||||||
@@ -380,8 +378,8 @@
|
|||||||
"adminprefs_modified_source_code_url_label": "URL ke repositori kode sumber yang dimodifikasi",
|
"adminprefs_modified_source_code_url_label": "URL ke repositori kode sumber yang dimodifikasi",
|
||||||
"footer_source_code": "Kode sumber",
|
"footer_source_code": "Kode sumber",
|
||||||
"footer_original_source_code": "Kode sumber yang asli",
|
"footer_original_source_code": "Kode sumber yang asli",
|
||||||
"short": "Pendek (< 4 menit)",
|
"search_filters_duration_option_short": "Pendek (< 4 menit)",
|
||||||
"long": "Panjang (> 20 menit)",
|
"search_filters_duration_option_long": "Panjang (> 20 menit)",
|
||||||
"footer_modfied_source_code": "Kode sumber yang dimodifikasi",
|
"footer_modfied_source_code": "Kode sumber yang dimodifikasi",
|
||||||
"footer_documentation": "Dokumentasi",
|
"footer_documentation": "Dokumentasi",
|
||||||
"preferences_region_label": "Konten dari negara: ",
|
"preferences_region_label": "Konten dari negara: ",
|
||||||
@@ -398,8 +396,8 @@
|
|||||||
"preferences_quality_dash_option_240p": "240p",
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
"preferences_quality_dash_option_144p": "144p",
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
"invidious": "Invidious",
|
"invidious": "Invidious",
|
||||||
"purchased": "Dibeli",
|
"search_filters_features_option_purchased": "Dibeli",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"none": "tidak ada",
|
"none": "tidak ada",
|
||||||
"videoinfo_watch_on_youTube": "Tonton di YouTube",
|
"videoinfo_watch_on_youTube": "Tonton di YouTube",
|
||||||
"videoinfo_youTube_embed_link": "Tersemat",
|
"videoinfo_youTube_embed_link": "Tersemat",
|
||||||
@@ -416,5 +414,39 @@
|
|||||||
"Video unavailable": "Video tidak tersedia",
|
"Video unavailable": "Video tidak tersedia",
|
||||||
"preferences_save_player_pos_label": "Simpan posisi pemutaran: ",
|
"preferences_save_player_pos_label": "Simpan posisi pemutaran: ",
|
||||||
"crash_page_you_found_a_bug": "Sepertinya kamu telah menemukan masalah di invidious!",
|
"crash_page_you_found_a_bug": "Sepertinya kamu telah menemukan masalah di invidious!",
|
||||||
"crash_page_before_reporting": "Sebelum melaporkan masalah, pastikan anda memiliki:"
|
"crash_page_before_reporting": "Sebelum melaporkan masalah, pastikan anda memiliki:",
|
||||||
|
"English (United States)": "Inggris (US)",
|
||||||
|
"preferences_watch_history_label": "Aktifkan riwayat tontonan: ",
|
||||||
|
"English (United Kingdom)": "Inggris (UK)",
|
||||||
|
"search_filters_title": "Saring",
|
||||||
|
"search_message_no_results": "Tidak ada hasil yang ditemukan.",
|
||||||
|
"search_message_change_filters_or_query": "Coba perbanyak kueri pencarian dan/atau ubah filter Anda.",
|
||||||
|
"search_message_use_another_instance": " Anda juga bisa <a href=\"`x`\">mencari di peladen lain</a>.",
|
||||||
|
"Indonesian (auto-generated)": "Indonesia (dibuat secara otomatis)",
|
||||||
|
"Japanese (auto-generated)": "Jepang (dibuat secara otomatis)",
|
||||||
|
"Korean (auto-generated)": "Korea (dibuat secara otomatis)",
|
||||||
|
"Portuguese (Brazil)": "Portugis (Brasil)",
|
||||||
|
"Russian (auto-generated)": "Rusia (dibuat secara otomatis)",
|
||||||
|
"Spanish (Mexico)": "Spanyol (Meksiko)",
|
||||||
|
"Spanish (Spain)": "Spanyol (Spanyol)",
|
||||||
|
"Vietnamese (auto-generated)": "Vietnam (dibuat secara otomatis)",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"Spanish (auto-generated)": "Spanyol (dibuat secara otomatis)",
|
||||||
|
"Chinese": "Bahasa Cina",
|
||||||
|
"Chinese (Taiwan)": "Bahasa Cina (Taiwan)",
|
||||||
|
"Chinese (Hong Kong)": "Bahasa Cina (Hong Kong)",
|
||||||
|
"Chinese (China)": "Bahasa Cina (China)",
|
||||||
|
"French (auto-generated)": "Perancis (dibuat secara otomatis)",
|
||||||
|
"German (auto-generated)": "Jerman (dibuat secara otomatis)",
|
||||||
|
"Italian (auto-generated)": "Italia (dibuat secara otomatis)",
|
||||||
|
"Portuguese (auto-generated)": "Portugis (dibuat secara otomatis)",
|
||||||
|
"Turkish (auto-generated)": "Turki (dibuat secara otomatis)",
|
||||||
|
"search_filters_date_label": "Tanggal unggah",
|
||||||
|
"search_filters_type_option_all": "Segala jenis",
|
||||||
|
"search_filters_apply_button": "Terapkan saringan yang dipilih",
|
||||||
|
"Dutch (auto-generated)": "Belanda (dihasilkan secara otomatis)",
|
||||||
|
"search_filters_date_option_none": "Tanggal berapa pun",
|
||||||
|
"search_filters_duration_option_none": "Durasi berapa pun",
|
||||||
|
"search_filters_duration_option_medium": "Sedang (4 - 20 menit)",
|
||||||
|
"Cantonese (Hong Kong)": "Bahasa Kanton (Hong Kong)"
|
||||||
}
|
}
|
||||||
|
|||||||
171
locales/it.json
171
locales/it.json
@@ -14,7 +14,7 @@
|
|||||||
"newest": "più recente",
|
"newest": "più recente",
|
||||||
"oldest": "più vecchio",
|
"oldest": "più vecchio",
|
||||||
"popular": "Tendenze",
|
"popular": "Tendenze",
|
||||||
"last": "durare",
|
"last": "ultimo",
|
||||||
"Next page": "Pagina successiva",
|
"Next page": "Pagina successiva",
|
||||||
"Previous page": "Pagina precedente",
|
"Previous page": "Pagina precedente",
|
||||||
"Clear watch history?": "Eliminare la cronologia dei video guardati?",
|
"Clear watch history?": "Eliminare la cronologia dei video guardati?",
|
||||||
@@ -27,15 +27,15 @@
|
|||||||
"No": "No",
|
"No": "No",
|
||||||
"Import and Export Data": "Importazione ed esportazione dati",
|
"Import and Export Data": "Importazione ed esportazione dati",
|
||||||
"Import": "Importa",
|
"Import": "Importa",
|
||||||
"Import Invidious data": "Importa dati Invidious",
|
"Import Invidious data": "Importa dati Invidious in formato JSON",
|
||||||
"Import YouTube subscriptions": "Importa le iscrizioni da YouTube",
|
"Import YouTube subscriptions": "Importa le iscrizioni da YouTube/OPML",
|
||||||
"Import FreeTube subscriptions (.db)": "Importa le iscrizioni da FreeTube (.db)",
|
"Import FreeTube subscriptions (.db)": "Importa le iscrizioni da FreeTube (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "Importa le iscrizioni da NewPipe (.json)",
|
"Import NewPipe subscriptions (.json)": "Importa le iscrizioni da NewPipe (.json)",
|
||||||
"Import NewPipe data (.zip)": "Importa i dati di NewPipe (.zip)",
|
"Import NewPipe data (.zip)": "Importa i dati di NewPipe (.zip)",
|
||||||
"Export": "Esporta",
|
"Export": "Esporta",
|
||||||
"Export subscriptions as OPML": "Esporta gli abbonamenti come OPML",
|
"Export subscriptions as OPML": "Esporta gli abbonamenti come OPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Esporta gli abbonamenti come OPML (per NewPipe e FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Esporta gli abbonamenti come OPML (per NewPipe e FreeTube)",
|
||||||
"Export data as JSON": "Esporta i dati in formato JSON",
|
"Export data as JSON": "Esporta i dati Invidious in formato JSON",
|
||||||
"Delete account?": "Eliminare l'account?",
|
"Delete account?": "Eliminare l'account?",
|
||||||
"History": "Cronologia",
|
"History": "Cronologia",
|
||||||
"An alternative front-end to YouTube": "Un'interfaccia alternativa per YouTube",
|
"An alternative front-end to YouTube": "Un'interfaccia alternativa per YouTube",
|
||||||
@@ -158,7 +158,7 @@
|
|||||||
"generic_views_count_plural": "{{count}} visualizzazioni",
|
"generic_views_count_plural": "{{count}} visualizzazioni",
|
||||||
"Premieres in `x`": "In anteprima in `x`",
|
"Premieres in `x`": "In anteprima in `x`",
|
||||||
"Premieres `x`": "In anteprima `x`",
|
"Premieres `x`": "In anteprima `x`",
|
||||||
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Ciao! Sembra che tu abbia disattivato JavaScript. Clicca qui per visualizzare i commenti. Considera che potrebbe volerci più tempo.",
|
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Ciao, Sembra che tu abbia disattivato JavaScript. Clicca qui per visualizzare i commenti, ma considera che il caricamento potrebbe richiedere più tempo.",
|
||||||
"View YouTube comments": "Visualizza i commenti da YouTube",
|
"View YouTube comments": "Visualizza i commenti da YouTube",
|
||||||
"View more comments on Reddit": "Visualizza più commenti su Reddit",
|
"View more comments on Reddit": "Visualizza più commenti su Reddit",
|
||||||
"View `x` comments": {
|
"View `x` comments": {
|
||||||
@@ -212,7 +212,7 @@
|
|||||||
"Azerbaijani": "Azero",
|
"Azerbaijani": "Azero",
|
||||||
"Bangla": "Bengalese",
|
"Bangla": "Bengalese",
|
||||||
"Basque": "Basco",
|
"Basque": "Basco",
|
||||||
"Belarusian": "Biellorusso",
|
"Belarusian": "Bielorusso",
|
||||||
"Bosnian": "Bosniaco",
|
"Bosnian": "Bosniaco",
|
||||||
"Bulgarian": "Bulgaro",
|
"Bulgarian": "Bulgaro",
|
||||||
"Burmese": "Birmano",
|
"Burmese": "Birmano",
|
||||||
@@ -238,10 +238,10 @@
|
|||||||
"Haitian Creole": "Creolo haitiano",
|
"Haitian Creole": "Creolo haitiano",
|
||||||
"Hausa": "Lingua hausa",
|
"Hausa": "Lingua hausa",
|
||||||
"Hawaiian": "Hawaiano",
|
"Hawaiian": "Hawaiano",
|
||||||
"Hebrew": "Ebreo",
|
"Hebrew": "Ebraico",
|
||||||
"Hindi": "Hindi",
|
"Hindi": "Hindi",
|
||||||
"Hmong": "Hmong",
|
"Hmong": "Hmong",
|
||||||
"Hungarian": "Ungarese",
|
"Hungarian": "Ungherese",
|
||||||
"Icelandic": "Islandese",
|
"Icelandic": "Islandese",
|
||||||
"Igbo": "Igbo",
|
"Igbo": "Igbo",
|
||||||
"Indonesian": "Indonesiano",
|
"Indonesian": "Indonesiano",
|
||||||
@@ -254,7 +254,7 @@
|
|||||||
"Khmer": "Khmer",
|
"Khmer": "Khmer",
|
||||||
"Korean": "Coreano",
|
"Korean": "Coreano",
|
||||||
"Kurdish": "Curdo",
|
"Kurdish": "Curdo",
|
||||||
"Kyrgyz": "Kirghize",
|
"Kyrgyz": "Kirghiso",
|
||||||
"Lao": "Lao",
|
"Lao": "Lao",
|
||||||
"Latin": "Latino",
|
"Latin": "Latino",
|
||||||
"Latvian": "Lettone",
|
"Latvian": "Lettone",
|
||||||
@@ -269,7 +269,7 @@
|
|||||||
"Marathi": "Marathi",
|
"Marathi": "Marathi",
|
||||||
"Mongolian": "Mongolo",
|
"Mongolian": "Mongolo",
|
||||||
"Nepali": "Nepalese",
|
"Nepali": "Nepalese",
|
||||||
"Norwegian Bokmål": "Norvegese",
|
"Norwegian Bokmål": "Norvegese bokmål",
|
||||||
"Nyanja": "Nyanja",
|
"Nyanja": "Nyanja",
|
||||||
"Pashto": "Pashtu",
|
"Pashto": "Pashtu",
|
||||||
"Persian": "Persiano",
|
"Persian": "Persiano",
|
||||||
@@ -278,7 +278,7 @@
|
|||||||
"Punjabi": "Punjabi",
|
"Punjabi": "Punjabi",
|
||||||
"Romanian": "Rumeno",
|
"Romanian": "Rumeno",
|
||||||
"Russian": "Russo",
|
"Russian": "Russo",
|
||||||
"Samoan": "Samoan",
|
"Samoan": "Samoano",
|
||||||
"Scottish Gaelic": "Gaelico scozzese",
|
"Scottish Gaelic": "Gaelico scozzese",
|
||||||
"Serbian": "Serbo",
|
"Serbian": "Serbo",
|
||||||
"Shona": "Shona",
|
"Shona": "Shona",
|
||||||
@@ -293,15 +293,15 @@
|
|||||||
"Sundanese": "Sudanese",
|
"Sundanese": "Sudanese",
|
||||||
"Swahili": "Swahili",
|
"Swahili": "Swahili",
|
||||||
"Swedish": "Svedese",
|
"Swedish": "Svedese",
|
||||||
"Tajik": "Tajik",
|
"Tajik": "Tagico",
|
||||||
"Tamil": "Tamil",
|
"Tamil": "Tamil",
|
||||||
"Telugu": "Telugu",
|
"Telugu": "Telugu",
|
||||||
"Thai": "Thaï",
|
"Thai": "Thailandese",
|
||||||
"Turkish": "Turco",
|
"Turkish": "Turco",
|
||||||
"Ukrainian": "Ucraino",
|
"Ukrainian": "Ucraino",
|
||||||
"Urdu": "Urdu",
|
"Urdu": "Urdu",
|
||||||
"Uzbek": "Uzbeco",
|
"Uzbek": "Uzbeco",
|
||||||
"Vietnamese": "Vietnamese",
|
"Vietnamese": "Vietnamita",
|
||||||
"Welsh": "Gallese",
|
"Welsh": "Gallese",
|
||||||
"Western Frisian": "Frisone occidentale",
|
"Western Frisian": "Frisone occidentale",
|
||||||
"Xhosa": "Xhosa",
|
"Xhosa": "Xhosa",
|
||||||
@@ -340,39 +340,38 @@
|
|||||||
"%A %B %-d, %Y": "%A %-d %B %Y",
|
"%A %B %-d, %Y": "%A %-d %B %Y",
|
||||||
"(edited)": "(modificato)",
|
"(edited)": "(modificato)",
|
||||||
"YouTube comment permalink": "Link permanente al commento di YouTube",
|
"YouTube comment permalink": "Link permanente al commento di YouTube",
|
||||||
"permalink": "permalink",
|
"permalink": "perma-collegamento",
|
||||||
"`x` marked it with a ❤": "`x` l'ha contrassegnato con un ❤",
|
"`x` marked it with a ❤": "`x` l'ha contrassegnato con un ❤",
|
||||||
"Audio mode": "Modalità audio",
|
"Audio mode": "Modalità audio",
|
||||||
"Video mode": "Modalità video",
|
"Video mode": "Modalità video",
|
||||||
"Videos": "Video",
|
"Videos": "Video",
|
||||||
"Playlists": "Playlist",
|
"Playlists": "Playlist",
|
||||||
"Community": "Comunità",
|
"Community": "Comunità",
|
||||||
"relevance": "Pertinenza",
|
"search_filters_sort_option_relevance": "Pertinenza",
|
||||||
"rating": "Valutazione",
|
"search_filters_sort_option_rating": "Valutazione",
|
||||||
"date": "Data di caricamento",
|
"search_filters_sort_option_date": "Data di caricamento",
|
||||||
"views": "Numero di visualizzazioni",
|
"search_filters_sort_option_views": "Numero di visualizzazioni",
|
||||||
"content_type": "Tipo",
|
"search_filters_type_label": "Tipo",
|
||||||
"duration": "Durata",
|
"search_filters_duration_label": "Durata",
|
||||||
"features": "Caratteristiche",
|
"search_filters_features_label": "Caratteristiche",
|
||||||
"sort": "Ordina per",
|
"search_filters_sort_label": "Ordina per",
|
||||||
"hour": "Ultima ora",
|
"search_filters_date_option_hour": "Ultima ora",
|
||||||
"today": "Oggi",
|
"search_filters_date_option_today": "Oggi",
|
||||||
"week": "Questa settimana",
|
"search_filters_date_option_week": "Questa settimana",
|
||||||
"month": "Questo mese",
|
"search_filters_date_option_month": "Questo mese",
|
||||||
"year": "Quest'anno",
|
"search_filters_date_option_year": "Quest'anno",
|
||||||
"video": "Video",
|
"search_filters_type_option_video": "Video",
|
||||||
"channel": "Canale",
|
"search_filters_type_option_channel": "Canale",
|
||||||
"playlist": "Playlist",
|
"search_filters_type_option_playlist": "Playlist",
|
||||||
"movie": "Film",
|
"search_filters_type_option_movie": "Film",
|
||||||
"hd": "AD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "Sottotitoli / CC",
|
"search_filters_features_option_subtitles": "Sottotitoli / CC",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "In diretta",
|
"search_filters_features_option_live": "In diretta",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "Posizione",
|
"search_filters_features_option_location": "Posizione",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "Filtra",
|
|
||||||
"Current version: ": "Versione attuale: ",
|
"Current version: ": "Versione attuale: ",
|
||||||
"preferences_quality_dash_option_240p": "240p",
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
"preferences_quality_dash_option_360p": "360p",
|
"preferences_quality_dash_option_360p": "360p",
|
||||||
@@ -382,15 +381,95 @@
|
|||||||
"preferences_quality_dash_option_1440p": "1440p",
|
"preferences_quality_dash_option_1440p": "1440p",
|
||||||
"preferences_quality_dash_option_2160p": "2160p",
|
"preferences_quality_dash_option_2160p": "2160p",
|
||||||
"preferences_quality_dash_option_4320p": "4320p",
|
"preferences_quality_dash_option_4320p": "4320p",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"preferences_quality_dash_option_144p": "144p",
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
"Released under the AGPLv3 on Github.": "Rilasciato su Github con licenza AGPLv3.",
|
"Released under the AGPLv3 on Github.": "Pubblicato su GitHub con licenza AGPLv3.",
|
||||||
"preferences_quality_option_medium": "Media",
|
"preferences_quality_option_medium": "Media",
|
||||||
"preferences_quality_option_small": "Piccola",
|
"preferences_quality_option_small": "Limitata",
|
||||||
"preferences_quality_dash_option_best": "Migliore",
|
"preferences_quality_dash_option_best": "Migliore",
|
||||||
"preferences_quality_dash_option_worst": "Peggiore",
|
"preferences_quality_dash_option_worst": "Peggiore",
|
||||||
"invidious": "Invidious",
|
"invidious": "Invidious",
|
||||||
"preferences_quality_dash_label": "Qualità video DASH preferita ",
|
"preferences_quality_dash_label": "Qualità video DASH preferita: ",
|
||||||
"preferences_quality_option_hd720": "HD720",
|
"preferences_quality_option_hd720": "HD720",
|
||||||
"preferences_quality_dash_option_auto": "Automatica"
|
"preferences_quality_dash_option_auto": "Automatica",
|
||||||
|
"videoinfo_watch_on_youTube": "Guarda su YouTube",
|
||||||
|
"preferences_extend_desc_label": "Estendi automaticamente la descrizione del video: ",
|
||||||
|
"preferences_vr_mode_label": "Video interattivi a 360 gradi: ",
|
||||||
|
"Show less": "Mostra di meno",
|
||||||
|
"Switch Invidious Instance": "Cambia istanza Invidious",
|
||||||
|
"next_steps_error_message_go_to_youtube": "Andare su YouTube",
|
||||||
|
"footer_documentation": "Documentazione",
|
||||||
|
"footer_original_source_code": "Codice sorgente originale",
|
||||||
|
"footer_modfied_source_code": "Codice sorgente modificato",
|
||||||
|
"none": "nessuno",
|
||||||
|
"videoinfo_started_streaming_x_ago": "Ha iniziato a trasmettere `x` fa",
|
||||||
|
"download_subtitles": "Sottotitoli - `x` (.vtt)",
|
||||||
|
"user_saved_playlists": "playlist salvate da `x`",
|
||||||
|
"preferences_automatic_instance_redirect_label": "Reindirizzamento automatico dell'istanza (ripiego su redirect.invidious.io): ",
|
||||||
|
"Video unavailable": "Video non disponibile",
|
||||||
|
"preferences_show_nick_label": "Mostra nickname in alto: ",
|
||||||
|
"videoinfo_youTube_embed_link": "Incorpora",
|
||||||
|
"videoinfo_invidious_embed_link": "Incorpora collegamento",
|
||||||
|
"user_created_playlists": "playlist create da `x`",
|
||||||
|
"preferences_save_player_pos_label": "Memorizza il minutaggio raggiunto dal video: ",
|
||||||
|
"preferences_quality_option_dash": "DASH (qualità adattiva)",
|
||||||
|
"preferences_region_label": "Nazione del contenuto: ",
|
||||||
|
"preferences_category_misc": "Preferenze varie",
|
||||||
|
"next_steps_error_message": "Dopodiché dovresti provare a: ",
|
||||||
|
"next_steps_error_message_refresh": "Aggiornare",
|
||||||
|
"footer_donate_page": "Dona",
|
||||||
|
"footer_source_code": "Codice sorgente",
|
||||||
|
"adminprefs_modified_source_code_url_label": "Link per il repository del codice sorgente modificato",
|
||||||
|
"Show more": "Mostra di più",
|
||||||
|
"search_filters_title": "Filtra",
|
||||||
|
"search_filters_type_option_show": "Serie",
|
||||||
|
"search_filters_duration_option_short": "Corto (< 4 minuti)",
|
||||||
|
"search_filters_duration_option_long": "Lungo (> 20 minuti)",
|
||||||
|
"search_filters_features_option_purchased": "Acquistato",
|
||||||
|
"comments_view_x_replies": "Vedi {{count}} risposta",
|
||||||
|
"comments_view_x_replies_plural": "Vedi {{count}} risposte",
|
||||||
|
"comments_points_count": "{{count}} punto",
|
||||||
|
"comments_points_count_plural": "{{count}} punti",
|
||||||
|
"Portuguese (auto-generated)": "Portoghese (generati automaticamente)",
|
||||||
|
"crash_page_you_found_a_bug": "Sembra che tu abbia trovato un bug in Invidious!",
|
||||||
|
"crash_page_switch_instance": "provato a <a href=\"`x`\">usare un'altra istanza</a>",
|
||||||
|
"crash_page_before_reporting": "Prima di segnalare un bug, assicurati di aver:",
|
||||||
|
"crash_page_read_the_faq": "letto le <a href=\"`x`\">domande più frequenti (FAQ)</a>",
|
||||||
|
"crash_page_search_issue": "cercato tra <a href=\"`x`\"> i problemi esistenti su GitHub</a>",
|
||||||
|
"crash_page_report_issue": "Se niente di tutto ciò ha aiutato, per favore <a href=\"`x`\">apri un nuovo problema su GitHub</a> (preferibilmente in inglese) e includi il seguente testo nel tuo messaggio (NON tradurre il testo):",
|
||||||
|
"Popular enabled: ": "Popolare attivato: ",
|
||||||
|
"English (United Kingdom)": "Inglese (Regno Unito)",
|
||||||
|
"Portuguese (Brazil)": "Portoghese (Brasile)",
|
||||||
|
"preferences_watch_history_label": "Attiva cronologia di riproduzione: ",
|
||||||
|
"French (auto-generated)": "Francese (generati automaticamente)",
|
||||||
|
"search_message_use_another_instance": " Puoi anche <a href=\"`x`\">cercare in un'altra istanza</a>.",
|
||||||
|
"search_message_no_results": "Nessun risultato trovato.",
|
||||||
|
"search_message_change_filters_or_query": "Prova ad ampliare la ricerca e/o modificare i filtri.",
|
||||||
|
"English (United States)": "Inglese (Stati Uniti)",
|
||||||
|
"Cantonese (Hong Kong)": "Cantonese (Hong Kong)",
|
||||||
|
"Chinese": "Cinese",
|
||||||
|
"Chinese (China)": "Cinese (Cina)",
|
||||||
|
"Chinese (Hong Kong)": "Cinese (Hong Kong)",
|
||||||
|
"Chinese (Taiwan)": "Cinese (Taiwan)",
|
||||||
|
"Dutch (auto-generated)": "Olandese (generati automaticamente)",
|
||||||
|
"German (auto-generated)": "Tedesco (generati automaticamente)",
|
||||||
|
"Indonesian (auto-generated)": "Indonesiano (generati automaticamente)",
|
||||||
|
"Interlingue": "Interlingua",
|
||||||
|
"Italian (auto-generated)": "Italiano (generati automaticamente)",
|
||||||
|
"Japanese (auto-generated)": "Giapponese (generati automaticamente)",
|
||||||
|
"Korean (auto-generated)": "Coreano (generati automaticamente)",
|
||||||
|
"Russian (auto-generated)": "Russo (generati automaticamente)",
|
||||||
|
"Spanish (auto-generated)": "Spagnolo (generati automaticamente)",
|
||||||
|
"Spanish (Mexico)": "Spagnolo (Messico)",
|
||||||
|
"Spanish (Spain)": "Spagnolo (Spagna)",
|
||||||
|
"Turkish (auto-generated)": "Turco (auto-generato)",
|
||||||
|
"Vietnamese (auto-generated)": "Vietnamita (auto-generato)",
|
||||||
|
"search_filters_date_label": "Data caricamento",
|
||||||
|
"search_filters_date_option_none": "Qualunque data",
|
||||||
|
"search_filters_type_option_all": "Qualunque tipo",
|
||||||
|
"search_filters_duration_option_none": "Qualunque durata",
|
||||||
|
"search_filters_duration_option_medium": "Media (4 - 20 minuti)",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_apply_button": "Applica filtri selezionati",
|
||||||
|
"crash_page_refresh": "provato a <a href=\"`x`\">ricaricare la pagina</a>"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,15 +26,15 @@
|
|||||||
"No": "いいえ",
|
"No": "いいえ",
|
||||||
"Import and Export Data": "データのインポートとエクスポート",
|
"Import and Export Data": "データのインポートとエクスポート",
|
||||||
"Import": "インポート",
|
"Import": "インポート",
|
||||||
"Import Invidious data": "Invidious データをインポート",
|
"Import Invidious data": "Invidious JSONデータをインポート",
|
||||||
"Import YouTube subscriptions": "YouTube 登録チャンネルをインポート",
|
"Import YouTube subscriptions": "YouTube/OPML 登録チャンネルをインポート",
|
||||||
"Import FreeTube subscriptions (.db)": "FreeTube 登録チャンネルをインポート (.db)",
|
"Import FreeTube subscriptions (.db)": "FreeTube 登録チャンネルをインポート (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "NewPipe 登録チャンネルをインポート (.json)",
|
"Import NewPipe subscriptions (.json)": "NewPipe 登録チャンネルをインポート (.json)",
|
||||||
"Import NewPipe data (.zip)": "NewPipe データをインポート (.zip)",
|
"Import NewPipe data (.zip)": "NewPipe データをインポート (.zip)",
|
||||||
"Export": "エクスポート",
|
"Export": "エクスポート",
|
||||||
"Export subscriptions as OPML": "登録チャンネルを OPML でエクスポート",
|
"Export subscriptions as OPML": "登録チャンネルを OPML でエクスポート",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "登録チャンネルを OPML でエクスポート (NewPipe & FreeTube 用)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "登録チャンネルを OPML でエクスポート (NewPipe & FreeTube 用)",
|
||||||
"Export data as JSON": "データを JSON でエクスポート",
|
"Export data as JSON": "Invidious のデータを JSON でエクスポート",
|
||||||
"Delete account?": "アカウントを削除しますか?",
|
"Delete account?": "アカウントを削除しますか?",
|
||||||
"History": "履歴",
|
"History": "履歴",
|
||||||
"An alternative front-end to YouTube": "YouTube 向けの代用フロントエンド",
|
"An alternative front-end to YouTube": "YouTube 向けの代用フロントエンド",
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
"preferences_related_videos_label": "関連動画を表示: ",
|
"preferences_related_videos_label": "関連動画を表示: ",
|
||||||
"preferences_annotations_label": "デフォルトでアノテーションを表示: ",
|
"preferences_annotations_label": "デフォルトでアノテーションを表示: ",
|
||||||
"preferences_extend_desc_label": "動画の説明文を自動的に拡張: ",
|
"preferences_extend_desc_label": "動画の説明文を自動的に拡張: ",
|
||||||
"preferences_vr_mode_label": "対話的な360°動画: ",
|
"preferences_vr_mode_label": "対話的な360°動画 (WebGL が必要): ",
|
||||||
"preferences_category_visual": "外観設定",
|
"preferences_category_visual": "外観設定",
|
||||||
"preferences_player_style_label": "プレイヤースタイル: ",
|
"preferences_player_style_label": "プレイヤースタイル: ",
|
||||||
"Dark mode: ": "ダークモード: ",
|
"Dark mode: ": "ダークモード: ",
|
||||||
@@ -148,7 +148,6 @@
|
|||||||
"Show less": "表示を減らす",
|
"Show less": "表示を減らす",
|
||||||
"Watch on YouTube": "YouTube で視聴",
|
"Watch on YouTube": "YouTube で視聴",
|
||||||
"Switch Invidious Instance": "Invidiousインスタンスの変更",
|
"Switch Invidious Instance": "Invidiousインスタンスの変更",
|
||||||
"Broken? Try another Invidious Instance": "壊れる?違うInvidiousインスタンスを試してみる",
|
|
||||||
"Hide annotations": "アノテーションを隠す",
|
"Hide annotations": "アノテーションを隠す",
|
||||||
"Show annotations": "アノテーションを表示",
|
"Show annotations": "アノテーションを表示",
|
||||||
"Genre: ": "ジャンル: ",
|
"Genre: ": "ジャンル: ",
|
||||||
@@ -345,44 +344,43 @@
|
|||||||
"Videos": "動画",
|
"Videos": "動画",
|
||||||
"Playlists": "プレイリスト",
|
"Playlists": "プレイリスト",
|
||||||
"Community": "コミュニティ",
|
"Community": "コミュニティ",
|
||||||
"relevance": "関連",
|
"search_filters_sort_option_relevance": "関連",
|
||||||
"rating": "評価",
|
"search_filters_sort_option_rating": "評価",
|
||||||
"date": "時刻",
|
"search_filters_sort_option_date": "時刻",
|
||||||
"views": "再生回数",
|
"search_filters_sort_option_views": "再生回数",
|
||||||
"content_type": "コンテンツの種類",
|
"search_filters_type_label": "コンテンツの種類",
|
||||||
"duration": "再生時間",
|
"search_filters_duration_label": "再生時間",
|
||||||
"features": "機能",
|
"search_filters_features_label": "機能",
|
||||||
"sort": "順番",
|
"search_filters_sort_label": "順番",
|
||||||
"hour": "1時間前",
|
"search_filters_date_option_hour": "1時間前",
|
||||||
"today": "今日",
|
"search_filters_date_option_today": "今日",
|
||||||
"week": "今週",
|
"search_filters_date_option_week": "今週",
|
||||||
"month": "今月",
|
"search_filters_date_option_month": "今月",
|
||||||
"year": "今年",
|
"search_filters_date_option_year": "今年",
|
||||||
"video": "動画",
|
"search_filters_type_option_video": "動画",
|
||||||
"channel": "チャンネル",
|
"search_filters_type_option_channel": "チャンネル",
|
||||||
"playlist": "再生リスト",
|
"search_filters_type_option_playlist": "再生リスト",
|
||||||
"movie": "映画",
|
"search_filters_type_option_movie": "映画",
|
||||||
"show": "番組",
|
"search_filters_type_option_show": "番組",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "字幕",
|
"search_filters_features_option_subtitles": "字幕",
|
||||||
"creative_commons": "クリエイティブ・コモンズ",
|
"search_filters_features_option_c_commons": "クリエイティブ・コモンズ",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "生配信",
|
"search_filters_features_option_live": "生配信",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "場所",
|
"search_filters_features_option_location": "場所",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "フィルタ",
|
|
||||||
"Current version: ": "現在のバージョン: ",
|
"Current version: ": "現在のバージョン: ",
|
||||||
"next_steps_error_message": "下記のものを試して下さい: ",
|
"next_steps_error_message": "下記のものを試して下さい: ",
|
||||||
"next_steps_error_message_refresh": "再読込",
|
"next_steps_error_message_refresh": "再読込",
|
||||||
"next_steps_error_message_go_to_youtube": "YouTubeへ",
|
"next_steps_error_message_go_to_youtube": "YouTubeへ",
|
||||||
"short": "4 分未満",
|
"search_filters_duration_option_short": "4 分未満",
|
||||||
"footer_documentation": "文書",
|
"footer_documentation": "文書",
|
||||||
"footer_source_code": "ソースコード",
|
"footer_source_code": "ソースコード",
|
||||||
"footer_original_source_code": "ソースコード(元)",
|
"footer_original_source_code": "ソースコード(元)",
|
||||||
"footer_modfied_source_code": "ソースコード(編集)",
|
"footer_modfied_source_code": "ソースコード(編集)",
|
||||||
"adminprefs_modified_source_code_url_label": "編集したソースコードのレポジトリーURL",
|
"adminprefs_modified_source_code_url_label": "編集したソースコードのレポジトリーURL",
|
||||||
"long": "20 分以上",
|
"search_filters_duration_option_long": "20 分以上",
|
||||||
"preferences_region_label": "地域: ",
|
"preferences_region_label": "地域: ",
|
||||||
"footer_donate_page": "寄付する",
|
"footer_donate_page": "寄付する",
|
||||||
"preferences_quality_dash_label": "優先するDash画質 : ",
|
"preferences_quality_dash_label": "優先するDash画質 : ",
|
||||||
@@ -404,12 +402,41 @@
|
|||||||
"videoinfo_invidious_embed_link": "埋め込みリンク",
|
"videoinfo_invidious_embed_link": "埋め込みリンク",
|
||||||
"none": "なし",
|
"none": "なし",
|
||||||
"download_subtitles": "字幕 - `x` (.vtt)",
|
"download_subtitles": "字幕 - `x` (.vtt)",
|
||||||
"purchased": "購入済み",
|
"search_filters_features_option_purchased": "購入済み",
|
||||||
"preferences_quality_option_dash": "DASH (適切な品質)",
|
"preferences_quality_option_dash": "DASH (適切な品質)",
|
||||||
"preferences_quality_dash_option_worst": "最悪",
|
"preferences_quality_dash_option_worst": "最悪",
|
||||||
"preferences_quality_dash_option_best": "最高",
|
"preferences_quality_dash_option_best": "最高",
|
||||||
"videoinfo_started_streaming_x_ago": "`x`分前に配信を開始",
|
"videoinfo_started_streaming_x_ago": "`x`分前に配信を開始",
|
||||||
"videoinfo_watch_on_youTube": "YouTube上で見る",
|
"videoinfo_watch_on_youTube": "YouTube上で見る",
|
||||||
"user_created_playlists": "`x`が作成したプレイリスト",
|
"user_created_playlists": "`x`が作成したプレイリスト",
|
||||||
"Video unavailable": "ビデオは利用できません"
|
"Video unavailable": "ビデオは利用できません",
|
||||||
|
"Chinese": "中国語",
|
||||||
|
"Chinese (Taiwan)": "中国語 (台湾)",
|
||||||
|
"Korean (auto-generated)": "韓国語 (自動生成)",
|
||||||
|
"Portuguese (auto-generated)": "ポルトガル語 (自動生成)",
|
||||||
|
"Turkish (auto-generated)": "トルコ語 (自動生成)",
|
||||||
|
"English (United Kingdom)": "英語 (イギリス)",
|
||||||
|
"Cantonese (Hong Kong)": "広東語 (香港)",
|
||||||
|
"Chinese (China)": "中国語 (中国)",
|
||||||
|
"Chinese (Hong Kong)": "中国語 (香港)",
|
||||||
|
"Dutch (auto-generated)": "オランダ語 (自動生成)",
|
||||||
|
"French (auto-generated)": "フランス語 (自動生成)",
|
||||||
|
"German (auto-generated)": "ドイツ語 (自動生成)",
|
||||||
|
"Indonesian (auto-generated)": "インドネシア語 (自動生成)",
|
||||||
|
"Italian (auto-generated)": "イタリア語 (自動生成)",
|
||||||
|
"Japanese (auto-generated)": "日本語 (自動生成)",
|
||||||
|
"Interlingue": "インターリング",
|
||||||
|
"Portuguese (Brazil)": "ポルトガル語 (ブラジル)",
|
||||||
|
"Russian (auto-generated)": "ロシア語 (自動生成)",
|
||||||
|
"Spanish (auto-generated)": "スペイン語 (自動生成)",
|
||||||
|
"Spanish (Mexico)": "スペイン語 (メキシコ)",
|
||||||
|
"Spanish (Spain)": "スペイン語 (スペイン)",
|
||||||
|
"Vietnamese (auto-generated)": "ベトナム語 (自動生成)",
|
||||||
|
"search_filters_title": "フィルタ",
|
||||||
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
|
"search_message_change_filters_or_query": "別のキーワードを試してみるか、検索フィルタを削除してください",
|
||||||
|
"search_message_no_results": "一致する検索結果はありませんでした",
|
||||||
|
"English (United States)": "英語 (アメリカ)",
|
||||||
|
"search_filters_date_label": "アップロード日",
|
||||||
|
"search_filters_features_option_vr180": "VR180"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,7 +86,7 @@
|
|||||||
"generic_playlists_count_0": "{{count}} 재생목록",
|
"generic_playlists_count_0": "{{count}} 재생목록",
|
||||||
"generic_subscribers_count_0": "{{count}} 구독자",
|
"generic_subscribers_count_0": "{{count}} 구독자",
|
||||||
"generic_subscriptions_count_0": "{{count}} 구독",
|
"generic_subscriptions_count_0": "{{count}} 구독",
|
||||||
"playlist": "재생목록",
|
"search_filters_type_option_playlist": "재생목록",
|
||||||
"Korean": "한국어",
|
"Korean": "한국어",
|
||||||
"Japanese": "일본어",
|
"Japanese": "일본어",
|
||||||
"Greek": "그리스어",
|
"Greek": "그리스어",
|
||||||
@@ -129,7 +129,7 @@
|
|||||||
"Delete playlist": "재생목록 삭제",
|
"Delete playlist": "재생목록 삭제",
|
||||||
"Delete playlist `x`?": "재생목록 `x` 를 삭제 하시겠습니까?",
|
"Delete playlist `x`?": "재생목록 `x` 를 삭제 하시겠습니까?",
|
||||||
"Updated `x` ago": "`x` 전에 업데이트됨",
|
"Updated `x` ago": "`x` 전에 업데이트됨",
|
||||||
"Released under the AGPLv3 on Github.": "Github에 AGPLv3 으로 배포됩니다.",
|
"Released under the AGPLv3 on Github.": "GitHub에 AGPLv3 으로 배포됩니다.",
|
||||||
"View all playlists": "모든 재생목록 보기",
|
"View all playlists": "모든 재생목록 보기",
|
||||||
"Private": "비공개",
|
"Private": "비공개",
|
||||||
"Unlisted": "목록에 없음",
|
"Unlisted": "목록에 없음",
|
||||||
@@ -195,16 +195,15 @@
|
|||||||
"Maori": "마오리어",
|
"Maori": "마오리어",
|
||||||
"Maltese": "몰타어",
|
"Maltese": "몰타어",
|
||||||
"Wrong answer": "잘못된 답변",
|
"Wrong answer": "잘못된 답변",
|
||||||
"live": "실시간",
|
"search_filters_features_option_live": "실시간",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"location": "지역",
|
"search_filters_features_option_location": "지역",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"filter": "필터",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"hdr": "HDR",
|
|
||||||
"Current version: ": "현재 버전: ",
|
"Current version: ": "현재 버전: ",
|
||||||
"next_steps_error_message_refresh": "새로 고침",
|
"next_steps_error_message_refresh": "새로 고침",
|
||||||
"next_steps_error_message_go_to_youtube": "YouTube로 가기",
|
"next_steps_error_message_go_to_youtube": "YouTube로 가기",
|
||||||
"subtitles": "자막",
|
"search_filters_features_option_subtitles": "자막",
|
||||||
"`x` marked it with a ❤": "`x`님의 ❤",
|
"`x` marked it with a ❤": "`x`님의 ❤",
|
||||||
"Download as: ": "다음으로 다운로드: ",
|
"Download as: ": "다음으로 다운로드: ",
|
||||||
"Download": "다운로드",
|
"Download": "다운로드",
|
||||||
@@ -219,7 +218,7 @@
|
|||||||
"Latvian": "라트비아어",
|
"Latvian": "라트비아어",
|
||||||
"Latin": "라틴어",
|
"Latin": "라틴어",
|
||||||
"Lao": "라오어",
|
"Lao": "라오어",
|
||||||
"channel": "채널",
|
"search_filters_type_option_channel": "채널",
|
||||||
"Kyrgyz": "키르기스어",
|
"Kyrgyz": "키르기스어",
|
||||||
"Kurdish": "쿠르드어",
|
"Kurdish": "쿠르드어",
|
||||||
"Khmer": "크메르어",
|
"Khmer": "크메르어",
|
||||||
@@ -279,7 +278,7 @@
|
|||||||
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "JavaScript가 꺼져 있는 것 같습니다! 댓글을 보려면 여기를 클릭하세요. 댓글을 로드하는 데 시간이 조금 더 걸릴 수 있습니다.",
|
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "JavaScript가 꺼져 있는 것 같습니다! 댓글을 보려면 여기를 클릭하세요. 댓글을 로드하는 데 시간이 조금 더 걸릴 수 있습니다.",
|
||||||
"Shared `x`": "공유된 `x`",
|
"Shared `x`": "공유된 `x`",
|
||||||
"Whitelisted regions: ": "차단되지 않은 지역: ",
|
"Whitelisted regions: ": "차단되지 않은 지역: ",
|
||||||
"views": "조회수",
|
"search_filters_sort_option_views": "조회수",
|
||||||
"Please log in": "로그인하세요",
|
"Please log in": "로그인하세요",
|
||||||
"Password cannot be longer than 55 characters": "비밀번호는 55자 이하여야 합니다",
|
"Password cannot be longer than 55 characters": "비밀번호는 55자 이하여야 합니다",
|
||||||
"Password cannot be empty": "비밀번호는 비워둘 수 없습니다",
|
"Password cannot be empty": "비밀번호는 비워둘 수 없습니다",
|
||||||
@@ -298,7 +297,6 @@
|
|||||||
"Empty playlist": "재생목록 비어 있음",
|
"Empty playlist": "재생목록 비어 있음",
|
||||||
"Show annotations": "주석 보이기",
|
"Show annotations": "주석 보이기",
|
||||||
"Hide annotations": "주석 숨기기",
|
"Hide annotations": "주석 숨기기",
|
||||||
"Broken? Try another Invidious Instance": "안되나요? 다른 Invidious 인스턴스를 시도해보세요",
|
|
||||||
"Switch Invidious Instance": "Invidious 인스턴스 변경",
|
"Switch Invidious Instance": "Invidious 인스턴스 변경",
|
||||||
"Spanish": "스페인어",
|
"Spanish": "스페인어",
|
||||||
"Southern Sotho": "소토어",
|
"Southern Sotho": "소토어",
|
||||||
@@ -343,12 +341,12 @@
|
|||||||
"Premieres `x`": "최초 공개 `x`",
|
"Premieres `x`": "최초 공개 `x`",
|
||||||
"Premieres in `x`": "`x` 에 최초 공개",
|
"Premieres in `x`": "`x` 에 최초 공개",
|
||||||
"next_steps_error_message": "다음 방법을 시도해 보세요: ",
|
"next_steps_error_message": "다음 방법을 시도해 보세요: ",
|
||||||
"creative_commons": "크리에이티브 커먼즈",
|
"search_filters_features_option_c_commons": "크리에이티브 커먼즈",
|
||||||
"duration": "길이",
|
"search_filters_duration_label": "길이",
|
||||||
"content_type": "구분",
|
"search_filters_type_label": "구분",
|
||||||
"date": "업로드 날짜",
|
"search_filters_sort_option_date": "업로드 날짜",
|
||||||
"rating": "평점",
|
"search_filters_sort_option_rating": "평점",
|
||||||
"relevance": "관련성",
|
"search_filters_sort_option_relevance": "관련성",
|
||||||
"Community": "커뮤니티",
|
"Community": "커뮤니티",
|
||||||
"Videos": "동영상",
|
"Videos": "동영상",
|
||||||
"Video mode": "비디오 모드",
|
"Video mode": "비디오 모드",
|
||||||
@@ -365,22 +363,23 @@
|
|||||||
"Rating: ": "평점: ",
|
"Rating: ": "평점: ",
|
||||||
"About": "정보",
|
"About": "정보",
|
||||||
"Top": "최고",
|
"Top": "최고",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"show": "쇼",
|
"search_filters_type_option_show": "쇼",
|
||||||
"movie": "영화",
|
"search_filters_type_option_movie": "영화",
|
||||||
"video": "동영상",
|
"search_filters_type_option_video": "동영상",
|
||||||
"year": "올해",
|
"search_filters_date_option_year": "올해",
|
||||||
"month": "이번 달",
|
"search_filters_date_option_month": "이번 달",
|
||||||
"week": "이번 주",
|
"search_filters_date_option_week": "이번 주",
|
||||||
"today": "오늘",
|
"search_filters_date_option_today": "오늘",
|
||||||
"hour": "지난 1시간",
|
"search_filters_date_option_hour": "지난 1시간",
|
||||||
"sort": "정렬기준",
|
"search_filters_sort_label": "정렬기준",
|
||||||
"features": "기능별",
|
"search_filters_features_label": "기능별",
|
||||||
"short": "4분 미만",
|
"search_filters_duration_option_short": "4분 미만",
|
||||||
"long": "20분 초과",
|
"search_filters_duration_option_long": "20분 초과",
|
||||||
"footer_documentation": "문서",
|
"footer_documentation": "문서",
|
||||||
"footer_source_code": "소스 코드",
|
"footer_source_code": "소스 코드",
|
||||||
"footer_original_source_code": "원본 소스 코드",
|
"footer_original_source_code": "원본 소스 코드",
|
||||||
"footer_modfied_source_code": "수정된 소스 코드",
|
"footer_modfied_source_code": "수정된 소스 코드",
|
||||||
"adminprefs_modified_source_code_url_label": "수정된 소스 코드 저장소의 URL"
|
"adminprefs_modified_source_code_url_label": "수정된 소스 코드 저장소의 URL",
|
||||||
|
"search_filters_title": "필터"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,7 +121,7 @@
|
|||||||
"Subscriptions": "Prenumeratos",
|
"Subscriptions": "Prenumeratos",
|
||||||
"search": "ieškoti",
|
"search": "ieškoti",
|
||||||
"Log out": "Atsijungti",
|
"Log out": "Atsijungti",
|
||||||
"Released under the AGPLv3 on Github.": "Išleista pagal AGPLv3 licenciją Github.",
|
"Released under the AGPLv3 on Github.": "Išleista pagal AGPLv3 licenciją GitHub.",
|
||||||
"Source available here.": "Kodas prieinamas čia.",
|
"Source available here.": "Kodas prieinamas čia.",
|
||||||
"View JavaScript license information.": "Žiūrėti JavaScript licencijos informaciją.",
|
"View JavaScript license information.": "Žiūrėti JavaScript licencijos informaciją.",
|
||||||
"View privacy policy.": "Žiūrėti privatumo politiką.",
|
"View privacy policy.": "Žiūrėti privatumo politiką.",
|
||||||
@@ -141,7 +141,6 @@
|
|||||||
"Show less": "Rodyti mažiau",
|
"Show less": "Rodyti mažiau",
|
||||||
"Watch on YouTube": "Žiaurėti Youtube",
|
"Watch on YouTube": "Žiaurėti Youtube",
|
||||||
"Switch Invidious Instance": "Keisti Invidious šaltinį",
|
"Switch Invidious Instance": "Keisti Invidious šaltinį",
|
||||||
"Broken? Try another Invidious Instance": "Neveikia? Bandyk kitą Invidious šaltinį",
|
|
||||||
"Hide annotations": "Slėpti anotacijas",
|
"Hide annotations": "Slėpti anotacijas",
|
||||||
"Show annotations": "Rodyti anotacijas",
|
"Show annotations": "Rodyti anotacijas",
|
||||||
"Genre: ": "Žanras: ",
|
"Genre: ": "Žanras: ",
|
||||||
@@ -329,39 +328,38 @@
|
|||||||
"Videos": "Vaizdo įrašai",
|
"Videos": "Vaizdo įrašai",
|
||||||
"Playlists": "Grojaraiščiai",
|
"Playlists": "Grojaraiščiai",
|
||||||
"Community": "Bendruomenė",
|
"Community": "Bendruomenė",
|
||||||
"relevance": "Aktualumas",
|
"search_filters_sort_option_relevance": "Aktualumas",
|
||||||
"rating": "Reitingas",
|
"search_filters_sort_option_rating": "Reitingas",
|
||||||
"date": "Įkėlimo data",
|
"search_filters_sort_option_date": "Įkėlimo data",
|
||||||
"views": "Peržiūrų skaičius",
|
"search_filters_sort_option_views": "Peržiūrų skaičius",
|
||||||
"content_type": "Tipas",
|
"search_filters_type_label": "Tipas",
|
||||||
"duration": "Trukmė",
|
"search_filters_duration_label": "Trukmė",
|
||||||
"features": "Funkcijos",
|
"search_filters_features_label": "Funkcijos",
|
||||||
"sort": "Rūšiuoti pagal",
|
"search_filters_sort_label": "Rūšiuoti pagal",
|
||||||
"hour": "Per paskutinę valandą",
|
"search_filters_date_option_hour": "Per paskutinę valandą",
|
||||||
"today": "Šiandien",
|
"search_filters_date_option_today": "Šiandien",
|
||||||
"week": "Šią savaitę",
|
"search_filters_date_option_week": "Šią savaitę",
|
||||||
"month": "Šį mėnesį",
|
"search_filters_date_option_month": "Šį mėnesį",
|
||||||
"year": "Šiais metais",
|
"search_filters_date_option_year": "Šiais metais",
|
||||||
"video": "Vaizdo įrašas",
|
"search_filters_type_option_video": "Vaizdo įrašas",
|
||||||
"channel": "Kanalas",
|
"search_filters_type_option_channel": "Kanalas",
|
||||||
"playlist": "Grojaraštis",
|
"search_filters_type_option_playlist": "Grojaraštis",
|
||||||
"movie": "Filmas",
|
"search_filters_type_option_movie": "Filmas",
|
||||||
"show": "Serialas",
|
"search_filters_type_option_show": "Serialas",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "Subtitrai/CC",
|
"search_filters_features_option_subtitles": "Subtitrai/CC",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "Tiesiogiai",
|
"search_filters_features_option_live": "Tiesiogiai",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "Vietovė",
|
"search_filters_features_option_location": "Vietovė",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "Filtras",
|
|
||||||
"Current version: ": "Dabartinė versija: ",
|
"Current version: ": "Dabartinė versija: ",
|
||||||
"next_steps_error_message": "Po to turėtumėte pabandyti: ",
|
"next_steps_error_message": "Po to turėtumėte pabandyti: ",
|
||||||
"next_steps_error_message_refresh": "Atnaujinti",
|
"next_steps_error_message_refresh": "Atnaujinti",
|
||||||
"next_steps_error_message_go_to_youtube": "Eiti į YouTube",
|
"next_steps_error_message_go_to_youtube": "Eiti į YouTube",
|
||||||
"short": "Trumpas (< 4 minučių)",
|
"search_filters_duration_option_short": "Trumpas (< 4 minučių)",
|
||||||
"long": "Ilgas (> 20 minučių)",
|
"search_filters_duration_option_long": "Ilgas (> 20 minučių)",
|
||||||
"footer_documentation": "Dokumentacija",
|
"footer_documentation": "Dokumentacija",
|
||||||
"footer_source_code": "Pirminis kodas",
|
"footer_source_code": "Pirminis kodas",
|
||||||
"footer_original_source_code": "Pradinis pirminis kodas",
|
"footer_original_source_code": "Pradinis pirminis kodas",
|
||||||
@@ -369,5 +367,9 @@
|
|||||||
"footer_modfied_source_code": "Pakeistas pirminis kodas",
|
"footer_modfied_source_code": "Pakeistas pirminis kodas",
|
||||||
"footer_donate_page": "Paaukoti",
|
"footer_donate_page": "Paaukoti",
|
||||||
"preferences_region_label": "Turinio šalis: ",
|
"preferences_region_label": "Turinio šalis: ",
|
||||||
"preferences_quality_dash_label": "Pageidaujama DASH vaizdo kokybė: "
|
"preferences_quality_dash_label": "Pageidaujama DASH vaizdo kokybė: ",
|
||||||
|
"preferences_quality_dash_option_best": "Geriausia",
|
||||||
|
"preferences_quality_dash_option_worst": "Blogiausia",
|
||||||
|
"preferences_quality_dash_option_auto": "Automatinis",
|
||||||
|
"search_filters_title": "Filtras"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
"Export": "Eksporter",
|
"Export": "Eksporter",
|
||||||
"Export subscriptions as OPML": "Eksporter abonnementer som OPML",
|
"Export subscriptions as OPML": "Eksporter abonnementer som OPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Eksporter abonnementer som OPML (for NewPipe og FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Eksporter abonnementer som OPML (for NewPipe og FreeTube)",
|
||||||
"Export data as JSON": "Eksporter data som JSON",
|
"Export data as JSON": "Eksporter Invidiousdata som JSON",
|
||||||
"Delete account?": "Slett konto?",
|
"Delete account?": "Slett konto?",
|
||||||
"History": "Historikk",
|
"History": "Historikk",
|
||||||
"An alternative front-end to YouTube": "En alternativ grenseflate for YouTube",
|
"An alternative front-end to YouTube": "En alternativ grenseflate for YouTube",
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
"preferences_related_videos_label": "Vis relaterte videoer? ",
|
"preferences_related_videos_label": "Vis relaterte videoer? ",
|
||||||
"preferences_annotations_label": "Vis merknader som forvalg? ",
|
"preferences_annotations_label": "Vis merknader som forvalg? ",
|
||||||
"preferences_extend_desc_label": "Utvid videobeskrivelse automatisk: ",
|
"preferences_extend_desc_label": "Utvid videobeskrivelse automatisk: ",
|
||||||
"preferences_vr_mode_label": "Interaktive 360-gradersfilmer: ",
|
"preferences_vr_mode_label": "Interaktive 360-gradersfilmer (krever WebGL): ",
|
||||||
"preferences_category_visual": "Visuelle innstillinger",
|
"preferences_category_visual": "Visuelle innstillinger",
|
||||||
"preferences_player_style_label": "Avspillerstil: ",
|
"preferences_player_style_label": "Avspillerstil: ",
|
||||||
"Dark mode: ": "Mørk drakt: ",
|
"Dark mode: ": "Mørk drakt: ",
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
"Subscriptions": "Abonnement",
|
"Subscriptions": "Abonnement",
|
||||||
"search": "søk",
|
"search": "søk",
|
||||||
"Log out": "Logg ut",
|
"Log out": "Logg ut",
|
||||||
"Released under the AGPLv3 on Github.": "Tilgjengelig med AGPLv3-lisens på Github.",
|
"Released under the AGPLv3 on Github.": "Tilgjengelig med AGPLv3-lisens på GitHub.",
|
||||||
"Source available here.": "Kildekode tilgjengelig her.",
|
"Source available here.": "Kildekode tilgjengelig her.",
|
||||||
"View JavaScript license information.": "Vis JavaScript-lisensinfo.",
|
"View JavaScript license information.": "Vis JavaScript-lisensinfo.",
|
||||||
"View privacy policy.": "Vis personvernspraksis.",
|
"View privacy policy.": "Vis personvernspraksis.",
|
||||||
@@ -141,7 +141,6 @@
|
|||||||
"Show less": "Vis mindre",
|
"Show less": "Vis mindre",
|
||||||
"Watch on YouTube": "Vis video på YouTube",
|
"Watch on YouTube": "Vis video på YouTube",
|
||||||
"Switch Invidious Instance": "Bytt Invidious-instans",
|
"Switch Invidious Instance": "Bytt Invidious-instans",
|
||||||
"Broken? Try another Invidious Instance": "Knekt? Forsøk en annen Invidious-instans",
|
|
||||||
"Hide annotations": "Skjul merknader",
|
"Hide annotations": "Skjul merknader",
|
||||||
"Show annotations": "Vis merknader",
|
"Show annotations": "Vis merknader",
|
||||||
"Genre: ": "Sjanger: ",
|
"Genre: ": "Sjanger: ",
|
||||||
@@ -199,7 +198,7 @@
|
|||||||
"No such user": "Ugyldig bruker",
|
"No such user": "Ugyldig bruker",
|
||||||
"Token is expired, please try again": "Symbol utløpt, prøv igjen",
|
"Token is expired, please try again": "Symbol utløpt, prøv igjen",
|
||||||
"English": "Engelsk",
|
"English": "Engelsk",
|
||||||
"English (auto-generated)": "Engelsk (auto-generert)",
|
"English (auto-generated)": "Engelsk (laget automatisk)",
|
||||||
"Afrikaans": "Afrikansk",
|
"Afrikaans": "Afrikansk",
|
||||||
"Albanian": "Albansk",
|
"Albanian": "Albansk",
|
||||||
"Amharic": "Amharisk",
|
"Amharic": "Amharisk",
|
||||||
@@ -329,40 +328,39 @@
|
|||||||
"Videos": "Videoer",
|
"Videos": "Videoer",
|
||||||
"Playlists": "Spillelister",
|
"Playlists": "Spillelister",
|
||||||
"Community": "Gemenskap",
|
"Community": "Gemenskap",
|
||||||
"relevance": "relevans",
|
"search_filters_sort_option_relevance": "relevans",
|
||||||
"rating": "vurdering",
|
"search_filters_sort_option_rating": "vurdering",
|
||||||
"date": "dato",
|
"search_filters_sort_option_date": "dato",
|
||||||
"views": "visninger",
|
"search_filters_sort_option_views": "visninger",
|
||||||
"content_type": "innholdstype",
|
"search_filters_type_label": "innholdstype",
|
||||||
"duration": "varighet",
|
"search_filters_duration_label": "varighet",
|
||||||
"features": "funksjoner",
|
"search_filters_features_label": "funksjoner",
|
||||||
"sort": "sorter",
|
"search_filters_sort_label": "sorter",
|
||||||
"hour": "time",
|
"search_filters_date_option_hour": "time",
|
||||||
"today": "i dag",
|
"search_filters_date_option_today": "i dag",
|
||||||
"week": "uke",
|
"search_filters_date_option_week": "uke",
|
||||||
"month": "måned",
|
"search_filters_date_option_month": "måned",
|
||||||
"year": "år",
|
"search_filters_date_option_year": "år",
|
||||||
"video": "video",
|
"search_filters_type_option_video": "video",
|
||||||
"channel": "kanal",
|
"search_filters_type_option_channel": "kanal",
|
||||||
"playlist": "spilleliste",
|
"search_filters_type_option_playlist": "spilleliste",
|
||||||
"movie": "film",
|
"search_filters_type_option_movie": "film",
|
||||||
"show": "vis",
|
"search_filters_type_option_show": "vis",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "undertekster",
|
"search_filters_features_option_subtitles": "undertekster",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "direkte",
|
"search_filters_features_option_live": "direkte",
|
||||||
"4k": "4k",
|
"search_filters_features_option_four_k": "4k",
|
||||||
"location": "sted",
|
"search_filters_features_option_location": "sted",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "filtrer",
|
|
||||||
"Current version: ": "Gjeldende versjon: ",
|
"Current version: ": "Gjeldende versjon: ",
|
||||||
"next_steps_error_message": "Etterpå bør du prøve dette: ",
|
"next_steps_error_message": "Etterpå bør du prøve dette: ",
|
||||||
"next_steps_error_message_refresh": "Gjenoppfrisk",
|
"next_steps_error_message_refresh": "Gjenoppfrisk",
|
||||||
"next_steps_error_message_go_to_youtube": "Gå til YouTube",
|
"next_steps_error_message_go_to_youtube": "Gå til YouTube",
|
||||||
"long": "Lang (> 20 minutter)",
|
"search_filters_duration_option_long": "Lang (> 20 minutter)",
|
||||||
"footer_donate_page": "Doner",
|
"footer_donate_page": "Doner",
|
||||||
"short": "Kort (< 4 minutter)",
|
"search_filters_duration_option_short": "Kort (< 4 minutter)",
|
||||||
"footer_documentation": "Dokumentasjon",
|
"footer_documentation": "Dokumentasjon",
|
||||||
"footer_source_code": "Kildekode",
|
"footer_source_code": "Kildekode",
|
||||||
"footer_original_source_code": "Opprinnelig kildekode",
|
"footer_original_source_code": "Opprinnelig kildekode",
|
||||||
@@ -384,8 +382,8 @@
|
|||||||
"preferences_quality_dash_option_240p": "240p",
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
"preferences_quality_dash_option_144p": "144p",
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
"invidious": "Invidious",
|
"invidious": "Invidious",
|
||||||
"purchased": "Kjøpt",
|
"search_filters_features_option_purchased": "Kjøpt",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"none": "intet",
|
"none": "intet",
|
||||||
"videoinfo_watch_on_youTube": "Se på YouTube",
|
"videoinfo_watch_on_youTube": "Se på YouTube",
|
||||||
"videoinfo_youTube_embed_link": "Bak inn",
|
"videoinfo_youTube_embed_link": "Bak inn",
|
||||||
@@ -432,10 +430,46 @@
|
|||||||
"generic_count_years": "{{count}} år",
|
"generic_count_years": "{{count}} år",
|
||||||
"generic_count_years_plural": "{{count}} år",
|
"generic_count_years_plural": "{{count}} år",
|
||||||
"crash_page_read_the_faq": "lest de <a href=\"`x`\">Ofte stilte spørsmålene (OSS/FAQ)</a>",
|
"crash_page_read_the_faq": "lest de <a href=\"`x`\">Ofte stilte spørsmålene (OSS/FAQ)</a>",
|
||||||
"crash_page_search_issue": "søkt etter <a href=\"`x`\">eksisterende utfordringer på Github</a>",
|
"crash_page_search_issue": "søkt etter <a href=\"`x`\">eksisterende utfordringer på GitHub</a>",
|
||||||
"crash_page_you_found_a_bug": "Det ser ut til at du fant en feil i Invidious!",
|
"crash_page_you_found_a_bug": "Det ser ut til at du fant en feil i Invidious!",
|
||||||
"crash_page_refresh": "forsøkt å <a href=\"`x`\">laste siden på nytt</a>",
|
"crash_page_refresh": "forsøkt å <a href=\"`x`\">laste siden på nytt</a>",
|
||||||
"crash_page_switch_instance": "forsøkt et <a href=\"`x`\">annet eksemplar</a>",
|
"crash_page_switch_instance": "forsøkt et <a href=\"`x`\">annet eksemplar</a>",
|
||||||
"crash_page_before_reporting": "Før du rapporterer en feil, sikre at du har:",
|
"crash_page_before_reporting": "Før du rapporterer en feil, sikre at du har:",
|
||||||
"crash_page_report_issue": "Hvis intet av det overnevnte hjalp, <a href=\"`x`\">lag en ny utfordring på Github</a> (fortrinnsvis på engelsk) og ta med følgende tekstbit i meldingen dit (IKKE oversett denne teksten):"
|
"crash_page_report_issue": "Sett at det overnevnte ikke hjalp, <a href=\"`x`\">lag en ny utfordring på GitHub</a> (fortrinnsvis på engelsk) og få med følgende tekstbit i meldingen dithen (IKKE oversett denne teksten):",
|
||||||
|
"English (United Kingdom)": "Engelsk (Storbritannia)",
|
||||||
|
"English (United States)": "Engelsk (USA)",
|
||||||
|
"Cantonese (Hong Kong)": "Kantonesisk (Hong Kong)",
|
||||||
|
"Portuguese (Brazil)": "Portugisisk (Brasil)",
|
||||||
|
"Spanish (Mexico)": "Spansk (Mexico)",
|
||||||
|
"Spanish (Spain)": "Spansk (Spania)",
|
||||||
|
"Spanish (auto-generated)": "Spansk (laget automatisk)",
|
||||||
|
"Vietnamese (auto-generated)": "Vietnamesisk (laget automatisk)",
|
||||||
|
"preferences_watch_history_label": "Aktiver seerhistorikk: ",
|
||||||
|
"Chinese": "Kinesisk",
|
||||||
|
"Chinese (China)": "Kinesisk (Kina)",
|
||||||
|
"Chinese (Hong Kong)": "Kinesisk (Hong Kong)",
|
||||||
|
"Chinese (Taiwan)": "Kinesisk (Taiwan)",
|
||||||
|
"French (auto-generated)": "Fransk (laget automatisk)",
|
||||||
|
"German (auto-generated)": "Tysk (laget automatisk)",
|
||||||
|
"Indonesian (auto-generated)": "Indonesisk (laget automatisk)",
|
||||||
|
"Interlingue": "Interlingue",
|
||||||
|
"Italian (auto-generated)": "Italiensk (laget automatisk)",
|
||||||
|
"Japanese (auto-generated)": "Japansk (laget automatisk)",
|
||||||
|
"Korean (auto-generated)": "Koreansk (laget automatisk)",
|
||||||
|
"Portuguese (auto-generated)": "Portugisisk (laget automatisk)",
|
||||||
|
"Russian (auto-generated)": "Russisk (laget automatisk)",
|
||||||
|
"Dutch (auto-generated)": "Nederlandsk (laget automatisk)",
|
||||||
|
"Turkish (auto-generated)": "Tyrkisk (laget automatisk)",
|
||||||
|
"search_filters_title": "Filtrer",
|
||||||
|
"Popular enabled: ": "Populære aktiv: ",
|
||||||
|
"search_message_change_filters_or_query": "Prøv ett mindre snevert søk og/eller endre filterne.",
|
||||||
|
"search_filters_duration_option_medium": "Middels (4–20 minutter)",
|
||||||
|
"search_message_no_results": "Resultatløst.",
|
||||||
|
"search_filters_type_option_all": "Alle typer",
|
||||||
|
"search_filters_duration_option_none": "Enhver varighet",
|
||||||
|
"search_message_use_another_instance": " Du kan også <a href=\"`x`\">søke på en annen instans</a>.",
|
||||||
|
"search_filters_date_label": "Opplastningsdato",
|
||||||
|
"search_filters_apply_button": "Bruk valgte filtre",
|
||||||
|
"search_filters_date_option_none": "Siden begynnelsen",
|
||||||
|
"search_filters_features_option_vr180": "VR180"
|
||||||
}
|
}
|
||||||
|
|||||||
148
locales/nl.json
148
locales/nl.json
@@ -21,15 +21,15 @@
|
|||||||
"No": "Nee",
|
"No": "Nee",
|
||||||
"Import and Export Data": "Gegevens im- en exporteren",
|
"Import and Export Data": "Gegevens im- en exporteren",
|
||||||
"Import": "Importeren",
|
"Import": "Importeren",
|
||||||
"Import Invidious data": "Invidious-gegevens importeren",
|
"Import Invidious data": "JSON-gegevens Invidious importeren",
|
||||||
"Import YouTube subscriptions": "YouTube-abonnementen importeren",
|
"Import YouTube subscriptions": "YouTube-/OPML-abonnementen importeren",
|
||||||
"Import FreeTube subscriptions (.db)": "FreeTube-abonnementen importeren (.db)",
|
"Import FreeTube subscriptions (.db)": "FreeTube-abonnementen importeren (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "NewPipe-abonnementen importeren (.json)",
|
"Import NewPipe subscriptions (.json)": "NewPipe-abonnementen importeren (.json)",
|
||||||
"Import NewPipe data (.zip)": "NewPipe-gegevens importeren (.zip)",
|
"Import NewPipe data (.zip)": "NewPipe-gegevens importeren (.zip)",
|
||||||
"Export": "Exporteren",
|
"Export": "Exporteren",
|
||||||
"Export subscriptions as OPML": "Abonnementen exporteren als OPML",
|
"Export subscriptions as OPML": "Abonnementen exporteren als OPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Abonnementen exporteren als OPML (voor NewPipe en FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Abonnementen exporteren als OPML (voor NewPipe en FreeTube)",
|
||||||
"Export data as JSON": "Gegevens exporteren als JSON",
|
"Export data as JSON": "Invidious-gegevens naar JSON exporteren",
|
||||||
"Delete account?": "Wilt u uw account verwijderen?",
|
"Delete account?": "Wilt u uw account verwijderen?",
|
||||||
"History": "Geschiedenis",
|
"History": "Geschiedenis",
|
||||||
"An alternative front-end to YouTube": "Een alternatief front-end voor YouTube",
|
"An alternative front-end to YouTube": "Een alternatief front-end voor YouTube",
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
"preferences_related_videos_label": "Gerelateerde video's tonen? ",
|
"preferences_related_videos_label": "Gerelateerde video's tonen? ",
|
||||||
"preferences_annotations_label": "Standaard annotaties tonen? ",
|
"preferences_annotations_label": "Standaard annotaties tonen? ",
|
||||||
"preferences_extend_desc_label": "Breid videobeschrijving automatisch uit: ",
|
"preferences_extend_desc_label": "Breid videobeschrijving automatisch uit: ",
|
||||||
"preferences_vr_mode_label": "Interactieve 360-graden-video's ",
|
"preferences_vr_mode_label": "Interactieve 360-graden-video's (vereist WebGL) ",
|
||||||
"preferences_category_visual": "Visuele instellingen",
|
"preferences_category_visual": "Visuele instellingen",
|
||||||
"preferences_player_style_label": "Speler vormgeving ",
|
"preferences_player_style_label": "Speler vormgeving ",
|
||||||
"Dark mode: ": "Donkere modus: ",
|
"Dark mode: ": "Donkere modus: ",
|
||||||
@@ -323,33 +323,32 @@
|
|||||||
"Videos": "Video's",
|
"Videos": "Video's",
|
||||||
"Playlists": "Afspeellijsten",
|
"Playlists": "Afspeellijsten",
|
||||||
"Community": "Gemeenschap",
|
"Community": "Gemeenschap",
|
||||||
"relevance": "relevantie",
|
"search_filters_sort_option_relevance": "relevantie",
|
||||||
"rating": "beoordeling",
|
"search_filters_sort_option_rating": "beoordeling",
|
||||||
"date": "datum",
|
"search_filters_sort_option_date": "datum",
|
||||||
"views": "keren bekeken",
|
"search_filters_sort_option_views": "keren bekeken",
|
||||||
"content_type": "Type inhoud",
|
"search_filters_type_label": "Type inhoud",
|
||||||
"duration": "duur",
|
"search_filters_duration_label": "duur",
|
||||||
"features": "eigenschappen",
|
"search_filters_features_label": "eigenschappen",
|
||||||
"sort": "sorteren",
|
"search_filters_sort_label": "sorteren",
|
||||||
"hour": "uur",
|
"search_filters_date_option_hour": "uur",
|
||||||
"today": "vandaag",
|
"search_filters_date_option_today": "vandaag",
|
||||||
"week": "week",
|
"search_filters_date_option_week": "week",
|
||||||
"month": "maand",
|
"search_filters_date_option_month": "maand",
|
||||||
"year": "jaar",
|
"search_filters_date_option_year": "jaar",
|
||||||
"video": "video",
|
"search_filters_type_option_video": "video",
|
||||||
"channel": "kanaal",
|
"search_filters_type_option_channel": "kanaal",
|
||||||
"playlist": "afspeellijst",
|
"search_filters_type_option_playlist": "afspeellijst",
|
||||||
"movie": "film",
|
"search_filters_type_option_movie": "film",
|
||||||
"show": "show",
|
"search_filters_type_option_show": "show",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "ondertitels",
|
"search_filters_features_option_subtitles": "ondertitels",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "Live",
|
"search_filters_features_option_live": "Live",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "locatie",
|
"search_filters_features_option_location": "locatie",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "verfijnen",
|
|
||||||
"Current version: ": "Huidige versie: ",
|
"Current version: ": "Huidige versie: ",
|
||||||
"Switch Invidious Instance": "Schakel tussen de Invidious Instanties",
|
"Switch Invidious Instance": "Schakel tussen de Invidious Instanties",
|
||||||
"preferences_automatic_instance_redirect_label": "Automatische instantie-omleiding (terugval naar redirect.invidious.io): ",
|
"preferences_automatic_instance_redirect_label": "Automatische instantie-omleiding (terugval naar redirect.invidious.io): ",
|
||||||
@@ -357,8 +356,8 @@
|
|||||||
"preferences_region_label": "Inhoud land: ",
|
"preferences_region_label": "Inhoud land: ",
|
||||||
"preferences_category_misc": "Diverse voorkeuren",
|
"preferences_category_misc": "Diverse voorkeuren",
|
||||||
"preferences_show_nick_label": "Toon bijnaam bovenaan: ",
|
"preferences_show_nick_label": "Toon bijnaam bovenaan: ",
|
||||||
"Released under the AGPLv3 on Github.": "Uitgebracht onder de AGPLv3 op Github.",
|
"Released under the AGPLv3 on Github.": "Uitgebracht onder de AGPLv3 op GitHub.",
|
||||||
"short": "Kort (<4 minuten)",
|
"search_filters_duration_option_short": "Kort (<4 minuten)",
|
||||||
"next_steps_error_message_refresh": "Vernieuwen",
|
"next_steps_error_message_refresh": "Vernieuwen",
|
||||||
"next_steps_error_message_go_to_youtube": "Ga naar YouTube",
|
"next_steps_error_message_go_to_youtube": "Ga naar YouTube",
|
||||||
"footer_donate_page": "Doneren",
|
"footer_donate_page": "Doneren",
|
||||||
@@ -366,10 +365,9 @@
|
|||||||
"footer_original_source_code": "Originele bron-code",
|
"footer_original_source_code": "Originele bron-code",
|
||||||
"footer_modfied_source_code": "Gewijzigde bron-code",
|
"footer_modfied_source_code": "Gewijzigde bron-code",
|
||||||
"adminprefs_modified_source_code_url_label": "URL naar gewijzigde bron-code-opslagplaats",
|
"adminprefs_modified_source_code_url_label": "URL naar gewijzigde bron-code-opslagplaats",
|
||||||
"Broken? Try another Invidious Instance": "Kapot? Probeer een andere Invidious Instantie",
|
|
||||||
"next_steps_error_message": "Waarna u moet proberen om: ",
|
"next_steps_error_message": "Waarna u moet proberen om: ",
|
||||||
"footer_source_code": "Bron-code",
|
"footer_source_code": "Bron-code",
|
||||||
"long": "Lang (> 20 minuten)",
|
"search_filters_duration_option_long": "Lang (> 20 minuten)",
|
||||||
"preferences_quality_option_dash": "DASH (adaptieve kwaliteit)",
|
"preferences_quality_option_dash": "DASH (adaptieve kwaliteit)",
|
||||||
"preferences_quality_option_hd720": "HD720",
|
"preferences_quality_option_hd720": "HD720",
|
||||||
"preferences_quality_option_medium": "Gemiddeld",
|
"preferences_quality_option_medium": "Gemiddeld",
|
||||||
@@ -395,8 +393,82 @@
|
|||||||
"user_created_playlists": "`x` afspeellijsten aangemaakt",
|
"user_created_playlists": "`x` afspeellijsten aangemaakt",
|
||||||
"user_saved_playlists": "`x` afspeellijsten opgeslagen",
|
"user_saved_playlists": "`x` afspeellijsten opgeslagen",
|
||||||
"Video unavailable": "Video onbeschikbaar",
|
"Video unavailable": "Video onbeschikbaar",
|
||||||
"preferences_save_player_pos_label": "Huidig afspeeltijdstip opslaan: ",
|
"preferences_save_player_pos_label": "Afspeelpositie opslaan: ",
|
||||||
"none": "geen",
|
"none": "geen",
|
||||||
"purchased": "Gekocht",
|
"search_filters_features_option_purchased": "Gekocht",
|
||||||
"360": "360º"
|
"search_filters_features_option_three_sixty": "360º",
|
||||||
|
"search_filters_title": "Verfijnen",
|
||||||
|
"generic_count_days": "{{count}} dag",
|
||||||
|
"generic_count_days_plural": "{{count}} dagen",
|
||||||
|
"Chinese (Taiwan)": "Chinees (Taiwan)",
|
||||||
|
"Dutch (auto-generated)": "Nederlands (automatisch gegenereerd)",
|
||||||
|
"tokens_count": "{{count}} token",
|
||||||
|
"tokens_count_plural": "{{count}} tokens",
|
||||||
|
"generic_count_seconds": "{{count}} second",
|
||||||
|
"generic_count_seconds_plural": "{{count}} seconden",
|
||||||
|
"generic_count_weeks": "{{count}} week",
|
||||||
|
"generic_count_weeks_plural": "{{count}} weken",
|
||||||
|
"English (United States)": "Engels (Verenigde Staten)",
|
||||||
|
"generic_views_count": "{{count}} keer bekeken",
|
||||||
|
"generic_views_count_plural": "{{count}} keren bekeken",
|
||||||
|
"generic_videos_count": "{{count}} video",
|
||||||
|
"generic_videos_count_plural": "{{count}} video's",
|
||||||
|
"generic_subscriptions_count": "{{count}} abonnement",
|
||||||
|
"generic_subscriptions_count_plural": "{{count}} abonnementen",
|
||||||
|
"subscriptions_unseen_notifs_count": "{{count}} ongeziene melding",
|
||||||
|
"subscriptions_unseen_notifs_count_plural": "{{count}} ongeziene meldingen",
|
||||||
|
"preferences_watch_history_label": "Kijkgeschiedenis inschakelen: ",
|
||||||
|
"crash_page_switch_instance": "geprobeerd hebt om <a href=\"`x`\">een andere instantie te gebruiken</a>",
|
||||||
|
"Portuguese (auto-generated)": "Portugees (automatisch gegenereerd)",
|
||||||
|
"Russian (auto-generated)": "Russisch (automatisch gegenereerd)",
|
||||||
|
"Vietnamese (auto-generated)": "Vietnamees (automatisch gegenereerd)",
|
||||||
|
"comments_points_count": "{{count}} punt",
|
||||||
|
"comments_points_count_plural": "{{count}} punten",
|
||||||
|
"crash_page_before_reporting": "Voor je een bug rapporteert, kijk even na of je:",
|
||||||
|
"Chinese": "Chinees",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_date_label": "Uploaddatum",
|
||||||
|
"Portuguese (Brazil)": "Portugees (Brazilië)",
|
||||||
|
"Interlingue": "Interlingue",
|
||||||
|
"Turkish (auto-generated)": "Turks (automatisch gegenereerd)",
|
||||||
|
"search_filters_date_option_none": "Alle datums",
|
||||||
|
"generic_subscribers_count": "{{count}} abonnee",
|
||||||
|
"generic_subscribers_count_plural": "{{count}} abonnees",
|
||||||
|
"search_message_no_results": "Geen resultaten teruggevonden.",
|
||||||
|
"search_message_change_filters_or_query": "Probeer je zoekopdracht uit te breiden en/of de filters aan te passen.",
|
||||||
|
"English (United Kingdom)": "Engels (Verenigd Koninkrijk)",
|
||||||
|
"German (auto-generated)": "Duits (automatisch gegenereerd)",
|
||||||
|
"Spanish (Mexico)": "Spaans (Mexico)",
|
||||||
|
"Spanish (Spain)": "Spaans (Spanje)",
|
||||||
|
"search_filters_type_option_all": "Alle types",
|
||||||
|
"crash_page_refresh": "geprobeerd hebt om <a href=\"`x`\">de pagina te herladen</a>",
|
||||||
|
"comments_view_x_replies": "{{count}} reactie bekijken",
|
||||||
|
"comments_view_x_replies_plural": "{{count}} reacties bekijken",
|
||||||
|
"generic_count_years": "{{count}} jaar",
|
||||||
|
"generic_count_years_plural": "{{count}} jaren",
|
||||||
|
"generic_count_months": "{{count}} maand",
|
||||||
|
"generic_count_months_plural": "{{count}} maanden",
|
||||||
|
"generic_count_hours": "{{count}} uur",
|
||||||
|
"generic_count_hours_plural": "{{count}} uren",
|
||||||
|
"generic_count_minutes": "{{count}} minuut",
|
||||||
|
"generic_count_minutes_plural": "{{count}} minuten",
|
||||||
|
"French (auto-generated)": "Frans (automatisch gegenereerd)",
|
||||||
|
"generic_playlists_count": "{{count}} afspeellijst",
|
||||||
|
"generic_playlists_count_plural": "{{count}} afspeellijsten",
|
||||||
|
"Chinese (Hong Kong)": "Chinees (Hongkong)",
|
||||||
|
"Korean (auto-generated)": "Koreaans (automatisch gegenereerd)",
|
||||||
|
"search_filters_apply_button": "Geselecteerd filters toepassen",
|
||||||
|
"search_message_use_another_instance": " Je kan ook <a href=\"`x`\">zoeken op een andere instantie</a>.",
|
||||||
|
"Cantonese (Hong Kong)": "Kantonees (Hongkong)",
|
||||||
|
"Chinese (China)": "Chinees (China)",
|
||||||
|
"crash_page_read_the_faq": "de <a href=\"`x`\">veelgestelde vragen (FAQ)</a> gelezen hebt",
|
||||||
|
"crash_page_search_issue": "gezocht hebt op <a href=\"`x`\">bestaande problemen op GitHub</a>",
|
||||||
|
"search_filters_duration_option_none": "Alle lengtes",
|
||||||
|
"Indonesian (auto-generated)": "Indonesisch (automatisch gegenereerd)",
|
||||||
|
"Italian (auto-generated)": "Italiaans (automatisch gegenereerd)",
|
||||||
|
"Japanese (auto-generated)": "Japans (automatisch gegenereerd)",
|
||||||
|
"Spanish (auto-generated)": "Spaans (automatisch gegenereerd)",
|
||||||
|
"crash_page_you_found_a_bug": "Je lijkt een bug in Invidious tegengekomen te zijn!",
|
||||||
|
"search_filters_duration_option_medium": "Gemiddeld (4 - 20 minuten)",
|
||||||
|
"crash_page_report_issue": "Indien het bovenstaande niet hielp, gelieve dan <a href=\"`x`\">een nieuw ticket op GitHub</a> te openen (liefst in het Engels) en neem de volgende tekst op in je bericht (gelieve deze NIET te vertalen):"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -140,7 +140,6 @@
|
|||||||
"Show less": "Pokaż mniej",
|
"Show less": "Pokaż mniej",
|
||||||
"Watch on YouTube": "Zobacz film na YouTube",
|
"Watch on YouTube": "Zobacz film na YouTube",
|
||||||
"Switch Invidious Instance": "Przełącz instancję Invidious",
|
"Switch Invidious Instance": "Przełącz instancję Invidious",
|
||||||
"Broken? Try another Invidious Instance": "Nie działa? Spróbuj innej instancji Invidious",
|
|
||||||
"Hide annotations": "Ukryj adnotacje",
|
"Hide annotations": "Ukryj adnotacje",
|
||||||
"Show annotations": "Pokaż adnotacje",
|
"Show annotations": "Pokaż adnotacje",
|
||||||
"Genre: ": "Gatunek: ",
|
"Genre: ": "Gatunek: ",
|
||||||
@@ -328,33 +327,32 @@
|
|||||||
"Videos": "Filmy",
|
"Videos": "Filmy",
|
||||||
"Playlists": "Playlisty",
|
"Playlists": "Playlisty",
|
||||||
"Community": "Społeczność",
|
"Community": "Społeczność",
|
||||||
"relevance": "Trafność",
|
"search_filters_sort_option_relevance": "Trafność",
|
||||||
"rating": "Ocena",
|
"search_filters_sort_option_rating": "Ocena",
|
||||||
"date": "data",
|
"search_filters_sort_option_date": "data",
|
||||||
"views": "Liczba wyświetleń",
|
"search_filters_sort_option_views": "Liczba wyświetleń",
|
||||||
"content_type": "Typ",
|
"search_filters_type_label": "Typ",
|
||||||
"duration": "Długość",
|
"search_filters_duration_label": "Długość",
|
||||||
"features": "Funkcje",
|
"search_filters_features_label": "Funkcje",
|
||||||
"sort": "sortuj",
|
"search_filters_sort_label": "sortuj",
|
||||||
"hour": "godzina",
|
"search_filters_date_option_hour": "godzina",
|
||||||
"today": "dzisiaj",
|
"search_filters_date_option_today": "dzisiaj",
|
||||||
"week": "tydzień",
|
"search_filters_date_option_week": "tydzień",
|
||||||
"month": "miesiąc",
|
"search_filters_date_option_month": "miesiąc",
|
||||||
"year": "rok",
|
"search_filters_date_option_year": "rok",
|
||||||
"video": "Film",
|
"search_filters_type_option_video": "Film",
|
||||||
"channel": "kanał",
|
"search_filters_type_option_channel": "kanał",
|
||||||
"playlist": "playlista",
|
"search_filters_type_option_playlist": "playlista",
|
||||||
"movie": "film",
|
"search_filters_type_option_movie": "film",
|
||||||
"show": "pokaż",
|
"search_filters_type_option_show": "pokaż",
|
||||||
"hd": "hd",
|
"search_filters_features_option_hd": "hd",
|
||||||
"subtitles": "napisy",
|
"search_filters_features_option_subtitles": "napisy",
|
||||||
"creative_commons": "creative_commons",
|
"search_filters_features_option_c_commons": "creative_commons",
|
||||||
"3d": "3d",
|
"search_filters_features_option_three_d": "3d",
|
||||||
"live": "Na żywo",
|
"search_filters_features_option_live": "Na żywo",
|
||||||
"4k": "4k",
|
"search_filters_features_option_four_k": "4k",
|
||||||
"location": "Lokalizacja",
|
"search_filters_features_option_location": "Lokalizacja",
|
||||||
"hdr": "hdr",
|
"search_filters_features_option_hdr": "hdr",
|
||||||
"filter": "filtr",
|
|
||||||
"Current version: ": "Aktualna wersja: ",
|
"Current version: ": "Aktualna wersja: ",
|
||||||
"next_steps_error_message": "Po czym powinien*ś spróbować: ",
|
"next_steps_error_message": "Po czym powinien*ś spróbować: ",
|
||||||
"next_steps_error_message_refresh": "Odśwież",
|
"next_steps_error_message_refresh": "Odśwież",
|
||||||
@@ -432,8 +430,8 @@
|
|||||||
"preferences_quality_dash_label": "Preferowana jakość filmu DASH: ",
|
"preferences_quality_dash_label": "Preferowana jakość filmu DASH: ",
|
||||||
"preferences_quality_dash_option_4320p": "4320p",
|
"preferences_quality_dash_option_4320p": "4320p",
|
||||||
"preferences_quality_dash_option_2160p": "2160p",
|
"preferences_quality_dash_option_2160p": "2160p",
|
||||||
"purchased": "Zakupione",
|
"search_filters_features_option_purchased": "Zakupione",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"footer_donate_page": "Dotacja",
|
"footer_donate_page": "Dotacja",
|
||||||
"none": "żadne",
|
"none": "żadne",
|
||||||
"videoinfo_started_streaming_x_ago": "Transmisja rozpoczęta `x` temu",
|
"videoinfo_started_streaming_x_ago": "Transmisja rozpoczęta `x` temu",
|
||||||
@@ -446,9 +444,9 @@
|
|||||||
"Video unavailable": "Film niedostępny",
|
"Video unavailable": "Film niedostępny",
|
||||||
"preferences_save_player_pos_label": "Zapisz pozycję odtwarzania: ",
|
"preferences_save_player_pos_label": "Zapisz pozycję odtwarzania: ",
|
||||||
"preferences_region_label": "Region zawartości: ",
|
"preferences_region_label": "Region zawartości: ",
|
||||||
"Released under the AGPLv3 on Github.": "Wydany na licencji AGPLv3 na Github.",
|
"Released under the AGPLv3 on Github.": "Wydany na licencji AGPLv3 na GitHub.",
|
||||||
"short": "Krótkie (< 4 minutes)",
|
"search_filters_duration_option_short": "Krótkie (< 4 minutes)",
|
||||||
"long": "Długie (> 20 minutes)",
|
"search_filters_duration_option_long": "Długie (> 20 minutes)",
|
||||||
"footer_documentation": "Dokumentacja",
|
"footer_documentation": "Dokumentacja",
|
||||||
"footer_source_code": "Kod źródłowy",
|
"footer_source_code": "Kod źródłowy",
|
||||||
"footer_modfied_source_code": "Zmodyfikowany Kod źródłowy",
|
"footer_modfied_source_code": "Zmodyfikowany Kod źródłowy",
|
||||||
@@ -476,5 +474,6 @@
|
|||||||
"Japanese (auto-generated)": "japoński (wygenerowany automatycznie)",
|
"Japanese (auto-generated)": "japoński (wygenerowany automatycznie)",
|
||||||
"Russian (auto-generated)": "rosyjski (wygenerowany automatycznie)",
|
"Russian (auto-generated)": "rosyjski (wygenerowany automatycznie)",
|
||||||
"Portuguese (auto-generated)": "portugalski (wygenerowany automatycznie)",
|
"Portuguese (auto-generated)": "portugalski (wygenerowany automatycznie)",
|
||||||
"Portuguese (Brazil)": "portugalski (Brazylia)"
|
"Portuguese (Brazil)": "portugalski (Brazylia)",
|
||||||
|
"search_filters_title": "Filtr"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,15 +21,15 @@
|
|||||||
"No": "Não",
|
"No": "Não",
|
||||||
"Import and Export Data": "Importar e Exportar Dados",
|
"Import and Export Data": "Importar e Exportar Dados",
|
||||||
"Import": "Importar",
|
"Import": "Importar",
|
||||||
"Import Invidious data": "Importar dados do Invidious",
|
"Import Invidious data": "Importar dados em JSON do Invidious",
|
||||||
"Import YouTube subscriptions": "Importar inscrições do YouTube",
|
"Import YouTube subscriptions": "Importar inscrições do YouTube/OPML",
|
||||||
"Import FreeTube subscriptions (.db)": "Importar inscrições do FreeTube (.db)",
|
"Import FreeTube subscriptions (.db)": "Importar inscrições do FreeTube (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "Importar inscrições do NewPipe (.json)",
|
"Import NewPipe subscriptions (.json)": "Importar inscrições do NewPipe (.json)",
|
||||||
"Import NewPipe data (.zip)": "Importar dados do NewPipe (.zip)",
|
"Import NewPipe data (.zip)": "Importar dados do NewPipe (.zip)",
|
||||||
"Export": "Exportar",
|
"Export": "Exportar",
|
||||||
"Export subscriptions as OPML": "Exportar inscrições como OPML",
|
"Export subscriptions as OPML": "Exportar inscrições como OPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportar inscrições como OPML (para NewPipe e FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportar inscrições como OPML (para NewPipe e FreeTube)",
|
||||||
"Export data as JSON": "Exportar dados como JSON",
|
"Export data as JSON": "Exportar dados Invidious como JSON",
|
||||||
"Delete account?": "Excluir conta?",
|
"Delete account?": "Excluir conta?",
|
||||||
"History": "Histórico",
|
"History": "Histórico",
|
||||||
"An alternative front-end to YouTube": "Uma interface alternativa para o YouTube",
|
"An alternative front-end to YouTube": "Uma interface alternativa para o YouTube",
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
"preferences_related_videos_label": "Mostrar vídeos relacionados: ",
|
"preferences_related_videos_label": "Mostrar vídeos relacionados: ",
|
||||||
"preferences_annotations_label": "Sempre mostrar anotações: ",
|
"preferences_annotations_label": "Sempre mostrar anotações: ",
|
||||||
"preferences_extend_desc_label": "Estenda automaticamente a descrição do vídeo: ",
|
"preferences_extend_desc_label": "Estenda automaticamente a descrição do vídeo: ",
|
||||||
"preferences_vr_mode_label": "Vídeos interativos de 360 graus: ",
|
"preferences_vr_mode_label": "Vídeos interativos de 360 graus (requer WebGL): ",
|
||||||
"preferences_category_visual": "Preferências visuais",
|
"preferences_category_visual": "Preferências visuais",
|
||||||
"preferences_player_style_label": "Estilo do tocador: ",
|
"preferences_player_style_label": "Estilo do tocador: ",
|
||||||
"Dark mode: ": "Modo escuro: ",
|
"Dark mode: ": "Modo escuro: ",
|
||||||
@@ -123,7 +123,7 @@
|
|||||||
"Subscriptions": "Inscrições",
|
"Subscriptions": "Inscrições",
|
||||||
"search": "Pesquisar",
|
"search": "Pesquisar",
|
||||||
"Log out": "Sair",
|
"Log out": "Sair",
|
||||||
"Released under the AGPLv3 on Github.": "Lançado sob a AGPLv3 no Github.",
|
"Released under the AGPLv3 on Github.": "Lançado sob a AGPLv3 no GitHub.",
|
||||||
"Source available here.": "Código-fonte disponível aqui.",
|
"Source available here.": "Código-fonte disponível aqui.",
|
||||||
"View JavaScript license information.": "Ver informações da licença do JavaScript.",
|
"View JavaScript license information.": "Ver informações da licença do JavaScript.",
|
||||||
"View privacy policy.": "Ver a política de privacidade.",
|
"View privacy policy.": "Ver a política de privacidade.",
|
||||||
@@ -143,7 +143,6 @@
|
|||||||
"Show less": "Mostrar menos",
|
"Show less": "Mostrar menos",
|
||||||
"Watch on YouTube": "Assistir no YouTube",
|
"Watch on YouTube": "Assistir no YouTube",
|
||||||
"Switch Invidious Instance": "Mudar a instância do Invidious",
|
"Switch Invidious Instance": "Mudar a instância do Invidious",
|
||||||
"Broken? Try another Invidious Instance": "Quebrou? Tente outra Instância do Invidious",
|
|
||||||
"Hide annotations": "Ocultar anotações",
|
"Hide annotations": "Ocultar anotações",
|
||||||
"Show annotations": "Mostrar anotações",
|
"Show annotations": "Mostrar anotações",
|
||||||
"Genre: ": "Gênero: ",
|
"Genre: ": "Gênero: ",
|
||||||
@@ -345,41 +344,40 @@
|
|||||||
"Videos": "Vídeos",
|
"Videos": "Vídeos",
|
||||||
"Playlists": "Listas de reprodução",
|
"Playlists": "Listas de reprodução",
|
||||||
"Community": "Comunidade",
|
"Community": "Comunidade",
|
||||||
"relevance": "relevância",
|
"search_filters_sort_option_relevance": "relevância",
|
||||||
"rating": "avaliação",
|
"search_filters_sort_option_rating": "avaliação",
|
||||||
"date": "data",
|
"search_filters_sort_option_date": "data",
|
||||||
"views": "visualizações",
|
"search_filters_sort_option_views": "visualizações",
|
||||||
"content_type": "content_type",
|
"search_filters_type_label": "content_type",
|
||||||
"duration": "duração",
|
"search_filters_duration_label": "duração",
|
||||||
"features": "recursos",
|
"search_filters_features_label": "recursos",
|
||||||
"sort": "ordenar",
|
"search_filters_sort_label": "ordenar",
|
||||||
"hour": "hora",
|
"search_filters_date_option_hour": "hora",
|
||||||
"today": "hoje",
|
"search_filters_date_option_today": "hoje",
|
||||||
"week": "semana",
|
"search_filters_date_option_week": "semana",
|
||||||
"month": "mês",
|
"search_filters_date_option_month": "mês",
|
||||||
"year": "ano",
|
"search_filters_date_option_year": "ano",
|
||||||
"video": "vídeo",
|
"search_filters_type_option_video": "vídeo",
|
||||||
"channel": "Canal",
|
"search_filters_type_option_channel": "Canal",
|
||||||
"playlist": "playlist",
|
"search_filters_type_option_playlist": "playlist",
|
||||||
"movie": "filme",
|
"search_filters_type_option_movie": "filme",
|
||||||
"show": "show",
|
"search_filters_type_option_show": "show",
|
||||||
"hd": "hd",
|
"search_filters_features_option_hd": "hd",
|
||||||
"subtitles": "legendas",
|
"search_filters_features_option_subtitles": "legendas",
|
||||||
"creative_commons": "creative_commons",
|
"search_filters_features_option_c_commons": "creative_commons",
|
||||||
"3d": "3d",
|
"search_filters_features_option_three_d": "3d",
|
||||||
"live": "ao vivo",
|
"search_filters_features_option_live": "ao vivo",
|
||||||
"4k": "4k",
|
"search_filters_features_option_four_k": "4k",
|
||||||
"location": "localização",
|
"search_filters_features_option_location": "localização",
|
||||||
"hdr": "hdr",
|
"search_filters_features_option_hdr": "hdr",
|
||||||
"filter": "filtro",
|
|
||||||
"Current version: ": "Versão atual: ",
|
"Current version: ": "Versão atual: ",
|
||||||
"next_steps_error_message": "Depois disso, você deve tentar: ",
|
"next_steps_error_message": "Depois disso, você deve tentar: ",
|
||||||
"next_steps_error_message_refresh": "Atualizar",
|
"next_steps_error_message_refresh": "Atualizar",
|
||||||
"next_steps_error_message_go_to_youtube": "Ir para o YouTube",
|
"next_steps_error_message_go_to_youtube": "Ir para o YouTube",
|
||||||
"footer_donate_page": "Doe",
|
"footer_donate_page": "Doe",
|
||||||
"adminprefs_modified_source_code_url_label": "URL para repositório de código fonte modificado",
|
"adminprefs_modified_source_code_url_label": "URL para repositório de código fonte modificado",
|
||||||
"long": "Longo (> 20 minutos)",
|
"search_filters_duration_option_long": "Longo (> 20 minutos)",
|
||||||
"short": "Curto (< 4 minutos)",
|
"search_filters_duration_option_short": "Curto (< 4 minutos)",
|
||||||
"footer_documentation": "Documentação",
|
"footer_documentation": "Documentação",
|
||||||
"footer_source_code": "Código fonte",
|
"footer_source_code": "Código fonte",
|
||||||
"footer_original_source_code": "Código fonte original",
|
"footer_original_source_code": "Código fonte original",
|
||||||
@@ -404,15 +402,15 @@
|
|||||||
"crash_page_you_found_a_bug": "Parece que você encontrou um erro no Invidious!",
|
"crash_page_you_found_a_bug": "Parece que você encontrou um erro no Invidious!",
|
||||||
"crash_page_before_reporting": "Antes de reportar um erro, verifique se você:",
|
"crash_page_before_reporting": "Antes de reportar um erro, verifique se você:",
|
||||||
"preferences_save_player_pos_label": "Salvar a posição de reprodução: ",
|
"preferences_save_player_pos_label": "Salvar a posição de reprodução: ",
|
||||||
"purchased": "Comprado",
|
"search_filters_features_option_purchased": "Comprado",
|
||||||
"crash_page_refresh": "tentou <a href=\"`x`\">recarregar a página</a>",
|
"crash_page_refresh": "tentou <a href=\"`x`\">recarregar a página</a>",
|
||||||
"crash_page_switch_instance": "tentou <a href=\"`x`\">usar outra instância</a>",
|
"crash_page_switch_instance": "tentou <a href=\"`x`\">usar outra instância</a>",
|
||||||
"crash_page_search_issue": "procurou por um <a href=\"`x`\">erro existente no Github</a>",
|
"crash_page_search_issue": "procurou por um <a href=\"`x`\">erro existente no GitHub</a>",
|
||||||
"crash_page_report_issue": "Se nenhuma opção acima ajudou, por favor <a href=\"`x`\">abra um novo problema no Github</a> (preferencialmente em inglês) e inclua o seguinte texto (NÃO traduza):",
|
"crash_page_report_issue": "Se nenhuma opção acima ajudou, por favor <a href=\"`x`\">abra um novo problema no Github</a> (preferencialmente em inglês) e inclua o seguinte texto (NÃO traduza):",
|
||||||
"crash_page_read_the_faq": "leu as <a href=\"`x`\">Perguntas Frequentes (FAQ)</a>",
|
"crash_page_read_the_faq": "leia as <a href=\"`x`\">Perguntas frequentes (FAQ)</a>",
|
||||||
"generic_views_count": "{{count}} visualização",
|
"generic_views_count": "{{count}} visualização",
|
||||||
"generic_views_count_plural": "{{count}} visualizações",
|
"generic_views_count_plural": "{{count}} visualizações",
|
||||||
"preferences_quality_option_dash": "DASH (qualidade adaptiva)",
|
"preferences_quality_option_dash": "DASH (qualidade adaptável)",
|
||||||
"preferences_quality_option_hd720": "HD720",
|
"preferences_quality_option_hd720": "HD720",
|
||||||
"preferences_quality_option_small": "Pequeno",
|
"preferences_quality_option_small": "Pequeno",
|
||||||
"preferences_quality_dash_option_auto": "Auto",
|
"preferences_quality_dash_option_auto": "Auto",
|
||||||
@@ -428,7 +426,7 @@
|
|||||||
"preferences_quality_dash_option_144p": "144p",
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
"invidious": "Invidious",
|
"invidious": "Invidious",
|
||||||
"preferences_quality_option_medium": "Médio",
|
"preferences_quality_option_medium": "Médio",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"none": "none",
|
"none": "none",
|
||||||
"videoinfo_watch_on_youTube": "Assistir no YouTube",
|
"videoinfo_watch_on_youTube": "Assistir no YouTube",
|
||||||
"videoinfo_youTube_embed_link": "Embutir",
|
"videoinfo_youTube_embed_link": "Embutir",
|
||||||
@@ -437,5 +435,41 @@
|
|||||||
"user_created_playlists": "`x` listas de reprodução criadas",
|
"user_created_playlists": "`x` listas de reprodução criadas",
|
||||||
"user_saved_playlists": "`x` listas de reprodução salvas",
|
"user_saved_playlists": "`x` listas de reprodução salvas",
|
||||||
"Video unavailable": "Vídeo indisponível",
|
"Video unavailable": "Vídeo indisponível",
|
||||||
"videoinfo_started_streaming_x_ago": "Iniciou a transmissão a `x`"
|
"videoinfo_started_streaming_x_ago": "Iniciou a transmissão a `x`",
|
||||||
|
"search_filters_title": "Filtro",
|
||||||
|
"preferences_watch_history_label": "Ative o histórico de exibição: ",
|
||||||
|
"search_message_no_results": "Nenhum resultado encontrado.",
|
||||||
|
"search_message_change_filters_or_query": "Tente ampliar sua consulta de pesquisa e/ou alterar os filtros.",
|
||||||
|
"English (United Kingdom)": "Inglês (Reino Unido)",
|
||||||
|
"English (United States)": "Inglês (Estados Unidos)",
|
||||||
|
"German (auto-generated)": "Alemão (gerado automaticamente)",
|
||||||
|
"Chinese": "Chinês",
|
||||||
|
"Chinese (China)": "Chinês (China)",
|
||||||
|
"Cantonese (Hong Kong)": "Cantonês (Hong Kong)",
|
||||||
|
"Interlingue": "Interlíngua",
|
||||||
|
"search_filters_type_option_all": "Qualquer tipo",
|
||||||
|
"search_filters_apply_button": "Aplicar filtros selecionados",
|
||||||
|
"Chinese (Hong Kong)": "Chinês (Hong Kong)",
|
||||||
|
"Chinese (Taiwan)": "Chinês (Taiwan)",
|
||||||
|
"Japanese (auto-generated)": "Japonês (gerado automaticamente)",
|
||||||
|
"Korean (auto-generated)": "Coreano (gerado automaticamente)",
|
||||||
|
"Portuguese (auto-generated)": "Português (gerado automaticamente)",
|
||||||
|
"Portuguese (Brazil)": "Português (Brasil)",
|
||||||
|
"Russian (auto-generated)": "Russo (gerado automaticamente)",
|
||||||
|
"Vietnamese (auto-generated)": "Vietnamita (gerado automaticamente)",
|
||||||
|
"search_filters_date_label": "Data de upload",
|
||||||
|
"search_filters_date_option_none": "Qualquer data",
|
||||||
|
"Dutch (auto-generated)": "Holandês (gerado automaticamente)",
|
||||||
|
"French (auto-generated)": "Francês (gerado automaticamente)",
|
||||||
|
"Indonesian (auto-generated)": "Indonésio (gerado automaticamente)",
|
||||||
|
"Italian (auto-generated)": "Italiano (gerado automaticamente)",
|
||||||
|
"Spanish (auto-generated)": "Espanhol (gerado automaticamente)",
|
||||||
|
"Spanish (Mexico)": "Espanhol (México)",
|
||||||
|
"search_filters_duration_option_none": "Qualquer duração",
|
||||||
|
"search_message_use_another_instance": " Você também pode <a href=\"`x`\">pesquisar em outra instância</a>.",
|
||||||
|
"Spanish (Spain)": "Espanhol (Espanha)",
|
||||||
|
"Turkish (auto-generated)": "Turco (gerado automaticamente)",
|
||||||
|
"search_filters_duration_option_medium": "Médio (4 - 20 minutos)",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"Popular enabled: ": "Popular habilitado: "
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,15 +21,15 @@
|
|||||||
"No": "Não",
|
"No": "Não",
|
||||||
"Import and Export Data": "Importar e exportar dados",
|
"Import and Export Data": "Importar e exportar dados",
|
||||||
"Import": "Importar",
|
"Import": "Importar",
|
||||||
"Import Invidious data": "Importar dados do Invidious",
|
"Import Invidious data": "Importar dados JSON do Invidious",
|
||||||
"Import YouTube subscriptions": "Importar subscrições do YouTube",
|
"Import YouTube subscriptions": "Importar subscrições OPML ou do YouTube",
|
||||||
"Import FreeTube subscriptions (.db)": "Importar subscrições do FreeTube (.db)",
|
"Import FreeTube subscriptions (.db)": "Importar subscrições do FreeTube (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "Importar subscrições do NewPipe (.json)",
|
"Import NewPipe subscriptions (.json)": "Importar subscrições do NewPipe (.json)",
|
||||||
"Import NewPipe data (.zip)": "Importar dados do NewPipe (.zip)",
|
"Import NewPipe data (.zip)": "Importar dados do NewPipe (.zip)",
|
||||||
"Export": "Exportar",
|
"Export": "Exportar",
|
||||||
"Export subscriptions as OPML": "Exportar subscrições como OPML",
|
"Export subscriptions as OPML": "Exportar subscrições como OPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportar subscrições como OPML (para NewPipe e FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportar subscrições como OPML (para NewPipe e FreeTube)",
|
||||||
"Export data as JSON": "Exportar dados como JSON",
|
"Export data as JSON": "Exportar dados do Invidious como JSON",
|
||||||
"Delete account?": "Eliminar conta?",
|
"Delete account?": "Eliminar conta?",
|
||||||
"History": "Histórico",
|
"History": "Histórico",
|
||||||
"An alternative front-end to YouTube": "Uma interface alternativa ao YouTube",
|
"An alternative front-end to YouTube": "Uma interface alternativa ao YouTube",
|
||||||
@@ -60,13 +60,13 @@
|
|||||||
"preferences_volume_label": "Volume da reprodução: ",
|
"preferences_volume_label": "Volume da reprodução: ",
|
||||||
"preferences_comments_label": "Preferência dos comentários: ",
|
"preferences_comments_label": "Preferência dos comentários: ",
|
||||||
"youtube": "YouTube",
|
"youtube": "YouTube",
|
||||||
"reddit": "reddit",
|
"reddit": "Reddit",
|
||||||
"preferences_captions_label": "Legendas predefinidas: ",
|
"preferences_captions_label": "Legendas predefinidas: ",
|
||||||
"Fallback captions: ": "Legendas alternativas: ",
|
"Fallback captions: ": "Legendas alternativas: ",
|
||||||
"preferences_related_videos_label": "Mostrar vídeos relacionados: ",
|
"preferences_related_videos_label": "Mostrar vídeos relacionados: ",
|
||||||
"preferences_annotations_label": "Mostrar anotações sempre: ",
|
"preferences_annotations_label": "Mostrar anotações sempre: ",
|
||||||
"preferences_extend_desc_label": "Estender automaticamente a descrição do vídeo: ",
|
"preferences_extend_desc_label": "Estender automaticamente a descrição do vídeo: ",
|
||||||
"preferences_vr_mode_label": "Vídeos interativos de 360 graus: ",
|
"preferences_vr_mode_label": "Vídeos interativos de 360 graus (necessita de WebGL): ",
|
||||||
"preferences_category_visual": "Preferências visuais",
|
"preferences_category_visual": "Preferências visuais",
|
||||||
"preferences_player_style_label": "Estilo do reprodutor: ",
|
"preferences_player_style_label": "Estilo do reprodutor: ",
|
||||||
"Dark mode: ": "Modo escuro: ",
|
"Dark mode: ": "Modo escuro: ",
|
||||||
@@ -123,7 +123,7 @@
|
|||||||
"Subscriptions": "Subscrições",
|
"Subscriptions": "Subscrições",
|
||||||
"search": "pesquisar",
|
"search": "pesquisar",
|
||||||
"Log out": "Terminar sessão",
|
"Log out": "Terminar sessão",
|
||||||
"Released under the AGPLv3 on Github.": "Lançado sob a AGPLv3 no Github.",
|
"Released under the AGPLv3 on Github.": "Lançado sob a AGPLv3 no GitHub.",
|
||||||
"Source available here.": "Código-fonte disponível aqui.",
|
"Source available here.": "Código-fonte disponível aqui.",
|
||||||
"View JavaScript license information.": "Ver informações da licença do JavaScript.",
|
"View JavaScript license information.": "Ver informações da licença do JavaScript.",
|
||||||
"View privacy policy.": "Ver a política de privacidade.",
|
"View privacy policy.": "Ver a política de privacidade.",
|
||||||
@@ -143,7 +143,6 @@
|
|||||||
"Show less": "Mostrar menos",
|
"Show less": "Mostrar menos",
|
||||||
"Watch on YouTube": "Ver no YouTube",
|
"Watch on YouTube": "Ver no YouTube",
|
||||||
"Switch Invidious Instance": "Mudar a instância do Invidious",
|
"Switch Invidious Instance": "Mudar a instância do Invidious",
|
||||||
"Broken? Try another Invidious Instance": "Falhou? Tente outra Instância do Invidious",
|
|
||||||
"Hide annotations": "Ocultar anotações",
|
"Hide annotations": "Ocultar anotações",
|
||||||
"Show annotations": "Mostrar anotações",
|
"Show annotations": "Mostrar anotações",
|
||||||
"Genre: ": "Género: ",
|
"Genre: ": "Género: ",
|
||||||
@@ -345,35 +344,123 @@
|
|||||||
"Videos": "Vídeos",
|
"Videos": "Vídeos",
|
||||||
"Playlists": "Listas de reprodução",
|
"Playlists": "Listas de reprodução",
|
||||||
"Community": "Comunidade",
|
"Community": "Comunidade",
|
||||||
"relevance": "Relevância",
|
"search_filters_sort_option_relevance": "Relevância",
|
||||||
"rating": "Avaliação",
|
"search_filters_sort_option_rating": "Avaliação",
|
||||||
"date": "Data de envio",
|
"search_filters_sort_option_date": "Data de envio",
|
||||||
"views": "Visualizações",
|
"search_filters_sort_option_views": "Visualizações",
|
||||||
"content_type": "Tipo",
|
"search_filters_type_label": "Tipo",
|
||||||
"duration": "Duração",
|
"search_filters_duration_label": "Duração",
|
||||||
"features": "Funcionalidades",
|
"search_filters_features_label": "Funcionalidades",
|
||||||
"sort": "Ordenar por",
|
"search_filters_sort_label": "Ordenar por",
|
||||||
"hour": "Última hora",
|
"search_filters_date_option_hour": "Última hora",
|
||||||
"today": "Hoje",
|
"search_filters_date_option_today": "Hoje",
|
||||||
"week": "Esta semana",
|
"search_filters_date_option_week": "Esta semana",
|
||||||
"month": "Este mês",
|
"search_filters_date_option_month": "Este mês",
|
||||||
"year": "Este ano",
|
"search_filters_date_option_year": "Este ano",
|
||||||
"video": "Vídeo",
|
"search_filters_type_option_video": "Vídeo",
|
||||||
"channel": "Canal",
|
"search_filters_type_option_channel": "Canal",
|
||||||
"playlist": "Lista de reprodução",
|
"search_filters_type_option_playlist": "Lista de reprodução",
|
||||||
"movie": "Filme",
|
"search_filters_type_option_movie": "Filme",
|
||||||
"show": "Espetáculo",
|
"search_filters_type_option_show": "Espetáculo",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "Legendas",
|
"search_filters_features_option_subtitles": "Legendas",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "Em direto",
|
"search_filters_features_option_live": "Em direto",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "Localização",
|
"search_filters_features_option_location": "Localização",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "Filtro",
|
|
||||||
"Current version: ": "Versão atual: ",
|
"Current version: ": "Versão atual: ",
|
||||||
"next_steps_error_message": "Pode tentar as seguintes opções: ",
|
"next_steps_error_message": "Pode tentar as seguintes opções: ",
|
||||||
"next_steps_error_message_refresh": "Atualizar",
|
"next_steps_error_message_refresh": "Atualizar",
|
||||||
"next_steps_error_message_go_to_youtube": "Ir ao YouTube"
|
"next_steps_error_message_go_to_youtube": "Ir ao YouTube",
|
||||||
|
"search_filters_title": "Filtro",
|
||||||
|
"generic_videos_count": "{{count}} vídeo",
|
||||||
|
"generic_videos_count_plural": "{{count}} vídeos",
|
||||||
|
"generic_playlists_count": "{{count}} lista de reprodução",
|
||||||
|
"generic_playlists_count_plural": "{{count}} listas de reprodução",
|
||||||
|
"generic_subscriptions_count": "{{count}} subscrição",
|
||||||
|
"generic_subscriptions_count_plural": "{{count}} subscrições",
|
||||||
|
"generic_views_count": "{{count}} visualização",
|
||||||
|
"generic_views_count_plural": "{{count}} visualizações",
|
||||||
|
"generic_subscribers_count": "{{count}} subscritor",
|
||||||
|
"generic_subscribers_count_plural": "{{count}} subscritores",
|
||||||
|
"preferences_quality_dash_option_4320p": "4320p",
|
||||||
|
"preferences_quality_dash_label": "Qualidade de vídeo DASH preferencial ",
|
||||||
|
"preferences_quality_dash_option_2160p": "2160p",
|
||||||
|
"subscriptions_unseen_notifs_count": "{{count}} notificação por ver",
|
||||||
|
"subscriptions_unseen_notifs_count_plural": "{{count}} notificações por ver",
|
||||||
|
"Popular enabled: ": "Página \"Popular\" ativada: ",
|
||||||
|
"search_message_no_results": "Nenhum resultado encontrado.",
|
||||||
|
"preferences_quality_dash_option_auto": "Automática",
|
||||||
|
"preferences_region_label": "País para o conteúdo: ",
|
||||||
|
"preferences_quality_dash_option_1440p": "1440p",
|
||||||
|
"preferences_quality_dash_option_720p": "720p",
|
||||||
|
"preferences_watch_history_label": "Ativar histórico de visualizações ",
|
||||||
|
"preferences_quality_dash_option_best": "Melhor",
|
||||||
|
"preferences_quality_dash_option_worst": "Pior",
|
||||||
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
|
"invidious": "Invidious",
|
||||||
|
"preferences_quality_option_hd720": "HD720",
|
||||||
|
"preferences_quality_option_dash": "DASH (qualidade adaptativa)",
|
||||||
|
"preferences_quality_option_medium": "Média",
|
||||||
|
"preferences_quality_option_small": "Pequena",
|
||||||
|
"preferences_quality_dash_option_1080p": "1080p",
|
||||||
|
"preferences_quality_dash_option_480p": "480p",
|
||||||
|
"preferences_quality_dash_option_360p": "360p",
|
||||||
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
|
"Video unavailable": "Vídeo indisponível",
|
||||||
|
"Russian (auto-generated)": "Russo (geradas automaticamente)",
|
||||||
|
"comments_view_x_replies": "Ver {{count}} resposta",
|
||||||
|
"comments_view_x_replies_plural": "Ver {{count}} respostas",
|
||||||
|
"comments_points_count": "{{count}} ponto",
|
||||||
|
"comments_points_count_plural": "{{count}} pontos",
|
||||||
|
"English (United Kingdom)": "Inglês (Reino Unido)",
|
||||||
|
"Chinese (Hong Kong)": "Chinês (Hong Kong)",
|
||||||
|
"Chinese (Taiwan)": "Chinês (Taiwan)",
|
||||||
|
"Dutch (auto-generated)": "Holandês (geradas automaticamente)",
|
||||||
|
"French (auto-generated)": "Francês (geradas automaticamente)",
|
||||||
|
"German (auto-generated)": "Alemão (geradas automaticamente)",
|
||||||
|
"Indonesian (auto-generated)": "Indonésio (geradas automaticamente)",
|
||||||
|
"Interlingue": "Interlingue",
|
||||||
|
"Italian (auto-generated)": "Italiano (geradas automaticamente)",
|
||||||
|
"Japanese (auto-generated)": "Japonês (geradas automaticamente)",
|
||||||
|
"Korean (auto-generated)": "Coreano (geradas automaticamente)",
|
||||||
|
"Portuguese (auto-generated)": "Português (geradas automaticamente)",
|
||||||
|
"Portuguese (Brazil)": "Português (Brasil)",
|
||||||
|
"Spanish (Spain)": "Espanhol (Espanha)",
|
||||||
|
"Vietnamese (auto-generated)": "Vietnamita (geradas automaticamente)",
|
||||||
|
"search_filters_type_option_all": "Qualquer tipo",
|
||||||
|
"search_filters_duration_option_none": "Qualquer duração",
|
||||||
|
"search_filters_duration_option_short": "Curto (< 4 minutos)",
|
||||||
|
"search_filters_duration_option_medium": "Médio (4 - 20 minutos)",
|
||||||
|
"search_filters_duration_option_long": "Longo (> 20 minutos)",
|
||||||
|
"search_filters_features_option_purchased": "Comprado",
|
||||||
|
"search_filters_apply_button": "Aplicar filtros selecionados",
|
||||||
|
"videoinfo_watch_on_youTube": "Ver no YouTube",
|
||||||
|
"videoinfo_youTube_embed_link": "Embutir",
|
||||||
|
"adminprefs_modified_source_code_url_label": "URL do repositório do código-fonte modificado",
|
||||||
|
"videoinfo_invidious_embed_link": "Ligação embutida",
|
||||||
|
"none": "nenhum",
|
||||||
|
"videoinfo_started_streaming_x_ago": "Entrou em direto há `x`",
|
||||||
|
"download_subtitles": "Legendas - `x` (.vtt)",
|
||||||
|
"user_created_playlists": "`x` listas de reprodução criadas",
|
||||||
|
"user_saved_playlists": "`x` listas de reprodução guardadas",
|
||||||
|
"preferences_save_player_pos_label": "Guardar posição de reprodução: ",
|
||||||
|
"Turkish (auto-generated)": "Turco (geradas automaticamente)",
|
||||||
|
"Cantonese (Hong Kong)": "Cantonês (Hong Kong)",
|
||||||
|
"Chinese (China)": "Chinês (China)",
|
||||||
|
"Spanish (auto-generated)": "Espanhol (geradas automaticamente)",
|
||||||
|
"Spanish (Mexico)": "Espanhol (México)",
|
||||||
|
"English (United States)": "Inglês (Estados Unidos)",
|
||||||
|
"footer_donate_page": "Doar",
|
||||||
|
"footer_documentation": "Documentação",
|
||||||
|
"footer_source_code": "Código-fonte",
|
||||||
|
"footer_original_source_code": "Código-fonte original",
|
||||||
|
"footer_modfied_source_code": "Código-fonte modificado",
|
||||||
|
"Chinese": "Chinês",
|
||||||
|
"search_filters_date_label": "Data de carregamento",
|
||||||
|
"search_filters_date_option_none": "Qualquer data",
|
||||||
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
|
"search_filters_features_option_vr180": "VR180"
|
||||||
}
|
}
|
||||||
|
|||||||
114
locales/pt.json
114
locales/pt.json
@@ -1,44 +1,42 @@
|
|||||||
{
|
{
|
||||||
"show": "Espetáculo",
|
"search_filters_type_option_show": "Espetáculo",
|
||||||
"views": "Visualizações",
|
"search_filters_sort_option_views": "Visualizações",
|
||||||
"date": "Data de envio",
|
"search_filters_sort_option_date": "Data de envio",
|
||||||
"rating": "Avaliação",
|
"search_filters_sort_option_rating": "Avaliação",
|
||||||
"relevance": "Relevância",
|
"search_filters_sort_option_relevance": "Relevância",
|
||||||
"Broken? Try another Invidious Instance": "Falhou? Tente outra Instância do Invidious",
|
|
||||||
"Switch Invidious Instance": "Mudar a instância do Invidious",
|
"Switch Invidious Instance": "Mudar a instância do Invidious",
|
||||||
"Show less": "Mostrar menos",
|
"Show less": "Mostrar menos",
|
||||||
"Show more": "Mostrar mais",
|
"Show more": "Mostrar mais",
|
||||||
"Released under the AGPLv3 on Github.": "Lançado sob a AGPLv3 no Github.",
|
"Released under the AGPLv3 on Github.": "Lançado sob a AGPLv3 no GitHub.",
|
||||||
"preferences_show_nick_label": "Mostrar nome de utilizador em cima: ",
|
"preferences_show_nick_label": "Mostrar nome de utilizador em cima: ",
|
||||||
"preferences_automatic_instance_redirect_label": "Redirecionamento de instância automática (solução de último recurso para redirect.invidious.io): ",
|
"preferences_automatic_instance_redirect_label": "Redirecionamento de instância automática (solução de último recurso para redirect.invidious.io): ",
|
||||||
"preferences_category_misc": "Preferências diversas",
|
"preferences_category_misc": "Preferências diversas",
|
||||||
"preferences_vr_mode_label": "Vídeos interativos de 360 graus: ",
|
"preferences_vr_mode_label": "Vídeos interativos de 360 graus (necessita de WebGL): ",
|
||||||
"preferences_extend_desc_label": "Estender automaticamente a descrição do vídeo: ",
|
"preferences_extend_desc_label": "Estender automaticamente a descrição do vídeo: ",
|
||||||
"next_steps_error_message_go_to_youtube": "Ir ao YouTube",
|
"next_steps_error_message_go_to_youtube": "Ir ao YouTube",
|
||||||
"next_steps_error_message": "Pode tentar as seguintes opções: ",
|
"next_steps_error_message": "Pode tentar as seguintes opções: ",
|
||||||
"next_steps_error_message_refresh": "Atualizar",
|
"next_steps_error_message_refresh": "Atualizar",
|
||||||
"filter": "Filtro",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_location": "Localização",
|
||||||
"location": "Localização",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"4k": "4K",
|
"search_filters_features_option_live": "Em direto",
|
||||||
"live": "Em direto",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"3d": "3D",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_subtitles": "Legendas",
|
||||||
"subtitles": "Legendas",
|
"search_filters_features_option_hd": "HD",
|
||||||
"hd": "HD",
|
"search_filters_type_option_movie": "Filme",
|
||||||
"movie": "Filme",
|
"search_filters_type_option_playlist": "Lista de reprodução",
|
||||||
"playlist": "Lista de reprodução",
|
"search_filters_type_option_channel": "Canal",
|
||||||
"channel": "Canal",
|
"search_filters_type_option_video": "Vídeo",
|
||||||
"video": "Vídeo",
|
"search_filters_date_option_year": "Este ano",
|
||||||
"year": "Este ano",
|
"search_filters_date_option_month": "Este mês",
|
||||||
"month": "Este mês",
|
"search_filters_date_option_week": "Esta semana",
|
||||||
"week": "Esta semana",
|
"search_filters_date_option_today": "Hoje",
|
||||||
"today": "Hoje",
|
"search_filters_date_option_hour": "Última hora",
|
||||||
"hour": "Última hora",
|
"search_filters_sort_label": "Ordenar por",
|
||||||
"sort": "Ordenar por",
|
"search_filters_features_label": "Funcionalidades",
|
||||||
"features": "Funcionalidades",
|
"search_filters_duration_label": "Duração",
|
||||||
"duration": "Duração",
|
"search_filters_type_label": "Tipo",
|
||||||
"content_type": "Tipo",
|
|
||||||
"permalink": "hiperligação permanente",
|
"permalink": "hiperligação permanente",
|
||||||
"YouTube comment permalink": "Hiperligação permanente do comentário no YouTube",
|
"YouTube comment permalink": "Hiperligação permanente do comentário no YouTube",
|
||||||
"Download as: ": "Descarregar como: ",
|
"Download as: ": "Descarregar como: ",
|
||||||
@@ -248,15 +246,15 @@
|
|||||||
"JavaScript license information": "Informação de licença do JavaScript",
|
"JavaScript license information": "Informação de licença do JavaScript",
|
||||||
"An alternative front-end to YouTube": "Uma interface alternativa ao YouTube",
|
"An alternative front-end to YouTube": "Uma interface alternativa ao YouTube",
|
||||||
"History": "Histórico",
|
"History": "Histórico",
|
||||||
"Export data as JSON": "Exportar dados como JSON",
|
"Export data as JSON": "Exportar dados Invidious como JSON",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportar subscrições como OPML (para NewPipe e FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportar subscrições como OPML (para NewPipe e FreeTube)",
|
||||||
"Export subscriptions as OPML": "Exportar subscrições como OPML",
|
"Export subscriptions as OPML": "Exportar subscrições como OPML",
|
||||||
"Export": "Exportar",
|
"Export": "Exportar",
|
||||||
"Import NewPipe data (.zip)": "Importar dados do NewPipe (.zip)",
|
"Import NewPipe data (.zip)": "Importar dados do NewPipe (.zip)",
|
||||||
"Import NewPipe subscriptions (.json)": "Importar subscrições do NewPipe (.json)",
|
"Import NewPipe subscriptions (.json)": "Importar subscrições do NewPipe (.json)",
|
||||||
"Import FreeTube subscriptions (.db)": "Importar subscrições do FreeTube (.db)",
|
"Import FreeTube subscriptions (.db)": "Importar subscrições do FreeTube (.db)",
|
||||||
"Import YouTube subscriptions": "Importar subscrições do YouTube",
|
"Import YouTube subscriptions": "Importar subscrições do YouTube/OPML",
|
||||||
"Import Invidious data": "Importar dados do Invidious",
|
"Import Invidious data": "Importar dados JSON do Invidious",
|
||||||
"Import": "Importar",
|
"Import": "Importar",
|
||||||
"No": "Não",
|
"No": "Não",
|
||||||
"Yes": "Sim",
|
"Yes": "Sim",
|
||||||
@@ -376,8 +374,8 @@
|
|||||||
"Unsubscribe": "Anular subscrição",
|
"Unsubscribe": "Anular subscrição",
|
||||||
"Shared `x` ago": "Partilhado `x` atrás",
|
"Shared `x` ago": "Partilhado `x` atrás",
|
||||||
"LIVE": "Em direto",
|
"LIVE": "Em direto",
|
||||||
"short": "Curto (< 4 minutos)",
|
"search_filters_duration_option_short": "Curto (< 4 minutos)",
|
||||||
"long": "Longo (> 20 minutos)",
|
"search_filters_duration_option_long": "Longo (> 20 minutos)",
|
||||||
"footer_source_code": "Código-fonte",
|
"footer_source_code": "Código-fonte",
|
||||||
"footer_original_source_code": "Código-fonte original",
|
"footer_original_source_code": "Código-fonte original",
|
||||||
"adminprefs_modified_source_code_url_label": "URL do repositório do código-fonte alterado",
|
"adminprefs_modified_source_code_url_label": "URL do repositório do código-fonte alterado",
|
||||||
@@ -397,8 +395,8 @@
|
|||||||
"preferences_quality_dash_option_360p": "360p",
|
"preferences_quality_dash_option_360p": "360p",
|
||||||
"preferences_quality_dash_option_240p": "240p",
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
"preferences_quality_dash_option_144p": "144p",
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
"purchased": "Comprado",
|
"search_filters_features_option_purchased": "Comprado",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"videoinfo_invidious_embed_link": "Incorporar hiperligação",
|
"videoinfo_invidious_embed_link": "Incorporar hiperligação",
|
||||||
"Video unavailable": "Vídeo não disponível",
|
"Video unavailable": "Vídeo não disponível",
|
||||||
"invidious": "Invidious",
|
"invidious": "Invidious",
|
||||||
@@ -434,8 +432,44 @@
|
|||||||
"crash_page_before_reporting": "Antes de reportar um erro, verifique se:",
|
"crash_page_before_reporting": "Antes de reportar um erro, verifique se:",
|
||||||
"crash_page_refresh": "tentou <a href=\"`x`\">recarregar a página</a>",
|
"crash_page_refresh": "tentou <a href=\"`x`\">recarregar a página</a>",
|
||||||
"crash_page_switch_instance": "tentou <a href=\"`x`\">usar outra instância</a>",
|
"crash_page_switch_instance": "tentou <a href=\"`x`\">usar outra instância</a>",
|
||||||
"crash_page_read_the_faq": "leu as <a href=\"`x`\">Perguntas frequentes (FAQ)</a>",
|
"crash_page_read_the_faq": "leia as <a href=\"`x`\">Perguntas frequentes (FAQ)</a>",
|
||||||
"crash_page_search_issue": "procurou se <a href=\"`x`\">o erro já foi reportado no Github</a>",
|
"crash_page_search_issue": "procurou se <a href=\"`x`\">o erro já foi reportado no GitHub</a>",
|
||||||
"crash_page_report_issue": "Se nenhuma opção acima ajudou, por favor <a href=\"`x`\">abra um novo problema no Github</a> (preferencialmente em inglês) e inclua o seguinte texto tal qual (NÃO o traduza):",
|
"crash_page_report_issue": "Se nenhuma opção acima ajudou, por favor <a href=\"`x`\">abra um novo problema no Github</a> (preferencialmente em inglês) e inclua o seguinte texto tal qual (NÃO o traduza):",
|
||||||
"user_created_playlists": "`x` listas de reprodução criadas"
|
"user_created_playlists": "`x` listas de reprodução criadas",
|
||||||
|
"search_filters_title": "Filtro",
|
||||||
|
"Chinese (Taiwan)": "Chinês (Taiwan)",
|
||||||
|
"search_message_no_results": "Nenhum resultado encontrado.",
|
||||||
|
"search_message_change_filters_or_query": "Tente alargar os termos genéricos da pesquisa e/ou alterar os filtros.",
|
||||||
|
"search_message_use_another_instance": " Também pode <a href=\"`x`\">pesquisar noutra instância</a>.",
|
||||||
|
"English (United Kingdom)": "Inglês (Reino Unido)",
|
||||||
|
"English (United States)": "Inglês (Estados Unidos)",
|
||||||
|
"Cantonese (Hong Kong)": "Cantonês (Hong Kong)",
|
||||||
|
"Chinese": "Chinês",
|
||||||
|
"Chinese (Hong Kong)": "Chinês (Hong Kong)",
|
||||||
|
"Dutch (auto-generated)": "Holandês (gerado automaticamente)",
|
||||||
|
"French (auto-generated)": "Francês (gerado automaticamente)",
|
||||||
|
"German (auto-generated)": "Alemão (gerado automaticamente)",
|
||||||
|
"Indonesian (auto-generated)": "Indonésio (gerado automaticamente)",
|
||||||
|
"Interlingue": "Interlíngua",
|
||||||
|
"Italian (auto-generated)": "Italiano (gerado automaticamente)",
|
||||||
|
"Japanese (auto-generated)": "Japonês (gerado automaticamente)",
|
||||||
|
"Korean (auto-generated)": "Coreano (gerado automaticamente)",
|
||||||
|
"Portuguese (auto-generated)": "Português (gerado automaticamente)",
|
||||||
|
"Portuguese (Brazil)": "Português (Brasil)",
|
||||||
|
"Turkish (auto-generated)": "Turco (gerado automaticamente)",
|
||||||
|
"Vietnamese (auto-generated)": "Vietnamita (gerado automaticamente)",
|
||||||
|
"search_filters_duration_option_medium": "Médio (4 - 20 minutos)",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_apply_button": "Aplicar filtros selecionados",
|
||||||
|
"Spanish (auto-generated)": "Espanhol (gerado automaticamente)",
|
||||||
|
"Spanish (Mexico)": "Espanhol (México)",
|
||||||
|
"preferences_watch_history_label": "Ativar histórico de reprodução: ",
|
||||||
|
"Chinese (China)": "Chinês (China)",
|
||||||
|
"Russian (auto-generated)": "Russo (gerado automaticamente)",
|
||||||
|
"Spanish (Spain)": "Espanhol (Espanha)",
|
||||||
|
"search_filters_date_label": "Data de publicação",
|
||||||
|
"search_filters_date_option_none": "Qualquer data",
|
||||||
|
"search_filters_type_option_all": "Qualquer tipo",
|
||||||
|
"search_filters_duration_option_none": "Qualquer duração",
|
||||||
|
"Popular enabled: ": "Página \"popular\" ativada: "
|
||||||
}
|
}
|
||||||
|
|||||||
182
locales/ro.json
182
locales/ro.json
@@ -21,7 +21,7 @@
|
|||||||
"No": "Nu",
|
"No": "Nu",
|
||||||
"Import and Export Data": "Importați și Exportați Datele",
|
"Import and Export Data": "Importați și Exportați Datele",
|
||||||
"Import": "Importați",
|
"Import": "Importați",
|
||||||
"Import Invidious data": "Importați Datele de pe Invidious",
|
"Import Invidious data": "Importați datele JSON de pe Invidious",
|
||||||
"Import YouTube subscriptions": "Importați abonamentele de pe YouTube",
|
"Import YouTube subscriptions": "Importați abonamentele de pe YouTube",
|
||||||
"Import FreeTube subscriptions (.db)": "Importați abonamentele de pe FreeTube (.db)",
|
"Import FreeTube subscriptions (.db)": "Importați abonamentele de pe FreeTube (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "Importați abonamentele de pe NewPipe (.json)",
|
"Import NewPipe subscriptions (.json)": "Importați abonamentele de pe NewPipe (.json)",
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
"Export": "Exportați",
|
"Export": "Exportați",
|
||||||
"Export subscriptions as OPML": "Exportați abonamentele în format OPML",
|
"Export subscriptions as OPML": "Exportați abonamentele în format OPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportați abonamentele în format OPML (pentru NewPipe și FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportați abonamentele în format OPML (pentru NewPipe și FreeTube)",
|
||||||
"Export data as JSON": "Exportați datele în format JSON",
|
"Export data as JSON": "Exportați datele Invidious în format JSON",
|
||||||
"Delete account?": "Sunteți siguri că doriți să vă ștergeți contul?",
|
"Delete account?": "Sunteți siguri că doriți să vă ștergeți contul?",
|
||||||
"History": "Istoric",
|
"History": "Istoric",
|
||||||
"An alternative front-end to YouTube": "O alternativă front-end pentru YouTube",
|
"An alternative front-end to YouTube": "O alternativă front-end pentru YouTube",
|
||||||
@@ -155,7 +155,7 @@
|
|||||||
"Hide replies": "Ascundeți replicile",
|
"Hide replies": "Ascundeți replicile",
|
||||||
"Show replies": "Afișați replicile",
|
"Show replies": "Afișați replicile",
|
||||||
"Incorrect password": "Parolă incorectă",
|
"Incorrect password": "Parolă incorectă",
|
||||||
"Quota exceeded, try again in a few hours": "Numărul de tentative de conectare a fost depășit. Va rugăm să încercați din nou în câteva ore.",
|
"Quota exceeded, try again in a few hours": "Numărul de tentative de conectare a fost depășit. Va rugăm să încercați din nou în câteva ore",
|
||||||
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Conectare eșuată. Dacă nu reușiți să vă conectați, verificați dacă ați activat autentificarea cu doi factori (Autentificator sau SMS).",
|
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Conectare eșuată. Dacă nu reușiți să vă conectați, verificați dacă ați activat autentificarea cu doi factori (Autentificator sau SMS).",
|
||||||
"Invalid TFA code": "Codul de autentificare cu doi factori este invalid",
|
"Invalid TFA code": "Codul de autentificare cu doi factori este invalid",
|
||||||
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Conectare eșuată. Acest lucru ar putea fi cauzat de faptul că nu ați activat autentificarea cu doi factori.",
|
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Conectare eșuată. Acest lucru ar putea fi cauzat de faptul că nu ați activat autentificarea cu doi factori.",
|
||||||
@@ -174,7 +174,7 @@
|
|||||||
"Deleted or invalid channel": "Canal șters sau invalid",
|
"Deleted or invalid channel": "Canal șters sau invalid",
|
||||||
"This channel does not exist.": "Acest canal nu există.",
|
"This channel does not exist.": "Acest canal nu există.",
|
||||||
"Could not get channel info.": "Nu am putut primi informații despre acest canal.",
|
"Could not get channel info.": "Nu am putut primi informații despre acest canal.",
|
||||||
"Could not fetch comments": "Încărcarea comentariilor a eșuat.",
|
"Could not fetch comments": "Încărcarea comentariilor a eșuat",
|
||||||
"`x` ago": "acum `x`",
|
"`x` ago": "acum `x`",
|
||||||
"Load more": "Vedeți mai mult",
|
"Load more": "Vedeți mai mult",
|
||||||
"Could not create mix.": "Nu am putut crea această listă de redare.",
|
"Could not create mix.": "Nu am putut crea această listă de redare.",
|
||||||
@@ -187,7 +187,7 @@
|
|||||||
"Erroneous challenge": "Challenge invalid",
|
"Erroneous challenge": "Challenge invalid",
|
||||||
"Erroneous token": "Token invalid",
|
"Erroneous token": "Token invalid",
|
||||||
"No such user": "Acest utilizator nu există",
|
"No such user": "Acest utilizator nu există",
|
||||||
"Token is expired, please try again": "Token-ul este expirat, vă rugăm să reîncercați.",
|
"Token is expired, please try again": "Jetonul a expirat, vă rugăm să încercați din nou",
|
||||||
"English": "Engleză",
|
"English": "Engleză",
|
||||||
"English (auto-generated)": "Engleză (generată automat)",
|
"English (auto-generated)": "Engleză (generată automat)",
|
||||||
"Afrikaans": "Afrikaans",
|
"Afrikaans": "Afrikaans",
|
||||||
@@ -295,7 +295,7 @@
|
|||||||
"Yoruba": "Yoruba",
|
"Yoruba": "Yoruba",
|
||||||
"Zulu": "Zoulou",
|
"Zulu": "Zoulou",
|
||||||
"Fallback comments: ": "Comentarii alternative: ",
|
"Fallback comments: ": "Comentarii alternative: ",
|
||||||
"Popular": "Popular",
|
"Popular": "Populare",
|
||||||
"Top": "Top",
|
"Top": "Top",
|
||||||
"About": "Despre",
|
"About": "Despre",
|
||||||
"Rating: ": "Evaluare: ",
|
"Rating: ": "Evaluare: ",
|
||||||
@@ -318,5 +318,173 @@
|
|||||||
"Videos": "Videoclipuri",
|
"Videos": "Videoclipuri",
|
||||||
"Playlists": "Liste de redare",
|
"Playlists": "Liste de redare",
|
||||||
"Community": "Comunitate",
|
"Community": "Comunitate",
|
||||||
"Current version: ": "Versiunea actuală: "
|
"Current version: ": "Versiunea actuală: ",
|
||||||
|
"crash_page_read_the_faq": "citit lista <a href=\"`x`\">Întrebărilor Frecvente (FAQ)</a>",
|
||||||
|
"generic_count_days_0": "{{count}} zi",
|
||||||
|
"generic_count_days_1": "{{count}} zile",
|
||||||
|
"generic_count_days_2": "{{count}} de zile",
|
||||||
|
"generic_count_hours_0": "{{count}} oră",
|
||||||
|
"generic_count_hours_1": "{{count}} ore",
|
||||||
|
"generic_count_hours_2": "{{count}} de ore",
|
||||||
|
"generic_count_minutes_0": "{{count}} minut",
|
||||||
|
"generic_count_minutes_1": "{{count}} minute",
|
||||||
|
"generic_count_minutes_2": "{{count}} de minute",
|
||||||
|
"generic_views_count_0": "{{count}} vizionare",
|
||||||
|
"generic_views_count_1": "{{count}} vizionări",
|
||||||
|
"generic_views_count_2": "{{count}} de vizionări",
|
||||||
|
"subscriptions_unseen_notifs_count_0": "{{count}} notificare neverificată",
|
||||||
|
"subscriptions_unseen_notifs_count_1": "{{count}} notificări neverificate",
|
||||||
|
"subscriptions_unseen_notifs_count_2": "{{count}} de notificări neverificate",
|
||||||
|
"crash_page_refresh": "încercat să <a href=\"`x`\">reîmprospătați pagina</a>",
|
||||||
|
"crash_page_switch_instance": "am încercat să <a href=\"`x`\">folosim o altă instanță</a>",
|
||||||
|
"preferences_watch_history_label": "Activează istoricul: ",
|
||||||
|
"invidious": "Invidious",
|
||||||
|
"preferences_vr_mode_label": "Videoclipuri interactive de 360 de grade (necesită WebGL): ",
|
||||||
|
"English (United Kingdom)": "Engleză (Regatul Unit)",
|
||||||
|
"English (United States)": "Engleză (Statele Unite ale Americii)",
|
||||||
|
"Chinese": "Chineză",
|
||||||
|
"Chinese (China)": "Chineză (China)",
|
||||||
|
"Chinese (Hong Kong)": "Chineză (Hong Kong)",
|
||||||
|
"Chinese (Taiwan)": "Chineză (Taiwan)",
|
||||||
|
"Cantonese (Hong Kong)": "Cantoneză (Hong Kong)",
|
||||||
|
"Portuguese (auto-generated)": "Portugheză (generată automat)",
|
||||||
|
"Portuguese (Brazil)": "Portugheză (Brazilia)",
|
||||||
|
"Russian (auto-generated)": "Rusă (generată automat)",
|
||||||
|
"Turkish (auto-generated)": "Turcă (generată automat)",
|
||||||
|
"Vietnamese (auto-generated)": "Vietnameză (generată automat)",
|
||||||
|
"videoinfo_started_streaming_x_ago": "În direct de acum `x`",
|
||||||
|
"preferences_quality_dash_option_2160p": "2160p",
|
||||||
|
"footer_modfied_source_code": "Codul sursă modificat",
|
||||||
|
"preferences_quality_dash_label": "Calitatea video DASH preferată: ",
|
||||||
|
"generic_videos_count_0": "{{count}} videoclip",
|
||||||
|
"generic_videos_count_1": "{{count}} videoclipuri",
|
||||||
|
"generic_videos_count_2": "{{count}} de videoclipuri",
|
||||||
|
"generic_playlists_count_0": "{{count}} playlist",
|
||||||
|
"generic_playlists_count_1": "{{count}} playlisturi",
|
||||||
|
"generic_playlists_count_2": "{{count}} de playlisturi",
|
||||||
|
"tokens_count_0": "{{count}} jeton",
|
||||||
|
"tokens_count_1": "{{count}} jetoane",
|
||||||
|
"tokens_count_2": "{{count}} de jetoane",
|
||||||
|
"comments_points_count_0": "{{count}} punct",
|
||||||
|
"comments_points_count_1": "{{count}} puncte",
|
||||||
|
"comments_points_count_2": "{{count}} de puncte",
|
||||||
|
"Spanish (Spain)": "Spaniolă (Spania)",
|
||||||
|
"Video unavailable": "Videoclip indisponibil",
|
||||||
|
"crash_page_search_issue": "căutat <a href=\"`x`\">sugestiile existente pe GitHub</a>",
|
||||||
|
"Show more": "Afișați mai mult",
|
||||||
|
"Released under the AGPLv3 on Github.": "Lansat sub licența AGPLv3 pe GitHub.",
|
||||||
|
"preferences_quality_option_dash": "DASH (calitate adaptativă)",
|
||||||
|
"preferences_quality_option_hd720": "HD720",
|
||||||
|
"preferences_quality_option_small": "Mică",
|
||||||
|
"preferences_quality_dash_option_1440p": "1440p",
|
||||||
|
"preferences_quality_dash_option_1080p": "1080p",
|
||||||
|
"preferences_category_misc": "Setări diverse",
|
||||||
|
"preferences_automatic_instance_redirect_label": "Redirecționare automată de instanță (trecere prin redirect.invidious.io): ",
|
||||||
|
"preferences_quality_dash_option_480p": "480p",
|
||||||
|
"preferences_quality_option_medium": "Medie",
|
||||||
|
"Switch Invidious Instance": "Schimbă instanța Invidious",
|
||||||
|
"preferences_quality_dash_option_720p": "720p",
|
||||||
|
"preferences_quality_dash_option_auto": "Automatică",
|
||||||
|
"preferences_quality_dash_option_best": "Cea mai bună",
|
||||||
|
"preferences_quality_dash_option_worst": "Cea mai redusă",
|
||||||
|
"preferences_quality_dash_option_4320p": "4320p",
|
||||||
|
"preferences_quality_dash_option_360p": "360p",
|
||||||
|
"preferences_region_label": "Țară de conținut: ",
|
||||||
|
"preferences_extend_desc_label": "Extindeți automat descrierea: ",
|
||||||
|
"preferences_show_nick_label": "Afișați numele de utilizator pe partea de sus: ",
|
||||||
|
"generic_subscribers_count_0": "{{count}} abonat",
|
||||||
|
"generic_subscribers_count_1": "{{count}} abonați",
|
||||||
|
"generic_subscribers_count_2": "{{count}} de abonați",
|
||||||
|
"generic_subscriptions_count_0": "{{count}} abonament",
|
||||||
|
"generic_subscriptions_count_1": "{{count}} abonamente",
|
||||||
|
"generic_subscriptions_count_2": "{{count}} de abonamente",
|
||||||
|
"Search": "Căutați",
|
||||||
|
"search_filters_title": "Filtre",
|
||||||
|
"search_filters_date_label": "Data încărcării",
|
||||||
|
"none": "niciunul",
|
||||||
|
"search_message_use_another_instance": " Puteți <a href=\"`x`\">căuta într-o altă instanță</a>.",
|
||||||
|
"comments_view_x_replies_0": "Afișați {{count}} răspuns",
|
||||||
|
"comments_view_x_replies_1": "Afișați {{count}} răspunsuri",
|
||||||
|
"comments_view_x_replies_2": "Afișați {{count}} de răspunsuri",
|
||||||
|
"search_message_no_results": "Nu s-au găsit rezultate.",
|
||||||
|
"Dutch (auto-generated)": "Olandeză (generată automat)",
|
||||||
|
"Indonesian (auto-generated)": "Indoneziană (generată automat)",
|
||||||
|
"German (auto-generated)": "Germană (generată automat)",
|
||||||
|
"French (auto-generated)": "Franceză (generată automat)",
|
||||||
|
"Interlingue": "Interlingue",
|
||||||
|
"Italian (auto-generated)": "Italiană (generată automat)",
|
||||||
|
"Japanese (auto-generated)": "Japoneză (generată automat)",
|
||||||
|
"Korean (auto-generated)": "Coreeană (generată automat)",
|
||||||
|
"Spanish (auto-generated)": "Spaniolă (generată automat)",
|
||||||
|
"search_filters_date_option_none": "Oricând",
|
||||||
|
"search_filters_date_option_year": "an",
|
||||||
|
"search_filters_type_option_channel": "canal",
|
||||||
|
"Spanish (Mexico)": "Spaniolă (Mexic)",
|
||||||
|
"generic_count_weeks_0": "{{count}} săptămână",
|
||||||
|
"generic_count_weeks_1": "{{count}} săptămâni",
|
||||||
|
"generic_count_weeks_2": "{{count}} de săptămâni",
|
||||||
|
"generic_count_seconds_0": "{{count}} secundă",
|
||||||
|
"generic_count_seconds_1": "{{count}} secunde",
|
||||||
|
"generic_count_seconds_2": "{{count}} de secunde",
|
||||||
|
"search_filters_type_option_video": "videoclip",
|
||||||
|
"generic_count_years_0": "{{count}} an",
|
||||||
|
"generic_count_years_1": "{{count}} ani",
|
||||||
|
"generic_count_years_2": "{{count}} de ani",
|
||||||
|
"generic_count_months_0": "{{count}} lună",
|
||||||
|
"generic_count_months_1": "{{count}} luni",
|
||||||
|
"generic_count_months_2": "{{count}} de luni",
|
||||||
|
"search_filters_duration_label": "durată",
|
||||||
|
"search_filters_date_option_month": "lună",
|
||||||
|
"search_filters_type_label": "Tip",
|
||||||
|
"search_filters_date_option_today": "azi",
|
||||||
|
"search_filters_date_option_week": "săptămână",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_type_option_playlist": "playlist",
|
||||||
|
"search_filters_type_option_movie": "film",
|
||||||
|
"search_filters_type_option_show": "emisiune",
|
||||||
|
"search_filters_duration_option_short": "Scurt (< 4 minute)",
|
||||||
|
"search_filters_duration_option_medium": "Medie (4 - 20 de minute)",
|
||||||
|
"search_filters_duration_option_none": "Fără limită",
|
||||||
|
"search_filters_duration_option_long": "Lungă (> 20 de minute)",
|
||||||
|
"search_filters_features_label": "atribute",
|
||||||
|
"search_filters_features_option_live": "în direct",
|
||||||
|
"search_filters_features_option_four_k": "4K",
|
||||||
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
|
"search_filters_features_option_three_d": "3D",
|
||||||
|
"search_filters_features_option_subtitles": "subtitrări/CC",
|
||||||
|
"search_filters_features_option_hd": "HD",
|
||||||
|
"search_filters_features_option_hdr": "HDR",
|
||||||
|
"search_filters_features_option_purchased": "Cumpărate",
|
||||||
|
"next_steps_error_message": "După ce ar trebui să încercați să: ",
|
||||||
|
"user_saved_playlists": "`x` playlisturi salvate",
|
||||||
|
"search_filters_features_option_location": "locație",
|
||||||
|
"search_filters_sort_label": "Sortați după",
|
||||||
|
"search_filters_sort_option_relevance": "relevanță",
|
||||||
|
"search_filters_sort_option_rating": "clasificare",
|
||||||
|
"search_filters_sort_option_date": "Data încărcării",
|
||||||
|
"search_filters_sort_option_views": "Numărul de vizionări",
|
||||||
|
"footer_source_code": "Codul sursă",
|
||||||
|
"search_filters_apply_button": "Aplicați filtrele selectate",
|
||||||
|
"footer_original_source_code": "Codul sursă original",
|
||||||
|
"next_steps_error_message_refresh": "Reîmprospătează",
|
||||||
|
"next_steps_error_message_go_to_youtube": "Mergeți pe YouTube",
|
||||||
|
"footer_donate_page": "Donați",
|
||||||
|
"adminprefs_modified_source_code_url_label": "URL către depozitul de cod sursă modificat",
|
||||||
|
"footer_documentation": "Documentație",
|
||||||
|
"videoinfo_youTube_embed_link": "Încorporați",
|
||||||
|
"videoinfo_watch_on_youTube": "Vizionați pe YouTube",
|
||||||
|
"videoinfo_invidious_embed_link": "Link de încorporare",
|
||||||
|
"download_subtitles": "Subtitrări - `x` (.vtt)",
|
||||||
|
"user_created_playlists": "`x` playlisturi create",
|
||||||
|
"preferences_save_player_pos_label": "Salvați poziția de redare: ",
|
||||||
|
"crash_page_you_found_a_bug": "Se pare că ați găsit un bug în aplicația Invidious!",
|
||||||
|
"crash_page_before_reporting": "Înainte de a reporta bugul, asigurați-vă că ați:",
|
||||||
|
"search_filters_date_option_hour": "oră",
|
||||||
|
"search_message_change_filters_or_query": "Încercați să lărgiți căutarea sau să modificați filtrele.",
|
||||||
|
"crash_page_report_issue": "Dacă niciuna dintre sugestiile de mai sus v-a ajutat, vă rugăm să <a href=\"`x`\">postați o nouă sugestie pe GitHub</a> (cel mai bine în engleză), și să includeți următorul text în post (să nu îl traduceți):",
|
||||||
|
"search_filters_type_option_all": "orice tip",
|
||||||
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
|
"Show less": "Afișați mai puțin"
|
||||||
}
|
}
|
||||||
|
|||||||
205
locales/ru.json
205
locales/ru.json
@@ -5,8 +5,8 @@
|
|||||||
"Subscribe": "Подписаться",
|
"Subscribe": "Подписаться",
|
||||||
"View channel on YouTube": "Смотреть канал на YouTube",
|
"View channel on YouTube": "Смотреть канал на YouTube",
|
||||||
"View playlist on YouTube": "Посмотреть плейлист на YouTube",
|
"View playlist on YouTube": "Посмотреть плейлист на YouTube",
|
||||||
"newest": "самые свежие",
|
"newest": "сначала новые",
|
||||||
"oldest": "самые старые",
|
"oldest": "сначала старые",
|
||||||
"popular": "популярные",
|
"popular": "популярные",
|
||||||
"last": "недавние",
|
"last": "недавние",
|
||||||
"Next page": "Следующая страница",
|
"Next page": "Следующая страница",
|
||||||
@@ -41,8 +41,8 @@
|
|||||||
"User ID": "ID пользователя",
|
"User ID": "ID пользователя",
|
||||||
"Password": "Пароль",
|
"Password": "Пароль",
|
||||||
"Time (h:mm:ss):": "Время (ч:мм:сс):",
|
"Time (h:mm:ss):": "Время (ч:мм:сс):",
|
||||||
"Text CAPTCHA": "Текст капчи",
|
"Text CAPTCHA": "Текстовая капча (англ.)",
|
||||||
"Image CAPTCHA": "Изображение капчи",
|
"Image CAPTCHA": "Капча-картинка",
|
||||||
"Sign In": "Войти",
|
"Sign In": "Войти",
|
||||||
"Register": "Зарегистрироваться",
|
"Register": "Зарегистрироваться",
|
||||||
"E-mail": "Электронная почта",
|
"E-mail": "Электронная почта",
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
"preferences_category_player": "Настройки проигрывателя",
|
"preferences_category_player": "Настройки проигрывателя",
|
||||||
"preferences_video_loop_label": "Всегда повторять: ",
|
"preferences_video_loop_label": "Всегда повторять: ",
|
||||||
"preferences_autoplay_label": "Автовоспроизведение: ",
|
"preferences_autoplay_label": "Автовоспроизведение: ",
|
||||||
"preferences_continue_label": "Всегда включать следующее видео? ",
|
"preferences_continue_label": "Переходить к следующему видео? ",
|
||||||
"preferences_continue_autoplay_label": "Автопроигрывание следующего видео: ",
|
"preferences_continue_autoplay_label": "Автопроигрывание следующего видео: ",
|
||||||
"preferences_listen_label": "Режим «только аудио» по умолчанию: ",
|
"preferences_listen_label": "Режим «только аудио» по умолчанию: ",
|
||||||
"preferences_local_label": "Проигрывать видео через прокси? ",
|
"preferences_local_label": "Проигрывать видео через прокси? ",
|
||||||
@@ -71,15 +71,15 @@
|
|||||||
"preferences_player_style_label": "Стиль проигрывателя: ",
|
"preferences_player_style_label": "Стиль проигрывателя: ",
|
||||||
"Dark mode: ": "Тёмное оформление: ",
|
"Dark mode: ": "Тёмное оформление: ",
|
||||||
"preferences_dark_mode_label": "Тема: ",
|
"preferences_dark_mode_label": "Тема: ",
|
||||||
"dark": "темная",
|
"dark": "тёмная",
|
||||||
"light": "светлая",
|
"light": "светлая",
|
||||||
"preferences_thin_mode_label": "Облегчённое оформление: ",
|
"preferences_thin_mode_label": "Облегчённое оформление: ",
|
||||||
"preferences_category_misc": "Прочие предпочтения",
|
"preferences_category_misc": "Прочие настройки",
|
||||||
"preferences_automatic_instance_redirect_label": "Автоматическое перенаправление на зеркало сайта (резервный вариант redirect.invidious.io): ",
|
"preferences_automatic_instance_redirect_label": "Автоматическая смена зеркала (переход на redirect.invidious.io): ",
|
||||||
"preferences_category_subscription": "Настройки подписок",
|
"preferences_category_subscription": "Настройки подписок",
|
||||||
"preferences_annotations_subscribed_label": "Всегда показывать аннотации в видео каналов, на которые вы подписаны? ",
|
"preferences_annotations_subscribed_label": "Всегда показывать аннотации на каналах из ваших подписок? ",
|
||||||
"Redirect homepage to feed: ": "Отображать видео с каналов, на которые вы подписаны, как главную страницу: ",
|
"Redirect homepage to feed: ": "Показывать подписки на главной странице: ",
|
||||||
"preferences_max_results_label": "Число видео, на которые вы подписаны, в ленте: ",
|
"preferences_max_results_label": "Число видео в ленте: ",
|
||||||
"preferences_sort_label": "Сортировать видео: ",
|
"preferences_sort_label": "Сортировать видео: ",
|
||||||
"published": "по дате публикации",
|
"published": "по дате публикации",
|
||||||
"published - reverse": "по дате публикации в обратном порядке",
|
"published - reverse": "по дате публикации в обратном порядке",
|
||||||
@@ -96,24 +96,24 @@
|
|||||||
"`x` is live": "`x` в прямом эфире",
|
"`x` is live": "`x` в прямом эфире",
|
||||||
"preferences_category_data": "Настройки данных",
|
"preferences_category_data": "Настройки данных",
|
||||||
"Clear watch history": "Очистить историю просмотров",
|
"Clear watch history": "Очистить историю просмотров",
|
||||||
"Import/export data": "Импорт/Экспорт данных",
|
"Import/export data": "Импорт и экспорт данных",
|
||||||
"Change password": "Изменить пароль",
|
"Change password": "Изменить пароль",
|
||||||
"Manage subscriptions": "Управлять подписками",
|
"Manage subscriptions": "Управление подписками",
|
||||||
"Manage tokens": "Управлять токенами",
|
"Manage tokens": "Управление токенами",
|
||||||
"Watch history": "История просмотров",
|
"Watch history": "История просмотров",
|
||||||
"Delete account": "Удалить аккаунт",
|
"Delete account": "Удалить аккаунт",
|
||||||
"preferences_category_admin": "Администраторские настройки",
|
"preferences_category_admin": "Настройки администратора",
|
||||||
"preferences_default_home_label": "Главная страница по умолчанию: ",
|
"preferences_default_home_label": "Главная страница по умолчанию: ",
|
||||||
"preferences_feed_menu_label": "Меню ленты видео: ",
|
"preferences_feed_menu_label": "Меню ленты видео: ",
|
||||||
"preferences_show_nick_label": "Показать ник вверху: ",
|
"preferences_show_nick_label": "Показать ник вверху: ",
|
||||||
"Top enabled: ": "Включить топ видео? ",
|
"Top enabled: ": "Включить топ видео? ",
|
||||||
"CAPTCHA enabled: ": "Включить капчу? ",
|
"CAPTCHA enabled: ": "Включить капчу? ",
|
||||||
"Login enabled: ": "Включить авторизацию? ",
|
"Login enabled: ": "Включить авторизацию: ",
|
||||||
"Registration enabled: ": "Включить регистрацию? ",
|
"Registration enabled: ": "Включить регистрацию? ",
|
||||||
"Report statistics: ": "Сообщать статистику? ",
|
"Report statistics: ": "Сообщать статистику? ",
|
||||||
"Save preferences": "Сохранить настройки",
|
"Save preferences": "Сохранить настройки",
|
||||||
"Subscription manager": "Менеджер подписок",
|
"Subscription manager": "Управление подписками",
|
||||||
"Token manager": "Менеджер токенов",
|
"Token manager": "Управление токенами",
|
||||||
"Token": "Токен",
|
"Token": "Токен",
|
||||||
"Import/export": "Импорт и экспорт",
|
"Import/export": "Импорт и экспорт",
|
||||||
"unsubscribe": "отписаться",
|
"unsubscribe": "отписаться",
|
||||||
@@ -121,10 +121,10 @@
|
|||||||
"Subscriptions": "Подписки",
|
"Subscriptions": "Подписки",
|
||||||
"search": "поиск",
|
"search": "поиск",
|
||||||
"Log out": "Выйти",
|
"Log out": "Выйти",
|
||||||
"Released under the AGPLv3 on Github.": "Выпущено под лицензией AGPLv3 на Github.",
|
"Released under the AGPLv3 on Github.": "Выпущено под лицензией AGPLv3 на GitHub.",
|
||||||
"Source available here.": "Исходный код доступен здесь.",
|
"Source available here.": "Исходный код.",
|
||||||
"View JavaScript license information.": "Посмотреть информацию по лицензии JavaScript.",
|
"View JavaScript license information.": "Информация о лицензиях JavaScript.",
|
||||||
"View privacy policy.": "Посмотреть политику конфиденциальности.",
|
"View privacy policy.": "Политика конфиденциальности.",
|
||||||
"Trending": "В тренде",
|
"Trending": "В тренде",
|
||||||
"Public": "Публичный",
|
"Public": "Публичный",
|
||||||
"Unlisted": "Нет в списке",
|
"Unlisted": "Нет в списке",
|
||||||
@@ -135,43 +135,42 @@
|
|||||||
"Delete playlist": "Удалить плейлист",
|
"Delete playlist": "Удалить плейлист",
|
||||||
"Create playlist": "Создать плейлист",
|
"Create playlist": "Создать плейлист",
|
||||||
"Title": "Заголовок",
|
"Title": "Заголовок",
|
||||||
"Playlist privacy": "Конфиденциальность плейлиста",
|
"Playlist privacy": "Видимость плейлиста",
|
||||||
"Editing playlist `x`": "Редактирование плейлиста `x`",
|
"Editing playlist `x`": "Редактирование плейлиста `x`",
|
||||||
"Show more": "Показать больше",
|
"Show more": "Развернуть",
|
||||||
"Show less": "Показать меньше",
|
"Show less": "Свернуть",
|
||||||
"Watch on YouTube": "Смотреть на YouTube",
|
"Watch on YouTube": "Смотреть на YouTube",
|
||||||
"Switch Invidious Instance": "Сменить экземпляр Invidious",
|
"Switch Invidious Instance": "Сменить зеркало Invidious",
|
||||||
"Broken? Try another Invidious Instance": "Сломался? Попробуйте другой экземпляр Invidious",
|
|
||||||
"Hide annotations": "Скрыть аннотации",
|
"Hide annotations": "Скрыть аннотации",
|
||||||
"Show annotations": "Показать аннотации",
|
"Show annotations": "Показать аннотации",
|
||||||
"Genre: ": "Жанр: ",
|
"Genre: ": "Жанр: ",
|
||||||
"License: ": "Лицензия: ",
|
"License: ": "Лицензия: ",
|
||||||
"Family friendly? ": "Семейный просмотр: ",
|
"Family friendly? ": "Семейный просмотр: ",
|
||||||
"Wilson score: ": "Рейтинг Уилсона: ",
|
"Wilson score: ": "Оценка Уилсона: ",
|
||||||
"Engagement: ": "Вовлечённость: ",
|
"Engagement: ": "Вовлечённость: ",
|
||||||
"Whitelisted regions: ": "Доступно в регионах: ",
|
"Whitelisted regions: ": "Доступно в регионах: ",
|
||||||
"Blacklisted regions: ": "Недоступно в регионах: ",
|
"Blacklisted regions: ": "Недоступно в регионах: ",
|
||||||
"Shared `x`": "Опубликовано `x`",
|
"Shared `x`": "Опубликовано `x`",
|
||||||
"Premieres in `x`": "Премьера через `x`",
|
"Premieres in `x`": "Премьера через `x`",
|
||||||
"Premieres `x`": "Премьера `x`",
|
"Premieres `x`": "Премьера `x`",
|
||||||
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Похоже, у вас отключён JavaScript. Чтобы увидить комментарии, нажмите сюда, но учтите: они могут загружаться немного медленнее.",
|
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Похоже, у вас отключён JavaScript. Нажмите сюда, чтобы увидеть комментарии. Но учтите: они могут загружаться немного медленнее.",
|
||||||
"View YouTube comments": "Смотреть комментарии с YouTube",
|
"View YouTube comments": "Показать комментарии с YouTube",
|
||||||
"View more comments on Reddit": "Посмотреть больше комментариев на Reddit",
|
"View more comments on Reddit": "Посмотреть больше комментариев на Reddit",
|
||||||
"View `x` comments": {
|
"View `x` comments": {
|
||||||
"([^.,0-9]|^)1([^.,0-9]|$)": "Показать `x` комментариев",
|
"([^.,0-9]|^)1([^.,0-9]|$)": "Показано `x` комментариев",
|
||||||
"": "Показать `x` комментариев"
|
"": "Показано `x` комментариев"
|
||||||
},
|
},
|
||||||
"View Reddit comments": "Смотреть комментарии с Reddit",
|
"View Reddit comments": "Смотреть комментарии с Reddit",
|
||||||
"Hide replies": "Скрыть ответы",
|
"Hide replies": "Скрыть ответы",
|
||||||
"Show replies": "Показать ответы",
|
"Show replies": "Показать ответы",
|
||||||
"Incorrect password": "Неправильный пароль",
|
"Incorrect password": "Неправильный пароль",
|
||||||
"Quota exceeded, try again in a few hours": "Лимит превышен, попробуйте снова через несколько часов",
|
"Quota exceeded, try again in a few hours": "Лимит превышен, попробуйте снова через несколько часов",
|
||||||
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Войти не удаётся. Проверьте, не включена ли двухфакторная аутентификация (по коду или смс).",
|
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Не удалось войти. Проверьте, не включена ли двухфакторная аутентификация (по коду или смс).",
|
||||||
"Invalid TFA code": "Неправильный код двухфакторной аутентификации",
|
"Invalid TFA code": "Неправильный код двухфакторной аутентификации",
|
||||||
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Не удаётся войти. Это может быть из-за того, что в вашем аккаунте не включена двухфакторная аутентификация.",
|
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Не удалось войти. Это может быть из-за того, что в вашем аккаунте не включена двухфакторная аутентификация.",
|
||||||
"Wrong answer": "Неправильный ответ",
|
"Wrong answer": "Неправильный ответ",
|
||||||
"Erroneous CAPTCHA": "Неправильная капча",
|
"Erroneous CAPTCHA": "Неправильная капча",
|
||||||
"CAPTCHA is a required field": "Необходимо пройти капчу",
|
"CAPTCHA is a required field": "Необходимо решить капчу",
|
||||||
"User ID is a required field": "Необходимо ввести ID пользователя",
|
"User ID is a required field": "Необходимо ввести ID пользователя",
|
||||||
"Password is a required field": "Необходимо ввести пароль",
|
"Password is a required field": "Необходимо ввести пароль",
|
||||||
"Wrong username or password": "Неправильный логин или пароль",
|
"Wrong username or password": "Неправильный логин или пароль",
|
||||||
@@ -186,8 +185,8 @@
|
|||||||
"Could not get channel info.": "Не удаётся получить информацию об этом канале.",
|
"Could not get channel info.": "Не удаётся получить информацию об этом канале.",
|
||||||
"Could not fetch comments": "Не удаётся загрузить комментарии",
|
"Could not fetch comments": "Не удаётся загрузить комментарии",
|
||||||
"`x` ago": "`x` назад",
|
"`x` ago": "`x` назад",
|
||||||
"Load more": "Загрузить больше",
|
"Load more": "Загрузить ещё",
|
||||||
"Could not create mix.": "Не удаётся создать микс.",
|
"Could not create mix.": "Не удалось создать микс.",
|
||||||
"Empty playlist": "Плейлист пуст",
|
"Empty playlist": "Плейлист пуст",
|
||||||
"Not a playlist.": "Некорректный плейлист.",
|
"Not a playlist.": "Некорректный плейлист.",
|
||||||
"Playlist does not exist.": "Плейлист не существует.",
|
"Playlist does not exist.": "Плейлист не существует.",
|
||||||
@@ -196,7 +195,7 @@
|
|||||||
"Hidden field \"token\" is a required field": "Необходимо заполнить скрытое поле «токен»",
|
"Hidden field \"token\" is a required field": "Необходимо заполнить скрытое поле «токен»",
|
||||||
"Erroneous challenge": "Неправильный ответ в «challenge»",
|
"Erroneous challenge": "Неправильный ответ в «challenge»",
|
||||||
"Erroneous token": "Неправильный токен",
|
"Erroneous token": "Неправильный токен",
|
||||||
"No such user": "Недопустимое имя пользователя",
|
"No such user": "Пользователь не найден",
|
||||||
"Token is expired, please try again": "Срок действия токена истёк, попробуйте позже",
|
"Token is expired, please try again": "Срок действия токена истёк, попробуйте позже",
|
||||||
"English": "Английский",
|
"English": "Английский",
|
||||||
"English (auto-generated)": "Английский (созданы автоматически)",
|
"English (auto-generated)": "Английский (созданы автоматически)",
|
||||||
@@ -220,7 +219,7 @@
|
|||||||
"Croatian": "Хорватский",
|
"Croatian": "Хорватский",
|
||||||
"Czech": "Чешский",
|
"Czech": "Чешский",
|
||||||
"Danish": "Датский",
|
"Danish": "Датский",
|
||||||
"Dutch": "Нидерландский",
|
"Dutch": "Голландский",
|
||||||
"Esperanto": "Эсперанто",
|
"Esperanto": "Эсперанто",
|
||||||
"Estonian": "Эстонский",
|
"Estonian": "Эстонский",
|
||||||
"Filipino": "Филиппинский",
|
"Filipino": "Филиппинский",
|
||||||
@@ -230,8 +229,8 @@
|
|||||||
"Georgian": "Грузинский",
|
"Georgian": "Грузинский",
|
||||||
"German": "Немецкий",
|
"German": "Немецкий",
|
||||||
"Greek": "Греческий",
|
"Greek": "Греческий",
|
||||||
"Gujarati": "Гуджаратский",
|
"Gujarati": "Гуджарати",
|
||||||
"Haitian Creole": "Гаит. креольский",
|
"Haitian Creole": "Гаитянский креольский",
|
||||||
"Hausa": "Хауса",
|
"Hausa": "Хауса",
|
||||||
"Hawaiian": "Гавайский",
|
"Hawaiian": "Гавайский",
|
||||||
"Hebrew": "Иврит",
|
"Hebrew": "Иврит",
|
||||||
@@ -252,7 +251,7 @@
|
|||||||
"Kurdish": "Курдский",
|
"Kurdish": "Курдский",
|
||||||
"Kyrgyz": "Киргизский",
|
"Kyrgyz": "Киргизский",
|
||||||
"Lao": "Лаосский",
|
"Lao": "Лаосский",
|
||||||
"Latin": "Латинский",
|
"Latin": "Латынь",
|
||||||
"Latvian": "Латышский",
|
"Latvian": "Латышский",
|
||||||
"Lithuanian": "Литовский",
|
"Lithuanian": "Литовский",
|
||||||
"Luxembourgish": "Люксембургский",
|
"Luxembourgish": "Люксембургский",
|
||||||
@@ -263,9 +262,9 @@
|
|||||||
"Maltese": "Мальтийский",
|
"Maltese": "Мальтийский",
|
||||||
"Maori": "Маори",
|
"Maori": "Маори",
|
||||||
"Marathi": "Маратхи",
|
"Marathi": "Маратхи",
|
||||||
"Mongolian": "Монгольская",
|
"Mongolian": "Монгольский",
|
||||||
"Nepali": "Непальский",
|
"Nepali": "Непальский",
|
||||||
"Norwegian Bokmål": "Норвежский",
|
"Norwegian Bokmål": "Норвежский букмол",
|
||||||
"Nyanja": "Ньянджа",
|
"Nyanja": "Ньянджа",
|
||||||
"Pashto": "Пушту",
|
"Pashto": "Пушту",
|
||||||
"Persian": "Персидский",
|
"Persian": "Персидский",
|
||||||
@@ -300,7 +299,7 @@
|
|||||||
"Vietnamese": "Вьетнамский",
|
"Vietnamese": "Вьетнамский",
|
||||||
"Welsh": "Валлийский",
|
"Welsh": "Валлийский",
|
||||||
"Western Frisian": "Западнофризский",
|
"Western Frisian": "Западнофризский",
|
||||||
"Xhosa": "Коса",
|
"Xhosa": "Коса (кхоса)",
|
||||||
"Yiddish": "Идиш",
|
"Yiddish": "Идиш",
|
||||||
"Yoruba": "Йоруба",
|
"Yoruba": "Йоруба",
|
||||||
"Zulu": "Зулусский",
|
"Zulu": "Зулусский",
|
||||||
@@ -312,7 +311,7 @@
|
|||||||
"Rating: ": "Рейтинг: ",
|
"Rating: ": "Рейтинг: ",
|
||||||
"preferences_locale_label": "Язык: ",
|
"preferences_locale_label": "Язык: ",
|
||||||
"View as playlist": "Смотреть как плейлист",
|
"View as playlist": "Смотреть как плейлист",
|
||||||
"Default": "По-умолчанию",
|
"Default": "По умолчанию",
|
||||||
"Music": "Музыка",
|
"Music": "Музыка",
|
||||||
"Gaming": "Игры",
|
"Gaming": "Игры",
|
||||||
"News": "Новости",
|
"News": "Новости",
|
||||||
@@ -329,39 +328,38 @@
|
|||||||
"Videos": "Видео",
|
"Videos": "Видео",
|
||||||
"Playlists": "Плейлисты",
|
"Playlists": "Плейлисты",
|
||||||
"Community": "Сообщество",
|
"Community": "Сообщество",
|
||||||
"relevance": "Актуальность",
|
"search_filters_sort_option_relevance": "по актуальности",
|
||||||
"rating": "Рейтинг",
|
"search_filters_sort_option_rating": "по рейтингу",
|
||||||
"date": "Дата загрузки",
|
"search_filters_sort_option_date": "по дате загрузки",
|
||||||
"views": "Просмотры",
|
"search_filters_sort_option_views": "по просмотрам",
|
||||||
"content_type": "Тип",
|
"search_filters_type_label": "Тип",
|
||||||
"duration": "Длительность",
|
"search_filters_duration_label": "Длительность",
|
||||||
"features": "Функции",
|
"search_filters_features_label": "Дополнительно",
|
||||||
"sort": "Сортировать по",
|
"search_filters_sort_label": "Сортировать",
|
||||||
"hour": "Последний час",
|
"search_filters_date_option_hour": "Последний час",
|
||||||
"today": "Сегодня",
|
"search_filters_date_option_today": "Сегодня",
|
||||||
"week": "Эта неделя",
|
"search_filters_date_option_week": "Эта неделя",
|
||||||
"month": "Этот месяц",
|
"search_filters_date_option_month": "Этот месяц",
|
||||||
"year": "Этот год",
|
"search_filters_date_option_year": "Этот год",
|
||||||
"video": "Видео",
|
"search_filters_type_option_video": "Видео",
|
||||||
"channel": "Канал",
|
"search_filters_type_option_channel": "Канал",
|
||||||
"playlist": "Плейлист",
|
"search_filters_type_option_playlist": "Плейлист",
|
||||||
"movie": "Фильм",
|
"search_filters_type_option_movie": "Фильм",
|
||||||
"show": "Показать",
|
"search_filters_type_option_show": "Сериал",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "Субтитры",
|
"search_filters_features_option_subtitles": "Субтитры",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "Прямой эфир",
|
"search_filters_features_option_live": "Прямой эфир",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "Местоположение",
|
"search_filters_features_option_location": "Местоположение",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "Фильтр",
|
|
||||||
"Current version: ": "Текущая версия: ",
|
"Current version: ": "Текущая версия: ",
|
||||||
"next_steps_error_message": "После чего следует попробовать: ",
|
"next_steps_error_message": "После чего следует попробовать: ",
|
||||||
"next_steps_error_message_refresh": "Обновить",
|
"next_steps_error_message_refresh": "Обновить",
|
||||||
"next_steps_error_message_go_to_youtube": "Перейти на YouTube",
|
"next_steps_error_message_go_to_youtube": "Перейти на YouTube",
|
||||||
"short": "Короткие (< 4 минут)",
|
"search_filters_duration_option_short": "Короткие (< 4 минут)",
|
||||||
"long": "Длинные (> 20 минут)",
|
"search_filters_duration_option_long": "Длинные (> 20 минут)",
|
||||||
"preferences_quality_dash_option_best": "Наилучшее",
|
"preferences_quality_dash_option_best": "Наилучшее",
|
||||||
"generic_count_weeks_0": "{{count}} неделя",
|
"generic_count_weeks_0": "{{count}} неделя",
|
||||||
"generic_count_weeks_1": "{{count}} недели",
|
"generic_count_weeks_1": "{{count}} недели",
|
||||||
@@ -370,28 +368,28 @@
|
|||||||
"English (United States)": "Английский (США)",
|
"English (United States)": "Английский (США)",
|
||||||
"Cantonese (Hong Kong)": "Кантонский (Гонконг)",
|
"Cantonese (Hong Kong)": "Кантонский (Гонконг)",
|
||||||
"Chinese (Taiwan)": "Китайский (Тайвань)",
|
"Chinese (Taiwan)": "Китайский (Тайвань)",
|
||||||
"Dutch (auto-generated)": "Голландский (автоматический)",
|
"Dutch (auto-generated)": "Голландский (созданы автоматически)",
|
||||||
"German (auto-generated)": "Немецкий (автоматический)",
|
"German (auto-generated)": "Немецкий (созданы автоматически)",
|
||||||
"Indonesian (auto-generated)": "Индонезийский (автоматический)",
|
"Indonesian (auto-generated)": "Индонезийский (созданы автоматически)",
|
||||||
"Italian (auto-generated)": "Итальянский (автоматический)",
|
"Italian (auto-generated)": "Итальянский (созданы автоматически)",
|
||||||
"Interlingue": "Окциденталь",
|
"Interlingue": "Окциденталь",
|
||||||
"Russian (auto-generated)": "Русский (автоматический)",
|
"Russian (auto-generated)": "Русский (созданы автоматически)",
|
||||||
"Spanish (auto-generated)": "Испанский (автоматический)",
|
"Spanish (auto-generated)": "Испанский (созданы автоматически)",
|
||||||
"Spanish (Spain)": "Испанский (Испания)",
|
"Spanish (Spain)": "Испанский (Испания)",
|
||||||
"Turkish (auto-generated)": "Турецкий (автоматический)",
|
"Turkish (auto-generated)": "Турецкий (созданы автоматически)",
|
||||||
"Vietnamese (auto-generated)": "Вьетнамский (автоматический)",
|
"Vietnamese (auto-generated)": "Вьетнамский (созданы автоматически)",
|
||||||
"footer_documentation": "Документация",
|
"footer_documentation": "Документация",
|
||||||
"adminprefs_modified_source_code_url_label": "Ссылка на нашу ветку репозитория",
|
"adminprefs_modified_source_code_url_label": "Ссылка на нашу ветку репозитория",
|
||||||
"none": "ничего",
|
"none": "ничего",
|
||||||
"videoinfo_watch_on_youTube": "Смотреть на YouTube",
|
"videoinfo_watch_on_youTube": "Смотреть на YouTube",
|
||||||
"videoinfo_youTube_embed_link": "Встраиваемый элемент",
|
"videoinfo_youTube_embed_link": "Версия для встраивания",
|
||||||
"videoinfo_invidious_embed_link": "Встраиваемая ссылка",
|
"videoinfo_invidious_embed_link": "Ссылка для встраивания",
|
||||||
"download_subtitles": "Субтитры - `x` (.vtt)",
|
"download_subtitles": "Субтитры - `x` (.vtt)",
|
||||||
"user_created_playlists": "`x` созданных плейлистов",
|
"user_created_playlists": "`x` созданных плейлистов",
|
||||||
"crash_page_you_found_a_bug": "Похоже вы нашли баг в Invidious!",
|
"crash_page_you_found_a_bug": "Похоже, вы нашли ошибку в Invidious!",
|
||||||
"crash_page_before_reporting": "Прежде чем сообщать об ошибке, убедитесь, что вы:",
|
"crash_page_before_reporting": "Прежде чем сообщать об ошибке, убедитесь, что вы:",
|
||||||
"crash_page_refresh": "пробовали <a href=\"`x`\"> перезагрузить страницу</a>",
|
"crash_page_refresh": "пробовали <a href=\"`x`\"> перезагрузить страницу</a>",
|
||||||
"crash_page_report_issue": "Если ни один вариант не помог, пожалуйста <a href=\"`x`\">откройте новую проблему на GitHub</a> (желательно на английском) и приложите следующий текст к вашему сообщению (НЕ переводите его):",
|
"crash_page_report_issue": "Если ни один вариант не помог, пожалуйста <a href=\"`x`\">откройте новую проблему на GitHub</a> (на английском, пжлста) и приложите следующий текст к вашему сообщению (НЕ переводите его):",
|
||||||
"generic_videos_count_0": "{{count}} видео",
|
"generic_videos_count_0": "{{count}} видео",
|
||||||
"generic_videos_count_1": "{{count}} видео",
|
"generic_videos_count_1": "{{count}} видео",
|
||||||
"generic_videos_count_2": "{{count}} видео",
|
"generic_videos_count_2": "{{count}} видео",
|
||||||
@@ -419,8 +417,8 @@
|
|||||||
"generic_views_count_0": "{{count}} просмотр",
|
"generic_views_count_0": "{{count}} просмотр",
|
||||||
"generic_views_count_1": "{{count}} просмотра",
|
"generic_views_count_1": "{{count}} просмотра",
|
||||||
"generic_views_count_2": "{{count}} просмотров",
|
"generic_views_count_2": "{{count}} просмотров",
|
||||||
"French (auto-generated)": "Французский (автоматический)",
|
"French (auto-generated)": "Французский (созданы автоматически)",
|
||||||
"Portuguese (auto-generated)": "Португальский (автоматический)",
|
"Portuguese (auto-generated)": "Португальский (созданы автоматически)",
|
||||||
"generic_count_days_0": "{{count}} день",
|
"generic_count_days_0": "{{count}} день",
|
||||||
"generic_count_days_1": "{{count}} дня",
|
"generic_count_days_1": "{{count}} дня",
|
||||||
"generic_count_days_2": "{{count}} дней",
|
"generic_count_days_2": "{{count}} дней",
|
||||||
@@ -437,15 +435,15 @@
|
|||||||
"generic_count_seconds_0": "{{count}} секунда",
|
"generic_count_seconds_0": "{{count}} секунда",
|
||||||
"generic_count_seconds_1": "{{count}} секунды",
|
"generic_count_seconds_1": "{{count}} секунды",
|
||||||
"generic_count_seconds_2": "{{count}} секунд",
|
"generic_count_seconds_2": "{{count}} секунд",
|
||||||
"purchased": "Приобретено",
|
"search_filters_features_option_purchased": "Приобретено",
|
||||||
"videoinfo_started_streaming_x_ago": "Трансляция началась `x` назад",
|
"videoinfo_started_streaming_x_ago": "Трансляция началась `x` назад",
|
||||||
"crash_page_switch_instance": "пробовали <a href=\"`x`\">использовать другое зеркало</a>",
|
"crash_page_switch_instance": "пробовали <a href=\"`x`\">использовать другое зеркало</a>",
|
||||||
"crash_page_read_the_faq": "прочли <a href=\"`x`\">Частые Вопросы (ЧаВо)</a>",
|
"crash_page_read_the_faq": "прочли ответы на <a href=\"`x`\">Частые Вопросы (ЧаВо)</a>",
|
||||||
"Chinese": "Китайский",
|
"Chinese": "Китайский",
|
||||||
"Chinese (Hong Kong)": "Китайский (Гонконг)",
|
"Chinese (Hong Kong)": "Китайский (Гонконг)",
|
||||||
"Japanese (auto-generated)": "Японский (автоматический)",
|
"Japanese (auto-generated)": "Японский (созданы автоматически)",
|
||||||
"Chinese (China)": "Китайский (Китай)",
|
"Chinese (China)": "Китайский (Китай)",
|
||||||
"Korean (auto-generated)": "Корейский (автоматический)",
|
"Korean (auto-generated)": "Корейский (созданы автоматически)",
|
||||||
"generic_count_months_0": "{{count}} месяц",
|
"generic_count_months_0": "{{count}} месяц",
|
||||||
"generic_count_months_1": "{{count}} месяца",
|
"generic_count_months_1": "{{count}} месяца",
|
||||||
"generic_count_months_2": "{{count}} месяцев",
|
"generic_count_months_2": "{{count}} месяцев",
|
||||||
@@ -457,7 +455,7 @@
|
|||||||
"footer_original_source_code": "Оригинальный исходный код",
|
"footer_original_source_code": "Оригинальный исходный код",
|
||||||
"footer_modfied_source_code": "Изменённый исходный код",
|
"footer_modfied_source_code": "Изменённый исходный код",
|
||||||
"user_saved_playlists": "`x` сохранённых плейлистов",
|
"user_saved_playlists": "`x` сохранённых плейлистов",
|
||||||
"crash_page_search_issue": "искали <a href=\"`x`\">похожую проблему на Github</a>",
|
"crash_page_search_issue": "поискали <a href=\"`x`\">похожую проблему на GitHub</a>",
|
||||||
"comments_points_count_0": "{{count}} плюс",
|
"comments_points_count_0": "{{count}} плюс",
|
||||||
"comments_points_count_1": "{{count}} плюса",
|
"comments_points_count_1": "{{count}} плюса",
|
||||||
"comments_points_count_2": "{{count}} плюсов",
|
"comments_points_count_2": "{{count}} плюсов",
|
||||||
@@ -466,15 +464,28 @@
|
|||||||
"preferences_quality_option_dash": "DASH (автоматическое качество)",
|
"preferences_quality_option_dash": "DASH (автоматическое качество)",
|
||||||
"preferences_quality_option_hd720": "HD720",
|
"preferences_quality_option_hd720": "HD720",
|
||||||
"preferences_quality_option_medium": "Среднее",
|
"preferences_quality_option_medium": "Среднее",
|
||||||
"preferences_quality_dash_label": "Предпочтительное автоматическое качество видео: ",
|
"preferences_quality_dash_label": "Предпочтительное качество для DASH: ",
|
||||||
"preferences_quality_dash_option_worst": "Очень низкое",
|
"preferences_quality_dash_option_worst": "Очень низкое",
|
||||||
"preferences_quality_dash_option_4320p": "4320p",
|
"preferences_quality_dash_option_4320p": "4320p",
|
||||||
"preferences_quality_dash_option_2160p": "2160p",
|
"preferences_quality_dash_option_2160p": "2160p",
|
||||||
"preferences_quality_dash_option_240p": "240p",
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
"preferences_quality_dash_option_144p": "144p",
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
"invidious": "Invidious",
|
"invidious": "Invidious",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"Video unavailable": "Видео недоступно",
|
"Video unavailable": "Видео недоступно",
|
||||||
"preferences_save_player_pos_label": "Запоминать позицию: ",
|
"preferences_save_player_pos_label": "Запоминать позицию: ",
|
||||||
"preferences_region_label": "Страна: "
|
"preferences_region_label": "Страна: ",
|
||||||
|
"preferences_watch_history_label": "Включить историю просмотров: ",
|
||||||
|
"search_filters_title": "Фильтр",
|
||||||
|
"search_filters_duration_option_none": "Любой длины",
|
||||||
|
"search_filters_type_option_all": "Любого типа",
|
||||||
|
"search_filters_date_option_none": "Любая дата",
|
||||||
|
"search_filters_date_label": "Дата загрузки",
|
||||||
|
"search_message_no_results": "Ничего не найдено.",
|
||||||
|
"search_message_use_another_instance": " Дополнительно вы можете <a href=\"`x`\">поискать на других зеркалах</a>.",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_message_change_filters_or_query": "Попробуйте расширить поисковый запрос или изменить фильтры.",
|
||||||
|
"search_filters_duration_option_medium": "Средние (4 - 20 минут)",
|
||||||
|
"search_filters_apply_button": "Применить фильтры",
|
||||||
|
"Popular enabled: ": "Популярное включено: "
|
||||||
}
|
}
|
||||||
|
|||||||
126
locales/si.json
Normal file
126
locales/si.json
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
{
|
||||||
|
"generic_views_count": "බැලීම් {{count}}",
|
||||||
|
"generic_views_count_plural": "බැලීම් {{count}}",
|
||||||
|
"generic_videos_count": "{{count}} වීඩියෝව",
|
||||||
|
"generic_videos_count_plural": "වීඩියෝ {{count}}",
|
||||||
|
"generic_subscribers_count": "ග්රාහකයන් {{count}}",
|
||||||
|
"generic_subscribers_count_plural": "ග්රාහකයන් {{count}}",
|
||||||
|
"generic_subscriptions_count": "දායකත්ව {{count}}",
|
||||||
|
"generic_subscriptions_count_plural": "දායකත්ව {{count}}",
|
||||||
|
"Shared `x` ago": "`x` පෙර බෙදා ගන්නා ලදී",
|
||||||
|
"Unsubscribe": "දායක නොවන්න",
|
||||||
|
"View playlist on YouTube": "YouTube හි ධාවන ලැයිස්තුව බලන්න",
|
||||||
|
"newest": "අලුත්ම",
|
||||||
|
"oldest": "පැරණිතම",
|
||||||
|
"popular": "ජනප්රිය",
|
||||||
|
"last": "අවසන්",
|
||||||
|
"Cannot change password for Google accounts": "Google ගිණුම් සඳහා මුරපදය වෙනස් කළ නොහැක",
|
||||||
|
"Authorize token?": "ටෝකනය අනුමත කරනවා ද?",
|
||||||
|
"Authorize token for `x`?": "`x` සඳහා ටෝකනය අනුමත කරනවා ද?",
|
||||||
|
"Yes": "ඔව්",
|
||||||
|
"Import and Export Data": "දත්ත ආනයනය සහ අපනයනය කිරීම",
|
||||||
|
"Import": "ආනයන",
|
||||||
|
"Import Invidious data": "Invidious JSON දත්ත ආයාත කරන්න",
|
||||||
|
"Import FreeTube subscriptions (.db)": "FreeTube දායකත්වයන් (.db) ආයාත කරන්න",
|
||||||
|
"Import NewPipe subscriptions (.json)": "NewPipe දායකත්වයන් (.json) ආයාත කරන්න",
|
||||||
|
"Import NewPipe data (.zip)": "NewPipe දත්ත (.zip) ආයාත කරන්න",
|
||||||
|
"Export": "අපනයන",
|
||||||
|
"Export data as JSON": "Invidious දත්ත JSON ලෙස අපනයනය කරන්න",
|
||||||
|
"Delete account?": "ගිණුම මකාදමනවා ද?",
|
||||||
|
"History": "ඉතිහාසය",
|
||||||
|
"An alternative front-end to YouTube": "YouTube සඳහා විකල්ප ඉදිරිපස අන්තයක්",
|
||||||
|
"source": "මූලාශ්රය",
|
||||||
|
"Log in/register": "පුරන්න/ලියාපදිංචිවන්න",
|
||||||
|
"Log in with Google": "Google සමඟ පුරන්න",
|
||||||
|
"Password": "මුරපදය",
|
||||||
|
"Time (h:mm:ss):": "වේලාව (h:mm:ss):",
|
||||||
|
"Sign In": "පුරන්න",
|
||||||
|
"Preferences": "මනාපයන්",
|
||||||
|
"preferences_category_player": "වීඩියෝ ධාවක මනාපයන්",
|
||||||
|
"preferences_video_loop_label": "නැවත නැවතත්: ",
|
||||||
|
"preferences_autoplay_label": "ස්වයංක්රීය වාදනය: ",
|
||||||
|
"preferences_continue_label": "මීලඟට වාදනය කරන්න: ",
|
||||||
|
"preferences_continue_autoplay_label": "මීළඟ වීඩියෝව ස්වයංක්රීයව ධාවනය කරන්න: ",
|
||||||
|
"preferences_local_label": "Proxy වීඩියෝ: ",
|
||||||
|
"preferences_watch_history_label": "නැරඹුම් ඉතිහාසය සබල කරන්න: ",
|
||||||
|
"preferences_speed_label": "පෙරනිමි වේගය: ",
|
||||||
|
"preferences_quality_option_dash": "DASH (අනුවර්තිත ගුණත්වය)",
|
||||||
|
"preferences_quality_option_medium": "මධ්යස්ථ",
|
||||||
|
"preferences_quality_dash_label": "කැමති DASH වීඩියෝ ගුණත්වය: ",
|
||||||
|
"preferences_quality_dash_option_4320p": "4320p",
|
||||||
|
"preferences_quality_dash_option_1080p": "1080p",
|
||||||
|
"preferences_quality_dash_option_480p": "480p",
|
||||||
|
"preferences_quality_dash_option_360p": "360p",
|
||||||
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
|
"preferences_volume_label": "ධාවකයේ හඬ: ",
|
||||||
|
"preferences_comments_label": "පෙරනිමි අදහස්: ",
|
||||||
|
"youtube": "YouTube",
|
||||||
|
"reddit": "Reddit",
|
||||||
|
"invidious": "Invidious",
|
||||||
|
"preferences_captions_label": "පෙරනිමි උපසිරැසි: ",
|
||||||
|
"preferences_related_videos_label": "අදාළ වීඩියෝ පෙන්වන්න: ",
|
||||||
|
"preferences_annotations_label": "අනුසටහන් පෙන්වන්න: ",
|
||||||
|
"preferences_vr_mode_label": "අන්තර්ක්රියාකාරී අංශක 360 වීඩියෝ (WebGL අවශ්යයි): ",
|
||||||
|
"preferences_region_label": "අන්තර්ගත රට: ",
|
||||||
|
"preferences_player_style_label": "වීඩියෝ ධාවක විලාසය: ",
|
||||||
|
"Dark mode: ": "අඳුරු මාදිලිය: ",
|
||||||
|
"preferences_dark_mode_label": "තේමාව: ",
|
||||||
|
"light": "ආලෝකමත්",
|
||||||
|
"generic_playlists_count": "{{count}} ධාවන ලැයිස්තුව",
|
||||||
|
"generic_playlists_count_plural": "ධාවන ලැයිස්තු {{count}}",
|
||||||
|
"LIVE": "සජීව",
|
||||||
|
"Subscribe": "දායක වන්න",
|
||||||
|
"View channel on YouTube": "YouTube හි නාලිකාව බලන්න",
|
||||||
|
"Next page": "ඊළඟ පිටුව",
|
||||||
|
"Previous page": "පෙර පිටුව",
|
||||||
|
"Clear watch history?": "නැරඹුම් ඉතිහාසය මකාදමනවා ද?",
|
||||||
|
"No": "නැත",
|
||||||
|
"Log in": "පුරන්න",
|
||||||
|
"New password": "නව මුරපදය",
|
||||||
|
"Import YouTube subscriptions": "YouTube/OPML දායකත්වයන් ආයාත කරන්න",
|
||||||
|
"Register": "ලියාපදිංචිවන්න",
|
||||||
|
"New passwords must match": "නව මුරපද ගැලපිය යුතුය",
|
||||||
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "OPML ලෙස දායකත්වයන් අපනයනය කරන්න (NewPipe සහ FreeTube සඳහා)",
|
||||||
|
"Export subscriptions as OPML": "දායකත්වයන් OPML ලෙස අපනයනය කරන්න",
|
||||||
|
"JavaScript license information": "JavaScript බලපත්ර තොරතුරු",
|
||||||
|
"User ID": "පරිශීලක කේතය",
|
||||||
|
"Text CAPTCHA": "CAPTCHA පෙල",
|
||||||
|
"Image CAPTCHA": "CAPTCHA රූපය",
|
||||||
|
"Google verification code": "Google සත්යාපන කේතය",
|
||||||
|
"E-mail": "විද්යුත් තැපෑල",
|
||||||
|
"preferences_quality_label": "කැමති වීඩියෝ ගුණත්වය: ",
|
||||||
|
"preferences_quality_option_hd720": "HD720",
|
||||||
|
"preferences_quality_dash_option_auto": "ස්වයංක්රීය",
|
||||||
|
"preferences_quality_option_small": "කුඩා",
|
||||||
|
"preferences_quality_dash_option_best": "උසස්",
|
||||||
|
"preferences_quality_dash_option_2160p": "2160p",
|
||||||
|
"preferences_quality_dash_option_1440p": "1440p",
|
||||||
|
"preferences_quality_dash_option_720p": "720p",
|
||||||
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
|
"preferences_extend_desc_label": "වීඩියෝ විස්තරය ස්වයංක්රීයව දිගහරින්න: ",
|
||||||
|
"preferences_category_visual": "දෘශ්ය මනාපයන්",
|
||||||
|
"dark": "අඳුරු",
|
||||||
|
"preferences_category_misc": "විවිධ මනාප",
|
||||||
|
"preferences_category_subscription": "දායකත්ව මනාප",
|
||||||
|
"Redirect homepage to feed: ": "මුල් පිටුව පෝෂණය වෙත හරවා යවන්න: ",
|
||||||
|
"preferences_max_results_label": "සංග්රහයේ පෙන්වන වීඩියෝ ගණන: ",
|
||||||
|
"preferences_sort_label": "වීඩියෝ වර්ග කරන්න: ",
|
||||||
|
"alphabetically": "අකාරාදී ලෙස",
|
||||||
|
"alphabetically - reverse": "අකාරාදී - ආපසු",
|
||||||
|
"channel name": "නාලිකාවේ නම",
|
||||||
|
"Only show latest video from channel: ": "නාලිකාවේ නවතම වීඩියෝව පමණක් පෙන්වන්න: ",
|
||||||
|
"preferences_unseen_only_label": "නොබැලූ පමණක් පෙන්වන්න: ",
|
||||||
|
"Enable web notifications": "වෙබ් දැනුම්දීම් සබල කරන්න",
|
||||||
|
"Import/export data": "දත්ත ආනයනය / අපනයනය",
|
||||||
|
"Change password": "මුරපදය වෙනස් කරන්න",
|
||||||
|
"Manage subscriptions": "දායකත්ව කළමනාකරණය",
|
||||||
|
"Manage tokens": "ටෝකන කළමනාකරණය",
|
||||||
|
"Watch history": "නැරඹුම් ඉතිහාසය",
|
||||||
|
"Save preferences": "මනාප සුරකින්න",
|
||||||
|
"Token": "ටෝකනය",
|
||||||
|
"View privacy policy.": "රහස්යතා ප්රතිපත්තිය බලන්න.",
|
||||||
|
"Only show latest unwatched video from channel: ": "නාලිකාවේ නවතම නැරඹන නොලද වීඩියෝව පමණක් පෙන්වන්න: ",
|
||||||
|
"preferences_category_data": "දත්ත මනාප",
|
||||||
|
"Clear watch history": "නැරඹුම් ඉතිහාසය මකාදැමීම",
|
||||||
|
"Subscriptions": "දායකත්ව"
|
||||||
|
}
|
||||||
@@ -18,15 +18,15 @@
|
|||||||
"No": "Nie",
|
"No": "Nie",
|
||||||
"Import and Export Data": "Import a Export údajov",
|
"Import and Export Data": "Import a Export údajov",
|
||||||
"Import": "Import",
|
"Import": "Import",
|
||||||
"Import Invidious data": "Importovať údaje Invidious",
|
"Import Invidious data": "Importovať JSON údaje Invidious",
|
||||||
"Import YouTube subscriptions": "Importovať odbery YouTube",
|
"Import YouTube subscriptions": "Importovať odbery YouTube/OPML",
|
||||||
"Import FreeTube subscriptions (.db)": "Importovať odbery FreeTube (.db)",
|
"Import FreeTube subscriptions (.db)": "Importovať odbery FreeTube (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "Importovať odbery NewPipe (.json)",
|
"Import NewPipe subscriptions (.json)": "Importovať odbery NewPipe (.json)",
|
||||||
"Import NewPipe data (.zip)": "Importovať údaje NewPipe (.zip)",
|
"Import NewPipe data (.zip)": "Importovať údaje NewPipe (.zip)",
|
||||||
"Export": "Export",
|
"Export": "Export",
|
||||||
"Export subscriptions as OPML": "Exportovať odbery ako OPML",
|
"Export subscriptions as OPML": "Exportovať odbery ako OPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportovať odbery ako OPML (pre NewPipe a FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportovať odbery ako OPML (pre NewPipe a FreeTube)",
|
||||||
"Export data as JSON": "Export údajov ako JSON",
|
"Export data as JSON": "Exportovať údaje Invidious ako JSON",
|
||||||
"Delete account?": "Zrušiť účet?",
|
"Delete account?": "Zrušiť účet?",
|
||||||
"History": "História",
|
"History": "História",
|
||||||
"An alternative front-end to YouTube": "Alternatívny front-end pre YouTube",
|
"An alternative front-end to YouTube": "Alternatívny front-end pre YouTube",
|
||||||
@@ -84,5 +84,23 @@
|
|||||||
"preferences_unseen_only_label": "Zobraziť iba neprehrané: ",
|
"preferences_unseen_only_label": "Zobraziť iba neprehrané: ",
|
||||||
"preferences_notifications_only_label": "Zobraziť iba upozornenia (ak existujú): ",
|
"preferences_notifications_only_label": "Zobraziť iba upozornenia (ak existujú): ",
|
||||||
"Enable web notifications": "Povoliť webové upozornenia",
|
"Enable web notifications": "Povoliť webové upozornenia",
|
||||||
"`x` uploaded a video": "`x` nahral(a) video"
|
"`x` uploaded a video": "`x` nahral(a) video",
|
||||||
|
"generic_views_count_0": "{{count}} zhliadnutie",
|
||||||
|
"generic_views_count_1": "{{count}} zhliadnutia",
|
||||||
|
"generic_views_count_2": "{{count}} zhliadnutí",
|
||||||
|
"generic_subscribers_count_0": "{{count}} odberateľ",
|
||||||
|
"generic_subscribers_count_1": "{{count}} odberatelia",
|
||||||
|
"generic_subscribers_count_2": "{{count}} odberateľov",
|
||||||
|
"Shared `x` ago": "Zverejnené pred `x`",
|
||||||
|
"generic_playlists_count_0": "{{count}} playlist",
|
||||||
|
"generic_playlists_count_1": "{{count}} playlisty",
|
||||||
|
"generic_playlists_count_2": "{{count}} playlistov",
|
||||||
|
"generic_videos_count_0": "{{count}} video",
|
||||||
|
"generic_videos_count_1": "{{count}} videá",
|
||||||
|
"generic_videos_count_2": "{{count}} videí",
|
||||||
|
"generic_subscriptions_count_0": "{{count}} odber",
|
||||||
|
"generic_subscriptions_count_1": "{{count}} odbery",
|
||||||
|
"generic_subscriptions_count_2": "{{count}} odberov",
|
||||||
|
"Authorize token for `x`?": "Autorizovať token pre `x`?",
|
||||||
|
"View playlist on YouTube": "Zobraziť playlist na YouTube"
|
||||||
}
|
}
|
||||||
|
|||||||
507
locales/sl.json
Normal file
507
locales/sl.json
Normal file
@@ -0,0 +1,507 @@
|
|||||||
|
{
|
||||||
|
"No": "Ne",
|
||||||
|
"Subscribe": "Naroči se",
|
||||||
|
"View playlist on YouTube": "Ogled seznama predvajanja v YouTubu",
|
||||||
|
"last": "zadnji",
|
||||||
|
"Next page": "Naslednja stran",
|
||||||
|
"Previous page": "Prejšnja stran",
|
||||||
|
"Clear watch history?": "Izbrisati zgodovino ogledov?",
|
||||||
|
"New password": "Novo geslo",
|
||||||
|
"New passwords must match": "Nova gesla se morajo ujemati",
|
||||||
|
"Cannot change password for Google accounts": "Ni mogoče spremeniti gesla za račune Google",
|
||||||
|
"Authorize token?": "Naj odobrim žeton?",
|
||||||
|
"Yes": "Da",
|
||||||
|
"Import and Export Data": "Uvoz in izvoz podatkov",
|
||||||
|
"Import": "Uvozi",
|
||||||
|
"Import Invidious data": "Uvozi Invidious JSON podatke",
|
||||||
|
"Import YouTube subscriptions": "Uvozi YouTube/OPML naročnine",
|
||||||
|
"Import FreeTube subscriptions (.db)": "Uvozi FreeTube (.db) naročnine",
|
||||||
|
"Import NewPipe data (.zip)": "Uvozi NewPipe (.zip) podatke",
|
||||||
|
"Export": "Izvozi",
|
||||||
|
"Export subscriptions as OPML": "Izvozi naročnine kot OPML",
|
||||||
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Izvozi naročnine kot OPML (za NewPipe in FreeTube)",
|
||||||
|
"Log in": "Prijava",
|
||||||
|
"Log in/register": "Prijava/registracija",
|
||||||
|
"Log in with Google": "Prijavi se z Googlom",
|
||||||
|
"User ID": "ID uporabnika",
|
||||||
|
"Password": "Geslo",
|
||||||
|
"Time (h:mm:ss):": "Čas (h:mm:ss):",
|
||||||
|
"Text CAPTCHA": "Besedilo CAPTCHA",
|
||||||
|
"source": "izvorna koda",
|
||||||
|
"Image CAPTCHA": "Slika CAPTCHA",
|
||||||
|
"Sign In": "Prijavi se",
|
||||||
|
"Register": "Registriraj se",
|
||||||
|
"E-mail": "E-pošta",
|
||||||
|
"Google verification code": "Googlova koda za preverjanje",
|
||||||
|
"Preferences": "Nastavitve",
|
||||||
|
"preferences_video_loop_label": "Vedno v zanki: ",
|
||||||
|
"preferences_autoplay_label": "Samodejno predvajanje: ",
|
||||||
|
"preferences_continue_autoplay_label": "Samodejno predvajanje naslednjega videoposnetka: ",
|
||||||
|
"preferences_listen_label": "Privzeto poslušaj: ",
|
||||||
|
"preferences_local_label": "Proxy za videoposnetke: ",
|
||||||
|
"preferences_speed_label": "Privzeta hitrost: ",
|
||||||
|
"preferences_quality_label": "Prednostna kakovost videoposnetka: ",
|
||||||
|
"preferences_quality_option_hd720": "HD720",
|
||||||
|
"preferences_quality_dash_option_best": "najboljša",
|
||||||
|
"preferences_quality_dash_option_4320p": "4320p",
|
||||||
|
"preferences_quality_dash_option_1440p": "1440p",
|
||||||
|
"preferences_quality_dash_option_1080p": "1080p",
|
||||||
|
"preferences_quality_dash_option_720p": "720p",
|
||||||
|
"preferences_quality_dash_option_480p": "480p",
|
||||||
|
"preferences_quality_dash_option_360p": "360p",
|
||||||
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
|
"preferences_volume_label": "Glasnost predvajalnika: ",
|
||||||
|
"reddit": "Reddit",
|
||||||
|
"preferences_player_style_label": "Slog predvajalnika: ",
|
||||||
|
"dark": "temna",
|
||||||
|
"light": "svetla",
|
||||||
|
"preferences_thin_mode_label": "Tanki način: ",
|
||||||
|
"preferences_automatic_instance_redirect_label": "Samodejna preusmeritev (na redirect.invidious.io): ",
|
||||||
|
"preferences_annotations_subscribed_label": "Privzeto prikazati opombe za naročene kanale? ",
|
||||||
|
"Redirect homepage to feed: ": "Preusmeri domačo stran na vir: ",
|
||||||
|
"preferences_max_results_label": "Število videoposnetkov, prikazanih v viru: ",
|
||||||
|
"preferences_sort_label": "Razvrsti videoposnetke po: ",
|
||||||
|
"published": "datumu objave",
|
||||||
|
"published - reverse": "datumu objave - obratno",
|
||||||
|
"alphabetically": "abecednem vrstnem redu",
|
||||||
|
"alphabetically - reverse": "po abecednem vrstnem redu - obratno",
|
||||||
|
"channel name": "imenu kanala",
|
||||||
|
"channel name - reverse": "imenu kanala - obratno",
|
||||||
|
"Only show latest video from channel: ": "Pokaži samo najnovejši videoposnetek iz kanala: ",
|
||||||
|
"Only show latest unwatched video from channel: ": "Pokaži samo najnovejši še neogledani videoposnetek iz kanala: ",
|
||||||
|
"preferences_unseen_only_label": "Pokaži samo neogledane: ",
|
||||||
|
"preferences_notifications_only_label": "Pokaži samo obvestila (če obstajajo): ",
|
||||||
|
"preferences_category_data": "Nastavitve podatkov",
|
||||||
|
"Clear watch history": "Počisti zgodovino ogledov",
|
||||||
|
"Import/export data": "Uvoz/izvoz podatkov",
|
||||||
|
"Change password": "Spremeni geslo",
|
||||||
|
"Watch history": "Oglej si zgodovino",
|
||||||
|
"Delete account": "Izbriši račun",
|
||||||
|
"preferences_category_admin": "Skrbniške nastavitve",
|
||||||
|
"preferences_default_home_label": "Privzeta domača stran: ",
|
||||||
|
"preferences_feed_menu_label": "Meni vira: ",
|
||||||
|
"Top enabled: ": "Vrh omogočen: ",
|
||||||
|
"CAPTCHA enabled: ": "CAPTCHA omogočeni: ",
|
||||||
|
"Login enabled: ": "Prijava je omogočena: ",
|
||||||
|
"Registration enabled: ": "Registracija je omogočena: ",
|
||||||
|
"Token manager": "Upravitelj žetonov",
|
||||||
|
"Token": "Žeton",
|
||||||
|
"tokens_count_0": "{{count}} žeton",
|
||||||
|
"tokens_count_1": "{{count}} žetona",
|
||||||
|
"tokens_count_2": "{{count}} žetoni",
|
||||||
|
"tokens_count_3": "{{count}} žetonov",
|
||||||
|
"Import/export": "Uvoz/izvoz",
|
||||||
|
"unsubscribe": "odjava",
|
||||||
|
"revoke": "prekliči",
|
||||||
|
"search": "iskanje",
|
||||||
|
"Log out": "Odjava",
|
||||||
|
"Released under the AGPLv3 on Github.": "Objavljeno pod licenco AGPLv3 na GitHubu.",
|
||||||
|
"Trending": "Trendi",
|
||||||
|
"Private": "Zasebno",
|
||||||
|
"View all playlists": "Oglej si vse sezname predvajanja",
|
||||||
|
"Updated `x` ago": "Posodobljeno pred `x`",
|
||||||
|
"Delete playlist `x`?": "Brisanje seznama predvajanja `x`?",
|
||||||
|
"Delete playlist": "Izbriši seznam predvajanja",
|
||||||
|
"Title": "Naslov",
|
||||||
|
"Playlist privacy": "Zasebnost seznama predvajanja",
|
||||||
|
"Editing playlist `x`": "Urejanje seznama predvajanja `x`",
|
||||||
|
"Show more": "Pokaži več",
|
||||||
|
"Switch Invidious Instance": "Preklopi Invidious instanco",
|
||||||
|
"search_message_change_filters_or_query": "Poskusi razširiti iskalno poizvedbo in/ali spremeniti filtre.",
|
||||||
|
"search_message_use_another_instance": " Lahko tudi <a href=\"`x`\">iščeš v drugi istanci</a>.",
|
||||||
|
"Wilson score: ": "Wilsonov rezultat: ",
|
||||||
|
"Engagement: ": "Sodelovanje: ",
|
||||||
|
"Blacklisted regions: ": "Regije na seznamu nedovoljenih: ",
|
||||||
|
"Shared `x`": "V skupni rabi od: `x`",
|
||||||
|
"Premieres `x`": "Premiere `x`",
|
||||||
|
"View YouTube comments": "Oglej si YouTube komentarje",
|
||||||
|
"View more comments on Reddit": "Prikaži več komentarjev na Reddit",
|
||||||
|
"View `x` comments": {
|
||||||
|
"([^.,0-9]|^)1([^.,0-9]|$)": "Poglej `x` komentar",
|
||||||
|
"": "Poglej `x` komentarjev"
|
||||||
|
},
|
||||||
|
"Quota exceeded, try again in a few hours": "Kvota je presežena, poskusi znova čez nekaj ur",
|
||||||
|
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Ne morem se prijaviti, preveri, ali je vklopljeno dvofaktorsko preverjanje pristnosti (avtentikator ali SMS).",
|
||||||
|
"Please sign in using 'Log in with Google'": "Prijavi se z uporabo »Prijava z Googlom«",
|
||||||
|
"Password cannot be empty": "Geslo ne sme biti prazno",
|
||||||
|
"`x` ago": "`x` nazaj",
|
||||||
|
"Load more": "Naloži več",
|
||||||
|
"comments_points_count_0": "{{count}} točka",
|
||||||
|
"comments_points_count_1": "{{count}} točki",
|
||||||
|
"comments_points_count_2": "{{count}} točke",
|
||||||
|
"comments_points_count_3": "{{count}} točk",
|
||||||
|
"Hidden field \"token\" is a required field": "Skrito polje »žeton« je zahtevano polje",
|
||||||
|
"Erroneous challenge": "Napačen izziv",
|
||||||
|
"English": "angleščina",
|
||||||
|
"English (United States)": "angleščina (Združene države)",
|
||||||
|
"Albanian": "albanščina",
|
||||||
|
"Amharic": "amharščina",
|
||||||
|
"Azerbaijani": "azerbajdžanščina",
|
||||||
|
"Bangla": "bengalščina",
|
||||||
|
"Belarusian": "beloruščina",
|
||||||
|
"Burmese": "birmanščina",
|
||||||
|
"Cebuano": "cebuanščina",
|
||||||
|
"Chinese (Hong Kong)": "kitajščina (Hongkong)",
|
||||||
|
"Chinese (Simplified)": "kitajščina (poenostavljena)",
|
||||||
|
"Chinese (Taiwan)": "kitajščina (Tajvan)",
|
||||||
|
"Corsican": "korzijščina",
|
||||||
|
"Croatian": "hrvaščina",
|
||||||
|
"Danish": "danščina",
|
||||||
|
"Dutch": "nizozemščina",
|
||||||
|
"Estonian": "estonščina",
|
||||||
|
"Filipino": "filipinščina",
|
||||||
|
"Finnish": "finščina",
|
||||||
|
"French": "francoščina",
|
||||||
|
"French (auto-generated)": "francoščina (samodejno ustvarjeno)",
|
||||||
|
"Georgian": "gruzinščina",
|
||||||
|
"German": "nemščina",
|
||||||
|
"Greek": "grščina",
|
||||||
|
"Gujarati": "gudžaratščina",
|
||||||
|
"Haitian Creole": "haitijska kreolščina",
|
||||||
|
"Hausa": "havščina",
|
||||||
|
"Hawaiian": "havajščina",
|
||||||
|
"Hmong": "hmonščina",
|
||||||
|
"Hungarian": "madžarščina",
|
||||||
|
"Icelandic": "islandščina",
|
||||||
|
"Igbo": "igbo",
|
||||||
|
"Interlingue": "interlingua",
|
||||||
|
"Italian (auto-generated)": "italijanščina (samodejno ustvarjeno)",
|
||||||
|
"Japanese": "japonščina",
|
||||||
|
"Japanese (auto-generated)": "japonščina (samodejno ustvarjeno)",
|
||||||
|
"Khmer": "kmerščina",
|
||||||
|
"Korean": "korejščina",
|
||||||
|
"Korean (auto-generated)": "korejščina (samodejno ustvarjeno)",
|
||||||
|
"Kurdish": "kurdščina",
|
||||||
|
"Kannada": "kanadejščina",
|
||||||
|
"Latvian": "latvijščina",
|
||||||
|
"Lithuanian": "litovščina",
|
||||||
|
"Luxembourgish": "luksemburščina",
|
||||||
|
"Macedonian": "makedonščina",
|
||||||
|
"Malagasy": "malgaščina",
|
||||||
|
"Malay": "malajščina",
|
||||||
|
"Nepali": "nepalščina",
|
||||||
|
"Norwegian Bokmål": "norveščina bokmal",
|
||||||
|
"Nyanja": "njanščina",
|
||||||
|
"Punjabi": "pandžabščina",
|
||||||
|
"Romanian": "romunščina",
|
||||||
|
"Russian": "ruščina",
|
||||||
|
"Samoan": "samoanščina",
|
||||||
|
"Scottish Gaelic": "škotska galščina",
|
||||||
|
"Shona": "šonaščina",
|
||||||
|
"Sundanese": "sudanščina",
|
||||||
|
"Thai": "tajščina",
|
||||||
|
"Turkish": "turščina",
|
||||||
|
"Turkish (auto-generated)": "turščina (samodejno ustvarjeno)",
|
||||||
|
"Ukrainian": "ukrajinščina",
|
||||||
|
"Urdu": "urdujščina",
|
||||||
|
"Telugu": "telugu",
|
||||||
|
"Vietnamese": "vietnamščina",
|
||||||
|
"Welsh": "valižanščina",
|
||||||
|
"Western Frisian": "zahodnofrizijščina",
|
||||||
|
"Yiddish": "jidiš",
|
||||||
|
"Yoruba": "joruba",
|
||||||
|
"Xhosa": "xhosa",
|
||||||
|
"generic_count_years_0": "{{count}} letom",
|
||||||
|
"generic_count_years_1": "{{count}} leti",
|
||||||
|
"generic_count_years_2": "{{count}} leti",
|
||||||
|
"generic_count_years_3": "{{count}} leti",
|
||||||
|
"generic_count_days_0": "{{count}} dnevom",
|
||||||
|
"generic_count_days_1": "{{count}} dnevi",
|
||||||
|
"generic_count_days_2": "{{count}} dnevi",
|
||||||
|
"generic_count_days_3": "{{count}} dnevi",
|
||||||
|
"generic_count_hours_0": "{{count}} uro",
|
||||||
|
"generic_count_hours_1": "{{count}} urami",
|
||||||
|
"generic_count_hours_2": "{{count}} urami",
|
||||||
|
"generic_count_hours_3": "{{count}} urami",
|
||||||
|
"generic_count_minutes_0": "{{count}} minuto",
|
||||||
|
"generic_count_minutes_1": "{{count}} minutami",
|
||||||
|
"generic_count_minutes_2": "{{count}} minutami",
|
||||||
|
"generic_count_minutes_3": "{{count}} minutami",
|
||||||
|
"Search": "Iskanje",
|
||||||
|
"Top": "Vrh",
|
||||||
|
"About": "O aplikaciji",
|
||||||
|
"%A %B %-d, %Y": "%A %-d %B %Y",
|
||||||
|
"Audio mode": "Avdio način",
|
||||||
|
"Videos": "Videoposnetki",
|
||||||
|
"search_filters_date_label": "Datum nalaganja",
|
||||||
|
"search_filters_date_option_today": "Danes",
|
||||||
|
"search_filters_date_option_week": "Ta teden",
|
||||||
|
"search_filters_type_label": "Vrsta",
|
||||||
|
"search_filters_type_option_all": "Katerakoli vrsta",
|
||||||
|
"search_filters_type_option_playlist": "Seznami predvajanja",
|
||||||
|
"search_filters_features_option_subtitles": "Podnapisi/CC",
|
||||||
|
"search_filters_features_option_location": "Lokacija",
|
||||||
|
"footer_donate_page": "Prispevaj",
|
||||||
|
"footer_documentation": "Dokumentacija",
|
||||||
|
"footer_original_source_code": "Izvirna izvorna koda",
|
||||||
|
"none": "ni",
|
||||||
|
"videoinfo_started_streaming_x_ago": "Začetek pretakanja `x` nazaj",
|
||||||
|
"videoinfo_watch_on_youTube": "Oglej si v YouTubu",
|
||||||
|
"user_saved_playlists": "`x` shranjenih seznamov predvajanja",
|
||||||
|
"Video unavailable": "Video ni na voljo",
|
||||||
|
"preferences_save_player_pos_label": "Shrani položaj predvajanja: ",
|
||||||
|
"crash_page_you_found_a_bug": "Videti je, da si v Invidiousu našel hrošča!",
|
||||||
|
"crash_page_read_the_faq": "prebral/a <a href=\"`x`\">Pogosto zastavljena vprašanja (FAQ)</a>",
|
||||||
|
"generic_videos_count_0": "{{count}} video",
|
||||||
|
"generic_videos_count_1": "{{count}} videa",
|
||||||
|
"generic_videos_count_2": "{{count}} videi",
|
||||||
|
"generic_videos_count_3": "{{count}} videov",
|
||||||
|
"generic_views_count_0": "{{count}} ogled",
|
||||||
|
"generic_views_count_1": "{{count}} ogleda",
|
||||||
|
"generic_views_count_2": "{{count}} ogledi",
|
||||||
|
"generic_views_count_3": "{{count}} ogledov",
|
||||||
|
"generic_playlists_count_0": "{{count}} seznam predvajanja",
|
||||||
|
"generic_playlists_count_1": "{{count}} seznama predvajanja",
|
||||||
|
"generic_playlists_count_2": "{{count}} seznami predvajanja",
|
||||||
|
"generic_playlists_count_3": "{{count}} seznamov predvajanja",
|
||||||
|
"generic_subscribers_count_0": "{{count}} naročnik",
|
||||||
|
"generic_subscribers_count_1": "{{count}} naročnika",
|
||||||
|
"generic_subscribers_count_2": "{{count}} naročniki",
|
||||||
|
"generic_subscribers_count_3": "{{count}} naročnikov",
|
||||||
|
"generic_subscriptions_count_0": "{{count}} naročnina",
|
||||||
|
"generic_subscriptions_count_1": "{{count}} naročnini",
|
||||||
|
"generic_subscriptions_count_2": "{{count}} naročnine",
|
||||||
|
"generic_subscriptions_count_3": "{{count}} naročnin",
|
||||||
|
"LIVE": "V ŽIVO",
|
||||||
|
"Shared `x` ago": "Deljeno pred `x`",
|
||||||
|
"View channel on YouTube": "Ogled kanala v YouTubu",
|
||||||
|
"newest": "najnovejši",
|
||||||
|
"Unsubscribe": "Odjavi se",
|
||||||
|
"Authorize token for `x`?": "Odobriti žeton za `x`?",
|
||||||
|
"Import NewPipe subscriptions (.json)": "Uvozi NewPipe (.json) naročnine",
|
||||||
|
"History": "Zgodovina",
|
||||||
|
"JavaScript license information": "Podatki o licenci JavaScript",
|
||||||
|
"oldest": "najstarejši",
|
||||||
|
"popular": "priljubljen",
|
||||||
|
"Export data as JSON": "Izvozi Invidious podatke kot JSON",
|
||||||
|
"Delete account?": "Izbrisati račun?",
|
||||||
|
"An alternative front-end to YouTube": "Alternativni vmesnik za YouTube",
|
||||||
|
"preferences_category_player": "Nastavitve predvajalnika",
|
||||||
|
"preferences_continue_label": "Privzeto predvajaj naslednjega: ",
|
||||||
|
"preferences_watch_history_label": "Omogoči zgodovino ogledov: ",
|
||||||
|
"preferences_quality_option_medium": "srednja",
|
||||||
|
"preferences_quality_option_dash": "DASH (prilagodljiva kakovost)",
|
||||||
|
"preferences_quality_option_small": "majhna",
|
||||||
|
"preferences_quality_dash_option_worst": "najslabša",
|
||||||
|
"preferences_quality_dash_label": "Prednostna kakovost videoposnetkov DASH: ",
|
||||||
|
"preferences_comments_label": "Privzeti komentarji: ",
|
||||||
|
"preferences_quality_dash_option_auto": "samodejna",
|
||||||
|
"preferences_quality_dash_option_2160p": "2160p",
|
||||||
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
|
"youtube": "YouTube",
|
||||||
|
"invidious": "Invidious",
|
||||||
|
"preferences_vr_mode_label": "Interaktivni videoposnetki na 360 stopinj (zahteva WebGL): ",
|
||||||
|
"preferences_captions_label": "Privzeti napisi: ",
|
||||||
|
"Fallback captions: ": "Pomožni napisi: ",
|
||||||
|
"preferences_extend_desc_label": "Samodejno razširi opis videoposnetka: ",
|
||||||
|
"preferences_related_videos_label": "Prikaži povezane videoposnetke: ",
|
||||||
|
"preferences_annotations_label": "Privzeto prikaži opombe: ",
|
||||||
|
"preferences_category_visual": "Vizualne nastavitve",
|
||||||
|
"preferences_region_label": "Država vsebine: ",
|
||||||
|
"Dark mode: ": "Temni način: ",
|
||||||
|
"preferences_dark_mode_label": "Tema: ",
|
||||||
|
"preferences_category_misc": "Različne nastavitve",
|
||||||
|
"preferences_category_subscription": "Nastavitve naročnine",
|
||||||
|
"Unlisted": "Nerazporejeno",
|
||||||
|
"Enable web notifications": "Omogoči spletna obvestila",
|
||||||
|
"`x` is live": "`x` je v živo",
|
||||||
|
"Manage subscriptions": "Upravljaj naročnine",
|
||||||
|
"Manage tokens": "Upravljaj žetone",
|
||||||
|
"Subscription manager": "Upravitelj naročnin",
|
||||||
|
"`x` uploaded a video": "`x` je naložil/a videoposnetek",
|
||||||
|
"preferences_show_nick_label": "Prikaži vzdevek na vrhu: ",
|
||||||
|
"search_message_no_results": "Ni zadetkov.",
|
||||||
|
"Save preferences": "Shrani nastavitve",
|
||||||
|
"Subscriptions": "Naročnine",
|
||||||
|
"Report statistics: ": "Poročilo o statistiki: ",
|
||||||
|
"subscriptions_unseen_notifs_count_0": "{{count}} neogledano obvestilo",
|
||||||
|
"subscriptions_unseen_notifs_count_1": "{{count}} neogledani obvestili",
|
||||||
|
"subscriptions_unseen_notifs_count_2": "{{count}} neogledana obvestila",
|
||||||
|
"subscriptions_unseen_notifs_count_3": "{{count}} neogledanih obvestil",
|
||||||
|
"View JavaScript license information.": "Oglej si informacije o licenci za JavaScript.",
|
||||||
|
"Show less": "Pokaži manj",
|
||||||
|
"Watch on YouTube": "Oglej si v YouTubu",
|
||||||
|
"Source available here.": "Izvorna koda na voljo tukaj.",
|
||||||
|
"License: ": "Licenca: ",
|
||||||
|
"View privacy policy.": "Oglej si pravilnik o zasebnosti.",
|
||||||
|
"Public": "Javno",
|
||||||
|
"Create playlist": "Ustvari seznam predvajanja",
|
||||||
|
"Hide annotations": "Skrij opombe",
|
||||||
|
"Show annotations": "Pokaži opombe",
|
||||||
|
"Genre: ": "Žanr: ",
|
||||||
|
"Family friendly? ": "Družinam prijazno? ",
|
||||||
|
"Whitelisted regions: ": "Regije na seznamu dovoljenih: ",
|
||||||
|
"Premieres in `x`": "Premiere v `x`",
|
||||||
|
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Živjo! Izgleda, da imaš izklopljene JavaScripte . Klikni tukaj, če si želiš ogledati komentarje, vendar vedi, da bo lahko nalaganje trajajo nekoliko dlje.",
|
||||||
|
"Show replies": "Pokaži odgovore",
|
||||||
|
"Erroneous CAPTCHA": "Napačna CAPTCHA",
|
||||||
|
"User ID is a required field": "ID uporabnika je obvezno polje",
|
||||||
|
"Password is a required field": "Geslo je obvezno polje",
|
||||||
|
"Wrong username or password": "Napačno uporabniško ime ali geslo",
|
||||||
|
"Password cannot be longer than 55 characters": "Geslo ne sme biti daljše od 55 znakov",
|
||||||
|
"channel:`x`": "kanal: `x`",
|
||||||
|
"Could not fetch comments": "Ni bilo mogoče pridobiti komentarjev",
|
||||||
|
"Could not pull trending pages.": "Ni bilo mogoče povleči trendovskih strani.",
|
||||||
|
"Please log in": "Prosim, prijavi se",
|
||||||
|
"Playlist does not exist.": "Seznam predvajanja ne obstaja.",
|
||||||
|
"Incorrect password": "Napačno geslo",
|
||||||
|
"View Reddit comments": "Oglej si komentarje na Redditu",
|
||||||
|
"This channel does not exist.": "Ta kanal ne obstaja.",
|
||||||
|
"Hide replies": "Skrij odgovore",
|
||||||
|
"Invalid TFA code": "Neveljavna koda TFA",
|
||||||
|
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Prijava ni uspela. To je lahko zato, ker za tvoj račun ni vklopljeno dvofaktorsko preverjanje pristnosti.",
|
||||||
|
"Invidious Private Feed for `x`": "Invidious zasebni vir za `x`",
|
||||||
|
"Deleted or invalid channel": "Izbrisan ali neveljaven kanal",
|
||||||
|
"Empty playlist": "Prazen seznam predvajanja",
|
||||||
|
"No such user": "Ni tega uporabnika",
|
||||||
|
"Token is expired, please try again": "Žeton je potekel, poskusi znova",
|
||||||
|
"English (United Kingdom)": "angleščina (Združeno kraljestvo)",
|
||||||
|
"Wrong answer": "Napačen odgovor",
|
||||||
|
"CAPTCHA is a required field": "CAPTCHA je obvezno polje",
|
||||||
|
"Could not get channel info.": "Ni bilo mogoče dobiti informacij o kanalu.",
|
||||||
|
"comments_view_x_replies_0": "Poglej {{count}} odgovor",
|
||||||
|
"comments_view_x_replies_1": "Poglej {{count}} odgovora",
|
||||||
|
"comments_view_x_replies_2": "Poglej {{count}} odgovore",
|
||||||
|
"comments_view_x_replies_3": "Poglej {{count}} odgovorov",
|
||||||
|
"Could not create mix.": "Ni bilo mogoče ustvariti mixa.",
|
||||||
|
"Not a playlist.": "Ni seznam predvajanja.",
|
||||||
|
"Hidden field \"challenge\" is a required field": "Skrito polje »izziv« je obvezno polje",
|
||||||
|
"Erroneous token": "Napačen žeton",
|
||||||
|
"Afrikaans": "afrikanščina",
|
||||||
|
"Arabic": "arabščina",
|
||||||
|
"Armenian": "armenščina",
|
||||||
|
"English (auto-generated)": "angleščina (samodejno ustvarjeno)",
|
||||||
|
"Bulgarian": "bolgarščina",
|
||||||
|
"Catalan": "katalonščina",
|
||||||
|
"Cantonese (Hong Kong)": "kantonščina (Hongkong)",
|
||||||
|
"Chinese (Traditional)": "kitajščina (tradicionalna)",
|
||||||
|
"Basque": "baskovščina",
|
||||||
|
"Czech": "češčina",
|
||||||
|
"Bosnian": "bosanščina",
|
||||||
|
"Chinese": "kitajščina",
|
||||||
|
"Chinese (China)": "kitajščina (Kitajska)",
|
||||||
|
"Dutch (auto-generated)": "nizozemščina (samodejno ustvarjeno)",
|
||||||
|
"Esperanto": "esperanto",
|
||||||
|
"Galician": "galicijščina",
|
||||||
|
"German (auto-generated)": "nemščina (samodejno ustvarjeno)",
|
||||||
|
"Hebrew": "hebrejščina",
|
||||||
|
"Malayalam": "malajalamščina",
|
||||||
|
"Hindi": "hindijščina",
|
||||||
|
"Indonesian": "indonezijščina",
|
||||||
|
"Kazakh": "kazahstanščina",
|
||||||
|
"Indonesian (auto-generated)": "indonezijščina (samodejno generirano)",
|
||||||
|
"Irish": "irščina",
|
||||||
|
"Persian": "perzijščina",
|
||||||
|
"Slovak": "slovaščina",
|
||||||
|
"Italian": "italijanščina",
|
||||||
|
"Maori": "maorščina",
|
||||||
|
"Portuguese": "portugalščina",
|
||||||
|
"Javanese": "javanščina",
|
||||||
|
"Kyrgyz": "kirgiščina",
|
||||||
|
"Lao": "laoščina",
|
||||||
|
"Latin": "latinščina",
|
||||||
|
"Mongolian": "mongolščina",
|
||||||
|
"Portuguese (auto-generated)": "portugalščina (samodejno ustvarjeno)",
|
||||||
|
"Sindhi": "sindščina",
|
||||||
|
"Maltese": "malteščina",
|
||||||
|
"Marathi": "maratščina",
|
||||||
|
"Pashto": "paštu",
|
||||||
|
"Polish": "poljščina",
|
||||||
|
"Portuguese (Brazil)": "portugalščina (Brazilija)",
|
||||||
|
"Fallback comments: ": "Nadomestni komentarji: ",
|
||||||
|
"Gaming": "Igralništvo",
|
||||||
|
"Russian (auto-generated)": "ruščina (samodejno ustvarjeno)",
|
||||||
|
"Serbian": "srbščina",
|
||||||
|
"Sinhala": "singalščina",
|
||||||
|
"Slovenian": "slovenščina",
|
||||||
|
"Somali": "somalijščina",
|
||||||
|
"Spanish": "španščina",
|
||||||
|
"Southern Sotho": "južni sotho",
|
||||||
|
"Spanish (auto-generated)": "španščina (samodejno ustvarjeno)",
|
||||||
|
"Spanish (Mexico)": "španščina (Mehika)",
|
||||||
|
"Spanish (Latin America)": "španščina (Latinska Amerika)",
|
||||||
|
"Spanish (Spain)": "španščina (Španija)",
|
||||||
|
"Tajik": "tadžiščina",
|
||||||
|
"Tamil": "tamilščina",
|
||||||
|
"generic_count_weeks_0": "{{count}} tednom",
|
||||||
|
"generic_count_weeks_1": "{{count}} tedni",
|
||||||
|
"generic_count_weeks_2": "{{count}} tedni",
|
||||||
|
"generic_count_weeks_3": "{{count}} tedni",
|
||||||
|
"Swahili": "svahilščina",
|
||||||
|
"Swedish": "švedščina",
|
||||||
|
"Vietnamese (auto-generated)": "vietnamščina (samodejno ustvarjeno)",
|
||||||
|
"generic_count_months_0": "{{count}} mesecem",
|
||||||
|
"generic_count_months_1": "{{count}} meseci",
|
||||||
|
"generic_count_months_2": "{{count}} meseci",
|
||||||
|
"generic_count_months_3": "{{count}} meseci",
|
||||||
|
"Uzbek": "uzbeščina",
|
||||||
|
"Zulu": "zulujščina",
|
||||||
|
"generic_count_seconds_0": "{{count}} sekundo",
|
||||||
|
"generic_count_seconds_1": "{{count}} sekundami",
|
||||||
|
"generic_count_seconds_2": "{{count}} sekundami",
|
||||||
|
"generic_count_seconds_3": "{{count}} sekundami",
|
||||||
|
"Popular": "Priljubljeni",
|
||||||
|
"Music": "Glasba",
|
||||||
|
"Movies": "Filmi",
|
||||||
|
"YouTube comment permalink": "Stalna povezava za komentar na YouTubu",
|
||||||
|
"search_filters_title": "Filtri",
|
||||||
|
"preferences_locale_label": "Jezik: ",
|
||||||
|
"Rating: ": "Ocena: ",
|
||||||
|
"Default": "Privzeto",
|
||||||
|
"News": "Novice",
|
||||||
|
"Download as: ": "Prenesi kot: ",
|
||||||
|
"(edited)": "(urejeno)",
|
||||||
|
"View as playlist": "Poglej kot seznam predvajanja",
|
||||||
|
"Download": "Prenesi",
|
||||||
|
"permalink": "stalna povezava",
|
||||||
|
"`x` marked it with a ❤": "`x` ga je označil/a z ❤",
|
||||||
|
"Community": "Skupnost",
|
||||||
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
|
"Video mode": "Video način",
|
||||||
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
|
"search_filters_features_option_three_d": "3D",
|
||||||
|
"Playlists": "Seznami predvajanja",
|
||||||
|
"search_filters_date_option_none": "Katerikoli datum",
|
||||||
|
"search_filters_date_option_month": "Ta mesec",
|
||||||
|
"search_filters_date_option_year": "Letos",
|
||||||
|
"search_filters_type_option_movie": "Film",
|
||||||
|
"search_filters_duration_option_long": "Dolg (> 20 minut)",
|
||||||
|
"search_filters_features_label": "Lastnosti",
|
||||||
|
"search_filters_features_option_four_k": "4K",
|
||||||
|
"search_filters_features_option_hdr": "HDR",
|
||||||
|
"next_steps_error_message_refresh": "Osveži",
|
||||||
|
"search_filters_date_option_hour": "Zadnja ura",
|
||||||
|
"search_filters_features_option_purchased": "Kupljeno",
|
||||||
|
"search_filters_sort_label": "Razvrsti po",
|
||||||
|
"search_filters_sort_option_views": "številu ogledov",
|
||||||
|
"Current version: ": "Trenutna različica: ",
|
||||||
|
"search_filters_features_option_live": "V živo",
|
||||||
|
"search_filters_features_option_hd": "HD",
|
||||||
|
"search_filters_type_option_channel": "Kanal",
|
||||||
|
"search_filters_type_option_show": "Pokaži",
|
||||||
|
"search_filters_duration_label": "Trajanje",
|
||||||
|
"search_filters_duration_option_none": "Poljubno trajanje",
|
||||||
|
"search_filters_duration_option_short": "Kratek (< 4 minute)",
|
||||||
|
"search_filters_duration_option_medium": "Srednji (4 - 20 minut)",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_sort_option_date": "datumu nalaganja",
|
||||||
|
"search_filters_type_option_video": "Videoposnetek",
|
||||||
|
"search_filters_sort_option_relevance": "ustreznosti",
|
||||||
|
"search_filters_sort_option_rating": "oceni",
|
||||||
|
"search_filters_apply_button": "Uporabi izbrane filtre",
|
||||||
|
"next_steps_error_message": "Po tem moraš poskusiti: ",
|
||||||
|
"next_steps_error_message_go_to_youtube": "Pojdi na YouTube",
|
||||||
|
"footer_source_code": "Izvorna koda",
|
||||||
|
"footer_modfied_source_code": "Spremenjena izvorna koda",
|
||||||
|
"user_created_playlists": "`x` ustvarjenih seznamov predvajanja",
|
||||||
|
"adminprefs_modified_source_code_url_label": "URL do shrambe spremenjene izvorne kode",
|
||||||
|
"videoinfo_youTube_embed_link": "Vdelati",
|
||||||
|
"videoinfo_invidious_embed_link": "Povezava za vdelavo",
|
||||||
|
"crash_page_switch_instance": "poskušal/a <a href=\"`x`\">uporabiti drugo instanco</a>",
|
||||||
|
"download_subtitles": "Podnapisi - `x` (.vtt)",
|
||||||
|
"crash_page_refresh": "poskušal/a <a href=\"`x`\">osvežiti stran</a>",
|
||||||
|
"crash_page_before_reporting": "Preden prijaviš napako, se prepričaj, da si:",
|
||||||
|
"crash_page_search_issue": "preiskal/a <a href=\"`x`\">obstoječe težave na GitHubu</a>",
|
||||||
|
"crash_page_report_issue": "Če nič od navedenega ni pomagalo, prosim <a href=\"`x`\">odpri novo težavo v GitHubu</a> (po možnosti v angleščini) in v svoje sporočilo vključi naslednje besedilo (tega besedila NE prevajaj):",
|
||||||
|
"Popular enabled: ": "Priljubljeni omogočeni: "
|
||||||
|
}
|
||||||
@@ -26,11 +26,11 @@
|
|||||||
"Tamil": "Tamilisht",
|
"Tamil": "Tamilisht",
|
||||||
"Telugu": "Telugu",
|
"Telugu": "Telugu",
|
||||||
"Vietnamese": "Vietnamisht",
|
"Vietnamese": "Vietnamisht",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "Drejtpërsëdrejti",
|
"search_filters_features_option_live": "Drejtpërsëdrejti",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "Vendndodhja",
|
"search_filters_features_option_location": "Vendndodhja",
|
||||||
"videoinfo_watch_on_youTube": "Shiheni në YouTube",
|
"videoinfo_watch_on_youTube": "Shiheni në YouTube",
|
||||||
"videoinfo_youTube_embed_link": "Trupëzojeni",
|
"videoinfo_youTube_embed_link": "Trupëzojeni",
|
||||||
"videoinfo_invidious_embed_link": "Lidhje Trupëzimi",
|
"videoinfo_invidious_embed_link": "Lidhje Trupëzimi",
|
||||||
@@ -127,7 +127,7 @@
|
|||||||
"Subscriptions": "Pajtime",
|
"Subscriptions": "Pajtime",
|
||||||
"search": "kërko",
|
"search": "kërko",
|
||||||
"Log out": "Dilni",
|
"Log out": "Dilni",
|
||||||
"Released under the AGPLv3 on Github.": "Hedhur në qarkullim në Github sipas licencës AGPLv3.",
|
"Released under the AGPLv3 on Github.": "Hedhur në qarkullim në GitHub sipas licencës AGPLv3.",
|
||||||
"Source available here.": "Burimi i passhëm që këtu.",
|
"Source available here.": "Burimi i passhëm që këtu.",
|
||||||
"View JavaScript license information.": "Shihni hollësi licence JavaScript.",
|
"View JavaScript license information.": "Shihni hollësi licence JavaScript.",
|
||||||
"View privacy policy.": "Shihni rregulla privatësie.",
|
"View privacy policy.": "Shihni rregulla privatësie.",
|
||||||
@@ -147,7 +147,6 @@
|
|||||||
"Show less": "Shfaq më pak",
|
"Show less": "Shfaq më pak",
|
||||||
"Watch on YouTube": "Shiheni në YouTube",
|
"Watch on YouTube": "Shiheni në YouTube",
|
||||||
"Switch Invidious Instance": "Ndërroni Instancë Invidious",
|
"Switch Invidious Instance": "Ndërroni Instancë Invidious",
|
||||||
"Broken? Try another Invidious Instance": "E prishur? Provoni një tjetër Instancë Invidious",
|
|
||||||
"Hide annotations": "Fshihi shënimet",
|
"Hide annotations": "Fshihi shënimet",
|
||||||
"Show annotations": "Shfaq shënime",
|
"Show annotations": "Shfaq shënime",
|
||||||
"License: ": "Licencë: ",
|
"License: ": "Licencë: ",
|
||||||
@@ -261,32 +260,32 @@
|
|||||||
"Audio mode": "Mënyrë për audion",
|
"Audio mode": "Mënyrë për audion",
|
||||||
"Playlists": "Luajlista",
|
"Playlists": "Luajlista",
|
||||||
"Community": "Bashkësi",
|
"Community": "Bashkësi",
|
||||||
"relevance": "Rëndësi",
|
"search_filters_sort_option_relevance": "Rëndësi",
|
||||||
"Video mode": "Mënyrë video",
|
"Video mode": "Mënyrë video",
|
||||||
"Videos": "Video",
|
"Videos": "Video",
|
||||||
"rating": "Vlerësim",
|
"search_filters_sort_option_rating": "Vlerësim",
|
||||||
"date": "Datë ngarkimi",
|
"search_filters_sort_option_date": "Datë ngarkimi",
|
||||||
"views": "Numër parjesh",
|
"search_filters_sort_option_views": "Numër parjesh",
|
||||||
"content_type": "Lloj",
|
"search_filters_type_label": "Lloj",
|
||||||
"duration": "Kohëzgjatje",
|
"search_filters_duration_label": "Kohëzgjatje",
|
||||||
"features": "Veçori",
|
"search_filters_features_label": "Veçori",
|
||||||
"sort": "Renditi Sipas",
|
"search_filters_sort_label": "Renditi Sipas",
|
||||||
"hour": "Orën e Fundit",
|
"search_filters_date_option_hour": "Orën e Fundit",
|
||||||
"today": "Sot",
|
"search_filters_date_option_today": "Sot",
|
||||||
"long": "E gjatë (> 20 minuta)",
|
"search_filters_duration_option_long": "E gjatë (> 20 minuta)",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "Titra/CC",
|
"search_filters_features_option_subtitles": "Titra/CC",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"week": "Këtë javë",
|
"search_filters_date_option_week": "Këtë javë",
|
||||||
"month": "Këtë muaj",
|
"search_filters_date_option_month": "Këtë muaj",
|
||||||
"year": "Këtë vit",
|
"search_filters_date_option_year": "Këtë vit",
|
||||||
"video": "Video",
|
"search_filters_type_option_video": "Video",
|
||||||
"channel": "Kanal",
|
"search_filters_type_option_channel": "Kanal",
|
||||||
"playlist": "Luajlistë",
|
"search_filters_type_option_playlist": "Luajlistë",
|
||||||
"movie": "Film",
|
"search_filters_type_option_movie": "Film",
|
||||||
"show": "Shfaqe",
|
"search_filters_type_option_show": "Shfaqe",
|
||||||
"short": "E shkurtër (< 4 minuta)",
|
"search_filters_duration_option_short": "E shkurtër (< 4 minuta)",
|
||||||
"purchased": "Të blera",
|
"search_filters_features_option_purchased": "Të blera",
|
||||||
"footer_modfied_source_code": "Kod Burim i ndryshuar",
|
"footer_modfied_source_code": "Kod Burim i ndryshuar",
|
||||||
"adminprefs_modified_source_code_url_label": "URL e depos së ndryshuar të kodit burim",
|
"adminprefs_modified_source_code_url_label": "URL e depos së ndryshuar të kodit burim",
|
||||||
"none": "asnjë",
|
"none": "asnjë",
|
||||||
@@ -370,8 +369,7 @@
|
|||||||
"Mongolian": "Mongolisht",
|
"Mongolian": "Mongolisht",
|
||||||
"Nepali": "Nepaleze",
|
"Nepali": "Nepaleze",
|
||||||
"Norwegian Bokmål": "Norvegjishte Bokmål",
|
"Norwegian Bokmål": "Norvegjishte Bokmål",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"filter": "Filtroji",
|
|
||||||
"Current version: ": "Versioni i tanishëm: ",
|
"Current version: ": "Versioni i tanishëm: ",
|
||||||
"next_steps_error_message": "Pas të cilës duhet të provoni të: ",
|
"next_steps_error_message": "Pas të cilës duhet të provoni të: ",
|
||||||
"next_steps_error_message_refresh": "Rifreskoje",
|
"next_steps_error_message_refresh": "Rifreskoje",
|
||||||
@@ -437,7 +435,7 @@
|
|||||||
"Spanish (Spain)": "Spanjisht (Spanjë)",
|
"Spanish (Spain)": "Spanjisht (Spanjë)",
|
||||||
"Turkish (auto-generated)": "Turqisht (të prodhuara automatikisht)",
|
"Turkish (auto-generated)": "Turqisht (të prodhuara automatikisht)",
|
||||||
"Vietnamese (auto-generated)": "Vietnamisht (të prodhuara automatikisht)",
|
"Vietnamese (auto-generated)": "Vietnamisht (të prodhuara automatikisht)",
|
||||||
"crash_page_search_issue": "kërkuar për <a href=\"`x`\">çështje ekzistuese në Github</a>",
|
"crash_page_search_issue": "kërkuar për <a href=\"`x`\">çështje ekzistuese në GitHub</a>",
|
||||||
"crash_page_report_issue": "Nëse asnjë nga sa më sipër s’ndihmoi, ju lutemi, <a href=\"`x`\">hapni një çështje në GitHub</a> (mundësisht në anglisht) dhe përfshini në mesazhin tuaj tekstin vijues (MOS e përktheni këtë tekst):",
|
"crash_page_report_issue": "Nëse asnjë nga sa më sipër s’ndihmoi, ju lutemi, <a href=\"`x`\">hapni një çështje në GitHub</a> (mundësisht në anglisht) dhe përfshini në mesazhin tuaj tekstin vijues (MOS e përktheni këtë tekst):",
|
||||||
"generic_subscriptions_count": "{{count}} pajtim",
|
"generic_subscriptions_count": "{{count}} pajtim",
|
||||||
"generic_subscriptions_count_plural": "{{count}} pajtime",
|
"generic_subscriptions_count_plural": "{{count}} pajtime",
|
||||||
@@ -448,5 +446,6 @@
|
|||||||
"Import YouTube subscriptions": "Importoni pajtime YouTube/OPML",
|
"Import YouTube subscriptions": "Importoni pajtime YouTube/OPML",
|
||||||
"Export data as JSON": "Eksportoji të dhënat Invidious si JSON",
|
"Export data as JSON": "Eksportoji të dhënat Invidious si JSON",
|
||||||
"preferences_vr_mode_label": "Video me ndërveprim 360 gradë (lyp WebGL): ",
|
"preferences_vr_mode_label": "Video me ndërveprim 360 gradë (lyp WebGL): ",
|
||||||
"Shared `x`": "Ndau me të tjerë `x`"
|
"Shared `x`": "Ndau me të tjerë `x`",
|
||||||
|
"search_filters_title": "Filtra"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,26 +131,25 @@
|
|||||||
"YouTube comment permalink": "YouTube komentar trajna veza",
|
"YouTube comment permalink": "YouTube komentar trajna veza",
|
||||||
"Audio mode": "Audio mod",
|
"Audio mode": "Audio mod",
|
||||||
"Playlists": "Plej liste",
|
"Playlists": "Plej liste",
|
||||||
"relevance": "Relevantnost",
|
"search_filters_sort_option_relevance": "Relevantnost",
|
||||||
"rating": "Ocene",
|
"search_filters_sort_option_rating": "Ocene",
|
||||||
"date": "Datum otpremanja",
|
"search_filters_sort_option_date": "Datum otpremanja",
|
||||||
"views": "Broj pregleda",
|
"search_filters_sort_option_views": "Broj pregleda",
|
||||||
"`x` marked it with a ❤": "`x` je označio/la ovo sa ❤",
|
"`x` marked it with a ❤": "`x` je označio/la ovo sa ❤",
|
||||||
"duration": "Trajanje",
|
"search_filters_duration_label": "Trajanje",
|
||||||
"features": "Karakteristike",
|
"search_filters_features_label": "Karakteristike",
|
||||||
"hour": "Poslednji sat",
|
"search_filters_date_option_hour": "Poslednji sat",
|
||||||
"week": "Ove sedmice",
|
"search_filters_date_option_week": "Ove sedmice",
|
||||||
"month": "Ovaj mesec",
|
"search_filters_date_option_month": "Ovaj mesec",
|
||||||
"year": "Ove godine",
|
"search_filters_date_option_year": "Ove godine",
|
||||||
"video": "Video",
|
"search_filters_type_option_video": "Video",
|
||||||
"playlist": "Plej lista",
|
"search_filters_type_option_playlist": "Plej lista",
|
||||||
"movie": "Film",
|
"search_filters_type_option_movie": "Film",
|
||||||
"long": "Dugo (> 20 minuta)",
|
"search_filters_duration_option_long": "Dugo (> 20 minuta)",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"creative_commons": "Creative Commons (Licenca)",
|
"search_filters_features_option_c_commons": "Creative Commons (Licenca)",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"hdr": "Video Visoke Rezolucije",
|
"search_filters_features_option_hdr": "Video Visoke Rezolucije",
|
||||||
"filter": "Filter",
|
|
||||||
"next_steps_error_message": "Nakon čega bi trebali probati: ",
|
"next_steps_error_message": "Nakon čega bi trebali probati: ",
|
||||||
"next_steps_error_message_go_to_youtube": "Idi na YouTube",
|
"next_steps_error_message_go_to_youtube": "Idi na YouTube",
|
||||||
"footer_documentation": "Dokumentacija",
|
"footer_documentation": "Dokumentacija",
|
||||||
@@ -225,13 +224,12 @@
|
|||||||
"preferences_category_visual": "Vizuelne preference",
|
"preferences_category_visual": "Vizuelne preference",
|
||||||
"preferences_captions_label": "Podrazumevani titl: ",
|
"preferences_captions_label": "Podrazumevani titl: ",
|
||||||
"Music": "Muzika",
|
"Music": "Muzika",
|
||||||
"content_type": "Tip",
|
"search_filters_type_label": "Tip",
|
||||||
"Broken? Try another Invidious Instance": "Ne funkcioniše ispravno? Probajte drugu Invidious instancu",
|
|
||||||
"Tamil": "Tamilski",
|
"Tamil": "Tamilski",
|
||||||
"Save preferences": "Sačuvaj podešavanja",
|
"Save preferences": "Sačuvaj podešavanja",
|
||||||
"Only show latest unwatched video from channel: ": "Prikaži samo poslednje video klipove koji nisu pogledani sa kanala: ",
|
"Only show latest unwatched video from channel: ": "Prikaži samo poslednje video klipove koji nisu pogledani sa kanala: ",
|
||||||
"Xhosa": "Kosa (Jezik)",
|
"Xhosa": "Kosa (Jezik)",
|
||||||
"channel": "Kanal",
|
"search_filters_type_option_channel": "Kanal",
|
||||||
"Hungarian": "Mađarski",
|
"Hungarian": "Mađarski",
|
||||||
"Maori": "Maori (Jezik)",
|
"Maori": "Maori (Jezik)",
|
||||||
"Manage subscriptions": "Upravljaj zapisima",
|
"Manage subscriptions": "Upravljaj zapisima",
|
||||||
@@ -243,7 +241,7 @@
|
|||||||
"preferences_default_home_label": "Podrazumevana početna stranica: ",
|
"preferences_default_home_label": "Podrazumevana početna stranica: ",
|
||||||
"Serbian": "Srpski",
|
"Serbian": "Srpski",
|
||||||
"License: ": "Licenca: ",
|
"License: ": "Licenca: ",
|
||||||
"live": "Uživo",
|
"search_filters_features_option_live": "Uživo",
|
||||||
"Report statistics: ": "Izveštavaj o statistici: ",
|
"Report statistics: ": "Izveštavaj o statistici: ",
|
||||||
"Only show latest video from channel: ": "Prikazuj poslednje video klipove samo sa kanala: ",
|
"Only show latest video from channel: ": "Prikazuj poslednje video klipove samo sa kanala: ",
|
||||||
"channel name - reverse": "ime kanala - obrnuto",
|
"channel name - reverse": "ime kanala - obrnuto",
|
||||||
@@ -266,14 +264,14 @@
|
|||||||
"alphabetically": "po alfabetu",
|
"alphabetically": "po alfabetu",
|
||||||
"No such user": "Nepostojeći korisnik",
|
"No such user": "Nepostojeći korisnik",
|
||||||
"Subscriptions": "Praćenja",
|
"Subscriptions": "Praćenja",
|
||||||
"today": "Danas",
|
"search_filters_date_option_today": "Danas",
|
||||||
"Finnish": "Finski",
|
"Finnish": "Finski",
|
||||||
"Lao": "Laoski",
|
"Lao": "Laoski",
|
||||||
"Login enabled: ": "Prijava omogućena: ",
|
"Login enabled: ": "Prijava omogućena: ",
|
||||||
"Shona": "Šona",
|
"Shona": "Šona",
|
||||||
"location": "Lokacija",
|
"search_filters_features_option_location": "Lokacija",
|
||||||
"Load more": "Učitaj više",
|
"Load more": "Učitaj više",
|
||||||
"Released under the AGPLv3 on Github.": "Izbačeno pod licencom AGPLv3 na Github-u.",
|
"Released under the AGPLv3 on Github.": "Izbačeno pod licencom AGPLv3 na GitHub-u.",
|
||||||
"Slovenian": "Slovenački",
|
"Slovenian": "Slovenački",
|
||||||
"View JavaScript license information.": "Pogledaj informacije licence vezane za JavaScript.",
|
"View JavaScript license information.": "Pogledaj informacije licence vezane za JavaScript.",
|
||||||
"Chinese (Simplified)": "Kineski (Pojednostavljeni)",
|
"Chinese (Simplified)": "Kineski (Pojednostavljeni)",
|
||||||
@@ -292,7 +290,7 @@
|
|||||||
"Czech": "Češki",
|
"Czech": "Češki",
|
||||||
"Latin": "Latinski",
|
"Latin": "Latinski",
|
||||||
"Videos": "Video klipovi",
|
"Videos": "Video klipovi",
|
||||||
"4k": "4К",
|
"search_filters_features_option_four_k": "4К",
|
||||||
"footer_donate_page": "Doniraj",
|
"footer_donate_page": "Doniraj",
|
||||||
"English": "Engleski",
|
"English": "Engleski",
|
||||||
"Arabic": "Arapski",
|
"Arabic": "Arapski",
|
||||||
@@ -310,7 +308,7 @@
|
|||||||
"Swahili": "Svahili",
|
"Swahili": "Svahili",
|
||||||
"Yiddish": "Jidiš",
|
"Yiddish": "Jidiš",
|
||||||
"Zulu": "Zulu",
|
"Zulu": "Zulu",
|
||||||
"subtitles": "Titl/Prevod",
|
"search_filters_features_option_subtitles": "Titl/Prevod",
|
||||||
"Password cannot be longer than 55 characters": "Lozinka ne može biti duža od 55 karaktera",
|
"Password cannot be longer than 55 characters": "Lozinka ne može biti duža od 55 karaktera",
|
||||||
"This channel does not exist.": "Ovaj kanal ne postoji.",
|
"This channel does not exist.": "Ovaj kanal ne postoji.",
|
||||||
"Belarusian": "Beloruski",
|
"Belarusian": "Beloruski",
|
||||||
@@ -329,9 +327,9 @@
|
|||||||
"Clear watch history": "Obriši istoriju gledanja",
|
"Clear watch history": "Obriši istoriju gledanja",
|
||||||
"preferences_category_admin": "Administratorska podešavanja",
|
"preferences_category_admin": "Administratorska podešavanja",
|
||||||
"published": "objavljeno",
|
"published": "objavljeno",
|
||||||
"sort": "Poredaj prema",
|
"search_filters_sort_label": "Poredaj prema",
|
||||||
"show": "Emisija",
|
"search_filters_type_option_show": "Emisija",
|
||||||
"short": "Kratko (< 4 minute)",
|
"search_filters_duration_option_short": "Kratko (< 4 minute)",
|
||||||
"Current version: ": "Trenutna verzija: ",
|
"Current version: ": "Trenutna verzija: ",
|
||||||
"Top enabled: ": "Vrh omogućen: ",
|
"Top enabled: ": "Vrh omogućen: ",
|
||||||
"Public": "Javno",
|
"Public": "Javno",
|
||||||
@@ -369,5 +367,6 @@
|
|||||||
"unsubscribe": "prekini sa praćenjem",
|
"unsubscribe": "prekini sa praćenjem",
|
||||||
"Blacklisted regions: ": "Zabranjene oblasti: ",
|
"Blacklisted regions: ": "Zabranjene oblasti: ",
|
||||||
"Polish": "Poljski",
|
"Polish": "Poljski",
|
||||||
"Yoruba": "Joruba"
|
"Yoruba": "Joruba",
|
||||||
|
"search_filters_title": "Filter"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -182,14 +182,13 @@
|
|||||||
"Georgian": "Грузијски",
|
"Georgian": "Грузијски",
|
||||||
"Greek": "Грчки",
|
"Greek": "Грчки",
|
||||||
"Hausa": "Хауса",
|
"Hausa": "Хауса",
|
||||||
"video": "Видео",
|
"search_filters_type_option_video": "Видео",
|
||||||
"playlist": "Плеј листа",
|
"search_filters_type_option_playlist": "Плеј листа",
|
||||||
"movie": "Филм",
|
"search_filters_type_option_movie": "Филм",
|
||||||
"long": "Дуго (> 20 минута)",
|
"search_filters_duration_option_long": "Дуго (> 20 минута)",
|
||||||
"creative_commons": "Creative Commons (Лиценца)",
|
"search_filters_features_option_c_commons": "Creative Commons (Лиценца)",
|
||||||
"live": "Уживо",
|
"search_filters_features_option_live": "Уживо",
|
||||||
"location": "Локација",
|
"search_filters_features_option_location": "Локација",
|
||||||
"filter": "Филтер",
|
|
||||||
"next_steps_error_message": "Након чега би требали пробати: ",
|
"next_steps_error_message": "Након чега би требали пробати: ",
|
||||||
"footer_donate_page": "Донирај",
|
"footer_donate_page": "Донирај",
|
||||||
"footer_documentation": "Документација",
|
"footer_documentation": "Документација",
|
||||||
@@ -247,9 +246,9 @@
|
|||||||
"`x` marked it with a ❤": "`x` је означио/ла ово са ❤",
|
"`x` marked it with a ❤": "`x` је означио/ла ово са ❤",
|
||||||
"Audio mode": "Аудио мод",
|
"Audio mode": "Аудио мод",
|
||||||
"Videos": "Видео клипови",
|
"Videos": "Видео клипови",
|
||||||
"views": "Број прегледа",
|
"search_filters_sort_option_views": "Број прегледа",
|
||||||
"features": "Карактеристике",
|
"search_filters_features_label": "Карактеристике",
|
||||||
"today": "Данас",
|
"search_filters_date_option_today": "Данас",
|
||||||
"%A %B %-d, %Y": "%A %B %-d, %Y",
|
"%A %B %-d, %Y": "%A %B %-d, %Y",
|
||||||
"preferences_locale_label": "Језик: ",
|
"preferences_locale_label": "Језик: ",
|
||||||
"Persian": "Перзијски",
|
"Persian": "Перзијски",
|
||||||
@@ -257,7 +256,7 @@
|
|||||||
"": "Прикажи `x` коментара",
|
"": "Прикажи `x` коментара",
|
||||||
"([^.,0-9]|^)1([^.,0-9]|$)": "Прикажи `x` коментар"
|
"([^.,0-9]|^)1([^.,0-9]|$)": "Прикажи `x` коментар"
|
||||||
},
|
},
|
||||||
"channel": "Канал",
|
"search_filters_type_option_channel": "Канал",
|
||||||
"Haitian Creole": "Хаићански Креолски",
|
"Haitian Creole": "Хаићански Креолски",
|
||||||
"Armenian": "Јерменски",
|
"Armenian": "Јерменски",
|
||||||
"next_steps_error_message_go_to_youtube": "Иди на YouTube",
|
"next_steps_error_message_go_to_youtube": "Иди на YouTube",
|
||||||
@@ -265,10 +264,10 @@
|
|||||||
"preferences_vr_mode_label": "Интерактивни видео клипови у 360 степени: ",
|
"preferences_vr_mode_label": "Интерактивни видео клипови у 360 степени: ",
|
||||||
"Switch Invidious Instance": "Промени Invidious инстанцу",
|
"Switch Invidious Instance": "Промени Invidious инстанцу",
|
||||||
"Portuguese": "Португалски",
|
"Portuguese": "Португалски",
|
||||||
"week": "Ове седмице",
|
"search_filters_date_option_week": "Ове седмице",
|
||||||
"show": "Емисија",
|
"search_filters_type_option_show": "Емисија",
|
||||||
"Fallback comments: ": "Коментари у случају отказивања: ",
|
"Fallback comments: ": "Коментари у случају отказивања: ",
|
||||||
"hdr": "Видео Високе Резолуције",
|
"search_filters_features_option_hdr": "Видео Високе Резолуције",
|
||||||
"About": "О програму",
|
"About": "О програму",
|
||||||
"Kazakh": "Казашки",
|
"Kazakh": "Казашки",
|
||||||
"Shared `x`": "Подељено `x`",
|
"Shared `x`": "Подељено `x`",
|
||||||
@@ -277,7 +276,7 @@
|
|||||||
"Erroneous challenge": "Погрешан изазов",
|
"Erroneous challenge": "Погрешан изазов",
|
||||||
"Danish": "Дански",
|
"Danish": "Дански",
|
||||||
"Could not get channel info.": "Узимање података о каналу није успело.",
|
"Could not get channel info.": "Узимање података о каналу није успело.",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"Slovenian": "Словеначки",
|
"Slovenian": "Словеначки",
|
||||||
"Load more": "Учитај више",
|
"Load more": "Учитај више",
|
||||||
"German": "Немачки",
|
"German": "Немачки",
|
||||||
@@ -288,12 +287,12 @@
|
|||||||
"Southern Sotho": "Јужни Сото",
|
"Southern Sotho": "Јужни Сото",
|
||||||
"Popular": "Популарно",
|
"Popular": "Популарно",
|
||||||
"Gujarati": "Гуџарати",
|
"Gujarati": "Гуџарати",
|
||||||
"year": "Ове године",
|
"search_filters_date_option_year": "Ове године",
|
||||||
"Irish": "Ирски",
|
"Irish": "Ирски",
|
||||||
"YouTube comment permalink": "YouTube коментар трајна веза",
|
"YouTube comment permalink": "YouTube коментар трајна веза",
|
||||||
"Malagasy": "Малгашки",
|
"Malagasy": "Малгашки",
|
||||||
"Token is expired, please try again": "Жетон је истекао, молимо вас да покушате поново",
|
"Token is expired, please try again": "Жетон је истекао, молимо вас да покушате поново",
|
||||||
"short": "Кратко (< 4 минуте)",
|
"search_filters_duration_option_short": "Кратко (< 4 минуте)",
|
||||||
"Samoan": "Самоански",
|
"Samoan": "Самоански",
|
||||||
"Tamil": "Тамилски",
|
"Tamil": "Тамилски",
|
||||||
"Ukrainian": "Украјински",
|
"Ukrainian": "Украјински",
|
||||||
@@ -307,22 +306,22 @@
|
|||||||
"Lithuanian": "Литвански",
|
"Lithuanian": "Литвански",
|
||||||
"Icelandic": "Исландски",
|
"Icelandic": "Исландски",
|
||||||
"Thai": "Тајски",
|
"Thai": "Тајски",
|
||||||
"month": "Овај месец",
|
"search_filters_date_option_month": "Овај месец",
|
||||||
"content_type": "Тип",
|
"search_filters_type_label": "Тип",
|
||||||
"hour": "Последњи сат",
|
"search_filters_date_option_hour": "Последњи сат",
|
||||||
"Spanish": "Шпански",
|
"Spanish": "Шпански",
|
||||||
"date": "Датум отпремања",
|
"search_filters_sort_option_date": "Датум отпремања",
|
||||||
"View as playlist": "Погледај као плеј листу",
|
"View as playlist": "Погледај као плеј листу",
|
||||||
"relevance": "Релевантност",
|
"search_filters_sort_option_relevance": "Релевантност",
|
||||||
"Estonian": "Естонски",
|
"Estonian": "Естонски",
|
||||||
"Sinhala": "Синхалешки",
|
"Sinhala": "Синхалешки",
|
||||||
"Corsican": "Корзикански",
|
"Corsican": "Корзикански",
|
||||||
"Filipino": "Филипино",
|
"Filipino": "Филипино",
|
||||||
"Gaming": "Игрице",
|
"Gaming": "Игрице",
|
||||||
"Movies": "Филмови",
|
"Movies": "Филмови",
|
||||||
"rating": "Оцене",
|
"search_filters_sort_option_rating": "Оцене",
|
||||||
"Top enabled: ": "Врх омогућен: ",
|
"Top enabled: ": "Врх омогућен: ",
|
||||||
"Released under the AGPLv3 on Github.": "Избачено под лиценцом AGPLv3 на Github-у.",
|
"Released under the AGPLv3 on Github.": "Избачено под лиценцом AGPLv3 на GitHub-у.",
|
||||||
"Afrikaans": "Африканс",
|
"Afrikaans": "Африканс",
|
||||||
"preferences_automatic_instance_redirect_label": "Аутоматско пребацивање на другу инстанцу у случају отказивања (пречи ће назад на редирецт.инвидиоус.ио): ",
|
"preferences_automatic_instance_redirect_label": "Аутоматско пребацивање на другу инстанцу у случају отказивања (пречи ће назад на редирецт.инвидиоус.ио): ",
|
||||||
"Invalid TFA code": "Неважећа TFA кода",
|
"Invalid TFA code": "Неважећа TFA кода",
|
||||||
@@ -340,12 +339,11 @@
|
|||||||
"Swedish": "Шведски",
|
"Swedish": "Шведски",
|
||||||
"Music": "Музика",
|
"Music": "Музика",
|
||||||
"Download as: ": "Преузми као: ",
|
"Download as: ": "Преузми као: ",
|
||||||
"duration": "Трајање",
|
"search_filters_duration_label": "Трајање",
|
||||||
"sort": "Поредај према",
|
"search_filters_sort_label": "Поредај према",
|
||||||
"subtitles": "Титл/Превод",
|
"search_filters_features_option_subtitles": "Титл/Превод",
|
||||||
"preferences_extend_desc_label": "Аутоматски прикажи цео опис видеа: ",
|
"preferences_extend_desc_label": "Аутоматски прикажи цео опис видеа: ",
|
||||||
"Show less": "Прикажи мање",
|
"Show less": "Прикажи мање",
|
||||||
"Broken? Try another Invidious Instance": "Не функционише исправно? Пробајте другу Invidious инстанцу",
|
|
||||||
"Family friendly? ": "Погодно за породицу? ",
|
"Family friendly? ": "Погодно за породицу? ",
|
||||||
"Premieres `x`": "Премерe у `x`",
|
"Premieres `x`": "Премерe у `x`",
|
||||||
"Bosnian": "Босански",
|
"Bosnian": "Босански",
|
||||||
@@ -359,8 +357,8 @@
|
|||||||
"Top": "Врх",
|
"Top": "Врх",
|
||||||
"Video mode": "Видео мод",
|
"Video mode": "Видео мод",
|
||||||
"footer_source_code": "Изворна Кода",
|
"footer_source_code": "Изворна Кода",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"Erroneous CAPTCHA": "Погрешна CAPTCHA",
|
"Erroneous CAPTCHA": "Погрешна CAPTCHA",
|
||||||
"`x` ago": "пре `x`",
|
"`x` ago": "пре `x`",
|
||||||
"Arabic": "Арапски",
|
"Arabic": "Арапски",
|
||||||
@@ -369,5 +367,6 @@
|
|||||||
"Hebrew": "Хебрејски",
|
"Hebrew": "Хебрејски",
|
||||||
"Korean": "Корејски",
|
"Korean": "Корејски",
|
||||||
"Kurdish": "Курдски",
|
"Kurdish": "Курдски",
|
||||||
"Malay": "Малајски"
|
"Malay": "Малајски",
|
||||||
|
"search_filters_title": "Филтер"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,7 +139,6 @@
|
|||||||
"Show less": "Visa mindre",
|
"Show less": "Visa mindre",
|
||||||
"Watch on YouTube": "Titta på YouTube",
|
"Watch on YouTube": "Titta på YouTube",
|
||||||
"Switch Invidious Instance": "Byt Invidious Instans",
|
"Switch Invidious Instance": "Byt Invidious Instans",
|
||||||
"Broken? Try another Invidious Instance": "Trasig? Prova en annan Invidious Instance",
|
|
||||||
"Hide annotations": "Dölj länkar-i-video",
|
"Hide annotations": "Dölj länkar-i-video",
|
||||||
"Show annotations": "Visa länkar-i-video",
|
"Show annotations": "Visa länkar-i-video",
|
||||||
"Genre: ": "Genre: ",
|
"Genre: ": "Genre: ",
|
||||||
@@ -327,39 +326,39 @@
|
|||||||
"Videos": "Videor",
|
"Videos": "Videor",
|
||||||
"Playlists": "Spellistor",
|
"Playlists": "Spellistor",
|
||||||
"Community": "Gemenskap",
|
"Community": "Gemenskap",
|
||||||
"relevance": "relevans",
|
"search_filters_sort_option_relevance": "Relevans",
|
||||||
"rating": "rankning",
|
"search_filters_sort_option_rating": "Rankning",
|
||||||
"date": "datum",
|
"search_filters_sort_option_date": "Datum",
|
||||||
"views": "visningar",
|
"search_filters_sort_option_views": "Visningar",
|
||||||
"content_type": "Typ",
|
"search_filters_type_label": "Typ",
|
||||||
"duration": "Varaktighet",
|
"search_filters_duration_label": "Varaktighet",
|
||||||
"features": "Funktioner",
|
"search_filters_features_label": "Funktioner",
|
||||||
"sort": "Sortera efter",
|
"search_filters_sort_label": "Sortera efter",
|
||||||
"hour": "timme",
|
"search_filters_date_option_hour": "timme",
|
||||||
"today": "idag",
|
"search_filters_date_option_today": "idag",
|
||||||
"week": "vecka",
|
"search_filters_date_option_week": "vecka",
|
||||||
"month": "månad",
|
"search_filters_date_option_month": "månad",
|
||||||
"year": "år",
|
"search_filters_date_option_year": "år",
|
||||||
"video": "video",
|
"search_filters_type_option_video": "video",
|
||||||
"channel": "kanal",
|
"search_filters_type_option_channel": "kanal",
|
||||||
"playlist": "spellista",
|
"search_filters_type_option_playlist": "spellista",
|
||||||
"movie": "film",
|
"search_filters_type_option_movie": "film",
|
||||||
"show": "tv-serie",
|
"search_filters_type_option_show": "tv-serie",
|
||||||
"hd": "hd",
|
"search_filters_features_option_hd": "hd",
|
||||||
"subtitles": "undertexter",
|
"search_filters_features_option_subtitles": "undertexter",
|
||||||
"creative_commons": "creative_commons",
|
"search_filters_features_option_c_commons": "creative_commons",
|
||||||
"3d": "3d",
|
"search_filters_features_option_three_d": "3d",
|
||||||
"live": "live",
|
"search_filters_features_option_live": "live",
|
||||||
"4k": "4k",
|
"search_filters_features_option_four_k": "4k",
|
||||||
"location": "plats",
|
"search_filters_features_option_location": "plats",
|
||||||
"hdr": "hdr",
|
"search_filters_features_option_hdr": "hdr",
|
||||||
"filter": "Filter",
|
|
||||||
"Current version: ": "Nuvarande version: ",
|
"Current version: ": "Nuvarande version: ",
|
||||||
"next_steps_error_message_refresh": "Uppdatera",
|
"next_steps_error_message_refresh": "Uppdatera",
|
||||||
"next_steps_error_message_go_to_youtube": "Gå till Youtube",
|
"next_steps_error_message_go_to_youtube": "Gå till Youtube",
|
||||||
"Released under the AGPLv3 on Github.": "Publicerad under AGPLv3 på Github.",
|
"Released under the AGPLv3 on Github.": "Publicerad under AGPLv3 på GitHub.",
|
||||||
"footer_source_code": "Källkod",
|
"footer_source_code": "Källkod",
|
||||||
"long": "Lång (> 20 minuter)",
|
"search_filters_duration_option_long": "Lång (> 20 minuter)",
|
||||||
"footer_documentation": "Dokumentation",
|
"footer_documentation": "Dokumentation",
|
||||||
"short": "Kort (< 4 minuter)"
|
"search_filters_duration_option_short": "Kort (< 4 minuter)",
|
||||||
|
"search_filters_title": "Filter"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,7 +121,7 @@
|
|||||||
"Subscriptions": "Abonelikler",
|
"Subscriptions": "Abonelikler",
|
||||||
"search": "ara",
|
"search": "ara",
|
||||||
"Log out": "Çıkış yap",
|
"Log out": "Çıkış yap",
|
||||||
"Released under the AGPLv3 on Github.": "Github'da AGPLv3 altında yayınlandı.",
|
"Released under the AGPLv3 on Github.": "GitHub'da AGPLv3 altında yayınlandı.",
|
||||||
"Source available here.": "Kaynak kodları burada bulunabilir.",
|
"Source available here.": "Kaynak kodları burada bulunabilir.",
|
||||||
"View JavaScript license information.": "JavaScript lisans bilgilerini görüntüle.",
|
"View JavaScript license information.": "JavaScript lisans bilgilerini görüntüle.",
|
||||||
"View privacy policy.": "Gizlilik politikasını görüntüle.",
|
"View privacy policy.": "Gizlilik politikasını görüntüle.",
|
||||||
@@ -141,7 +141,6 @@
|
|||||||
"Show less": "Daha az göster",
|
"Show less": "Daha az göster",
|
||||||
"Watch on YouTube": "YouTube'da izle",
|
"Watch on YouTube": "YouTube'da izle",
|
||||||
"Switch Invidious Instance": "Invidious Örneğini Değiştir",
|
"Switch Invidious Instance": "Invidious Örneğini Değiştir",
|
||||||
"Broken? Try another Invidious Instance": "Bozuk mu? Başka bir Invidious örneğini deneyin",
|
|
||||||
"Hide annotations": "Ek açıklamaları gizle",
|
"Hide annotations": "Ek açıklamaları gizle",
|
||||||
"Show annotations": "Ek açıklamaları göster",
|
"Show annotations": "Ek açıklamaları göster",
|
||||||
"Genre: ": "Tür: ",
|
"Genre: ": "Tür: ",
|
||||||
@@ -329,39 +328,38 @@
|
|||||||
"Videos": "Videolar",
|
"Videos": "Videolar",
|
||||||
"Playlists": "Oynatma listeleri",
|
"Playlists": "Oynatma listeleri",
|
||||||
"Community": "Topluluk",
|
"Community": "Topluluk",
|
||||||
"relevance": "İlgi",
|
"search_filters_sort_option_relevance": "İlgi",
|
||||||
"rating": "Değerlendirme",
|
"search_filters_sort_option_rating": "Değerlendirme",
|
||||||
"date": "Yükleme tarihi",
|
"search_filters_sort_option_date": "Yükleme tarihi",
|
||||||
"views": "Görüntüleme sayısı",
|
"search_filters_sort_option_views": "Görüntüleme sayısı",
|
||||||
"content_type": "Tür",
|
"search_filters_type_label": "Tür",
|
||||||
"duration": "Süre",
|
"search_filters_duration_label": "Süre",
|
||||||
"features": "Özellikler",
|
"search_filters_features_label": "Özellikler",
|
||||||
"sort": "Sıralama Ölçütü",
|
"search_filters_sort_label": "Sıralama Ölçütü",
|
||||||
"hour": "Son Saat",
|
"search_filters_date_option_hour": "Son Saat",
|
||||||
"today": "Bugün",
|
"search_filters_date_option_today": "Bugün",
|
||||||
"week": "Bu hafta",
|
"search_filters_date_option_week": "Bu hafta",
|
||||||
"month": "Bu ay",
|
"search_filters_date_option_month": "Bu ay",
|
||||||
"year": "Bu yıl",
|
"search_filters_date_option_year": "Bu yıl",
|
||||||
"video": "Video",
|
"search_filters_type_option_video": "Video",
|
||||||
"channel": "Kanal",
|
"search_filters_type_option_channel": "Kanal",
|
||||||
"playlist": "Oynatma listesi",
|
"search_filters_type_option_playlist": "Oynatma listesi",
|
||||||
"movie": "Film",
|
"search_filters_type_option_movie": "Film",
|
||||||
"show": "Gösteri",
|
"search_filters_type_option_show": "Gösteri",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "Alt yazılar",
|
"search_filters_features_option_subtitles": "Alt yazılar",
|
||||||
"creative_commons": "Creative Commons",
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
"3d": "3B",
|
"search_filters_features_option_three_d": "3B",
|
||||||
"live": "Canlı",
|
"search_filters_features_option_live": "Canlı",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "Konum",
|
"search_filters_features_option_location": "Konum",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "Filtrele",
|
|
||||||
"Current version: ": "Şu anki sürüm: ",
|
"Current version: ": "Şu anki sürüm: ",
|
||||||
"next_steps_error_message": "Bundan sonra şunları denemelisiniz: ",
|
"next_steps_error_message": "Bundan sonra şunları denemelisiniz: ",
|
||||||
"next_steps_error_message_refresh": "Yenile",
|
"next_steps_error_message_refresh": "Yenile",
|
||||||
"next_steps_error_message_go_to_youtube": "YouTube'a git",
|
"next_steps_error_message_go_to_youtube": "YouTube'a git",
|
||||||
"short": "Kısa (4 dakikadan az)",
|
"search_filters_duration_option_short": "Kısa (4 dakikadan az)",
|
||||||
"long": "Uzun (20 dakikadan fazla)",
|
"search_filters_duration_option_long": "Uzun (20 dakikadan fazla)",
|
||||||
"footer_documentation": "Belgelendirme",
|
"footer_documentation": "Belgelendirme",
|
||||||
"footer_source_code": "Kaynak kodları",
|
"footer_source_code": "Kaynak kodları",
|
||||||
"footer_original_source_code": "Orijinal kaynak kodları",
|
"footer_original_source_code": "Orijinal kaynak kodları",
|
||||||
@@ -394,8 +392,8 @@
|
|||||||
"Video unavailable": "Video kullanılamıyor",
|
"Video unavailable": "Video kullanılamıyor",
|
||||||
"preferences_quality_option_dash": "DASH (uyarlanabilir kalite)",
|
"preferences_quality_option_dash": "DASH (uyarlanabilir kalite)",
|
||||||
"preferences_quality_dash_option_auto": "Otomatik",
|
"preferences_quality_dash_option_auto": "Otomatik",
|
||||||
"purchased": "Satın alınan",
|
"search_filters_features_option_purchased": "Satın alınan",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"videoinfo_watch_on_youTube": "YouTube'da izle",
|
"videoinfo_watch_on_youTube": "YouTube'da izle",
|
||||||
"download_subtitles": "Alt yazılar - `x` (.vtt)",
|
"download_subtitles": "Alt yazılar - `x` (.vtt)",
|
||||||
"preferences_save_player_pos_label": "Oynatma konumunu kaydet: ",
|
"preferences_save_player_pos_label": "Oynatma konumunu kaydet: ",
|
||||||
@@ -436,7 +434,7 @@
|
|||||||
"crash_page_refresh": "<a href=\"`x`\">sayfayı yenilemeye</a> çalıştınız",
|
"crash_page_refresh": "<a href=\"`x`\">sayfayı yenilemeye</a> çalıştınız",
|
||||||
"crash_page_switch_instance": "<a href=\"`x`\">başka bir örnek kullanmaya</a> çalıştınız",
|
"crash_page_switch_instance": "<a href=\"`x`\">başka bir örnek kullanmaya</a> çalıştınız",
|
||||||
"crash_page_read_the_faq": "<a href=\"`x`\">Sık Sorulan Soruları (SSS)</a> okudunuz",
|
"crash_page_read_the_faq": "<a href=\"`x`\">Sık Sorulan Soruları (SSS)</a> okudunuz",
|
||||||
"crash_page_search_issue": "<a href=\"`x`\">Github'daki sorunlarda</a> aradınız",
|
"crash_page_search_issue": "<a href=\"`x`\">GitHub'daki sorunlarda</a> aradınız",
|
||||||
"crash_page_report_issue": "Yukarıdakilerin hiçbiri yardımcı olmadıysa, lütfen <a href=\"`x`\">GitHub'da yeni bir sorun açın</a> (tercihen İngilizce) ve mesajınıza aşağıdaki metni ekleyin (bu metni ÇEVİRMEYİN):",
|
"crash_page_report_issue": "Yukarıdakilerin hiçbiri yardımcı olmadıysa, lütfen <a href=\"`x`\">GitHub'da yeni bir sorun açın</a> (tercihen İngilizce) ve mesajınıza aşağıdaki metni ekleyin (bu metni ÇEVİRMEYİN):",
|
||||||
"English (United Kingdom)": "İngilizce (Birleşik Krallık)",
|
"English (United Kingdom)": "İngilizce (Birleşik Krallık)",
|
||||||
"Chinese": "Çince",
|
"Chinese": "Çince",
|
||||||
@@ -461,5 +459,17 @@
|
|||||||
"Portuguese (auto-generated)": "Portekizce (otomatik oluşturuldu)",
|
"Portuguese (auto-generated)": "Portekizce (otomatik oluşturuldu)",
|
||||||
"Spanish (Spain)": "İspanyolca (İspanya)",
|
"Spanish (Spain)": "İspanyolca (İspanya)",
|
||||||
"Vietnamese (auto-generated)": "Vietnamca (otomatik oluşturuldu)",
|
"Vietnamese (auto-generated)": "Vietnamca (otomatik oluşturuldu)",
|
||||||
"preferences_watch_history_label": "İzleme geçmişini etkinleştir: "
|
"preferences_watch_history_label": "İzleme geçmişini etkinleştir: ",
|
||||||
|
"search_message_use_another_instance": " Ayrıca <a href=\"`x`\">başka bir örnekte arayabilirsiniz</a>.",
|
||||||
|
"search_filters_type_option_all": "Herhangi bir tür",
|
||||||
|
"search_filters_duration_option_none": "Herhangi bir süre",
|
||||||
|
"search_message_no_results": "Sonuç bulunamadı.",
|
||||||
|
"search_filters_date_label": "Yükleme tarihi",
|
||||||
|
"search_filters_apply_button": "Seçili filtreleri uygula",
|
||||||
|
"search_filters_date_option_none": "Herhangi bir tarih",
|
||||||
|
"search_filters_duration_option_medium": "Orta (4 - 20 dakika)",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_title": "Filtreler",
|
||||||
|
"search_message_change_filters_or_query": "Arama sorgunuzu genişletmeyi ve/veya filtreleri değiştirmeyi deneyin.",
|
||||||
|
"Popular enabled: ": "Popüler etkin: "
|
||||||
}
|
}
|
||||||
|
|||||||
201
locales/uk.json
201
locales/uk.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"LIVE": "ПРЯМИЙ ЕФІР",
|
"LIVE": "НАЖИВО",
|
||||||
"Shared `x` ago": "Розміщено `x` назад",
|
"Shared `x` ago": "Розміщено `x` тому",
|
||||||
"Unsubscribe": "Відписатися",
|
"Unsubscribe": "Відписатися",
|
||||||
"Subscribe": "Підписатися",
|
"Subscribe": "Підписатися",
|
||||||
"View channel on YouTube": "Подивитися канал на YouTube",
|
"View channel on YouTube": "Подивитися канал на YouTube",
|
||||||
@@ -21,16 +21,16 @@
|
|||||||
"No": "Ні",
|
"No": "Ні",
|
||||||
"Import and Export Data": "Імпорт і експорт даних",
|
"Import and Export Data": "Імпорт і експорт даних",
|
||||||
"Import": "Імпорт",
|
"Import": "Імпорт",
|
||||||
"Import Invidious data": "Імпортувати дані Invidious",
|
"Import Invidious data": "Імпортувати JSON-дані Invidious",
|
||||||
"Import YouTube subscriptions": "Імпортувати підписки з YouTube",
|
"Import YouTube subscriptions": "Імпортувати підписки з YouTube чи OPML",
|
||||||
"Import FreeTube subscriptions (.db)": "Імпортувати підписки з FreeTube (.db)",
|
"Import FreeTube subscriptions (.db)": "Імпортувати підписки з FreeTube (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "Імпортувати підписки з NewPipe (.json)",
|
"Import NewPipe subscriptions (.json)": "Імпортувати підписки з NewPipe (.json)",
|
||||||
"Import NewPipe data (.zip)": "Імпортувати дані з NewPipe (.zip)",
|
"Import NewPipe data (.zip)": "Імпортувати дані з NewPipe (.zip)",
|
||||||
"Export": "Експорт",
|
"Export": "Експорт",
|
||||||
"Export subscriptions as OPML": "Експортувати підписки у форматі OPML",
|
"Export subscriptions as OPML": "Експортувати підписки у форматі OPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Експортувати підписки у форматі OPML (для NewPipe та FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Експортувати підписки у форматі OPML (для NewPipe та FreeTube)",
|
||||||
"Export data as JSON": "Експортувати дані у форматі JSON",
|
"Export data as JSON": "Експортувати дані Invidious у форматі JSON",
|
||||||
"Delete account?": "Видалити обліківку?",
|
"Delete account?": "Видалити обліковий запис?",
|
||||||
"History": "Історія",
|
"History": "Історія",
|
||||||
"An alternative front-end to YouTube": "Альтернативний фронтенд до YouTube",
|
"An alternative front-end to YouTube": "Альтернативний фронтенд до YouTube",
|
||||||
"JavaScript license information": "Інформація щодо ліцензій JavaScript",
|
"JavaScript license information": "Інформація щодо ліцензій JavaScript",
|
||||||
@@ -40,9 +40,9 @@
|
|||||||
"Log in with Google": "Увійти через Google",
|
"Log in with Google": "Увійти через Google",
|
||||||
"User ID": "ID користувача",
|
"User ID": "ID користувача",
|
||||||
"Password": "Пароль",
|
"Password": "Пароль",
|
||||||
"Time (h:mm:ss):": "Час (г:мм:сс):",
|
"Time (h:mm:ss):": "Час (г:хх:сс):",
|
||||||
"Text CAPTCHA": "Текст капчі",
|
"Text CAPTCHA": "Текст CAPTCHA",
|
||||||
"Image CAPTCHA": "Зображення капчі",
|
"Image CAPTCHA": "Зображення CAPTCHA",
|
||||||
"Sign In": "Увійти",
|
"Sign In": "Увійти",
|
||||||
"Register": "Зареєструватися",
|
"Register": "Зареєструватися",
|
||||||
"E-mail": "Електронна пошта",
|
"E-mail": "Електронна пошта",
|
||||||
@@ -142,7 +142,7 @@
|
|||||||
"Whitelisted regions: ": "Доступно у регіонах: ",
|
"Whitelisted regions: ": "Доступно у регіонах: ",
|
||||||
"Blacklisted regions: ": "Недоступно у регіонах: ",
|
"Blacklisted regions: ": "Недоступно у регіонах: ",
|
||||||
"Shared `x`": "Розміщено `x`",
|
"Shared `x`": "Розміщено `x`",
|
||||||
"Premieres in `x`": "Прем’єра через `x`",
|
"Premieres in `x`": "Прем’єра за `x`",
|
||||||
"Premieres `x`": "Прем’єра `x`",
|
"Premieres `x`": "Прем’єра `x`",
|
||||||
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Схоже, у вас відключений JavaScript. Щоб побачити коментарі, натисніть сюда, але майте на увазі, що вони можуть завантажуватися трохи довше.",
|
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Схоже, у вас відключений JavaScript. Щоб побачити коментарі, натисніть сюда, але майте на увазі, що вони можуть завантажуватися трохи довше.",
|
||||||
"View YouTube comments": "Переглянути коментарі з YouTube",
|
"View YouTube comments": "Переглянути коментарі з YouTube",
|
||||||
@@ -157,11 +157,11 @@
|
|||||||
"Incorrect password": "Неправильний пароль",
|
"Incorrect password": "Неправильний пароль",
|
||||||
"Quota exceeded, try again in a few hours": "Ліміт перевищено, спробуйте знову за декілька годин",
|
"Quota exceeded, try again in a few hours": "Ліміт перевищено, спробуйте знову за декілька годин",
|
||||||
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Не вдається увійти. Перевірте, чи не ввімкнена двофакторна аутентифікація (за кодом чи смс).",
|
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Не вдається увійти. Перевірте, чи не ввімкнена двофакторна аутентифікація (за кодом чи смс).",
|
||||||
"Invalid TFA code": "Неправильний код двофакторної аутентифікації",
|
"Invalid TFA code": "Неправильний код двофакторної автентифікації",
|
||||||
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Не вдається увійти. Це може бути через те, що у вашій обліківці не ввімкнена двофакторна аутентифікація.",
|
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Не вдається увійти. Це може бути через те, що у вашій обліківці не ввімкнена двофакторна аутентифікація.",
|
||||||
"Wrong answer": "Неправильна відповідь",
|
"Wrong answer": "Неправильна відповідь",
|
||||||
"Erroneous CAPTCHA": "Неправильна капча",
|
"Erroneous CAPTCHA": "Неправильна капча",
|
||||||
"CAPTCHA is a required field": "Необхідно пройти капчу",
|
"CAPTCHA is a required field": "Необхідно пройти CAPTCHA",
|
||||||
"User ID is a required field": "Необхідно ввести ID користувача",
|
"User ID is a required field": "Необхідно ввести ID користувача",
|
||||||
"Password is a required field": "Необхідно ввести пароль",
|
"Password is a required field": "Необхідно ввести пароль",
|
||||||
"Wrong username or password": "Неправильний логін чи пароль",
|
"Wrong username or password": "Неправильний логін чи пароль",
|
||||||
@@ -169,7 +169,7 @@
|
|||||||
"Password cannot be empty": "Пароль не може бути порожнім",
|
"Password cannot be empty": "Пароль не може бути порожнім",
|
||||||
"Password cannot be longer than 55 characters": "Пароль не може бути довшим за 55 знаків",
|
"Password cannot be longer than 55 characters": "Пароль не може бути довшим за 55 знаків",
|
||||||
"Please log in": "Будь ласка, увійдіть",
|
"Please log in": "Будь ласка, увійдіть",
|
||||||
"Invidious Private Feed for `x`": "Приватний поток відео Invidious для `x`",
|
"Invidious Private Feed for `x`": "Приватний потік відео Invidious для `x`",
|
||||||
"channel:`x`": "канал: `x`",
|
"channel:`x`": "канал: `x`",
|
||||||
"Deleted or invalid channel": "Канал видалено або не знайдено",
|
"Deleted or invalid channel": "Канал видалено або не знайдено",
|
||||||
"This channel does not exist.": "Такого каналу не існує.",
|
"This channel does not exist.": "Такого каналу не існує.",
|
||||||
@@ -189,7 +189,7 @@
|
|||||||
"No such user": "Недопустиме ім’я користувача",
|
"No such user": "Недопустиме ім’я користувача",
|
||||||
"Token is expired, please try again": "Термін дії токена закінчився, спробуйте пізніше",
|
"Token is expired, please try again": "Термін дії токена закінчився, спробуйте пізніше",
|
||||||
"English": "Англійська",
|
"English": "Англійська",
|
||||||
"English (auto-generated)": "Англійська (сгенеровано автоматично)",
|
"English (auto-generated)": "Англійська (автогенератор)",
|
||||||
"Afrikaans": "Африкаанс",
|
"Afrikaans": "Африкаанс",
|
||||||
"Albanian": "Албанська",
|
"Albanian": "Албанська",
|
||||||
"Amharic": "Амхарська",
|
"Amharic": "Амхарська",
|
||||||
@@ -275,7 +275,7 @@
|
|||||||
"Somali": "Сомалійська",
|
"Somali": "Сомалійська",
|
||||||
"Southern Sotho": "Сесото (південна сото)",
|
"Southern Sotho": "Сесото (південна сото)",
|
||||||
"Spanish": "Іспанська",
|
"Spanish": "Іспанська",
|
||||||
"Spanish (Latin America)": "Испанська (Латинська Америка)",
|
"Spanish (Latin America)": "Іспанська (Латинська Америка)",
|
||||||
"Sundanese": "Сунданська",
|
"Sundanese": "Сунданська",
|
||||||
"Swahili": "Суахілі",
|
"Swahili": "Суахілі",
|
||||||
"Swedish": "Шведська",
|
"Swedish": "Шведська",
|
||||||
@@ -318,5 +318,174 @@
|
|||||||
"Videos": "Відео",
|
"Videos": "Відео",
|
||||||
"Playlists": "Плейлисти",
|
"Playlists": "Плейлисти",
|
||||||
"Community": "Спільнота",
|
"Community": "Спільнота",
|
||||||
"Current version: ": "Поточна версія: "
|
"Current version: ": "Поточна версія: ",
|
||||||
|
"generic_views_count_0": "{{count}} перегляд",
|
||||||
|
"generic_views_count_1": "{{count}} перегляди",
|
||||||
|
"generic_views_count_2": "{{count}} переглядів",
|
||||||
|
"generic_videos_count_0": "{{count}} відео",
|
||||||
|
"generic_videos_count_1": "{{count}} відео",
|
||||||
|
"generic_videos_count_2": "{{count}} відео",
|
||||||
|
"generic_playlists_count_0": "{{count}} список відтворення",
|
||||||
|
"generic_playlists_count_1": "{{count}} списки відтворення",
|
||||||
|
"generic_playlists_count_2": "{{count}} списків відтворення",
|
||||||
|
"generic_subscribers_count_0": "{{count}} стежить",
|
||||||
|
"generic_subscribers_count_1": "{{count}} стежать",
|
||||||
|
"generic_subscribers_count_2": "{{count}} стежать",
|
||||||
|
"generic_subscriptions_count_0": "{{count}} підписка",
|
||||||
|
"generic_subscriptions_count_1": "{{count}} підписки",
|
||||||
|
"generic_subscriptions_count_2": "{{count}} підписок",
|
||||||
|
"tokens_count_0": "{{count}} токен",
|
||||||
|
"tokens_count_1": "{{count}} токени",
|
||||||
|
"tokens_count_2": "{{count}} токенів",
|
||||||
|
"subscriptions_unseen_notifs_count_0": "{{count}} нове сповіщення",
|
||||||
|
"subscriptions_unseen_notifs_count_1": "{{count}} нові сповіщення",
|
||||||
|
"subscriptions_unseen_notifs_count_2": "{{count}} нових сповіщень",
|
||||||
|
"comments_view_x_replies_0": "Переглянути {{count}} відповідь",
|
||||||
|
"comments_view_x_replies_1": "Переглянути {{count}} відповіді",
|
||||||
|
"comments_view_x_replies_2": "Переглянути {{count}} відповідей",
|
||||||
|
"generic_count_years_0": "{{count}} рік",
|
||||||
|
"generic_count_years_1": "{{count}} роки",
|
||||||
|
"generic_count_years_2": "{{count}} років",
|
||||||
|
"generic_count_weeks_0": "{{count}} тиждень",
|
||||||
|
"generic_count_weeks_1": "{{count}} тижні",
|
||||||
|
"generic_count_weeks_2": "{{count}} тижнів",
|
||||||
|
"generic_count_days_0": "{{count}} день",
|
||||||
|
"generic_count_days_1": "{{count}} дні",
|
||||||
|
"generic_count_days_2": "{{count}} днів",
|
||||||
|
"generic_count_hours_0": "{{count}} годину",
|
||||||
|
"generic_count_hours_1": "{{count}} години",
|
||||||
|
"generic_count_hours_2": "{{count}} годин",
|
||||||
|
"crash_page_switch_instance": "спробуйте <a href=\"`x`\">використати інший сервер</a>",
|
||||||
|
"crash_page_read_the_faq": "прочитайте <a href=\"`x`\">часті питання (ЧаП)</a>",
|
||||||
|
"crash_page_search_issue": "перегляньте <a href=\"`x`\">наявні обговорення на GitHub</a>",
|
||||||
|
"crash_page_report_issue": "Якщо нічого не допомогло, просимо <a href=\"`x`\">створити обговорення на GitHub</a> (бажано англійською), додавши наступний текст у повідомлення (НЕ перекладайте цього тексту):",
|
||||||
|
"Chinese (Hong Kong)": "Китайська (Гонконг)",
|
||||||
|
"Cantonese (Hong Kong)": "Кантонська (Гонконг)",
|
||||||
|
"Chinese": "Китайська",
|
||||||
|
"Chinese (China)": "Китайська (Китай)",
|
||||||
|
"Interlingue": "Інтерлінгва",
|
||||||
|
"Italian (auto-generated)": "Італійська (автогенератор)",
|
||||||
|
"Turkish (auto-generated)": "Турецька (автогенератор)",
|
||||||
|
"Vietnamese (auto-generated)": "В'єтнамська (автогенератор)",
|
||||||
|
"user_created_playlists": "Створено списків відтворення: `x`",
|
||||||
|
"user_saved_playlists": "Збережено списків відтворення: `x`",
|
||||||
|
"Video unavailable": "Відео недоступне",
|
||||||
|
"preferences_watch_history_label": "Історія переглядів: ",
|
||||||
|
"preferences_quality_dash_label": "Бажана DASH-якість відео: ",
|
||||||
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
|
"preferences_vr_mode_label": "Взаємодія з 360-градусними відео (потребує WebGL): ",
|
||||||
|
"Released under the AGPLv3 on Github.": "Випущено під AGPLv3 на GitHub.",
|
||||||
|
"English (United Kingdom)": "Англійська (Сполучене Королівство)",
|
||||||
|
"English (United States)": "Англійська (США)",
|
||||||
|
"French (auto-generated)": "Французька (автогенератор)",
|
||||||
|
"German (auto-generated)": "Німецька (автогенератор)",
|
||||||
|
"Portuguese (auto-generated)": "Португальська (автогенератор)",
|
||||||
|
"Portuguese (Brazil)": "Португальська (Бразилія)",
|
||||||
|
"Russian (auto-generated)": ":^)",
|
||||||
|
"Spanish (auto-generated)": "Іспанська (автогенератор)",
|
||||||
|
"Spanish (Mexico)": "Іспанська (Мексика)",
|
||||||
|
"Spanish (Spain)": "Іспанська (Іспанія)",
|
||||||
|
"next_steps_error_message_go_to_youtube": "Перейти до YouTube",
|
||||||
|
"footer_donate_page": "Пожертвувати",
|
||||||
|
"footer_documentation": "Документація",
|
||||||
|
"footer_source_code": "Вихідний код",
|
||||||
|
"footer_original_source_code": "Оригінал вихідного коду",
|
||||||
|
"footer_modfied_source_code": "Змінений вихідний код",
|
||||||
|
"adminprefs_modified_source_code_url_label": "URL-адреса репозиторію зміненого вихідного коду",
|
||||||
|
"none": "нема",
|
||||||
|
"videoinfo_started_streaming_x_ago": "Трансляцію розпочато `x` тому",
|
||||||
|
"crash_page_you_found_a_bug": "Схоже, ви знайшли ваду в Invidious!",
|
||||||
|
"crash_page_before_reporting": "Перш ніж прозвітувати про ваду:",
|
||||||
|
"crash_page_refresh": "спробуйте <a href=\"`x`\">оновити сторінку</a>",
|
||||||
|
"preferences_quality_dash_option_auto": "Авто",
|
||||||
|
"preferences_quality_dash_option_best": "Найкраща",
|
||||||
|
"preferences_quality_dash_option_worst": "Найгірша",
|
||||||
|
"preferences_quality_dash_option_1440p": "1440p",
|
||||||
|
"preferences_quality_dash_option_1080p": "1080p",
|
||||||
|
"preferences_save_player_pos_label": "Зберегти позицію відтворення: ",
|
||||||
|
"preferences_show_nick_label": "Псевдонім угорі: ",
|
||||||
|
"Show more": "Докладніше",
|
||||||
|
"next_steps_error_message": "Після чого спробуйте: ",
|
||||||
|
"next_steps_error_message_refresh": "Оновити сторінку",
|
||||||
|
"Search": "Пошук",
|
||||||
|
"preferences_extend_desc_label": "Автоматично розширювати опис відео: ",
|
||||||
|
"preferences_category_misc": "Різноманітні параметри",
|
||||||
|
"Show less": "Коротше",
|
||||||
|
"preferences_quality_option_small": "Низька",
|
||||||
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
|
"preferences_quality_option_medium": "Середня",
|
||||||
|
"preferences_quality_dash_option_4320p": "4320p",
|
||||||
|
"invidious": "Invidious",
|
||||||
|
"preferences_quality_dash_option_720p": "720p",
|
||||||
|
"preferences_quality_dash_option_360p": "360p",
|
||||||
|
"preferences_region_label": "Ваша країна: ",
|
||||||
|
"preferences_quality_option_dash": "DASH (змінна якість)",
|
||||||
|
"preferences_quality_option_hd720": "HD720",
|
||||||
|
"preferences_quality_dash_option_2160p": "2160p",
|
||||||
|
"preferences_automatic_instance_redirect_label": "Автоматична зміна сервера (redirect.invidious.io як резерв): ",
|
||||||
|
"Switch Invidious Instance": "Інший сервер Invidious",
|
||||||
|
"preferences_quality_dash_option_480p": "480p",
|
||||||
|
"Chinese (Taiwan)": "Китайська (Тайвань)",
|
||||||
|
"Dutch (auto-generated)": "Нідерландська (автогенератор)",
|
||||||
|
"Indonesian (auto-generated)": "Індонезійська (автогенератор)",
|
||||||
|
"Japanese (auto-generated)": "Японська (автогенератор)",
|
||||||
|
"Korean (auto-generated)": "Корейська (автогенератор)",
|
||||||
|
"generic_count_months_0": "{{count}} місяць",
|
||||||
|
"generic_count_months_1": "{{count}} місяці",
|
||||||
|
"generic_count_months_2": "{{count}} місяців",
|
||||||
|
"videoinfo_youTube_embed_link": "Вкласти",
|
||||||
|
"generic_count_minutes_0": "{{count}} хвилину",
|
||||||
|
"generic_count_minutes_1": "{{count}} хвилини",
|
||||||
|
"generic_count_minutes_2": "{{count}} хвилин",
|
||||||
|
"generic_count_seconds_0": "{{count}} секунду",
|
||||||
|
"generic_count_seconds_1": "{{count}} секунди",
|
||||||
|
"generic_count_seconds_2": "{{count}} секунд",
|
||||||
|
"videoinfo_watch_on_youTube": "Переглянути на YouTube",
|
||||||
|
"videoinfo_invidious_embed_link": "Вкласти посилання",
|
||||||
|
"download_subtitles": "Субтитри — `x` (.vtt)",
|
||||||
|
"comments_points_count_0": "{{count}} пункт",
|
||||||
|
"comments_points_count_1": "{{count}} пункти",
|
||||||
|
"comments_points_count_2": "{{count}} пунктів",
|
||||||
|
"search_filters_features_option_three_d": "3D",
|
||||||
|
"search_filters_features_option_location": "Геомітка",
|
||||||
|
"search_filters_duration_option_none": "Будь-які",
|
||||||
|
"search_filters_features_option_hd": "HD",
|
||||||
|
"search_message_change_filters_or_query": "Спробуйте ширший запит і/або інші фільтри.",
|
||||||
|
"search_filters_type_option_all": "Будь-що",
|
||||||
|
"search_filters_type_option_movie": "Фільм",
|
||||||
|
"search_filters_type_option_show": "Шоу",
|
||||||
|
"search_filters_duration_label": "Тривалість",
|
||||||
|
"search_filters_duration_option_short": "Короткі (до 4 хвилин)",
|
||||||
|
"search_message_no_results": "Результатів не знайдено.",
|
||||||
|
"search_filters_date_label": "Дата вивантаження",
|
||||||
|
"search_filters_date_option_none": "Будь-яка дата",
|
||||||
|
"search_filters_date_option_today": "Сьогодні",
|
||||||
|
"search_filters_date_option_week": "Цей тиждень",
|
||||||
|
"search_filters_type_label": "Тип",
|
||||||
|
"search_filters_type_option_channel": "Канал",
|
||||||
|
"search_message_use_another_instance": " Можете також <a href=\"`x`\">пошукати іншим сервером</a>.",
|
||||||
|
"search_filters_title": "Фільтри",
|
||||||
|
"search_filters_date_option_hour": "Остання година",
|
||||||
|
"search_filters_date_option_month": "Цей місяць",
|
||||||
|
"search_filters_date_option_year": "Цей рік",
|
||||||
|
"search_filters_type_option_video": "Відео",
|
||||||
|
"search_filters_type_option_playlist": "Добірка",
|
||||||
|
"search_filters_duration_option_medium": "Середні (4–20 хвилин)",
|
||||||
|
"search_filters_duration_option_long": "Довгі (понад 20 хвилин)",
|
||||||
|
"search_filters_features_label": "Особливості",
|
||||||
|
"search_filters_features_option_live": "Наживо",
|
||||||
|
"search_filters_features_option_four_k": "4K",
|
||||||
|
"search_filters_features_option_subtitles": "Субтитри",
|
||||||
|
"search_filters_features_option_c_commons": "Creative Commons",
|
||||||
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
|
"search_filters_features_option_hdr": "HDR",
|
||||||
|
"search_filters_sort_label": "Спершу",
|
||||||
|
"search_filters_sort_option_date": "Нещодавні",
|
||||||
|
"search_filters_apply_button": "Застосувати фільтри",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_filters_features_option_purchased": "Придбано",
|
||||||
|
"search_filters_sort_option_relevance": "Відповідні",
|
||||||
|
"search_filters_sort_option_rating": "Рейтингові",
|
||||||
|
"search_filters_sort_option_views": "Популярні",
|
||||||
|
"Popular enabled: ": "Популярне ввімкнено: "
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -138,7 +138,6 @@
|
|||||||
"Show less": "Hiện ít hơn",
|
"Show less": "Hiện ít hơn",
|
||||||
"Watch on YouTube": "Xem trên YouTube",
|
"Watch on YouTube": "Xem trên YouTube",
|
||||||
"Switch Invidious Instance": "Chuyển phiên bản Invidious",
|
"Switch Invidious Instance": "Chuyển phiên bản Invidious",
|
||||||
"Broken? Try another Invidious Instance": "Bị hỏng? Hãy thử một Phiên bản Invidious khác",
|
|
||||||
"Hide annotations": "Ẩn chú thích",
|
"Hide annotations": "Ẩn chú thích",
|
||||||
"Show annotations": "Hiển thị chú thích",
|
"Show annotations": "Hiển thị chú thích",
|
||||||
"Genre: ": "Thể loại: ",
|
"Genre: ": "Thể loại: ",
|
||||||
@@ -315,32 +314,32 @@
|
|||||||
"Videos": "Video",
|
"Videos": "Video",
|
||||||
"Playlists": "Danh sách phát",
|
"Playlists": "Danh sách phát",
|
||||||
"Community": "Cộng đồng",
|
"Community": "Cộng đồng",
|
||||||
"relevance": "liên quan",
|
"search_filters_sort_option_relevance": "liên quan",
|
||||||
"rating": "Xếp hạng",
|
"search_filters_sort_option_rating": "Xếp hạng",
|
||||||
"date": "ngày",
|
"search_filters_sort_option_date": "ngày",
|
||||||
"views": "lượt xem",
|
"search_filters_sort_option_views": "lượt xem",
|
||||||
"content_type": "content_type",
|
"search_filters_type_label": "content_type",
|
||||||
"duration": "thời lượng",
|
"search_filters_duration_label": "thời lượng",
|
||||||
"features": "đặc trưng",
|
"search_filters_features_label": "đặc trưng",
|
||||||
"sort": "sắp xếp",
|
"search_filters_sort_label": "sắp xếp",
|
||||||
"hour": "giờ",
|
"search_filters_date_option_hour": "giờ",
|
||||||
"today": "hôm nay",
|
"search_filters_date_option_today": "hôm nay",
|
||||||
"week": "tuần",
|
"search_filters_date_option_week": "tuần",
|
||||||
"month": "tháng",
|
"search_filters_date_option_month": "tháng",
|
||||||
"year": "năm",
|
"search_filters_date_option_year": "năm",
|
||||||
"video": "video",
|
"search_filters_type_option_video": "video",
|
||||||
"channel": "kênh",
|
"search_filters_type_option_channel": "kênh",
|
||||||
"playlist": "danh sách phát",
|
"search_filters_type_option_playlist": "danh sách phát",
|
||||||
"movie": "bộ phim",
|
"search_filters_type_option_movie": "bộ phim",
|
||||||
"show": "chỉ",
|
"search_filters_type_option_show": "chỉ",
|
||||||
"hd": "hd",
|
"search_filters_features_option_hd": "hd",
|
||||||
"subtitles": "phụ đề",
|
"search_filters_features_option_subtitles": "phụ đề",
|
||||||
"creative_commons": "Commons sáng tạo",
|
"search_filters_features_option_c_commons": "Commons sáng tạo",
|
||||||
"3d": "3d",
|
"search_filters_features_option_three_d": "3d",
|
||||||
"live": "trực tiếp",
|
"search_filters_features_option_live": "trực tiếp",
|
||||||
"4k": "4k",
|
"search_filters_features_option_four_k": "4k",
|
||||||
"location": "vị trí",
|
"search_filters_features_option_location": "vị trí",
|
||||||
"hdr": "hdr",
|
"search_filters_features_option_hdr": "hdr",
|
||||||
"filter": "bộ lọc",
|
"Current version: ": "Phiên bản hiện tại: ",
|
||||||
"Current version: ": "Phiên bản hiện tại: "
|
"search_filters_title": "bộ lọc"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -128,7 +128,7 @@
|
|||||||
"subscriptions_unseen_notifs_count_0": "{{count}} 条未读通知",
|
"subscriptions_unseen_notifs_count_0": "{{count}} 条未读通知",
|
||||||
"search": "搜索",
|
"search": "搜索",
|
||||||
"Log out": "登出",
|
"Log out": "登出",
|
||||||
"Released under the AGPLv3 on Github.": "依据 AGPLv3 许可证发布于 Github。",
|
"Released under the AGPLv3 on Github.": "依据 AGPLv3 许可证发布于 GitHub。",
|
||||||
"Source available here.": "源码可在此查看。",
|
"Source available here.": "源码可在此查看。",
|
||||||
"View JavaScript license information.": "查看 JavaScript 协议信息。",
|
"View JavaScript license information.": "查看 JavaScript 协议信息。",
|
||||||
"View privacy policy.": "查看隐私政策。",
|
"View privacy policy.": "查看隐私政策。",
|
||||||
@@ -148,7 +148,6 @@
|
|||||||
"Show less": "显示较少",
|
"Show less": "显示较少",
|
||||||
"Watch on YouTube": "在 YouTube 观看",
|
"Watch on YouTube": "在 YouTube 观看",
|
||||||
"Switch Invidious Instance": "切换 Invidious 实例",
|
"Switch Invidious Instance": "切换 Invidious 实例",
|
||||||
"Broken? Try another Invidious Instance": "无法正常工作? 尝试另一个 Invidious 实例",
|
|
||||||
"Hide annotations": "隐藏注释",
|
"Hide annotations": "隐藏注释",
|
||||||
"Show annotations": "显示注释",
|
"Show annotations": "显示注释",
|
||||||
"Genre: ": "风格: ",
|
"Genre: ": "风格: ",
|
||||||
@@ -345,39 +344,38 @@
|
|||||||
"Videos": "视频",
|
"Videos": "视频",
|
||||||
"Playlists": "播放列表",
|
"Playlists": "播放列表",
|
||||||
"Community": "社区",
|
"Community": "社区",
|
||||||
"relevance": "相关度",
|
"search_filters_sort_option_relevance": "相关度",
|
||||||
"rating": "评分",
|
"search_filters_sort_option_rating": "评分",
|
||||||
"date": "上传日期",
|
"search_filters_sort_option_date": "上传日期",
|
||||||
"views": "观看次数",
|
"search_filters_sort_option_views": "观看次数",
|
||||||
"content_type": "类型",
|
"search_filters_type_label": "类型",
|
||||||
"duration": "持续时间",
|
"search_filters_duration_label": "持续时间",
|
||||||
"features": "功能",
|
"search_filters_features_label": "功能",
|
||||||
"sort": "排序依据",
|
"search_filters_sort_label": "排序依据",
|
||||||
"hour": "上个小时",
|
"search_filters_date_option_hour": "上个小时",
|
||||||
"today": "今日",
|
"search_filters_date_option_today": "今日",
|
||||||
"week": "本周",
|
"search_filters_date_option_week": "本周",
|
||||||
"month": "本月",
|
"search_filters_date_option_month": "本月",
|
||||||
"year": "今年",
|
"search_filters_date_option_year": "今年",
|
||||||
"video": "视频",
|
"search_filters_type_option_video": "视频",
|
||||||
"channel": "频道",
|
"search_filters_type_option_channel": "频道",
|
||||||
"playlist": "播放列表",
|
"search_filters_type_option_playlist": "播放列表",
|
||||||
"movie": "电影",
|
"search_filters_type_option_movie": "电影",
|
||||||
"show": "真人秀",
|
"search_filters_type_option_show": "真人秀",
|
||||||
"hd": "高清",
|
"search_filters_features_option_hd": "高清",
|
||||||
"subtitles": "字幕",
|
"search_filters_features_option_subtitles": "字幕",
|
||||||
"creative_commons": "creative_commons 许可",
|
"search_filters_features_option_c_commons": "creative_commons 许可",
|
||||||
"3d": "3d",
|
"search_filters_features_option_three_d": "3d",
|
||||||
"live": "直播",
|
"search_filters_features_option_live": "直播",
|
||||||
"4k": "4k",
|
"search_filters_features_option_four_k": "4k",
|
||||||
"location": "位置",
|
"search_filters_features_option_location": "位置",
|
||||||
"hdr": "hdr",
|
"search_filters_features_option_hdr": "hdr",
|
||||||
"filter": "过滤器",
|
|
||||||
"Current version: ": "当前版本: ",
|
"Current version: ": "当前版本: ",
|
||||||
"next_steps_error_message": "在此之后你应尝试: ",
|
"next_steps_error_message": "在此之后你应尝试: ",
|
||||||
"next_steps_error_message_refresh": "刷新",
|
"next_steps_error_message_refresh": "刷新",
|
||||||
"next_steps_error_message_go_to_youtube": "转到 YouTube",
|
"next_steps_error_message_go_to_youtube": "转到 YouTube",
|
||||||
"short": "短(少于4分钟)",
|
"search_filters_duration_option_short": "短(少于4分钟)",
|
||||||
"long": "长(多于 20 分钟)",
|
"search_filters_duration_option_long": "长(多于 20 分钟)",
|
||||||
"footer_documentation": "文档",
|
"footer_documentation": "文档",
|
||||||
"footer_source_code": "源代码",
|
"footer_source_code": "源代码",
|
||||||
"footer_modfied_source_code": "修改的源代码",
|
"footer_modfied_source_code": "修改的源代码",
|
||||||
@@ -391,7 +389,7 @@
|
|||||||
"crash_page_refresh": "试着 <a href=\"`x`\">刷新页面</a>",
|
"crash_page_refresh": "试着 <a href=\"`x`\">刷新页面</a>",
|
||||||
"crash_page_switch_instance": "试着<a href=\"`x`\">使用另一个实例</a>",
|
"crash_page_switch_instance": "试着<a href=\"`x`\">使用另一个实例</a>",
|
||||||
"crash_page_read_the_faq": "阅读<a href=\"`x`\">常见问题</a>",
|
"crash_page_read_the_faq": "阅读<a href=\"`x`\">常见问题</a>",
|
||||||
"crash_page_search_issue": "搜索过 <a href=\"`x`\">Github 上的现有 issue</a>",
|
"crash_page_search_issue": "搜索过 <a href=\"`x`\">GitHub 上的现有 issue</a>",
|
||||||
"crash_page_report_issue": "如果以上这些都没用的话,请<a href=\"`x`\">在 Github 上新开一个 issue</a>(最好用英语撰写),并在你的消息中包含以下文本(不要翻译该文本):",
|
"crash_page_report_issue": "如果以上这些都没用的话,请<a href=\"`x`\">在 Github 上新开一个 issue</a>(最好用英语撰写),并在你的消息中包含以下文本(不要翻译该文本):",
|
||||||
"videoinfo_invidious_embed_link": "嵌入链接",
|
"videoinfo_invidious_embed_link": "嵌入链接",
|
||||||
"download_subtitles": "字幕 - `x` (.vtt)",
|
"download_subtitles": "字幕 - `x` (.vtt)",
|
||||||
@@ -418,8 +416,8 @@
|
|||||||
"user_created_playlists": "`x` 创建了播放列表",
|
"user_created_playlists": "`x` 创建了播放列表",
|
||||||
"user_saved_playlists": "`x` 保存了播放列表",
|
"user_saved_playlists": "`x` 保存了播放列表",
|
||||||
"Video unavailable": "视频不可用",
|
"Video unavailable": "视频不可用",
|
||||||
"purchased": "已购买",
|
"search_filters_features_option_purchased": "已购买",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"none": "无",
|
"none": "无",
|
||||||
"preferences_save_player_pos_label": "保存播放位置: ",
|
"preferences_save_player_pos_label": "保存播放位置: ",
|
||||||
"Spanish (Mexico)": "西班牙语 (墨西哥)",
|
"Spanish (Mexico)": "西班牙语 (墨西哥)",
|
||||||
@@ -445,5 +443,17 @@
|
|||||||
"French (auto-generated)": "法语 (自动生成)",
|
"French (auto-generated)": "法语 (自动生成)",
|
||||||
"Turkish (auto-generated)": "土耳其语 (自动生成)",
|
"Turkish (auto-generated)": "土耳其语 (自动生成)",
|
||||||
"Spanish (Spain)": "西班牙语 (西班牙)",
|
"Spanish (Spain)": "西班牙语 (西班牙)",
|
||||||
"preferences_watch_history_label": "启用观看历史: "
|
"preferences_watch_history_label": "启用观看历史: ",
|
||||||
|
"search_message_use_another_instance": " 你也可以 <a href=\"`x`\">在另一实例上搜索</a>。",
|
||||||
|
"search_filters_title": "过滤器",
|
||||||
|
"search_filters_date_label": "上传日期",
|
||||||
|
"search_filters_apply_button": "应用所选过滤器",
|
||||||
|
"search_message_no_results": "没找到结果。",
|
||||||
|
"search_filters_duration_option_medium": "中等(4-20 分钟)",
|
||||||
|
"search_filters_date_option_none": "任意日期",
|
||||||
|
"search_message_change_filters_or_query": "尝试扩大你的搜索查询和/或更改过滤器。",
|
||||||
|
"search_filters_duration_option_none": "任意时长",
|
||||||
|
"search_filters_type_option_all": "任意类型",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"Popular enabled: ": "已启用流行度: "
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,7 +148,6 @@
|
|||||||
"Show less": "顯示較少",
|
"Show less": "顯示較少",
|
||||||
"Watch on YouTube": "在 YouTube 上觀看",
|
"Watch on YouTube": "在 YouTube 上觀看",
|
||||||
"Switch Invidious Instance": "切換 Invidious 站台",
|
"Switch Invidious Instance": "切換 Invidious 站台",
|
||||||
"Broken? Try another Invidious Instance": "故障了嗎?試試看其他 Invidious 站台吧",
|
|
||||||
"Hide annotations": "隱藏註釋",
|
"Hide annotations": "隱藏註釋",
|
||||||
"Show annotations": "顯示註釋",
|
"Show annotations": "顯示註釋",
|
||||||
"Genre: ": "風格: ",
|
"Genre: ": "風格: ",
|
||||||
@@ -345,39 +344,38 @@
|
|||||||
"Videos": "影片",
|
"Videos": "影片",
|
||||||
"Playlists": "播放清單",
|
"Playlists": "播放清單",
|
||||||
"Community": "社群",
|
"Community": "社群",
|
||||||
"relevance": "關聯",
|
"search_filters_sort_option_relevance": "關聯",
|
||||||
"rating": "評分",
|
"search_filters_sort_option_rating": "評分",
|
||||||
"date": "日期",
|
"search_filters_sort_option_date": "日期",
|
||||||
"views": "檢視",
|
"search_filters_sort_option_views": "檢視",
|
||||||
"content_type": "內容類型",
|
"search_filters_type_label": "內容類型",
|
||||||
"duration": "時長",
|
"search_filters_duration_label": "時長",
|
||||||
"features": "特色",
|
"search_filters_features_label": "特色",
|
||||||
"sort": "排序",
|
"search_filters_sort_label": "排序",
|
||||||
"hour": "小時",
|
"search_filters_date_option_hour": "小時",
|
||||||
"today": "今天",
|
"search_filters_date_option_today": "今天",
|
||||||
"week": "週",
|
"search_filters_date_option_week": "週",
|
||||||
"month": "月",
|
"search_filters_date_option_month": "月",
|
||||||
"year": "年",
|
"search_filters_date_option_year": "年",
|
||||||
"video": "影片",
|
"search_filters_type_option_video": "影片",
|
||||||
"channel": "頻道",
|
"search_filters_type_option_channel": "頻道",
|
||||||
"playlist": "播放清單",
|
"search_filters_type_option_playlist": "播放清單",
|
||||||
"movie": "電影",
|
"search_filters_type_option_movie": "電影",
|
||||||
"show": "秀",
|
"search_filters_type_option_show": "秀",
|
||||||
"hd": "HD",
|
"search_filters_features_option_hd": "HD",
|
||||||
"subtitles": "字幕",
|
"search_filters_features_option_subtitles": "字幕",
|
||||||
"creative_commons": "創用 CC",
|
"search_filters_features_option_c_commons": "創用 CC",
|
||||||
"3d": "3D",
|
"search_filters_features_option_three_d": "3D",
|
||||||
"live": "直播",
|
"search_filters_features_option_live": "直播",
|
||||||
"4k": "4K",
|
"search_filters_features_option_four_k": "4K",
|
||||||
"location": "位置",
|
"search_filters_features_option_location": "位置",
|
||||||
"hdr": "HDR",
|
"search_filters_features_option_hdr": "HDR",
|
||||||
"filter": "篩選條件",
|
|
||||||
"Current version: ": "目前版本: ",
|
"Current version: ": "目前版本: ",
|
||||||
"next_steps_error_message": "之後您應該嘗試: ",
|
"next_steps_error_message": "之後您應該嘗試: ",
|
||||||
"next_steps_error_message_refresh": "重新整理",
|
"next_steps_error_message_refresh": "重新整理",
|
||||||
"next_steps_error_message_go_to_youtube": "到 YouTube",
|
"next_steps_error_message_go_to_youtube": "到 YouTube",
|
||||||
"short": "短(小於4分鐘)",
|
"search_filters_duration_option_short": "短(小於4分鐘)",
|
||||||
"long": "長(多於20分鐘)",
|
"search_filters_duration_option_long": "長(多於20分鐘)",
|
||||||
"footer_documentation": "文件",
|
"footer_documentation": "文件",
|
||||||
"footer_source_code": "原始碼",
|
"footer_source_code": "原始碼",
|
||||||
"footer_original_source_code": "原本的原始碼",
|
"footer_original_source_code": "原本的原始碼",
|
||||||
@@ -398,8 +396,8 @@
|
|||||||
"preferences_quality_dash_option_240p": "240p",
|
"preferences_quality_dash_option_240p": "240p",
|
||||||
"preferences_quality_dash_option_144p": "144p",
|
"preferences_quality_dash_option_144p": "144p",
|
||||||
"invidious": "Invidious",
|
"invidious": "Invidious",
|
||||||
"purchased": "已購買",
|
"search_filters_features_option_purchased": "已購買",
|
||||||
"360": "360°",
|
"search_filters_features_option_three_sixty": "360°",
|
||||||
"none": "無",
|
"none": "無",
|
||||||
"videoinfo_started_streaming_x_ago": "`x` 前開始串流",
|
"videoinfo_started_streaming_x_ago": "`x` 前開始串流",
|
||||||
"videoinfo_watch_on_youTube": "在 YouTube 上觀看",
|
"videoinfo_watch_on_youTube": "在 YouTube 上觀看",
|
||||||
@@ -445,5 +443,17 @@
|
|||||||
"Portuguese (Brazil)": "葡萄牙語(巴西)",
|
"Portuguese (Brazil)": "葡萄牙語(巴西)",
|
||||||
"Japanese (auto-generated)": "日語(自動產生)",
|
"Japanese (auto-generated)": "日語(自動產生)",
|
||||||
"Portuguese (auto-generated)": "葡萄牙語(自動產生)",
|
"Portuguese (auto-generated)": "葡萄牙語(自動產生)",
|
||||||
"preferences_watch_history_label": "啟用觀看紀錄: "
|
"preferences_watch_history_label": "啟用觀看紀錄: ",
|
||||||
|
"search_message_change_filters_or_query": "嘗試擴大您的查詢字詞與/或變更過濾條件。",
|
||||||
|
"search_filters_apply_button": "套用選定的過濾條件",
|
||||||
|
"search_message_no_results": "找不到結果。",
|
||||||
|
"search_filters_duration_option_none": "任何時長",
|
||||||
|
"search_filters_duration_option_medium": "中等(4到20分鐘)",
|
||||||
|
"search_filters_features_option_vr180": "VR180",
|
||||||
|
"search_message_use_another_instance": " 您也可以<a href=\"`x`\">在其他站台上搜尋</a>。",
|
||||||
|
"search_filters_title": "過濾條件",
|
||||||
|
"search_filters_date_label": "上傳日期",
|
||||||
|
"search_filters_type_option_all": "任何類型",
|
||||||
|
"search_filters_date_option_none": "任何日期",
|
||||||
|
"Popular enabled: ": "已啟用人氣: "
|
||||||
}
|
}
|
||||||
|
|||||||
1
mocks
Submodule
1
mocks
Submodule
Submodule mocks added at c401dd9203
60
scripts/deploy-database.sh
Normal file
60
scripts/deploy-database.sh
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Parameters
|
||||||
|
#
|
||||||
|
|
||||||
|
interactive=true
|
||||||
|
|
||||||
|
if [ "$1" = "--no-interactive" ]; then
|
||||||
|
interactive=false
|
||||||
|
fi
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable and start Postgres
|
||||||
|
#
|
||||||
|
|
||||||
|
sudo systemctl start postgresql.service
|
||||||
|
sudo systemctl enable postgresql.service
|
||||||
|
|
||||||
|
#
|
||||||
|
# Create databse and user
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ "$interactive" = "true" ]; then
|
||||||
|
sudo -u postgres -- createuser -P kemal
|
||||||
|
sudo -u postgres -- createdb -O kemal invidious
|
||||||
|
else
|
||||||
|
# Generate a DB password
|
||||||
|
if [ -z "$POSTGRES_PASS" ]; then
|
||||||
|
echo "Generating database password"
|
||||||
|
POSTGRES_PASS=$(tr -dc 'A-Za-z0-9.;!?{[()]}\\/' < /dev/urandom | head -c16)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# hostname:port:database:username:password
|
||||||
|
echo "Writing .pgpass"
|
||||||
|
echo "127.0.0.1:*:invidious:kemal:${POSTGRES_PASS}" > "$HOME/.pgpass"
|
||||||
|
|
||||||
|
sudo -u postgres -- psql -c "CREATE USER kemal WITH PASSWORD '$POSTGRES_PASS';"
|
||||||
|
sudo -u postgres -- psql -c "CREATE DATABASE invidious WITH OWNER kemal;"
|
||||||
|
sudo -u postgres -- psql -c "GRANT ALL ON DATABASE invidious TO kemal;"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Instructions for modification of pg_hba.conf
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ "$interactive" = "true" ]; then
|
||||||
|
echo
|
||||||
|
echo "-------------"
|
||||||
|
echo " NOTICE "
|
||||||
|
echo "-------------"
|
||||||
|
echo
|
||||||
|
echo "Make sure that your postgreSQL's pg_hba.conf file contains the follwong"
|
||||||
|
echo "lines before previous 'host' configurations:"
|
||||||
|
echo
|
||||||
|
echo "host invidious kemal 127.0.0.1/32 md5"
|
||||||
|
echo "host invidious kemal ::1/128 md5"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
174
scripts/install-dependencies.sh
Normal file
174
scripts/install-dependencies.sh
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Script that installs the various dependencies of invidious
|
||||||
|
#
|
||||||
|
# Dependencies:
|
||||||
|
# - crystal => Language in which Invidious is developed
|
||||||
|
# - postgres => Database server
|
||||||
|
# - git => required to clone Invidious
|
||||||
|
# - librsvg2-bin => For login captcha (provides 'rsvg-convert')
|
||||||
|
#
|
||||||
|
# - libssl-dev => Used by Crystal's SSL module (standard library)
|
||||||
|
# - libxml2-dev => Used by Crystal's XML module (standard library)
|
||||||
|
# - libyaml-dev => Used by Crystal's YAML module (standard library)
|
||||||
|
# - libgmp-dev => Used by Crystal's BigNumbers module (standard library)
|
||||||
|
# - libevent-dev => Used by crystal's internal scheduler (?)
|
||||||
|
# - libpcre3-dev => Used by Crystal's regex engine (?)
|
||||||
|
#
|
||||||
|
# - libsqlite3-dev => Used to open .db files from NewPipe exports
|
||||||
|
# - zlib1g-dev => TBD
|
||||||
|
# - libreadline-dev => TBD
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Tested on:
|
||||||
|
# - OpenSUSE Leap 15.3
|
||||||
|
|
||||||
|
#
|
||||||
|
# Load system details
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ -e /etc/os-release ]; then
|
||||||
|
. /etc/os-release
|
||||||
|
elif [ -e /usr/lib/os-release ]; then
|
||||||
|
. /usr/lib/os-release
|
||||||
|
else
|
||||||
|
echo "Unsupported Linux system"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
#
|
||||||
|
# Some variables
|
||||||
|
#
|
||||||
|
|
||||||
|
repo_base_url="https://download.opensuse.org/repositories/devel:/languages:/crystal/"
|
||||||
|
repo_end_url="devel:languages:crystal.repo"
|
||||||
|
|
||||||
|
apt_gpg_key="/usr/share/keyrings/crystal.gpg"
|
||||||
|
apt_list_file="/etc/apt/sources.list.d/crystal.list"
|
||||||
|
|
||||||
|
yum_repo_file="/etc/yum.repos.d/crystal.repo"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Major install functions
|
||||||
|
#
|
||||||
|
|
||||||
|
make_repo_url() {
|
||||||
|
echo "${repo_base_url}/${1}/${repo_end_url}"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
install_apt() {
|
||||||
|
repo="$1"
|
||||||
|
|
||||||
|
echo "Adding Crystal repository"
|
||||||
|
|
||||||
|
curl -fsSL "${repo_base_url}/${repo}/Release.key" \
|
||||||
|
| gpg --dearmor \
|
||||||
|
| sudo tee "${apt_gpg_key}" > /dev/null
|
||||||
|
|
||||||
|
echo "deb [signed-by=${apt_gpg_key}] ${repo_base_url}/${repo}/ /" \
|
||||||
|
| sudo tee "$apt_list_file"
|
||||||
|
|
||||||
|
sudo apt-get update
|
||||||
|
|
||||||
|
sudo apt-get install --yes --no-install-recommends \
|
||||||
|
libssl-dev libxml2-dev libyaml-dev libgmp-dev libevent-dev \
|
||||||
|
libpcre3-dev libreadline-dev libsqlite3-dev zlib1g-dev \
|
||||||
|
crystal postgresql-13 git librsvg2-bin make
|
||||||
|
}
|
||||||
|
|
||||||
|
install_yum() {
|
||||||
|
repo=$(make_repo_url "$1")
|
||||||
|
|
||||||
|
echo "Adding Crystal repository"
|
||||||
|
|
||||||
|
cat << END | sudo tee "${yum_repo_file}" > /dev/null
|
||||||
|
[crystal]
|
||||||
|
name=Crystal
|
||||||
|
type=rpm-md
|
||||||
|
baseurl=${repo}/
|
||||||
|
gpgcheck=1
|
||||||
|
gpgkey=${repo}/repodata/repomd.xml.key
|
||||||
|
enabled=1
|
||||||
|
END
|
||||||
|
|
||||||
|
sudo yum -y install \
|
||||||
|
openssl-devel libxml2-devel libyaml-devel gmp-devel \
|
||||||
|
readline-devel sqlite-devel \
|
||||||
|
crystal postgresql postgresql-server git librsvg2-tools make
|
||||||
|
}
|
||||||
|
|
||||||
|
install_pacman() {
|
||||||
|
# TODO: find an alternative to --no-confirm?
|
||||||
|
sudo pacman -S --no-confirm \
|
||||||
|
base-devel librsvg postgresql crystal
|
||||||
|
}
|
||||||
|
|
||||||
|
install_zypper()
|
||||||
|
{
|
||||||
|
repo=$(make_repo_url "$1")
|
||||||
|
|
||||||
|
echo "Adding Crystal repository"
|
||||||
|
sudo zypper --non-interactive addrepo -f "$repo"
|
||||||
|
|
||||||
|
sudo zypper --non-interactive --gpg-auto-import-keys install --no-recommends \
|
||||||
|
libopenssl-devel libxml2-devel libyaml-devel gmp-devel libevent-devel \
|
||||||
|
pcre-devel readline-devel sqlite3-devel zlib-devel \
|
||||||
|
crystal postgresql postgresql-server git rsvg-convert make
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# System-specific logic
|
||||||
|
#
|
||||||
|
|
||||||
|
case "$ID" in
|
||||||
|
archlinux) install_pacman;;
|
||||||
|
|
||||||
|
centos) install_dnf "CentOS_${VERSION_ID}";;
|
||||||
|
|
||||||
|
debian)
|
||||||
|
case "$VERSION_CODENAME" in
|
||||||
|
sid) install_apt "Debian_Unstable";;
|
||||||
|
bookworm) install_apt "Debian_Testing";;
|
||||||
|
*) install_apt "Debian_${VERSION_ID}";;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
|
||||||
|
fedora)
|
||||||
|
if [ "$VERSION" == *"Prerelease"* ]; then
|
||||||
|
install_dnf "Fedora_Rawhide"
|
||||||
|
else
|
||||||
|
install_dnf "Fedora_${VERSION}"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
opensuse-leap) install_zypper "openSUSE_Leap_${VERSION}";;
|
||||||
|
|
||||||
|
opensuse-tumbleweed) install_zypper "openSUSE_Tumbleweed";;
|
||||||
|
|
||||||
|
rhel) install_dnf "RHEL_${VERSION_ID}";;
|
||||||
|
|
||||||
|
ubuntu)
|
||||||
|
# Small workaround for recently released 22.04
|
||||||
|
case "$VERSION_ID" in
|
||||||
|
22.04) install_apt "xUbuntu_21.04";;
|
||||||
|
*) install_apt "xUbuntu_${VERSION_ID}";;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
# Try to match on ID_LIKE instead
|
||||||
|
# Not guaranteed to 100% work
|
||||||
|
case "$ID_LIKE" in
|
||||||
|
archlinux) install_pacman;;
|
||||||
|
centos) install_dnf "CentOS_${VERSION_ID}";;
|
||||||
|
debian) install_apt "Debian_${VERSION_ID}";;
|
||||||
|
*)
|
||||||
|
echo "Error: distribution ${CODENAME} is not supported"
|
||||||
|
echo "Please install dependencies manually"
|
||||||
|
exit 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
@@ -14,11 +14,11 @@ shards:
|
|||||||
|
|
||||||
exception_page:
|
exception_page:
|
||||||
git: https://github.com/crystal-loot/exception_page.git
|
git: https://github.com/crystal-loot/exception_page.git
|
||||||
version: 0.2.0
|
version: 0.2.2
|
||||||
|
|
||||||
kemal:
|
kemal:
|
||||||
git: https://github.com/kemalcr/kemal.git
|
git: https://github.com/kemalcr/kemal.git
|
||||||
version: 1.1.0
|
version: 1.1.2
|
||||||
|
|
||||||
kilt:
|
kilt:
|
||||||
git: https://github.com/jeromegn/kilt.git
|
git: https://github.com/jeromegn/kilt.git
|
||||||
|
|||||||
@@ -18,7 +18,10 @@ dependencies:
|
|||||||
version: ~> 0.18.0
|
version: ~> 0.18.0
|
||||||
kemal:
|
kemal:
|
||||||
github: kemalcr/kemal
|
github: kemalcr/kemal
|
||||||
version: ~> 1.1.0
|
version: ~> 1.1.2
|
||||||
|
kilt:
|
||||||
|
github: jeromegn/kilt
|
||||||
|
version: ~> 0.6.1
|
||||||
protodec:
|
protodec:
|
||||||
github: iv-org/protodec
|
github: iv-org/protodec
|
||||||
version: ~> 0.1.4
|
version: ~> 0.1.4
|
||||||
|
|||||||
109
spec/invidious/hashtag_spec.cr
Normal file
109
spec/invidious/hashtag_spec.cr
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
require "../parsers_helper.cr"
|
||||||
|
|
||||||
|
Spectator.describe Invidious::Hashtag do
|
||||||
|
it "parses richItemRenderer containers (test 1)" do
|
||||||
|
# Enable mock
|
||||||
|
test_content = load_mock("hashtag/martingarrix_page1")
|
||||||
|
videos = extract_items(test_content)
|
||||||
|
|
||||||
|
expect(typeof(videos)).to eq(Array(SearchItem))
|
||||||
|
expect(videos.size).to eq(60)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Random video check 1
|
||||||
|
#
|
||||||
|
expect(typeof(videos[11])).to eq(SearchItem)
|
||||||
|
|
||||||
|
video_11 = videos[11].as(SearchVideo)
|
||||||
|
|
||||||
|
expect(video_11.id).to eq("06eSsOWcKYA")
|
||||||
|
expect(video_11.title).to eq("Martin Garrix - Live @ Tomorrowland 2018")
|
||||||
|
|
||||||
|
expect(video_11.ucid).to eq("UC5H_KXkPbEsGs0tFt8R35mA")
|
||||||
|
expect(video_11.author).to eq("Martin Garrix")
|
||||||
|
expect(video_11.author_verified).to be_true
|
||||||
|
|
||||||
|
expect(video_11.published).to be_close(Time.utc - 3.years, 1.second)
|
||||||
|
expect(video_11.length_seconds).to eq((56.minutes + 41.seconds).total_seconds.to_i32)
|
||||||
|
expect(video_11.views).to eq(40_504_893)
|
||||||
|
|
||||||
|
expect(video_11.live_now).to be_false
|
||||||
|
expect(video_11.premium).to be_false
|
||||||
|
expect(video_11.premiere_timestamp).to be_nil
|
||||||
|
|
||||||
|
#
|
||||||
|
# Random video check 2
|
||||||
|
#
|
||||||
|
expect(typeof(videos[35])).to eq(SearchItem)
|
||||||
|
|
||||||
|
video_35 = videos[35].as(SearchVideo)
|
||||||
|
|
||||||
|
expect(video_35.id).to eq("b9HpOAYjY9I")
|
||||||
|
expect(video_35.title).to eq("Martin Garrix feat. Mike Yung - Dreamer (Official Video)")
|
||||||
|
|
||||||
|
expect(video_35.ucid).to eq("UC5H_KXkPbEsGs0tFt8R35mA")
|
||||||
|
expect(video_35.author).to eq("Martin Garrix")
|
||||||
|
expect(video_35.author_verified).to be_true
|
||||||
|
|
||||||
|
expect(video_35.published).to be_close(Time.utc - 3.years, 1.second)
|
||||||
|
expect(video_35.length_seconds).to eq((3.minutes + 14.seconds).total_seconds.to_i32)
|
||||||
|
expect(video_35.views).to eq(30_790_049)
|
||||||
|
|
||||||
|
expect(video_35.live_now).to be_false
|
||||||
|
expect(video_35.premium).to be_false
|
||||||
|
expect(video_35.premiere_timestamp).to be_nil
|
||||||
|
end
|
||||||
|
|
||||||
|
it "parses richItemRenderer containers (test 2)" do
|
||||||
|
# Enable mock
|
||||||
|
test_content = load_mock("hashtag/martingarrix_page2")
|
||||||
|
videos = extract_items(test_content)
|
||||||
|
|
||||||
|
expect(typeof(videos)).to eq(Array(SearchItem))
|
||||||
|
expect(videos.size).to eq(60)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Random video check 1
|
||||||
|
#
|
||||||
|
expect(typeof(videos[41])).to eq(SearchItem)
|
||||||
|
|
||||||
|
video_41 = videos[41].as(SearchVideo)
|
||||||
|
|
||||||
|
expect(video_41.id).to eq("qhstH17zAjs")
|
||||||
|
expect(video_41.title).to eq("Martin Garrix Radio - Episode 391")
|
||||||
|
|
||||||
|
expect(video_41.ucid).to eq("UC5H_KXkPbEsGs0tFt8R35mA")
|
||||||
|
expect(video_41.author).to eq("Martin Garrix")
|
||||||
|
expect(video_41.author_verified).to be_true
|
||||||
|
|
||||||
|
expect(video_41.published).to be_close(Time.utc - 2.months, 1.second)
|
||||||
|
expect(video_41.length_seconds).to eq((1.hour).total_seconds.to_i32)
|
||||||
|
expect(video_41.views).to eq(63_240)
|
||||||
|
|
||||||
|
expect(video_41.live_now).to be_false
|
||||||
|
expect(video_41.premium).to be_false
|
||||||
|
expect(video_41.premiere_timestamp).to be_nil
|
||||||
|
|
||||||
|
#
|
||||||
|
# Random video check 2
|
||||||
|
#
|
||||||
|
expect(typeof(videos[48])).to eq(SearchItem)
|
||||||
|
|
||||||
|
video_48 = videos[48].as(SearchVideo)
|
||||||
|
|
||||||
|
expect(video_48.id).to eq("lqGvW0NIfdc")
|
||||||
|
expect(video_48.title).to eq("Martin Garrix SENTIO Full Album Mix by Sakul")
|
||||||
|
|
||||||
|
expect(video_48.ucid).to eq("UC3833PXeLTS6yRpwGMQpp4Q")
|
||||||
|
expect(video_48.author).to eq("SAKUL")
|
||||||
|
expect(video_48.author_verified).to be_false
|
||||||
|
|
||||||
|
expect(video_48.published).to be_close(Time.utc - 3.weeks, 1.second)
|
||||||
|
expect(video_48.length_seconds).to eq((35.minutes + 46.seconds).total_seconds.to_i32)
|
||||||
|
expect(video_48.views).to eq(68_704)
|
||||||
|
|
||||||
|
expect(video_48.live_now).to be_false
|
||||||
|
expect(video_48.premium).to be_false
|
||||||
|
expect(video_48.premiere_timestamp).to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -29,20 +29,6 @@ Spectator.describe "Helper" do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#produce_search_params" do
|
|
||||||
it "correctly produces token for searching with specified filters" do
|
|
||||||
expect(produce_search_params).to eq("CAASAhABSAA%3D")
|
|
||||||
|
|
||||||
expect(produce_search_params(sort: "upload_date", content_type: "video")).to eq("CAISAhABSAA%3D")
|
|
||||||
|
|
||||||
expect(produce_search_params(content_type: "playlist")).to eq("CAASAhADSAA%3D")
|
|
||||||
|
|
||||||
expect(produce_search_params(sort: "date", content_type: "video", features: ["hd", "cc", "purchased", "hdr"])).to eq("CAISCxABIAEwAUgByAEBSAA%3D")
|
|
||||||
|
|
||||||
expect(produce_search_params(content_type: "channel")).to eq("CAASAhACSAA%3D")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "#produce_comment_continuation" do
|
describe "#produce_comment_continuation" do
|
||||||
it "correctly produces a continuation token for comments" do
|
it "correctly produces a continuation token for comments" do
|
||||||
expect(produce_comment_continuation("_cE8xSu6swE", "ADSJ_i2qvJeFtL0htmS5_K5Ctj3eGFVBMWL9Wd42o3kmUL6_mAzdLp85-liQZL0mYr_16BhaggUqX652Sv9JqV6VXinShSP-ZT6rL4NolPBaPXVtJsO5_rA_qE3GubAuLFw9uzIIXU2-HnpXbdgPLWTFavfX206hqWmmpHwUOrmxQV_OX6tYkM3ux3rPAKCDrT8eWL7MU3bLiNcnbgkW8o0h8KYLL_8BPa8LcHbTv8pAoNkjerlX1x7K4pqxaXPoyz89qNlnh6rRx6AXgAzzoHH1dmcyQ8CIBeOHg-m4i8ZxdX4dP88XWrIFg-jJGhpGP8JUMDgZgavxVx225hUEYZMyrLGler5em4FgbG62YWC51moLDLeYEA")).to eq("EkMSC19jRTh4U3U2c3dFyAEA4AEBogINKP___________wFAAMICHQgEGhdodHRwczovL3d3dy55b3V0dWJlLmNvbSIAGAYyjAMK9gJBRFNKX2kycXZKZUZ0TDBodG1TNV9LNUN0ajNlR0ZWQk1XTDlXZDQybzNrbVVMNl9tQXpkTHA4NS1saVFaTDBtWXJfMTZCaGFnZ1VxWDY1MlN2OUpxVjZWWGluU2hTUC1aVDZyTDROb2xQQmFQWFZ0SnNPNV9yQV9xRTNHdWJBdUxGdzl1eklJWFUyLUhucFhiZGdQTFdURmF2ZlgyMDZocVdtbXBId1VPcm14UVZfT1g2dFlrTTN1eDNyUEFLQ0RyVDhlV0w3TVUzYkxpTmNuYmdrVzhvMGg4S1lMTF84QlBhOExjSGJUdjhwQW9Oa2plcmxYMXg3SzRwcXhhWFBveXo4OXFObG5oNnJSeDZBWGdBenpvSEgxZG1jeVE4Q0lCZU9IZy1tNGk4WnhkWDRkUDg4WFdySUZnLWpKR2hwR1A4SlVNRGdaZ2F2eFZ4MjI1aFVFWVpNeXJMR2xlcjVlbTRGZ2JHNjJZV0M1MW1vTERMZVlFQSIPIgtfY0U4eFN1NnN3RTAAKBQ%3D")
|
expect(produce_comment_continuation("_cE8xSu6swE", "ADSJ_i2qvJeFtL0htmS5_K5Ctj3eGFVBMWL9Wd42o3kmUL6_mAzdLp85-liQZL0mYr_16BhaggUqX652Sv9JqV6VXinShSP-ZT6rL4NolPBaPXVtJsO5_rA_qE3GubAuLFw9uzIIXU2-HnpXbdgPLWTFavfX206hqWmmpHwUOrmxQV_OX6tYkM3ux3rPAKCDrT8eWL7MU3bLiNcnbgkW8o0h8KYLL_8BPa8LcHbTv8pAoNkjerlX1x7K4pqxaXPoyz89qNlnh6rRx6AXgAzzoHH1dmcyQ8CIBeOHg-m4i8ZxdX4dP88XWrIFg-jJGhpGP8JUMDgZgavxVx225hUEYZMyrLGler5em4FgbG62YWC51moLDLeYEA")).to eq("EkMSC19jRTh4U3U2c3dFyAEA4AEBogINKP___________wFAAMICHQgEGhdodHRwczovL3d3dy55b3V0dWJlLmNvbSIAGAYyjAMK9gJBRFNKX2kycXZKZUZ0TDBodG1TNV9LNUN0ajNlR0ZWQk1XTDlXZDQybzNrbVVMNl9tQXpkTHA4NS1saVFaTDBtWXJfMTZCaGFnZ1VxWDY1MlN2OUpxVjZWWGluU2hTUC1aVDZyTDROb2xQQmFQWFZ0SnNPNV9yQV9xRTNHdWJBdUxGdzl1eklJWFUyLUhucFhiZGdQTFdURmF2ZlgyMDZocVdtbXBId1VPcm14UVZfT1g2dFlrTTN1eDNyUEFLQ0RyVDhlV0w3TVUzYkxpTmNuYmdrVzhvMGg4S1lMTF84QlBhOExjSGJUdjhwQW9Oa2plcmxYMXg3SzRwcXhhWFBveXo4OXFObG5oNnJSeDZBWGdBenpvSEgxZG1jeVE4Q0lCZU9IZy1tNGk4WnhkWDRkUDg4WFdySUZnLWpKR2hwR1A4SlVNRGdaZ2F2eFZ4MjI1aFVFWVpNeXJMR2xlcjVlbTRGZ2JHNjJZV0M1MW1vTERMZVlFQSIPIgtfY0U4eFN1NnN3RTAAKBQ%3D")
|
||||||
|
|||||||
371
spec/invidious/search/iv_filters_spec.cr
Normal file
371
spec/invidious/search/iv_filters_spec.cr
Normal file
@@ -0,0 +1,371 @@
|
|||||||
|
require "../../../src/invidious/search/filters"
|
||||||
|
|
||||||
|
require "http/params"
|
||||||
|
require "spectator"
|
||||||
|
|
||||||
|
Spectator.configure do |config|
|
||||||
|
config.fail_blank
|
||||||
|
config.randomize
|
||||||
|
end
|
||||||
|
|
||||||
|
FEATURES_TEXT = {
|
||||||
|
Invidious::Search::Filters::Features::Live => "live",
|
||||||
|
Invidious::Search::Filters::Features::FourK => "4k",
|
||||||
|
Invidious::Search::Filters::Features::HD => "hd",
|
||||||
|
Invidious::Search::Filters::Features::Subtitles => "subtitles",
|
||||||
|
Invidious::Search::Filters::Features::CCommons => "commons",
|
||||||
|
Invidious::Search::Filters::Features::ThreeSixty => "360",
|
||||||
|
Invidious::Search::Filters::Features::VR180 => "vr180",
|
||||||
|
Invidious::Search::Filters::Features::ThreeD => "3d",
|
||||||
|
Invidious::Search::Filters::Features::HDR => "hdr",
|
||||||
|
Invidious::Search::Filters::Features::Location => "location",
|
||||||
|
Invidious::Search::Filters::Features::Purchased => "purchased",
|
||||||
|
}
|
||||||
|
|
||||||
|
Spectator.describe Invidious::Search::Filters do
|
||||||
|
# -------------------
|
||||||
|
# Decode (legacy)
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
describe "#from_legacy_filters" do
|
||||||
|
it "Decodes channel: filter" do
|
||||||
|
query = "test channel:UC123456 request"
|
||||||
|
|
||||||
|
fltr, chan, qury, subs = described_class.from_legacy_filters(query)
|
||||||
|
|
||||||
|
expect(fltr).to eq(described_class.new)
|
||||||
|
expect(chan).to eq("UC123456")
|
||||||
|
expect(qury).to eq("test request")
|
||||||
|
expect(subs).to be_false
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes user: filter" do
|
||||||
|
query = "user:LinusTechTips broke something (again)"
|
||||||
|
|
||||||
|
fltr, chan, qury, subs = described_class.from_legacy_filters(query)
|
||||||
|
|
||||||
|
expect(fltr).to eq(described_class.new)
|
||||||
|
expect(chan).to eq("LinusTechTips")
|
||||||
|
expect(qury).to eq("broke something (again)")
|
||||||
|
expect(subs).to be_false
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes type: filter" do
|
||||||
|
Invidious::Search::Filters::Type.each do |value|
|
||||||
|
query = "Eiffel 65 - Blue [1 Hour] type:#{value}"
|
||||||
|
|
||||||
|
fltr, chan, qury, subs = described_class.from_legacy_filters(query)
|
||||||
|
|
||||||
|
expect(fltr).to eq(described_class.new(type: value))
|
||||||
|
expect(chan).to eq("")
|
||||||
|
expect(qury).to eq("Eiffel 65 - Blue [1 Hour]")
|
||||||
|
expect(subs).to be_false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes content_type: filter" do
|
||||||
|
Invidious::Search::Filters::Type.each do |value|
|
||||||
|
query = "I like to watch content_type:#{value}"
|
||||||
|
|
||||||
|
fltr, chan, qury, subs = described_class.from_legacy_filters(query)
|
||||||
|
|
||||||
|
expect(fltr).to eq(described_class.new(type: value))
|
||||||
|
expect(chan).to eq("")
|
||||||
|
expect(qury).to eq("I like to watch")
|
||||||
|
expect(subs).to be_false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes date: filter" do
|
||||||
|
Invidious::Search::Filters::Date.each do |value|
|
||||||
|
query = "This date:#{value} is old!"
|
||||||
|
|
||||||
|
fltr, chan, qury, subs = described_class.from_legacy_filters(query)
|
||||||
|
|
||||||
|
expect(fltr).to eq(described_class.new(date: value))
|
||||||
|
expect(chan).to eq("")
|
||||||
|
expect(qury).to eq("This is old!")
|
||||||
|
expect(subs).to be_false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes duration: filter" do
|
||||||
|
Invidious::Search::Filters::Duration.each do |value|
|
||||||
|
query = "This duration:#{value} is old!"
|
||||||
|
|
||||||
|
fltr, chan, qury, subs = described_class.from_legacy_filters(query)
|
||||||
|
|
||||||
|
expect(fltr).to eq(described_class.new(duration: value))
|
||||||
|
expect(chan).to eq("")
|
||||||
|
expect(qury).to eq("This is old!")
|
||||||
|
expect(subs).to be_false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes feature: filter" do
|
||||||
|
Invidious::Search::Filters::Features.each do |value|
|
||||||
|
string = FEATURES_TEXT[value]
|
||||||
|
query = "I like my precious feature:#{string} ^^"
|
||||||
|
|
||||||
|
fltr, chan, qury, subs = described_class.from_legacy_filters(query)
|
||||||
|
|
||||||
|
expect(fltr).to eq(described_class.new(features: value))
|
||||||
|
expect(chan).to eq("")
|
||||||
|
expect(qury).to eq("I like my precious ^^")
|
||||||
|
expect(subs).to be_false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes features: filter" do
|
||||||
|
query = "This search has many features:vr180,cc,hdr :o"
|
||||||
|
|
||||||
|
fltr, chan, qury, subs = described_class.from_legacy_filters(query)
|
||||||
|
|
||||||
|
features = Invidious::Search::Filters::Features.flags(HDR, VR180, CCommons)
|
||||||
|
|
||||||
|
expect(fltr).to eq(described_class.new(features: features))
|
||||||
|
expect(chan).to eq("")
|
||||||
|
expect(qury).to eq("This search has many :o")
|
||||||
|
expect(subs).to be_false
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes sort: filter" do
|
||||||
|
Invidious::Search::Filters::Sort.each do |value|
|
||||||
|
query = "Computer? sort:#{value} my files!"
|
||||||
|
|
||||||
|
fltr, chan, qury, subs = described_class.from_legacy_filters(query)
|
||||||
|
|
||||||
|
expect(fltr).to eq(described_class.new(sort: value))
|
||||||
|
expect(chan).to eq("")
|
||||||
|
expect(qury).to eq("Computer? my files!")
|
||||||
|
expect(subs).to be_false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes subscriptions: filter" do
|
||||||
|
query = "enable subscriptions:true"
|
||||||
|
|
||||||
|
fltr, chan, qury, subs = described_class.from_legacy_filters(query)
|
||||||
|
|
||||||
|
expect(fltr).to eq(described_class.new)
|
||||||
|
expect(chan).to eq("")
|
||||||
|
expect(qury).to eq("enable")
|
||||||
|
expect(subs).to be_true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Ignores junk data" do
|
||||||
|
query = "duration:I sort:like type:cleaning features:stuff date:up!"
|
||||||
|
|
||||||
|
fltr, chan, qury, subs = described_class.from_legacy_filters(query)
|
||||||
|
|
||||||
|
expect(fltr).to eq(described_class.new)
|
||||||
|
expect(chan).to eq("")
|
||||||
|
expect(qury).to eq("")
|
||||||
|
expect(subs).to be_false
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Keeps unknown keys" do
|
||||||
|
query = "to:be or:not to:be"
|
||||||
|
|
||||||
|
fltr, chan, qury, subs = described_class.from_legacy_filters(query)
|
||||||
|
|
||||||
|
expect(fltr).to eq(described_class.new)
|
||||||
|
expect(chan).to eq("")
|
||||||
|
expect(qury).to eq("to:be or:not to:be")
|
||||||
|
expect(subs).to be_false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# Decode (URL)
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
describe "#from_iv_params" do
|
||||||
|
it "Decodes type= filter" do
|
||||||
|
Invidious::Search::Filters::Type.each do |value|
|
||||||
|
params = HTTP::Params.parse("type=#{value}")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(type: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes date= filter" do
|
||||||
|
Invidious::Search::Filters::Date.each do |value|
|
||||||
|
params = HTTP::Params.parse("date=#{value}")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(date: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes duration= filter" do
|
||||||
|
Invidious::Search::Filters::Duration.each do |value|
|
||||||
|
params = HTTP::Params.parse("duration=#{value}")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(duration: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes features= filter (single)" do
|
||||||
|
Invidious::Search::Filters::Features.each do |value|
|
||||||
|
string = described_class.format_features(value)
|
||||||
|
params = HTTP::Params.parse("features=#{string}")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(features: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes features= filter (multiple - comma separated)" do
|
||||||
|
features = Invidious::Search::Filters::Features.flags(HDR, VR180, CCommons)
|
||||||
|
params = HTTP::Params.parse("features=vr180%2Ccc%2Chdr") # %2C is a comma
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(features: features))
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes features= filter (multiple - URL parameters)" do
|
||||||
|
features = Invidious::Search::Filters::Features.flags(ThreeSixty, HD, FourK)
|
||||||
|
params = HTTP::Params.parse("features=4k&features=360&features=hd")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(features: features))
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Decodes sort= filter" do
|
||||||
|
Invidious::Search::Filters::Sort.each do |value|
|
||||||
|
params = HTTP::Params.parse("sort=#{value}")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params))
|
||||||
|
.to eq(described_class.new(sort: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Ignores junk data" do
|
||||||
|
params = HTTP::Params.parse("foo=bar&sort=views&answer=42&type=channel")
|
||||||
|
|
||||||
|
expect(described_class.from_iv_params(params)).to eq(
|
||||||
|
described_class.new(
|
||||||
|
sort: Invidious::Search::Filters::Sort::Views,
|
||||||
|
type: Invidious::Search::Filters::Type::Channel
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# Encode (URL)
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
describe "#to_iv_params" do
|
||||||
|
it "Encodes date filter" do
|
||||||
|
Invidious::Search::Filters::Date.each do |value|
|
||||||
|
filters = described_class.new(date: value)
|
||||||
|
params = filters.to_iv_params
|
||||||
|
|
||||||
|
if value.none?
|
||||||
|
expect("#{params}").to eq("")
|
||||||
|
else
|
||||||
|
expect("#{params}").to eq("date=#{value.to_s.underscore}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Encodes type filter" do
|
||||||
|
Invidious::Search::Filters::Type.each do |value|
|
||||||
|
filters = described_class.new(type: value)
|
||||||
|
params = filters.to_iv_params
|
||||||
|
|
||||||
|
if value.all?
|
||||||
|
expect("#{params}").to eq("")
|
||||||
|
else
|
||||||
|
expect("#{params}").to eq("type=#{value.to_s.underscore}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Encodes duration filter" do
|
||||||
|
Invidious::Search::Filters::Duration.each do |value|
|
||||||
|
filters = described_class.new(duration: value)
|
||||||
|
params = filters.to_iv_params
|
||||||
|
|
||||||
|
if value.none?
|
||||||
|
expect("#{params}").to eq("")
|
||||||
|
else
|
||||||
|
expect("#{params}").to eq("duration=#{value.to_s.underscore}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Encodes features filter (single)" do
|
||||||
|
Invidious::Search::Filters::Features.each do |value|
|
||||||
|
string = described_class.format_features(value)
|
||||||
|
filters = described_class.new(features: value)
|
||||||
|
|
||||||
|
expect("#{filters.to_iv_params}")
|
||||||
|
.to eq("features=" + FEATURES_TEXT[value])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Encodes features filter (multiple)" do
|
||||||
|
features = Invidious::Search::Filters::Features.flags(Subtitles, Live, ThreeSixty)
|
||||||
|
filters = described_class.new(features: features)
|
||||||
|
|
||||||
|
expect("#{filters.to_iv_params}")
|
||||||
|
.to eq("features=live%2Csubtitles%2C360") # %2C is a comma
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Encodes sort filter" do
|
||||||
|
Invidious::Search::Filters::Sort.each do |value|
|
||||||
|
filters = described_class.new(sort: value)
|
||||||
|
params = filters.to_iv_params
|
||||||
|
|
||||||
|
if value.relevance?
|
||||||
|
expect("#{params}").to eq("")
|
||||||
|
else
|
||||||
|
expect("#{params}").to eq("sort=#{value.to_s.underscore}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Encodes multiple filters" do
|
||||||
|
filters = described_class.new(
|
||||||
|
date: Invidious::Search::Filters::Date::Today,
|
||||||
|
duration: Invidious::Search::Filters::Duration::Medium,
|
||||||
|
features: Invidious::Search::Filters::Features.flags(Location, Purchased),
|
||||||
|
sort: Invidious::Search::Filters::Sort::Relevance
|
||||||
|
)
|
||||||
|
|
||||||
|
params = filters.to_iv_params
|
||||||
|
|
||||||
|
# Check the `date` param
|
||||||
|
expect(params).to have_key("date")
|
||||||
|
expect(params.fetch_all("date")).to contain_exactly("today")
|
||||||
|
|
||||||
|
# Check the `type` param
|
||||||
|
expect(params).to_not have_key("type")
|
||||||
|
expect(params["type"]?).to be_nil
|
||||||
|
|
||||||
|
# Check the `duration` param
|
||||||
|
expect(params).to have_key("duration")
|
||||||
|
expect(params.fetch_all("duration")).to contain_exactly("medium")
|
||||||
|
|
||||||
|
# Check the `features` param
|
||||||
|
expect(params).to have_key("features")
|
||||||
|
expect(params.fetch_all("features")).to contain_exactly("location,purchased")
|
||||||
|
|
||||||
|
# Check the `sort` param
|
||||||
|
expect(params).to_not have_key("sort")
|
||||||
|
expect(params["sort"]?).to be_nil
|
||||||
|
|
||||||
|
# Check if there aren't other parameters
|
||||||
|
params.delete("date")
|
||||||
|
params.delete("duration")
|
||||||
|
params.delete("features")
|
||||||
|
|
||||||
|
expect(params).to be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
242
spec/invidious/search/query_spec.cr
Normal file
242
spec/invidious/search/query_spec.cr
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
require "../../../src/invidious/search/filters"
|
||||||
|
require "../../../src/invidious/search/query"
|
||||||
|
|
||||||
|
require "http/params"
|
||||||
|
require "spectator"
|
||||||
|
|
||||||
|
Spectator.configure do |config|
|
||||||
|
config.fail_blank
|
||||||
|
config.randomize
|
||||||
|
end
|
||||||
|
|
||||||
|
Spectator.describe Invidious::Search::Query do
|
||||||
|
describe Type::Regular do
|
||||||
|
# -------------------
|
||||||
|
# Query parsing
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
it "parses query with URL prameters (q)" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=What+is+Love+10+hour&type=video&duration=long"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("What is Love 10 hour")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
type: Invidious::Search::Filters::Type::Video,
|
||||||
|
duration: Invidious::Search::Filters::Duration::Long
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "parses query with URL prameters (search_query)" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("search_query=What+is+Love+10+hour&type=video&duration=long"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("What is Love 10 hour")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
type: Invidious::Search::Filters::Type::Video,
|
||||||
|
duration: Invidious::Search::Filters::Duration::Long
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "parses query with legacy filters (q)" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=Nyan+cat+duration:long"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("Nyan cat")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
duration: Invidious::Search::Filters::Duration::Long
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "parses query with legacy filters (search_query)" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("search_query=Nyan+cat+duration:long"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("Nyan cat")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
duration: Invidious::Search::Filters::Duration::Long
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "parses query with both URL params and legacy filters" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=Vamos+a+la+playa+duration:long&type=Video&date=year"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Regular)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("Vamos a la playa duration:long")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
type: Invidious::Search::Filters::Type::Video,
|
||||||
|
date: Invidious::Search::Filters::Date::Year
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# Type switching
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
it "switches to channel search (URL param)" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=thunderbolt+4&channel=UC0vBXGSyV14uvJ4hECDOl0Q"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Channel)
|
||||||
|
expect(query.channel).to eq("UC0vBXGSyV14uvJ4hECDOl0Q")
|
||||||
|
expect(query.text).to eq("thunderbolt 4")
|
||||||
|
expect(query.filters.default?).to be_true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "switches to channel search (legacy)" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=channel%3AUCRPdsCVuH53rcbTcEkuY4uQ+rdna3"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Channel)
|
||||||
|
expect(query.channel).to eq("UCRPdsCVuH53rcbTcEkuY4uQ")
|
||||||
|
expect(query.text).to eq("rdna3")
|
||||||
|
expect(query.filters.default?).to be_true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "switches to subscriptions search" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=subscriptions:true+tunak+tunak+tun"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Subscriptions)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("tunak tunak tun")
|
||||||
|
expect(query.filters.default?).to be_true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe Type::Channel do
|
||||||
|
it "ignores extra parameters" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=Take+on+me+channel%3AUC12345679&type=video&date=year"),
|
||||||
|
Invidious::Search::Query::Type::Channel, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Channel)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("Take on me")
|
||||||
|
expect(query.filters.default?).to be_true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe Type::Subscriptions do
|
||||||
|
it "works" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=Harlem+shake&type=video&date=year"),
|
||||||
|
Invidious::Search::Query::Type::Subscriptions, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Subscriptions)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("Harlem shake")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
type: Invidious::Search::Filters::Type::Video,
|
||||||
|
date: Invidious::Search::Filters::Date::Year
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe Type::Playlist do
|
||||||
|
it "ignores extra parameters" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=Harlem+shake+type:video+date:year&channel=UC12345679"),
|
||||||
|
Invidious::Search::Query::Type::Playlist, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(query.type).to eq(Invidious::Search::Query::Type::Playlist)
|
||||||
|
expect(query.channel).to be_empty
|
||||||
|
expect(query.text).to eq("Harlem shake")
|
||||||
|
|
||||||
|
expect(query.filters).to eq(
|
||||||
|
Invidious::Search::Filters.new(
|
||||||
|
type: Invidious::Search::Filters::Type::Video,
|
||||||
|
date: Invidious::Search::Filters::Date::Year
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#to_http_params" do
|
||||||
|
it "formats regular search" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=The+Simpsons+hiding+in+bush&duration=short"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
params = query.to_http_params
|
||||||
|
|
||||||
|
expect(params).to have_key("duration")
|
||||||
|
expect(params["duration"]?).to eq("short")
|
||||||
|
|
||||||
|
expect(params).to have_key("q")
|
||||||
|
expect(params["q"]?).to eq("The Simpsons hiding in bush")
|
||||||
|
|
||||||
|
# Check if there aren't other parameters
|
||||||
|
params.delete("duration")
|
||||||
|
params.delete("q")
|
||||||
|
expect(params).to be_empty
|
||||||
|
end
|
||||||
|
|
||||||
|
it "formats channel search" do
|
||||||
|
query = described_class.new(
|
||||||
|
HTTP::Params.parse("q=channel:UC2DjFE7Xf11URZqWBigcVOQ%20multimeter"),
|
||||||
|
Invidious::Search::Query::Type::Regular, nil
|
||||||
|
)
|
||||||
|
|
||||||
|
params = query.to_http_params
|
||||||
|
|
||||||
|
expect(params).to have_key("channel")
|
||||||
|
expect(params["channel"]?).to eq("UC2DjFE7Xf11URZqWBigcVOQ")
|
||||||
|
|
||||||
|
expect(params).to have_key("q")
|
||||||
|
expect(params["q"]?).to eq("multimeter")
|
||||||
|
|
||||||
|
# Check if there aren't other parameters
|
||||||
|
params.delete("channel")
|
||||||
|
params.delete("q")
|
||||||
|
expect(params).to be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
143
spec/invidious/search/yt_filters_spec.cr
Normal file
143
spec/invidious/search/yt_filters_spec.cr
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
require "../../../src/invidious/search/filters"
|
||||||
|
|
||||||
|
require "http/params"
|
||||||
|
require "spectator"
|
||||||
|
|
||||||
|
Spectator.configure do |config|
|
||||||
|
config.fail_blank
|
||||||
|
config.randomize
|
||||||
|
end
|
||||||
|
|
||||||
|
# Encoded filter values are extracted from the search
|
||||||
|
# page of Youtube with any browser devtools HTML inspector.
|
||||||
|
|
||||||
|
DATE_FILTERS = {
|
||||||
|
Invidious::Search::Filters::Date::Hour => "EgIIAQ%3D%3D",
|
||||||
|
Invidious::Search::Filters::Date::Today => "EgIIAg%3D%3D",
|
||||||
|
Invidious::Search::Filters::Date::Week => "EgIIAw%3D%3D",
|
||||||
|
Invidious::Search::Filters::Date::Month => "EgIIBA%3D%3D",
|
||||||
|
Invidious::Search::Filters::Date::Year => "EgIIBQ%3D%3D",
|
||||||
|
}
|
||||||
|
|
||||||
|
TYPE_FILTERS = {
|
||||||
|
Invidious::Search::Filters::Type::Video => "EgIQAQ%3D%3D",
|
||||||
|
Invidious::Search::Filters::Type::Channel => "EgIQAg%3D%3D",
|
||||||
|
Invidious::Search::Filters::Type::Playlist => "EgIQAw%3D%3D",
|
||||||
|
Invidious::Search::Filters::Type::Movie => "EgIQBA%3D%3D",
|
||||||
|
}
|
||||||
|
|
||||||
|
DURATION_FILTERS = {
|
||||||
|
Invidious::Search::Filters::Duration::Short => "EgIYAQ%3D%3D",
|
||||||
|
Invidious::Search::Filters::Duration::Medium => "EgIYAw%3D%3D",
|
||||||
|
Invidious::Search::Filters::Duration::Long => "EgIYAg%3D%3D",
|
||||||
|
}
|
||||||
|
|
||||||
|
FEATURE_FILTERS = {
|
||||||
|
Invidious::Search::Filters::Features::Live => "EgJAAQ%3D%3D",
|
||||||
|
Invidious::Search::Filters::Features::FourK => "EgJwAQ%3D%3D",
|
||||||
|
Invidious::Search::Filters::Features::HD => "EgIgAQ%3D%3D",
|
||||||
|
Invidious::Search::Filters::Features::Subtitles => "EgIoAQ%3D%3D",
|
||||||
|
Invidious::Search::Filters::Features::CCommons => "EgIwAQ%3D%3D",
|
||||||
|
Invidious::Search::Filters::Features::ThreeSixty => "EgJ4AQ%3D%3D",
|
||||||
|
Invidious::Search::Filters::Features::VR180 => "EgPQAQE%3D",
|
||||||
|
Invidious::Search::Filters::Features::ThreeD => "EgI4AQ%3D%3D",
|
||||||
|
Invidious::Search::Filters::Features::HDR => "EgPIAQE%3D",
|
||||||
|
Invidious::Search::Filters::Features::Location => "EgO4AQE%3D",
|
||||||
|
Invidious::Search::Filters::Features::Purchased => "EgJIAQ%3D%3D",
|
||||||
|
}
|
||||||
|
|
||||||
|
SORT_FILTERS = {
|
||||||
|
Invidious::Search::Filters::Sort::Relevance => "",
|
||||||
|
Invidious::Search::Filters::Sort::Date => "CAI%3D",
|
||||||
|
Invidious::Search::Filters::Sort::Views => "CAM%3D",
|
||||||
|
Invidious::Search::Filters::Sort::Rating => "CAE%3D",
|
||||||
|
}
|
||||||
|
|
||||||
|
Spectator.describe Invidious::Search::Filters do
|
||||||
|
# -------------------
|
||||||
|
# Encode YT params
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
describe "#to_yt_params" do
|
||||||
|
sample DATE_FILTERS do |value, result|
|
||||||
|
it "Encodes upload date filter '#{value}'" do
|
||||||
|
expect(described_class.new(date: value).to_yt_params).to eq(result)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sample TYPE_FILTERS do |value, result|
|
||||||
|
it "Encodes content type filter '#{value}'" do
|
||||||
|
expect(described_class.new(type: value).to_yt_params).to eq(result)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sample DURATION_FILTERS do |value, result|
|
||||||
|
it "Encodes duration filter '#{value}'" do
|
||||||
|
expect(described_class.new(duration: value).to_yt_params).to eq(result)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sample FEATURE_FILTERS do |value, result|
|
||||||
|
it "Encodes feature filter '#{value}'" do
|
||||||
|
expect(described_class.new(features: value).to_yt_params).to eq(result)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sample SORT_FILTERS do |value, result|
|
||||||
|
it "Encodes sort filter '#{value}'" do
|
||||||
|
expect(described_class.new(sort: value).to_yt_params).to eq(result)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# Decode YT params
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
describe "#from_yt_params" do
|
||||||
|
sample DATE_FILTERS do |value, encoded|
|
||||||
|
it "Decodes upload date filter '#{value}'" do
|
||||||
|
params = HTTP::Params.parse("sp=#{encoded}")
|
||||||
|
|
||||||
|
expect(described_class.from_yt_params(params))
|
||||||
|
.to eq(described_class.new(date: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sample TYPE_FILTERS do |value, encoded|
|
||||||
|
it "Decodes content type filter '#{value}'" do
|
||||||
|
params = HTTP::Params.parse("sp=#{encoded}")
|
||||||
|
|
||||||
|
expect(described_class.from_yt_params(params))
|
||||||
|
.to eq(described_class.new(type: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sample DURATION_FILTERS do |value, encoded|
|
||||||
|
it "Decodes duration filter '#{value}'" do
|
||||||
|
params = HTTP::Params.parse("sp=#{encoded}")
|
||||||
|
|
||||||
|
expect(described_class.from_yt_params(params))
|
||||||
|
.to eq(described_class.new(duration: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sample FEATURE_FILTERS do |value, encoded|
|
||||||
|
it "Decodes feature filter '#{value}'" do
|
||||||
|
params = HTTP::Params.parse("sp=#{encoded}")
|
||||||
|
|
||||||
|
expect(described_class.from_yt_params(params))
|
||||||
|
.to eq(described_class.new(features: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sample SORT_FILTERS do |value, encoded|
|
||||||
|
it "Decodes sort filter '#{value}'" do
|
||||||
|
params = HTTP::Params.parse("sp=#{encoded}")
|
||||||
|
|
||||||
|
expect(described_class.from_yt_params(params))
|
||||||
|
.to eq(described_class.new(sort: value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
113
spec/invidious/videos/scheduled_live_extract_spec.cr
Normal file
113
spec/invidious/videos/scheduled_live_extract_spec.cr
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
require "../../parsers_helper.cr"
|
||||||
|
|
||||||
|
Spectator.describe Invidious::Hashtag do
|
||||||
|
it "parses scheduled livestreams data (test 1)" do
|
||||||
|
# Enable mock
|
||||||
|
_player = load_mock("video/scheduled_live_nintendo.player")
|
||||||
|
_next = load_mock("video/scheduled_live_nintendo.next")
|
||||||
|
|
||||||
|
raw_data = _player.merge!(_next)
|
||||||
|
info = parse_video_info("QMGibBzTu0g", raw_data)
|
||||||
|
|
||||||
|
# Some basic verifications
|
||||||
|
expect(typeof(info)).to eq(Hash(String, JSON::Any))
|
||||||
|
|
||||||
|
expect(info["shortDescription"].as_s).to eq(
|
||||||
|
"Tune in on 6/22 at 7 a.m. PT for a livestreamed Xenoblade Chronicles 3 Direct presentation featuring roughly 20 minutes of information about the upcoming RPG adventure for Nintendo Switch."
|
||||||
|
)
|
||||||
|
expect(info["descriptionHtml"].as_s).to eq(
|
||||||
|
"Tune in on 6/22 at 7 a.m. PT for a livestreamed Xenoblade Chronicles 3 Direct presentation featuring roughly 20 minutes of information about the upcoming RPG adventure for Nintendo Switch."
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(info["likes"].as_i).to eq(2_283)
|
||||||
|
|
||||||
|
expect(info["genre"].as_s).to eq("Gaming")
|
||||||
|
expect(info["genreUrl"].raw).to be_nil
|
||||||
|
expect(info["genreUcid"].as_s).to be_empty
|
||||||
|
expect(info["license"].as_s).to be_empty
|
||||||
|
|
||||||
|
expect(info["authorThumbnail"].as_s).to eq(
|
||||||
|
"https://yt3.ggpht.com/ytc/AKedOLTt4vtjREUUNdHlyu9c4gtJjG90M9jQheRlLKy44A=s48-c-k-c0x00ffffff-no-rj"
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(info["authorVerified"].as_bool).to be_true
|
||||||
|
expect(info["subCountText"].as_s).to eq("8.5M")
|
||||||
|
|
||||||
|
expect(info["relatedVideos"].as_a.size).to eq(20)
|
||||||
|
|
||||||
|
# related video #1
|
||||||
|
expect(info["relatedVideos"][3]["id"].as_s).to eq("a-SN3lLIUEo")
|
||||||
|
expect(info["relatedVideos"][3]["author"].as_s).to eq("Nintendo")
|
||||||
|
expect(info["relatedVideos"][3]["ucid"].as_s).to eq("UCGIY_O-8vW4rfX98KlMkvRg")
|
||||||
|
expect(info["relatedVideos"][3]["view_count"].as_s).to eq("147796")
|
||||||
|
expect(info["relatedVideos"][3]["short_view_count"].as_s).to eq("147K")
|
||||||
|
expect(info["relatedVideos"][3]["author_verified"].as_s).to eq("true")
|
||||||
|
|
||||||
|
# Related video #2
|
||||||
|
expect(info["relatedVideos"][16]["id"].as_s).to eq("l_uC1jFK0lo")
|
||||||
|
expect(info["relatedVideos"][16]["author"].as_s).to eq("Nintendo")
|
||||||
|
expect(info["relatedVideos"][16]["ucid"].as_s).to eq("UCGIY_O-8vW4rfX98KlMkvRg")
|
||||||
|
expect(info["relatedVideos"][16]["view_count"].as_s).to eq("53510")
|
||||||
|
expect(info["relatedVideos"][16]["short_view_count"].as_s).to eq("53K")
|
||||||
|
expect(info["relatedVideos"][16]["author_verified"].as_s).to eq("true")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "parses scheduled livestreams data (test 2)" do
|
||||||
|
# Enable mock
|
||||||
|
_player = load_mock("video/scheduled_live_PBD-Podcast.player")
|
||||||
|
_next = load_mock("video/scheduled_live_PBD-Podcast.next")
|
||||||
|
|
||||||
|
raw_data = _player.merge!(_next)
|
||||||
|
info = parse_video_info("RG0cjYbXxME", raw_data)
|
||||||
|
|
||||||
|
# Some basic verifications
|
||||||
|
expect(typeof(info)).to eq(Hash(String, JSON::Any))
|
||||||
|
|
||||||
|
expect(info["shortDescription"].as_s).to start_with(
|
||||||
|
<<-TXT
|
||||||
|
PBD Podcast Episode 171. In this episode, Patrick Bet-David is joined by Dr. Patrick Moore and Adam Sosnick.
|
||||||
|
|
||||||
|
Join the channel to get exclusive access to perks: https://bit.ly/3Q9rSQL
|
||||||
|
TXT
|
||||||
|
)
|
||||||
|
expect(info["descriptionHtml"].as_s).to start_with(
|
||||||
|
<<-TXT
|
||||||
|
PBD Podcast Episode 171. In this episode, Patrick Bet-David is joined by Dr. Patrick Moore and Adam Sosnick.
|
||||||
|
|
||||||
|
Join the channel to get exclusive access to perks: <a href="https://bit.ly/3Q9rSQL">bit.ly/3Q9rSQL</a>
|
||||||
|
TXT
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(info["likes"].as_i).to eq(22)
|
||||||
|
|
||||||
|
expect(info["genre"].as_s).to eq("Entertainment")
|
||||||
|
expect(info["genreUrl"].raw).to be_nil
|
||||||
|
expect(info["genreUcid"].as_s).to be_empty
|
||||||
|
expect(info["license"].as_s).to be_empty
|
||||||
|
|
||||||
|
expect(info["authorThumbnail"].as_s).to eq(
|
||||||
|
"https://yt3.ggpht.com/61ArDiQshJrvSXcGLhpFfIO3hlMabe2fksitcf6oGob0Mdr5gztdkXxRljICUodL4iuTSrtxW4A=s48-c-k-c0x00ffffff-no-rj"
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(info["authorVerified"].as_bool).to be_false
|
||||||
|
expect(info["subCountText"].as_s).to eq("227K")
|
||||||
|
|
||||||
|
expect(info["relatedVideos"].as_a.size).to eq(20)
|
||||||
|
|
||||||
|
# related video #1
|
||||||
|
expect(info["relatedVideos"][2]["id"]).to eq("La9oLLoI5Rc")
|
||||||
|
expect(info["relatedVideos"][2]["author"]).to eq("Tom Bilyeu")
|
||||||
|
expect(info["relatedVideos"][2]["ucid"]).to eq("UCnYMOamNKLGVlJgRUbamveA")
|
||||||
|
expect(info["relatedVideos"][2]["view_count"]).to eq("13329149")
|
||||||
|
expect(info["relatedVideos"][2]["short_view_count"]).to eq("13M")
|
||||||
|
expect(info["relatedVideos"][2]["author_verified"]).to eq("true")
|
||||||
|
|
||||||
|
# Related video #2
|
||||||
|
expect(info["relatedVideos"][9]["id"]).to eq("IQ_4fvpzYuA")
|
||||||
|
expect(info["relatedVideos"][9]["author"]).to eq("Business Today")
|
||||||
|
expect(info["relatedVideos"][9]["ucid"]).to eq("UCaPHWiExfUWaKsUtENLCv5w")
|
||||||
|
expect(info["relatedVideos"][9]["view_count"]).to eq("26432")
|
||||||
|
expect(info["relatedVideos"][9]["short_view_count"]).to eq("26K")
|
||||||
|
expect(info["relatedVideos"][9]["author_verified"]).to eq("true")
|
||||||
|
end
|
||||||
|
end
|
||||||
34
spec/parsers_helper.cr
Normal file
34
spec/parsers_helper.cr
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
require "db"
|
||||||
|
require "json"
|
||||||
|
require "kemal"
|
||||||
|
|
||||||
|
require "protodec/utils"
|
||||||
|
|
||||||
|
require "spectator"
|
||||||
|
|
||||||
|
require "../src/invidious/exceptions"
|
||||||
|
require "../src/invidious/helpers/macros"
|
||||||
|
require "../src/invidious/helpers/logger"
|
||||||
|
require "../src/invidious/helpers/utils"
|
||||||
|
|
||||||
|
require "../src/invidious/videos"
|
||||||
|
require "../src/invidious/comments"
|
||||||
|
|
||||||
|
require "../src/invidious/helpers/serialized_yt_data"
|
||||||
|
require "../src/invidious/yt_backend/extractors"
|
||||||
|
require "../src/invidious/yt_backend/extractors_utils"
|
||||||
|
|
||||||
|
OUTPUT = File.open(File::NULL, "w")
|
||||||
|
LOGGER = Invidious::LogHandler.new(OUTPUT, LogLevel::Off)
|
||||||
|
|
||||||
|
def load_mock(file) : Hash(String, JSON::Any)
|
||||||
|
file = File.join(__DIR__, "..", "mocks", file + ".json")
|
||||||
|
content = File.read(file)
|
||||||
|
|
||||||
|
return JSON.parse(content).as_h
|
||||||
|
end
|
||||||
|
|
||||||
|
Spectator.configure do |config|
|
||||||
|
config.fail_blank
|
||||||
|
config.randomize
|
||||||
|
end
|
||||||
@@ -8,7 +8,7 @@ require "../src/invidious/channels/*"
|
|||||||
require "../src/invidious/videos"
|
require "../src/invidious/videos"
|
||||||
require "../src/invidious/comments"
|
require "../src/invidious/comments"
|
||||||
require "../src/invidious/playlists"
|
require "../src/invidious/playlists"
|
||||||
require "../src/invidious/search"
|
require "../src/invidious/search/ctoken"
|
||||||
require "../src/invidious/trending"
|
require "../src/invidious/trending"
|
||||||
require "spectator"
|
require "spectator"
|
||||||
|
|
||||||
|
|||||||
16
src/ext/kemal_content_for.cr
Normal file
16
src/ext/kemal_content_for.cr
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Overrides for Kemal's `content_for` macro in order to keep using
|
||||||
|
# kilt as it was before Kemal v1.1.1 (Kemal PR #618).
|
||||||
|
|
||||||
|
require "kemal"
|
||||||
|
require "kilt"
|
||||||
|
|
||||||
|
macro content_for(key, file = __FILE__)
|
||||||
|
%proc = ->() {
|
||||||
|
__kilt_io__ = IO::Memory.new
|
||||||
|
{{ yield }}
|
||||||
|
__kilt_io__.to_s
|
||||||
|
}
|
||||||
|
|
||||||
|
CONTENT_FOR_BLOCKS[{{key}}] = Tuple.new {{file}}, %proc
|
||||||
|
nil
|
||||||
|
end
|
||||||
@@ -111,7 +111,7 @@ module Kemal
|
|||||||
if @fallthrough
|
if @fallthrough
|
||||||
call_next(context)
|
call_next(context)
|
||||||
else
|
else
|
||||||
context.response.status_code = 405
|
context.response.status = HTTP::Status::METHOD_NOT_ALLOWED
|
||||||
context.response.headers.add("Allow", "GET, HEAD")
|
context.response.headers.add("Allow", "GET, HEAD")
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
@@ -124,7 +124,7 @@ module Kemal
|
|||||||
# File path cannot contains '\0' (NUL) because all filesystem I know
|
# File path cannot contains '\0' (NUL) because all filesystem I know
|
||||||
# don't accept '\0' character as file name.
|
# don't accept '\0' character as file name.
|
||||||
if request_path.includes? '\0'
|
if request_path.includes? '\0'
|
||||||
context.response.status_code = 400
|
context.response.status = HTTP::Status::BAD_REQUEST
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -143,13 +143,15 @@ module Kemal
|
|||||||
add_cache_headers(context.response.headers, last_modified)
|
add_cache_headers(context.response.headers, last_modified)
|
||||||
|
|
||||||
if cache_request?(context, last_modified)
|
if cache_request?(context, last_modified)
|
||||||
context.response.status_code = 304
|
context.response.status = HTTP::Status::NOT_MODIFIED
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
send_file(context, file_path, file[:data], file[:filestat])
|
send_file(context, file_path, file[:data], file[:filestat])
|
||||||
else
|
else
|
||||||
is_dir = Dir.exists? file_path
|
file_info = File.info?(file_path)
|
||||||
|
is_dir = file_info.try &.directory? || false
|
||||||
|
is_file = file_info.try &.file? || false
|
||||||
|
|
||||||
if request_path != expanded_path
|
if request_path != expanded_path
|
||||||
redirect_to context, expanded_path
|
redirect_to context, expanded_path
|
||||||
@@ -157,19 +159,21 @@ module Kemal
|
|||||||
redirect_to context, expanded_path + '/'
|
redirect_to context, expanded_path + '/'
|
||||||
end
|
end
|
||||||
|
|
||||||
if Dir.exists?(file_path)
|
return call_next(context) if file_info.nil?
|
||||||
|
|
||||||
|
if is_dir
|
||||||
if config.is_a?(Hash) && config["dir_listing"] == true
|
if config.is_a?(Hash) && config["dir_listing"] == true
|
||||||
context.response.content_type = "text/html"
|
context.response.content_type = "text/html"
|
||||||
directory_listing(context.response, request_path, file_path)
|
directory_listing(context.response, request_path, file_path)
|
||||||
else
|
else
|
||||||
call_next(context)
|
call_next(context)
|
||||||
end
|
end
|
||||||
elsif File.exists?(file_path)
|
elsif is_file
|
||||||
last_modified = modification_time(file_path)
|
last_modified = file_info.modification_time
|
||||||
add_cache_headers(context.response.headers, last_modified)
|
add_cache_headers(context.response.headers, last_modified)
|
||||||
|
|
||||||
if cache_request?(context, last_modified)
|
if cache_request?(context, last_modified)
|
||||||
context.response.status_code = 304
|
context.response.status = HTTP::Status::NOT_MODIFIED
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -177,14 +181,12 @@ module Kemal
|
|||||||
data = Bytes.new(size)
|
data = Bytes.new(size)
|
||||||
File.open(file_path, &.read(data))
|
File.open(file_path, &.read(data))
|
||||||
|
|
||||||
filestat = File.info(file_path)
|
@cached_files[file_path] = {data: data, filestat: file_info}
|
||||||
|
send_file(context, file_path, data, file_info)
|
||||||
@cached_files[file_path] = {data: data, filestat: filestat}
|
|
||||||
send_file(context, file_path, data, filestat)
|
|
||||||
else
|
else
|
||||||
send_file(context, file_path)
|
send_file(context, file_path)
|
||||||
end
|
end
|
||||||
else
|
else # Not a normal file (FIFO/device/socket)
|
||||||
call_next(context)
|
call_next(context)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
312
src/invidious.cr
312
src/invidious.cr
@@ -16,7 +16,13 @@
|
|||||||
|
|
||||||
require "digest/md5"
|
require "digest/md5"
|
||||||
require "file_utils"
|
require "file_utils"
|
||||||
|
|
||||||
|
# Require kemal, kilt, then our own overrides
|
||||||
require "kemal"
|
require "kemal"
|
||||||
|
require "kilt"
|
||||||
|
require "./ext/kemal_content_for.cr"
|
||||||
|
require "./ext/kemal_static_file_handler.cr"
|
||||||
|
|
||||||
require "athena-negotiation"
|
require "athena-negotiation"
|
||||||
require "openssl/hmac"
|
require "openssl/hmac"
|
||||||
require "option_parser"
|
require "option_parser"
|
||||||
@@ -27,6 +33,7 @@ require "compress/zip"
|
|||||||
require "protodec/utils"
|
require "protodec/utils"
|
||||||
|
|
||||||
require "./invidious/database/*"
|
require "./invidious/database/*"
|
||||||
|
require "./invidious/database/migrations/*"
|
||||||
require "./invidious/helpers/*"
|
require "./invidious/helpers/*"
|
||||||
require "./invidious/yt_backend/*"
|
require "./invidious/yt_backend/*"
|
||||||
require "./invidious/frontend/*"
|
require "./invidious/frontend/*"
|
||||||
@@ -34,6 +41,7 @@ require "./invidious/frontend/*"
|
|||||||
require "./invidious/*"
|
require "./invidious/*"
|
||||||
require "./invidious/channels/*"
|
require "./invidious/channels/*"
|
||||||
require "./invidious/user/*"
|
require "./invidious/user/*"
|
||||||
|
require "./invidious/search/*"
|
||||||
require "./invidious/routes/**"
|
require "./invidious/routes/**"
|
||||||
require "./invidious/jobs/**"
|
require "./invidious/jobs/**"
|
||||||
|
|
||||||
@@ -102,6 +110,10 @@ Kemal.config.extra_options do |parser|
|
|||||||
puts SOFTWARE.to_pretty_json
|
puts SOFTWARE.to_pretty_json
|
||||||
exit
|
exit
|
||||||
end
|
end
|
||||||
|
parser.on("--migrate", "Run any migrations (beta, use at your own risk!!") do
|
||||||
|
Invidious::Database::Migrator.new(PG_DB).migrate
|
||||||
|
exit
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Kemal::CLI.new ARGV
|
Kemal::CLI.new ARGV
|
||||||
@@ -121,12 +133,13 @@ Invidious::Database.check_integrity(CONFIG)
|
|||||||
# Running the script by itself would show some colorful feedback while this doesn't.
|
# Running the script by itself would show some colorful feedback while this doesn't.
|
||||||
# Perhaps we should just move the script to runtime in order to get that feedback?
|
# Perhaps we should just move the script to runtime in order to get that feedback?
|
||||||
|
|
||||||
{% puts "\nChecking player dependencies...\n" %}
|
{% puts "\nChecking player dependencies, this may take more than 20 minutes... If it is stuck, check your internet connection.\n" %}
|
||||||
{% if flag?(:minified_player_dependencies) %}
|
{% if flag?(:minified_player_dependencies) %}
|
||||||
{% puts run("../scripts/fetch-player-dependencies.cr", "--minified").stringify %}
|
{% puts run("../scripts/fetch-player-dependencies.cr", "--minified").stringify %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{% puts run("../scripts/fetch-player-dependencies.cr").stringify %}
|
{% puts run("../scripts/fetch-player-dependencies.cr").stringify %}
|
||||||
{% end %}
|
{% end %}
|
||||||
|
{% puts "\nDone checking player dependencies, now compiling Invidious...\n" %}
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
# Start jobs
|
# Start jobs
|
||||||
@@ -165,304 +178,19 @@ def popular_videos
|
|||||||
Invidious::Jobs::PullPopularVideosJob::POPULAR_VIDEOS.get
|
Invidious::Jobs::PullPopularVideosJob::POPULAR_VIDEOS.get
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Routing
|
||||||
|
|
||||||
before_all do |env|
|
before_all do |env|
|
||||||
preferences = Preferences.from_json("{}")
|
Invidious::Routes::BeforeAll.handle(env)
|
||||||
|
|
||||||
begin
|
|
||||||
if prefs_cookie = env.request.cookies["PREFS"]?
|
|
||||||
preferences = Preferences.from_json(URI.decode_www_form(prefs_cookie.value))
|
|
||||||
else
|
|
||||||
if language_header = env.request.headers["Accept-Language"]?
|
|
||||||
if language = ANG.language_negotiator.best(language_header, LOCALES.keys)
|
|
||||||
preferences.locale = language.header
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
rescue
|
|
||||||
preferences = Preferences.from_json("{}")
|
|
||||||
end
|
|
||||||
|
|
||||||
env.set "preferences", preferences
|
|
||||||
env.response.headers["X-XSS-Protection"] = "1; mode=block"
|
|
||||||
env.response.headers["X-Content-Type-Options"] = "nosniff"
|
|
||||||
|
|
||||||
# Allow media resources to be loaded from google servers
|
|
||||||
# TODO: check if *.youtube.com can be removed
|
|
||||||
if CONFIG.disabled?("local") || !preferences.local
|
|
||||||
extra_media_csp = " https://*.googlevideo.com:443 https://*.youtube.com:443"
|
|
||||||
else
|
|
||||||
extra_media_csp = ""
|
|
||||||
end
|
|
||||||
|
|
||||||
# Only allow the pages at /embed/* to be embedded
|
|
||||||
if env.request.resource.starts_with?("/embed")
|
|
||||||
frame_ancestors = "'self' http: https:"
|
|
||||||
else
|
|
||||||
frame_ancestors = "'none'"
|
|
||||||
end
|
|
||||||
|
|
||||||
# TODO: Remove style-src's 'unsafe-inline', requires to remove all
|
|
||||||
# inline styles (<style> [..] </style>, style=" [..] ")
|
|
||||||
env.response.headers["Content-Security-Policy"] = {
|
|
||||||
"default-src 'none'",
|
|
||||||
"script-src 'self'",
|
|
||||||
"style-src 'self' 'unsafe-inline'",
|
|
||||||
"img-src 'self' data:",
|
|
||||||
"font-src 'self' data:",
|
|
||||||
"connect-src 'self'",
|
|
||||||
"manifest-src 'self'",
|
|
||||||
"media-src 'self' blob:" + extra_media_csp,
|
|
||||||
"child-src 'self' blob:",
|
|
||||||
"frame-src 'self'",
|
|
||||||
"frame-ancestors " + frame_ancestors,
|
|
||||||
}.join("; ")
|
|
||||||
|
|
||||||
env.response.headers["Referrer-Policy"] = "same-origin"
|
|
||||||
|
|
||||||
# Ask the chrom*-based browsers to disable FLoC
|
|
||||||
# See: https://blog.runcloud.io/google-floc/
|
|
||||||
env.response.headers["Permissions-Policy"] = "interest-cohort=()"
|
|
||||||
|
|
||||||
if (Kemal.config.ssl || CONFIG.https_only) && CONFIG.hsts
|
|
||||||
env.response.headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains; preload"
|
|
||||||
end
|
|
||||||
|
|
||||||
next if {
|
|
||||||
"/sb/",
|
|
||||||
"/vi/",
|
|
||||||
"/s_p/",
|
|
||||||
"/yts/",
|
|
||||||
"/ggpht/",
|
|
||||||
"/api/manifest/",
|
|
||||||
"/videoplayback",
|
|
||||||
"/latest_version",
|
|
||||||
"/download",
|
|
||||||
}.any? { |r| env.request.resource.starts_with? r }
|
|
||||||
|
|
||||||
if env.request.cookies.has_key? "SID"
|
|
||||||
sid = env.request.cookies["SID"].value
|
|
||||||
|
|
||||||
if sid.starts_with? "v1:"
|
|
||||||
raise "Cannot use token as SID"
|
|
||||||
end
|
|
||||||
|
|
||||||
# Invidious users only have SID
|
|
||||||
if !env.request.cookies.has_key? "SSID"
|
|
||||||
if email = Invidious::Database::SessionIDs.select_email(sid)
|
|
||||||
user = Invidious::Database::Users.select!(email: email)
|
|
||||||
csrf_token = generate_response(sid, {
|
|
||||||
":authorize_token",
|
|
||||||
":playlist_ajax",
|
|
||||||
":signout",
|
|
||||||
":subscription_ajax",
|
|
||||||
":token_ajax",
|
|
||||||
":watch_ajax",
|
|
||||||
}, HMAC_KEY, 1.week)
|
|
||||||
|
|
||||||
preferences = user.preferences
|
|
||||||
env.set "preferences", preferences
|
|
||||||
|
|
||||||
env.set "sid", sid
|
|
||||||
env.set "csrf_token", csrf_token
|
|
||||||
env.set "user", user
|
|
||||||
end
|
|
||||||
else
|
|
||||||
headers = HTTP::Headers.new
|
|
||||||
headers["Cookie"] = env.request.headers["Cookie"]
|
|
||||||
|
|
||||||
begin
|
|
||||||
user, sid = get_user(sid, headers, false)
|
|
||||||
csrf_token = generate_response(sid, {
|
|
||||||
":authorize_token",
|
|
||||||
":playlist_ajax",
|
|
||||||
":signout",
|
|
||||||
":subscription_ajax",
|
|
||||||
":token_ajax",
|
|
||||||
":watch_ajax",
|
|
||||||
}, HMAC_KEY, 1.week)
|
|
||||||
|
|
||||||
preferences = user.preferences
|
|
||||||
env.set "preferences", preferences
|
|
||||||
|
|
||||||
env.set "sid", sid
|
|
||||||
env.set "csrf_token", csrf_token
|
|
||||||
env.set "user", user
|
|
||||||
rescue ex
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
dark_mode = convert_theme(env.params.query["dark_mode"]?) || preferences.dark_mode.to_s
|
|
||||||
thin_mode = env.params.query["thin_mode"]? || preferences.thin_mode.to_s
|
|
||||||
thin_mode = thin_mode == "true"
|
|
||||||
locale = env.params.query["hl"]? || preferences.locale
|
|
||||||
|
|
||||||
preferences.dark_mode = dark_mode
|
|
||||||
preferences.thin_mode = thin_mode
|
|
||||||
preferences.locale = locale
|
|
||||||
env.set "preferences", preferences
|
|
||||||
|
|
||||||
current_page = env.request.path
|
|
||||||
if env.request.query
|
|
||||||
query = HTTP::Params.parse(env.request.query.not_nil!)
|
|
||||||
|
|
||||||
if query["referer"]?
|
|
||||||
query["referer"] = get_referer(env, "/")
|
|
||||||
end
|
|
||||||
|
|
||||||
current_page += "?#{query}"
|
|
||||||
end
|
|
||||||
|
|
||||||
env.set "current_page", URI.encode_www_form(current_page)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
{% unless flag?(:api_only) %}
|
Invidious::Routing.register_all
|
||||||
Invidious::Routing.get "/", Invidious::Routes::Misc, :home
|
|
||||||
Invidious::Routing.get "/privacy", Invidious::Routes::Misc, :privacy
|
|
||||||
Invidious::Routing.get "/licenses", Invidious::Routes::Misc, :licenses
|
|
||||||
|
|
||||||
Invidious::Routing.get "/channel/:ucid", Invidious::Routes::Channels, :home
|
|
||||||
Invidious::Routing.get "/channel/:ucid/home", Invidious::Routes::Channels, :home
|
|
||||||
Invidious::Routing.get "/channel/:ucid/videos", Invidious::Routes::Channels, :videos
|
|
||||||
Invidious::Routing.get "/channel/:ucid/playlists", Invidious::Routes::Channels, :playlists
|
|
||||||
Invidious::Routing.get "/channel/:ucid/community", Invidious::Routes::Channels, :community
|
|
||||||
Invidious::Routing.get "/channel/:ucid/about", Invidious::Routes::Channels, :about
|
|
||||||
Invidious::Routing.get "/channel/:ucid/live", Invidious::Routes::Channels, :live
|
|
||||||
Invidious::Routing.get "/user/:user/live", Invidious::Routes::Channels, :live
|
|
||||||
Invidious::Routing.get "/c/:user/live", Invidious::Routes::Channels, :live
|
|
||||||
|
|
||||||
["", "/videos", "/playlists", "/community", "/about"].each do |path|
|
|
||||||
# /c/LinusTechTips
|
|
||||||
Invidious::Routing.get "/c/:user#{path}", Invidious::Routes::Channels, :brand_redirect
|
|
||||||
# /user/linustechtips | Not always the same as /c/
|
|
||||||
Invidious::Routing.get "/user/:user#{path}", Invidious::Routes::Channels, :brand_redirect
|
|
||||||
# /attribution_link?a=anything&u=/channel/UCZYTClx2T1of7BRZ86-8fow
|
|
||||||
Invidious::Routing.get "/attribution_link#{path}", Invidious::Routes::Channels, :brand_redirect
|
|
||||||
# /profile?user=linustechtips
|
|
||||||
Invidious::Routing.get "/profile/#{path}", Invidious::Routes::Channels, :profile
|
|
||||||
end
|
|
||||||
|
|
||||||
Invidious::Routing.get "/watch", Invidious::Routes::Watch, :handle
|
|
||||||
Invidious::Routing.post "/watch_ajax", Invidious::Routes::Watch, :mark_watched
|
|
||||||
Invidious::Routing.get "/watch/:id", Invidious::Routes::Watch, :redirect
|
|
||||||
Invidious::Routing.get "/shorts/:id", Invidious::Routes::Watch, :redirect
|
|
||||||
Invidious::Routing.get "/clip/:clip", Invidious::Routes::Watch, :clip
|
|
||||||
Invidious::Routing.get "/w/:id", Invidious::Routes::Watch, :redirect
|
|
||||||
Invidious::Routing.get "/v/:id", Invidious::Routes::Watch, :redirect
|
|
||||||
Invidious::Routing.get "/e/:id", Invidious::Routes::Watch, :redirect
|
|
||||||
Invidious::Routing.get "/redirect", Invidious::Routes::Misc, :cross_instance_redirect
|
|
||||||
|
|
||||||
Invidious::Routing.post "/download", Invidious::Routes::Watch, :download
|
|
||||||
|
|
||||||
Invidious::Routing.get "/embed/", Invidious::Routes::Embed, :redirect
|
|
||||||
Invidious::Routing.get "/embed/:id", Invidious::Routes::Embed, :show
|
|
||||||
|
|
||||||
Invidious::Routing.get "/create_playlist", Invidious::Routes::Playlists, :new
|
|
||||||
Invidious::Routing.post "/create_playlist", Invidious::Routes::Playlists, :create
|
|
||||||
Invidious::Routing.get "/subscribe_playlist", Invidious::Routes::Playlists, :subscribe
|
|
||||||
Invidious::Routing.get "/delete_playlist", Invidious::Routes::Playlists, :delete_page
|
|
||||||
Invidious::Routing.post "/delete_playlist", Invidious::Routes::Playlists, :delete
|
|
||||||
Invidious::Routing.get "/edit_playlist", Invidious::Routes::Playlists, :edit
|
|
||||||
Invidious::Routing.post "/edit_playlist", Invidious::Routes::Playlists, :update
|
|
||||||
Invidious::Routing.get "/add_playlist_items", Invidious::Routes::Playlists, :add_playlist_items_page
|
|
||||||
Invidious::Routing.post "/playlist_ajax", Invidious::Routes::Playlists, :playlist_ajax
|
|
||||||
Invidious::Routing.get "/playlist", Invidious::Routes::Playlists, :show
|
|
||||||
Invidious::Routing.get "/mix", Invidious::Routes::Playlists, :mix
|
|
||||||
Invidious::Routing.get "/watch_videos", Invidious::Routes::Playlists, :watch_videos
|
|
||||||
|
|
||||||
Invidious::Routing.get "/opensearch.xml", Invidious::Routes::Search, :opensearch
|
|
||||||
Invidious::Routing.get "/results", Invidious::Routes::Search, :results
|
|
||||||
Invidious::Routing.get "/search", Invidious::Routes::Search, :search
|
|
||||||
|
|
||||||
# User routes
|
|
||||||
define_user_routes()
|
|
||||||
|
|
||||||
# Feeds
|
|
||||||
Invidious::Routing.get "/view_all_playlists", Invidious::Routes::Feeds, :view_all_playlists_redirect
|
|
||||||
Invidious::Routing.get "/feed/playlists", Invidious::Routes::Feeds, :playlists
|
|
||||||
Invidious::Routing.get "/feed/popular", Invidious::Routes::Feeds, :popular
|
|
||||||
Invidious::Routing.get "/feed/trending", Invidious::Routes::Feeds, :trending
|
|
||||||
Invidious::Routing.get "/feed/subscriptions", Invidious::Routes::Feeds, :subscriptions
|
|
||||||
Invidious::Routing.get "/feed/history", Invidious::Routes::Feeds, :history
|
|
||||||
|
|
||||||
# RSS Feeds
|
|
||||||
Invidious::Routing.get "/feed/channel/:ucid", Invidious::Routes::Feeds, :rss_channel
|
|
||||||
Invidious::Routing.get "/feed/private", Invidious::Routes::Feeds, :rss_private
|
|
||||||
Invidious::Routing.get "/feed/playlist/:plid", Invidious::Routes::Feeds, :rss_playlist
|
|
||||||
Invidious::Routing.get "/feeds/videos.xml", Invidious::Routes::Feeds, :rss_videos
|
|
||||||
|
|
||||||
# Support push notifications via PubSubHubbub
|
|
||||||
Invidious::Routing.get "/feed/webhook/:token", Invidious::Routes::Feeds, :push_notifications_get
|
|
||||||
Invidious::Routing.post "/feed/webhook/:token", Invidious::Routes::Feeds, :push_notifications_post
|
|
||||||
|
|
||||||
Invidious::Routing.get "/modify_notifications", Invidious::Routes::Notifications, :modify
|
|
||||||
|
|
||||||
Invidious::Routing.post "/subscription_ajax", Invidious::Routes::Subscriptions, :toggle_subscription
|
|
||||||
Invidious::Routing.get "/subscription_manager", Invidious::Routes::Subscriptions, :subscription_manager
|
|
||||||
{% end %}
|
|
||||||
|
|
||||||
Invidious::Routing.get "/ggpht/*", Invidious::Routes::Images, :ggpht
|
|
||||||
Invidious::Routing.options "/sb/:authority/:id/:storyboard/:index", Invidious::Routes::Images, :options_storyboard
|
|
||||||
Invidious::Routing.get "/sb/:authority/:id/:storyboard/:index", Invidious::Routes::Images, :get_storyboard
|
|
||||||
Invidious::Routing.get "/s_p/:id/:name", Invidious::Routes::Images, :s_p_image
|
|
||||||
Invidious::Routing.get "/yts/img/:name", Invidious::Routes::Images, :yts_image
|
|
||||||
Invidious::Routing.get "/vi/:id/:name", Invidious::Routes::Images, :thumbnails
|
|
||||||
|
|
||||||
# API routes (macro)
|
|
||||||
define_v1_api_routes()
|
|
||||||
|
|
||||||
# Video playback (macros)
|
|
||||||
define_api_manifest_routes()
|
|
||||||
define_video_playback_routes()
|
|
||||||
|
|
||||||
error 404 do |env|
|
error 404 do |env|
|
||||||
if md = env.request.path.match(/^\/(?<id>([a-zA-Z0-9_-]{11})|(\w+))$/)
|
Invidious::Routes::ErrorRoutes.error_404(env)
|
||||||
item = md["id"]
|
|
||||||
|
|
||||||
# Check if item is branding URL e.g. https://youtube.com/gaming
|
|
||||||
response = YT_POOL.client &.get("/#{item}")
|
|
||||||
|
|
||||||
if response.status_code == 301
|
|
||||||
response = YT_POOL.client &.get(URI.parse(response.headers["Location"]).request_target)
|
|
||||||
end
|
|
||||||
|
|
||||||
if response.body.empty?
|
|
||||||
env.response.headers["Location"] = "/"
|
|
||||||
halt env, status_code: 302
|
|
||||||
end
|
|
||||||
|
|
||||||
html = XML.parse_html(response.body)
|
|
||||||
ucid = html.xpath_node(%q(//link[@rel="canonical"])).try &.["href"].split("/")[-1]
|
|
||||||
|
|
||||||
if ucid
|
|
||||||
env.response.headers["Location"] = "/channel/#{ucid}"
|
|
||||||
halt env, status_code: 302
|
|
||||||
end
|
|
||||||
|
|
||||||
params = [] of String
|
|
||||||
env.params.query.each do |k, v|
|
|
||||||
params << "#{k}=#{v}"
|
|
||||||
end
|
|
||||||
params = params.join("&")
|
|
||||||
|
|
||||||
url = "/watch?v=#{item}"
|
|
||||||
if !params.empty?
|
|
||||||
url += "&#{params}"
|
|
||||||
end
|
|
||||||
|
|
||||||
# Check if item is video ID
|
|
||||||
if item.match(/^[a-zA-Z0-9_-]{11}$/) && YT_POOL.client &.head("/watch?v=#{item}").status_code != 404
|
|
||||||
env.response.headers["Location"] = url
|
|
||||||
halt env, status_code: 302
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
env.response.headers["Location"] = "/"
|
|
||||||
halt env, status_code: 302
|
|
||||||
end
|
end
|
||||||
|
|
||||||
error 500 do |env, ex|
|
error 500 do |env, ex|
|
||||||
locale = env.get("preferences").as(Preferences).locale
|
|
||||||
error_template(500, ex)
|
error_template(500, ex)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -470,6 +198,8 @@ static_headers do |response|
|
|||||||
response.headers.add("Cache-Control", "max-age=2629800")
|
response.headers.add("Cache-Control", "max-age=2629800")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Init Kemal
|
||||||
|
|
||||||
public_folder "assets"
|
public_folder "assets"
|
||||||
|
|
||||||
Kemal.config.powered_by_header = false
|
Kemal.config.powered_by_header = false
|
||||||
|
|||||||
@@ -6,13 +6,15 @@ record AboutChannel,
|
|||||||
author_url : String,
|
author_url : String,
|
||||||
author_thumbnail : String,
|
author_thumbnail : String,
|
||||||
banner : String?,
|
banner : String?,
|
||||||
|
description : String,
|
||||||
description_html : String,
|
description_html : String,
|
||||||
total_views : Int64,
|
total_views : Int64,
|
||||||
sub_count : Int32,
|
sub_count : Int32,
|
||||||
joined : Time,
|
joined : Time,
|
||||||
is_family_friendly : Bool,
|
is_family_friendly : Bool,
|
||||||
allowed_regions : Array(String),
|
allowed_regions : Array(String),
|
||||||
tabs : Array(String)
|
tabs : Array(String),
|
||||||
|
verified : Bool
|
||||||
|
|
||||||
record AboutRelatedChannel,
|
record AboutRelatedChannel,
|
||||||
ucid : String,
|
ucid : String,
|
||||||
@@ -29,7 +31,12 @@ def get_about_info(ucid, locale) : AboutChannel
|
|||||||
end
|
end
|
||||||
|
|
||||||
if initdata.dig?("alerts", 0, "alertRenderer", "type") == "ERROR"
|
if initdata.dig?("alerts", 0, "alertRenderer", "type") == "ERROR"
|
||||||
raise InfoException.new(initdata["alerts"][0]["alertRenderer"]["text"]["simpleText"].as_s)
|
error_message = initdata["alerts"][0]["alertRenderer"]["text"]["simpleText"].as_s
|
||||||
|
if error_message == "This channel does not exist."
|
||||||
|
raise NotFoundException.new(error_message)
|
||||||
|
else
|
||||||
|
raise InfoException.new(error_message)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if browse_endpoint = initdata["onResponseReceivedActions"]?.try &.[0]?.try &.["navigateAction"]?.try &.["endpoint"]?.try &.["browseEndpoint"]?
|
if browse_endpoint = initdata["onResponseReceivedActions"]?.try &.[0]?.try &.["navigateAction"]?.try &.["endpoint"]?.try &.["browseEndpoint"]?
|
||||||
@@ -51,15 +58,12 @@ def get_about_info(ucid, locale) : AboutChannel
|
|||||||
banners = initdata["header"]["interactiveTabbedHeaderRenderer"]?.try &.["banner"]?.try &.["thumbnails"]?
|
banners = initdata["header"]["interactiveTabbedHeaderRenderer"]?.try &.["banner"]?.try &.["thumbnails"]?
|
||||||
banner = banners.try &.[-1]?.try &.["url"].as_s?
|
banner = banners.try &.[-1]?.try &.["url"].as_s?
|
||||||
|
|
||||||
description = initdata["header"]["interactiveTabbedHeaderRenderer"]["description"]["simpleText"].as_s
|
description_node = initdata["header"]["interactiveTabbedHeaderRenderer"]["description"]
|
||||||
description_html = HTML.escape(description)
|
|
||||||
|
|
||||||
is_family_friendly = initdata["microformat"]["microformatDataRenderer"]["familySafe"].as_bool
|
|
||||||
allowed_regions = initdata["microformat"]["microformatDataRenderer"]["availableCountries"].as_a.map(&.as_s)
|
|
||||||
else
|
else
|
||||||
author = initdata["metadata"]["channelMetadataRenderer"]["title"].as_s
|
author = initdata["metadata"]["channelMetadataRenderer"]["title"].as_s
|
||||||
author_url = initdata["metadata"]["channelMetadataRenderer"]["channelUrl"].as_s
|
author_url = initdata["metadata"]["channelMetadataRenderer"]["channelUrl"].as_s
|
||||||
author_thumbnail = initdata["metadata"]["channelMetadataRenderer"]["avatar"]["thumbnails"][0]["url"].as_s
|
author_thumbnail = initdata["metadata"]["channelMetadataRenderer"]["avatar"]["thumbnails"][0]["url"].as_s
|
||||||
|
author_verified = has_verified_badge?(initdata.dig?("header", "c4TabbedHeaderRenderer", "badges"))
|
||||||
|
|
||||||
ucid = initdata["metadata"]["channelMetadataRenderer"]["externalId"].as_s
|
ucid = initdata["metadata"]["channelMetadataRenderer"]["externalId"].as_s
|
||||||
|
|
||||||
@@ -71,11 +75,26 @@ def get_about_info(ucid, locale) : AboutChannel
|
|||||||
# banner = nil
|
# banner = nil
|
||||||
# end
|
# end
|
||||||
|
|
||||||
description = initdata["metadata"]["channelMetadataRenderer"]?.try &.["description"]?.try &.as_s? || ""
|
description_node = initdata["metadata"]["channelMetadataRenderer"]?.try &.["description"]?
|
||||||
description_html = HTML.escape(description)
|
end
|
||||||
|
|
||||||
is_family_friendly = initdata["microformat"]["microformatDataRenderer"]["familySafe"].as_bool
|
is_family_friendly = initdata["microformat"]["microformatDataRenderer"]["familySafe"].as_bool
|
||||||
allowed_regions = initdata["microformat"]["microformatDataRenderer"]["availableCountries"].as_a.map(&.as_s)
|
|
||||||
|
allowed_regions = initdata
|
||||||
|
.dig?("microformat", "microformatDataRenderer", "availableCountries")
|
||||||
|
.try &.as_a.map(&.as_s) || [] of String
|
||||||
|
|
||||||
|
description = !description_node.nil? ? description_node.as_s : ""
|
||||||
|
description_html = HTML.escape(description)
|
||||||
|
|
||||||
|
if !description_node.nil?
|
||||||
|
if description_node.as_h?.nil?
|
||||||
|
description_node = text_to_parsed_content(description_node.as_s)
|
||||||
|
end
|
||||||
|
description_html = parse_content(description_node)
|
||||||
|
if description_html == "" && description != ""
|
||||||
|
description_html = HTML.escape(description)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
total_views = 0_i64
|
total_views = 0_i64
|
||||||
@@ -121,6 +140,7 @@ def get_about_info(ucid, locale) : AboutChannel
|
|||||||
author_url: author_url,
|
author_url: author_url,
|
||||||
author_thumbnail: author_thumbnail,
|
author_thumbnail: author_thumbnail,
|
||||||
banner: banner,
|
banner: banner,
|
||||||
|
description: description,
|
||||||
description_html: description_html,
|
description_html: description_html,
|
||||||
total_views: total_views,
|
total_views: total_views,
|
||||||
sub_count: sub_count,
|
sub_count: sub_count,
|
||||||
@@ -128,6 +148,7 @@ def get_about_info(ucid, locale) : AboutChannel
|
|||||||
is_family_friendly: is_family_friendly,
|
is_family_friendly: is_family_friendly,
|
||||||
allowed_regions: allowed_regions,
|
allowed_regions: allowed_regions,
|
||||||
tabs: tabs,
|
tabs: tabs,
|
||||||
|
verified: author_verified || false,
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -6,20 +6,18 @@ def fetch_channel_community(ucid, continuation, locale, format, thin_mode)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if response.status_code != 200
|
if response.status_code != 200
|
||||||
raise InfoException.new("This channel does not exist.")
|
raise NotFoundException.new("This channel does not exist.")
|
||||||
end
|
end
|
||||||
|
|
||||||
ucid = response.body.match(/https:\/\/www.youtube.com\/channel\/(?<ucid>UC[a-zA-Z0-9_-]{22})/).not_nil!["ucid"]
|
ucid = response.body.match(/https:\/\/www.youtube.com\/channel\/(?<ucid>UC[a-zA-Z0-9_-]{22})/).not_nil!["ucid"]
|
||||||
|
|
||||||
if !continuation || continuation.empty?
|
if !continuation || continuation.empty?
|
||||||
initial_data = extract_initial_data(response.body)
|
initial_data = extract_initial_data(response.body)
|
||||||
body = initial_data["contents"]?.try &.["twoColumnBrowseResultsRenderer"]["tabs"].as_a.select { |tab| tab["tabRenderer"]?.try &.["selected"].as_bool.== true }[0]?
|
body = extract_selected_tab(initial_data["contents"]["twoColumnBrowseResultsRenderer"]["tabs"])["content"]["sectionListRenderer"]["contents"][0]["itemSectionRenderer"]
|
||||||
|
|
||||||
if !body
|
if !body
|
||||||
raise InfoException.new("Could not extract community tab.")
|
raise InfoException.new("Could not extract community tab.")
|
||||||
end
|
end
|
||||||
|
|
||||||
body = body["tabRenderer"]["content"]["sectionListRenderer"]["contents"][0]["itemSectionRenderer"]
|
|
||||||
else
|
else
|
||||||
continuation = produce_channel_community_continuation(ucid, continuation)
|
continuation = produce_channel_community_continuation(ucid, continuation)
|
||||||
|
|
||||||
@@ -49,7 +47,11 @@ def fetch_channel_community(ucid, continuation, locale, format, thin_mode)
|
|||||||
error_message = (message["text"]["simpleText"]? ||
|
error_message = (message["text"]["simpleText"]? ||
|
||||||
message["text"]["runs"]?.try &.[0]?.try &.["text"]?)
|
message["text"]["runs"]?.try &.[0]?.try &.["text"]?)
|
||||||
.try &.as_s || ""
|
.try &.as_s || ""
|
||||||
raise InfoException.new(error_message)
|
if error_message == "This channel does not exist."
|
||||||
|
raise NotFoundException.new(error_message)
|
||||||
|
else
|
||||||
|
raise InfoException.new(error_message)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
response = JSON.build do |json|
|
response = JSON.build do |json|
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ def fetch_youtube_comments(id, cursor, format, locale, thin_mode, region, sort_b
|
|||||||
contents = body["contents"]?
|
contents = body["contents"]?
|
||||||
header = body["header"]?
|
header = body["header"]?
|
||||||
else
|
else
|
||||||
raise InfoException.new("Could not fetch comments")
|
raise NotFoundException.new("Comments not found.")
|
||||||
end
|
end
|
||||||
|
|
||||||
if !contents
|
if !contents
|
||||||
@@ -143,9 +143,11 @@ def fetch_youtube_comments(id, cursor, format, locale, thin_mode, region, sort_b
|
|||||||
node_comment = node["commentRenderer"]
|
node_comment = node["commentRenderer"]
|
||||||
end
|
end
|
||||||
|
|
||||||
content_html = node_comment["contentText"]?.try { |t| parse_content(t) } || ""
|
content_html = node_comment["contentText"]?.try { |t| parse_content(t, id) } || ""
|
||||||
author = node_comment["authorText"]?.try &.["simpleText"]? || ""
|
author = node_comment["authorText"]?.try &.["simpleText"]? || ""
|
||||||
|
|
||||||
|
json.field "verified", (node_comment["authorCommentBadge"]? != nil)
|
||||||
|
|
||||||
json.field "author", author
|
json.field "author", author
|
||||||
json.field "authorThumbnails" do
|
json.field "authorThumbnails" do
|
||||||
json.array do
|
json.array do
|
||||||
@@ -288,7 +290,7 @@ def fetch_reddit_comments(id, sort_by = "confidence")
|
|||||||
|
|
||||||
thread = result[0].data.as(RedditListing).children[0].data.as(RedditLink)
|
thread = result[0].data.as(RedditListing).children[0].data.as(RedditLink)
|
||||||
else
|
else
|
||||||
raise InfoException.new("Could not fetch comments")
|
raise NotFoundException.new("Comments not found.")
|
||||||
end
|
end
|
||||||
|
|
||||||
client.close
|
client.close
|
||||||
@@ -329,7 +331,11 @@ def template_youtube_comments(comments, locale, thin_mode, is_replies = false)
|
|||||||
end
|
end
|
||||||
|
|
||||||
author_name = HTML.escape(child["author"].as_s)
|
author_name = HTML.escape(child["author"].as_s)
|
||||||
|
if child["verified"]?.try &.as_bool && child["authorIsChannelOwner"]?.try &.as_bool
|
||||||
|
author_name += " <i class=\"icon ion ion-md-checkmark-circle\"></i>"
|
||||||
|
elsif child["verified"]?.try &.as_bool
|
||||||
|
author_name += " <i class=\"icon ion ion-md-checkmark\"></i>"
|
||||||
|
end
|
||||||
html << <<-END_HTML
|
html << <<-END_HTML
|
||||||
<div class="pure-g" style="width:100%">
|
<div class="pure-g" style="width:100%">
|
||||||
<div class="channel-profile pure-u-4-24 pure-u-md-2-24">
|
<div class="channel-profile pure-u-4-24 pure-u-md-2-24">
|
||||||
@@ -475,7 +481,7 @@ def template_reddit_comments(root, locale)
|
|||||||
|
|
||||||
html << <<-END_HTML
|
html << <<-END_HTML
|
||||||
<p>
|
<p>
|
||||||
<a href="javascript:void(0)" data-onclick="toggle_parent">[ - ]</a>
|
<a href="javascript:void(0)" data-onclick="toggle_parent">[ − ]</a>
|
||||||
<b><a href="https://www.reddit.com/user/#{child.author}">#{child.author}</a></b>
|
<b><a href="https://www.reddit.com/user/#{child.author}">#{child.author}</a></b>
|
||||||
#{translate_count(locale, "comments_points_count", child.score, NumberFormatting::Separator)}
|
#{translate_count(locale, "comments_points_count", child.score, NumberFormatting::Separator)}
|
||||||
<span title="#{child.created_utc.to_s(translate(locale, "%a %B %-d %T %Y UTC"))}">#{translate(locale, "`x` ago", recode_date(child.created_utc, locale))}</span>
|
<span title="#{child.created_utc.to_s(translate(locale, "%a %B %-d %T %Y UTC"))}">#{translate(locale, "`x` ago", recode_date(child.created_utc, locale))}</span>
|
||||||
@@ -494,6 +500,12 @@ def template_reddit_comments(root, locale)
|
|||||||
end
|
end
|
||||||
|
|
||||||
def replace_links(html)
|
def replace_links(html)
|
||||||
|
# Check if the document is empty
|
||||||
|
# Prevents edge-case bug with Reddit comments, see issue #3115
|
||||||
|
if html.nil? || html.empty?
|
||||||
|
return html
|
||||||
|
end
|
||||||
|
|
||||||
html = XML.parse_html(html)
|
html = XML.parse_html(html)
|
||||||
|
|
||||||
html.xpath_nodes(%q(//a)).each do |anchor|
|
html.xpath_nodes(%q(//a)).each do |anchor|
|
||||||
@@ -535,6 +547,12 @@ def replace_links(html)
|
|||||||
end
|
end
|
||||||
|
|
||||||
def fill_links(html, scheme, host)
|
def fill_links(html, scheme, host)
|
||||||
|
# Check if the document is empty
|
||||||
|
# Prevents edge-case bug with Reddit comments, see issue #3115
|
||||||
|
if html.nil? || html.empty?
|
||||||
|
return html
|
||||||
|
end
|
||||||
|
|
||||||
html = XML.parse_html(html)
|
html = XML.parse_html(html)
|
||||||
|
|
||||||
html.xpath_nodes("//a").each do |match|
|
html.xpath_nodes("//a").each do |match|
|
||||||
@@ -554,26 +572,65 @@ def fill_links(html, scheme, host)
|
|||||||
return html.to_xml(options: XML::SaveOptions::NO_DECL)
|
return html.to_xml(options: XML::SaveOptions::NO_DECL)
|
||||||
end
|
end
|
||||||
|
|
||||||
def parse_content(content : JSON::Any) : String
|
def text_to_parsed_content(text : String) : JSON::Any
|
||||||
content["simpleText"]?.try &.as_s.rchop('\ufeff').try { |b| HTML.escape(b) }.to_s ||
|
nodes = [] of JSON::Any
|
||||||
content["runs"]?.try &.as_a.try { |r| content_to_comment_html(r).try &.to_s.gsub("\n", "<br>") } || ""
|
# For each line convert line to array of nodes
|
||||||
|
text.split('\n').each do |line|
|
||||||
|
# In first case line is just a simple node before
|
||||||
|
# check patterns inside line
|
||||||
|
# { 'text': line }
|
||||||
|
currentNodes = [] of JSON::Any
|
||||||
|
initialNode = {"text" => line}
|
||||||
|
currentNodes << (JSON.parse(initialNode.to_json))
|
||||||
|
|
||||||
|
# For each match with url pattern, get last node and preserve
|
||||||
|
# last node before create new node with url information
|
||||||
|
# { 'text': match, 'navigationEndpoint': { 'urlEndpoint' : 'url': match } }
|
||||||
|
line.scan(/https?:\/\/[^ ]*/).each do |urlMatch|
|
||||||
|
# Retrieve last node and update node without match
|
||||||
|
lastNode = currentNodes[currentNodes.size - 1].as_h
|
||||||
|
splittedLastNode = lastNode["text"].as_s.split(urlMatch[0])
|
||||||
|
lastNode["text"] = JSON.parse(splittedLastNode[0].to_json)
|
||||||
|
currentNodes[currentNodes.size - 1] = JSON.parse(lastNode.to_json)
|
||||||
|
# Create new node with match and navigation infos
|
||||||
|
currentNode = {"text" => urlMatch[0], "navigationEndpoint" => {"urlEndpoint" => {"url" => urlMatch[0]}}}
|
||||||
|
currentNodes << (JSON.parse(currentNode.to_json))
|
||||||
|
# If text remain after match create new simple node with text after match
|
||||||
|
afterNode = {"text" => splittedLastNode.size > 0 ? splittedLastNode[1] : ""}
|
||||||
|
currentNodes << (JSON.parse(afterNode.to_json))
|
||||||
|
end
|
||||||
|
|
||||||
|
# After processing of matches inside line
|
||||||
|
# Add \n at end of last node for preserve carriage return
|
||||||
|
lastNode = currentNodes[currentNodes.size - 1].as_h
|
||||||
|
lastNode["text"] = JSON.parse("#{currentNodes[currentNodes.size - 1]["text"]}\n".to_json)
|
||||||
|
currentNodes[currentNodes.size - 1] = JSON.parse(lastNode.to_json)
|
||||||
|
|
||||||
|
# Finally add final nodes to nodes returned
|
||||||
|
currentNodes.each do |node|
|
||||||
|
nodes << (node)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return JSON.parse({"runs" => nodes}.to_json)
|
||||||
end
|
end
|
||||||
|
|
||||||
def content_to_comment_html(content)
|
def parse_content(content : JSON::Any, video_id : String? = "") : String
|
||||||
comment_html = content.map do |run|
|
content["simpleText"]?.try &.as_s.rchop('\ufeff').try { |b| HTML.escape(b) }.to_s ||
|
||||||
|
content["runs"]?.try &.as_a.try { |r| content_to_comment_html(r, video_id).try &.to_s.gsub("\n", "<br>") } || ""
|
||||||
|
end
|
||||||
|
|
||||||
|
def content_to_comment_html(content, video_id : String? = "")
|
||||||
|
html_array = content.map do |run|
|
||||||
|
# Sometimes, there is an empty element.
|
||||||
|
# See: https://github.com/iv-org/invidious/issues/3096
|
||||||
|
next if run.as_h.empty?
|
||||||
|
|
||||||
text = HTML.escape(run["text"].as_s)
|
text = HTML.escape(run["text"].as_s)
|
||||||
|
|
||||||
if run["bold"]?
|
|
||||||
text = "<b>#{text}</b>"
|
|
||||||
end
|
|
||||||
|
|
||||||
if run["italics"]?
|
|
||||||
text = "<i>#{text}</i>"
|
|
||||||
end
|
|
||||||
|
|
||||||
if run["navigationEndpoint"]?
|
if run["navigationEndpoint"]?
|
||||||
if url = run["navigationEndpoint"]["urlEndpoint"]?.try &.["url"].as_s
|
if url = run["navigationEndpoint"]["urlEndpoint"]?.try &.["url"].as_s
|
||||||
url = URI.parse(url)
|
url = URI.parse(url)
|
||||||
|
displayed_url = text
|
||||||
|
|
||||||
if url.host == "youtu.be"
|
if url.host == "youtu.be"
|
||||||
url = "/watch?v=#{url.request_target.lstrip('/')}"
|
url = "/watch?v=#{url.request_target.lstrip('/')}"
|
||||||
@@ -581,31 +638,53 @@ def content_to_comment_html(content)
|
|||||||
if url.path == "/redirect"
|
if url.path == "/redirect"
|
||||||
# Sometimes, links can be corrupted (why?) so make sure to fallback
|
# Sometimes, links can be corrupted (why?) so make sure to fallback
|
||||||
# nicely. See https://github.com/iv-org/invidious/issues/2682
|
# nicely. See https://github.com/iv-org/invidious/issues/2682
|
||||||
url = HTTP::Params.parse(url.query.not_nil!)["q"]? || ""
|
url = url.query_params["q"]? || ""
|
||||||
|
displayed_url = url
|
||||||
else
|
else
|
||||||
url = url.request_target
|
url = url.request_target
|
||||||
|
displayed_url = "youtube.com#{url}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
text = %(<a href="#{url}">#{text}</a>)
|
text = %(<a href="#{url}">#{reduce_uri(displayed_url)}</a>)
|
||||||
elsif watch_endpoint = run["navigationEndpoint"]["watchEndpoint"]?
|
elsif watch_endpoint = run["navigationEndpoint"]["watchEndpoint"]?
|
||||||
length_seconds = watch_endpoint["startTimeSeconds"]?
|
start_time = watch_endpoint["startTimeSeconds"]?.try &.as_i
|
||||||
video_id = watch_endpoint["videoId"].as_s
|
link_video_id = watch_endpoint["videoId"].as_s
|
||||||
|
|
||||||
if length_seconds && length_seconds.as_i > 0
|
url = "/watch?v=#{link_video_id}"
|
||||||
text = %(<a href="javascript:void(0)" data-onclick="jump_to_time" data-jump-time="#{length_seconds}">#{text}</a>)
|
url += "&t=#{start_time}" if !start_time.nil?
|
||||||
|
|
||||||
|
# If the current video ID (passed through from the caller function)
|
||||||
|
# is the same as the video ID in the link, add HTML attributes for
|
||||||
|
# the JS handler function that bypasses page reload.
|
||||||
|
#
|
||||||
|
# See: https://github.com/iv-org/invidious/issues/3063
|
||||||
|
if link_video_id == video_id
|
||||||
|
start_time ||= 0
|
||||||
|
text = %(<a href="#{url}" data-onclick="jump_to_time" data-jump-time="#{start_time}">#{reduce_uri(text)}</a>)
|
||||||
else
|
else
|
||||||
text = %(<a href="/watch?v=#{video_id}">#{text}</a>)
|
text = %(<a href="#{url}">#{text}</a>)
|
||||||
end
|
end
|
||||||
elsif url = run.dig?("navigationEndpoint", "commandMetadata", "webCommandMetadata", "url").try &.as_s
|
elsif url = run.dig?("navigationEndpoint", "commandMetadata", "webCommandMetadata", "url").try &.as_s
|
||||||
text = %(<a href="#{url}">#{text}</a>)
|
if text.starts_with?(/\s?[@#]/)
|
||||||
|
# Handle "pings" in comments and hasthags differently
|
||||||
|
# See:
|
||||||
|
# - https://github.com/iv-org/invidious/issues/3038
|
||||||
|
# - https://github.com/iv-org/invidious/issues/3062
|
||||||
|
text = %(<a href="#{url}">#{text}</a>)
|
||||||
|
else
|
||||||
|
text = %(<a href="#{url}">#{reduce_uri(url)}</a>)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
text
|
text = "<b>#{text}</b>" if run["bold"]?
|
||||||
end.join("").delete('\ufeff')
|
text = "<i>#{text}</i>" if run["italics"]?
|
||||||
|
|
||||||
return comment_html
|
text
|
||||||
|
end
|
||||||
|
|
||||||
|
return html_array.join("").delete('\ufeff')
|
||||||
end
|
end
|
||||||
|
|
||||||
def produce_comment_continuation(video_id, cursor = "", sort_by = "top")
|
def produce_comment_continuation(video_id, cursor = "", sort_by = "top")
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class Config
|
|||||||
@[YAML::Field(converter: Preferences::URIConverter)]
|
@[YAML::Field(converter: Preferences::URIConverter)]
|
||||||
property database_url : URI = URI.parse("")
|
property database_url : URI = URI.parse("")
|
||||||
# Use polling to keep decryption function up to date
|
# Use polling to keep decryption function up to date
|
||||||
property decrypt_polling : Bool = true
|
property decrypt_polling : Bool = false
|
||||||
# Used for crawling channels: threads should check all videos uploaded by a channel
|
# Used for crawling channels: threads should check all videos uploaded by a channel
|
||||||
property full_refresh : Bool = false
|
property full_refresh : Bool = false
|
||||||
# Used to tell Invidious it is behind a proxy, so links to resources should be https://
|
# Used to tell Invidious it is behind a proxy, so links to resources should be https://
|
||||||
@@ -161,16 +161,13 @@ class Config
|
|||||||
{% env_id = "INVIDIOUS_#{ivar.id.upcase}" %}
|
{% env_id = "INVIDIOUS_#{ivar.id.upcase}" %}
|
||||||
|
|
||||||
if ENV.has_key?({{env_id}})
|
if ENV.has_key?({{env_id}})
|
||||||
# puts %(Config.{{ivar.id}} : Loading from env var {{env_id}})
|
|
||||||
env_value = ENV.fetch({{env_id}})
|
env_value = ENV.fetch({{env_id}})
|
||||||
success = false
|
success = false
|
||||||
|
|
||||||
# Use YAML converter if specified
|
# Use YAML converter if specified
|
||||||
{% ann = ivar.annotation(::YAML::Field) %}
|
{% ann = ivar.annotation(::YAML::Field) %}
|
||||||
{% if ann && ann[:converter] %}
|
{% if ann && ann[:converter] %}
|
||||||
puts %(Config.{{ivar.id}} : Parsing "#{env_value}" as {{ivar.type}} with {{ann[:converter]}} converter)
|
|
||||||
config.{{ivar.id}} = {{ann[:converter]}}.from_yaml(YAML::ParseContext.new, YAML::Nodes.parse(ENV.fetch({{env_id}})).nodes[0])
|
config.{{ivar.id}} = {{ann[:converter]}}.from_yaml(YAML::ParseContext.new, YAML::Nodes.parse(ENV.fetch({{env_id}})).nodes[0])
|
||||||
puts %(Config.{{ivar.id}} : Set to #{config.{{ivar.id}}})
|
|
||||||
success = true
|
success = true
|
||||||
|
|
||||||
# Use regular YAML parser otherwise
|
# Use regular YAML parser otherwise
|
||||||
@@ -181,9 +178,7 @@ class Config
|
|||||||
{{ivar_types}}.each do |ivar_type|
|
{{ivar_types}}.each do |ivar_type|
|
||||||
if !success
|
if !success
|
||||||
begin
|
begin
|
||||||
# puts %(Config.{{ivar.id}} : Trying to parse "#{env_value}" as #{ivar_type})
|
|
||||||
config.{{ivar.id}} = ivar_type.from_yaml(env_value)
|
config.{{ivar.id}} = ivar_type.from_yaml(env_value)
|
||||||
puts %(Config.{{ivar.id}} : Set to #{config.{{ivar.id}}} (#{ivar_type}))
|
|
||||||
success = true
|
success = true
|
||||||
rescue
|
rescue
|
||||||
# nop
|
# nop
|
||||||
|
|||||||
38
src/invidious/database/migration.cr
Normal file
38
src/invidious/database/migration.cr
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
abstract class Invidious::Database::Migration
|
||||||
|
macro inherited
|
||||||
|
Migrator.migrations << self
|
||||||
|
end
|
||||||
|
|
||||||
|
@@version : Int64?
|
||||||
|
|
||||||
|
def self.version(version : Int32 | Int64)
|
||||||
|
@@version = version.to_i64
|
||||||
|
end
|
||||||
|
|
||||||
|
getter? completed = false
|
||||||
|
|
||||||
|
def initialize(@db : DB::Database)
|
||||||
|
end
|
||||||
|
|
||||||
|
abstract def up(conn : DB::Connection)
|
||||||
|
|
||||||
|
def migrate
|
||||||
|
# migrator already ignores completed migrations
|
||||||
|
# but this is an extra check to make sure a migration doesn't run twice
|
||||||
|
return if completed?
|
||||||
|
|
||||||
|
@db.transaction do |txn|
|
||||||
|
up(txn.connection)
|
||||||
|
track(txn.connection)
|
||||||
|
@completed = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def version : Int64
|
||||||
|
@@version.not_nil!
|
||||||
|
end
|
||||||
|
|
||||||
|
private def track(conn : DB::Connection)
|
||||||
|
conn.exec("INSERT INTO #{Migrator::MIGRATIONS_TABLE} (version) VALUES ($1)", version)
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
module Invidious::Database::Migrations
|
||||||
|
class CreateChannelsTable < Migration
|
||||||
|
version 1
|
||||||
|
|
||||||
|
def up(conn : DB::Connection)
|
||||||
|
conn.exec <<-SQL
|
||||||
|
CREATE TABLE IF NOT EXISTS public.channels
|
||||||
|
(
|
||||||
|
id text NOT NULL,
|
||||||
|
author text,
|
||||||
|
updated timestamp with time zone,
|
||||||
|
deleted boolean,
|
||||||
|
subscribed timestamp with time zone,
|
||||||
|
CONSTRAINT channels_id_key UNIQUE (id)
|
||||||
|
);
|
||||||
|
SQL
|
||||||
|
|
||||||
|
conn.exec <<-SQL
|
||||||
|
GRANT ALL ON TABLE public.channels TO current_user;
|
||||||
|
SQL
|
||||||
|
|
||||||
|
conn.exec <<-SQL
|
||||||
|
CREATE INDEX IF NOT EXISTS channels_id_idx
|
||||||
|
ON public.channels
|
||||||
|
USING btree
|
||||||
|
(id COLLATE pg_catalog."default");
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
module Invidious::Database::Migrations
|
||||||
|
class CreateVideosTable < Migration
|
||||||
|
version 2
|
||||||
|
|
||||||
|
def up(conn : DB::Connection)
|
||||||
|
conn.exec <<-SQL
|
||||||
|
CREATE UNLOGGED TABLE IF NOT EXISTS public.videos
|
||||||
|
(
|
||||||
|
id text NOT NULL,
|
||||||
|
info text,
|
||||||
|
updated timestamp with time zone,
|
||||||
|
CONSTRAINT videos_pkey PRIMARY KEY (id)
|
||||||
|
);
|
||||||
|
SQL
|
||||||
|
|
||||||
|
conn.exec <<-SQL
|
||||||
|
GRANT ALL ON TABLE public.videos TO current_user;
|
||||||
|
SQL
|
||||||
|
|
||||||
|
conn.exec <<-SQL
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS id_idx
|
||||||
|
ON public.videos
|
||||||
|
USING btree
|
||||||
|
(id COLLATE pg_catalog."default");
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
module Invidious::Database::Migrations
|
||||||
|
class CreateChannelVideosTable < Migration
|
||||||
|
version 3
|
||||||
|
|
||||||
|
def up(conn : DB::Connection)
|
||||||
|
conn.exec <<-SQL
|
||||||
|
CREATE TABLE IF NOT EXISTS public.channel_videos
|
||||||
|
(
|
||||||
|
id text NOT NULL,
|
||||||
|
title text,
|
||||||
|
published timestamp with time zone,
|
||||||
|
updated timestamp with time zone,
|
||||||
|
ucid text,
|
||||||
|
author text,
|
||||||
|
length_seconds integer,
|
||||||
|
live_now boolean,
|
||||||
|
premiere_timestamp timestamp with time zone,
|
||||||
|
views bigint,
|
||||||
|
CONSTRAINT channel_videos_id_key UNIQUE (id)
|
||||||
|
);
|
||||||
|
SQL
|
||||||
|
|
||||||
|
conn.exec <<-SQL
|
||||||
|
GRANT ALL ON TABLE public.channel_videos TO current_user;
|
||||||
|
SQL
|
||||||
|
|
||||||
|
conn.exec <<-SQL
|
||||||
|
CREATE INDEX IF NOT EXISTS channel_videos_ucid_idx
|
||||||
|
ON public.channel_videos
|
||||||
|
USING btree
|
||||||
|
(ucid COLLATE pg_catalog."default");
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
34
src/invidious/database/migrations/0004_create_users_table.cr
Normal file
34
src/invidious/database/migrations/0004_create_users_table.cr
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
module Invidious::Database::Migrations
|
||||||
|
class CreateUsersTable < Migration
|
||||||
|
version 4
|
||||||
|
|
||||||
|
def up(conn : DB::Connection)
|
||||||
|
conn.exec <<-SQL
|
||||||
|
CREATE TABLE IF NOT EXISTS public.users
|
||||||
|
(
|
||||||
|
updated timestamp with time zone,
|
||||||
|
notifications text[],
|
||||||
|
subscriptions text[],
|
||||||
|
email text NOT NULL,
|
||||||
|
preferences text,
|
||||||
|
password text,
|
||||||
|
token text,
|
||||||
|
watched text[],
|
||||||
|
feed_needs_update boolean,
|
||||||
|
CONSTRAINT users_email_key UNIQUE (email)
|
||||||
|
);
|
||||||
|
SQL
|
||||||
|
|
||||||
|
conn.exec <<-SQL
|
||||||
|
GRANT ALL ON TABLE public.users TO current_user;
|
||||||
|
SQL
|
||||||
|
|
||||||
|
conn.exec <<-SQL
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS email_unique_idx
|
||||||
|
ON public.users
|
||||||
|
USING btree
|
||||||
|
(lower(email) COLLATE pg_catalog."default");
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
module Invidious::Database::Migrations
|
||||||
|
class CreateSessionIdsTable < Migration
|
||||||
|
version 5
|
||||||
|
|
||||||
|
def up(conn : DB::Connection)
|
||||||
|
conn.exec <<-SQL
|
||||||
|
CREATE TABLE IF NOT EXISTS public.session_ids
|
||||||
|
(
|
||||||
|
id text NOT NULL,
|
||||||
|
email text,
|
||||||
|
issued timestamp with time zone,
|
||||||
|
CONSTRAINT session_ids_pkey PRIMARY KEY (id)
|
||||||
|
);
|
||||||
|
SQL
|
||||||
|
|
||||||
|
conn.exec <<-SQL
|
||||||
|
GRANT ALL ON TABLE public.session_ids TO current_user;
|
||||||
|
SQL
|
||||||
|
|
||||||
|
conn.exec <<-SQL
|
||||||
|
CREATE INDEX IF NOT EXISTS session_ids_id_idx
|
||||||
|
ON public.session_ids
|
||||||
|
USING btree
|
||||||
|
(id COLLATE pg_catalog."default");
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
module Invidious::Database::Migrations
|
||||||
|
class CreateNoncesTable < Migration
|
||||||
|
version 6
|
||||||
|
|
||||||
|
def up(conn : DB::Connection)
|
||||||
|
conn.exec <<-SQL
|
||||||
|
CREATE TABLE IF NOT EXISTS public.nonces
|
||||||
|
(
|
||||||
|
nonce text,
|
||||||
|
expire timestamp with time zone,
|
||||||
|
CONSTRAINT nonces_id_key UNIQUE (nonce)
|
||||||
|
);
|
||||||
|
SQL
|
||||||
|
|
||||||
|
conn.exec <<-SQL
|
||||||
|
GRANT ALL ON TABLE public.nonces TO current_user;
|
||||||
|
SQL
|
||||||
|
|
||||||
|
conn.exec <<-SQL
|
||||||
|
CREATE INDEX IF NOT EXISTS nonces_nonce_idx
|
||||||
|
ON public.nonces
|
||||||
|
USING btree
|
||||||
|
(nonce COLLATE pg_catalog."default");
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
module Invidious::Database::Migrations
|
||||||
|
class CreateAnnotationsTable < Migration
|
||||||
|
version 7
|
||||||
|
|
||||||
|
def up(conn : DB::Connection)
|
||||||
|
conn.exec <<-SQL
|
||||||
|
CREATE TABLE IF NOT EXISTS public.annotations
|
||||||
|
(
|
||||||
|
id text NOT NULL,
|
||||||
|
annotations xml,
|
||||||
|
CONSTRAINT annotations_id_key UNIQUE (id)
|
||||||
|
);
|
||||||
|
SQL
|
||||||
|
|
||||||
|
conn.exec <<-SQL
|
||||||
|
GRANT ALL ON TABLE public.annotations TO current_user;
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user