1
0
mirror of https://github.com/TeamNewPipe/NewPipe synced 2026-01-16 06:28:02 +00:00

Compare commits

..

444 Commits

Author SHA1 Message Date
TobiGr
3b5b9d7dab Release 0.18.5 (850) and update extractor version
Update User-Agent
2020-02-25 23:38:51 +01:00
TobiGr
e7082baaff Exception is ignored in SearchFragment 2020-02-25 23:12:12 +01:00
TobiGr
0bc769b971 Fix regression: Unable to find explicit activity class
See https://github.com/TeamNewPipe/NewPipe/issues/3114#issuecomment-589940878 for info on this crash.
This reverts ef90493c27 partly.
2020-02-22 20:43:38 +01:00
TobiGr
5b98d41637 Merge branch 'dev' 2020-02-22 14:09:26 +01:00
Tobias Groza
e14b7851b1 Merge pull request #3128 from Stypox/drawer-fix
Reintroduce "Settings" button in app bar
2020-02-22 14:08:37 +01:00
Stypox
d65b8d7d18 Address @mauriciocolli suggestions in #2960
Simplify code to enable history button
2020-02-22 11:34:08 +01:00
Stypox
6968dd266a Remove empty about menu 2020-02-22 11:30:57 +01:00
Stypox
8754cbb38f Remove Settings button from download activity 2020-02-22 11:12:22 +01:00
Stypox
c7b4705538 Implement Settings buttons 2020-02-22 10:36:10 +01:00
Stypox
065faf31b6 Add settings button back in dot menu 2020-02-22 10:23:01 +01:00
Stypox
da4b27f606 Merge branch 'dev' of github.com:TeamNewPipe/NewPipe into dev 2020-02-22 10:01:11 +01:00
Tobias Groza
e1cc84ab5f Merge pull request #3113 from TeamNewPipe/dev
Release v0.18.4
2020-02-22 00:44:21 +01:00
TobiGr
533aede80f Update bump version to 0.18.4 (840) 2020-02-22 00:37:46 +01:00
TobiGr
e84d5311f9 Update extractor version to latest release 2020-02-22 00:37:46 +01:00
TobiGr
476b3f804b Add changelog 2020-02-22 00:37:46 +01:00
TobiGr
9445e8e8a0 Remove 'duration_live_button' string from translations 2020-02-22 00:37:46 +01:00
TobiGr
e539753279 Clean translations 2020-02-21 21:59:36 +01:00
TobiGr
f5f81be6fe Merge remote-tracking branch 'Weblate/dev' into dev 2020-02-21 21:31:17 +01:00
Tobias Groza
3b8a55f0d3 Merge pull request #3098 from B0pol/localisation
Multiple localization fixes
2020-02-21 21:29:03 +01:00
Stypox
b1dd6cbb6e Merge branch 'B0pol-localisation' into dev 2020-02-21 20:31:52 +01:00
Hosted Weblate
431724f637 Merge branch 'origin/dev' into Weblate. 2020-02-21 16:58:08 +01:00
Brikkho
6e5851aea8 Translated using Weblate (Bengali (Bangladesh))
Currently translated at 28.5% (152 of 532 strings)
2020-02-21 16:58:08 +01:00
chr56
30e5e58178 Translated using Weblate (Chinese (Simplified))
Currently translated at 93.0% (495 of 532 strings)
2020-02-21 16:58:07 +01:00
Jeff Huang
40207b515d Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (532 of 532 strings)
2020-02-21 16:58:07 +01:00
MohammedSR Vevo
95a6aaac76 Translated using Weblate (Kurdish)
Currently translated at 100.0% (532 of 532 strings)
2020-02-21 16:58:06 +01:00
zmni
da43f47487 Translated using Weblate (Indonesian)
Currently translated at 100.0% (532 of 532 strings)
2020-02-21 16:58:05 +01:00
WaldiS
ae5360fb27 Translated using Weblate (Polish)
Currently translated at 99.6% (530 of 532 strings)
2020-02-21 16:58:03 +01:00
Karol Kosek
47d2ae5c5e Translated using Weblate (Polish)
Currently translated at 99.6% (530 of 532 strings)
2020-02-21 16:58:03 +01:00
Yaron Shahrabani
e1101dd6f1 Translated using Weblate (Hebrew)
Currently translated at 100.0% (532 of 532 strings)
2020-02-21 16:58:01 +01:00
Oğuz Ersen
d460351da2 Translated using Weblate (Turkish)
Currently translated at 100.0% (532 of 532 strings)
2020-02-21 16:58:00 +01:00
zeritti
fd076f5a58 Translated using Weblate (Czech)
Currently translated at 100.0% (532 of 532 strings)
2020-02-21 16:57:57 +01:00
Vojtěch Šamla
f7d73fc21b Translated using Weblate (Czech)
Currently translated at 100.0% (532 of 532 strings)
2020-02-21 16:57:56 +01:00
Stypox
5680b7c477 Merge branch 'dev' into localisation 2020-02-21 14:34:40 +01:00
bopol
9f9b53c067 remove unecessary «few» and «many» for plural string in english 2020-02-20 18:55:22 +01:00
Tobias Groza
18d986a57d Merge pull request #3117 from kapodamy/fixup
fixup for #3081
2020-02-20 18:15:21 +01:00
kapodamy
61632b3d9d fixup for #3081
* dont write the "sbpg" box in video tracks
2020-02-20 13:20:20 -03:00
Hosted Weblate
f1688fb8b1 Merge branch 'origin/dev' into Weblate. 2020-02-20 00:07:22 +01:00
mk3z
f0e85b31aa Translated using Weblate (Finnish)
Currently translated at 64.8% (345 of 532 strings)
2020-02-20 00:07:19 +01:00
B0pol
316871714a Update app/.gitignore
Co-Authored-By: Stypox <stypox@pm.me>
2020-02-19 17:40:03 +01:00
Stypox
12c72842ff Merge pull request #3102 from vhsw/dev
Fix initial brightness value
2020-02-19 15:26:40 +01:00
Alexey Dubrov
4230e11c4d Merge branch 'dev' into dev 2020-02-19 15:05:42 +03:00
Tobias Groza
c76ff8d367 Merge pull request #3109 from spk/fix-androidx-nonnull
Migrate annotation to androidx on ReCaptchaActivity
2020-02-18 22:40:29 +01:00
Laurent Arnoud
831e9985e2 Migrate annotation to androidx on ReCaptchaActivity 2020-02-18 21:50:28 +01:00
bopol
9912ee8199 give info if content language is system on crash 2020-02-18 18:35:13 +01:00
bopol
55d17b556a added all the .iml files in gitignore, not only app.iml
if somehow your module name isn't app, it will create a module-name.iml file, and isn't needed
2020-02-17 10:18:20 +01:00
Alexey Dubrov
5495be749b Merge branch 'dev' into dev 2020-02-17 12:14:07 +03:00
bopol
54f71c623a use plural string for dynamic_seek_duration_description 2020-02-17 10:12:08 +01:00
Alexey Dubrov
e3a891688b Get brightness from settings if screenBrightness is set to auto 2020-02-17 12:11:00 +03:00
B0pol
09d36a5dbc Merge branch 'dev' into localisation 2020-02-17 09:27:03 +01:00
Tobias Groza
ff493406cf Merge pull request #2938 from comradekingu/patch-10
Spelling: Language reworked 2
2020-02-17 08:41:39 +01:00
Tobias Groza
fbcee61e04 Apply suggestions from code review
Co-Authored-By: Stypox <stypox@pm.me>
2020-02-16 22:41:56 +01:00
bopol
e62e34fd5c created default_localization_key 2020-02-16 22:41:32 +01:00
Stypox
3b57135a6e Merge branch 'dev' into patch-10 2020-02-16 21:58:44 +01:00
Alexey Dubrov
69934dee52 Merge branch 'dev' into dev 2020-02-16 16:11:56 +03:00
Alexey Dubrov
51f2efd48c Fix initial brightness value 2020-02-16 16:08:53 +03:00
B0pol
4de2cfdcc6 Added translation using Weblate (Chuvash) 2020-02-16 10:12:55 +01:00
Hosted Weblate
7845b7678d Merge branch 'origin/dev' into Weblate. 2020-02-16 05:21:17 +01:00
B0pol
6f9543b9cf Translated using Weblate (Esperanto)
Currently translated at 100.0% (532 of 532 strings)
2020-02-16 05:21:15 +01:00
bopol
5b541cc9fb resolve merge conflicts 2020-02-15 14:53:05 +01:00
B0pol
ea54520e0b Merge branch 'dev' into localisation 2020-02-15 14:14:33 +01:00
Tobias Groza
00b6bd517a Merge pull request #2865 from chr56/dev
Fix wrong lang code of Chinese,and clean up useless strings.xml
2020-02-15 13:31:56 +01:00
TobiGr
9fb5aa4b46 Merge remote-tracking branch 'Weblate/dev' into dev 2020-02-15 13:28:30 +01:00
bopol
f089cd027e Multiple localization fixes
With the extractor PR, fixes title & description shown in the wrong language.
Fixed views / spectators counts possibly in the wrong language
Fixed live spectators not showing full count on detail page
Fixed LIVE shown on players, it shows translated instead

Fixed Videos string in search / three dots not available in Weblate
(because it was videos, but there already was a plural string named videos, in Weblate)

Subscriber count is always giving the short count.
We can't get exact number since this YouTube update: https://support.google.com/youtube/thread/6543166
But only short count (B, M, k), so showing full number, eg for 1.9M: 1,900,000, is wrong because the number could be 1,923,490 or 1,897,789…

Added a « sytem default » option to content language and country language selector.
It's the one selected by default (not en-GB anymore then), and correspond to the
language of the system / country of the system
By system I mean phone, tablet, TV…

Fixed russian showing - before time ago (eg 19hrs ago)
This is a workaround fix, I opened an issue on prettytime library repo.

Fixed russian plurals:
other was used instead of many for videos and subscribers

Fixed seek_duration english only
2020-02-15 12:40:23 +01:00
chr56
5151c6cb54 fix wrong langcode of Chinesein settings_keys.xml 2020-02-15 18:39:41 +08:00
chr56
9407ac8c24 fix reCaptcha strings in zh-rCN 2020-02-15 13:07:34 +08:00
chr56
6a91a3a947 reapply changes after merging 2020-02-15 12:52:19 +08:00
chr56
ac0bcea371 Merge branch 'TeamNewPipe-dev' into dev 2020-02-15 12:46:44 +08:00
chr56
302a6ff4e8 Merge branch 'dev' of https://github.com/TeamNewPipe/NewPipe into TeamNewPipe-dev 2020-02-15 12:45:09 +08:00
B0pol
0d89667428 Translated using Weblate (French)
Currently translated at 100.0% (532 of 532 strings)
2020-02-15 01:57:32 +01:00
B0pol
dbb6848a9b Translated using Weblate (Esperanto)
Currently translated at 100.0% (532 of 532 strings)
2020-02-15 01:57:31 +01:00
TobiGr
a843e808d1 Merge branch 'master' into dev 2020-02-15 00:53:05 +01:00
Tobias Groza
67af05e504 Use "Report error" instead of "Report Error"
Co-Authored-By: Stypox <stypox@pm.me>
2020-02-14 19:12:59 +01:00
Milo Ivir
c995c6fda5 Translated using Weblate (Croatian)
Currently translated at 88.2% (469 of 532 strings)
2020-02-14 04:17:43 +01:00
Nogooduser
3b5cf0e37c Translated using Weblate (Portuguese)
Currently translated at 100.0% (532 of 532 strings)
2020-02-14 04:17:40 +01:00
Daniele Lira Mereb
c7a9847e66 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (532 of 532 strings)
2020-02-14 04:17:38 +01:00
burstw0w
3624f1b9a2 Translated using Weblate (Serbian)
Currently translated at 46.6% (248 of 532 strings)
2020-02-12 02:50:24 +01:00
Adolfo Jayme Barrientos
aecc908152 Translated using Weblate (Spanish)
Currently translated at 100.0% (532 of 532 strings)
2020-02-12 02:50:24 +01:00
Shafiq Jamzuri
9f9c6eff00 Translated using Weblate (Malay)
Currently translated at 84.2% (448 of 532 strings)
2020-02-12 02:50:23 +01:00
zeritti
99400fa570 Translated using Weblate (Czech)
Currently translated at 100.0% (532 of 532 strings)
2020-02-12 02:50:22 +01:00
vkhomenk
17d00837bd Translated using Weblate (Ukrainian)
Currently translated at 99.2% (528 of 532 strings)
2020-02-12 02:50:21 +01:00
Ali Demirtas
0882d9d66b Translated using Weblate (Turkish)
Currently translated at 100.0% (532 of 532 strings)
2020-02-12 02:50:19 +01:00
TobiGr
0df81409bf Update extractor and release 0.18.3 (830) 2020-02-10 22:32:10 +01:00
Allan Nordhøy
a75deb6ba2 Reverted changes 2020-02-09 16:29:51 +01:00
Hosted Weblate
7478e96a15 Merge branch 'origin/dev' into Weblate. 2020-02-09 04:54:59 +01:00
pjammo
c1d9a253b0 Translated using Weblate (Italian)
Currently translated at 100.0% (532 of 532 strings)
2020-02-09 04:54:57 +01:00
AioiLight
eb7d9f76e5 Translated using Weblate (Japanese)
Currently translated at 100.0% (532 of 532 strings)
2020-02-09 04:54:56 +01:00
Tobias Groza
ec45d4a729 Merge pull request #2959 from kapodamy/m4a-stsc-stco
mp4 muxer fix
2020-02-09 00:27:57 +01:00
Tobias Groza
07544cd198 Merge pull request #3044 from B0pol/tubepeer
Description fix and some PeerTube fixes
2020-02-09 00:11:49 +01:00
bopol
3f3d1bfccf update extractor version 2020-02-09 00:00:14 +01:00
kapodamy
d3cb887ff0 Merge branch 'dev' into m4a-stsc-stco 2020-02-08 16:04:28 -03:00
B0pol
88c68315f6 Merge branch 'dev' into tubepeer 2020-02-08 10:54:05 +01:00
bopol
2d62fa401d real markdown support for descriptions
and update third-party licences in about page
2020-02-08 10:48:36 +01:00
TobiGr
3ff85c2ab7 Make report error title in snackbar uppercase again 2020-02-07 22:22:27 +01:00
Hosted Weblate
13f5d3b5ac Merge branch 'origin/dev' into Weblate. 2020-02-07 21:15:53 +01:00
Allan Nordhøy
9eb55e1be5 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.1% (522 of 532 strings)
2020-02-07 21:15:50 +01:00
Jeff Huang
6adbfade2b Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (532 of 532 strings)
2020-02-07 21:15:50 +01:00
MohammedSR Vevo
7568616f8e Translated using Weblate (Kurdish)
Currently translated at 99.8% (531 of 532 strings)
2020-02-07 21:15:49 +01:00
B0pol
c93be13dfe Translated using Weblate (French)
Currently translated at 100.0% (532 of 532 strings)
2020-02-07 21:15:49 +01:00
JoC
e9dc96944b Translated using Weblate (Spanish)
Currently translated at 99.8% (531 of 532 strings)
2020-02-07 21:15:48 +01:00
zmni
06e536eb45 Translated using Weblate (Indonesian)
Currently translated at 99.6% (530 of 532 strings)
2020-02-07 21:15:48 +01:00
thami simo
72e90b4d57 Translated using Weblate (Arabic)
Currently translated at 100.0% (532 of 532 strings)
2020-02-07 21:15:47 +01:00
WaldiS
83d43f845f Translated using Weblate (Polish)
Currently translated at 99.8% (531 of 532 strings)
2020-02-07 21:15:47 +01:00
Yaron Shahrabani
5ed5a81708 Translated using Weblate (Hebrew)
Currently translated at 99.8% (531 of 532 strings)
2020-02-07 21:15:46 +01:00
Vojtěch Šamla
ce003d2683 Translated using Weblate (Czech)
Currently translated at 100.0% (532 of 532 strings)
2020-02-07 21:15:46 +01:00
Osoitz
75248d7a12 Translated using Weblate (Basque)
Currently translated at 100.0% (532 of 532 strings)
2020-02-07 21:15:45 +01:00
B0pol
06eff256f3 Translated using Weblate (Esperanto)
Currently translated at 100.0% (532 of 532 strings)
2020-02-07 21:15:44 +01:00
B0pol
a476f332f7 Translated using Weblate (German)
Currently translated at 100.0% (532 of 532 strings)
2020-02-07 21:15:43 +01:00
Oğuz Ersen
6d49148c32 Translated using Weblate (Turkish)
Currently translated at 100.0% (532 of 532 strings)
2020-02-07 21:15:43 +01:00
Allan Nordhøy
85acc53d40 Spelling: Video thumbnail shown 2020-02-07 18:06:09 +01:00
Allan Nordhøy
f319e3e75a Spelling: Treat the NewPipe makers to something you like 2020-02-07 18:01:45 +01:00
Allan Nordhøy
3abc660eb3 Spelling: Install the fresh NewPipe version. 2020-02-07 17:57:38 +01:00
Allan Nordhøy
4c13dda1f9 Spelling: Could not establish secure connection 2020-02-07 17:55:37 +01:00
Allan Nordhøy
294c35b2fb Spelling: the settings
Co-Authored-By: Tobias Groza <TobiGr@users.noreply.github.com>
2020-02-07 17:51:14 +01:00
bopol
badaff8ebc refactor Description 2020-02-07 14:14:55 +01:00
bopol
7045f9711c fix thumbnail for PeerTube, and description changes
description:
- PeerTube: it's now full description (it cut at 250 characters before), and it displays ok (newlines are ok, but markdown isn't)
- MediaCCC: descriptions are now displayed well (newlines added)
- YouTube: timestamps in descriptions are clickable and work

more PeerTube fixes:
thumbnail is now high quality
age limit is now handled
upload date in «recently added» feed is good now (it was one hour delayed)
all fixes come from https://github.com/TeamNewPipe/NewPipeExtractor/pull/239, so it need to be merged before this PR
2020-02-06 22:42:09 +01:00
kapodamy
aaf5d7b89c Update DataReader.java
make rewind() method fully rewind the stream
2020-02-06 17:00:32 -03:00
Tobias Groza
487952f52e Merge pull request #3053 from harshlele/copy-comment-long-press
added ability to copy comments on long press
2020-02-06 20:35:30 +01:00
harshlele
34e31807fc removed empty line 2020-02-06 18:33:06 +05:30
harshlele
21184f8755 Update CommentsMiniInfoItemHolder.java
Co-Authored-By: yausername <5203007+yausername@users.noreply.github.com>
2020-02-05 14:48:39 +05:30
nautilusx
2bac66b5fe Translated using Weblate (German)
Currently translated at 99.8% (531 of 532 strings)
2020-02-05 01:01:07 +01:00
Igor Nedoboy
b5f069d080 Translated using Weblate (Russian)
Currently translated at 100.0% (532 of 532 strings)
2020-02-04 19:16:46 +01:00
Harshal Lele
bc393e6bcd removed settings entry 2020-02-04 18:01:39 +05:30
Harshal Lele
af411a61ae added ability to copy comments on long press 2020-02-04 16:40:57 +05:30
Hosted Weblate
2805850711 Merge branch 'origin/dev' into Weblate. 2020-02-03 21:20:50 +01:00
Jeff Huang
0f0a367174 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (530 of 530 strings)
2020-02-03 21:20:48 +01:00
MohammedSR Vevo
7009dc574f Translated using Weblate (Kurdish)
Currently translated at 99.8% (529 of 530 strings)
2020-02-03 21:20:48 +01:00
Marian Hanzel
6941917c75 Translated using Weblate (Slovak)
Currently translated at 98.5% (522 of 530 strings)
2020-02-03 21:20:47 +01:00
Isak Holmström
9560cf59be Translated using Weblate (Swedish)
Currently translated at 87.9% (466 of 530 strings)
2020-02-03 21:20:35 +01:00
B0pol
0a2374892c Translated using Weblate (French)
Currently translated at 100.0% (530 of 530 strings)
2020-02-03 21:20:35 +01:00
JoC
5d5c2ae2ed Translated using Weblate (Spanish)
Currently translated at 100.0% (530 of 530 strings)
2020-02-03 21:20:34 +01:00
WaldiS
2cceb048e3 Translated using Weblate (Polish)
Currently translated at 99.8% (529 of 530 strings)
2020-02-03 21:20:33 +01:00
Yaron Shahrabani
ed9c85b25a Translated using Weblate (Hebrew)
Currently translated at 99.8% (529 of 530 strings)
2020-02-03 21:20:32 +01:00
Vojtěch Šamla
bb8bcf3c33 Translated using Weblate (Czech)
Currently translated at 100.0% (530 of 530 strings)
2020-02-03 21:20:31 +01:00
B0pol
b5684ee7df Translated using Weblate (Esperanto)
Currently translated at 100.0% (530 of 530 strings)
2020-02-03 21:20:30 +01:00
Oğuz Ersen
2c27f784f7 Translated using Weblate (Turkish)
Currently translated at 100.0% (530 of 530 strings)
2020-02-03 21:20:29 +01:00
Emin Tufan Çetin
46c1155c64 Translated using Weblate (Turkish)
Currently translated at 100.0% (530 of 530 strings)
2020-02-03 21:20:29 +01:00
Tobias Groza
471ce4a24b Merge pull request #3035 from Stypox/recaptcha
Fix ReCaptcha activity and correctly save obtained cookies
2020-02-02 22:16:21 +01:00
Stypox
b6841158df Remove unused imports and clean up comment style 2020-02-02 21:48:45 +01:00
Stypox
3372bacc62 Merge branch 'dev' into recaptcha 2020-02-02 21:36:15 +01:00
Stypox
6da9096176 Fix addYoutubeCookies functions (Yt changed things lately) 2020-02-02 21:33:07 +01:00
Stypox
b589ee6c26 Merge pull request #2954 from XiangRongLin/1907renamePlaylist
Rename local playlist by long-clicking in BookmarkFragment.
2020-02-02 14:34:54 +01:00
Emin Tufan Çetin
9f0efdd544 Translated using Weblate (Turkish)
Currently translated at 100.0% (530 of 530 strings)
2020-02-02 13:43:18 +01:00
Oğuz Ersen
07c7398a96 Translated using Weblate (Turkish)
Currently translated at 100.0% (530 of 530 strings)
2020-02-02 13:43:18 +01:00
Xiang Rong Lin
a117e459b0 Use AlertDialog.Builder instead of BookmarkDialog class for the same look.
Use "rename" string instead of "save" string.
2020-02-02 12:54:43 +01:00
chr_56
7568af408a fix wrong strings in Simplified Chinese 2020-02-02 09:42:56 +08:00
kapodamy
d1801e1dbc Merge branch 'dev' into m4a-stsc-stco 2020-02-01 18:59:22 -03:00
Igor Nedoboy
38d193899c Translated using Weblate (Russian)
Currently translated at 100.0% (530 of 530 strings)
2020-02-01 20:18:24 +01:00
Stypox
f95d51b307 Merge branch 'dev' of github.com:TeamNewPipe/NewPipe into recaptcha 2020-02-01 18:27:00 +01:00
Stypox
1bf55c2139 Remove left-behind Log 2020-02-01 18:24:16 +01:00
Stypox
9b09028440 Try to extract cookies just before closing recaptcha activity
Even if the page didn't auto-close
2020-02-01 18:24:16 +01:00
Stypox
0cc890a1d1 Move "Done" button and make it theme conpliant in ReCaptcha 2020-02-01 18:24:16 +01:00
Stypox
fe138f6d61 Improve formatting 2020-02-01 18:24:16 +01:00
Stypox
4e1638f86e Remove space between "Done" button and ReCaptchaActivity title 2020-02-01 18:24:16 +01:00
Stypox
daa4fd5103 Fix ReCaptchaActivity crash and save cookies correctly 2020-02-01 18:24:16 +01:00
Stypox
a3d8848825 Add "Done" drawable (only white since it is used on toolbar) 2020-02-01 18:24:16 +01:00
Stypox
61d102dc75 Change recaptcha string names to match style 2020-02-01 18:24:16 +01:00
Markus Richter
c0519d8313 fixes #3021, see also https://github.com/TeamNewPipe/NewPipe-legacy/pull/21 2020-02-01 18:24:16 +01:00
Hosted Weblate
48a2d2d24b Merge branch 'origin/dev' into Weblate. 2020-02-01 17:48:01 +01:00
Isak Holmström
fb0d626cb2 Translated using Weblate (Swedish)
Currently translated at 88.2% (465 of 527 strings)
2020-02-01 17:47:58 +01:00
B0pol
766326ad8c Translated using Weblate (French)
Currently translated at 100.0% (527 of 527 strings)
2020-02-01 17:47:57 +01:00
C. Rüdinger
2a903f66dd Translated using Weblate (German)
Currently translated at 99.8% (526 of 527 strings)
2020-02-01 17:47:55 +01:00
Xiang Rong Lin
8712310ad9 Move more log statements into "if (DEBUG)" 2020-02-01 16:36:45 +01:00
XiangRongLin
e8c3ab87c4 Merge branch 'dev' into 1907renamePlaylist 2020-02-01 16:29:21 +01:00
Xiang Rong Lin
90c20f124b Move log statement into "if (DEBUG)" 2020-02-01 16:27:53 +01:00
chr56
cd225eb5fe Merge branch 'dev' into dev 2020-02-01 23:14:00 +08:00
Tobias Groza
14e852237f Merge pull request #2921 from B0pol/dev
Add language selector to change the app language
2020-02-01 15:47:13 +01:00
TobiGr
d36ac7a5de Improve formatting 2020-02-01 15:35:33 +01:00
bopol
55a138e8da fix toast on app language change
I forgot to change the key here when I renamed it
2020-02-01 15:30:51 +01:00
bopol
c5e6bb58bc Merge remote-tracking branch 'upstream/dev' into dev
merging dev
2020-02-01 15:11:01 +01:00
TobiGr
2642d6f5f0 Merge remote-tracking branch 'Weblate/dev' into dev 2020-02-01 14:32:21 +01:00
Tobias Groza
bcb3cb9125 Merge pull request #3004 from harshlele/ask-overlay-perm-settings
ask for display over other apps permission in settings
2020-02-01 14:28:02 +01:00
TobiGr
f7203d4ac9 Fix formatting and use lamda functions 2020-02-01 13:41:03 +01:00
bopol
6be23a0a6f fix wrong language shown many popup dialogs
Changed android.R.string.ok, which is "OK", into R.string.finish, which is also OK, but from our strings
Then for a small amount of languages that don't have Android translation, it will show the good string.
2020-02-01 09:44:49 +01:00
nautilusx
089a9f1a9c Translated using Weblate (German)
Currently translated at 100.0% (527 of 527 strings)
2020-01-31 18:06:46 +01:00
Abu Sarim Hindi
2977de1df2 Translated using Weblate (Urdu)
Currently translated at 100.0% (527 of 527 strings)
2020-01-30 22:00:38 +01:00
Hosted Weblate
eab3f8b3ff Merge branch 'origin/dev' into Weblate. 2020-01-29 22:50:16 +01:00
Abu Sarim Hindi
d686a2c9dc Translated using Weblate (Urdu)
Currently translated at 100.0% (527 of 527 strings)
2020-01-29 22:50:13 +01:00
Gergely Szarka
d34e5f78a9 Translated using Weblate (Hungarian)
Currently translated at 67.4% (355 of 527 strings)
2020-01-29 22:50:11 +01:00
bopol
edc9d47da7 app language: refactoring
renamed NewPipe's language into App language, and same for all the
concerning thing (keys, comments…)

we now call assureCorrectAppLanguage(CONTEXT) in activities needing it
instead of changeAppLanguage(getAppLocale(CONTEXT), RESOURCES)
changeAppLanguage becomes private.
2020-01-29 21:21:00 +01:00
kapodamy
0c5608506e typo fixup 2020-01-29 16:06:40 -03:00
kapodamy
bda6139f42 Merge branch 'dev' into m4a-stsc-stco 2020-01-29 15:58:20 -03:00
kapodamy
1ae8ca1e21 Merge branch 'm4a-stsc-stco' of https://github.com/kapodamy/NewPipe into m4a-stsc-stco 2020-01-29 16:08:32 -03:00
kapodamy
342377e69a restore offset after writting lastest CTTS entries 2020-01-29 16:04:24 -03:00
Tobias Groza
0447e4e664 Merge pull request #3032 from mqus/fix_subtitles
Fixes #3021
2020-01-29 15:10:05 +01:00
Markus Richter
fd3d61c6a0 fixes #3021, see also https://github.com/TeamNewPipe/NewPipe-legacy/pull/21 2020-01-29 13:48:02 +01:00
chr56
69bf1c5d81 Merge branch 'dev' into dev 2020-01-29 12:14:21 +08:00
Abu Sarim Hindi
fbf6351b99 Translated using Weblate (Urdu)
Currently translated at 100.0% (527 of 527 strings)
2020-01-28 22:01:31 +01:00
Harshal Lele
a78762756a reformatted code 2020-01-28 20:54:24 +05:30
Harshal Lele
1f24c18614 reformatted and commented code 2020-01-28 20:14:35 +05:30
Igor Nedoboy
153790d80a Translated using Weblate (Russian)
Currently translated at 100.0% (527 of 527 strings)
2020-01-28 12:49:24 +01:00
Hosted Weblate
e98f27cb66 Merge branch 'origin/dev' into Weblate. 2020-01-28 04:20:51 +01:00
Abu Sarim Hindi
c17d80948c Translated using Weblate (Urdu)
Currently translated at 100.0% (527 of 527 strings)
2020-01-28 04:20:45 +01:00
Ryan
c486368b9b Translated using Weblate (Korean)
Currently translated at 100.0% (527 of 527 strings)
2020-01-28 04:20:44 +01:00
Laura Arjona Reina
42bb96af23 Translated using Weblate (Spanish)
Currently translated at 100.0% (527 of 527 strings)
2020-01-28 04:20:41 +01:00
Sithananthan
e082976914 Translated using Weblate (Tamil)
Currently translated at 43.3% (228 of 527 strings)
2020-01-28 04:20:41 +01:00
bopol
156a2eb4ff update prettytime dependency
see https://github.com/TeamNewPipe/NewPipe/pull/2921#issuecomment-572601812
It will add Esperanto, add bengali, update vietnamese
pretty time is the library used in the home page: … days ago
2020-01-27 19:32:40 +01:00
B0pol
e94981e6f7 Merge branch 'dev' into dev 2020-01-27 19:24:18 +01:00
Tobias Groza
be92921034 Merge pull request #2310 from christophehenry/add-kodi-share-player
Add send to Kodi button to player next to share button
2020-01-27 10:46:59 +01:00
Christophe
94403a9c3c Add send to Kodi button to player next to share button 2020-01-27 10:27:24 +01:00
XiangRongLin
b5ea61a079 Merge branch 'dev' into 1907renamePlaylist 2020-01-26 20:36:18 +01:00
Hosted Weblate
af9e2420a6 Merge branch 'origin/dev' into Weblate. 2020-01-26 20:21:35 +01:00
Ian Emmanuel M. Enanoria
14b3cf7ccd Translated using Weblate (Filipino)
Currently translated at 12.7% (67 of 527 strings)
2020-01-26 20:21:29 +01:00
AioiLight
9c58a07a72 Translated using Weblate (Japanese)
Currently translated at 99.8% (526 of 527 strings)
2020-01-26 20:21:28 +01:00
Tobias Groza
609855f774 Merge pull request #2917 from raphj/patch-1
Allow a BasePlayer to start paused
2020-01-26 17:39:39 +01:00
XiangRongLin
37409e7d90 Merge branch 'dev' into 1907renamePlaylist 2020-01-26 15:34:12 +01:00
Tobias Groza
cc83991d8d Merge pull request #2958 from kapodamy/android5-temp-dir-issue
fix #2889
2020-01-26 11:04:45 +01:00
Tobias Groza
bf5e94fc1a Merge pull request #2957 from kapodamy/subtitles
Rewrite ttml conversion
2020-01-26 11:03:13 +01:00
harshlele
52420d4bf1 Merge branch 'dev' into ask-overlay-perm-settings 2020-01-26 09:57:30 +05:30
Tobias Groza
7f7bf8474e Add link to FAQ in README 2020-01-25 21:35:07 +01:00
Harshal Lele
e1145f16f2 ask for display over other apps permission in settings 2020-01-25 22:30:49 +05:30
XiangRongLin
b430a23df1 Merge branch 'dev' into 1907renamePlaylist 2020-01-25 14:24:07 +01:00
Hosted Weblate
fa7173b3d5 Merge branch 'origin/dev' into Weblate. 2020-01-24 21:41:36 +01:00
Abu Sarim Hindi
b2d78786c2 Translated using Weblate (Urdu)
Currently translated at 100.0% (527 of 527 strings)
2020-01-24 21:41:31 +01:00
B0pol
489420e855 Merge branch 'dev' into dev 2020-01-24 20:19:51 +01:00
TobiGr
5bc0d2c31b Merge branch 'master' into dev 2020-01-24 19:20:26 +01:00
Allan Nordhøy
e9fda96aa1 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.3% (518 of 527 strings)
2020-01-24 09:26:04 +01:00
Abu Sarim Hindi
64b0ccd574 Translated using Weblate (Urdu)
Currently translated at 100.0% (527 of 527 strings)
2020-01-24 09:26:04 +01:00
B0pol
d3aadc71b1 Translated using Weblate (Urdu)
Currently translated at 100.0% (527 of 527 strings)
2020-01-24 09:26:03 +01:00
B0pol
c21ccef7bc Translated using Weblate (Esperanto)
Currently translated at 100.0% (527 of 527 strings)
2020-01-24 09:26:03 +01:00
TobiGr
2152375227 Bump version to 0.18.2 [hotfix release] 2020-01-24 02:30:08 +01:00
TobiGr
10d57afaac Update extractor version 2020-01-24 02:29:21 +01:00
Abu Sarim Hindi
e224f8ca28 Translated using Weblate (Urdu)
Currently translated at 100.0% (527 of 527 strings)
2020-01-24 01:13:33 +01:00
Allan Nordhøy
1f975c0a3a Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.1% (517 of 527 strings)
2020-01-23 00:33:15 +01:00
MohammedSR Vevo
ce075395a1 Translated using Weblate (Kurdish)
Currently translated at 100.0% (527 of 527 strings)
2020-01-23 00:33:13 +01:00
chr56
167653ac60 fix wrong strings in values-zh-rCN. 2020-01-22 13:00:00 +08:00
chr56
ee0f94c232 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (527 of 527 strings)
2020-01-22 04:52:39 +01:00
Xiang Rong Lin
0ed3354cee Use custom dialog to edit and delete local playlists at once 2020-01-21 20:56:06 +01:00
kapodamy
b8f726153f Merge branch 'dev' into subtitles 2020-01-20 23:23:51 -03:00
kapodamy
afc362d2b6 readability changes 2020-01-20 23:33:30 -03:00
kapodamy
776d8a4406 Merge branch 'dev' into android5-temp-dir-issue 2020-01-20 23:23:44 -03:00
kapodamy
7718581882 Merge branch 'dev' into m4a-stsc-stco 2020-01-20 23:23:39 -03:00
Hosted Weblate
ba245c49da Merge branch 'origin/dev' into Weblate. 2020-01-19 20:41:20 +01:00
Allan Nordhøy
cf60033424 Translated using Weblate (Norwegian Bokmål)
Currently translated at 96.4% (508 of 527 strings)
2020-01-19 20:41:14 +01:00
B0pol
0e39071b5e Translated using Weblate (Urdu)
Currently translated at 94.3% (497 of 527 strings)
2020-01-19 20:41:14 +01:00
MohammedSR Vevo
b6028cef5b Translated using Weblate (Kurdish)
Currently translated at 100.0% (527 of 527 strings)
2020-01-19 20:41:13 +01:00
Jeff Huang
62906fb84a Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (527 of 527 strings)
2020-01-19 20:41:13 +01:00
Matsuri
4797cd9184 Translated using Weblate (Chinese (Simplified))
Currently translated at 98.5% (519 of 527 strings)
2020-01-19 20:41:12 +01:00
B0pol
366c55c8f4 Translated using Weblate (Polish)
Currently translated at 100.0% (527 of 527 strings)
2020-01-19 20:41:12 +01:00
zmni
7e93456805 Translated using Weblate (Indonesian)
Currently translated at 99.8% (526 of 527 strings)
2020-01-19 20:41:12 +01:00
thami simo
de1a92539a Translated using Weblate (Arabic)
Currently translated at 100.0% (527 of 527 strings)
2020-01-19 20:41:11 +01:00
zeritti
84dd1a688e Translated using Weblate (Czech)
Currently translated at 100.0% (527 of 527 strings)
2020-01-19 20:41:10 +01:00
B0pol
36c4063db6 Translated using Weblate (Esperanto)
Currently translated at 100.0% (527 of 527 strings)
2020-01-19 20:41:08 +01:00
Osoitz
9c9a432ea0 Translated using Weblate (Basque)
Currently translated at 100.0% (527 of 527 strings)
2020-01-19 20:41:07 +01:00
ssantos
1c53b22239 Translated using Weblate (Portuguese)
Currently translated at 100.0% (527 of 527 strings)
2020-01-19 20:41:06 +01:00
pjammo
5dbab85505 Translated using Weblate (Italian)
Currently translated at 100.0% (527 of 527 strings)
2020-01-19 20:41:06 +01:00
Igor Nedoboy
2873f723e8 Translated using Weblate (Russian)
Currently translated at 100.0% (527 of 527 strings)
2020-01-19 20:41:04 +01:00
B0pol
6b7043fb9d Translated using Weblate (French)
Currently translated at 100.0% (527 of 527 strings)
2020-01-19 20:41:04 +01:00
B0pol
9d5612d104 Translated using Weblate (German)
Currently translated at 100.0% (527 of 527 strings)
2020-01-19 20:41:03 +01:00
B0pol
e58088d290 Merge branch 'dev' into dev 2020-01-19 18:09:17 +01:00
Xiang Rong Lin
77aa12dd81 Rename local playlist by long-clicking in BookmarkFragment.
After long clicking on a local playlist, show a dialog with 2 options for "rename" and "delete"
Rename shows another dialog to let the user rename the playlist.
Delete lets the user delete a playlist like before.
2020-01-19 14:39:40 +01:00
Stypox
8c3be2c9df Merge pull request #2960 from karkaminski/issue-#2254
Issue #2254
2020-01-19 12:55:55 +01:00
Stypox
266c3d03fc Merge branch 'dev' into issue-#2254 2020-01-19 12:50:08 +01:00
Tobias Groza
42ff60ce85 Merge pull request #2956 from TeamNewPipe/release_v0.18.1
Release v0.18.1
2020-01-19 09:54:05 +01:00
bopol
e08e724573 upload date in description now matches newpipe's language 2020-01-18 10:46:53 +01:00
bopol
b155f23d27 fix: wrong language shown in playback parameters dialog
This is a hardly reproduceable bug that I hopefully fixed. After a long time of watching videos, you could have your system language shown in playback parameters dialog.
Calling changeAppLanguage(getAppLocale(…),…) onCreate will most certainly fix this bug
2020-01-18 09:46:38 +01:00
kapodamy
a2d3e2c7e0 2 typo fixup
* add missing namespace of StandardCharsets
* use an unused constructor argument
2020-01-18 01:10:25 -03:00
kapodamy
ed18466c3b Merge branch 'dev' into subtitles 2020-01-18 00:35:48 -03:00
kapodamy
845767e2f8 StandardCharsets.UTF_8 instead of Charset.forName("utf-8") 2020-01-18 00:43:38 -03:00
kapodamy
a0548fdbf8 Merge branch 'dev' into android5-temp-dir-issue 2020-01-18 00:35:38 -03:00
kapodamy
b837912e75 Merge branch 'dev' into m4a-stsc-stco 2020-01-18 00:35:35 -03:00
B0pol
0cd9fb32a8 Merge branch 'dev' into dev 2020-01-18 00:26:04 +01:00
TobiGr
fd62411b35 Bump version to 0.18.1 and version code to 810 2020-01-18 00:09:40 +01:00
TobiGr
134850aa04 Add changelog for 0.18.1 2020-01-18 00:09:27 +01:00
TobiGr
0795135f2f Merge remote-tracking branch 'Weblate/dev' into dev 2020-01-18 00:01:55 +01:00
Tobias Groza
85eb1dc436 Merge pull request #2966 from B0pol/c_links_support
[YouTube] /c/ channel links support & update extractor version
2020-01-17 23:59:41 +01:00
B0pol
2f2b8784f9 update extractor version 2020-01-17 23:07:45 +01:00
bopol
181658e5a4 support for opening /c/ channel links 2020-01-17 22:59:51 +01:00
Raphaël Jakse
7dbb2b206c Simplify an if expression 2020-01-17 11:49:33 +01:00
Raphaël Jakse
ef90493c27 Deduplicate code switching to another player into a function 2020-01-17 11:49:20 +01:00
WaldiS
d949894511 Translated using Weblate (Polish)
Currently translated at 100.0% (527 of 527 strings)
2020-01-17 10:02:16 +01:00
Raphaël Jakse
570dded8d6 Add field START_PAUSED to the Player Intent
This allows fixing spurious playback resume when minimizing to the background player.
2020-01-16 20:57:55 +01:00
Igor Nedoboy
235ead9222 Translated using Weblate (Russian)
Currently translated at 100.0% (527 of 527 strings)
2020-01-16 20:57:01 +01:00
nautilusx
3ee6788753 Translated using Weblate (German)
Currently translated at 100.0% (527 of 527 strings)
2020-01-16 14:15:09 +01:00
Deleted User
e3dfab5078 Translated using Weblate (Norwegian Bokmål)
Currently translated at 96.4% (508 of 527 strings)
2020-01-16 06:28:38 +01:00
Allan Nordhøy
5f232a059d Translated using Weblate (Norwegian Bokmål)
Currently translated at 96.4% (508 of 527 strings)
2020-01-16 06:28:38 +01:00
Loís B
1b708d261d Translated using Weblate (Occitan)
Currently translated at 18.8% (99 of 527 strings)
2020-01-15 20:36:11 +01:00
Yaron Shahrabani
3341742f66 Translated using Weblate (Hebrew)
Currently translated at 100.0% (527 of 527 strings)
2020-01-15 20:36:11 +01:00
Oğuz Ersen
b731c79339 Translated using Weblate (Turkish)
Currently translated at 100.0% (527 of 527 strings)
2020-01-15 20:36:10 +01:00
Igor Nedoboy
29b12c2f84 Translated using Weblate (Russian)
Currently translated at 100.0% (527 of 527 strings)
2020-01-15 20:36:09 +01:00
chr56
ba53f6611c Translated using Weblate (Chinese (Simplified))
Currently translated at 97.3% (513 of 527 strings)
2020-01-15 10:10:31 +01:00
Hosted Weblate
6eeed50418 Merge branch 'origin/dev' into Weblate. 2020-01-15 09:42:51 +01:00
Loís B
8caf9f87a1 Translated using Weblate (Occitan)
Currently translated at 17.9% (94 of 525 strings)
2020-01-15 09:42:49 +01:00
B0pol
2e6089088b Translated using Weblate (Urdu)
Currently translated at 95.0% (499 of 525 strings)
2020-01-15 09:42:46 +01:00
Matsuri
40eaa166ae Translated using Weblate (Chinese (Simplified))
Currently translated at 97.3% (511 of 525 strings)
2020-01-15 09:42:45 +01:00
B0pol
41e2e5f951 Translated using Weblate (Esperanto)
Currently translated at 100.0% (525 of 525 strings)
2020-01-15 09:42:44 +01:00
B0pol
ac3938d529 Translated using Weblate (French)
Currently translated at 100.0% (525 of 525 strings)
2020-01-15 09:42:43 +01:00
DodoLeDev
515ec4d66d Translated using Weblate (French)
Currently translated at 100.0% (525 of 525 strings)
2020-01-15 09:42:43 +01:00
Nehemias Feliz
5adc27ea2b Translated using Weblate (Spanish)
Currently translated at 100.0% (525 of 525 strings)
2020-01-15 09:42:42 +01:00
C. Rüdinger
ab089a5f93 Translated using Weblate (German)
Currently translated at 100.0% (525 of 525 strings)
2020-01-15 09:42:41 +01:00
B0pol
9d8fcbbffe fix: wrong language shown when rotating screen in popup player 2020-01-15 08:33:57 +01:00
chr56
590722d929 manually update the Simplified Chinese lang file.
/values-b+zh+HANS+CN was updated.
Action: copy file in /values-b+zh+HANS+CN to /values-zh-rCN
2020-01-15 12:30:17 +08:00
karkaminski
a0ee1b1653 Merge branch 'dev' into issue-#2254 2020-01-14 22:23:32 +01:00
Karol Kaminski
b965f88eb2 removed main_menu.xml 2020-01-14 22:08:07 +01:00
Karol Kaminski
a228e702da menu-item History visibility accordingly to settings 2020-01-14 19:30:36 +01:00
bopol
105981b2eb made system translatable + renamed it to system's language 2020-01-14 19:11:46 +01:00
bopol
055365a449 added Occitan to the selector 2020-01-14 14:26:53 +01:00
bopol
f8a7aac40d fixed indonesian, see https://stackoverflow.com/questions/13291578/how-to-localize-an-android-app-in-indonesian-language 2020-01-14 14:15:42 +01:00
chr56
6712ea5e6f Merge branch 'dev' into dev 2020-01-14 21:00:40 +08:00
B0pol
382e69273e Merge branch 'dev' into dev 2020-01-14 11:11:45 +01:00
kapodamy
9b71828b97 implement sgpd and sbgp boxes in audio tracks 2020-01-14 01:08:46 -03:00
kapodamy
00eddcb237 android 5 (lollipop) fixup
this commit attempts to fix the pickAvailableTemporalDir() method in ROMS that not are CTS compliant.
2020-01-14 00:05:34 -03:00
kapodamy
49cc643dcc decrease the size of samples per chunk 2020-01-14 00:04:53 -03:00
kapodamy
42ec6f0810 ttml to srt conversion
rewrite SubtitleConverter (use JSoup library instead, remove unused methods)
2020-01-14 00:04:16 -03:00
TobiGr
9f47a274a8 Update extractor version
TeamNewPipe/NewPipeExtractor@bdbfa26835
2020-01-13 20:40:11 +01:00
TobiGr
1f8c0a9e5e Merge remote-tracking branch 'Weblate/dev' into dev 2020-01-13 20:33:24 +01:00
Tobias Groza
cef9ccd937 Merge pull request #2717 from kszczek/delete-finished-downloads
Add option to delete files when clearing finished downloads
2020-01-13 20:32:18 +01:00
Karol Kaminski
9d773d6e8a removed dot menu where its no longer needed 2020-01-13 20:28:32 +01:00
TobiGr
3d93ecd6ec Use Integer value directly for formatted string
a
2020-01-13 20:25:32 +01:00
Loís B
36e38e50e9 Translated using Weblate (Occitan)
Currently translated at 10.1% (53 of 525 strings)
2020-01-13 15:49:01 +01:00
Software In Interlingua
1a8be2bbf5 Translated using Weblate (Interlingua)
Currently translated at 11.4% (60 of 525 strings)
2020-01-13 15:48:59 +01:00
Allan Nordhøy
92b1fa5743 Translated using Weblate (Norwegian Bokmål)
Currently translated at 96.2% (505 of 525 strings)
2020-01-13 15:48:58 +01:00
MohammedSR Vevo
335e5c05db Translated using Weblate (Kurdish)
Currently translated at 100.0% (525 of 525 strings)
2020-01-13 15:48:58 +01:00
Yaron Shahrabani
bfead79c07 Translated using Weblate (Hebrew)
Currently translated at 100.0% (525 of 525 strings)
2020-01-13 15:48:57 +01:00
Jeff Huang
bd8014bcbd Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (525 of 525 strings)
2020-01-13 15:48:57 +01:00
Matsuri
948d57d3d1 Translated using Weblate (Chinese (Simplified))
Currently translated at 97.3% (511 of 525 strings)
2020-01-13 15:48:56 +01:00
Daniele Lira Mereb
31b830d6d0 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (525 of 525 strings)
2020-01-13 15:48:56 +01:00
WaldiS
2038df976c Translated using Weblate (Polish)
Currently translated at 100.0% (525 of 525 strings)
2020-01-13 15:48:54 +01:00
Oğuz Ersen
46cc215120 Translated using Weblate (Turkish)
Currently translated at 100.0% (525 of 525 strings)
2020-01-13 15:48:53 +01:00
zmni
3afce82aa7 Translated using Weblate (Indonesian)
Currently translated at 99.6% (523 of 525 strings)
2020-01-13 15:48:52 +01:00
B0pol
88e5be237e Translated using Weblate (Esperanto)
Currently translated at 100.0% (525 of 525 strings)
2020-01-13 15:48:51 +01:00
Petros Grammatikopoulos
7c4b9d8843 Translated using Weblate (Greek)
Currently translated at 97.7% (513 of 525 strings)
2020-01-13 15:48:50 +01:00
Osoitz
b83e1716fe Translated using Weblate (Basque)
Currently translated at 99.4% (522 of 525 strings)
2020-01-13 15:48:49 +01:00
ssantos
c3e41e2427 Translated using Weblate (Portuguese)
Currently translated at 100.0% (525 of 525 strings)
2020-01-13 15:48:49 +01:00
B0pol
3f67b3b73c Translated using Weblate (French)
Currently translated at 100.0% (525 of 525 strings)
2020-01-13 15:48:48 +01:00
nautilusx
78c9e4e1ad Translated using Weblate (German)
Currently translated at 100.0% (525 of 525 strings)
2020-01-13 15:48:48 +01:00
C. Rüdinger
69c090b5a1 Translated using Weblate (German)
Currently translated at 100.0% (525 of 525 strings)
2020-01-13 15:48:47 +01:00
Kamil Szczęk
2c8222fd55 Style corrected 2020-01-11 15:19:24 +01:00
Kamil Szczęk
d071891b2a Add a snackbar to allow user to undo file deletion 2020-01-11 15:09:01 +01:00
Kamil Szczęk
986acc5fc5 Reorder buttons in clear downloads dialog 2020-01-11 15:09:01 +01:00
Kamil Szczęk
e4295fb3fa Use a dialog option instead of a checkbox 2020-01-11 15:09:01 +01:00
Kamil Szczęk
cfad3fb5de Fix inconsistent style 2020-01-11 15:09:01 +01:00
Kamil Szczęk
b18236a27e Put call to forget finished downloads in an else statement to prevent potential bugs 2020-01-11 15:09:01 +01:00
Kamil Szczęk
f6bbc69cf9 Remove unnecessary import 2020-01-11 15:09:01 +01:00
Kamil Szczęk
707e4f7167 Add option to remove downloaded files when clearing finished downloads 2020-01-11 15:09:01 +01:00
bopol
11d06dc86d remove todo as it's already done 2020-01-10 16:03:24 +01:00
bopol
8f46432391 fixed some activities where the wrong languages would be set 2020-01-10 15:50:15 +01:00
TobiGr
99cdaec40e Translated using Weblate (German)
Currently translated at 99.0% (520 of 525 strings)
2020-01-09 17:23:02 +01:00
bopol
b32935a1b0 app language now changes time formatting (3hrs ago), was system language b4 2020-01-09 15:51:41 +01:00
bopol
ed9a3517c6 removed unused imports 2020-01-09 12:15:01 +01:00
B0pol
e0a39efa2b Merge branch 'dev' into dev 2020-01-09 10:07:22 +01:00
bopol
3ad0e313ca changed the way to change language, now is «NewPipe's language» selector 2020-01-09 09:40:05 +01:00
Allan Nordhøy
bca547ce44 \'Storage Access Framework\' 2020-01-09 04:38:47 +01:00
Allan Nordhøy
6bc697f926 Continue ending playback queue 2020-01-09 04:36:39 +01:00
Igor Nedoboy
bff5371e41 Translated using Weblate (Russian)
Currently translated at 100.0% (525 of 525 strings)
2020-01-09 02:51:05 +01:00
Allan Nordhøy
694013c9df Spelling: Language reworked 2 2020-01-08 21:55:17 +01:00
Hosted Weblate
a76398efd0 Merge branch 'origin/dev' into Weblate. 2020-01-08 20:51:08 +01:00
Allan Nordhøy
99bcd8d043 Translated using Weblate (Norwegian Bokmål)
Currently translated at 96.0% (501 of 522 strings)
2020-01-08 20:51:04 +01:00
Software In Interlingua
1602ecbaf9 Translated using Weblate (Interlingua)
Currently translated at 11.1% (58 of 522 strings)
2020-01-08 20:51:04 +01:00
Tobias Groza
7e17bdf369 Merge pull request #2935 from comradekingu/patch-9
Spelling: Could not, PeerTube, HTTPS, URL
2020-01-08 19:09:43 +01:00
Allan Nordhøy
d316bbad44 Select your favorite
Co-Authored-By: Stypox <stypox@pm.me>
2020-01-08 18:22:17 +01:00
Tobias Groza
72151c8c0c Merge pull request #2906 from kapodamy/opus-fixup
add opus file extension
2020-01-08 18:19:23 +01:00
Allan Nordhøy
e2e0a9bfa2 Spelling: Could not, PeerTube, HTTPS, URL 2020-01-08 17:51:35 +01:00
kapodamy
8d53b07167 fixup
* [DownloadDialog.java] use *.opus extension instead of *.webm (bad change from 844f80a5f1)
* [StreamItemAdapter.java] show "opus" in format label instead of "WebM Opus"
2020-01-08 12:42:34 -03:00
Tobias Groza
1df852171d Merge pull request #2837 from decarvalhobo/dev
Playlist thumbnail updates
2020-01-07 23:02:42 +01:00
TobiGr
399e2626fb Fix code style and improve imports 2020-01-07 22:48:35 +01:00
decarvalhobo
752a76eb44 Usage of drawable instead of remote image + refactor the append to an empty playlist by just updating the thumbnail before adding the item in it. 2020-01-07 22:33:45 +01:00
De Carvalho Marcio Antonio
8feee05eec remove comments 2020-01-07 22:33:45 +01:00
De Carvalho Marcio Antonio
e9a4caaf0b remove comments 2020-01-07 22:33:45 +01:00
decarvalhobo
8de367e03f fix issue: thumbnail update when element deleted + thumbnail update when element added and no thumbnail 2020-01-07 22:33:45 +01:00
TobiGr
dad88b83fb Fix Arabic translation 2020-01-07 22:33:30 +01:00
TobiGr
846f7f2f05 Merge remote-tracking branch 'Weblate/dev' into dev 2020-01-07 22:28:15 +01:00
pjammo
41e18ae694 Translated using Weblate (Italian)
Currently translated at 100.0% (522 of 522 strings)
2020-01-07 17:21:22 +01:00
Daniele Lira Mereb
deeac118a1 Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.3% (508 of 522 strings)
2020-01-07 17:21:21 +01:00
MohammedSR Vevo
594d77e713 Translated using Weblate (Kurdish)
Currently translated at 100.0% (522 of 522 strings)
2020-01-06 00:21:31 +01:00
JoC
2ea404659b Translated using Weblate (Spanish)
Currently translated at 100.0% (522 of 522 strings)
2020-01-06 00:21:28 +01:00
Software In Interlingua
e2ec95e6ff Translated using Weblate (Interlingua)
Currently translated at 10.9% (57 of 522 strings)
2020-01-06 00:21:28 +01:00
pietrasagh
db87df743d Translated using Weblate (Polish)
Currently translated at 100.0% (522 of 522 strings)
2020-01-06 00:21:27 +01:00
ssantos
23f9ffdab7 Translated using Weblate (Portuguese)
Currently translated at 100.0% (522 of 522 strings)
2020-01-06 00:21:26 +01:00
Enol P
28063c35c2 Translated using Weblate (Asturian)
Currently translated at 49.2% (257 of 522 strings)
2020-01-06 00:21:25 +01:00
Иван
21a39b06e7 Translated using Weblate (Ukrainian)
Currently translated at 98.1% (512 of 522 strings)
2020-01-06 00:21:23 +01:00
Osoitz
8fb29ae6c2 Translated using Weblate (Basque)
Currently translated at 99.8% (521 of 522 strings)
2020-01-06 00:21:22 +01:00
B0pol
21895caa3a Translated using Weblate (Esperanto)
Currently translated at 100.0% (522 of 522 strings)
2020-01-06 00:21:20 +01:00
THANOS SIOURDAKIS
f17b92512c Translated using Weblate (Greek)
Currently translated at 97.9% (511 of 522 strings)
2020-01-06 00:21:19 +01:00
ssantos
014682664d Translated using Weblate (German)
Currently translated at 100.0% (522 of 522 strings)
2020-01-06 00:21:18 +01:00
Tobias Groza
5bf1df9f14 Merge pull request #2690 from K1rakishou/(#1570)-lock-screen-video-thumbnail
Show video thumbnail on the lock screen
2020-01-05 10:36:38 +01:00
bopol
dea1e0dcb9 Update localizations settings
1) now, on « content language » change, it will also change the app language
2) added Esperanto to the list of language in content language
2020-01-04 21:38:27 +01:00
k1rakishou
eb5fb42da9 Couple more code review changes 2020-01-03 16:29:04 +03:00
k1rakishou
c46a0f7b2e Code-review changes 2020-01-03 13:00:53 +03:00
k1rakishou
835476870b Merge remote-tracking branch 'push_here/(#1570)-lock-screen-video-thumbnail' into (#1570)-lock-screen-video-thumbnail
# Conflicts:
#	app/src/main/java/org/schabi/newpipe/player/BackgroundPlayer.java
#	app/src/main/java/org/schabi/newpipe/player/helper/MediaSessionManager.java
#	app/src/main/java/org/schabi/newpipe/util/BitmapUtils.java
#	app/src/main/res/xml/video_audio_settings.xml
2020-01-03 12:56:01 +03:00
TobiGr
718acb5059 Code improvements 2020-01-02 15:00:31 +01:00
TobiGr
1aa763e86c Enable lockscreen video thumbnail by default 2020-01-02 15:00:31 +01:00
k1rakishou
0395dc6e9e Add a setting for the lock screen thumbnail feature 2020-01-02 15:00:31 +01:00
k1rakishou
96de70b71e Rebase onto the latest dev, update appcompat dependencies to use androidx 2020-01-02 15:00:31 +01:00
k1rakishou
f44883e79f Show video thumbnail on the lock screen 2020-01-02 15:00:31 +01:00
Tobias Groza
c56fb8cec2 Merge pull request #2871 from atpamat/main-window-tabs
make main page tabs scrollable and hide when there is only a single tab
2020-01-02 13:22:01 +01:00
Paweł Matuszewski
3625a38a23 improve code consistency in ScrollableTabLayout 2020-01-02 13:02:14 +01:00
Paweł Matuszewski
1393d3ad7f fix ScrollableTabLayout content width calculation
fix bug where only minimum width requested by tab was counted even if actual content was wider
2020-01-02 13:02:14 +01:00
Paweł Matuszewski
b674cfec24 simplify ScrollableTabLayout tabs width checking 2020-01-02 13:02:14 +01:00
Paweł Matuszewski
f0f0c43b72 hide main page tab selector with single tab 2020-01-02 13:02:14 +01:00
Paweł Matuszewski
33caad4690 make main page tabs scrollable 2020-01-02 13:02:14 +01:00
Tobias Groza
0afc8005d0 Merge pull request #2771 from atpamat/background-player-notif-lag
Limit amount of notification thumbnail updates in background player
2020-01-01 23:01:11 +01:00
Yaron Shahrabani
f04d2e76fa Translated using Weblate (Hebrew)
Currently translated at 100.0% (522 of 522 strings)
2020-01-01 19:12:04 +01:00
Igor Nedoboy
8e1d7f162d Translated using Weblate (Russian)
Currently translated at 100.0% (522 of 522 strings)
2020-01-01 19:12:01 +01:00
Paweł Matuszewski
ee65e89230 limit amount of notification thumbnail updates
limits amount of calls to updateNotificationThumbnail in background player
2020-01-01 16:38:46 +01:00
Matsuri
a8e26238a8 Translated using Weblate (Chinese (Simplified))
Currently translated at 98.7% (515 of 522 strings)
2020-01-01 13:26:15 +01:00
MohammedSR Vevo
a3dc95bef1 Translated using Weblate (Kurdish)
Currently translated at 99.8% (521 of 522 strings)
2020-01-01 13:26:15 +01:00
Software In Interlingua
a29df9a2dd Translated using Weblate (Interlingua)
Currently translated at 9.4% (49 of 522 strings)
2020-01-01 13:26:14 +01:00
Yaron Shahrabani
cc17d268fc Translated using Weblate (Hebrew)
Currently translated at 100.0% (522 of 522 strings)
2020-01-01 13:26:11 +01:00
Ariel Shulman
22a9a06b87 Translated using Weblate (Hebrew)
Currently translated at 100.0% (522 of 522 strings)
2020-01-01 13:26:09 +01:00
chr56
d063d39dbc Translated using Weblate (Chinese (Simplified))
Currently translated at 98.7% (515 of 522 strings)
2019-12-31 19:01:41 +01:00
Jeff Huang
87e29dbd84 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (522 of 522 strings)
2019-12-31 19:01:40 +01:00
MohammedSR Vevo
2227a7a6bd Translated using Weblate (Kurdish)
Currently translated at 99.8% (521 of 522 strings)
2019-12-31 19:01:39 +01:00
ButterflyOfFire
867f633d16 Translated using Weblate (French)
Currently translated at 99.4% (519 of 522 strings)
2019-12-31 19:01:34 +01:00
ButterflyOfFire
b9de3c202a Translated using Weblate (Arabic)
Currently translated at 100.0% (522 of 522 strings)
2019-12-31 19:01:33 +01:00
pjammo
56364c4a2c Translated using Weblate (Italian)
Currently translated at 100.0% (522 of 522 strings)
2019-12-31 19:01:32 +01:00
WaldiS
b1fd2c007d Translated using Weblate (Polish)
Currently translated at 99.2% (518 of 522 strings)
2019-12-31 19:01:27 +01:00
Yaron Shahrabani
741a872c39 Translated using Weblate (Hebrew)
Currently translated at 100.0% (522 of 522 strings)
2019-12-31 19:01:26 +01:00
Igor Nedoboy
e1e2add616 Translated using Weblate (Russian)
Currently translated at 100.0% (522 of 522 strings)
2019-12-31 19:01:25 +01:00
C. Rüdinger
0c664e346a Translated using Weblate (German)
Currently translated at 99.2% (518 of 522 strings)
2019-12-31 19:01:25 +01:00
Oğuz Ersen
7ddb856ccd Translated using Weblate (Turkish)
Currently translated at 100.0% (522 of 522 strings)
2019-12-31 19:01:24 +01:00
Software In Interlingua
17c0b981d1 Added translation using Weblate (Interlingua) 2019-12-31 19:01:20 +01:00
Tobias Groza
7f0a9904ff Merge pull request #2913 from yausername/fixTranslatableUrl
made instance list url non translatable
2019-12-31 15:51:27 +01:00
yausername
2b4190d85d made instance list url non translatable 2019-12-31 20:10:51 +05:30
Tobias Groza
57e89babf1 Merge pull request #2879 from Louis-Berlic/dev
Add support for Occitan language
2019-12-31 11:02:14 +01:00
Tobias Groza
209dc5ace9 Merge pull request #2912 from mauriciocolli/fix-wrong-thread-access
Fix for player access out of its creation thread
2019-12-31 10:55:12 +01:00
chr56
ab7f3c7399 Merge branch 'dev' into dev 2019-12-31 17:29:46 +08:00
Mauricio Colli
1e7e8d4121 Fix for player access out of its creation thread 2019-12-31 02:52:16 -03:00
Tobias Groza
04b75ef05f Merge pull request #2636 from dotvirus/longpress-on-custom-playlists
Add local playlist to queue when long clicking on 'Background/Popup'
2019-12-31 01:50:52 +01:00
dotvirus
de19421de1 Update LocalPlaylistFragment.java 2019-12-31 01:42:41 +01:00
Tobias Groza
61f64a7349 Merge pull request #2875 from Nico-late/Issue#2838
Fixed issues #2838 #2797 #2773
2019-12-31 01:23:24 +01:00
Nico-late
6fb16bad85 Update app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java
Space added for more clarity

Co-Authored-By: Tobias Groza <TobiGr@users.noreply.github.com>
2019-12-31 00:52:01 +01:00
Nico-late
694813ac90 Fixed issue #2838 2019-12-31 00:52:01 +01:00
C. Rüdinger
6f3fd50ed8 Translated using Weblate (German)
Currently translated at 99.2% (518 of 522 strings)
2019-12-30 14:06:08 +01:00
TobiGr
c1e1c191d0 Translated using Weblate (German)
Currently translated at 99.2% (518 of 522 strings)
2019-12-30 14:06:08 +01:00
Igor Nedoboy
f4c8fdaf07 Translated using Weblate (Russian)
Currently translated at 100.0% (522 of 522 strings)
2019-12-29 23:20:25 +01:00
MohammedSR Vevo
457ebe3aa2 Translated using Weblate (Kurdish)
Currently translated at 78.5% (410 of 522 strings)
2019-12-29 22:55:19 +01:00
MohammedSR Vevo
8da8ce0a0a Translated using Weblate (Kurdish)
Currently translated at 70.9% (360 of 508 strings)
2019-12-29 13:59:23 +01:00
Igor Nedoboy
cc869b98a3 Translated using Weblate (Russian)
Currently translated at 100.0% (508 of 508 strings)
2019-12-29 13:59:01 +01:00
winqooq
f9e7873e54 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (508 of 508 strings)
2019-12-27 17:26:55 +01:00
Hosted Weblate
c4cba8aa37 Merge branch 'origin/dev' into Weblate. 2019-12-27 09:21:15 +01:00
Jaewoi
22e4ef4034 Translated using Weblate (Korean)
Currently translated at 98.6% (501 of 508 strings)
2019-12-27 09:21:12 +01:00
thami simo
708cdc4c62 Translated using Weblate (Arabic)
Currently translated at 100.0% (522 of 522 strings)
2019-12-24 08:21:11 +01:00
Hosted Weblate
94931df60b Merge branch 'origin/dev' into Weblate. 2019-12-22 23:21:13 +01:00
Éfrit
b3605fe6d4 Translated using Weblate (French)
Currently translated at 100.0% (508 of 508 strings)
2019-12-22 23:21:11 +01:00
justanidea
11e0ed7c4f Translated using Weblate (French)
Currently translated at 100.0% (508 of 508 strings)
2019-12-22 23:21:11 +01:00
WaldiS
34e89448b1 Translated using Weblate (Polish)
Currently translated at 100.0% (508 of 508 strings)
2019-12-22 23:21:09 +01:00
chr56
9f789167da Merge branch 'dev' into dev 2019-12-21 17:31:50 +08:00
Louis-Berlic
a08cd4ce6a Move to values-oc 2019-12-19 16:11:17 +01:00
Louis-Berlic
46b12ed819 Added initial strings.xml for Occitan language 2019-12-19 16:10:09 +01:00
chr_56
9309159c38 copy file in /values-b+zh+HANS+CN to /values-zh-rCN ,in order to manually update the lang file. 2019-12-14 21:25:19 +08:00
chr_56
8e45296826 remove values-cmn/strings.xml (useless) 2019-12-14 21:16:40 +08:00
k1rakishou
e8437052d8 Add a setting for the lock screen thumbnail feature 2019-11-28 21:47:15 +03:00
k1rakishou
cf13f5ca56 Rebase onto the latest dev, update appcompat dependencies to use androidx 2019-11-28 21:47:15 +03:00
k1rakishou
52f82ed228 Show video thumbnail on the lock screen 2019-11-28 21:47:15 +03:00
143 changed files with 4452 additions and 2846 deletions

View File

@@ -13,7 +13,7 @@
</p>
<hr>
<p align="center"><a href="#screenshots">Screenshots</a> &bull; <a href="#description">Description</a> &bull; <a href="#features">Features</a> &bull; <a href="#updates">Updates</a> &bull; <a href="#contribution">Contribution</a> &bull; <a href="#donate">Donate</a> &bull; <a href="#license">License</a></p>
<p align="center"><a href="https://newpipe.schabi.org">Website</a> &bull; <a href="https://newpipe.schabi.org/blog/">Blog</a> &bull; <a href="https://newpipe.schabi.org/press/">Press</a></p>
<p align="center"><a href="https://newpipe.schabi.org">Website</a> &bull; <a href="https://newpipe.schabi.org/blog/">Blog</a> &bull; <a href="https://newpipe.schabi.org/FAQ/">FAQ</a> &bull; <a href="https://newpipe.schabi.org/press/">Press</a></p>
<hr>
<b>WARNING: THIS IS A BETA VERSION, THEREFORE YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE VIA OUR GITHUB REPOSITORY.</b>

2
app/.gitignore vendored
View File

@@ -1,3 +1,3 @@
.gitignore
/build
app.iml
*.iml

View File

@@ -11,8 +11,8 @@ android {
applicationId "org.schabi.newpipe"
minSdkVersion 19
targetSdkVersion 28
versionCode 800
versionName "0.18.0"
versionCode 850
versionName "0.18.5"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
@@ -53,6 +53,7 @@ ext {
okHttpLibVersion = '3.12.6'
icepickLibVersion = '3.2.0'
stethoLibVersion = '1.5.0'
markwonVersion = '4.2.1'
}
dependencies {
@@ -62,7 +63,7 @@ dependencies {
exclude module: 'support-annotations'
})
implementation 'com.github.TeamNewPipe:NewPipeExtractor:8e53fda'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:fc465c8bf'
testImplementation 'junit:junit:4.12'
testImplementation 'org.mockito:mockito-core:2.23.0'
@@ -94,7 +95,7 @@ dependencies {
implementation 'io.reactivex.rxjava2:rxjava:2.2.2'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1'
implementation 'org.ocpsoft.prettytime:prettytime:4.0.1.Final'
implementation 'org.ocpsoft.prettytime:prettytime:4.0.3.Final'
implementation "androidx.room:room-runtime:${roomDbLibVersion}"
implementation "androidx.room:room-rxjava2:${roomDbLibVersion}"
@@ -108,4 +109,7 @@ dependencies {
implementation "com.squareup.okhttp3:okhttp:${okHttpLibVersion}"
debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoLibVersion}"
implementation "io.noties.markwon:core:${markwonVersion}"
implementation "io.noties.markwon:linkify:${markwonVersion}"
}

View File

@@ -112,7 +112,7 @@
<activity
android:name=".ReCaptchaActivity"
android:label="@string/reCaptchaActivity"/>
android:label="@string/recaptcha"/>
<provider
android:name="androidx.core.content.FileProvider"
@@ -153,6 +153,7 @@
<!-- channel prefix -->
<data android:pathPrefix="/channel/"/>
<data android:pathPrefix="/user/"/>
<data android:pathPrefix="/c/"/>
<!-- playlist prefix -->
<data android:pathPrefix="/playlist"/>
</intent-filter>

View File

@@ -99,7 +99,7 @@ public class App extends Application {
NewPipe.init(getDownloader(),
Localization.getPreferredLocalization(this),
Localization.getPreferredContentCountry(this));
Localization.init();
Localization.init(getApplicationContext());
StateSaver.init(this);
initNotificationChannel();

View File

@@ -38,7 +38,7 @@ import okhttp3.ResponseBody;
import static org.schabi.newpipe.MainActivity.DEBUG;
public class DownloaderImpl extends Downloader {
public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0";
public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0";
private static DownloaderImpl instance;
private String mCookies;

View File

@@ -31,7 +31,6 @@ import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
@@ -56,7 +55,6 @@ import androidx.fragment.app.FragmentManager;
import com.google.android.material.navigation.NavigationView;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.ServiceList;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
import org.schabi.newpipe.extractor.services.peertube.PeertubeInstance;
@@ -67,6 +65,7 @@ import org.schabi.newpipe.fragments.list.search.SearchFragment;
import org.schabi.newpipe.report.ErrorActivity;
import org.schabi.newpipe.util.Constants;
import org.schabi.newpipe.util.KioskTranslator;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.PeertubeHelper;
import org.schabi.newpipe.util.PermissionHelper;
@@ -78,6 +77,8 @@ import org.schabi.newpipe.util.ThemeHelper;
import java.util.ArrayList;
import java.util.List;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals("release");
@@ -113,9 +114,9 @@ public class MainActivity extends AppCompatActivity {
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
TLSSocketFactoryCompat.setAsDefault();
}
ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this));
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@@ -419,6 +420,8 @@ public class MainActivity extends AppCompatActivity {
@Override
protected void onResume() {
assureCorrectAppLanguage(this);
Localization.init(getApplicationContext()); //change the date format to match the selected language on resume
super.onResume();
// close drawer on return, and don't show animation, so its looks like the drawer isn't open
@@ -449,6 +452,10 @@ public class MainActivity extends AppCompatActivity {
sharedPreferences.edit().putBoolean(Constants.KEY_MAIN_PAGE_CHANGE, false).apply();
NavigationHelper.openMainActivity(this);
}
final boolean isHistoryEnabled = sharedPreferences.getBoolean(
getString(R.string.enable_watch_history_key), true);
drawerItems.getMenu().findItem(ITEM_ID_HISTORY).setVisible(isHistoryEnabled);
}
@Override
@@ -551,8 +558,6 @@ public class MainActivity extends AppCompatActivity {
if (!(fragment instanceof SearchFragment)) {
findViewById(R.id.toolbar).findViewById(R.id.toolbar_search_container).setVisibility(View.GONE);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
}
ActionBar actionBar = getSupportActionBar();
@@ -574,14 +579,6 @@ public class MainActivity extends AppCompatActivity {
case android.R.id.home:
onHomeButtonPressed();
return true;
case R.id.action_show_downloads:
return NavigationHelper.openDownloads(this);
case R.id.action_history:
NavigationHelper.openStatisticFragment(getSupportFragmentManager());
return true;
case R.id.action_settings:
NavigationHelper.openSettings(this);
return true;
default:
return super.onOptionsItemSelected(item);
}

View File

@@ -1,20 +1,25 @@
package org.schabi.newpipe;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import androidx.core.app.NavUtils;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.CookieManager;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import org.schabi.newpipe.util.ThemeHelper;
import androidx.annotation.NonNull;
/*
* Created by beneth <bmauduit@beneth.fr> on 06.12.16.
*
@@ -37,48 +42,46 @@ import android.webkit.WebViewClient;
public class ReCaptchaActivity extends AppCompatActivity {
public static final int RECAPTCHA_REQUEST = 10;
public static final String RECAPTCHA_URL_EXTRA = "recaptcha_url_extra";
public static final String TAG = ReCaptchaActivity.class.toString();
public static final String YT_URL = "https://www.youtube.com";
private String url;
private WebView webView;
private String foundCookies = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
ThemeHelper.setTheme(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recaptcha);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
url = getIntent().getStringExtra(RECAPTCHA_URL_EXTRA);
String url = getIntent().getStringExtra(RECAPTCHA_URL_EXTRA);
if (url == null || url.isEmpty()) {
url = YT_URL;
}
// Set return to Cancel by default
// set return to Cancel by default
setResult(RESULT_CANCELED);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setTitle(R.string.reCaptcha_title);
actionBar.setDisplayShowTitleEnabled(true);
}
webView = findViewById(R.id.reCaptchaWebView);
WebView myWebView = findViewById(R.id.reCaptchaWebView);
// Enable Javascript
WebSettings webSettings = myWebView.getSettings();
// enable Javascript
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
ReCaptchaWebViewClient webClient = new ReCaptchaWebViewClient(this);
myWebView.setWebViewClient(webClient);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
handleCookies(url);
}
});
// Cleaning cache, history and cookies from webView
myWebView.clearCache(true);
myWebView.clearHistory();
// cleaning cache, history and cookies from webView
webView.clearCache(true);
webView.clearHistory();
android.webkit.CookieManager cookieManager = CookieManager.getInstance();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.removeAllCookies(aBoolean -> {});
@@ -86,77 +89,82 @@ public class ReCaptchaActivity extends AppCompatActivity {
cookieManager.removeAllCookie();
}
myWebView.loadUrl(url);
webView.loadUrl(url);
}
private class ReCaptchaWebViewClient extends WebViewClient {
private final Activity context;
private String mCookies;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_recaptcha, menu);
ReCaptchaWebViewClient(Activity ctx) {
context = ctx;
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setTitle(R.string.title_activity_recaptcha);
actionBar.setSubtitle(R.string.subtitle_activity_recaptcha);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO: Start Loader
super.onPageStarted(view, url, favicon);
}
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
String cookies = CookieManager.getInstance().getCookie(url);
// TODO: Stop Loader
// find cookies : s_gl & goojf and Add cookies to Downloader
if (find_access_cookies(cookies)) {
// Give cookies to Downloader class
DownloaderImpl.getInstance().setCookies(mCookies);
// Closing activity and return to parent
setResult(RESULT_OK);
finish();
}
}
private boolean find_access_cookies(String cookies) {
boolean ret = false;
String c_s_gl = "";
String c_goojf = "";
String[] parts = cookies.split("; ");
for (String part : parts) {
if (part.trim().startsWith("s_gl")) {
c_s_gl = part.trim();
}
if (part.trim().startsWith("goojf")) {
c_goojf = part.trim();
}
}
if (c_s_gl.length() > 0 && c_goojf.length() > 0) {
ret = true;
//mCookies = c_s_gl + "; " + c_goojf;
// Youtube seems to also need the other cookies:
mCookies = cookies;
}
return ret;
}
@Override
public void onBackPressed() {
saveCookiesAndFinish();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case android.R.id.home: {
Intent intent = new Intent(this, org.schabi.newpipe.MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpTo(this, intent);
case R.id.menu_item_done:
saveCookiesAndFinish();
return true;
}
default:
return false;
}
}
private void saveCookiesAndFinish() {
handleCookies(webView.getUrl()); // try to get cookies of unclosed page
if (!foundCookies.isEmpty()) {
// give cookies to Downloader class
DownloaderImpl.getInstance().setCookies(foundCookies);
setResult(RESULT_OK);
}
Intent intent = new Intent(this, org.schabi.newpipe.MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpTo(this, intent);
}
private void handleCookies(String url) {
String cookies = CookieManager.getInstance().getCookie(url);
if (MainActivity.DEBUG) Log.d(TAG, "handleCookies: url=" + url + "; cookies=" + (cookies == null ? "null" : cookies));
if (cookies == null) return;
addYoutubeCookies(cookies);
// add other methods to extract cookies here
}
private void addYoutubeCookies(@NonNull String cookies) {
if (cookies.contains("s_gl=") || cookies.contains("goojf=") || cookies.contains("VISITOR_INFO1_LIVE=")) {
// youtube seems to also need the other cookies:
addCookie(cookies);
}
}
private void addCookie(String cookie) {
if (foundCookies.contains(cookie)) {
return;
}
if (foundCookies.isEmpty() || foundCookies.endsWith("; ")) {
foundCookies += cookie;
} else if (foundCookies.endsWith(";")) {
foundCookies += " " + cookie;
} else {
foundCookies += "; " + cookie;
}
}
}

View File

@@ -22,27 +22,30 @@ import android.widget.TextView;
import org.schabi.newpipe.BuildConfig;
import org.schabi.newpipe.R;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.ThemeHelper;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
public class AboutActivity extends AppCompatActivity {
/**
* List of all software components
*/
private static final SoftwareComponent[] SOFTWARE_COMPONENTS = new SoftwareComponent[]{
new SoftwareComponent("Giga Get", "2014", "Peter Cai", "https://github.com/PaperAirplane-Dev-Team/GigaGet", StandardLicenses.GPL2),
new SoftwareComponent("NewPipe Extractor", "2017", "Christian Schabesberger", "https://github.com/TeamNewPipe/NewPipeExtractor", StandardLicenses.GPL3),
new SoftwareComponent("Giga Get", "2014 - 2015", "Peter Cai", "https://github.com/PaperAirplane-Dev-Team/GigaGet", StandardLicenses.GPL2),
new SoftwareComponent("NewPipe Extractor", "2017 - 2020", "Christian Schabesberger", "https://github.com/TeamNewPipe/NewPipeExtractor", StandardLicenses.GPL3),
new SoftwareComponent("Jsoup", "2017", "Jonathan Hedley", "https://github.com/jhy/jsoup", StandardLicenses.MIT),
new SoftwareComponent("Rhino", "2015", "Mozilla", "https://www.mozilla.org/rhino/", StandardLicenses.MPL2),
new SoftwareComponent("ACRA", "2013", "Kevin Gaudin", "http://www.acra.ch", StandardLicenses.APACHE2),
new SoftwareComponent("Universal Image Loader", "2011 - 2015", "Sergey Tarasevich", "https://github.com/nostra13/Android-Universal-Image-Loader", StandardLicenses.APACHE2),
new SoftwareComponent("CircleImageView", "2014 - 2017", "Henning Dodenhof", "https://github.com/hdodenhof/CircleImageView", StandardLicenses.APACHE2),
new SoftwareComponent("CircleImageView", "2014 - 2020", "Henning Dodenhof", "https://github.com/hdodenhof/CircleImageView", StandardLicenses.APACHE2),
new SoftwareComponent("NoNonsense-FilePicker", "2016", "Jonas Kalderstam", "https://github.com/spacecowboy/NoNonsense-FilePicker", StandardLicenses.MPL2),
new SoftwareComponent("ExoPlayer", "2014-2017", "Google Inc", "https://github.com/google/ExoPlayer", StandardLicenses.APACHE2),
new SoftwareComponent("RxAndroid", "2015", "The RxAndroid authors", "https://github.com/ReactiveX/RxAndroid", StandardLicenses.APACHE2),
new SoftwareComponent("RxJava", "2016-present", "RxJava Contributors", "https://github.com/ReactiveX/RxJava", StandardLicenses.APACHE2),
new SoftwareComponent("RxBinding", "2015", "Jake Wharton", "https://github.com/JakeWharton/RxBinding", StandardLicenses.APACHE2)
new SoftwareComponent("ExoPlayer", "2014 - 2020", "Google Inc", "https://github.com/google/ExoPlayer", StandardLicenses.APACHE2),
new SoftwareComponent("RxAndroid", "2015 - 2018", "The RxAndroid authors", "https://github.com/ReactiveX/RxAndroid", StandardLicenses.APACHE2),
new SoftwareComponent("RxJava", "2016 - 2020", "RxJava Contributors", "https://github.com/ReactiveX/RxJava", StandardLicenses.APACHE2),
new SoftwareComponent("RxBinding", "2015 - 2018", "Jake Wharton", "https://github.com/JakeWharton/RxBinding", StandardLicenses.APACHE2),
new SoftwareComponent("PrettyTime", "2012 - 2020", "Lincoln Baxter, III", "https://github.com/ocpsoft/prettytime", StandardLicenses.APACHE2),
new SoftwareComponent("Markwon", "2017 - 2020", "Noties", "https://github.com/noties/Markwon", StandardLicenses.APACHE2)
};
/**
@@ -62,8 +65,10 @@ public class AboutActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
this.setTitle(getString(R.string.title_activity_about));
setContentView(R.layout.activity_about);
@@ -83,13 +88,6 @@ public class AboutActivity extends AppCompatActivity {
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_about, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
@@ -99,11 +97,6 @@ public class AboutActivity extends AppCompatActivity {
case android.R.id.home:
finish();
return true;
case R.id.action_settings:
NavigationHelper.openSettings(this);
return true;
case R.id.action_show_downloads:
return NavigationHelper.openDownloads(this);
}
return super.onOptionsItemSelected(item);

View File

@@ -3,6 +3,7 @@ package org.schabi.newpipe.about;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.os.AsyncTask;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
@@ -14,6 +15,8 @@ import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.ref.WeakReference;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
public class LicenseFragmentHelper extends AsyncTask<Object, Void, Integer> {
final WeakReference<Activity> weakReference;
@@ -55,15 +58,15 @@ public class LicenseFragmentHelper extends AsyncTask<Object, Void, Integer> {
wv.loadData(webViewData, "text/html; charset=UTF-8", null);
alert.setView(wv);
alert.setNegativeButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
assureCorrectAppLanguage(activity.getApplicationContext());
alert.setNegativeButton(getFinishString(activity), (dialog, which) -> dialog.dismiss());
alert.show();
}
private static String getFinishString(Activity activity) {
return activity.getApplicationContext().getResources().getString(R.string.finish);
}
/**
* @param context the context to use
* @param license the license

View File

@@ -12,12 +12,14 @@ import android.view.MenuItem;
import android.view.ViewTreeObserver;
import org.schabi.newpipe.R;
import org.schabi.newpipe.settings.SettingsActivity;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.ThemeHelper;
import us.shandian.giga.service.DownloadManagerService;
import us.shandian.giga.ui.fragment.MissionsFragment;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
public class DownloadActivity extends AppCompatActivity {
private static final String MISSIONS_FRAGMENT_TAG = "fragment_tag";
@@ -29,6 +31,7 @@ public class DownloadActivity extends AppCompatActivity {
i.setClass(this, DownloadManagerService.class);
startService(i);
assureCorrectAppLanguage(this);
ThemeHelper.setTheme(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_downloader);
@@ -74,15 +77,9 @@ public class DownloadActivity extends AppCompatActivity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home: {
case android.R.id.home:
onBackPressed();
return true;
}
case R.id.action_settings: {
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
return true;
}
default:
return super.onOptionsItemSelected(item);
}

View File

@@ -11,15 +11,6 @@ import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
import android.preference.PreferenceManager;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.fragment.app.DialogFragment;
import androidx.documentfile.provider.DocumentFile;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.view.menu.ActionMenuItemView;
import androidx.appcompat.widget.Toolbar;
import android.util.Log;
import android.util.SparseArray;
import android.view.LayoutInflater;
@@ -34,10 +25,21 @@ import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.view.menu.ActionMenuItemView;
import androidx.appcompat.widget.Toolbar;
import androidx.documentfile.provider.DocumentFile;
import androidx.fragment.app.DialogFragment;
import com.nononsenseapps.filepicker.Utils;
import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.RouterActivity;
import org.schabi.newpipe.extractor.MediaFormat;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.localization.Localization;
@@ -77,6 +79,8 @@ import us.shandian.giga.service.DownloadManagerService;
import us.shandian.giga.service.DownloadManagerService.DownloadManagerBinder;
import us.shandian.giga.service.MissionState;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheckedChangeListener, AdapterView.OnItemSelectedListener {
private static final String TAG = "DialogFragment";
private static final boolean DEBUG = MainActivity.DEBUG;
@@ -368,6 +372,9 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck
toolbar.setOnMenuItemClickListener(item -> {
if (item.getItemId() == R.id.okay) {
prepareSelectedDownload();
if (getActivity() instanceof RouterActivity) {
getActivity().finish();
}
return true;
}
return false;
@@ -523,10 +530,11 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck
}
private void showFailedDialog(@StringRes int msg) {
assureCorrectAppLanguage(getContext());
new AlertDialog.Builder(context)
.setTitle(R.string.general_error)
.setMessage(msg)
.setNegativeButton(android.R.string.ok, null)
.setNegativeButton(getString(R.string.finish), null)
.create()
.show();
}
@@ -555,8 +563,16 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck
case R.id.audio_button:
mainStorage = mainStorageAudio;
format = audioStreamsAdapter.getItem(selectedAudioIndex).getFormat();
mime = format.mimeType;
filename += format.suffix;
switch(format) {
case WEBMA_OPUS:
mime = "audio/ogg";
filename += "opus";
break;
default:
mime = format.mimeType;
filename += format.suffix;
break;
}
break;
case R.id.video_button:
mainStorage = mainStorageVideo;
@@ -820,7 +836,6 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck
psArgs = new String[]{
selectedStream.getFormat().getSuffix(),
"false",// ignore empty frames
"false",// detect youtube duplicate lines
};
}
break;

View File

@@ -30,6 +30,7 @@ import org.schabi.newpipe.settings.tabs.Tab;
import org.schabi.newpipe.settings.tabs.TabsManager;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.ServiceHelper;
import org.schabi.newpipe.views.ScrollableTabLayout;
import java.util.ArrayList;
import java.util.List;
@@ -37,7 +38,7 @@ import java.util.List;
public class MainFragment extends BaseFragment implements TabLayout.OnTabSelectedListener {
private ViewPager viewPager;
private SelectedTabsPagerAdapter pagerAdapter;
private TabLayout tabLayout;
private ScrollableTabLayout tabLayout;
private List<Tab> tabsList = new ArrayList<>();
private TabsManager tabsManager;

View File

@@ -2,7 +2,6 @@ package org.schabi.newpipe.fragments.detail;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
@@ -18,7 +17,6 @@ import androidx.fragment.app.Fragment;
import androidx.core.content.ContextCompat;
import androidx.viewpager.widget.ViewPager;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.text.Html;
import android.text.Spanned;
@@ -58,6 +56,7 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor;
import org.schabi.newpipe.extractor.stream.AudioStream;
import org.schabi.newpipe.extractor.stream.Description;
import org.schabi.newpipe.extractor.stream.Stream;
import org.schabi.newpipe.extractor.stream.StreamInfo;
import org.schabi.newpipe.extractor.stream.StreamType;
@@ -79,6 +78,7 @@ import org.schabi.newpipe.util.Constants;
import org.schabi.newpipe.util.ExtractorHelper;
import org.schabi.newpipe.util.ImageDisplayConstants;
import org.schabi.newpipe.util.InfoCache;
import org.schabi.newpipe.util.KoreUtil;
import org.schabi.newpipe.util.ListHelper;
import org.schabi.newpipe.util.Localization;
import org.schabi.newpipe.util.NavigationHelper;
@@ -95,6 +95,8 @@ import java.util.List;
import java.util.concurrent.TimeUnit;
import icepick.State;
import io.noties.markwon.Markwon;
import io.noties.markwon.linkify.LinkifyPlugin;
import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
@@ -482,7 +484,6 @@ public class VideoDetailFragment
videoUploadDateView = rootView.findViewById(R.id.detail_upload_date_view);
videoDescriptionView = rootView.findViewById(R.id.detail_description_view);
videoDescriptionView.setMovementMethod(LinkMovementMethod.getInstance());
videoDescriptionView.setAutoLinkMask(Linkify.WEB_URLS);
thumbsUpTextView = rootView.findViewById(R.id.detail_thumbs_up_count_view);
thumbsUpImageView = rootView.findViewById(R.id.detail_thumbs_up_img_view);
@@ -599,22 +600,27 @@ public class VideoDetailFragment
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (isLoading.get()) {
// if is still loading block menu
int id = item.getItemId();
if (id == R.id.action_settings) {
NavigationHelper.openSettings(requireContext());
return true;
}
if (isLoading.get()) {
// if still loading, block menu buttons related to video info
return true;
}
int id = item.getItemId();
switch (id) {
case R.id.menu_item_share: {
if (currentInfo != null) {
ShareUtils.shareUrl(this.getContext(), currentInfo.getName(), currentInfo.getOriginalUrl());
ShareUtils.shareUrl(requireContext(), currentInfo.getName(), currentInfo.getOriginalUrl());
}
return true;
}
case R.id.menu_item_openInBrowser: {
if (currentInfo != null) {
ShareUtils.openUrlInBrowser(this.getContext(), currentInfo.getOriginalUrl());
ShareUtils.openUrlInBrowser(requireContext(), currentInfo.getOriginalUrl());
}
return true;
}
@@ -624,7 +630,7 @@ public class VideoDetailFragment
url.replace("https", "http")));
} catch (Exception e) {
if (DEBUG) Log.i(TAG, "Failed to start kore", e);
showInstallKoreDialog(activity);
KoreUtil.showInstallKoreDialog(activity);
}
return true;
default:
@@ -632,16 +638,6 @@ public class VideoDetailFragment
}
}
private static void showInstallKoreDialog(final Context context) {
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(R.string.kore_not_found)
.setPositiveButton(R.string.install, (DialogInterface dialog, int which) ->
NavigationHelper.installKore(context))
.setNegativeButton(R.string.cancel, (DialogInterface dialog, int which) -> {
});
builder.create().show();
}
private void setupActionBarOnError(final String url) {
if (DEBUG) Log.d(TAG, "setupActionBarHandlerOnError() called with: url = [" + url + "]");
Log.e("-----", "missing code");
@@ -928,28 +924,41 @@ public class VideoDetailFragment
return sortedVideoStreams != null ? sortedVideoStreams.get(selectedVideoStreamIndex) : null;
}
private void prepareDescription(final String descriptionHtml) {
if (TextUtils.isEmpty(descriptionHtml)) {
private void prepareDescription(Description description) {
if (TextUtils.isEmpty(description.getContent()) || description == Description.emptyDescription) {
return;
}
disposables.add(Single.just(descriptionHtml)
.map((@io.reactivex.annotations.NonNull String description) -> {
Spanned parsedDescription;
if (Build.VERSION.SDK_INT >= 24) {
parsedDescription = Html.fromHtml(description, 0);
} else {
//noinspection deprecation
parsedDescription = Html.fromHtml(description);
}
return parsedDescription;
})
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((@io.reactivex.annotations.NonNull Spanned spanned) -> {
videoDescriptionView.setText(spanned);
videoDescriptionView.setVisibility(View.VISIBLE);
}));
if (description.getType() == Description.HTML) {
disposables.add(Single.just(description.getContent())
.map((@io.reactivex.annotations.NonNull String descriptionText) -> {
Spanned parsedDescription;
if (Build.VERSION.SDK_INT >= 24) {
parsedDescription = Html.fromHtml(descriptionText, 0);
} else {
//noinspection deprecation
parsedDescription = Html.fromHtml(descriptionText);
}
return parsedDescription;
})
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((@io.reactivex.annotations.NonNull Spanned spanned) -> {
videoDescriptionView.setText(spanned);
videoDescriptionView.setVisibility(View.VISIBLE);
}));
} else if (description.getType() == Description.MARKDOWN) {
final Markwon markwon = Markwon.builder(getContext())
.usePlugin(LinkifyPlugin.create())
.build();
markwon.setMarkdown(videoDescriptionView, description.getContent());
videoDescriptionView.setVisibility(View.VISIBLE);
} else {
//== Description.PLAIN_TEXT
videoDescriptionView.setAutoLinkMask(Linkify.WEB_URLS);
videoDescriptionView.setText(description.getContent(), TextView.BufferType.SPANNABLE);
videoDescriptionView.setVisibility(View.VISIBLE);
}
}
private void setHeightThumbnail() {
@@ -1070,7 +1079,7 @@ public class VideoDetailFragment
if (info.getStreamType().equals(StreamType.AUDIO_LIVE_STREAM)) {
videoCountView.setText(Localization.listeningCount(activity, info.getViewCount()));
} else if (info.getStreamType().equals(StreamType.LIVE_STREAM)) {
videoCountView.setText(Localization.watchingCount(activity, info.getViewCount()));
videoCountView.setText(Localization.localizeWatchingCount(activity, info.getViewCount()));
} else {
videoCountView.setText(Localization.localizeViewCount(activity, info.getViewCount()));
}

View File

@@ -175,17 +175,20 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
NavigationHelper.openSettings(requireContext());
break;
case R.id.menu_item_rss:
openRssFeed();
break;
case R.id.menu_item_openInBrowser:
if (currentInfo != null) {
ShareUtils.openUrlInBrowser(this.getContext(), currentInfo.getOriginalUrl());
ShareUtils.openUrlInBrowser(requireContext(), currentInfo.getOriginalUrl());
}
break;
case R.id.menu_item_share:
if (currentInfo != null) {
ShareUtils.shareUrl(this.getContext(), name, currentInfo.getOriginalUrl());
ShareUtils.shareUrl(requireContext(), name, currentInfo.getOriginalUrl());
}
break;
default:
@@ -370,7 +373,7 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> {
headerSubscribersTextView.setVisibility(View.VISIBLE);
if (result.getSubscriberCount() >= 0) {
headerSubscribersTextView.setText(Localization.localizeSubscribersCount(activity, result.getSubscriberCount()));
headerSubscribersTextView.setText(Localization.shortSubscriberCount(activity, result.getSubscriberCount()));
} else {
headerSubscribersTextView.setText(R.string.subscribers_count_not_available);
}

View File

@@ -222,11 +222,14 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
NavigationHelper.openSettings(requireContext());
break;
case R.id.menu_item_openInBrowser:
ShareUtils.openUrlInBrowser(this.getContext(), url);
ShareUtils.openUrlInBrowser(requireContext(), url);
break;
case R.id.menu_item_share:
ShareUtils.shareUrl(this.getContext(), name, url);
ShareUtils.shareUrl(requireContext(), name, url);
break;
case R.id.menu_item_bookmark:
onBookmarkClicked();

View File

@@ -190,7 +190,7 @@ public class SearchFragment
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
isSuggestionsEnabled = preferences.getBoolean(getString(R.string.show_search_suggestions_key), true);
contentCountry = preferences.getString(getString(R.string.content_country_key), getString(R.string.default_country_value));
contentCountry = preferences.getString(getString(R.string.content_country_key), getString(R.string.default_localization_key));
}
@Override
@@ -723,7 +723,7 @@ public class SearchFragment
showError(getString(R.string.url_not_supported_toast), false)));
return;
}
} catch (Exception e) {
} catch (Exception ignored) {
// Exception occurred, it's not a url
}

View File

@@ -1,9 +1,15 @@
package org.schabi.newpipe.info_list.holder;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.text.util.Linkify;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import org.jsoup.helper.StringUtil;
import org.schabi.newpipe.R;
@@ -120,6 +126,21 @@ public class CommentsMiniInfoItemHolder extends InfoItemHolder {
itemBuilder.getOnCommentsSelectedListener().selected(item);
}
});
itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
ClipboardManager clipboardManager = (ClipboardManager) itemBuilder.getContext()
.getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setPrimaryClip(ClipData.newPlainText(null,commentText));
Toast.makeText(itemBuilder.getContext(), R.string.msg_copied, Toast.LENGTH_SHORT).show();
return true;
}
});
}
private void ellipsize() {

View File

@@ -60,7 +60,7 @@ public class StreamInfoItemHolder extends StreamMiniInfoItemHolder {
if (infoItem.getStreamType().equals(StreamType.AUDIO_LIVE_STREAM)) {
viewsAndDate = Localization.listeningCount(itemBuilder.getContext(), infoItem.getViewCount());
} else if (infoItem.getStreamType().equals(StreamType.LIVE_STREAM)) {
viewsAndDate = Localization.watchingCount(itemBuilder.getContext(), infoItem.getViewCount());
viewsAndDate = Localization.shortWatchingCount(itemBuilder.getContext(), infoItem.getViewCount());
} else {
viewsAndDate = Localization.shortViewCount(itemBuilder.getContext(), infoItem.getViewCount());
}

View File

@@ -1,8 +1,11 @@
package org.schabi.newpipe.local.bookmark;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Log;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentManager;
@@ -10,6 +13,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import io.reactivex.disposables.Disposable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.schabi.newpipe.NewPipeDatabase;
@@ -118,8 +122,7 @@ public final class BookmarkFragment
@Override
public void held(LocalItem selectedItem) {
if (selectedItem instanceof PlaylistMetadataEntry) {
showLocalDeleteDialog((PlaylistMetadataEntry) selectedItem);
showLocalDialog((PlaylistMetadataEntry) selectedItem);
} else if (selectedItem instanceof PlaylistRemoteEntity) {
showRemoteDeleteDialog((PlaylistRemoteEntity) selectedItem);
}
@@ -247,14 +250,30 @@ public final class BookmarkFragment
// Utils
///////////////////////////////////////////////////////////////////////////
private void showLocalDeleteDialog(final PlaylistMetadataEntry item) {
showDeleteDialog(item.name, localPlaylistManager.deletePlaylist(item.uid));
}
private void showRemoteDeleteDialog(final PlaylistRemoteEntity item) {
showDeleteDialog(item.getName(), remotePlaylistManager.deletePlaylist(item.getUid()));
}
private void showLocalDialog(PlaylistMetadataEntry selectedItem) {
View dialogView = View.inflate(getContext(), R.layout.dialog_bookmark, null);
EditText editText = dialogView.findViewById(R.id.playlist_name_edit_text);
editText.setText(selectedItem.name);
Builder builder = new AlertDialog.Builder(activity);
builder.setView(dialogView)
.setPositiveButton(R.string.rename_playlist, (dialog, which) -> {
changeLocalPlaylistName(selectedItem.uid, editText.getText().toString());
})
.setNegativeButton(R.string.cancel, null)
.setNeutralButton(R.string.delete, (dialog, which) -> {
showDeleteDialog(selectedItem.name,
localPlaylistManager.deletePlaylist(selectedItem.uid));
dialog.dismiss();
})
.create()
.show();
}
private void showDeleteDialog(final String name, final Single<Integer> deleteReactor) {
if (activity == null || disposables == null) return;
@@ -271,6 +290,23 @@ public final class BookmarkFragment
.show();
}
private void changeLocalPlaylistName(long id, String name) {
if (localPlaylistManager == null) {
return;
}
if (DEBUG) {
Log.d(TAG, "Updating playlist id=[" + id +
"] with new name=[" + name + "] items");
}
localPlaylistManager.renamePlaylist(id, name);
final Disposable disposable = localPlaylistManager.renamePlaylist(id, name)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(longs -> {/*Do nothing on success*/}, this::onError);
disposables.add(disposable);
}
private static List<PlaylistLocalItem> merge(final List<PlaylistMetadataEntry> localPlaylists,
final List<PlaylistRemoteEntity> remotePlaylists) {
List<PlaylistLocalItem> items = new ArrayList<>(

View File

@@ -1,15 +1,16 @@
package org.schabi.newpipe.local.dialog;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import org.schabi.newpipe.NewPipeDatabase;
import org.schabi.newpipe.R;
import org.schabi.newpipe.database.LocalItem;
@@ -152,6 +153,12 @@ public final class PlaylistAppendDialog extends PlaylistDialog {
final Toast successToast = Toast.makeText(getContext(),
R.string.playlist_add_stream_success, Toast.LENGTH_SHORT);
if (playlist.thumbnailUrl.equals("drawable://" + R.drawable.dummy_thumbnail_playlist)) {
playlistDisposables.add(manager.changePlaylistThumbnail(playlist.uid, streams.get(0).getThumbnailUrl())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(ignored -> successToast.show()));
}
playlistDisposables.add(manager.appendToPlaylist(playlist.uid, streams)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(ignored -> successToast.show()));

View File

@@ -4,11 +4,6 @@ import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Parcelable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.ItemTouchHelper;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
@@ -18,6 +13,12 @@ import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.schabi.newpipe.NewPipeDatabase;
@@ -325,6 +326,16 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
headerBackgroundButton.setOnClickListener(view ->
NavigationHelper.playOnBackgroundPlayer(activity, getPlayQueue(), false));
headerPopupButton.setOnLongClickListener(view -> {
NavigationHelper.enqueueOnPopupPlayer(activity, getPlayQueue(), true);
return true;
});
headerBackgroundButton.setOnLongClickListener(view -> {
NavigationHelper.enqueueOnBackgroundPlayer(activity, getPlayQueue(), true);
return true;
});
hideLoading();
}
@@ -377,8 +388,10 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
this.name = name;
setTitle(name);
Log.d(TAG, "Updating playlist id=[" + playlistId +
if (DEBUG) {
Log.d(TAG, "Updating playlist id=[" + playlistId +
"] with new name=[" + name + "] items");
}
final Disposable disposable = playlistManager.renamePlaylist(playlistId, name)
.observeOn(AndroidSchedulers.mainThread())
@@ -393,8 +406,10 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
R.string.playlist_thumbnail_change_success,
Toast.LENGTH_SHORT);
Log.d(TAG, "Updating playlist id=[" + playlistId +
if (DEBUG) {
Log.d(TAG, "Updating playlist id=[" + playlistId +
"] with new thumbnail url=[" + thumbnailUrl + "]");
}
final Disposable disposable = playlistManager
.changePlaylistThumbnail(playlistId, thumbnailUrl)
@@ -403,10 +418,25 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
disposables.add(disposable);
}
private void updateThumbnailUrl() {
String newThumbnailUrl;
if (!itemListAdapter.getItemsList().isEmpty()) {
newThumbnailUrl = ((PlaylistStreamEntry) itemListAdapter.getItemsList().get(0)).thumbnailUrl;
} else {
newThumbnailUrl = "drawable://" + R.drawable.dummy_thumbnail_playlist;
}
changeThumbnailUrl(newThumbnailUrl);
}
private void deleteItem(final PlaylistStreamEntry item) {
if (itemListAdapter == null) return;
itemListAdapter.removeItem(item);
if (playlistManager.getPlaylistThumbnail(playlistId).equals(item.thumbnailUrl))
updateThumbnailUrl();
setVideoCount(itemListAdapter.getItemsList().size());
saveChanges();
}
@@ -446,8 +476,10 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
}
}
Log.d(TAG, "Updating playlist id=[" + playlistId +
if (DEBUG) {
Log.d(TAG, "Updating playlist id=[" + playlistId +
"] with [" + streamIds.size() + "] items");
}
final Disposable disposable = playlistManager.updateJoin(playlistId, streamIds)
.observeOn(AndroidSchedulers.mainThread())

View File

@@ -103,6 +103,10 @@ public class LocalPlaylistManager {
return modifyPlaylist(playlistId, null, thumbnailUrl);
}
public String getPlaylistThumbnail(final long playlistId) {
return playlistTable.getPlaylist(playlistId).blockingFirst().get(0).getThumbnailUrl();
}
private Maybe<Integer> modifyPlaylist(final long playlistId,
@Nullable final String name,
@Nullable final String thumbnailUrl) {

View File

@@ -15,6 +15,8 @@ import org.schabi.newpipe.util.ThemeHelper;
import icepick.Icepick;
import icepick.State;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
public class ImportConfirmationDialog extends DialogFragment {
@State
protected Intent resultServiceIntent;
@@ -34,11 +36,12 @@ public class ImportConfirmationDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
assureCorrectAppLanguage(getContext());
return new AlertDialog.Builder(getContext(), ThemeHelper.getDialogTheme(getContext()))
.setMessage(R.string.import_network_expensive_warning)
.setCancelable(true)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
.setPositiveButton(R.string.finish, (dialogInterface, i) -> {
if (resultServiceIntent != null && getContext() != null) {
getContext().startService(resultServiceIntent);
}

View File

@@ -25,12 +25,17 @@ import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.IBinder;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.widget.RemoteViews;
@@ -48,11 +53,12 @@ import org.schabi.newpipe.player.helper.LockManager;
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
import org.schabi.newpipe.player.resolver.AudioPlaybackResolver;
import org.schabi.newpipe.player.resolver.MediaSourceTag;
import org.schabi.newpipe.util.BitmapUtils;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.ThemeHelper;
import static org.schabi.newpipe.player.helper.PlayerHelper.getTimeString;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
/**
* Base players joining the common properties
@@ -75,6 +81,7 @@ public final class BackgroundPlayer extends Service {
private BasePlayerImpl basePlayerImpl;
private LockManager lockManager;
private SharedPreferences sharedPreferences;
/*//////////////////////////////////////////////////////////////////////////
// Service-Activity Binder
@@ -95,6 +102,9 @@ public final class BackgroundPlayer extends Service {
private boolean shouldUpdateOnProgress;
private static final int NOTIFICATION_UPDATES_BEFORE_RESET = 60;
private int timesNotificationUpdated;
/*//////////////////////////////////////////////////////////////////////////
// Service's LifeCycle
//////////////////////////////////////////////////////////////////////////*/
@@ -104,7 +114,8 @@ public final class BackgroundPlayer extends Service {
if (DEBUG) Log.d(TAG, "onCreate() called");
notificationManager = ((NotificationManager) getSystemService(NOTIFICATION_SERVICE));
lockManager = new LockManager(this);
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
assureCorrectAppLanguage(this);
ThemeHelper.setTheme(this);
basePlayerImpl = new BasePlayerImpl(this);
basePlayerImpl.setup();
@@ -180,6 +191,7 @@ public final class BackgroundPlayer extends Service {
private void resetNotification() {
notBuilder = createNotification();
timesNotificationUpdated = 0;
}
private NotificationCompat.Builder createNotification() {
@@ -195,12 +207,45 @@ public final class BackgroundPlayer extends Service {
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setCustomContentView(notRemoteView)
.setCustomBigContentView(bigNotRemoteView);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setLockScreenThumbnail(builder);
}
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
builder.setPriority(NotificationCompat.PRIORITY_MAX);
}
return builder;
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void setLockScreenThumbnail(NotificationCompat.Builder builder) {
boolean isLockScreenThumbnailEnabled = sharedPreferences.getBoolean(
getString(R.string.enable_lock_screen_video_thumbnail_key),
true
);
if (isLockScreenThumbnailEnabled) {
basePlayerImpl.mediaSessionManager.setLockScreenArt(
builder,
getCenteredThumbnailBitmap()
);
} else {
basePlayerImpl.mediaSessionManager.clearLockScreenArt(builder);
}
}
@Nullable
private Bitmap getCenteredThumbnailBitmap() {
int screenWidth = Resources.getSystem().getDisplayMetrics().widthPixels;
int screenHeight = Resources.getSystem().getDisplayMetrics().heightPixels;
return BitmapUtils.centerCrop(
basePlayerImpl.getThumbnail(),
screenWidth,
screenHeight);
}
private void setupNotification(RemoteViews remoteViews) {
if (basePlayerImpl == null) return;
@@ -248,10 +293,13 @@ public final class BackgroundPlayer extends Service {
//if (DEBUG) Log.d(TAG, "updateNotification() called with: drawableId = [" + drawableId + "]");
if (notBuilder == null) return;
if (drawableId != -1) {
if (notRemoteView != null) notRemoteView.setImageViewResource(R.id.notificationPlayPause, drawableId);
if (bigNotRemoteView != null) bigNotRemoteView.setImageViewResource(R.id.notificationPlayPause, drawableId);
if (notRemoteView != null)
notRemoteView.setImageViewResource(R.id.notificationPlayPause, drawableId);
if (bigNotRemoteView != null)
bigNotRemoteView.setImageViewResource(R.id.notificationPlayPause, drawableId);
}
notificationManager.notify(NOTIFICATION_ID, notBuilder.build());
timesNotificationUpdated++;
}
/*//////////////////////////////////////////////////////////////////////////
@@ -275,7 +323,8 @@ public final class BackgroundPlayer extends Service {
protected class BasePlayerImpl extends BasePlayer {
@NonNull final private AudioPlaybackResolver resolver;
@NonNull
final private AudioPlaybackResolver resolver;
private int cachedDuration;
private String cachedDurationString;
@@ -294,8 +343,10 @@ public final class BackgroundPlayer extends Service {
super.handleIntent(intent);
resetNotification();
if (bigNotRemoteView != null) bigNotRemoteView.setProgressBar(R.id.notificationProgressBar, 100, 0, false);
if (notRemoteView != null) notRemoteView.setProgressBar(R.id.notificationProgressBar, 100, 0, false);
if (bigNotRemoteView != null)
bigNotRemoteView.setProgressBar(R.id.notificationProgressBar, 100, 0, false);
if (notRemoteView != null)
notRemoteView.setProgressBar(R.id.notificationProgressBar, 100, 0, false);
startForeground(NOTIFICATION_ID, notBuilder.build());
}
@@ -330,6 +381,7 @@ public final class BackgroundPlayer extends Service {
updateNotificationThumbnail();
updateNotification(-1);
}
/*//////////////////////////////////////////////////////////////////////////
// States Implementation
//////////////////////////////////////////////////////////////////////////*/
@@ -351,10 +403,15 @@ public final class BackgroundPlayer extends Service {
updateProgress(currentProgress, duration, bufferPercent);
if (!shouldUpdateOnProgress) return;
resetNotification();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O /*Oreo*/) updateNotificationThumbnail();
if (timesNotificationUpdated > NOTIFICATION_UPDATES_BEFORE_RESET) {
resetNotification();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O /*Oreo*/) {
updateNotificationThumbnail();
}
}
if (bigNotRemoteView != null) {
if(cachedDuration != duration) {
if (cachedDuration != duration) {
cachedDuration = duration;
cachedDurationString = getTimeString(duration);
}
@@ -382,8 +439,10 @@ public final class BackgroundPlayer extends Service {
@Override
public void destroy() {
super.destroy();
if (notRemoteView != null) notRemoteView.setImageViewBitmap(R.id.notificationCover, null);
if (bigNotRemoteView != null) bigNotRemoteView.setImageViewBitmap(R.id.notificationCover, null);
if (notRemoteView != null)
notRemoteView.setImageViewBitmap(R.id.notificationCover, null);
if (bigNotRemoteView != null)
bigNotRemoteView.setImageViewBitmap(R.id.notificationCover, null);
}
/*//////////////////////////////////////////////////////////////////////////

View File

@@ -57,7 +57,10 @@ public final class BackgroundPlayerActivity extends ServicePlayerActivity {
this.player.setRecovery();
getApplicationContext().sendBroadcast(getPlayerShutdownIntent());
getApplicationContext().startService(getSwitchIntent(PopupVideoPlayer.class));
getApplicationContext().startService(
getSwitchIntent(PopupVideoPlayer.class)
.putExtra(BasePlayer.START_PAUSED, !this.player.isPlaying())
);
return true;
}
return false;

View File

@@ -150,6 +150,8 @@ public abstract class BasePlayer implements
@NonNull
public static final String RESUME_PLAYBACK = "resume_playback";
@NonNull
public static final String START_PAUSED = "start_paused";
@NonNull
public static final String SELECT_ON_APPEND = "select_on_append";
/*//////////////////////////////////////////////////////////////////////////
@@ -304,7 +306,7 @@ public abstract class BasePlayer implements
}
// Good to go...
initPlayback(queue, repeatMode, playbackSpeed, playbackPitch, playbackSkipSilence,
/*playOnInit=*/true);
/*playOnInit=*/!intent.getBooleanExtra(START_PAUSED, false));
}
protected void initPlayback(@NonNull final PlayQueue queue,
@@ -944,10 +946,10 @@ public abstract class BasePlayer implements
public void onPlayPause() {
if (DEBUG) Log.d(TAG, "onPlayPause() called");
if (!isPlaying()) {
onPlay();
} else {
if (isPlaying()) {
onPause();
} else {
onPlay();
}
}

View File

@@ -28,6 +28,7 @@ import android.database.ContentObserver;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@@ -75,6 +76,7 @@ import org.schabi.newpipe.player.playqueue.PlayQueueItemTouchCallback;
import org.schabi.newpipe.player.resolver.MediaSourceTag;
import org.schabi.newpipe.player.resolver.VideoPlaybackResolver;
import org.schabi.newpipe.util.AnimationUtils;
import org.schabi.newpipe.util.KoreUtil;
import org.schabi.newpipe.util.ListHelper;
import org.schabi.newpipe.util.NavigationHelper;
import org.schabi.newpipe.util.PermissionHelper;
@@ -93,6 +95,7 @@ import static org.schabi.newpipe.util.AnimationUtils.Type.SCALE_AND_ALPHA;
import static org.schabi.newpipe.util.AnimationUtils.Type.SLIDE_AND_ALPHA;
import static org.schabi.newpipe.util.AnimationUtils.animateRotation;
import static org.schabi.newpipe.util.AnimationUtils.animateView;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
import static org.schabi.newpipe.util.StateSaver.KEY_SAVED_STATE;
/**
@@ -123,6 +126,7 @@ public final class MainVideoPlayer extends AppCompatActivity
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
if (DEBUG) Log.d(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]");
defaultPreferences = PreferenceManager.getDefaultSharedPreferences(this);
@@ -190,6 +194,7 @@ public final class MainVideoPlayer extends AppCompatActivity
@Override
protected void onResume() {
if (DEBUG) Log.d(TAG, "onResume() called");
assureCorrectAppLanguage(this);
super.onResume();
if (globalScreenOrientationLocked()) {
@@ -220,6 +225,7 @@ public final class MainVideoPlayer extends AppCompatActivity
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
assureCorrectAppLanguage(this);
if (playerImpl.isSomePopupMenuVisible()) {
playerImpl.getQualityPopupMenu().dismiss();
@@ -364,8 +370,8 @@ public final class MainVideoPlayer extends AppCompatActivity
}
private boolean globalScreenOrientationLocked() {
// 1: Screen orientation changes using acelerometer
// 0: Screen orientatino is locked
// 1: Screen orientation changes using accelerometer
// 0: Screen orientation is locked
return !(android.provider.Settings.System.getInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0) == 1);
}
@@ -435,6 +441,7 @@ public final class MainVideoPlayer extends AppCompatActivity
private boolean queueVisible;
private ImageButton moreOptionsButton;
private ImageButton kodiButton;
private ImageButton shareButton;
private ImageButton toggleOrientationButton;
private ImageButton switchPopupButton;
@@ -471,6 +478,7 @@ public final class MainVideoPlayer extends AppCompatActivity
this.moreOptionsButton = rootView.findViewById(R.id.moreOptionsButton);
this.secondaryControls = rootView.findViewById(R.id.secondaryControls);
this.kodiButton = rootView.findViewById(R.id.kodi);
this.shareButton = rootView.findViewById(R.id.share);
this.toggleOrientationButton = rootView.findViewById(R.id.toggleOrientation);
this.switchBackgroundButton = rootView.findViewById(R.id.switchBackground);
@@ -482,6 +490,9 @@ public final class MainVideoPlayer extends AppCompatActivity
titleTextView.setSelected(true);
channelTextView.setSelected(true);
boolean showKodiButton = PreferenceManager.getDefaultSharedPreferences(this.context).getBoolean(
this.context.getString(R.string.show_play_with_kodi_key), false);
kodiButton.setVisibility(showKodiButton ? View.VISIBLE : View.GONE);
getRootView().setKeepScreenOn(true);
}
@@ -518,6 +529,7 @@ public final class MainVideoPlayer extends AppCompatActivity
closeButton.setOnClickListener(this);
moreOptionsButton.setOnClickListener(this);
kodiButton.setOnClickListener(this);
shareButton.setOnClickListener(this);
toggleOrientationButton.setOnClickListener(this);
switchBackgroundButton.setOnClickListener(this);
@@ -588,6 +600,17 @@ public final class MainVideoPlayer extends AppCompatActivity
finish();
}
public void onKodiShare() {
onPause();
try {
NavigationHelper.playWithKore(this.context, Uri.parse(
playerImpl.getVideoUrl().replace("https", "http")));
} catch (Exception e) {
if (DEBUG) Log.i(TAG, "Failed to start kore", e);
KoreUtil.showInstallKoreDialog(this.context);
}
}
/*//////////////////////////////////////////////////////////////////////////
// Player Overrides
//////////////////////////////////////////////////////////////////////////*/
@@ -614,7 +637,8 @@ public final class MainVideoPlayer extends AppCompatActivity
this.getPlaybackPitch(),
this.getPlaybackSkipSilence(),
this.getPlaybackQuality(),
false
false,
!isPlaying()
);
context.startService(intent);
@@ -637,7 +661,8 @@ public final class MainVideoPlayer extends AppCompatActivity
this.getPlaybackPitch(),
this.getPlaybackSkipSilence(),
this.getPlaybackQuality(),
false
false,
!isPlaying()
);
context.startService(intent);
@@ -686,6 +711,8 @@ public final class MainVideoPlayer extends AppCompatActivity
} else if (v.getId() == closeButton.getId()) {
onPlaybackShutdown();
return;
} else if (v.getId() == kodiButton.getId()) {
onKodiShare();
}
if (getCurrentState() != STATE_COMPLETED) {
@@ -882,6 +909,18 @@ public final class MainVideoPlayer extends AppCompatActivity
final float currentVolumeNormalized = (float) getAudioReactor().getVolume() / getAudioReactor().getMaxVolume();
volumeProgressBar.setProgress((int) (volumeProgressBar.getMax() * currentVolumeNormalized));
}
float screenBrightness = getWindow().getAttributes().screenBrightness;
if (screenBrightness < 0)
screenBrightness = Settings.System.getInt(getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS, 0) / 255.0f;
brightnessProgressBar.setProgress((int) (brightnessProgressBar.getMax() * screenBrightness));
if (DEBUG) Log.d(TAG, "setInitialGestureValues: volumeProgressBar.getProgress() ["
+ volumeProgressBar.getProgress() + "] "
+ "brightnessProgressBar.getProgress() ["
+ brightnessProgressBar.getProgress() + "]");
}
@Override

View File

@@ -80,6 +80,7 @@ import static org.schabi.newpipe.player.BasePlayer.STATE_PLAYING;
import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_DURATION;
import static org.schabi.newpipe.player.VideoPlayer.DEFAULT_CONTROLS_HIDE_TIME;
import static org.schabi.newpipe.util.AnimationUtils.animateView;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
/**
* Service Popup Player implementing VideoPlayer
@@ -142,6 +143,7 @@ public final class PopupVideoPlayer extends Service {
@Override
public void onCreate() {
assureCorrectAppLanguage(this);
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
notificationManager = ((NotificationManager) getSystemService(NOTIFICATION_SERVICE));
@@ -169,6 +171,7 @@ public final class PopupVideoPlayer extends Service {
@Override
public void onConfigurationChanged(Configuration newConfig) {
assureCorrectAppLanguage(this);
if (DEBUG) Log.d(TAG, "onConfigurationChanged() called with: newConfig = [" + newConfig + "]");
updateScreenSize();
updatePopupSize(popupLayoutParams.width, -1);
@@ -567,7 +570,8 @@ public final class PopupVideoPlayer extends Service {
this.getPlaybackPitch(),
this.getPlaybackSkipSilence(),
this.getPlaybackQuality(),
false
false,
!isPlaying()
);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
@@ -1123,4 +1127,4 @@ public final class PopupVideoPlayer extends Service {
return distanceFromCloseButton(popupMotionEvent) <= getClosingRadius();
}
}
}
}

View File

@@ -50,7 +50,10 @@ public final class PopupVideoPlayerActivity extends ServicePlayerActivity {
if (item.getItemId() == R.id.action_switch_background) {
this.player.setRecovery();
getApplicationContext().sendBroadcast(getPlayerShutdownIntent());
getApplicationContext().startService(getSwitchIntent(BackgroundPlayer.class));
getApplicationContext().startService(
getSwitchIntent(BackgroundPlayer.class)
.putExtra(BasePlayer.START_PAUSED, !this.player.isPlaying())
);
return true;
}
return false;

View File

@@ -46,6 +46,7 @@ import java.util.List;
import static org.schabi.newpipe.player.helper.PlayerHelper.formatPitch;
import static org.schabi.newpipe.player.helper.PlayerHelper.formatSpeed;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
public abstract class ServicePlayerActivity extends AppCompatActivity
implements PlayerEventListener, SeekBar.OnSeekBarChangeListener,
@@ -116,6 +117,7 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
setContentView(R.layout.activity_player_queue_control);
@@ -154,12 +156,11 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
case android.R.id.home:
finish();
return true;
case R.id.action_append_playlist:
appendAllToPlaylist();
return true;
case R.id.action_settings:
NavigationHelper.openSettings(this);
redraw = true;
return true;
case R.id.action_append_playlist:
appendAllToPlaylist();
return true;
case R.id.action_system_audio:
startActivity(new Intent(Settings.ACTION_SOUND_SETTINGS));
@@ -167,7 +168,10 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
case R.id.action_switch_main:
this.player.setRecovery();
getApplicationContext().sendBroadcast(getPlayerShutdownIntent());
getApplicationContext().startActivity(getSwitchIntent(MainVideoPlayer.class));
getApplicationContext().startActivity(
getSwitchIntent(MainVideoPlayer.class)
.putExtra(BasePlayer.START_PAUSED, !this.player.isPlaying())
);
return true;
}
return onPlayerOptionSelected(item) || super.onOptionsItemSelected(item);
@@ -189,8 +193,10 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
this.player.getPlaybackPitch(),
this.player.getPlaybackSkipSilence(),
null,
false,
false
).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra(BasePlayer.START_PAUSED, !this.player.isPlaying());
}
////////////////////////////////////////////////////////////////////////////

View File

@@ -2,12 +2,19 @@ package org.schabi.newpipe.player.helper;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.MediaMetadata;
import android.os.Build;
import android.support.v4.media.MediaMetadataCompat;
import android.support.v4.media.session.MediaSessionCompat;
import android.view.KeyEvent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat;
import androidx.media.session.MediaButtonReceiver;
import androidx.media.app.NotificationCompat.MediaStyle;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
@@ -19,8 +26,10 @@ import org.schabi.newpipe.player.mediasession.PlayQueuePlaybackController;
public class MediaSessionManager {
private static final String TAG = "MediaSessionManager";
@NonNull private final MediaSessionCompat mediaSession;
@NonNull private final MediaSessionConnector sessionConnector;
@NonNull
private final MediaSessionCompat mediaSession;
@NonNull
private final MediaSessionConnector sessionConnector;
public MediaSessionManager(@NonNull final Context context,
@NonNull final Player player,
@@ -40,13 +49,45 @@ public class MediaSessionManager {
return MediaButtonReceiver.handleIntent(mediaSession, intent);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void setLockScreenArt(NotificationCompat.Builder builder, @Nullable Bitmap thumbnailBitmap) {
if (thumbnailBitmap == null || !mediaSession.isActive()) {
return;
}
mediaSession.setMetadata(
new MediaMetadataCompat.Builder()
.putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, thumbnailBitmap)
.build()
);
MediaStyle mediaStyle = new MediaStyle()
.setMediaSession(mediaSession.getSessionToken());
builder.setStyle(mediaStyle);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void clearLockScreenArt(NotificationCompat.Builder builder) {
mediaSession.setMetadata(
new MediaMetadataCompat.Builder()
.putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, null)
.build()
);
MediaStyle mediaStyle = new MediaStyle()
.setMediaSession(mediaSession.getSessionToken());
builder.setStyle(mediaStyle);
}
/**
* Should be called on player destruction to prevent leakage.
* */
*/
public void dispose() {
this.sessionConnector.setPlayer(null);
this.sessionConnector.setQueueNavigator(null);
this.mediaSession.setActive(false);
this.mediaSession.release();
}
}
}

View File

@@ -17,6 +17,7 @@ import org.schabi.newpipe.R;
import org.schabi.newpipe.util.SliderStrategy;
import static org.schabi.newpipe.player.BasePlayer.DEBUG;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
public class PlaybackParameterDialog extends DialogFragment {
@NonNull private static final String TAG = "PlaybackParameterDialog";
@@ -108,6 +109,7 @@ public class PlaybackParameterDialog extends DialogFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
assureCorrectAppLanguage(getContext());
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
initialTempo = savedInstanceState.getDouble(INITIAL_TEMPO_KEY, DEFAULT_TEMPO);
@@ -137,6 +139,7 @@ public class PlaybackParameterDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
assureCorrectAppLanguage(getContext());
final View view = View.inflate(getContext(), R.layout.dialog_playback_parameter, null);
setupControlViews(view);

View File

@@ -319,6 +319,7 @@ public class MediaSourceManager {
private Observable<Long> getEdgeIntervalSignal() {
return Observable.interval(progressUpdateIntervalMillis, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.filter(ignored ->
playbackListener.isApproachingPlaybackEdge(playbackNearEndGapMillis));
}

View File

@@ -43,9 +43,12 @@ import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import java.util.Vector;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
/*
* Created by Christian Schabesberger on 24.10.15.
*
@@ -91,7 +94,7 @@ public class ErrorActivity extends AppCompatActivity {
if (rootView != null) {
Snackbar.make(rootView, R.string.error_snackbar_message, 3 * 1000)
.setActionTextColor(Color.YELLOW)
.setAction(R.string.error_snackbar_action, v ->
.setAction(context.getString(R.string.error_snackbar_action).toUpperCase(), v ->
startErrorActivity(returnActivity, context, errorInfo, el)).show();
} else {
startErrorActivity(returnActivity, context, errorInfo, el);
@@ -171,6 +174,7 @@ public class ErrorActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceState);
ThemeHelper.setTheme(this);
setContentView(R.layout.activity_error);
@@ -374,8 +378,12 @@ public class ErrorActivity extends AppCompatActivity {
}
private String getContentLangString() {
return PreferenceManager.getDefaultSharedPreferences(this)
String contentLanguage = PreferenceManager.getDefaultSharedPreferences(this)
.getString(this.getString(R.string.content_country_key), "none");
if (contentLanguage.equals(getString(R.string.default_localization_key))) {
contentLanguage = Locale.getDefault().toString();
}
return contentLanguage;
}
private String getOsString() {

View File

@@ -7,11 +7,12 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.Preference;
import android.util.Log;
import android.widget.Toast;
import com.nononsenseapps.filepicker.Utils;
import com.nostra13.universalimageloader.core.ImageLoader;
@@ -40,6 +41,8 @@ import java.util.Map;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
public class ContentSettingsFragment extends BasePreferenceFragment {
private static final int REQUEST_IMPORT_PATH = 8945;
@@ -56,6 +59,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
private Localization initialSelectedLocalization;
private ContentCountry initialSelectedContentCountry;
private String initialLanguage;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
@@ -64,6 +68,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
initialSelectedLocalization = org.schabi.newpipe.util.Localization.getPreferredLocalization(requireContext());
initialSelectedContentCountry = org.schabi.newpipe.util.Localization.getPreferredContentCountry(requireContext());
initialLanguage = PreferenceManager.getDefaultSharedPreferences(getContext()).getString("app_language_key", "en");
}
@Override
@@ -125,9 +130,10 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
.getPreferredLocalization(requireContext());
final ContentCountry selectedContentCountry = org.schabi.newpipe.util.Localization
.getPreferredContentCountry(requireContext());
final String selectedLanguage = PreferenceManager.getDefaultSharedPreferences(getContext()).getString("app_language_key", "en");
if (!selectedLocalization.equals(initialSelectedLocalization)
|| !selectedContentCountry.equals(initialSelectedContentCountry)) {
|| !selectedContentCountry.equals(initialSelectedContentCountry) || !selectedLanguage.equals(initialLanguage)) {
Toast.makeText(requireContext(), R.string.localization_changes_requires_app_restart, Toast.LENGTH_LONG).show();
NewPipe.setupLocalization(selectedLocalization, selectedContentCountry);
@@ -136,6 +142,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
@Override
public void onActivityResult(int requestCode, int resultCode, @NonNull Intent data) {
assureCorrectAppLanguage(getContext());
super.onActivityResult(requestCode, resultCode, data);
if (DEBUG) {
Log.d(TAG, "onActivityResult() called with: requestCode = [" + requestCode + "], resultCode = [" + resultCode + "], data = [" + data + "]");
@@ -150,7 +157,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.override_current_data)
.setPositiveButton(android.R.string.ok,
.setPositiveButton(getString(R.string.finish),
(DialogInterface d, int id) -> importDatabase(path))
.setNegativeButton(android.R.string.cancel,
(DialogInterface d, int id) -> d.cancel());
@@ -189,7 +196,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
} finally {
try {
if (output != null) {
output.flush();
@@ -236,7 +243,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
}
//If settings file exist, ask if it should be imported.
if(ZipHelper.extractFileFromZip(filePath, newpipe_settings.getPath(), "newpipe.settings")) {
if (ZipHelper.extractFileFromZip(filePath, newpipe_settings.getPath(), "newpipe.settings")) {
AlertDialog.Builder alert = new AlertDialog.Builder(getContext());
alert.setTitle(R.string.import_settings);
@@ -245,7 +252,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
// restart app to properly load db
System.exit(0);
});
alert.setPositiveButton(android.R.string.yes, (dialog, which) -> {
alert.setPositiveButton(getString(R.string.finish), (dialog, which) -> {
dialog.dismiss();
loadSharedPreferences(newpipe_settings);
// restart app to properly load db
@@ -291,7 +298,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
} finally {
try {
if (input != null) {
input.close();

View File

@@ -8,11 +8,12 @@ import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.preference.Preference;
import android.util.Log;
import android.widget.Toast;
import com.nononsenseapps.filepicker.Utils;
@@ -28,6 +29,8 @@ import java.nio.charset.StandardCharsets;
import us.shandian.giga.io.StoredDirectoryHelper;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
public class DownloadSettingsFragment extends BasePreferenceFragment {
private static final int REQUEST_DOWNLOAD_VIDEO_PATH = 0x1235;
private static final int REQUEST_DOWNLOAD_AUDIO_PATH = 0x1236;
@@ -159,7 +162,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
AlertDialog.Builder msg = new AlertDialog.Builder(ctx);
msg.setTitle(title);
msg.setMessage(message);
msg.setPositiveButton(android.R.string.ok, null);
msg.setPositiveButton(getString(R.string.finish), null);
msg.show();
}
@@ -202,6 +205,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
assureCorrectAppLanguage(getContext());
super.onActivityResult(requestCode, resultCode, data);
if (DEBUG) {
Log.d(TAG, "onActivityResult() called with: requestCode = [" + requestCode + "], " +

View File

@@ -89,6 +89,13 @@ public class PeertubeInstanceListFragment extends Fragment {
public void onViewCreated(@NonNull View rootView, @Nullable Bundle savedInstanceState) {
super.onViewCreated(rootView, savedInstanceState);
initViews(rootView);
}
private void initViews(@NonNull View rootView) {
TextView instanceHelpTV = rootView.findViewById(R.id.instanceHelpTV);
instanceHelpTV.setText(getString(R.string.peertube_instance_url_help, getString(R.string.peertube_instance_list_url)));
initButton(rootView);
RecyclerView listInstances = rootView.findViewById(R.id.instances);

View File

@@ -14,6 +14,7 @@ import android.view.MenuItem;
import org.schabi.newpipe.R;
import org.schabi.newpipe.util.ThemeHelper;
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
/*
* Created by Christian Schabesberger on 31.08.15.
@@ -44,7 +45,7 @@ public class SettingsActivity extends AppCompatActivity implements BasePreferenc
@Override
protected void onCreate(Bundle savedInstanceBundle) {
setTheme(ThemeHelper.getSettingsThemeStyle(this));
assureCorrectAppLanguage(this);
super.onCreate(savedInstanceBundle);
setContentView(R.layout.settings_layout);

View File

@@ -1,12 +1,83 @@
package org.schabi.newpipe.settings;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import androidx.annotation.Nullable;
import androidx.preference.ListPreference;
import com.google.android.material.snackbar.Snackbar;
import org.schabi.newpipe.R;
import org.schabi.newpipe.util.PermissionHelper;
public class VideoAudioSettingsFragment extends BasePreferenceFragment {
private SharedPreferences.OnSharedPreferenceChangeListener listener;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//initializing R.array.seek_duration_description to display the translation of seconds
Resources res = getResources();
String[] durationsValues = res.getStringArray(R.array.seek_duration_value);
String[] durationsDescriptions = res.getStringArray(R.array.seek_duration_description);
int currentDurationValue;
for (int i = 0; i < durationsDescriptions.length; i++) {
currentDurationValue = Integer.parseInt(durationsValues[i]) / 1000;
try {
durationsDescriptions[i] = String.format(
res.getQuantityString(R.plurals.dynamic_seek_duration_description, currentDurationValue),
currentDurationValue);
} catch (Resources.NotFoundException ignored) {
//if this happens, the translation is missing, and the english string will be displayed instead
}
}
ListPreference durations = (ListPreference) findPreference(getString(R.string.seek_duration_key));
durations.setEntries(durationsDescriptions);
listener = (sharedPreferences, s) -> {
// on M and above, if user chooses to minimise to popup player on exit and the app doesn't have
// display over other apps permission, show a snackbar to let the user give permission
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
s.equals(getString(R.string.minimize_on_exit_key))) {
String newSetting = sharedPreferences.getString(s, null);
if (newSetting != null
&& newSetting.equals(getString(R.string.minimize_on_exit_popup_key))
&& !Settings.canDrawOverlays(getContext())) {
Snackbar.make(getListView(), R.string.permission_display_over_apps, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.settings,
view -> PermissionHelper.checkSystemAlertWindowPermission(getContext()))
.show();
}
}
};
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.video_audio_settings);
}
@Override
public void onResume() {
super.onResume();
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(listener);
}
@Override
public void onPause() {
super.onPause();
getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener);
}
}

View File

@@ -137,6 +137,7 @@ public class DataReader {
position = 0;
readOffset = readBuffer.length;
readCount = 0;
}
public boolean canRewind() {

View File

@@ -11,6 +11,7 @@ import org.schabi.newpipe.streams.io.SharpStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
/**
* @author kapodamy
@@ -23,7 +24,6 @@ public class Mp4FromDashWriter {
private final static byte SAMPLES_PER_CHUNK = 6;// ffmpeg uses 2, basic uses 1 (with 60fps uses 21 or 22). NewPipe will use 6
private final static long THRESHOLD_FOR_CO64 = 0xFFFEFFFFL;// near 3.999 GiB
private final static int THRESHOLD_MOOV_LENGTH = (256 * 1024) + (2048 * 1024); // 2.2 MiB enough for: 1080p 60fps 00h35m00s
private final static short SINGLE_CHUNK_SAMPLE_BUFFER = 256;
private final long time;
@@ -46,6 +46,8 @@ public class Mp4FromDashWriter {
private int overrideMainBrand = 0x00;
private ArrayList<Integer> compatibleBrands = new ArrayList<>(5);
public Mp4FromDashWriter(SharpStream... sources) throws IOException {
for (SharpStream src : sources) {
if (!src.canRewind() && !src.canRead()) {
@@ -57,6 +59,10 @@ public class Mp4FromDashWriter {
readers = new Mp4DashReader[sourceTracks.length];
readersChunks = new Mp4DashChunk[readers.length];
time = (System.currentTimeMillis() / 1000L) + EPOCH_OFFSET;
compatibleBrands.add(0x6D703431);// mp41
compatibleBrands.add(0x69736F6D);// isom
compatibleBrands.add(0x69736F32);// iso2
}
public Mp4Track[] getTracksFromSource(int sourceIndex) throws IllegalStateException {
@@ -104,8 +110,8 @@ public class Mp4FromDashWriter {
}
}
public void setMainBrand(int brandId) {
overrideMainBrand = brandId;
public void setMainBrand(int brand) {
overrideMainBrand = brand;
}
public boolean isDone() {
@@ -159,7 +165,13 @@ public class Mp4FromDashWriter {
tablesInfo[i] = new TablesInfo();
}
boolean singleChunk = tracks.length == 1 && tracks[0].kind == TrackKind.Audio;
int single_sample_buffer;
if (tracks.length == 1 && tracks[0].kind == TrackKind.Audio) {
// near 1 second of audio data per chunk, avoid split the audio stream in large chunks
single_sample_buffer = tracks[0].trak.mdia.mdhd_timeScale / 1000;
} else {
single_sample_buffer = -1;
}
for (int i = 0; i < readers.length; i++) {
@@ -210,31 +222,10 @@ public class Mp4FromDashWriter {
readers[i].rewind();
int tmp = tablesInfo[i].stsz - SAMPLES_PER_CHUNK_INIT;
tablesInfo[i].stco = (tmp / SAMPLES_PER_CHUNK) + 1;// +1 for samples in first chunk
tmp = tmp % SAMPLES_PER_CHUNK;
if (singleChunk) {
// avoid split audio streams in chunks
tablesInfo[i].stsc = 1;
tablesInfo[i].stsc_bEntries = new int[]{
1, tablesInfo[i].stsz, 1
};
tablesInfo[i].stco = 1;
} else if (tmp == 0) {
tablesInfo[i].stsc = 2;// first chunk (init) and succesive chunks
tablesInfo[i].stsc_bEntries = new int[]{
1, SAMPLES_PER_CHUNK_INIT, 1,
2, SAMPLES_PER_CHUNK, 1
};
if (single_sample_buffer > 0) {
initChunkTables(tablesInfo[i], single_sample_buffer, single_sample_buffer);
} else {
tablesInfo[i].stsc = 3;// first chunk (init) and successive chunks and remain chunk
tablesInfo[i].stsc_bEntries = new int[]{
1, SAMPLES_PER_CHUNK_INIT, 1,
2, SAMPLES_PER_CHUNK, 1,
tablesInfo[i].stco + 1, tmp, 1
};
tablesInfo[i].stco++;
initChunkTables(tablesInfo[i], SAMPLES_PER_CHUNK_INIT, SAMPLES_PER_CHUNK);
}
sampleCount[i] = tablesInfo[i].stsz;
@@ -259,7 +250,7 @@ public class Mp4FromDashWriter {
boolean is64 = read > THRESHOLD_FOR_CO64;
// calculate the moov size;
// calculate the moov size
int auxSize = make_moov(defaultMediaTime, tablesInfo, is64);
if (auxSize < THRESHOLD_MOOV_LENGTH) {
@@ -272,11 +263,6 @@ public class Mp4FromDashWriter {
final int ftyp_size = make_ftyp();
// reserve moov space in the output stream
/*if (outStream.canSetLength()) {
long length = writeOffset + auxSize;
outStream.setLength(length);
outSeek(length);
} else {*/
if (auxSize > 0) {
int length = auxSize;
byte[] buffer = new byte[64 * 1024];// 64 KiB
@@ -292,10 +278,10 @@ public class Mp4FromDashWriter {
}
// tablesInfo contains row counts
// and after returning from make_moov() will contain table offsets
// and after returning from make_moov() will contain those table offsets
make_moov(defaultMediaTime, tablesInfo, is64);
// write tables: stts stsc
// write tables: stts stsc sbgp
// reset for ctts table: sampleCount sampleExtra
for (int i = 0; i < readers.length; i++) {
writeEntryArray(tablesInfo[i].stts, 2, sampleCount[i], defaultSampleDuration[i]);
@@ -305,6 +291,9 @@ public class Mp4FromDashWriter {
sampleCount[i] = 1;// the index is not base zero
sampleExtra[i] = -1;
}
if (tablesInfo[i].sbgp > 0) {
writeEntryArray(tablesInfo[i].sbgp, 1, sampleCount[i]);
}
}
if (auxBuffer == null) {
@@ -314,8 +303,8 @@ public class Mp4FromDashWriter {
outWrite(make_mdat(totalSampleSize, is64));
int[] sampleIndex = new int[readers.length];
int[] sizes = new int[singleChunk ? SINGLE_CHUNK_SAMPLE_BUFFER : SAMPLES_PER_CHUNK];
int[] sync = new int[singleChunk ? SINGLE_CHUNK_SAMPLE_BUFFER : SAMPLES_PER_CHUNK];
int[] sizes = new int[single_sample_buffer > 0 ? single_sample_buffer : SAMPLES_PER_CHUNK];
int[] sync = new int[single_sample_buffer > 0 ? single_sample_buffer : SAMPLES_PER_CHUNK];
int written = readers.length;
while (written > 0) {
@@ -329,8 +318,8 @@ public class Mp4FromDashWriter {
long chunkOffset = writeOffset;
int syncCount = 0;
int limit;
if (singleChunk) {
limit = SINGLE_CHUNK_SAMPLE_BUFFER;
if (single_sample_buffer > 0) {
limit = single_sample_buffer;
} else {
limit = sampleIndex[i] == 0 ? SAMPLES_PER_CHUNK_INIT : SAMPLES_PER_CHUNK;
}
@@ -342,6 +331,7 @@ public class Mp4FromDashWriter {
if (sample == null) {
if (tablesInfo[i].ctts > 0 && sampleExtra[i] >= 0) {
writeEntryArray(tablesInfo[i].ctts, 1, sampleCount[i], sampleExtra[i]);// flush last entries
outRestore();
}
sampleIndex[i] = -1;
break;
@@ -390,10 +380,6 @@ public class Mp4FromDashWriter {
} else {
tablesInfo[i].stco = writeEntryArray(tablesInfo[i].stco, 1, (int) chunkOffset);
}
if (singleChunk) {
tablesInfo[i].stco = -1;
}
}
outRestore();
@@ -470,7 +456,42 @@ public class Mp4FromDashWriter {
}
}
private void initChunkTables(TablesInfo tables, int firstCount, int succesiveCount) {
// tables.stsz holds amount of samples of the track (total)
int totalSamples = (tables.stsz - firstCount);
float chunkAmount = totalSamples / (float) succesiveCount;
int remainChunkOffset = (int) Math.ceil(chunkAmount);
boolean remain = remainChunkOffset != (int) chunkAmount;
int index = 0;
tables.stsc = 1;
if (firstCount != succesiveCount) {
tables.stsc++;
}
if (remain) {
tables.stsc++;
}
// stsc_table_entry = [first_chunk, samples_per_chunk, sample_description_index]
tables.stsc_bEntries = new int[tables.stsc * 3];
tables.stco = remainChunkOffset + 1;// total entrys in chunk offset box
tables.stsc_bEntries[index++] = 1;
tables.stsc_bEntries[index++] = firstCount;
tables.stsc_bEntries[index++] = 1;
if (firstCount != succesiveCount) {
tables.stsc_bEntries[index++] = 2;
tables.stsc_bEntries[index++] = succesiveCount;
tables.stsc_bEntries[index++] = 1;
}
if (remain) {
tables.stsc_bEntries[index++] = remainChunkOffset + 1;
tables.stsc_bEntries[index++] = totalSamples % succesiveCount;
tables.stsc_bEntries[index] = 1;
}
}
private void outWrite(byte[] buffer) throws IOException {
outWrite(buffer, buffer.length);
@@ -585,19 +606,29 @@ public class Mp4FromDashWriter {
private int make_ftyp() throws IOException {
byte[] buffer = new byte[]{
0x00, 0x00, 0x00, 0x1C, 0x66, 0x74, 0x79, 0x70,// ftyp
0x6D, 0x70, 0x34, 0x32,// mayor brand (mp42)
0x00, 0x00, 0x02, 0x00,// default minor version (512)
0x6D, 0x70, 0x34, 0x31, 0x69, 0x73, 0x6F, 0x6D, 0x69, 0x73, 0x6F, 0x32// compatible brands: mp41 isom iso2
};
int size = 16 + (compatibleBrands.size() * 4);
if (overrideMainBrand != 0) size += 4;
if (overrideMainBrand != 0)
ByteBuffer.wrap(buffer).putInt(8, overrideMainBrand);
ByteBuffer buffer = ByteBuffer.allocate(size);
buffer.putInt(size);
buffer.putInt(0x66747970);// "ftyp"
outWrite(buffer);
if (overrideMainBrand == 0) {
buffer.putInt(0x6D703432);// mayor brand "mp42"
buffer.putInt(512);// default minor version
} else {
buffer.putInt(overrideMainBrand);
buffer.putInt(0);
buffer.putInt(0x6D703432);// "mp42" compatible brand
}
return buffer.length;
for (Integer brand : compatibleBrands) {
buffer.putInt(brand);// compatible brand
}
outWrite(buffer.array());
return size;
}
private byte[] make_mdat(long refSize, boolean is64) {
@@ -740,13 +771,12 @@ public class Mp4FromDashWriter {
.array()
);
make_mdia(tracks[index].trak.mdia, tables, is64);
make_mdia(tracks[index].trak.mdia, tables, is64, tracks[index].kind == TrackKind.Audio);
lengthFor(start);
}
private void make_mdia(Mdia mdia, TablesInfo tablesInfo, boolean is64) throws IOException {
private void make_mdia(Mdia mdia, TablesInfo tablesInfo, boolean is64, boolean isAudio) throws IOException {
int start_mdia = auxOffset();
auxWrite(new byte[]{0x00, 0x00, 0x00, 0x00, 0x6D, 0x64, 0x69, 0x61});// mdia
auxWrite(mdia.mdhd);
@@ -766,7 +796,7 @@ public class Mp4FromDashWriter {
// And stsz can be empty if has a default sample size
//
if (moovSimulation) {
make(0x73747473, -1, 2, 1);
make(0x73747473, -1, 2, 1);// stts
if (tablesInfo.stss > 0) {
make(0x73747373, -1, 1, tablesInfo.stss);
}
@@ -789,6 +819,11 @@ public class Mp4FromDashWriter {
tablesInfo.stco = make(is64 ? 0x636F3634 : 0x7374636F, -1, is64 ? 2 : 1, tablesInfo.stco);
}
if (isAudio) {
auxWrite(make_sgpd());
tablesInfo.sbgp = make_sbgp();// during simulation the returned offset is ignored
}
lengthFor(start_stbl);
lengthFor(start_minf);
lengthFor(start_mdia);
@@ -816,6 +851,48 @@ public class Mp4FromDashWriter {
return buffer.array();
}
private int make_sbgp() throws IOException {
int offset = auxOffset();
auxWrite(new byte[] {
0x00, 0x00, 0x00, 0x1C,// box size
0x73, 0x62, 0x67, 0x70,// "sbpg"
0x00, 0x00, 0x00, 0x00,// default box flags
0x72, 0x6F, 0x6C, 0x6C,// group type "roll"
0x00, 0x00, 0x00, 0x01,// group table size
0x00, 0x00, 0x00, 0x00,// group[0] total samples (to be set later)
0x00, 0x00, 0x00, 0x01// group[0] description index
});
return offset + 0x14;
}
private byte[] make_sgpd() {
/*
* Sample Group Description Box
*
* ¿whats does?
* the table inside of this box gives information about the
* characteristics of sample groups. The descriptive information is any other
* information needed to define or characterize the sample group.
*
* ¿is replicabled this box?
* NO due lacks of documentation about this box but...
* most of m4a encoders and ffmpeg uses this box with dummy values (same values)
*/
ByteBuffer buffer = ByteBuffer.wrap(new byte[] {
0x00, 0x00, 0x00, 0x1A,// box size
0x73, 0x67, 0x70, 0x64,// "sgpd"
0x01, 0x00, 0x00, 0x00,// box flags (unknown flag sets)
0x72, 0x6F, 0x6C, 0x6C, // ¿¿group type??
0x00, 0x00, 0x00, 0x02,// ¿¿??
0x00, 0x00, 0x00, 0x01,// ¿¿??
(byte)0xFF, (byte)0xFF// ¿¿??
});
return buffer.array();
}
class TablesInfo {
@@ -827,5 +904,6 @@ public class Mp4FromDashWriter {
int stsz_default;
int stss;
int stco;
int sbgp;
}
}

View File

@@ -0,0 +1,95 @@
package org.schabi.newpipe.streams;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
import org.jsoup.parser.Parser;
import org.jsoup.select.Elements;
import org.schabi.newpipe.streams.io.SharpStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
/**
* @author kapodamy
*/
public class SrtFromTtmlWriter {
private static final String NEW_LINE = "\r\n";
private SharpStream out;
private boolean ignoreEmptyFrames;
private final Charset charset = StandardCharsets.UTF_8;
private int frameIndex = 0;
public SrtFromTtmlWriter(SharpStream out, boolean ignoreEmptyFrames) {
this.out = out;
this.ignoreEmptyFrames = ignoreEmptyFrames;
}
private static String getTimestamp(Element frame, String attr) {
return frame
.attr(attr)
.replace('.', ',');// SRT subtitles uses comma as decimal separator
}
private void writeFrame(String begin, String end, StringBuilder text) throws IOException {
writeString(String.valueOf(frameIndex++));
writeString(NEW_LINE);
writeString(begin);
writeString(" --> ");
writeString(end);
writeString(NEW_LINE);
writeString(text.toString());
writeString(NEW_LINE);
writeString(NEW_LINE);
}
private void writeString(String text) throws IOException {
out.write(text.getBytes(charset));
}
public void build(SharpStream ttml) throws IOException {
/*
* TTML parser with BASIC support
* multiple CUE is not supported
* styling is not supported
* tag timestamps (in auto-generated subtitles) are not supported, maybe in the future
* also TimestampTagOption enum is not applicable
* Language parsing is not supported
*/
// parse XML
byte[] buffer = new byte[(int) ttml.available()];
ttml.read(buffer);
Document doc = Jsoup.parse(new ByteArrayInputStream(buffer), "UTF-8", "", Parser.xmlParser());
StringBuilder text = new StringBuilder(128);
Elements paragraph_list = doc.select("body > div > p");
// check if has frames
if (paragraph_list.size() < 1) return;
for (Element paragraph : paragraph_list) {
text.setLength(0);
for (Node children : paragraph.childNodes()) {
if (children instanceof TextNode)
text.append(((TextNode) children).text());
else if (children instanceof Element && ((Element) children).tagName().equalsIgnoreCase("br"))
text.append(NEW_LINE);
}
if (ignoreEmptyFrames && text.length() < 1) continue;
String begin = getTimestamp(paragraph, "begin");
String end = getTimestamp(paragraph, "end");
writeFrame(begin, end, text);
}
}
}

View File

@@ -1,369 +0,0 @@
package org.schabi.newpipe.streams;
import org.schabi.newpipe.streams.io.SharpStream;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.text.ParseException;
import java.util.Locale;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;
/**
* @author kapodamy
*/
public class SubtitleConverter {
private static final String NEW_LINE = "\r\n";
public void dumpTTML(SharpStream in, final SharpStream out, final boolean ignoreEmptyFrames, final boolean detectYoutubeDuplicateLines
) throws IOException, ParseException, SAXException, ParserConfigurationException, XPathExpressionException {
final FrameWriter callback = new FrameWriter() {
int frameIndex = 0;
final Charset charset = Charset.forName("utf-8");
@Override
public void yield(SubtitleFrame frame) throws IOException {
if (ignoreEmptyFrames && frame.isEmptyText()) {
return;
}
out.write(String.valueOf(frameIndex++).getBytes(charset));
out.write(NEW_LINE.getBytes(charset));
out.write(getTime(frame.start, true).getBytes(charset));
out.write(" --> ".getBytes(charset));
out.write(getTime(frame.end, true).getBytes(charset));
out.write(NEW_LINE.getBytes(charset));
out.write(frame.text.getBytes(charset));
out.write(NEW_LINE.getBytes(charset));
out.write(NEW_LINE.getBytes(charset));
}
};
read_xml_based(in, callback, detectYoutubeDuplicateLines,
"tt", "xmlns", "http://www.w3.org/ns/ttml",
new String[]{"timedtext", "head", "wp"},
new String[]{"body", "div", "p"},
"begin", "end", true
);
}
private void read_xml_based(SharpStream source, FrameWriter callback, boolean detectYoutubeDuplicateLines,
String root, String formatAttr, String formatVersion, String[] cuePath, String[] framePath,
String timeAttr, String durationAttr, boolean hasTimestamp
) throws IOException, ParseException, SAXException, ParserConfigurationException, XPathExpressionException {
/*
* XML based subtitles parser with BASIC support
* multiple CUE is not supported
* styling is not supported
* tag timestamps (in auto-generated subtitles) are not supported, maybe in the future
* also TimestampTagOption enum is not applicable
* Language parsing is not supported
*/
byte[] buffer = new byte[(int) source.available()];
source.read(buffer);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document xml = builder.parse(new ByteArrayInputStream(buffer));
String attr;
// get the format version or namespace
Element node = xml.getDocumentElement();
if (node == null) {
throw new ParseException("Can't get the format version. ¿wrong namespace?", -1);
} else if (!node.getNodeName().equals(root)) {
throw new ParseException("Invalid root", -1);
}
if (formatAttr.equals("xmlns")) {
if (!node.getNamespaceURI().equals(formatVersion)) {
throw new UnsupportedOperationException("Expected xml namespace: " + formatVersion);
}
} else {
attr = node.getAttributeNS(formatVersion, formatAttr);
if (attr == null) {
throw new ParseException("Can't get the format attribute", -1);
}
if (!attr.equals(formatVersion)) {
throw new ParseException("Invalid format version : " + attr, -1);
}
}
NodeList node_list;
int line_break = 0;// Maximum characters per line if present (valid for TranScript v3)
if (!hasTimestamp) {
node_list = selectNodes(xml, cuePath, formatVersion);
if (node_list != null) {
// if the subtitle has multiple CUEs, use the highest value
for (int i = 0; i < node_list.getLength(); i++) {
try {
int tmp = Integer.parseInt(((Element) node_list.item(i)).getAttributeNS(formatVersion, "ah"));
if (tmp > line_break) {
line_break = tmp;
}
} catch (Exception err) {
}
}
}
}
// parse every frame
node_list = selectNodes(xml, framePath, formatVersion);
if (node_list == null) {
return;// no frames detected
}
int fs_ff = -1;// first timestamp of first frame
boolean limit_lines = false;
for (int i = 0; i < node_list.getLength(); i++) {
Element elem = (Element) node_list.item(i);
SubtitleFrame obj = new SubtitleFrame();
obj.text = elem.getTextContent();
attr = elem.getAttribute(timeAttr);// ¡this cant be null!
obj.start = hasTimestamp ? parseTimestamp(attr) : Integer.parseInt(attr);
attr = elem.getAttribute(durationAttr);
if (obj.text == null || attr == null) {
continue;// normally is a blank line (on auto-generated subtitles) ignore
}
if (hasTimestamp) {
obj.end = parseTimestamp(attr);
if (detectYoutubeDuplicateLines) {
if (limit_lines) {
int swap = obj.end;
obj.end = fs_ff;
fs_ff = swap;
} else {
if (fs_ff < 0) {
fs_ff = obj.end;
} else {
if (fs_ff < obj.start) {
limit_lines = true;// the subtitles has duplicated lines
} else {
detectYoutubeDuplicateLines = false;
}
}
}
}
} else {
obj.end = obj.start + Integer.parseInt(attr);
}
if (/*node.getAttribute("w").equals("1") &&*/line_break > 1 && obj.text.length() > line_break) {
// implement auto line breaking (once)
StringBuilder text = new StringBuilder(obj.text);
obj.text = null;
switch (text.charAt(line_break)) {
case ' ':
case '\t':
putBreakAt(line_break, text);
break;
default:// find the word start position
for (int j = line_break - 1; j > 0; j--) {
switch (text.charAt(j)) {
case ' ':
case '\t':
putBreakAt(j, text);
j = -1;
break;
case '\r':
case '\n':
j = -1;// long word, just ignore
break;
}
}
break;
}
obj.text = text.toString();// set the processed text
}
callback.yield(obj);
}
}
private static NodeList selectNodes(Document xml, String[] path, String namespaceUri) {
Element ref = xml.getDocumentElement();
for (int i = 0; i < path.length - 1; i++) {
NodeList nodes = ref.getChildNodes();
if (nodes.getLength() < 1) {
return null;
}
Element elem;
for (int j = 0; j < nodes.getLength(); j++) {
if (nodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
elem = (Element) nodes.item(j);
if (elem.getNodeName().equals(path[i]) && elem.getNamespaceURI().equals(namespaceUri)) {
ref = elem;
break;
}
}
}
}
return ref.getElementsByTagNameNS(namespaceUri, path[path.length - 1]);
}
private static int parseTimestamp(String multiImpl) throws NumberFormatException, ParseException {
if (multiImpl.length() < 1) {
return 0;
} else if (multiImpl.length() == 1) {
return Integer.parseInt(multiImpl) * 1000;// ¡this must be a number in seconds!
}
// detect wallclock-time
if (multiImpl.startsWith("wallclock(")) {
throw new UnsupportedOperationException("Parsing wallclock timestamp is not implemented");
}
// detect offset-time
if (multiImpl.indexOf(':') < 0) {
int multiplier = 1000;
char metric = multiImpl.charAt(multiImpl.length() - 1);
switch (metric) {
case 'h':
multiplier *= 3600000;
break;
case 'm':
multiplier *= 60000;
break;
case 's':
if (multiImpl.charAt(multiImpl.length() - 2) == 'm') {
multiplier = 1;// ms
}
break;
default:
if (!Character.isDigit(metric)) {
throw new NumberFormatException("Invalid metric suffix found on : " + multiImpl);
}
metric = '\0';
break;
}
try {
String offset_time = multiImpl;
if (multiplier == 1) {
offset_time = offset_time.substring(0, offset_time.length() - 2);
} else if (metric != '\0') {
offset_time = offset_time.substring(0, offset_time.length() - 1);
}
double time_metric_based = Double.parseDouble(offset_time);
if (Math.abs(time_metric_based) <= Double.MAX_VALUE) {
return (int) (time_metric_based * multiplier);
}
} catch (Exception err) {
throw new UnsupportedOperationException("Invalid or not implemented timestamp on: " + multiImpl);
}
}
// detect clock-time
int time = 0;
String[] units = multiImpl.split(":");
if (units.length < 3) {
throw new ParseException("Invalid clock-time timestamp", -1);
}
time += Integer.parseInt(units[0]) * 3600000;// hours
time += Integer.parseInt(units[1]) * 60000;//minutes
time += Float.parseFloat(units[2]) * 1000f;// seconds and milliseconds (if present)
// frames and sub-frames are ignored (not implemented)
// time += units[3] * fps;
return time;
}
private static void putBreakAt(int idx, StringBuilder str) {
// this should be optimized at compile time
if (NEW_LINE.length() > 1) {
str.delete(idx, idx + 1);// remove after replace
str.insert(idx, NEW_LINE);
} else {
str.setCharAt(idx, NEW_LINE.charAt(0));
}
}
private static String getTime(int time, boolean comma) {
// cast every value to integer to avoid auto-round in ToString("00").
StringBuilder str = new StringBuilder(12);
str.append(numberToString(time / 1000 / 3600, 2));// hours
str.append(':');
str.append(numberToString(time / 1000 / 60 % 60, 2));// minutes
str.append(':');
str.append(numberToString(time / 1000 % 60, 2));// seconds
str.append(comma ? ',' : '.');
str.append(numberToString(time % 1000, 3));// miliseconds
return str.toString();
}
private static String numberToString(int nro, int pad) {
return String.format(Locale.ENGLISH, "%0".concat(String.valueOf(pad)).concat("d"), nro);
}
/******************
* helper classes *
******************/
private interface FrameWriter {
void yield(SubtitleFrame frame) throws IOException;
}
private static class SubtitleFrame {
//Java no support unsigned int
public int end;
public int start;
public String text = "";
private boolean isEmptyText() {
if (text == null) {
return true;
}
for (int i = 0; i < text.length(); i++) {
switch (text.charAt(i)) {
case ' ':
case '\t':
case '\r':
case '\n':
break;
default:
return false;
}
}
return true;
}
}
}

View File

@@ -0,0 +1,43 @@
package org.schabi.newpipe.util;
import android.graphics.Bitmap;
import androidx.annotation.Nullable;
public class BitmapUtils {
@Nullable
public static Bitmap centerCrop(Bitmap inputBitmap, int newWidth, int newHeight) {
if (inputBitmap == null || inputBitmap.isRecycled()) {
return null;
}
float sourceWidth = inputBitmap.getWidth();
float sourceHeight = inputBitmap.getHeight();
float xScale = newWidth / sourceWidth;
float yScale = newHeight / sourceHeight;
float newXScale;
float newYScale;
if (yScale > xScale) {
newXScale = xScale / yScale;
newYScale = 1.0f;
} else {
newXScale = 1.0f;
newYScale = yScale / xScale;
}
float scaledWidth = newXScale * sourceWidth;
float scaledHeight = newYScale * sourceHeight;
int left = (int) ((sourceWidth - scaledWidth) / 2);
int top = (int) ((sourceHeight - scaledHeight) / 2);
int width = (int) scaledWidth;
int height = (int) scaledHeight;
return Bitmap.createBitmap(inputBitmap, left, top, width, height);
}
}

View File

@@ -0,0 +1,23 @@
package org.schabi.newpipe.util;
import android.content.Context;
import android.content.DialogInterface;
import androidx.appcompat.app.AlertDialog;
import org.schabi.newpipe.R;
public class KoreUtil {
private KoreUtil() { }
public static void showInstallKoreDialog(final Context context) {
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(R.string.kore_not_found)
.setPositiveButton(R.string.install,
(DialogInterface dialog, int which) -> NavigationHelper.installKore(context))
.setNegativeButton(R.string.cancel, (DialogInterface dialog, int which) -> {
});
builder.create().show();
}
}

View File

@@ -1,9 +1,17 @@
package org.schabi.newpipe.util;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import androidx.annotation.NonNull;
import androidx.annotation.PluralsRes;
import androidx.annotation.StringRes;
import org.ocpsoft.prettytime.PrettyTime;
import org.ocpsoft.prettytime.units.Decade;
@@ -18,10 +26,6 @@ import java.util.Date;
import java.util.List;
import java.util.Locale;
import androidx.annotation.NonNull;
import androidx.annotation.PluralsRes;
import androidx.annotation.StringRes;
/*
* Created by chschtsch on 12/29/15.
*
@@ -44,14 +48,14 @@ import androidx.annotation.StringRes;
public class Localization {
private static PrettyTime prettyTime;
private static final String DOT_SEPARATOR = "";
private static PrettyTime prettyTime;
private Localization() {
}
public static void init() {
initPrettyTime();
public static void init(Context context) {
initPrettyTime(context);
}
@NonNull
@@ -79,14 +83,20 @@ public class Localization {
public static org.schabi.newpipe.extractor.localization.Localization getPreferredLocalization(final Context context) {
final String contentLanguage = PreferenceManager
.getDefaultSharedPreferences(context)
.getString(context.getString(R.string.content_language_key), context.getString(R.string.default_language_value));
.getString(context.getString(R.string.content_language_key), context.getString(R.string.default_localization_key));
if (contentLanguage.equals(context.getString(R.string.default_localization_key))) {
return org.schabi.newpipe.extractor.localization.Localization.fromLocale(Locale.getDefault());
}
return org.schabi.newpipe.extractor.localization.Localization.fromLocalizationCode(contentLanguage);
}
public static ContentCountry getPreferredContentCountry(final Context context) {
final String contentCountry = PreferenceManager
.getDefaultSharedPreferences(context)
.getString(context.getString(R.string.content_country_key), context.getString(R.string.default_country_value));
.getString(context.getString(R.string.content_country_key), context.getString(R.string.default_localization_key));
if (contentCountry.equals(context.getString(R.string.default_localization_key))) {
return new ContentCountry(Locale.getDefault().getCountry());
}
return new ContentCountry(contentCountry);
}
@@ -94,7 +104,7 @@ public class Localization {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
String languageCode = sp.getString(context.getString(R.string.content_language_key),
context.getString(R.string.default_language_value));
context.getString(R.string.default_localization_key));
try {
if (languageCode.length() == 2) {
@@ -110,31 +120,31 @@ public class Localization {
}
public static String localizeNumber(Context context, long number) {
Locale locale = getPreferredLocale(context);
NumberFormat nf = NumberFormat.getInstance(locale);
NumberFormat nf = NumberFormat.getInstance(getAppLocale(context));
return nf.format(number);
}
public static String formatDate(Date date) {
return DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault()).format(date);
public static String formatDate(Date date, Context context) {
return DateFormat.getDateInstance(DateFormat.MEDIUM, getAppLocale(context)).format(date);
}
@SuppressLint("StringFormatInvalid")
public static String localizeUploadDate(Context context, Date date) {
return context.getString(R.string.upload_date_text, formatDate(date));
return context.getString(R.string.upload_date_text, formatDate(date, context));
}
public static String localizeViewCount(Context context, long viewCount) {
return getQuantity(context, R.plurals.views, R.string.no_views, viewCount, localizeNumber(context, viewCount));
}
public static String localizeSubscribersCount(Context context, long subscriberCount) {
return getQuantity(context, R.plurals.subscribers, R.string.no_subscribers, subscriberCount, localizeNumber(context, subscriberCount));
}
public static String localizeStreamCount(Context context, long streamCount) {
return getQuantity(context, R.plurals.videos, R.string.no_videos, streamCount, localizeNumber(context, streamCount));
}
public static String localizeWatchingCount(Context context, long watchingCount) {
return getQuantity(context, R.plurals.watching, R.string.no_one_watching, watchingCount, localizeNumber(context, watchingCount));
}
public static String shortCount(Context context, long count) {
if (count >= 1000000000) {
return Long.toString(count / 1000000000) + context.getString(R.string.short_billion);
@@ -151,7 +161,7 @@ public class Localization {
return getQuantity(context, R.plurals.listening, R.string.no_one_listening, listeningCount, shortCount(context, listeningCount));
}
public static String watchingCount(Context context, long watchingCount) {
public static String shortWatchingCount(Context context, long watchingCount) {
return getQuantity(context, R.plurals.watching, R.string.no_one_watching, watchingCount, shortCount(context, watchingCount));
}
@@ -199,21 +209,49 @@ public class Localization {
// Pretty Time
//////////////////////////////////////////////////////////////////////////*/
private static void initPrettyTime() {
prettyTime = new PrettyTime(Locale.getDefault());
private static void initPrettyTime(Context context) {
prettyTime = new PrettyTime(getAppLocale(context));
// Do not use decades as YouTube doesn't either.
prettyTime.removeUnit(Decade.class);
}
private static PrettyTime getPrettyTime() {
// If pretty time's Locale is different, init again with the new one.
if (!prettyTime.getLocale().equals(Locale.getDefault())) {
initPrettyTime();
}
return prettyTime;
}
public static String relativeTime(Calendar calendarTime) {
return getPrettyTime().formatUnrounded(calendarTime);
String time = getPrettyTime().formatUnrounded(calendarTime);
return time.startsWith("-") ? time.substring(1) : time;
//workaround fix for russian showing -1 day ago, -19hrs ago…
}
private static void changeAppLanguage(Locale loc, Resources res) {
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.setLocale(loc);
res.updateConfiguration(conf, dm);
}
public static Locale getAppLocale(Context context) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
String lang = prefs.getString(context.getString(R.string.app_language_key), "en");
Locale loc;
if (lang.equals(context.getString(R.string.default_localization_key))) {
loc = Locale.getDefault();
} else if (lang.matches(".*-.*")) {
//to differentiate different versions of the language
//for example, pt (portuguese in Portugal) and pt-br (portuguese in Brazil)
String[] localisation = lang.split("-");
lang = localisation[0];
String country = localisation[1];
loc = new Locale(lang, country);
} else {
loc = new Locale(lang);
}
return loc;
}
public static void assureCorrectAppLanguage(Context c) {
changeAppLanguage(getAppLocale(c), c.getResources());
}
}

View File

@@ -109,12 +109,14 @@ public class NavigationHelper {
final float playbackPitch,
final boolean playbackSkipSilence,
@Nullable final String playbackQuality,
final boolean resumePlayback) {
final boolean resumePlayback,
final boolean startPaused) {
return getPlayerIntent(context, targetClazz, playQueue, playbackQuality, resumePlayback)
.putExtra(BasePlayer.REPEAT_MODE, repeatMode)
.putExtra(BasePlayer.PLAYBACK_SPEED, playbackSpeed)
.putExtra(BasePlayer.PLAYBACK_PITCH, playbackPitch)
.putExtra(BasePlayer.PLAYBACK_SKIP_SILENCE, playbackSkipSilence);
.putExtra(BasePlayer.PLAYBACK_SKIP_SILENCE, playbackSkipSilence)
.putExtra(BasePlayer.START_PAUSED, startPaused);
}
public static void playOnMainPlayer(final Context context, final PlayQueue queue, final boolean resumePlayback) {

View File

@@ -44,7 +44,7 @@ public class ServiceHelper {
public static String getTranslatedFilterString(String filter, Context c) {
switch (filter) {
case "all": return c.getString(R.string.all);
case "videos": return c.getString(R.string.videos);
case "videos": return c.getString(R.string.videos_string);
case "channels": return c.getString(R.string.channels);
case "playlists": return c.getString(R.string.playlists);
case "tracks": return c.getString(R.string.tracks);

View File

@@ -140,7 +140,15 @@ public class StreamItemAdapter<T extends Stream, U extends Stream> extends BaseA
if (stream instanceof SubtitlesStream) {
formatNameView.setText(((SubtitlesStream) stream).getLanguageTag());
} else {
formatNameView.setText(stream.getFormat().getName());
switch (stream.getFormat()) {
case WEBMA_OPUS:
// noinspection AndroidLintSetTextI18n
formatNameView.setText("opus");
break;
default:
formatNameView.setText(stream.getFormat().getName());
break;
}
}
qualityView.setText(qualityString);

View File

@@ -0,0 +1,128 @@
package org.schabi.newpipe.views;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayout.Tab;
/**
* A TabLayout that is scrollable when tabs exceed its width.
* Hides when there are less than 2 tabs.
*/
public class ScrollableTabLayout extends TabLayout {
private static final String TAG = ScrollableTabLayout.class.getSimpleName();
private int layoutWidth = 0;
private int prevVisibility = View.GONE;
public ScrollableTabLayout(Context context) {
super(context);
}
public ScrollableTabLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ScrollableTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
remeasureTabs();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
layoutWidth = w;
}
@Override
public void addTab(@NonNull Tab tab, int position, boolean setSelected) {
super.addTab(tab, position, setSelected);
hasMultipleTabs();
// Adding a tab won't decrease total tabs' width so tabMode won't have to change to FIXED
if (getTabMode() != MODE_SCROLLABLE) {
remeasureTabs();
}
}
@Override
public void removeTabAt(int position) {
super.removeTabAt(position);
hasMultipleTabs();
// Removing a tab won't increase total tabs' width so tabMode won't have to change to SCROLLABLE
if (getTabMode() != MODE_FIXED) {
remeasureTabs();
}
}
@Override
protected void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
// Recheck content width in case some tabs have been added or removed while ScrollableTabLayout was invisible
// We don't have to check if it was GONE because then requestLayout() will be called
if (changedView == this) {
if (prevVisibility == View.INVISIBLE) {
remeasureTabs();
}
prevVisibility = visibility;
}
}
private void setMode(int mode) {
if (mode == getTabMode()) return;
setTabMode(mode);
}
/**
* Make ScrollableTabLayout not visible if there are less than two tabs
*/
private void hasMultipleTabs() {
if (getTabCount() > 1) {
setVisibility(View.VISIBLE);
} else {
setVisibility(View.GONE);
}
}
/**
* Calculate minimal width required by tabs and set tabMode accordingly
*/
private void remeasureTabs() {
if (prevVisibility != View.VISIBLE) return;
if (layoutWidth == 0) return;
final int count = getTabCount();
int contentWidth = 0;
for (int i = 0; i < count; i++) {
View child = getTabAt(i).view;
if (child.getVisibility() == View.VISIBLE) {
// Use tab's minimum requested width should actual content be too small
contentWidth += Math.max(child.getMinimumWidth(), child.getMeasuredWidth());
}
}
if (contentWidth > layoutWidth) {
setMode(TabLayout.MODE_SCROLLABLE);
} else {
setMode(TabLayout.MODE_FIXED);
}
}
}

View File

@@ -223,6 +223,7 @@ public class DownloadMission extends Mission {
conn.setInstanceFollowRedirects(true);
conn.setRequestProperty("User-Agent", DownloaderImpl.USER_AGENT);
conn.setRequestProperty("Accept", "*/*");
conn.setRequestProperty("Accept-Encoding", "*");
if (headRequest) conn.setRequestMethod("HEAD");

View File

@@ -80,7 +80,7 @@ public abstract class Postprocessing implements Serializable {
private transient DownloadMission mission;
private File tempFile;
private transient File tempFile;
Postprocessing(boolean reserveSpace, boolean worksOnSameFile, String algorithmName) {
this.reserveSpace = reserveSpace;
@@ -95,8 +95,12 @@ public abstract class Postprocessing implements Serializable {
public void cleanupTemporalDir() {
if (tempFile != null && tempFile.exists()) {
//noinspection ResultOfMethodCallIgnored
tempFile.delete();
try {
//noinspection ResultOfMethodCallIgnored
tempFile.delete();
} catch (Exception e) {
// nothing to do
}
}
}

View File

@@ -2,15 +2,10 @@ package us.shandian.giga.postprocessing;
import android.util.Log;
import org.schabi.newpipe.streams.SubtitleConverter;
import org.schabi.newpipe.streams.SrtFromTtmlWriter;
import org.schabi.newpipe.streams.io.SharpStream;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.text.ParseException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;
/**
* @author kapodamy
@@ -27,33 +22,16 @@ class TtmlConverter extends Postprocessing {
int process(SharpStream out, SharpStream... sources) throws IOException {
// check if the subtitle is already in srt and copy, this should never happen
String format = getArgumentAt(0, null);
boolean ignoreEmptyFrames = getArgumentAt(1, "true").equals("true");
if (format == null || format.equals("ttml")) {
SubtitleConverter ttmlDumper = new SubtitleConverter();
SrtFromTtmlWriter writer = new SrtFromTtmlWriter(out, ignoreEmptyFrames);
try {
ttmlDumper.dumpTTML(
sources[0],
out,
getArgumentAt(1, "true").equals("true"),
getArgumentAt(2, "true").equals("true")
);
writer.build(sources[0]);
} catch (Exception err) {
Log.e(TAG, "subtitle parse failed", err);
if (err instanceof IOException) {
return 1;
} else if (err instanceof ParseException) {
return 2;
} else if (err instanceof SAXException) {
return 3;
} else if (err instanceof ParserConfigurationException) {
return 4;
} else if (err instanceof XPathExpressionException) {
return 7;
}
return 8;
return err instanceof IOException ? 1 : 8;
}
return OK_RESULT;

View File

@@ -139,6 +139,9 @@ public class DownloadManager {
Log.d(TAG, "Loading pending downloads from directory: " + mPendingMissionsDir.getAbsolutePath());
}
File tempDir = pickAvailableTemporalDir(ctx);
Log.i(TAG, "using '" + tempDir + "' as temporal directory");
for (File sub : subs) {
if (!sub.isFile()) continue;
if (sub.getName().equals(".tmp")) continue;
@@ -184,7 +187,7 @@ public class DownloadManager {
if (mis.psAlgorithm != null) {
mis.psAlgorithm.cleanupTemporalDir();
mis.psAlgorithm.setTemporalDir(pickAvailableTemporalDir(ctx));
mis.psAlgorithm.setTemporalDir(tempDir);
}
mis.metadata = sub;
@@ -513,13 +516,21 @@ public class DownloadManager {
}
static File pickAvailableTemporalDir(@NonNull Context ctx) {
if (isDirectoryAvailable(ctx.getExternalFilesDir(null)))
return ctx.getExternalFilesDir(null);
else if (isDirectoryAvailable(ctx.getFilesDir()))
return ctx.getFilesDir();
File dir = ctx.getExternalFilesDir(null);
if (isDirectoryAvailable(dir)) return dir;
dir = ctx.getFilesDir();
if (isDirectoryAvailable(dir)) return dir;
// this never should happen
return ctx.getDir("tmp", Context.MODE_PRIVATE);
dir = ctx.getDir("muxing_tmp", Context.MODE_PRIVATE);
if (isDirectoryAvailable(dir)) return dir;
// fallback to cache dir
dir = ctx.getCacheDir();
if (isDirectoryAvailable(dir)) return dir;
throw new RuntimeException("Not temporal directories are available");
}
@Nullable

View File

@@ -5,6 +5,7 @@ import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
@@ -35,6 +36,8 @@ import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.Adapter;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.google.android.material.snackbar.Snackbar;
import org.schabi.newpipe.BuildConfig;
import org.schabi.newpipe.R;
import org.schabi.newpipe.extractor.NewPipe;
@@ -46,6 +49,7 @@ import java.io.File;
import java.lang.ref.WeakReference;
import java.net.URI;
import java.util.ArrayList;
import java.util.Iterator;
import us.shandian.giga.get.DownloadMission;
import us.shandian.giga.get.FinishedMission;
@@ -104,8 +108,12 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
private MenuItem mPauseButton;
private View mEmptyMessage;
private RecoverHelper mRecover;
private View mView;
private ArrayList<Mission> mHidden;
private Snackbar mSnackbar;
private final Runnable rUpdater = this::updater;
private final Runnable rDelete = this::deleteFinishedDownloads;
public MissionAdapter(Context context, @NonNull DownloadManager downloadManager, View emptyMessage, View root) {
mContext = context;
@@ -122,6 +130,10 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
mDeleter = new Deleter(root, mContext, this, mDownloadManager, mIterator, mHandler);
mView = root;
mHidden = new ArrayList<>();
checkEmptyMessageVisibility();
onResume();
}
@@ -522,7 +534,7 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
);
}
builder.setNegativeButton(android.R.string.ok, (dialog, which) -> dialog.cancel())
builder.setNegativeButton(R.string.finish, (dialog, which) -> dialog.cancel())
.setTitle(mission.storage.getName())
.create()
.show();
@@ -557,9 +569,50 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
);
}
public void clearFinishedDownloads() {
mDownloadManager.forgetFinishedDownloads();
applyChanges();
public void clearFinishedDownloads(boolean delete) {
if (delete && mIterator.hasFinishedMissions() && mHidden.isEmpty()) {
for (int i = 0; i < mIterator.getOldListSize(); i++) {
FinishedMission mission = mIterator.getItem(i).mission instanceof FinishedMission ? (FinishedMission) mIterator.getItem(i).mission : null;
if (mission != null) {
mIterator.hide(mission);
mHidden.add(mission);
}
}
applyChanges();
String msg = String.format(mContext.getString(R.string.deleted_downloads), mHidden.size());
mSnackbar = Snackbar.make(mView, msg, Snackbar.LENGTH_INDEFINITE);
mSnackbar.setAction(R.string.undo, s -> {
Iterator<Mission> i = mHidden.iterator();
while (i.hasNext()) {
mIterator.unHide(i.next());
i.remove();
}
applyChanges();
mHandler.removeCallbacks(rDelete);
});
mSnackbar.setActionTextColor(Color.YELLOW);
mSnackbar.show();
mHandler.postDelayed(rDelete, 5000);
} else if (!delete) {
mDownloadManager.forgetFinishedDownloads();
applyChanges();
}
}
private void deleteFinishedDownloads() {
if (mSnackbar != null) mSnackbar.dismiss();
Iterator<Mission> i = mHidden.iterator();
while (i.hasNext()) {
Mission mission = i.next();
if (mission != null) {
mDownloadManager.deleteMission(mission);
mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mission.storage.getUri()));
}
i.remove();
}
}
private boolean handlePopupItem(@NonNull ViewHolderItem h, @NonNull MenuItem option) {

View File

@@ -17,6 +17,7 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.Toast;
import androidx.annotation.NonNull;
@@ -189,10 +190,12 @@ public class MissionsFragment extends Fragment {
return true;
case R.id.clear_list:
AlertDialog.Builder prompt = new AlertDialog.Builder(mContext);
prompt.setTitle(R.string.clear_finished_download);
prompt.setTitle(R.string.clear_download_history);
prompt.setMessage(R.string.confirm_prompt);
prompt.setPositiveButton(android.R.string.ok, (dialog, which) -> mAdapter.clearFinishedDownloads());
prompt.setNegativeButton(R.string.cancel, null);
// Intentionally misusing button's purpose in order to achieve good order
prompt.setNegativeButton(R.string.clear_download_history, (dialog, which) -> mAdapter.clearFinishedDownloads(false));
prompt.setPositiveButton(R.string.delete_downloaded_files, (dialog, which) -> mAdapter.clearFinishedDownloads(true));
prompt.setNeutralButton(R.string.cancel, null);
prompt.create().show();
return true;
case R.id.start_downloads:

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z"/>
</vector>

View File

@@ -304,10 +304,9 @@
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:gravity="center"
android:text="@string/duration_live_button"
android:text="@string/duration_live"
android:textAllCaps="true"
android:textColor="?attr/colorAccent"
android:maxLength="4"
android:background="?attr/selectableItemBackground"
android:visibility="gone"/>
</LinearLayout>

View File

@@ -305,7 +305,7 @@
tools:text="English" />
<ImageButton
android:id="@+id/share"
android:id="@+id/kodi"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginLeft="4dp"
@@ -316,6 +316,25 @@
android:focusable="true"
android:padding="5dp"
android:scaleType="fitXY"
android:src="@drawable/ic_cast_white_24dp"
android:background="?attr/selectableItemBackground"
android:contentDescription="@string/play_with_kodi_title"
tools:ignore="RtlHardcoded"
android:visibility="visible"/>
<ImageButton
android:id="@+id/share"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="2dp"
android:layout_toLeftOf="@id/kodi"
android:layout_alignWithParentIfMissing="true"
android:layout_centerVertical="true"
android:clickable="true"
android:focusable="true"
android:padding="5dp"
android:scaleType="fitXY"
android:src="@drawable/ic_share_white_24dp"
android:background="?attr/selectableItemBackground"
android:contentDescription="@string/share"
@@ -423,10 +442,9 @@
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:gravity="center"
android:text="@string/duration_live_button"
android:text="@string/duration_live"
android:textAllCaps="true"
android:textColor="@android:color/white"
android:maxLength="4"
android:visibility="gone"
android:background="?attr/selectableItemBackground"
tools:ignore="HardcodedText,RtlHardcoded,RtlSymmetry" />

View File

@@ -303,7 +303,7 @@
tools:text="English" />
<ImageButton
android:id="@+id/share"
android:id="@+id/kodi"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginLeft="4dp"
@@ -314,6 +314,25 @@
android:focusable="true"
android:padding="5dp"
android:scaleType="fitXY"
android:src="@drawable/ic_cast_white_24dp"
android:background="?attr/selectableItemBackground"
android:contentDescription="@string/play_with_kodi_title"
tools:ignore="RtlHardcoded"
android:visibility="visible"/>
<ImageButton
android:id="@+id/share"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="2dp"
android:layout_toLeftOf="@id/kodi"
android:layout_alignWithParentIfMissing="true"
android:layout_centerVertical="true"
android:clickable="true"
android:focusable="true"
android:padding="5dp"
android:scaleType="fitXY"
android:src="@drawable/ic_share_white_24dp"
android:background="?attr/selectableItemBackground"
android:contentDescription="@string/share"
@@ -421,10 +440,9 @@
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:gravity="center"
android:text="@string/duration_live_button"
android:text="@string/duration_live"
android:textAllCaps="true"
android:textColor="@android:color/white"
android:maxLength="4"
android:visibility="gone"
android:background="?attr/selectableItemBackground"
tools:ignore="HardcodedText,RtlHardcoded,RtlSymmetry" />

View File

@@ -154,10 +154,9 @@
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:gravity="center"
android:text="@string/duration_live_button"
android:text="@string/duration_live"
android:textAllCaps="true"
android:textColor="?attr/colorAccent"
android:maxLength="4"
android:background="?attr/selectableItemBackground"
android:visibility="gone"/>
</LinearLayout>

View File

@@ -14,9 +14,7 @@
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.ActionBar"
app:titleTextAppearance="@style/Toolbar.Title">
</androidx.appcompat.widget.Toolbar>
app:titleTextAppearance="@style/Toolbar.Title"/>
<WebView
android:id="@+id/reCaptchaWebView"

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/playlist_name_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:importantForAutofill="no"
android:inputType="text"
android:maxLines="1"
android:layout_margin="10dp"
android:hint="@string/playlist_name_input"/>
</LinearLayout>

View File

@@ -6,12 +6,13 @@
android:layout_height="match_parent">
<com.google.android.material.tabs.TabLayout
<org.schabi.newpipe.views.ScrollableTabLayout
android:id="@+id/main_tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="?attr/colorPrimary"
app:tabMinWidth="60dp"
app:tabGravity="fill"/>
<androidx.viewpager.widget.ViewPager

View File

@@ -208,10 +208,9 @@
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:gravity="center_vertical"
android:text="@string/duration_live_button"
android:text="@string/duration_live"
android:textAllCaps="true"
android:textColor="@android:color/white"
android:maxLength="4"
android:visibility="gone"
android:background="?attr/selectableItemBackground"
tools:ignore="HardcodedText,RtlHardcoded,RtlSymmetry" />

View File

@@ -24,11 +24,6 @@
<item android:id="@+id/clear_list"
android:visible="false"
android:icon="?attr/ic_delete"
android:title="@string/clear_finished_download"
android:title="@string/clear_download_history"
app:showAsAction="ifRoom" />
<item android:id="@+id/action_settings"
android:title="@string/settings"
app:showAsAction="never" />
</menu>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_show_downloads"
android:orderInCategory="980"
android:title="@string/downloads"
app:showAsAction="never"/>
<item
android:id="@+id/action_history"
android:orderInCategory="981"
android:title="@string/action_history"
app:showAsAction="never"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="990"
android:title="@string/settings"
app:showAsAction="never"/>
</menu>

View File

@@ -1,16 +0,0 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="org.schabi.newpipe.about.AboutActivity">
<item android:id="@+id/action_show_downloads"
android:orderInCategory="980"
android:title="@string/downloads"
app:showAsAction="never"/>
<item android:id="@+id/action_settings"
android:orderInCategory="990"
android:title="@string/settings"
app:showAsAction="never"/>
</menu>

View File

@@ -4,11 +4,6 @@
xmlns:tools="http://schemas.android.com/tools"
tools:context=".fragments.list.impl.ChannelFragment">
<item
android:id="@+id/menu_item_openInBrowser"
android:title="@string/open_in_browser"
app:showAsAction="never"/>
<item
android:id="@+id/menu_item_rss"
android:icon="?attr/rss"
@@ -22,4 +17,16 @@
android:icon="?attr/share"
android:title="@string/share"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="1"
android:title="@string/settings"
app:showAsAction="never"/>
<item
android:id="@+id/menu_item_openInBrowser"
android:orderInCategory="2"
android:title="@string/open_in_browser"
app:showAsAction="never"/>
</menu>

View File

@@ -11,17 +11,17 @@
app:showAsAction="ifRoom"/>
<item android:id="@+id/action_settings"
android:orderInCategory="990"
android:orderInCategory="1"
android:title="@string/settings"
app:showAsAction="never"/>
<item android:id="@+id/action_system_audio"
android:orderInCategory="996"
android:orderInCategory="2"
android:title="@string/play_queue_audio_settings"
app:showAsAction="never"/>
<item android:id="@+id/action_switch_main"
android:orderInCategory="999"
android:orderInCategory="3"
android:title="@string/switch_to_main"
app:showAsAction="never"/>
</menu>

View File

@@ -3,11 +3,6 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<item
android:id="@+id/menu_item_openInBrowser"
android:title="@string/open_in_browser"
app:showAsAction="never"/>
<item
android:id="@+id/menu_item_share"
android:icon="?attr/share"
@@ -21,4 +16,16 @@
android:visible="true"
app:showAsAction="ifRoom"
tools:visible="true"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="1"
android:title="@string/settings"
app:showAsAction="never"/>
<item
android:id="@+id/menu_item_openInBrowser"
android:orderInCategory="2"
android:title="@string/open_in_browser"
app:showAsAction="never"/>
</menu>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_item_done"
android:title="@string/recaptcha_done_button"
android:icon="?attr/ic_done"
app:showAsAction="always"/>
</menu>

View File

@@ -14,8 +14,15 @@
android:title="@string/share"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="1"
android:title="@string/settings"
app:showAsAction="never"/>
<item
android:id="@+id/menu_item_openInBrowser"
android:orderInCategory="2"
android:title="@string/open_in_browser"
app:showAsAction="never"/>
</menu>

View File

@@ -20,7 +20,7 @@
<string name="download_path_summary">يتم تخزين ملفات الفيديو التي تم تنزيلها هنا</string>
<string name="download_path_title">مجلد تحميل الفيديو</string>
<string name="err_dir_create">"لا يمكن إنشاء مجلد للتنزيلات في '%1$s'"</string>
<string name="info_dir_created">دليل التنزيل الذي تم إنشاؤه \'%1$s\'</string>
<string name="info_dir_created">إنشاء دليل التحميل \'%1$s\'</string>
<string name="install">تثبيت</string>
<string name="kore_not_found">تطبيق Kore غير موجود. هل تريد تثبيته ؟</string>
<string name="light_theme_title">مضيء</string>
@@ -42,7 +42,7 @@
<string name="share">مشاركة</string>
<string name="share_dialog_title">مشاركة بواسطة</string>
<string name="show_next_and_similar_title">عرض مقاطع الفيديو \"التالية\" و \"المشابهة\"</string>
<string name="show_play_with_kodi_summary">عرض خيارات تشغيل الفيديو من خلال مركز كودي ميديا</string>
<string name="show_play_with_kodi_summary">اعرض خيار لتشغيل الفيديو عبر مركز وسائط Kodi</string>
<string name="show_play_with_kodi_title">عرض خيار التشغيل بواسطة كودي</string>
<string name="theme_title">السمة</string>
<string name="upload_date_text">تم النشر يوم %1$s</string>
@@ -57,7 +57,7 @@
<string name="general_error">خطأ</string>
<string name="parsing_error">تعذرت عملية تحليل الموقع</string>
<string name="youtube_signature_decryption_error">تعذر فك تشفير توقيع رابط الفيديو</string>
<string name="main_bg_subtitle">اضغط بحث للبدء</string>
<string name="main_bg_subtitle">انقر فوق بحث لتبدأ</string>
<string name="subscribe_button_title">اشتراك</string>
<string name="subscribed_button_title">مشترك</string>
<string name="tab_main">الرئيسية</string>
@@ -80,7 +80,7 @@
<string name="title_activity_history">التاريخ</string>
<string name="action_history">التاريخ</string>
<string name="open_in_popup_mode">فتح في وضع منبثق</string>
<string name="use_external_video_player_summary">إزالة الصوت في بعض مستوى الدقة</string>
<string name="use_external_video_player_summary">يزيل الصوت في بعض القرارات</string>
<string name="popup_mode_share_menu_title">وضع النوافذ المنبثقة NewPipe</string>
<string name="channel_unsubscribed">تم إلغاء الاشتراك في القناة</string>
<string name="subscription_change_failed">تعذر تغيير حالة الاشتراك</string>
@@ -117,7 +117,7 @@
<string name="playlist">قائمة التشغيل</string>
<string name="yes">نعم</string>
<string name="later">لاحقاً</string>
<string name="disabled">تعطيل</string>
<string name="disabled">متوقف</string>
<string name="filter">فلتر</string>
<string name="refresh">تحديث</string>
<string name="clear">تنظيف</string>
@@ -155,15 +155,15 @@
<string name="storage_permission_denied">تم رفض إذن الوصول إلى التخزين</string>
<string name="short_thousand">ألف</string>
<string name="short_million">مليون</string>
<string name="short_billion">G</string>
<string name="short_billion">B</string>
<string name="no_subscribers">ليس هناك مشترِكون</string>
<plurals name="subscribers">
<item quantity="zero">%s لا يوجد مشاركين</item>
<item quantity="zero">%s لا يوجد مشترك</item>
<item quantity="one">%s مشترك</item>
<item quantity="two">%s مشاريكان</item>
<item quantity="few">%s اشتراكات</item>
<item quantity="many">%s مشاركون</item>
<item quantity="other">%s اشتراك</item>
<item quantity="two">%s المشتركين</item>
<item quantity="few">%s المشتركين</item>
<item quantity="many">%s المشتركين</item>
<item quantity="other">%s المشتركين</item>
</plurals>
<string name="no_views">دون مشاهدات</string>
<string name="no_videos">لاتوجد فيديوهات</string>
@@ -187,7 +187,7 @@
<string name="no_available_dir">يرجى تحديد مجلد التنزيل لاحقا في الإعدادات</string>
<string name="msg_popup_permission">هذا الإذن مطلوب
\nللفتح في وضع النافذة المنبثقة</string>
<string name="reCaptchaActivity">اختبار reCAPTCHA</string>
<string name="recaptcha">اختبار reCAPTCHA</string>
<string name="settings_file_charset_title">السماح بالرموز في أسماء الملفات</string>
<string name="settings_file_replacement_character_summary">يتم استبدال الرموز غير المسموح بها بهذه القيمة</string>
<string name="settings_file_replacement_character_title">استبدال الحرف</string>
@@ -200,7 +200,7 @@
<string name="action_open_website">فتح الموقع</string>
<string name="tab_contributors">المساهمون</string>
<string name="tab_licenses">التراخيص</string>
<string name="app_description">تطبيق مجاني خفيف الوزن وبث حي على نظام أندرويد.</string>
<string name="app_description">تطبيق مجاني خفيف البث على أندرويد.</string>
<string name="contribution_title">ساهم</string>
<string name="contribution_encouragement">إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية ، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل !</string>
<string name="view_on_github">عرض على GitHub</string>
@@ -235,23 +235,23 @@
<string name="play_queue_audio_settings">الإعدادات الصوتية</string>
<string name="start_here_on_main">تشغيل هنا</string>
<string name="start_here_on_popup">بدأ التشغيل في نافذة منبثقة جديدة</string>
<string name="reCaptcha_title">تحدي الكابتشا</string>
<string name="title_activity_recaptcha">تحدي الكابتشا</string>
<string name="hold_to_append">ضغط مطول للإدراج الى قائمة الانتظار</string>
<plurals name="views">
<item quantity="zero">%s بدون مشهد</item>
<item quantity="one">%s شاهد</item>
<item quantity="two">%s مشاهدتان</item>
<item quantity="few">%s مشاهدات</item>
<item quantity="many">%s مشاهدون</item>
<item quantity="other">%s شاهدو</item>
<item quantity="zero">%s بدون مشهادة</item>
<item quantity="one">%s مشاهدة</item>
<item quantity="two">%s مشاهدة</item>
<item quantity="few">%s مشاهدة</item>
<item quantity="many">%s مشاهدة</item>
<item quantity="other">%s مشاهدة</item>
</plurals>
<plurals name="videos">
<item quantity="zero">فيديو%s video</item>
<item quantity="one">%s videosفيديوهات</item>
<item quantity="two">%s videosفيديوهات</item>
<item quantity="few">%s videosفيديوهات</item>
<item quantity="many">%s videosفيديوهات</item>
<item quantity="other">%s videosفيديوهات</item>
<item quantity="zero">%s فيديو</item>
<item quantity="one">%s أشرطة فيديو</item>
<item quantity="two">%s أشرطة فيديو</item>
<item quantity="few">%s أشرطة فيديو</item>
<item quantity="many">%s أشرطة فيديو</item>
<item quantity="other">%s أشرطة فيديو</item>
</plurals>
<string name="recaptcha_request_toast">طلب اختبار الكابتشا مطلوب</string>
<string name="copyright" formatted="true">© %1$sبواسطة%2$sتحت%3$s</string>
@@ -425,8 +425,8 @@
<string name="app_update_notification_channel_name">تتبيه تحديث التطبيق</string>
<string name="volume_gesture_control_title">إيماءة التحكم بالصوت</string>
<string name="events">الأحداث</string>
<string name="app_update_notification_channel_description">"تنبيه عند تواجد إصدار جديد newpipe "</string>
<string name="download_to_sdcard_error_title">وحدة التخزين الخارجية غير متاحة</string>
<string name="app_update_notification_channel_description">الإخطارات لإصدار NewPipe الجديد</string>
<string name="download_to_sdcard_error_title">وحدة التخزين الخارجية غير متوفرة</string>
<string name="download_to_sdcard_error_message">"التنزيل على بطاقة SD الخارجية غير ممكن. إعادة تعيين موقع مجلد التحميل؟"</string>
<string name="saved_tabs_invalid_json">باستخدام علامات التبويب الافتراضية ، خطأ أثناء قراءة علامات التبويب المحفوظة</string>
<string name="restore_defaults">استعادة الضبط الافتراضي</string>
@@ -449,7 +449,7 @@
<string name="paused">متوقف</string>
<string name="queued">في قائمة الانتظار</string>
<string name="post_processing">قيد المعالجة</string>
<string name="enqueue">قائمه انتظار</string>
<string name="enqueue">طابور</string>
<string name="permission_denied">تم رفضها من قبل النظام</string>
<string name="download_failed">فشل التنزيل</string>
<string name="download_finished">تم الانتهاء من التحميل</string>
@@ -504,7 +504,7 @@
<string name="error_insufficient_storage">لم يتبقى مساحة في الجهاز</string>
<string name="error_progress_lost">تم فقد التقدم بسبب حذف الملف</string>
<string name="error_timeout">انتهى وقت الاتصال</string>
<string name="confirm_prompt">هل أنت واثق؟</string>
<string name="confirm_prompt">هل تريد محو سجل التنزيل أو حذف جميع الملفات التي تم تنزيلها؟</string>
<string name="enable_queue_limit">حد قائمة انتظار التنزيل</string>
<string name="enable_queue_limit_desc">سيتم تشغيل تنزيل واحد في نفس الوقت</string>
<string name="start_downloads">بدء التنزيلات</string>
@@ -524,4 +524,46 @@
<string name="no_one_watching">لاتوجد مشاهدة</string>
<string name="no_one_listening">لا أحد يستمع</string>
<string name="localization_changes_requires_app_restart">ستتغير اللغة بمجرد إعادة تشغيل التطبيق.</string>
<plurals name="watching">
<item quantity="zero">مشاهد</item>
<item quantity="one">مشاهدة</item>
<item quantity="two">مشاهدة</item>
<item quantity="few">مشاهدات</item>
<item quantity="many">مشاهدات</item>
<item quantity="other">مشاهدات</item>
</plurals>
<plurals name="listening">
<item quantity="zero">مستمع</item>
<item quantity="one">مستمع</item>
<item quantity="two">مستمعين</item>
<item quantity="few">مستمعين</item>
<item quantity="many">مستمعين</item>
<item quantity="other">مستمعين</item>
</plurals>
<string name="seek_duration_title">تسريع إلى الأمام/-ترجيع وقت البحث</string>
<string name="peertube_instance_url_title">مثيلات خوادم پيرتيوب</string>
<string name="peertube_instance_url_summary">حدد مثيلات PeerTube المفضلة لديك</string>
<string name="peertube_instance_add_title">إضافة نموذج</string>
<string name="peertube_instance_add_help">أدخل عنوان URL للمثيل</string>
<string name="peertube_instance_add_fail">لا يمكن التحقق من صحة المثال</string>
<string name="peertube_instance_add_https_only">يتم دعم عناوين URL HTTPS فقط</string>
<string name="peertube_instance_add_exists">مثيل الخادم موجود بالفعل</string>
<string name="local">محلي</string>
<string name="recently_added">أضيف مؤخرا</string>
<string name="most_liked">الأكثر إعجابا</string>
<string name="playlist_no_uploader">تم إنشاؤه-تلقائيًا (لم يتم العثور على برنامج تحميل)</string>
<string name="recovering">استرد</string>
<string name="error_download_resource_gone">لا يمكن استرداد هذا التنزيل</string>
<string name="choose_instance_prompt">اختيار مثيل</string>
<string name="peertube_instance_url_help">ابحث عن الحالات التي تناسبك على %s</string>
<string name="enable_lock_screen_video_thumbnail_title">تمكين قفل شاشة الصور المصغرة الفيديو</string>
<string name="enable_lock_screen_video_thumbnail_summary">عند استخدام مشغل الخلفية ، سيتم عرض صورة مصغرة للفيديو على شاشة القفل</string>
<string name="clear_download_history">تنظيف تاريخ التحميل</string>
<string name="delete_downloaded_files">حذف الملفات التي تم تنزيلها</string>
<string name="deleted_downloads">التنزيلات %1$s المحذوفة</string>
<string name="permission_display_over_apps">إعطاء إذن لعرضه على التطبيقات الأخرى</string>
<string name="app_language_title">لغة التطبيق</string>
<string name="systems_language">النظام الافتراضي</string>
<string name="subtitle_activity_recaptcha">اضغط على \"تم\" عند حلها</string>
<string name="recaptcha_done_button">منجز</string>
</resources>

View File

@@ -58,8 +58,8 @@
<string name="short_billion">Mil mill.</string>
<string name="msg_popup_permission">Precísase esti permisu
\np\'abrir nel mou ventanu</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="reCaptcha_title">Retu de reCAPTCHA</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="title_activity_recaptcha">Retu de reCAPTCHA</string>
<string name="recaptcha_request_toast">Solicitóse\'l retu de reCAPTCHA</string>
<string name="controls_background_title">En segundu planu</string>
<string name="controls_popup_title">Ventanu</string>
@@ -206,7 +206,7 @@
<string name="caption_setting_title">Sotítulos</string>
<string name="accept">Aceutar</string>
<string name="restore_defaults_confirmation">¿Quies reafitar los valores\?</string>
<string name="error_unknown_host"></string>
<string name="error_unknown_host"/>
<string name="error_http_unsupported_range">El sirvidor nun aceuta descargues multifilu, volvi probar con @string/msg_threads = 1</string>
<string name="no_comments">Nun hai comentarios</string>
<string name="settings_category_clear_data_title">Llimpieza de datos</string>
@@ -243,4 +243,18 @@
<string name="enable_playback_resume_title">Siguir cola reproducción</string>
<string name="main_page_content_summary">Les llingüetes que s\'amuesen na páxina principal</string>
<string name="downloads_storage_ask_title">Entrugar ánde baxar</string>
</resources>
<string name="downloads">Descargues</string>
<string name="downloads_title">Descargues</string>
<plurals name="videos">
<item quantity="one">Vídeos</item>
<item quantity="other"></item>
</plurals>
<string name="player_gesture_controls_title">Control per xestos del reproductor</string>
<string name="preferred_player_fetcher_notification_message">Cargando\'l conteníu solicitáu</string>
<string name="privacy_policy_title">Política de Privacidá de NewPipe</string>
<string name="volume_gesture_control_title">Control per xestos del volume</string>
<string name="brightness_gesture_control_title">Control per xestos del brilléu</string>
<string name="error_file_creation">El ficheru nun pue crease</string>
<string name="error_http_no_content">El sirvidor nun unvia datos</string>
<string name="localization_changes_requires_app_restart">La llingua va camudar namái que se reanicie l\'aplicación.</string>
</resources>

View File

@@ -6,7 +6,7 @@
<string name="open_in_browser">在浏览器中打开</string>
<string name="open_in_popup_mode">在悬浮窗模式下打开</string>
<string name="did_you_mean">您是不是要找:%1$s</string>
<string name="no_player_found_toast">找不到串流播放器 (您可以安裝并使用VLC播放)。</string>
<string name="no_player_found_toast">找不到串流播放器 (您可以安装 VLC 进行播放)。</string>
<string name="controls_download_desc">下载串流文件</string>
<string name="install">安装</string>
<string name="cancel">取消</string>
@@ -16,7 +16,7 @@
<string name="settings">设置</string>
<string name="share_dialog_title">分享给...</string>
<string name="choose_browser">选择浏览器</string>
<string name="download_path_title">视频下载文件夹</string>
<string name="download_path_title">视频下载路径</string>
<string name="download_path_summary">已下载的视频存储在这里</string>
<string name="download_path_dialog_title">请选择下载视频的保存位置</string>
<string name="download_path_audio_summary">已下载的音频存储在这里</string>
@@ -39,10 +39,10 @@
<string name="network_error">网络错误</string>
<plurals name="videos">
<item quantity="one">视频</item>
<item quantity="other"></item>
<item quantity="other"/>
</plurals>
<string name="disabled">禁用</string>
<string name="controls_background_title">背景</string>
<string name="controls_background_title">后台播放</string>
<string name="filter">过滤器</string>
<string name="refresh">刷新</string>
<string name="show_search_suggestions_title">搜索建议</string>
@@ -110,7 +110,7 @@
<string name="msg_running_detail">点击了解详情</string>
<string name="msg_wait">请稍候…</string>
<string name="msg_copied">复制至剪贴板</string>
<string name="reCaptchaActivity">reCAPTCHA验证码</string>
<string name="recaptcha">reCAPTCHA验证码</string>
<string name="controls_popup_title">悬浮窗播放</string>
<string name="title_activity_about">关于NewPipe</string>
<string name="action_settings">设置</string>
@@ -130,7 +130,7 @@
<string name="search_no_results">没有结果</string>
<string name="no_subscribers">没有订阅者</string>
<plurals name="subscribers">
<item quantity="one">%s订阅者</item>
<item quantity="one">%s订阅者</item>
<item quantity="other"/>
</plurals>
<string name="no_videos">没有视频</string>
@@ -148,7 +148,7 @@
<string name="missions_header_pending">等待中…</string>
<string name="paused">已暂停</string>
<string name="queued">排队中</string>
<string name="enqueue">加入队列</string>
<string name="enqueue">加入队列</string>
<string name="permission_denied">操作已被系统拒绝</string>
<string name="download_failed">下载失败</string>
<string name="download_finished">下载完成</string>
@@ -157,10 +157,10 @@
<string name="drawer_header_description">切换服务,当前选择:</string>
<string name="no_player_found">找不到串流播放器。您想安装 VLC 吗?</string>
<string name="screen_rotation">旋转</string>
<string name="use_external_video_player_title">使用第三方视频播放器</string>
<string name="use_external_audio_player_title">使用第三方视频播放器</string>
<string name="use_external_video_player_title">使用外部视频播放器</string>
<string name="use_external_audio_player_title">使用外部音频播放器</string>
<string name="download_path_audio_title">音频下载文件夹</string>
<string name="autoplay_by_calling_app_summary">从其他应用打开 NewPipe 时播放视频</string>
<string name="autoplay_by_calling_app_summary">从其他应用调用 NewPipe 时播放视频</string>
<string name="default_resolution_title">默认分辨率</string>
<string name="kore_not_found">找不到Kore。是否安装</string>
<string name="show_play_with_kodi_title">显示“用Kodi播放”选项</string>
@@ -180,7 +180,7 @@
<string name="error_report_title">错误报告</string>
<string name="general_error">错误</string>
<string name="could_not_load_thumbnails">无法加载所有缩略图</string>
<string name="youtube_signature_decryption_error">无法解密视频 URL 签名</string>
<string name="youtube_signature_decryption_error">无法解密视频 URL 签名</string>
<string name="parsing_error">无法解析网址</string>
<string name="light_parsing_error">无法完全解析网址</string>
<string name="content_not_available">内容不可用</string>
@@ -207,9 +207,9 @@
<string name="no_available_dir">请稍后在设置中设定下载目录</string>
<string name="msg_popup_permission">用悬浮窗模式
\n需要此权限</string>
<string name="reCaptcha_title">reCAPTCHA验证</string>
<string name="title_activity_recaptcha">reCAPTCHA验证</string>
<string name="recaptcha_request_toast">请求的新的CAPTCHA验证</string>
<string name="popup_mode_share_menu_title">NewPipe悬浮窗模式</string>
<string name="popup_mode_share_menu_title">NewPipe 悬浮窗模式</string>
<string name="popup_playing_toast">在悬浮窗中播放</string>
<string name="default_popup_resolution_title">默认悬浮窗分辨率</string>
<string name="show_higher_resolutions_title">使用更高的分辨率</string>
@@ -219,7 +219,7 @@
<string name="popup_remember_size_pos_summary">记住最后一次使用悬浮窗的大小和位置</string>
<string name="settings_category_popup_title">悬浮窗</string>
<string name="popup_resizing_indicator_title">调整大小</string>
<string name="use_external_video_player_summary">删除“某些”分辨率的音频</string>
<string name="use_external_video_player_summary">隐藏部分没有音频的分辨率</string>
<string name="player_gesture_controls_title">播放器手势控制</string>
<string name="player_gesture_controls_summary">使用手势控制播放器的亮度和音量</string>
<string name="show_search_suggestions_summary">显示搜索建议</string>
@@ -234,9 +234,9 @@
<string name="channel_unsubscribed">取消订阅频道</string>
<string name="subscription_change_failed">无法修改订阅</string>
<string name="subscription_update_failed">无法更新订阅</string>
<string name="tab_main">主页</string>
<string name="tab_main">主页</string>
<string name="tab_subscriptions">订阅</string>
<string name="fragment_whats_new">增功能</string>
<string name="fragment_whats_new"></string>
<string name="resume_on_audio_focus_gain_title">恢复前台焦点</string>
<string name="resume_on_audio_focus_gain_summary">中断后继续播放(例如突然来电后)</string>
<string name="enable_search_history_title">搜索历史记录</string>
@@ -321,7 +321,7 @@
<string name="could_not_import_all_files">警告:无法导入所有文件。</string>
<string name="override_current_data">这将覆盖当前设置。</string>
<string name="show_info">显示信息</string>
<string name="tab_bookmarks">已收藏</string>
<string name="tab_bookmarks">书签</string>
<string name="delete_stream_history_prompt">确定要从观看历史记录中删除该项吗?</string>
<string name="delete_all_history_prompt">是否确实要从历史记录中删除所有项目?</string>
<string name="title_last_played">最后播放</string>
@@ -410,13 +410,13 @@
<string name="privacy_policy_encouragement">NewPipe 项目非常重视您的隐私。因此,未经您的同意,应用程序不会收集任何数据。
\nNewPipe 的隐私政策详细解释了在发送崩溃报告时发送和存储的数据。</string>
<string name="read_privacy_policy">阅读隐私政策</string>
<string name="start_accept_privacy_policy">为了遵守欧洲一般数据保护条例 GDPR我们提请您注意 NewPipe 的隐私政策。请仔细阅读。
\n您必须接受它才能向我们发送错误报告。</string>
<string name="start_accept_privacy_policy">为了遵守欧盟的《通用数据保护条例GDPR我们特此提醒您注意 NewPipe 的隐私政策。请仔细阅读。
\n您必须在同意以后才能向我们发送错误报告。</string>
<string name="accept">接受</string>
<string name="decline">拒绝</string>
<string name="limit_data_usage_none_description">无限制</string>
<string name="limit_mobile_data_usage_title">使用移动数据时限制分辨率</string>
<string name="minimize_on_exit_title">切换应用时最小化</string>
<string name="minimize_on_exit_title">退出应用时最小化</string>
<string name="minimize_on_exit_summary">从主播放器切换到其他应用时的操作 - %s</string>
<string name="skip_silence_checkbox">静音时快进</string>
<string name="playback_step">滑块[比例尺]</string>
@@ -483,11 +483,11 @@
<string name="overwrite_finished_warning">命名冲突,已存在具有此名称文件</string>
<string name="overwrite_failed">无法覆盖文件</string>
<string name="download_already_pending">有此名称的已暂停下载</string>
<string name="error_postprocessing_stopped">处理文件时,NewPipe 关闭</string>
<string name="error_postprocessing_stopped">NewPipe 在处理文件时被关闭</string>
<string name="error_insufficient_storage">设备上没有剩余储存空间</string>
<string name="error_progress_lost">进度丢失,文件已被删除</string>
<string name="error_timeout">连接超时</string>
<string name="confirm_prompt">你确定吗</string>
<string name="confirm_prompt">是否要清除下载历史记录或删除所有下载的文件</string>
<string name="enable_queue_limit">最大下载队列</string>
<string name="enable_queue_limit_desc">同时只允许一个下载进行</string>
<string name="start_downloads">开始下载</string>
@@ -504,15 +504,37 @@
<string name="delete_playback_states_alert">删除所有播放位置记录?</string>
<string name="download_choose_new_path">更改下载目录让内容生效</string>
<string name="default_kiosk_page_summary">『时下流行』页-默认</string>
<string name="no_one_watching">人在线观看</string>
<string name="no_one_watching">没有人在观看</string>
<plurals name="watching">
<item quantity="one">%s 人在观看</item>
<item quantity="other"></item>
<item quantity="other"/>
</plurals>
<string name="no_one_listening">没人在听</string>
<string name="no_one_listening">人在听</string>
<plurals name="listening">
<item quantity="one">s个听众</item>
<item quantity="one">s 人在听</item>
<item quantity="other"/>
</plurals>
<string name="localization_changes_requires_app_restart">重新启动应用后,语言将更改。</string>
<string name="peertube_instance_url_title">PeerTube 服务器</string>
<string name="peertube_instance_url_summary">设置自己喜欢的PeerTube服务器</string>
<string name="peertube_instance_url_help">查找最适合你的服务器%s</string>
<string name="peertube_instance_add_title">添加服务器</string>
<string name="peertube_instance_add_help">输入服务器网址(URL)</string>
<string name="peertube_instance_add_fail">无法验证服务器</string>
<string name="peertube_instance_add_https_only">仅支持 HTTPS和URL</string>
<string name="peertube_instance_add_exists">该服务器已存在</string>
<string name="local">本地</string>
<string name="recently_added">最近添加</string>
<string name="most_liked">最喜欢的</string>
<string name="playlist_no_uploader">自动生成的(未找到上传者)</string>
<string name="recovering">正在恢复</string>
<string name="error_download_resource_gone">无法恢复此下载</string>
<string name="choose_instance_prompt">选择一个服务器</string>
<string name="seek_duration_title">快进 / 快退的单位时间</string>
<string name="enable_lock_screen_video_thumbnail_title">在锁屏上显示视频缩略图</string>
<string name="enable_lock_screen_video_thumbnail_summary">在后台播放时,锁屏上将会显示视频的缩略图</string>
<string name="clear_download_history">清除下载历史记录</string>
<string name="delete_downloaded_files">删除下载了的文件</string>
<string name="deleted_downloads">已删除 %1$s 下载</string>
<string name="permission_display_over_apps">授予在其他应用上层显示的权限</string>
</resources>

View File

@@ -247,8 +247,8 @@
<string name="msg_popup_permission">Гэтае разрозненне трэба для
\nпрайгравання ў акне</string>
<string name="one_item_deleted">1 элемент выдалены.</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="reCaptcha_title">Запыт reCAPTCHA</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="title_activity_recaptcha">Запыт reCAPTCHA</string>
<string name="recaptcha_request_toast">Запытаны ўвод reCAPTCHA</string>
<string name="settings_category_downloads_title">Загрузкі</string>
<string name="settings_file_charset_title">Дапушчальныя сімвалы назвы файлаў</string>

View File

@@ -269,8 +269,8 @@
<string name="msg_popup_permission">Това разрешение се изисква за
\nвъзпроизвеждане в отделен прозорец</string>
<string name="one_item_deleted">1 елемент е изтрит.</string>
<string name="reCaptchaActivity">преКАПЧА</string>
<string name="reCaptcha_title">reCAPTCHA заявка</string>
<string name="recaptcha">преКАПЧА</string>
<string name="title_activity_recaptcha">reCAPTCHA заявка</string>
<string name="recaptcha_request_toast">Изисква се въвеждане на reCAPTCHA</string>
<string name="settings_category_downloads_title">Изтегляне</string>
<string name="charset_most_special_characters">Повечето специални символи</string>

View File

@@ -1,12 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="main_bg_subtitle">শুরু করতে অনুসন্ধান এ আলতো চাপ</string>
<string name="main_bg_subtitle">অনুসন্ধান এ চাপ দিয়ে শুরু করুন</string>
<string name="view_count_text">"%1$s জন দেখছে"</string>
<string name="upload_date_text">প্রকাশকাল %1$s</string>
<string name="no_player_found">কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি। তুমি কি VLC ইনস্টল করতে চাও?</string>
<string name="no_player_found">কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি। VLC ইনস্টল করতে চাও\?</string>
<string name="install">ইনস্টল</string>
<string name="cancel">বাদ দিন</string>
<!-- <string name="fdroid_vlc_url" translatable="false">https://f-droid.org/repository/browse/?fdfilter=vlc&amp;fdid=org.videolan.vlc</string> -->
<string name="open_in_browser">ব্রাউজারে ওপেন করো</string>
<string name="open_in_popup_mode">পপ-আপ মোডে ওপেন করো</string>
<string name="share">শেয়ার</string>
@@ -16,13 +15,13 @@
<string name="did_you_mean">আপনি কি বুঝিয়েছেনঃ %1$s ?</string>
<string name="share_dialog_title">শেয়ার করুন</string>
<string name="choose_browser">ব্রাউজার বাছাই করুন</string>
<string name="screen_rotation">রোটেশ</string>
<string name="screen_rotation">ঘূর্ণ</string>
<string name="use_external_video_player_title">বাইরের ভিডিও প্লেয়ার ব্যবহার করুন</string>
<string name="use_external_audio_player_title">বহির্গত অডিও প্লেয়ার ব্যবহার করুন</string>
<string name="popup_mode_share_menu_title">NewPipe পপআপ মোড</string>
<string name="popup_mode_share_menu_title">পপআপ মোড</string>
<string name="controls_background_title">ব্যাকগ্রাউন্ড</string>
<string name="controls_popup_title">পপআপ</string>
<string name="download_path_title">ভিডিও ডাউনলোড করার পাথ</string>
<string name="download_path_title">ভিডিও ডাউনলোড করার ফোল্ডার</string>
<string name="download_path_summary">ডাউনলোড করা ভিডিওগুলো রাখার ফোল্ডার</string>
<string name="download_path_dialog_title">ভিডিওগুলির জন্য ডাউনলোডের পাথ প্রবেশ করাও</string>
<string name="download_path_audio_title">অডিও ডাউনলোড পাথ</string>
@@ -36,7 +35,6 @@
<string name="show_higher_resolutions_summary">শুধুমাত্র কিছু ডিভাইস 2k / 4k ভিডিও চালানোয় সমর্থন</string>
<string name="play_with_kodi_title">Kodi এর মাধ্যমে চালাও</string>
<string name="kore_not_found">Kore অ্যাপ্লিকেশন খুঁজে পাওয়া যায়নি। Kore ইনস্টল করবে?</string>
<!-- <string name="fdroid_kore_url" translatable="false">https://f-droid.org/repository/browse/?fdfilter=Kore&amp;fdid=org.xbmc.kore</string> -->
<string name="show_play_with_kodi_title">দেখাও \"Kodi এর মাধ্যমে চালাও \" বিকল্প</string>
<string name="show_play_with_kodi_summary">Kodi মিডিয়া সেন্টারে এর মাধ্যমে ভিডিও প্লে করার জন্য একটি বিকল্প প্রদর্শন কর</string>
<string name="play_audio">অডিও</string>
@@ -57,10 +55,8 @@
<string name="settings_category_popup_title">পপআপ</string>
<string name="settings_category_appearance_title">অ্যাপিয়ারেন্স</string>
<string name="settings_category_other_title">অন্যান্য</string>
<!-- <string name="background_player_time_text" translatable="false">%1$s - NewPipe</string> -->
<string name="background_player_playing_toast">ব্যাকগ্রাউন্ডে চলছে</string>
<string name="popup_playing_toast">পপআপ মোডে চলছে</string>
<!-- <string name="c3s_url" translatable="false">https://www.c3s.cc/</string> -->
<string name="play_btn_text">চালাও</string>
<string name="content">কন্টেন্ট</string>
<string name="show_age_restricted_content_title">বয়স সীমাবদ্ধ কন্টেন্ট দেখাও</string>
@@ -93,7 +89,6 @@
<string name="app_ui_crash">অ্যাপ / UI ক্র্যাশ করেছে</string>
<!-- error activity -->
<string name="sorry_string">দুঃখিত, এটা ঘটা উচিত ছিল না।</string>
<!-- <string name="guru_meditation" translatable="false">Guru Meditation.</string> -->
<string name="error_report_button_text">মেইলের মাধ্যমে ত্রুটি প্রতিবেদন করো</string>
<string name="error_snackbar_message">দুঃখিত, কিছু ত্রুটি ঘটেছে।</string>
<string name="error_snackbar_action">প্রতিবেদন</string>
@@ -142,11 +137,8 @@
<string name="msg_copied">ক্লিপবোর্ডে অনুলিপি করা হয়েছে।</string>
<string name="no_available_dir">অনুগ্রহ করে একটি উপলব্ধ ডাউনলোড ডিরেক্টরি নির্বাচন করো।</string>
<string name="msg_popup_permission">এই অনুমতিটি পপআপ মোডে খুলতে প্রয়োজন</string>
<!-- Checksum types -->
<!-- <string name="md5" translatable="false">MD5</string> -->
<!-- <string name="sha1" translatable="false">SHA1</string> -->
<string name="reCaptchaActivity">রিক্যাপচা</string>
<string name="reCaptcha_title">reCAPTCHA চ্যালেঞ্জ</string>
<string name="recaptcha">রিক্যাপচা</string>
<string name="title_activity_recaptcha">reCAPTCHA চ্যালেঞ্জ</string>
<string name="recaptcha_request_toast">reCAPTCHA চ্যালেঞ্জ অনুরোধ করা হয়েছে</string>
<!-- End of GigaGet's Strings -->
<string name="info_labels">কি:\\nঅনুরোধ:\\nকন্টেন্ট ভাষা:\\nসার্ভিস:\\nসময়(GMT এ):\\nপ্যাকেজ:\\nসংস্করণ:\\nওএস সংস্করণ:\\nআইপি পরিসর:</string>
@@ -171,7 +163,7 @@
<string name="action_open_website">ওয়েব সাইট খুলুন</string>
<string name="website_title">ওয়েব সাইট</string>
<string name="no_player_found_toast">কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি (প্লে করতে VLC ইন্সটল করতে পারেন)</string>
<string name="use_external_video_player_summary">কিছু রেজোলিউশনে ভিডিওর অডিও কাজ করে না</string>
<string name="use_external_video_player_summary">কিছু কিছু রেজোলিউশনে অডিও বন্ধ করে দেয়</string>
<string name="subscribe_button_title">সাবস্ক্রাইব</string>
<string name="subscribed_button_title">সাবস্ক্রাইব করা আছে</string>
<string name="channel_unsubscribed">চ্যানেল থেকে আনসাবস্ক্রাইব্ড</string>
@@ -183,4 +175,5 @@
<string name="use_inexact_seek_title">দ্রুত টানা ব্যাবহার করুন</string>
<string name="unsubscribe">আনসাবস্ক্রাইব</string>
<string name="tab_new">নতুন ট্যাব</string>
<string name="tab_choose">ট্যাব পছন্দ করুন</string>
</resources>

View File

@@ -67,7 +67,7 @@
<string name="finish">D\'acord</string>
<string name="msg_name">Nom de fitxer</string>
<string name="msg_error">Error</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="settings_category_downloads_title">Baixades</string>
<string name="action_settings">Paràmetres</string>
<string name="action_about">Quant a</string>
@@ -307,7 +307,7 @@
<string name="msg_running_detail">Feu un toc aquí per a més detalls</string>
<string name="no_available_dir">Defineix una carpeta de baixades més endavant als paràmetres</string>
<string name="msg_popup_permission">Es necessita aquest permís per a obrir el mode emergent</string>
<string name="reCaptcha_title">Camp reCAPTCHA</string>
<string name="title_activity_recaptcha">Camp reCAPTCHA</string>
<string name="recaptcha_request_toast">S\'ha sol·licitat l\'emplenament d\'un camp reCAPTCHA</string>
<string name="settings_file_replacement_character_summary">Se substituiran els caràcters no vàlids amb aquest valor</string>
<string name="settings_file_replacement_character_title">Caràcter de substitució</string>

View File

@@ -1,504 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="main_bg_subtitle">点击搜索按钮即可开始使用</string>
<string name="view_count_text">%1$s 次观看</string>
<string name="upload_date_text">发布于 %1$s</string>
<string name="no_player_found">找不到媒体播放器。您要安装 VLC 吗?</string>
<string name="no_player_found_toast">找不到媒体播放器(您可以安装 VLC 来播放)。</string>
<string name="install">安装</string>
<string name="cancel">取消</string>
<string name="open_in_browser">在浏览器中打开</string>
<string name="open_in_popup_mode">在悬浮窗模式下打开</string>
<string name="share">分享</string>
<string name="download">下载</string>
<string name="controls_download_desc">下载媒体文件</string>
<string name="search">搜索</string>
<string name="settings">设置</string>
<string name="did_you_mean">您是不是要找:%1$s</string>
<string name="share_dialog_title">分享至</string>
<string name="choose_browser">选择浏览器</string>
<string name="screen_rotation">旋转</string>
<string name="use_external_video_player_title">使用外部视频播放器</string>
<string name="use_external_video_player_summary">删除某些分辨率下的音频</string>
<string name="use_external_audio_player_title">使用外部音频播放器</string>
<string name="popup_mode_share_menu_title">NewPipe 悬浮窗模式</string>
<string name="subscribe_button_title">订阅</string>
<string name="subscribed_button_title">已订阅</string>
<string name="channel_unsubscribed">退订成功</string>
<string name="subscription_change_failed">无法更改订阅</string>
<string name="subscription_update_failed">无法更新订阅</string>
<string name="show_info">显示信息</string>
<string name="tab_main">主页</string>
<string name="tab_subscriptions">订阅</string>
<string name="tab_bookmarks">已添加书签到播放列表</string>
<string name="fragment_whats_new">新功能</string>
<string name="controls_background_title">转到后台</string>
<string name="controls_popup_title">悬浮窗</string>
<string name="controls_add_to_playlist_title">添加到</string>
<string name="download_path_title">视频下载文件夹</string>
<string name="download_path_summary">已下载的视频储存在此处</string>
<string name="download_path_dialog_title">选择视频文件的下载文件夹</string>
<string name="download_path_audio_title">音频下载文件夹</string>
<string name="download_path_audio_summary">已下载的音频存储在此处</string>
<string name="download_path_audio_dialog_title">选择音频文件的下载文件夹</string>
<string name="autoplay_by_calling_app_title">自动播放</string>
<string name="autoplay_by_calling_app_summary">NewPipes被其它程序调用时播放视频</string>
<string name="default_resolution_title">默认分辨率</string>
<string name="default_popup_resolution_title">默认悬浮窗分辨率</string>
<string name="show_higher_resolutions_title">显示更高的分辨率</string>
<string name="show_higher_resolutions_summary">只有部分设备支持播放 2K/4K 视频</string>
<string name="play_with_kodi_title">用 Kodi 播放</string>
<string name="kore_not_found">没找到 Kore 应用,需要安装它吗?</string>
<string name="show_play_with_kodi_title">显示“用 Kodi 播放”选项</string>
<string name="show_play_with_kodi_summary">显示以 Kodi 媒体中心播放视频的选项</string>
<string name="play_audio">音频</string>
<string name="default_audio_format_title">默认音频格式</string>
<string name="default_video_format_title">默认视频格式</string>
<string name="theme_title">主题</string>
<string name="light_theme_title">亮色</string>
<string name="dark_theme_title">酷黑</string>
<string name="black_theme_title">黑色</string>
<string name="popup_remember_size_pos_title">记住悬浮窗的尺寸与位置</string>
<string name="popup_remember_size_pos_summary">记住上一次悬浮窗的位置以及大小</string>
<string name="thumbnail_cache_wipe_complete_notice">已清除图像缓存</string>
<string name="minimize_on_exit_popup_description">最小化悬浮窗播放器</string>
<string name="clear_views_history_title">清除观看历史</string>
<string name="search_history_deleted">搜索记录已删除。</string>
<string name="general_error">错误</string>
<string name="network_error">网络错误</string>
<string name="report_error">举报错误</string>
<string name="search_no_results">没有结果</string>
<string name="start">开始</string>
<string name="pause">暂停</string>
<string name="view">播放</string>
<string name="create">创建</string>
<string name="delete">删除</string>
<string name="delete_all">删除所有</string>
<string name="add">新任务</string>
<string name="finish">
\n</string>
<string name="msg_error">错误
\n</string>
<string name="msg_server_unsupported">不支持的服务器</string>
<string name="msg_exists">文件已存在</string>
<string name="msg_running">NewPipe 下载中</string>
<string name="msg_wait">请稍等…</string>
<string name="charset_letters_and_digits">字母与数字</string>
<string name="charset_most_special_characters">最特别的字符</string>
<string name="toast_no_player">这个文件里没有已下载应用程式</string>
<string name="title_activity_about">关于NewPipe</string>
<string name="action_settings">设置</string>
<string name="action_about">关于</string>
<string name="title_licenses">第三方执照</string>
<string name="action_open_website">打开网页</string>
<string name="unbookmark_playlist">删除书签</string>
<string name="delete_playlist_prompt">确定删除该播放列表吗?</string>
<string name="playlist_creation_success">已创建播放列表</string>
<string name="playlist_add_stream_success">播放列表</string>
<string name="playback_step">步骤</string>
<string name="playback_reset">重置</string>
<string name="start_accept_privacy_policy">为了遵守欧洲通用数据保护法规GDPR,我们请你注意NewPipe的隐私政策.请仔细阅读.
\n你必须接受它才能将错误报告发送给我们.</string>
<string name="accept">接受</string>
<string name="decline">拒绝</string>
<string name="limit_data_usage_none_description">没有限制</string>
<string name="limit_mobile_data_usage_title">使用移动数据时的解析度限制</string>
<string name="minimize_on_exit_title">最小化应用程序切换</string>
<string name="minimize_on_exit_summary">从主视频播放器切换到其他应用时的操作 - %s</string>
<string name="minimize_on_exit_none_description">没有</string>
<string name="minimize_on_exit_background_description">最小化后台播放</string>
<string name="use_inexact_seek_title">使用快速粗略定位</string>
<string name="use_inexact_seek_summary">粗略定位功能允许播放器以略低的精确度为代价换取更快的定位速度</string>
<string name="download_thumbnail_title">下载缩略图</string>
<string name="metadata_cache_wipe_title">清除缓存的元数据</string>
<string name="metadata_cache_wipe_summary">移除所有缓存的网页数据</string>
<string name="metadata_cache_wipe_complete_notice">已清除缓存的元数据</string>
<string name="download_thumbnail_summary">不加载缩略图时,可以节省数据和存储空间。更改后将清除存储空间和扩展空间的缓存。</string>
<string name="auto_queue_title">自动排列下一个媒体</string>
<string name="auto_queue_summary">在非重复排列中播放最后一个媒体时自动推荐相关媒体</string>
<string name="player_gesture_controls_title">玩家手势控制</string>
<string name="player_gesture_controls_summary">使用手势控制播放器的亮度和音量</string>
<string name="show_search_suggestions_title">搜索建议</string>
<string name="show_search_suggestions_summary">搜索时显示建议</string>
<string name="enable_search_history_title">搜索历史记录</string>
<string name="enable_search_history_summary">在本地存储搜索</string>
<string name="enable_watch_history_title">观看历史</string>
<string name="enable_watch_history_summary">记录观看过的视频</string>
<string name="resume_on_audio_focus_gain_title">取得视窗焦点时继续播放</string>
<string name="resume_on_audio_focus_gain_summary">在被打断后继续播放(例如有来电)</string>
<string name="download_dialog_title">下载</string>
<string name="next_video_title">下一部</string>
<string name="show_next_and_similar_title">显示「下一部」及「相关」的视频</string>
<string name="show_hold_to_append_title">显示「长按以新增」的提示</string>
<string name="show_hold_to_append_summary">在视频详细信息页按下后台播放或悬浮窗按钮时提示</string>
<string name="url_not_supported_toast">不支持该网址</string>
<string name="default_content_country_title">默认内容的国家</string>
<string name="service_title">服务</string>
<string name="settings_category_player_title">播放器</string>
<string name="settings_category_player_behavior_title">行为</string>
<string name="settings_category_video_audio_title">视频与音频</string>
<string name="settings_category_history_title">历史记录和缓存数据</string>
<string name="settings_category_popup_title">悬浮窗</string>
<string name="settings_category_appearance_title">外观</string>
<string name="settings_category_other_title">其他</string>
<string name="settings_category_debug_title">调试</string>
<string name="background_player_playing_toast">在后台播放</string>
<string name="popup_playing_toast">在悬浮窗下播放</string>
<string name="background_player_append">已添加到后台播放队列</string>
<string name="popup_playing_append">已添加到悬浮窗播放队列</string>
<string name="play_btn_text">播放</string>
<string name="content">内容</string>
<string name="show_age_restricted_content_title">年龄限制内容</string>
<string name="video_is_age_restricted">显示有年龄限制的视频。可以从设置中允许该内容。</string>
<string name="duration_live">直播</string>
<string name="downloads">下载</string>
<string name="downloads_title">下载</string>
<string name="error_report_title">错误报告</string>
<string name="all">所有</string>
<string name="channel">频道</string>
<string name="channels">频道</string>
<string name="playlist">播放列表</string>
<string name="playlists">播放列表</string>
<string name="tracks">曲目</string>
<string name="users">用户</string>
<string name="yes">是的</string>
<string name="later">稍等</string>
<string name="disabled">不适用</string>
<string name="filter">过滤</string>
<string name="refresh">刷新</string>
<string name="clear">清除</string>
<string name="popup_resizing_indicator_title">调整</string>
<string name="best_resolution">最佳分辨率</string>
<string name="undo">复原</string>
<string name="play_all">全部播放</string>
<string name="always">总是</string>
<string name="just_once">仅一次</string>
<string name="file">文件</string>
<string name="notification_channel_name">NewPipe 通知</string>
<string name="notification_channel_description">NewPipe 后台播放和悬浮窗播放的通知</string>
<string name="unknown_content">[未知]</string>
<string name="toggle_orientation">切换方向</string>
<string name="switch_to_background">切换到后台</string>
<string name="switch_to_popup">切换到悬浮窗</string>
<string name="switch_to_main">切换到首页</string>
<string name="import_data_title">导入数据库</string>
<string name="export_data_title">导出数据库</string>
<string name="import_data_summary">覆盖您当前的历史记录和订阅</string>
<string name="export_data_summary">导出历史记录、订阅和播放列表</string>
<string name="clear_views_history_summary">删除播放过的媒体的历史记录及回放位置</string>
<string name="delete_view_history_alert">确定要清除所有观看历史记录吗?</string>
<string name="watch_history_deleted">观看历史记录已清除。</string>
<string name="clear_search_history_title">清除搜索历史记录</string>
<string name="clear_search_history_summary">清除搜索关键词的历史记录</string>
<string name="delete_search_history_alert">确定要清除所有搜索历史记录吗?</string>
<string name="could_not_load_thumbnails">无法加载所有缩略图</string>
<string name="youtube_signature_decryption_error">无法解析视频网址签名</string>
<string name="parsing_error">无法解析网站</string>
<string name="light_parsing_error">无法完全解析网站</string>
<string name="content_not_available">内容不可用</string>
<string name="could_not_setup_download_menu">无法设置下载菜单</string>
<string name="live_streams_not_supported">目前还不支持观看直播</string>
<string name="could_not_get_stream">无法获得任何媒体</string>
<string name="could_not_load_image">无法加载图片</string>
<string name="app_ui_crash">应用程序或界面出现崩溃了</string>
<string name="player_stream_failure">无法播放此媒体</string>
<string name="player_unrecoverable_failure">发生了无法恢复的播放器错误</string>
<string name="player_recoverable_failure">正在从播放器错误中恢复</string>
<string name="external_player_unsupported_link_type">外部播放器不支持此类型的链接</string>
<string name="invalid_url_toast">无效的网址</string>
<string name="video_streams_empty">找不到视频串流</string>
<string name="audio_streams_empty">找不到音频串流</string>
<string name="invalid_directory">无效的文件夹</string>
<string name="invalid_source">无效的文件/内容来源</string>
<string name="invalid_file">该文件不存在或缺少读写权限</string>
<string name="file_name_empty_error">文件名不能为空</string>
<string name="error_occurred_detail">发生错误:%1$s</string>
<string name="no_streams_available_download">没有可供下载的串流</string>
<string name="sorry_string">抱歉,这不应该发生的。</string>
<string name="error_report_button_text">通过电子邮件报告错误</string>
<string name="error_snackbar_message">抱歉,发生了一些错误。</string>
<string name="error_snackbar_action">报告</string>
<string name="what_device_headline">信息:</string>
<string name="what_happened_headline">发生了什么:</string>
<string name="info_labels">事件:\\n请求\\n内容语言\\n服务\\nGMT 时间:\\n组件\\n版本\\n系统版本</string>
<string name="your_comment">您的评论(请用英语):</string>
<string name="error_details_headline">详细:</string>
<string name="list_thumbnail_view_description">视频预览缩略图</string>
<string name="detail_thumbnail_view_description">视频预览缩略图</string>
<string name="detail_uploader_thumbnail_view_description">上传者的头像缩略图</string>
<string name="detail_likes_img_view_description">喜欢</string>
<string name="detail_dislikes_img_view_description">不喜欢</string>
<string name="use_tor_title">使用 Tor</string>
<string name="use_tor_summary">(实验性)通过 Tor 强制下载流量以增加隐私(暂不支持视频媒体)。</string>
<string name="user_report">用户报告</string>
<string name="empty_subscription_feed_subtitle">这里什么都没有</string>
<string name="detail_drag_description">拖动以重新排序</string>
<string name="err_dir_create">无法创建下载目录「%1$s」</string>
<string name="info_dir_created">已成功创建下载目录「%1$s」</string>
<string name="video">视频</string>
<string name="audio">音频</string>
<string name="retry">重试</string>
<string name="storage_permission_denied">手机存储访问权限被拒绝</string>
<string name="short_thousand"></string>
<string name="short_million"></string>
<string name="short_billion">十亿</string>
<string name="no_subscribers">没有订阅者</string>
<plurals name="subscribers">
<item quantity="one">%s 位订阅者</item>
<item quantity="other"/>
</plurals>
<string name="no_views">无观看次数</string>
<plurals name="views">
<item quantity="one">%s 次观看</item>
<item quantity="other"/>
</plurals>
<string name="no_videos">没有视频</string>
<string name="delete_one">删除</string>
<string name="checksum">校验</string>
<string name="dismiss">退出</string>
<string name="rename">重命名</string>
<string name="msg_name">文件名</string>
<string name="msg_threads">线程</string>
<string name="msg_url_malform">错误的网址或网络不可用</string>
<string name="msg_running_detail">点按以查看详细信息</string>
<string name="msg_copied">复制到剪贴板</string>
<string name="no_available_dir">请稍后在设置中定义一个下载文件夹</string>
<string name="msg_popup_permission">在悬浮窗模式打开
\n需要此权限</string>
<string name="one_item_deleted">已删除一个项目。</string>
<string name="reCaptchaActivity">reCAPTCHA 验证</string>
<string name="reCaptcha_title">reCAPTCHA 验证</string>
<string name="recaptcha_request_toast">需完成 reCAPTCHA 验证</string>
<string name="settings_category_downloads_title">下载</string>
<string name="settings_file_charset_title">文件名中允许的字符</string>
<string name="settings_file_replacement_character_summary">无效字符将替换为该值</string>
<string name="settings_file_replacement_character_title">替换字符</string>
<string name="copyright" formatted="true">© %1$s 由 %2$s 使用 %3$s 版权所有</string>
<string name="error_unable_to_load_license">无法加载许可证</string>
<string name="tab_about">关于</string>
<string name="tab_contributors">贡献者</string>
<string name="tab_licenses">许可证</string>
<string name="app_description">安卓上开源且轻便的媒体播放器。</string>
<string name="contribution_title">贡献</string>
<string name="contribution_encouragement">您是否有想法帮助我们:翻译、界面设计、代码优化以及真正繁重的功能扩展 - 我们随时欢迎您提供帮助。让 NewPipe 越变越好!</string>
<string name="view_on_github">在 GitHub 上查看</string>
<string name="donation_title">捐赠</string>
<string name="donation_encouragement">NewPipe 由社区人员维护和开发额,他们耗费时间务求为您带来最佳体验。现在是时候回过头来,让我们的开发人员能够在使 NewPipe 更加完美的同时,享受一杯咖啡。</string>
<string name="give_back">回馈</string>
<string name="website_title">网站</string>
<string name="website_encouragement">访问 NewPipe 网站了解更多信息和新闻。</string>
<string name="privacy_policy_title">NewPipe 的隐私政策</string>
<string name="privacy_policy_encouragement">NewPipe 项目是非常重视您的隐私。因此,未经您的同意,该应用程序不会收集任何数据。
\nNewPipe 的隐私政策详细说明了当您发送崩溃报告时,什么资料会被传送及储存。</string>
<string name="read_privacy_policy">阅读隐私政策</string>
<string name="app_license_title">NewPipe 的许可证</string>
<string name="app_license">NewPipe 是一个 Copyleft 的自由软件:您可以随意使用、研究、分享或改进它。在遵守由自由软件基金会所发布的 GNU 通用公共授权条款的状况下,您可以自由地再发布或修改它;授权条款预设使用第三版,但您也可以选择更新的版本。</string>
<string name="read_full_license">阅读许可证</string>
<string name="title_activity_history">历史记录</string>
<string name="title_history_search">搜索</string>
<string name="title_history_view">观看</string>
<string name="history_disabled">历史记录被关闭了</string>
<string name="action_history">历史记录</string>
<string name="history_empty">没有历史记录</string>
<string name="history_cleared">清除历史记录</string>
<string name="item_deleted">项目已删除</string>
<string name="delete_item_search_history">确定要从搜索历史记录中删除该项吗?</string>
<string name="delete_stream_history_prompt">确定要从观看历史记录中删除该项吗?</string>
<string name="delete_all_history_prompt">您确定要删除历史记录中的所有项吗?</string>
<string name="title_last_played">上一次播放</string>
<string name="title_most_played">最受欢迎</string>
<string name="main_page_content">首页内容</string>
<string name="blank_page_summary">空白页面</string>
<string name="kiosk_page_summary">互动页面</string>
<string name="subscription_page_summary">订阅页面</string>
<string name="feed_page_summary">Feed 页面</string>
<string name="channel_page_summary">频道页面</string>
<string name="select_a_channel">选择一个频道</string>
<string name="no_channel_subscribed_yet">尚未订阅任何频道</string>
<string name="select_a_kiosk">选择一个互动</string>
<string name="export_complete_toast">输出</string>
<string name="import_complete_toast">接入</string>
<string name="no_valid_zip_file">无效的压缩文件</string>
<string name="could_not_import_all_files">警告:无法导入所有文件。</string>
<string name="override_current_data">这将覆盖您当前的设定。</string>
<string name="import_settings">您是否要导入设定?</string>
<string name="kiosk">互动</string>
<string name="trending">趋势</string>
<string name="top_50">前 50</string>
<string name="new_and_hot">最新和热门</string>
<string name="title_activity_background_player">转到后台播放</string>
<string name="title_activity_popup_player">悬浮窗播放</string>
<string name="play_queue_remove">移除</string>
<string name="play_queue_stream_detail">详细</string>
<string name="play_queue_audio_settings">音频设置</string>
<string name="hold_to_append">长按加入队列</string>
<string name="enqueue_on_background">加入后台播放列表</string>
<string name="enqueue_on_popup">加入悬浮窗播放列表</string>
<string name="start_here_on_main">从这里开始播放</string>
<string name="start_here_on_background">开始在后台播放</string>
<string name="start_here_on_popup">开始在新悬浮窗播放</string>
<string name="drawer_open">打开抽屉</string>
<string name="drawer_close">关闭抽屉</string>
<string name="drawer_header_action_paceholder_text">很快就会出现在这里 ;D</string>
<string name="preferred_open_action_settings_title">偏好的「开启」动作</string>
<string name="preferred_open_action_settings_summary">开启内容时的默认动作 - %s</string>
<string name="video_player">视频播放器</string>
<string name="background_player">后台播放器</string>
<string name="popup_player">悬浮窗播放器</string>
<string name="always_ask_open_action">总是询问</string>
<string name="preferred_player_fetcher_notification_title">正在获取信息…</string>
<string name="preferred_player_fetcher_notification_message">正在载入请求的内容</string>
<string name="create_playlist">新的播放列表</string>
<string name="delete_playlist">删除</string>
<string name="rename_playlist">重命名</string>
<string name="playlist_name_input">名称</string>
<string name="append_playlist">添加到播放列表</string>
<string name="set_as_playlist_thumbnail">设为播放列表缩略图</string>
<string name="bookmark_playlist">将播放列表加入书签</string>
<string name="playlist_thumbnail_change_success">播放列表缩略图已更改。</string>
<string name="playlist_delete_failure">无法删除播放列表。</string>
<string name="caption_none">没有字幕</string>
<string name="resize_fit">合适</string>
<string name="resize_fill">填满</string>
<string name="resize_zoom">缩放</string>
<string name="caption_auto_generated">自动生成</string>
<string name="caption_setting_title">字幕</string>
<string name="caption_setting_description">修改播放器字幕文本比列和背景样式。需要重启才能生效。</string>
<string name="enable_leak_canary_title">启用 LeakCanary</string>
<string name="enable_leak_canary_summary">内存泄漏监视可能导致应用程序在存储时无响应</string>
<string name="enable_disposed_exceptions_title">报告活动周期外错误</string>
<string name="enable_disposed_exceptions_summary">强制报告在处理完片段或活动周期外发生的无法传递的 Rx 异常</string>
<string name="import_export_title">导入/导出</string>
<string name="import_title">导入</string>
<string name="import_from">导入至</string>
<string name="export_to">导出到</string>
<string name="import_ongoing">正在导入…</string>
<string name="export_ongoing">正在导出…</string>
<string name="import_file_title">导入文件</string>
<string name="previous_export">之前的导出</string>
<string name="subscriptions_import_unsuccessful">无法导入订阅</string>
<string name="subscriptions_export_unsuccessful">无法导出订阅</string>
<string name="import_youtube_instructions">通过下载导出文件来导入 YouTube 订阅:
\n
\n1.移至该网址:%1$s
\n2.当被询问时登入帐号
\n3.应该开始下载(这是导出文件)</string>
<string name="import_soundcloud_instructions">通过输入 URL 或 ID 来导入 SoundCloud的配置文件
\n
\n1.在浏览器中启用「桌面模式」(该网站不适用于移动设备)
\n2.移至该网址:%1$s
\n3.当被询问时登入帐号
\n4.复制您重定向的配置文件到网址。</string>
<string name="import_soundcloud_instructions_hint">您的 IDsoundcloud.com/yourid</string>
<string name="import_network_expensive_warning">请记住,此操作可能造成昂贵的网络花费。
\n
\n您是否要继续</string>
<string name="playback_speed_control">播放速度控制</string>
<string name="playback_tempo">速度</string>
<string name="playback_pitch">音量</string>
<string name="unhook_checkbox">取消链接(可能会导致扭曲)</string>
<string name="skip_silence_checkbox">静音时快进</string>
<string name="unsubscribe">退订</string>
<string name="tab_new">新标签</string>
<string name="tab_choose">选择标签</string>
<string name="volume_gesture_control_title">音量手势控制</string>
<string name="volume_gesture_control_summary">用手势控制播放器的音量</string>
<string name="brightness_gesture_control_title">手势控制亮度</string>
<string name="brightness_gesture_control_summary">用手势控制播放器的亮度</string>
<string name="content_language_title">默认的内容语言</string>
<string name="settings_category_updates_title">升级</string>
<string name="file_deleted">文件已删除</string>
<string name="app_update_notification_channel_name">应用升级通知</string>
<string name="app_update_notification_channel_description">新 NewPipe 版本通知</string>
<string name="download_to_sdcard_error_title">外储存不可行</string>
<string name="download_to_sdcard_error_message">无法下载到外部SD卡。重置下载文件夹位置</string>
<string name="restore_defaults">恢复默认</string>
<string name="restore_defaults_confirmation">您真的要恢复至默认吗?</string>
<string name="selection">选择</string>
<string name="updates_setting_title">升级</string>
<string name="list">列表</string>
<string name="auto">自动</string>
<string name="app_update_notification_content_text">轻按以下载</string>
<string name="missions_header_finished">已完成</string>
<string name="missions_header_pending">有待</string>
<string name="paused">已暂停</string>
<string name="queued">已加入队列</string>
<string name="post_processing">后处理</string>
<string name="enqueue">队列</string>
<string name="permission_denied">系统拒绝该行动</string>
<string name="download_failed">下载失败</string>
<string name="download_finished">下载完成</string>
<string name="download_finished_more">%s已下载完毕</string>
<string name="generate_unique_name">生成独特的名字</string>
<string name="overwrite">覆写</string>
<string name="overwrite_finished_warning">同名的已下载文件已经存在</string>
<string name="download_already_running">同名下载进行中</string>
<string name="show_error">显示错误</string>
<string name="label_code">代码</string>
<string name="error_file_creation">无法创建该文件</string>
<string name="error_permission_denied">系统拒绝此批准</string>
<string name="error_ssl_exception">安全连接失败</string>
<string name="error_unknown_host">找不到服务器</string>
<string name="error_connect_host">连不上服务器</string>
<string name="error_http_no_content">伺服器没回送数据</string>
<string name="error_http_not_found">找不到</string>
<string name="error_postprocessing_failed">后处理失败</string>
<string name="clear_finished_download">清除已完毕的下载</string>
<string name="stop"></string>
<string name="max_retry_msg">重试上限</string>
<string name="max_retry_desc">取消下载前可以尝试的最多次数</string>
<string name="pause_downloads_on_mobile">换成手机数据时中断</string>
<string name="events">事件</string>
<string name="saved_tabs_invalid_json">使用默认选项卡, 读取保存的选项卡时出错</string>
<string name="subscribers_count_not_available">订阅者计数不可用</string>
<string name="main_page_content_summary">主页上显示的选项卡</string>
<string name="conferences">会议</string>
<string name="updates_setting_description">显示通知, 以便在新版本可用时提示应用更新</string>
<string name="list_view_mode">列表视图模式</string>
<string name="grid">网格</string>
<string name="switch_view">切换视图</string>
<string name="app_update_notification_content_title">NewPipe 更新可用!</string>
<string name="error_path_creation">无法创建目标文件夹</string>
<string name="error_http_unsupported_range">服务器不接受多线程下载, 请使用 @string/msg_threads = 1重试</string>
<string name="pause_downloads_on_mobile_desc">切换至移动数据时有用,尽管一些下载无法被暂停</string>
<string name="show_comments_title">显示评论</string>
<string name="show_comments_summary">禁用停止显示评论</string>
<string name="autoplay_title">自动播放</string>
<plurals name="comments">
<item quantity="one">评论</item>
<item quantity="other"/>
</plurals>
<string name="no_comments">没有评论</string>
<string name="error_unable_to_load_comments">无法加载评论</string>
<string name="close">关闭</string>
<string name="enable_playback_resume_title">继续播放</string>
<string name="enable_playback_resume_summary">恢复上次播放位置</string>
<string name="enable_playback_state_lists_title">列表中的位置</string>
<string name="enable_playback_state_lists_summary">在列表中显示播放位置指示符</string>
<string name="settings_category_clear_data_title">清除数据</string>
<string name="watch_history_states_deleted">播放位置已删除。</string>
<string name="missing_file">文件被移动或删除</string>
<string name="overwrite_unrelated_warning">已存在具有此名称的文件</string>
<string name="overwrite_failed">无法覆盖该文件</string>
<string name="download_already_pending">同名文件正在等待下载</string>
<string name="error_postprocessing_stopped">处理此文件时 NewPipe 已关闭</string>
<string name="error_insufficient_storage">设备上没有剩余空间</string>
<string name="error_progress_lost">进度丢失,因为文件已被删除</string>
<string name="error_timeout">连接超时</string>
<string name="confirm_prompt">你确定吗?</string>
<string name="enable_queue_limit">限制下载队列</string>
<string name="enable_queue_limit_desc">同时只有一个下载进行</string>
<string name="start_downloads">开始全部下载</string>
<string name="pause_downloads">暂停全部下载</string>
<string name="downloads_storage_ask_title">询问下载位置</string>
<string name="downloads_storage_ask_summary">每次下载将询问保存的位置</string>
<string name="downloads_storage_ask_summary_kitkat">每次下载将询问保存的位置.
\n如果要下载到外部SD卡请选择外部存储访问框架</string>
<string name="downloads_storage_use_saf_title">使用存储访问框架</string>
<string name="downloads_storage_use_saf_summary">存储访问框架(SAF)允许下载文件到外部SD卡。
\n注一些设备不兼容SAF</string>
<string name="clear_playback_states_title">删除回放位置</string>
<string name="clear_playback_states_summary">删除所有回放位置</string>
<string name="delete_playback_states_alert">删除所有的回放位置吗?</string>
<string name="download_choose_new_path">更改要生效的下载文件夹</string>
</resources>

View File

@@ -20,7 +20,7 @@
<string name="download_path_audio_title">Složka pro stažené audio</string>
<string name="default_resolution_title">Výchozí rozlišení</string>
<string name="play_with_kodi_title">Přehrát pomocí Kodi</string>
<string name="kore_not_found">Aplikace Kore nenalezena. Chcete ji nainstalovat?</string>
<string name="kore_not_found">Nainstalovat chybějící aplikaci Kore\?</string>
<string name="view_count_text">%1$s zhlédnutí</string>
<string name="download_path_title">Adresář pro stažená videa</string>
<string name="download_path_summary">Stažená videa jsou uložena tady</string>
@@ -61,10 +61,10 @@
<string name="autoplay_by_calling_app_summary">Přehrává video, když je NewPipe otevřen z jiné aplikace</string>
<string name="content">Obsah</string>
<string name="show_age_restricted_content_title">Věkově omezený obsah</string>
<string name="video_is_age_restricted">Zobrazit video s věkovým omezením. Povolit tento obsah lze v \"Nastavení\".</string>
<string name="duration_live">ŽIVĚ</string>
<string name="video_is_age_restricted">Zobrazit video s věkovým omezením. Změnit tuto volbu v budoucnu lze v \"Nastavení\".</string>
<string name="duration_live">Živě</string>
<string name="light_parsing_error">Nebylo možné kompletně analyzovat stránku</string>
<string name="main_bg_subtitle">Začni stiskem hledat</string>
<string name="main_bg_subtitle">Začni klepnutím na \"Hledat\"</string>
<string name="msg_copied">Zkopírováno do schránky</string>
<string name="msg_wait">Počkejte prosím…</string>
<string name="msg_running">NewPipe stahuje</string>
@@ -84,9 +84,9 @@
<string name="report_error">Nahlásit chybu</string>
<string name="error_details_headline">Podrobnosti:</string>
<string name="what_happened_headline">Co se stalo:</string>
<string name="error_snackbar_action">NAHLÁSIT</string>
<string name="error_snackbar_action">Nahlásit</string>
<string name="sorry_string">Omlouváme se, tohle se nemělo stát.</string>
<string name="error_report_button_text">Nahlásit chybu přes e-mail</string>
<string name="error_report_button_text">Nahlásit tuto chybu přes e-mail</string>
<string name="error_snackbar_message">Omlouváme se, nastaly určité chyby.</string>
<string name="could_not_load_image">Nepodařilo se nahrát obrázek</string>
<string name="app_ui_crash">Aplikace/UI spadlo</string>
@@ -98,12 +98,12 @@
<string name="downloads_title">Stažené soubory</string>
<string name="what_device_headline">Info:</string>
<string name="your_comment">Vaše poznámky (anglicky):</string>
<string name="storage_permission_denied">Oprávnění přístupu do úložiště zamítnuto</string>
<string name="storage_permission_denied">Nejdříve udělit oprávnění přístupu k úložišti</string>
<string name="view">Přehrát</string>
<string name="add">Nová mise</string>
<string name="finish">OK</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="reCaptcha_title">Výzva reCAPTCHA</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="title_activity_recaptcha">Výzva reCAPTCHA</string>
<string name="recaptcha_request_toast">Požadována výzva reCAPTCHA</string>
<string name="black_theme_title">Černé</string>
<string name="checksum">Kontrolní součet</string>
@@ -121,11 +121,11 @@
otevření ve vyskakovacím okně</string>
<string name="use_external_video_player_summary">Odstraňuje zvuk v některých rozlišeních</string>
<string name="show_higher_resolutions_title">Zobrazovat vyšší rozlišení</string>
<string name="show_higher_resolutions_summary">Pouze některá zařízení podporují přehrávání 2K/4K videí</string>
<string name="show_higher_resolutions_summary">Pouze některá zařízení dokáží přehrát 2K/4K videa</string>
<string name="default_video_format_title">Výchozí formát videa</string>
<string name="popup_remember_size_pos_title">Pamatovat si velikost a pozici vyskakovacího okna</string>
<string name="popup_remember_size_pos_summary">Pamatovat si poslední velikost a pozici vyskakovacího okna</string>
<string name="popup_mode_share_menu_title">NewPipe režim vyskakovacího okna</string>
<string name="popup_mode_share_menu_title">Režim vyskakovacího okna</string>
<string name="subscribe_button_title">Odebírat</string>
<string name="subscribed_button_title">Odebíráno</string>
<string name="channel_unsubscribed">Odběr zrušen</string>
@@ -138,14 +138,14 @@ otevření ve vyskakovacím okně</string>
<string name="controls_popup_title">V okně</string>
<string name="default_popup_resolution_title">Výchozí rozlišení vyskakovacího okna</string>
<string name="player_gesture_controls_title">Ovládání přehrávače gesty</string>
<string name="player_gesture_controls_summary">Používat gesta pro nastavení jasu a hlasitosti přehrávače</string>
<string name="player_gesture_controls_summary">Používat gesta pro ovládání jasu a hlasitosti přehrávače</string>
<string name="show_search_suggestions_title">Návrhy vyhledávání</string>
<string name="show_search_suggestions_summary">Zobrazovat návrhy při vyhledávání</string>
<string name="enable_search_history_title">Historie vyhledávání</string>
<string name="enable_search_history_summary">Hledané výrazy lokálně uchovávat</string>
<string name="enable_watch_history_title">Historie zhlédnutí</string>
<string name="enable_watch_history_title">Historie sledování</string>
<string name="enable_watch_history_summary">Evidovat zhlédnutá videa</string>
<string name="resume_on_audio_focus_gain_title">Přehrávat po přechodu do popředí</string>
<string name="resume_on_audio_focus_gain_title">Obnovit přehrávání</string>
<string name="resume_on_audio_focus_gain_summary">Pokračovat v přehrávání po přerušení (např. hovor)</string>
<string name="settings_category_player_title">Přehrávač</string>
<string name="settings_category_player_behavior_title">Chování</string>
@@ -179,9 +179,9 @@ otevření ve vyskakovacím okně</string>
</plurals>
<string name="no_videos">Žádná videa</string>
<plurals name="videos">
<item quantity="one">%s video</item>
<item quantity="few">%s videa</item>
<item quantity="other">%s videí</item>
<item quantity="one">%s Video</item>
<item quantity="few">%s Videa</item>
<item quantity="other">%s Videí</item>
</plurals>
<string name="settings_category_downloads_title">Stahování</string>
<string name="settings_file_charset_title">Povolené znaky v názvech souborů</string>
@@ -214,7 +214,7 @@ otevření ve vyskakovacím okně</string>
<string name="history_cleared">Historie vymazána</string>
<string name="item_deleted">Položka byla odstraněna</string>
<string name="show_hold_to_append_title">Zobrazovat tip \"Podržet pro přidání\"</string>
<string name="show_hold_to_append_summary">Zobrazí se po stisku tlačítek přehrát na pozadí nebo přehrát v okně na stránce s videem</string>
<string name="show_hold_to_append_summary">Ukázat tip po stisku na pozadí nebo na popup tlačítko v \"Podrobnostech\" o videu</string>
<string name="background_player_append">Ve frontě přehrávače na pozadí</string>
<string name="popup_playing_append">Ve frontě přehrávače v okně</string>
<string name="play_all">Přehrát vše</string>
@@ -248,7 +248,7 @@ otevření ve vyskakovacím okně</string>
<string name="start_here_on_background">Začít přehrávat na pozadí</string>
<string name="start_here_on_popup">Začít přehrávat v okně</string>
<string name="donation_title">Donate</string>
<string name="donation_encouragement">NewPipe je vyvíjen dobrovolníky, kteří tráví svůj čas, aby vaše zkušenost s aplikací byla co nejlepší. Vraťte vývojářům něco zpět, aby mohli NewPipe dále zlepšovat a zároveň si vychutnat šálek kávy.</string>
<string name="donation_encouragement">NewPipe je vyvíjen dobrovolníky, kteří tráví svůj volný čas, aby vaše zkušenost s aplikací byla co nejlepší. Vraťte vývojářům něco zpět, aby mohli NewPipe dále zlepšovat a zároveň si vychutnat šálek kávy.</string>
<string name="give_back">Daruj</string>
<string name="website_title">Webová stránka</string>
<string name="website_encouragement">Pro další informace a novinky navštivte webovou stránku NewPipe.</string>
@@ -316,10 +316,10 @@ otevření ve vyskakovacím okně</string>
<string name="resize_zoom">Zvětšit</string>
<string name="settings_category_debug_title">Ladění</string>
<string name="caption_auto_generated">"Automaticky generováno "</string>
<string name="enable_leak_canary_title">Povolit službu LeakCanary</string>
<string name="enable_leak_canary_title">LeakCanary</string>
<string name="enable_leak_canary_summary">Monitoring úniku paměti může způsobit nereagování aplikace při heap dumpingu</string>
<string name="enable_disposed_exceptions_title">Nahlásit mimo-cyklické chyby</string>
<string name="enable_disposed_exceptions_summary">Vynutit vykazování výjimek Rx mimo fragment nebo životnost cyklu po odstranění</string>
<string name="enable_disposed_exceptions_summary">Vynutit hlášení nedoručitelných výjimek Rx mimo životnost fragmentu nebo aktivity po odstranění</string>
<string name="use_inexact_seek_title">Použít rychlé nepřesné hledání</string>
<string name="use_inexact_seek_summary">Nepřesné hledání umožní přehrávači posouvat se rychleji, ale se sníženou přesností</string>
<string name="download_thumbnail_title">Načítat náhledy</string>
@@ -329,7 +329,7 @@ otevření ve vyskakovacím okně</string>
<string name="metadata_cache_wipe_summary">Odebrat všechna data uložená v mezipaměti</string>
<string name="metadata_cache_wipe_complete_notice">Mezipaměť metadat vymazána</string>
<string name="auto_queue_title">Automatická fronta dalšího streamu</string>
<string name="auto_queue_summary">Automaticky připojí související stream při přehrávání posledního streamu v neopakující se frontě</string>
<string name="auto_queue_summary">Pokračovat konečnou (neopakující se) frontu playbacku připojením souvisejícího streamu</string>
<string name="file">Soubor</string>
<string name="invalid_directory">Neexistující složka</string>
<string name="invalid_source">Neexistující zdroj souboru/obsahu</string>
@@ -365,7 +365,7 @@ otevření ve vyskakovacím okně</string>
\n
\nChcete pokračovat?</string>
<string name="playback_speed_control">Ovládání rychlosti přehrávání</string>
<string name="playback_tempo">Rychlost</string>
<string name="playback_tempo">Tempo</string>
<string name="playback_pitch">Výška tónu</string>
<string name="unhook_checkbox">Rozpojit (může způsobit zkreslení)</string>
<string name="playback_default">Výchozí nastavení</string>
@@ -414,13 +414,13 @@ otevření ve vyskakovacím okně</string>
<string name="volume_gesture_control_title">Ovládání hlasitosti gesty</string>
<string name="volume_gesture_control_summary">Používat gesta pro ovládání hlasitosti přehrávače</string>
<string name="brightness_gesture_control_title">Ovládání jasu gesty</string>
<string name="brightness_gesture_control_summary">Používat gesta pro kontrolu jasu přehrávače</string>
<string name="brightness_gesture_control_summary">Používat gesta pro ovládání jasu přehrávače</string>
<string name="settings_category_updates_title">Aktualizace</string>
<string name="file_deleted">Soubor smazán</string>
<string name="app_update_notification_channel_name">Notifikace aktualizace aplikace</string>
<string name="app_update_notification_channel_description">Notifikace pro novou verzi NewPipe</string>
<string name="download_to_sdcard_error_title">Externí úložiště není k dispozici</string>
<string name="saved_tabs_invalid_json">Chyba při načítání uložených karet, použijí se výchozí karty</string>
<string name="saved_tabs_invalid_json">Nelze načíst uložené karty, takže se použijí výchozí karty</string>
<string name="restore_defaults">Obnovit do výchozího nastavení</string>
<string name="restore_defaults_confirmation">Chcete obnovit výchozí nastavení\?</string>
<string name="subscribers_count_not_available">Počet odběratelů není k dispozici</string>
@@ -457,7 +457,7 @@ otevření ve vyskakovacím okně</string>
<string name="error_path_creation">Cílovou složku nelze vytvořit</string>
<string name="error_file_creation">Soubor nelze vytvořit</string>
<string name="error_permission_denied">Oprávnění odepřeno systémem</string>
<string name="error_ssl_exception">Zabezpečené připojení selhalo</string>
<string name="error_ssl_exception">Nelze navázat zabezpečené připojení</string>
<string name="error_unknown_host">Server se nepodařilo najít</string>
<string name="error_connect_host">Nelze se připojit k serveru</string>
<string name="error_http_no_content">Server neposílá data</string>
@@ -483,8 +483,8 @@ otevření ve vyskakovacím okně</string>
<string name="close">Zavřít</string>
<string name="download_to_sdcard_error_message">Stahování na externí SD kartu není možné. Resetovat umístění složky pro stahování\?</string>
<string name="enable_playback_resume_title">Pokračovat v přehrávání</string>
<string name="enable_playback_resume_summary">Obnovit poslední přehrávanou pozici</string>
<string name="enable_playback_state_lists_title">Pořadí v seznamech</string>
<string name="enable_playback_resume_summary">Obnovit poslední pozici přehrávání</string>
<string name="enable_playback_state_lists_title">Pozice v seznamech</string>
<string name="settings_category_clear_data_title">Vymazat data</string>
<string name="missing_file">Soubor přemístěn nebo smazán</string>
<string name="overwrite_failed">soubor nelze přepsat</string>
@@ -492,7 +492,7 @@ otevření ve vyskakovacím okně</string>
<string name="error_postprocessing_stopped">NewPipe byl ukončen v průběhu zpracovávání souboru</string>
<string name="error_insufficient_storage">V zařízení nezbývá žádné místo</string>
<string name="error_progress_lost">Postup ztracen, protože soubor byl smazán</string>
<string name="confirm_prompt">Jste si jisti\?</string>
<string name="confirm_prompt">Jste si jisti smazáním své historie stahování nebo smazáním všech stažených souborů\?</string>
<string name="enable_queue_limit">Omezit frontu stahování</string>
<string name="enable_queue_limit_desc">Najednou se bude stahovat pouze jeden soubor</string>
<string name="start_downloads">Začít stahování</string>
@@ -502,9 +502,9 @@ otevření ve vyskakovacím okně</string>
<string name="downloads_storage_ask_summary_kitkat">Budete dotázáni, kam jednotlivé soubory stáhnout.
\nZvolte SAF, pokud si přejete stahovat na externí SD kartu</string>
<string name="downloads_storage_use_saf_title">Použít SAF</string>
<string name="downloads_storage_use_saf_summary">Storage Access Framework umožňuje stahovat na externí SD kartu.
<string name="downloads_storage_use_saf_summary">\"Storage Access Framework\" umožňuje stahovat na externí SD kartu.
\nUpozornění: některá zařízení jsou nekompatibilní</string>
<string name="enable_playback_state_lists_summary">Ukázat poziční indikátory playbacku v seznamech</string>
<string name="enable_playback_state_lists_summary">Zobrazit pozici přehrávání v seznamech</string>
<string name="watch_history_states_deleted">Pozice playbacku smazány.</string>
<string name="error_timeout">Timeout spojení</string>
<string name="clear_playback_states_title">Smazat pozice playbacku</string>
@@ -526,4 +526,30 @@ otevření ve vyskakovacím okně</string>
</plurals>
<string name="localization_changes_requires_app_restart">Ke změně jazyka dojde po restartu aplikace.</string>
<string name="default_kiosk_page_summary">Výchozí kiosek</string>
<string name="seek_duration_title">Délka přetočení vpřed/zpět</string>
<string name="peertube_instance_url_title">Instance PeerTube</string>
<string name="peertube_instance_url_summary">Vybrat oblíbené instance PeerTube</string>
<string name="peertube_instance_url_help">Vyhledat instance, které se vám líbí, na %s</string>
<string name="peertube_instance_add_title">Přidat instanci</string>
<string name="peertube_instance_add_help">Zadat URL instance</string>
<string name="peertube_instance_add_fail">Instanci nebylo možno potvrdit</string>
<string name="peertube_instance_add_https_only">Podporujeme pouze URL s HTTPS</string>
<string name="peertube_instance_add_exists">Instance již existuje</string>
<string name="local">Místní</string>
<string name="recently_added">Přidány nedávno</string>
<string name="most_liked">Nejoblíbenější</string>
<string name="playlist_no_uploader">Autogenerovány (uploader nenalezen)</string>
<string name="recovering">obnovuji</string>
<string name="error_download_resource_gone">Toto stahování nelze obnovit</string>
<string name="choose_instance_prompt">Vyberte instanci</string>
<string name="enable_lock_screen_video_thumbnail_title">Náhled videa na zamknuté obrazovce</string>
<string name="enable_lock_screen_video_thumbnail_summary">Při použití přehrávače na pozadí se náhled videa ukáže na zamknuté obrazovce</string>
<string name="clear_download_history">Smazat historii stahování</string>
<string name="delete_downloaded_files">Smazat stažené soubory</string>
<string name="deleted_downloads">Smazat %1$s stahování</string>
<string name="permission_display_over_apps">Souhlasit se zobrazením přes jiné aplikace</string>
<string name="app_language_title">Jazyk aplikace</string>
<string name="systems_language">Jazyk systému</string>
<string name="subtitle_activity_recaptcha">Po vyřešení stiskni \"Hotovo\"</string>
<string name="recaptcha_done_button">Hotovo</string>
</resources>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@@ -249,8 +249,8 @@
<string name="no_available_dir">Vælg venligst en tilgængelig downloadmappe</string>
<string name="msg_popup_permission">Denne tilladelse er nødvendig for at kunne åbne i pop op-tilstand</string>
<string name="one_item_deleted">1 element slettet.</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="reCaptcha_title">reCAPTCHA-udfordring</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="title_activity_recaptcha">reCAPTCHA-udfordring</string>
<string name="recaptcha_request_toast">Der blev anmodet om en reCAPTCHA-udfordring</string>
<string name="settings_category_downloads_title">Download</string>
<string name="settings_file_charset_title">Tilladte tegn i filnavne</string>

View File

@@ -14,7 +14,7 @@
<string name="did_you_mean">Meintest du: %1$s\?</string>
<string name="share_dialog_title">Teilen mit</string>
<string name="choose_browser">Browser auswählen</string>
<string name="screen_rotation">Drehen des Geräts</string>
<string name="screen_rotation">Bildschirm drehen</string>
<string name="download_path_title">Downloadordner für Videos</string>
<string name="download_path_summary">Heruntergeladene Videodateien werden hier gespeichert</string>
<string name="download_path_dialog_title">Wähle den Downloadordner für Videodateien aus</string>
@@ -79,7 +79,7 @@
<string name="your_comment">Dein Kommentar (auf englisch):</string>
<string name="could_not_get_stream">Konnte keinen Stream abrufen</string>
<string name="autoplay_by_calling_app_title">Automatische Wiedergabe</string>
<string name="autoplay_by_calling_app_summary">Wiedergabe eines Videos, wenn NewPipe von einer anderen App aufgerufen wurde</string>
<string name="autoplay_by_calling_app_summary">Video abspielen, wenn NewPipe von einer anderen App aufgerufen wird</string>
<string name="report_error">Einen Fehler melden</string>
<string name="user_report">Anwenderbericht</string>
<string name="duration_live">LIVE</string>
@@ -110,9 +110,9 @@
<string name="msg_running">NewPipe lädt herunter</string>
<string name="msg_running_detail">Für Details antippen</string>
<string name="msg_url_malform">Ungültige URL oder Internet nicht verfügbar</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="black_theme_title">Schwarz</string>
<string name="reCaptcha_title">reCAPTCHA-Aufgabe</string>
<string name="title_activity_recaptcha">reCAPTCHA-Aufgabe</string>
<string name="recaptcha_request_toast">reCAPTCHA-Aufgabe angefordert</string>
<string name="later">Später</string>
<string name="yes">Ja</string>
@@ -123,7 +123,8 @@
<string name="default_video_format_title">Bevorzugtes Videoformat</string>
<string name="popup_playing_toast">Im Pop-up Modus abspielen</string>
<string name="popup_mode_share_menu_title">NewPipe-Pop-up-Modus</string>
<string name="msg_popup_permission">Diese Berechtigung ist für das Öffnen im Pop-up-Modus erforderlich</string>
<string name="msg_popup_permission">Diese Berechtigung ist für das
\nÖffnen im Pop-up-Modus erforderlich</string>
<string name="default_popup_resolution_title">Standardauflösung des Pop-ups</string>
<string name="show_higher_resolutions_title">Höhere Auflösungen anzeigen</string>
<string name="show_higher_resolutions_summary">Nur manche Geräte unterstützen das Abspielen von 2K-/4K-Videos</string>
@@ -154,7 +155,7 @@
<string name="tab_about">Über</string>
<string name="app_description">Freies und schlankes Streaming für Android.</string>
<string name="app_license_title">NewPipes Lizenz</string>
<string name="contribution_encouragement">Ob Ideen, Übersetzungen, Design-Änderungen, Code-Aufräumung oder richtig große Code-Änderungen Hilfe ist immer willkommen. Je mehr geholfen wird, desto besser wird NewPipe!</string>
<string name="contribution_encouragement">Ob Ideen, Übersetzungen, Design-Änderungen, Code-Aufräumung oder richtig große Code-Änderungen Hilfe ist immer willkommen. Je mehr geholfen wird, desto besser wird NewPipe!</string>
<string name="title_licenses">Drittanbieter-Lizenzen</string>
<string name="view_on_github">Auf GitHub ansehen</string>
<string name="contribution_title">Beitragen</string>
@@ -202,8 +203,8 @@
</plurals>
<string name="no_videos">Keine Videos</string>
<plurals name="videos">
<item quantity="one">Video</item>
<item quantity="other">Videos</item>
<item quantity="one">%s Video</item>
<item quantity="other">%s Videos</item>
</plurals>
<string name="charset_most_special_characters">Die meisten Sonderzeichen</string>
<string name="item_deleted">Element gelöscht</string>
@@ -278,7 +279,7 @@
<string name="override_current_data">Dies wird deine aktuellen Einstellungen überschreiben.</string>
<string name="show_info">Infos anzeigen</string>
<string name="tab_bookmarks">Lesezeichen für Wiedergabelisten</string>
<string name="controls_add_to_playlist_title">Hinzufügen zu</string>
<string name="controls_add_to_playlist_title">Hinzufügen</string>
<string name="detail_drag_description">Zum Neuordnen ziehen</string>
<string name="create">Erstellen</string>
<string name="delete_one">Einen löschen</string>
@@ -365,7 +366,7 @@
<string name="import_soundcloud_instructions_hint">yourID, soundcloud.com/yourid</string>
<string name="no_streams_available_download">Keine Streams zum Download verfügbar</string>
<string name="preferred_open_action_settings_title">Bevorzugte \"Öffnen\" Aktion</string>
<string name="preferred_open_action_settings_summary">Standardaktion beim Öffnen von Inhalten - %s</string>
<string name="preferred_open_action_settings_summary">Standardaktion beim Öffnen von Inhalten %s</string>
<string name="caption_setting_title">Untertitel</string>
<string name="caption_setting_description">Textgröße und Hintergrund der Untertitel im Player anpassen. Wird erst nach Neustart der App wirksam.</string>
<string name="toast_no_player">Keine App zum Abspielen dieser Datei installiert</string>
@@ -391,11 +392,11 @@
<string name="limit_data_usage_none_description">Unbegrenzt</string>
<string name="limit_mobile_data_usage_title">Auflösung bei Verwendung mobiler Daten begrenzen</string>
<string name="minimize_on_exit_title">Minimieren beim Appwechsel</string>
<string name="minimize_on_exit_summary">Aktion beim Umschalten auf eine andere App vom Haupt-Videoplayer - %s</string>
<string name="minimize_on_exit_summary">Aktion beim Umschalten auf eine andere App vom Haupt-Videoplayer %s</string>
<string name="minimize_on_exit_none_description">Keine</string>
<string name="minimize_on_exit_background_description">Zum Hintergrund-Player minimieren</string>
<string name="minimize_on_exit_popup_description">Zum Popup-Player minimieren</string>
<string name="skip_silence_checkbox">Vorspulen während der Stille</string>
<string name="skip_silence_checkbox">Vorspulen bei Stille</string>
<string name="playback_step">Schritt</string>
<string name="playback_reset">Zurücksetzen</string>
<string name="channels">Kanäle</string>
@@ -483,20 +484,20 @@
<string name="watch_history_states_deleted">Wiedergabeposition gelöscht.</string>
<string name="missing_file">Datei verschoben oder gelöscht</string>
<string name="overwrite_finished_warning">Eine heruntergeladene Datei mit diesem Namen existiert bereits</string>
<string name="overwrite_failed">kann die Datei nicht überschreiben</string>
<string name="overwrite_failed">Datei kann nicht überschrieben werden</string>
<string name="download_already_pending">Es gibt einen ausstehenden Download mit diesem Namen</string>
<string name="error_postprocessing_stopped">NewPipe wurde während der Verarbeitung der Datei geschlossen</string>
<string name="error_insufficient_storage">Kein Speicherplatz mehr auf dem Gerät</string>
<string name="error_progress_lost">Vorgang abgebrochen, da die Datei gelöscht wurde</string>
<string name="confirm_prompt">Bist Du sicher\?</string>
<string name="confirm_prompt">Möchtest du deinen Downloadverlauf oder alle heruntergeladenen Dateien löschen\?</string>
<string name="enable_queue_limit">Downloadwarteschlange begrenzen</string>
<string name="enable_queue_limit_desc">Ein Download wird zur gleichen Zeit ausgeführt</string>
<string name="start_downloads">Downloads starten</string>
<string name="pause_downloads">Downloads anhalten</string>
<string name="downloads_storage_ask_title">Frage, wohin heruntergeladen werden soll</string>
<string name="downloads_storage_ask_summary">Du wirst gefragt, wohin Du jeden Download speichern willst</string>
<string name="downloads_storage_ask_summary_kitkat">Du wirst gefragt, wohin Du jeden Download speichern willst.
\nAktiviere diese Option, wenn Du auf die externe SD-Karte herunterladen möchtest</string>
<string name="downloads_storage_ask_summary">Du wirst gefragt, wohin du jeden Download speichern willst</string>
<string name="downloads_storage_ask_summary_kitkat">Du wirst gefragt, wohin du jeden Download speichern willst.
\nAktiviere diese Option, wenn du auf die externe SD-Karte herunterladen möchtest</string>
<string name="downloads_storage_use_saf_title">SAF verwenden</string>
<string name="downloads_storage_use_saf_summary">Das Storage Access Framework erlaubt Downloads auf eine externe SD-Karte.
\nHinweis: Manche Geräte sind nicht kompatibel</string>
@@ -505,7 +506,7 @@
<string name="delete_playback_states_alert">Alle Wiedergabepositionen löschen\?</string>
<string name="download_choose_new_path">Ändere die Downloadordner, damit sie wirksam werden</string>
<string name="drawer_header_description">Dienst umschalten, aktuell ausgewählt:</string>
<string name="default_kiosk_page_summary">Quiosque Predefinido</string>
<string name="default_kiosk_page_summary">Standard-Kiosk</string>
<string name="no_one_watching">Niemand schaut zu</string>
<plurals name="watching">
<item quantity="one">%s Zuschauer</item>
@@ -517,4 +518,30 @@
<item quantity="other">%s Zuhörer</item>
</plurals>
<string name="localization_changes_requires_app_restart">Die Sprache ändert sich, sobald die App neu gestartet wird.</string>
<string name="peertube_instance_url_title">PeerTube-Instanzen</string>
<string name="peertube_instance_url_help">Finde auf %s die Instanzen, die am besten zu dir passen</string>
<string name="peertube_instance_add_title">Instanz hinzufügen</string>
<string name="peertube_instance_add_help">URL der Instanz eingeben</string>
<string name="peertube_instance_add_fail">Validierung der Instanz fehlgeschlagen</string>
<string name="peertube_instance_add_exists">Instanz existiert bereits</string>
<string name="local">Lokal</string>
<string name="recently_added">Kürzlich hinzugefügt</string>
<string name="playlist_no_uploader">Auto-generiert (kein Uploader gefunden)</string>
<string name="choose_instance_prompt">Wähle eine Instanz</string>
<string name="peertube_instance_url_summary">Bevorzugte Peertube-Instanzen auswählen</string>
<string name="peertube_instance_add_https_only">Es werden nur HTTPS-Adressen unterstützt</string>
<string name="seek_duration_title">Dauer der Suche bei schnellem Vor-/Zurückspulen</string>
<string name="most_liked">Am beliebtesten</string>
<string name="recovering">Wiederherstellen</string>
<string name="error_download_resource_gone">Dieser Download kann nicht wiederhergestellt werden</string>
<string name="enable_lock_screen_video_thumbnail_title">Video-Vorschaubild für Sperrbildschirm aktivieren</string>
<string name="enable_lock_screen_video_thumbnail_summary">Bei Verwendung des Hintergrundplayers wird ein Video-Miniaturbild auf dem Sperrbildschirm angezeigt</string>
<string name="clear_download_history">Downloadverlauf löschen</string>
<string name="delete_downloaded_files">Heruntergeladene Dateien löschen</string>
<string name="deleted_downloads">%1$s Downloads gelöscht</string>
<string name="permission_display_over_apps">Berechtigung zur Anzeige über andere Apps erteilen</string>
<string name="app_language_title">Sprache der App</string>
<string name="systems_language">Systemstandard</string>
<string name="subtitle_activity_recaptcha">\"Fertig\" drücken, wenn es gelöst wurde</string>
<string name="recaptcha_done_button">Fertig</string>
</resources>

View File

@@ -206,7 +206,7 @@
<string name="sorry_string">Λυπούμαστε, αυτό δεν έπρεπε να έχει συμβεί.</string>
<string name="error_report_button_text">Αναφορά σφάλματος με ηλεκτρονικό ταχυδρομίο</string>
<string name="error_snackbar_message">Λυπούμαστε, συνέβησαν κάποια σφάλματα.</string>
<string name="info_labels">What:\\nΑίτημα:\\nΓλώσσα περιεχομένου:\\nΥπηρεσία:\\nΏρα GMT:\\nΠακέτο:\\nΈκδοση:\\nΈκδοση λειτουργικού:</string>
<string name="info_labels">Τι:\\nΑίτημα:\\nΓλώσσα περιεχομένου:\\nΥπηρεσία:\\nΏρα GMT:\\nΠακέτο:\\nΈκδοση:\\nΈκδοση λειτουργικού συστήματος:</string>
<string name="user_report">Αναφορά χρήστη</string>
<string name="search_no_results">Κανένα αποτέλεσμα</string>
<string name="empty_subscription_feed_subtitle">Δεν υπάρχει τίποτα εδώ</string>
@@ -251,8 +251,8 @@
<string name="msg_popup_permission">Αυτή η άδεια είναι απαραίτητη για
\nτο άνοιγμα αναδυόμενων παραθύρων</string>
<string name="one_item_deleted">1 αντικείμενο διαγράφηκε.</string>
<string name="reCaptchaActivity">Αυτόματο τεστ</string>
<string name="reCaptcha_title">Πρόκληση reCAPTCHA</string>
<string name="recaptcha">Αυτόματο τεστ</string>
<string name="title_activity_recaptcha">Πρόκληση reCAPTCHA</string>
<string name="recaptcha_request_toast">Ζητήθηκε πρόκληση reCAPTCHA</string>
<string name="settings_file_charset_title">Επιτρεπόμενοι χαρακτήρες σε ονόματα αρχείων</string>
<string name="settings_file_replacement_character_summary">Οι μη έγκυροι χαρακτήρες αντικαθίστανται με αυτήν την τιμή</string>
@@ -516,4 +516,12 @@
</plurals>
<string name="localization_changes_requires_app_restart">Η γλώσσα θα αλλάξει μόλις θα επανεκκινηθεί η εφαρμογή.</string>
<string name="default_kiosk_page_summary">Προεπιλεγμένο περίπτερο</string>
<string name="peertube_instance_add_https_only">Υποστηρίζονται μόνο διευθύνσεις URL HTTPS</string>
<string name="local">Τοπικό</string>
<string name="recently_added">Προστέθηκε πρόσφατα</string>
<string name="playlist_no_uploader">Δημιουργήθηκε αυτόματα (δεν βρέθηκε χρήστης μεταφόρτωσης)</string>
<string name="recovering">Ανάκτηση</string>
<string name="error_download_resource_gone">Δεν είναι δυνατή η ανάκτηση αυτής της λήψης</string>
<string name="enable_lock_screen_video_thumbnail_title">Ενεργοποίηση μικρογραφίας βίντεο στην οθόνη κλειδώματος</string>
<string name="enable_lock_screen_video_thumbnail_summary">Όταν χρησιμοποιείται αναπαραγωγή παρασκηνίου μια μικρογραφία βίντεο θα εμφανίζεται στην οθόνη κλειδώματος</string>
</resources>

View File

@@ -4,20 +4,20 @@
<string name="upload_date_text">Eldonita je %1$s</string>
<string name="install">Instali</string>
<string name="cancel">Nuligi</string>
<string name="open_in_browser">Malfermi per krozilo</string>
<string name="open_in_browser">Malfermi en retumilo</string>
<string name="share">Konigi</string>
<string name="download">Elŝuti</string>
<string name="search">Serĉi</string>
<string name="settings">Agordoj</string>
<string name="did_you_mean">Ĉu vi signifis: %1$s\?</string>
<string name="share_dialog_title">Konigi kun</string>
<string name="choose_browser">Elekti krozilon</string>
<string name="choose_browser">Elekti retumilon</string>
<string name="screen_rotation">turno</string>
<string name="use_external_video_player_title">Uzi eksteran filmetoludilon</string>
<string name="use_external_audio_player_title">Uzi eksteran sonludilon</string>
<string name="default_resolution_title">Defaŭlta distingivo</string>
<string name="play_with_kodi_title">Legi per Kodi</string>
<string name="show_play_with_kodi_title">Montri \"Legi per Kodi\"-opcion</string>
<string name="default_resolution_title">Defaŭlta rezolucio</string>
<string name="play_with_kodi_title">Ludi per Kodi</string>
<string name="show_play_with_kodi_title">Montri \"Ludi per Kodi\"-opcion</string>
<string name="play_audio">Sono</string>
<string name="default_audio_format_title">Defaŭlta sondosierformo</string>
<string name="theme_title">Etoso</string>
@@ -30,8 +30,8 @@
<string name="settings_category_video_audio_title">Filmeto kaj sono</string>
<string name="settings_category_appearance_title">Apero</string>
<string name="settings_category_other_title">Alia</string>
<string name="background_player_playing_toast">Ludado fone</string>
<string name="play_btn_text">Legi</string>
<string name="background_player_playing_toast">Ludanta fone</string>
<string name="play_btn_text">Ludi</string>
<string name="general_error">Eraro</string>
<string name="network_error">Reteraro</string>
<string name="content_not_available">Enhavo malhavebla</string>
@@ -41,12 +41,12 @@
<string name="no_player_found">Neniu elsendlflua ludilo trovita. Ĉu vi volas instali la aplikaĵon VLC\?</string>
<string name="kore_not_found">La aplikaĵo Kore ne estas trovita. Ĉu instali ĝin?</string>
<string name="show_next_and_similar_title">Montri la sekvan filmeton kaj similajn filmetojn</string>
<string name="could_not_load_thumbnails">Ĉiuj miniaturoj ne ŝargeblas</string>
<string name="could_not_load_thumbnails">Ĉiuj bildetoj ne ŝargeblas</string>
<string name="youtube_signature_decryption_error">La subskribo de la ligilo de la filmeto ne malĉifreblas</string>
<string name="parsing_error">La retejo ne analizeblas</string>
<string name="list_thumbnail_view_description">Miniaturo de la antaŭrigardo de la filmeto</string>
<string name="detail_thumbnail_view_description">Legi filmeton, daŭro:</string>
<string name="detail_uploader_thumbnail_view_description">Miniaturo de la bildo de la alŝutinto</string>
<string name="list_thumbnail_view_description">Bildeto de la antaŭrigardo de la filmeto</string>
<string name="detail_thumbnail_view_description">Ludi filmeton, daŭro:</string>
<string name="detail_uploader_thumbnail_view_description">Bildeto de la alŝutinto</string>
<string name="err_dir_create">La elŝutujo \'%1$s\' ne kreeblas</string>
<string name="info_dir_created">Elŝutujo \'%1$s\' kreita</string>
<string name="download_path_title">Elŝutujo por filmetoj</string>
@@ -61,17 +61,17 @@
<string name="error_report_button_text">Signali eraron per retpoŝto</string>
<string name="error_snackbar_action">SIGNALI</string>
<string name="what_device_headline">Informoj:</string>
<string name="your_comment">Via komento (en la angla):</string>
<string name="your_comment">Vian komenton (angle):</string>
<string name="error_details_headline">Detaloj:</string>
<string name="report_error">Signali eraron</string>
<string name="video">Filmeto</string>
<string name="retry">Reprovi</string>
<string name="main_bg_subtitle">Premu serĉo por komenci</string>
<string name="main_bg_subtitle">Premi serĉon por komenci</string>
<string name="no_player_found_toast">Neniu elsendlflua ludilo trovita (instalu VLC por ludi ĝin).</string>
<string name="open_in_popup_mode">Malfermi en ŝprucfenestron modon</string>
<string name="use_external_video_player_summary">Forigas aŭdion ĉe KELKAJ distingivoj</string>
<string name="popup_mode_share_menu_title">NewPipe ŝprucfenestron modon</string>
<string name="subscribe_button_title">Abonu</string>
<string name="open_in_popup_mode">Malfermi en ŝprucfenestran modon</string>
<string name="use_external_video_player_summary">Forigas aŭdon ĉe KELKAJ rezolucioj</string>
<string name="popup_mode_share_menu_title">NewPipe ŝprucfenestran modon</string>
<string name="subscribe_button_title">Aboni</string>
<string name="subscribed_button_title">Abonita</string>
<string name="channel_unsubscribed">Kanalo malabonita</string>
<string name="subscription_change_failed">Ne povis ŝanĝi abonon</string>
@@ -80,19 +80,19 @@
<string name="show_info">Montri informojn</string>
<string name="tab_main">Ĉefa</string>
<string name="tab_subscriptions">Abonoj</string>
<string name="tab_bookmarks">Legosigno</string>
<string name="tab_bookmarks">Konservitaj ludlistoj</string>
<string name="fragment_whats_new">Kio novas</string>
<string name="controls_background_title">Fono</string>
<string name="controls_popup_title">Ŝprucfenestro</string>
<string name="controls_add_to_playlist_title">Aldonu al</string>
<string name="autoplay_by_calling_app_title">Aŭtomata play</string>
<string name="autoplay_by_calling_app_summary">Legas filmeton kiam NewPipe vokas de alia programo</string>
<string name="default_popup_resolution_title">Defaŭlta distingivo de la ŝprucfenestro</string>
<string name="show_higher_resolutions_title">Montri pli altajn distingivojn</string>
<string name="show_higher_resolutions_summary">Nur kelkaj aparatoj subtenas legante 2K / 4K filmetojn</string>
<string name="autoplay_by_calling_app_summary">Ludas filmeton kiam NewPipe vokas el alia programo</string>
<string name="default_popup_resolution_title">Defaŭlta rezolucio de la ŝprucfenestra ludilo</string>
<string name="show_higher_resolutions_title">Montri pli altajn rezoluciojn</string>
<string name="show_higher_resolutions_summary">Nur kelkaj aparatoj subtenas ludi 2K / 4K filmetojn</string>
<string name="default_video_format_title">Defaŭlta fomato de filmeto</string>
<string name="black_theme_title">Nigra</string>
<string name="popup_remember_size_pos_title">Memoru ŝprucfenestron kaj pozicion</string>
<string name="popup_remember_size_pos_title">Memoru ŝprucfenestran grandecon kaj pozicion</string>
<string name="popup_remember_size_pos_summary">Memoru lastan grandecon kaj pozicion de ŝprucfenestro</string>
<string name="use_inexact_seek_title">Uzu rapide, ne preciza serĉon</string>
<string name="use_inexact_seek_summary">Ne preciza serĉo permesas al la ludanto serĉi poziciojn pli rapide kun malalta precizeco</string>
@@ -109,8 +109,8 @@
<string name="error_report_title">Erarosignalo</string>
<string name="could_not_load_image">Ne povis ŝarĝi bildon</string>
<string name="app_ui_crash">Apo kraŝis</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="reCaptcha_title">reCAPTCHA defio</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="title_activity_recaptcha">reCAPTCHA defio</string>
<string name="recaptcha_request_toast">reCAPTCHA defio petita</string>
<string name="all">Ĉiuj</string>
<string name="channel">Kanalo</string>
@@ -120,10 +120,10 @@
</plurals>
<string name="yes">Jes</string>
<string name="later">Poste</string>
<string name="msg_popup_permission">Tiu permeso estas necesa por
\nmalfermi en ŝprucfenestro modo</string>
<string name="popup_playing_toast">Leganta en ŝprucfenestro modo</string>
<string name="disabled">Malaktiva</string>
<string name="msg_popup_permission">Tiu permeso estas necesa por
\nmalfermi en ŝprucfenestra modo</string>
<string name="popup_playing_toast">Ludante en ŝprucfenestra modo</string>
<string name="disabled">Malŝatitaj</string>
<string name="filter">Filtri</string>
<string name="refresh">Aktualigi</string>
<string name="clear">Forviŝi</string>
@@ -133,19 +133,19 @@
<string name="player_gesture_controls_summary">Uzu gestojn por kontroli la brilon kaj volumenon de la ludilo</string>
<string name="show_search_suggestions_title">Serĉi sugestojn</string>
<string name="show_search_suggestions_summary">Montri sugestojn kiam serĉanto</string>
<string name="best_resolution">Plej bona distingivo</string>
<string name="best_resolution">Plej bona rezolucio</string>
<string name="app_description">Libera malpeza torentado ĉe Android.</string>
<string name="settings_category_downloads_title">Elŝuti</string>
<string name="charset_letters_and_digits">Leteroj kaj ciferoj</string>
<string name="charset_most_special_characters">Plej specialaj karakteroj</string>
<string name="resume_on_audio_focus_gain_title">Rekomencu en fokusa gajno</string>
<string name="resume_on_audio_focus_gain_summary">Daŭrigi la legon post la interrompaĵoj (ekzemple telefonadoj)</string>
<string name="resume_on_audio_focus_gain_title">Rekomenci en fokusa gajno</string>
<string name="resume_on_audio_focus_gain_summary">Daŭrigi la ludon post la interrompaĵoj (ekzemple telefonadoj)</string>
<string name="enable_search_history_title">Serĉa historio</string>
<string name="enable_search_history_summary">Konservi la historio de serĉo lokale</string>
<string name="enable_watch_history_title">Rigardu historion</string>
<string name="enable_watch_history_summary">Spuri la viditajn filmetojn</string>
<string name="notification_channel_name">Newpipe Sciifo</string>
<string name="notification_channel_description">Sciigoj por NewPipe fono kaj ŝprucfenestroj ludiloj</string>
<string name="notification_channel_name">NewPipe Sciigo</string>
<string name="notification_channel_description">Sciigoj por NewPipe fonaj kaj ŝprucfenestraj ludiloj</string>
<string name="settings_category_player_title">Ludilo</string>
<string name="settings_category_player_behavior_title">Konduto</string>
<string name="settings_category_history_title">Historio kaj kaŝmemoro</string>
@@ -156,70 +156,70 @@
<string name="top_50">Supro 50</string>
<string name="new_and_hot">Nova &amp; varma</string>
<string name="show_hold_to_append_title">Montri la indiko « Tenu por aldoni »</string>
<string name="show_hold_to_append_summary">Montri indikon kiam la fono aŭ ŝprucfenestro butono estas premita en la retpaĝo de dalatadoj de la filmeto</string>
<string name="background_player_append">Viciĝita en la ludilo en fono</string>
<string name="popup_playing_append">Viciĝita en ŝprucfenestro ludilo</string>
<string name="play_all">Ludi ĉiuj</string>
<string name="show_hold_to_append_summary">Montri indikon kiam la fona aŭ ŝprucfenestra butono estas premita en la retpaĝo de dalatadoj de la filmeto</string>
<string name="background_player_append">Viciĝita en la fona ludilo</string>
<string name="popup_playing_append">Viciĝita en ŝprucfenestra ludilo</string>
<string name="play_all">Ludi ĉiujn</string>
<string name="player_stream_failure">Ne povis ludi tion torenton</string>
<string name="player_unrecoverable_failure">Neatendebla eraro de ludilo okazis</string>
<string name="player_recoverable_failure">Reakiri el eraro de la ludilo</string>
<string name="title_activity_background_player">Fona ludilo</string>
<string name="title_activity_popup_player">Ŝprucfenestro ludilo</string>
<string name="title_activity_popup_player">Ŝprucfenestra ludilo</string>
<string name="play_queue_remove">Retiri</string>
<string name="play_queue_stream_detail">Detalado</string>
<string name="play_queue_audio_settings">Sonaj parametroj</string>
<string name="hold_to_append">Teni por viciĝi</string>
<string name="unknown_content">[Nekonata]</string>
<string name="enqueue_on_background">Viciĝi en la fono</string>
<string name="enqueue_on_background">Viciĝi en la fona ludilo</string>
<string name="enqueue_on_popup">Viciĝi en nova ŝprucfenestro</string>
<string name="start_here_on_popup">Komencu ludi en nova ŝprucfenestro</string>
<string name="default_content_country_title">Defaŭlta enhava lando</string>
<string name="start_here_on_popup">Komenci ludi en nova ŝprucfenestro</string>
<string name="default_content_country_title">Preferata enhavlando</string>
<string name="toggle_orientation">Ŝangi Orientiĝon</string>
<string name="switch_to_background">Ŝanĝi al Fono</string>
<string name="switch_to_popup">Ŝanĝi al ŝprucfenestro</string>
<string name="switch_to_main">Ŝangi al Ĉefa</string>
<string name="service_title">Servo</string>
<string name="always">Ĉiam</string>
<string name="just_once">Nur unfoje</string>
<string name="just_once">Nur unufoje</string>
<string name="invalid_url_toast">Nevalida ligilo</string>
<string name="video_streams_empty">Neniuj filmeta torentoj trovitaj</string>
<string name="audio_streams_empty">Neniuj sonaj torentoj trovis</string>
<string name="popup_player">Ŝprucfenestro ludilo</string>
<string name="popup_player">Ŝprucfenestra ludilo</string>
<string name="import_data_title">Importi la datumbazon</string>
<string name="export_data_title">Eksporti la datumbazon</string>
<string name="import_data_summary">Anstataŭigas vian aktualan historion kaj abonojn</string>
<string name="export_data_summary">Eksporti historion, abonojn kaj ludlistoj</string>
<string name="always_ask_open_action">Ĉiam peti</string>
<string name="create_playlist">Nova ludlisto</string>
<string name="delete_playlist">Forigi</string>
<string name="delete_playlist">Forviŝi</string>
<string name="rename_playlist">Alinomi</string>
<string name="playlist_name_input">Nomo</string>
<string name="append_playlist">Aldoni al la ludlisto</string>
<string name="set_as_playlist_thumbnail">Meti kiel bildeto de ludlisto</string>
<string name="bookmark_playlist">Legosigno Ludlisto</string>
<string name="unbookmark_playlist">Forigi Legosignon</string>
<string name="delete_playlist_prompt">Ĉu forigi ĉi tiun ludliston \?</string>
<string name="unbookmark_playlist">Forviŝi Legosignon</string>
<string name="delete_playlist_prompt">Ĉu forviŝi ĉi tiun ludliston \?</string>
<string name="playlist_creation_success">Ludlisto kreita</string>
<string name="playlist_add_stream_success">Ludlistita</string>
<string name="playlist_thumbnail_change_success">Bildeto de ludlisto ŝanĝiĝita.</string>
<string name="playlist_delete_failure">Ne povis forigi ludlisto.</string>
<string name="playlist_delete_failure">Ne povis forviŝi ludliston.</string>
<string name="settings_category_debug_title">Malcimigi</string>
<string name="auto_queue_title">Auto-vico sekva fluo</string>
<string name="auto_queue_summary">Aŭto-aldoni rilatan enhavon kiam leganta la lasta enhavo en malrepetita atendovico</string>
<string name="auto_queue_summary">Aŭto-aldoni rilatan enhavon kiam ludanta la lasta enhavo en malrepetita atendovico</string>
<string name="file">Dosiero</string>
<string name="invalid_directory">Tia dosierujo ne ekzistas</string>
<string name="invalid_source">Tia dosiero/enhavo ne ekzistas</string>
<string name="file_name_empty_error">Dosiernomo ne povas esti malplena</string>
<string name="error_occurred_detail">Eraro okazis : %1$s</string>
<string name="import_youtube_instructions">Importu Jutubajn abonaĵojn per elŝuti la dosieron de eksporto :
\n
\n1. Iru ĉe tie retpaĝo : %1$s
\n2. Ensalutu kiam oni petas vin
\n3. Elŝuto devus komenci (ĝi estas la dosiero de eksporto)</string>
<string name="import_soundcloud_instructions">Importu Soundcloud-n profilon per elŝuti la dosieron de eksporto :
<string name="error_occurred_detail">Eraro okazis: %1$s</string>
<string name="import_youtube_instructions">Importu Jutubajn abonaĵojn per elŝuti la dosieron de eksporto :
\n
\n1. Ebligu komputilon modon en krozilo (la retejo malhaveblas por poŝtelefonoj)
\n2. Iru al tie retpaĝo : %1$s
\n1. Iru ĉe tiu retpaĝo: %1$s
\n2. Ensalutu kiam oni petas vin
\n3. Elŝuto devus komenci (ĝi estas la dosiero de eksporto)</string>
<string name="import_soundcloud_instructions">Importu Soundcloud-n profilon tajpante ĉu la ligilon, ĉu vian ID :
\n
\n1. Ebligu komputilon modon en retumilon (la retejo malhaveblas por poŝtelefonoj)
\n2. Iru tien: %1$s
\n3. Ensalutu kiam oni petas vin
\n4. Kopiu la ligilon de profilo ke oni kondikis vin.</string>
<string name="download_thumbnail_summary">Malŝaltu por malebligi ŝarĝajn bildetojn, konservi datumojn kaj uzadon de memoro. Ŝanĝoj forviŝas ambaŭ en-memoro kaj sur-disko bildo kaŝmemoro.</string>
@@ -236,13 +236,13 @@
<string name="clear_search_history_summary">Forviŝi la serĉajn ŝlosilvortojn</string>
<string name="delete_search_history_alert">Ĉu vi volas forviŝi la totalon de la historio de serĉo \?</string>
<string name="search_history_deleted">Historio de serĉo forviŝita.</string>
<string name="limit_mobile_data_usage_title">Limigi distingivo kiam uzanta moveblan datumon</string>
<string name="minimize_on_exit_popup_description">Minimumigi al ŝprucfenestro ludilo</string>
<string name="limit_mobile_data_usage_title">Limigi rezolucio kiam uzanta moveblan datumon</string>
<string name="minimize_on_exit_popup_description">Minimumigi al ŝprucfenestra ludilo</string>
<string name="channels">Kanaloj</string>
<string name="playlists">Ludlistoj</string>
<string name="tracks">Spuroj</string>
<string name="users">Uzantoj</string>
<string name="unsubscribe">Malabonu</string>
<string name="unsubscribe">Malaboni</string>
<string name="tab_new">Nova ongleto</string>
<string name="tab_choose">Elektu ongleton</string>
<string name="volume_gesture_control_title">Kontrolo de volumena gesto</string>
@@ -252,7 +252,7 @@
<string name="settings_category_updates_title">Ĝisdatigoj</string>
<string name="file_deleted">Dosiero forviŝita</string>
<string name="app_update_notification_channel_name">Sciigo por ĝisdatigi apon</string>
<string name="app_update_notification_channel_description">Sciigo por nova versio de Newpipe</string>
<string name="app_update_notification_channel_description">Sciigo por nova versio de NewPipe</string>
<string name="download_to_sdcard_error_title">Ekstera konservejo malhavebla</string>
<string name="download_to_sdcard_error_message">Elŝuti al ekstera SD-karto ne eblas. Ĉu vi volas restarigi la elŝutan dosierujon \?</string>
<string name="queued">viciĝita</string>
@@ -265,7 +265,7 @@
<string name="conferences">Konferencoj</string>
<string name="show_comments_title">Montri komentojn</string>
<string name="show_comments_summary">Malebligu por malvidigi komentojn</string>
<string name="autoplay_title">Aŭtolego</string>
<string name="autoplay_title">Aŭtoludo</string>
<plurals name="comments">
<item quantity="one">Komentoj</item>
<item quantity="other"/>
@@ -281,7 +281,7 @@
<string name="watch_history_states_deleted">Ludaj pozicioj forviŝitaj.</string>
<string name="missing_file">Dosiero movita aŭ forviŝita</string>
<string name="overwrite_failed">ne povas dispremi la dosieron</string>
<string name="confirm_prompt">Ĉu vi certas\?</string>
<string name="confirm_prompt">Ĉu vi volas forviŝi vian historion de elŝutoj aŭ forviŝi la tutajn elŝutitajn dosierojn\?</string>
<string name="enable_queue_limit">Limigi la elŝutan atendovicon</string>
<string name="enable_queue_limit_desc">Unu elŝuto ruliĝos en la sama tempo</string>
<string name="start_downloads">Komenci elŝutojn</string>
@@ -291,8 +291,8 @@
<string name="downloads_storage_ask_summary_kitkat">Oni petos vin kie konservi ĉion elŝutaĵon.
\nElektu AFM se vi volas elŝuti al ekstera SD-karto</string>
<string name="downloads_storage_use_saf_title">Uzu AFM</string>
<string name="downloads_storage_use_saf_summary">La Atinga Framo al la Memoro ebligas elŝuti al ekstera SD-karto.
\nKomento : kelkaj aparatoj ne kongruas</string>
<string name="downloads_storage_use_saf_summary">La Atinga Framo al la Memoro ebligas elŝuti al ekstera SD-karto.
\nKomento: kelkaj aparatoj ne kongruas</string>
<string name="clear_playback_states_title">Forviŝi ludajn poziciojn</string>
<string name="clear_playback_states_summary">Forviŝi la totalon de ludaj pozicioj</string>
<string name="delete_playback_states_alert">Ĉu vi volas forviŝi ĉiujn ludajn poziciojn \?</string>
@@ -307,7 +307,7 @@
<string name="start">Komenci</string>
<string name="pause">Paŭzigi</string>
<string name="view">Ludi</string>
<string name="delete">Forigi</string>
<string name="delete">Forviŝi</string>
<string name="checksum">Kontrolsumo</string>
<string name="add">Nova misio</string>
<string name="finish">Bone</string>
@@ -341,8 +341,8 @@
<string name="tab_licenses">Permesiloj</string>
<string name="view_on_github">Rigardu ĉe GitHub</string>
<string name="app_license_title">Permesilo de NewPipe</string>
<string name="contribution_encouragement">Ĉu vi havas ideojn pri; traduko, desegnaĵoj ŝanĝoj, purigado de kodo, aŭ realaj masivaj ŝanĝoj—helpo estas ĉiam bonvena. Ju pli oni faras, des pli bonas!</string>
<string name="read_full_license">Legu permesilon</string>
<string name="contribution_encouragement">Ĉu vi havas ideojn pri; traduko, desegnaĵoj ŝanĝoj, purigado de kodo, aŭ realaj masivaj ŝanĝoj—helpo ĉiam estas bonvena. Ju pli oni faras, des pli bonas!</string>
<string name="read_full_license">Legi permesilon</string>
<string name="contribution_title">Kontribui</string>
<string name="settings_file_charset_title">Permesitaj karakteroj en dosiernomoj</string>
<string name="settings_file_replacement_character_summary">Nevalidaj karakteroj estas anstataŭigita kun ĉi tiu valoro</string>
@@ -353,7 +353,7 @@
<string name="history_disabled">La historio estas malŝatita</string>
<string name="action_history">Historio</string>
<string name="history_empty">La historio estas malplena</string>
<string name="history_cleared">Historio vakigita</string>
<string name="history_cleared">Historio forviŝita</string>
<string name="search_no_results">Neniuj rezultoj</string>
<string name="empty_subscription_feed_subtitle">Neniu enhavo</string>
<string name="no_subscribers">Neniuj abonantoj</string>
@@ -375,12 +375,12 @@
<string name="no_channel_subscribed_yet">Neniuj kanalaj abonoj ankoraŭ</string>
<string name="select_a_kiosk">Elekti kioskon</string>
<string name="start_here_on_main">Komenci ludi ĉi tie</string>
<string name="start_here_on_background">Komenci ludi en la fono</string>
<string name="start_here_on_background">Komenci ludi fone</string>
<string name="donation_title">Donaci</string>
<string name="donation_encouragement">NewPipe estas programada par volontuoj, elspezante tempo por alporti vin la plej bona sperto. Redonu por helpi programistojn plibonigi NewPipe dum ĝuante tason da kafo.</string>
<string name="donation_encouragement">NewPipe estas programadita par volontuoj, elspezante tempo por alporti vin la plej bona sperto. Redoni por helpi programistojn plibonigi NewPipe dum ĝuante tason da kafo.</string>
<string name="give_back">Redoni</string>
<string name="website_title">Retejo</string>
<string name="website_encouragement">Vizitu la retejon de NewPipe por pli da informoj kaj novaĵoj.</string>
<string name="website_encouragement">Viziti la retejon de NewPipe por pli da informoj kaj novaĵoj.</string>
<string name="drawer_open">Malfermi la tirkeston</string>
<string name="drawer_close">Fermi la tirtekston</string>
<string name="external_player_unsupported_link_type">Ekstaraj ludantoj ne suportas tiajn ligilojn</string>
@@ -395,8 +395,8 @@
<string name="override_current_data">Ĉi tio nuligos vian nunan aranĝon.</string>
<string name="detail_drag_description">Trenu por reorgidi</string>
<string name="create">Krei</string>
<string name="delete_one">Forigi Unu</string>
<string name="delete_all">Forigi ĉiujn</string>
<string name="delete_one">Forviŝi Unu</string>
<string name="delete_all">Forviŝi ĉiujn</string>
<string name="dismiss">Rezigni</string>
<string name="rename">Alinomi</string>
<string name="delete_stream_history_prompt">Ĉu vi volas forviŝi tion eron el la spekta historio \?</string>
@@ -413,7 +413,7 @@
<string name="enable_leak_canary_summary">La monitorado de la memorlikadoj povas frostigi la apon dum la hejta dumpingo</string>
<string name="enable_disposed_exceptions_title">Signali ekster-vivciklajn erarojn</string>
<string name="enable_disposed_exceptions_summary">Perforti signalante neenretigaj Rx esceptoj eksere la fragmento aŭ aktiveco vivciklo post dispono</string>
<string name="invalid_file">La dosiero ne ekzistas aŭ la legopermeso mankas</string>
<string name="invalid_file">La dosiero ne ekzistas aŭ la ludopermeso mankas</string>
<string name="import_export_title">Importi/eksporti</string>
<string name="import_title">Importi</string>
<string name="import_from">Importi el</string>
@@ -437,14 +437,14 @@
<string name="caption_setting_title">Subtitoloj</string>
<string name="caption_setting_description">Modifi la dimension de la teksto kaj la fonajn stilojn de la subtitoloj de la ludilo. Ĝi bezonas restarto de la apo por efektiviĝi.</string>
<string name="one_item_deleted">1 ero forviŝita.</string>
<string name="app_license">NewPipe estas programaro sub rajtoceda permesilo: Vi povas uzi, studi, komuniki kaj plibonigi ĝin kiel vi volas. Precize, vi povas redistribui kaj/aŭ modifi ĝin sub la kondiĉojn de la Ĝenerala Publika Permesilo de GNU, kiel publikigita per la Free Software Foundation, ĉu en la versio 3, ĉu (se vi volas) ajna posta versio.</string>
<string name="app_license">NewPipe estas programaro sub rajtoceda permesilo: Vi povas uzi, studi, komuniki kaj plibonigi ĝin kiel vi volas. Precize, vi povas redistribui kaj/aŭ modifi ĝin sub la kondiĉoj de la Ĝenerala Publika Permesilo de GNU, kiel publikigita per la Free Software Foundation, ĉu en la versio 3, ĉu (se vi volas) ajna posta versio.</string>
<string name="import_settings">Ĉu vi volas ankaŭ importi agordojn\?</string>
<string name="privacy_policy_title">Privateca politiko de NewPipe</string>
<string name="privacy_policy_encouragement">La NewPipe projekto respektas vian privatecon serioze. Konsekvence, la apo ne kolektas ajnan datumo sen via konsento.
\nLa privateco politiko de Newpipe detale eksplikas kion datumon estas sendita kaj stokita kiam vi sendas falegosignalon.</string>
<string name="privacy_policy_encouragement">La NewPipe projekto serioze respektas vian privatecon. Konsekvence, la apo ne kolektas ajnan datumon sen via konsento.
\nLa privateco politiko de NewPipe detale eksplikas kion datumon estas sendita kaj stokita kiam vi sendas falegosignalon.</string>
<string name="read_privacy_policy">Legi la privatecan politikon</string>
<string name="start_accept_privacy_policy">Por konformiĝi al la Ĝenerala Datum-Protekta Regularon (GDPR), ni allogas vian atento al la privateca politiko de NewPipe. Bonvolu legi ĝin atentive.
\nVi devas akcepti ĝin por sendi nin la cimsignalo.</string>
<string name="start_accept_privacy_policy">Por konformiĝi al la Ĝenerala Datum-Protekta Regularon (GDPR), ni allogas vian atenton al la privateca politiko de NewPipe. Bonvolu atentive legi ĝin.
\nVi devas akcepti ĝin por sendi la cimsignalon al ni.</string>
<string name="accept">Akcepti</string>
<string name="decline">Rifuzi</string>
<string name="limit_data_usage_none_description">Neniu limo</string>
@@ -455,7 +455,7 @@
<string name="skip_silence_checkbox">Plirapidigi dum silentoj</string>
<string name="playback_step">Paŝo</string>
<string name="playback_reset">Restarigi</string>
<string name="saved_tabs_invalid_json">Uzante defaŭltajn ongletojn, eraro dum leganta savajn ongletojn</string>
<string name="saved_tabs_invalid_json">Uzante defaŭltajn ongletojn, eraro ludante savajn ongletojn</string>
<string name="restore_defaults">Restaŭri la defaŭltojn</string>
<string name="restore_defaults_confirmation">Ĉu vi volas restaŭri la defaŭltojn \?</string>
<string name="subscribers_count_not_available">Kalkulo de abonantoj malhavebla</string>
@@ -468,8 +468,8 @@
<string name="grid">Krado</string>
<string name="auto">Aŭto</string>
<string name="switch_view">Ŝanĝi vidon</string>
<string name="app_update_notification_content_title">Ĝisdatigo de NewPipe havebla !</string>
<string name="app_update_notification_content_text">Premu por elŝuti</string>
<string name="app_update_notification_content_title">Ĝisdatigo de NewPipe havebla!</string>
<string name="app_update_notification_content_text">Premi por elŝuti</string>
<string name="missions_header_finished">Finita</string>
<string name="missions_header_pending">Pritraktata</string>
<string name="paused">Paŭzigita</string>
@@ -507,8 +507,8 @@
<string name="default_kiosk_page_summary">Defaŭlta Kiosko</string>
<string name="no_one_watching">Neniu spektas</string>
<plurals name="watching">
<item quantity="one">%s spektanta</item>
<item quantity="other">%s spektanta</item>
<item quantity="one">%s spektanto</item>
<item quantity="other">%s spektantoj</item>
</plurals>
<string name="no_one_listening">Neniu aŭskultas</string>
<plurals name="listening">
@@ -516,4 +516,34 @@
<item quantity="other">%s aŭskultantoj</item>
</plurals>
<string name="localization_changes_requires_app_restart">La lingvo ŝanĝos kiam la apo restartos.</string>
<string name="seek_duration_title">Rapida antaŭen / posten daŭron</string>
<string name="peertube_instance_url_title">Instancoj de PeerTube</string>
<string name="peertube_instance_url_summary">Elekti viajn preferitajn instancojn de PeerTube</string>
<string name="peertube_instance_url_help">Trovu la instancojn kiu vi povus ŝati ĉe %s</string>
<string name="peertube_instance_add_title">Aldoni instanco</string>
<string name="peertube_instance_add_help">Eniri la ligilon de la instanco</string>
<string name="peertube_instance_add_fail">Ne povis validigi instanco</string>
<string name="peertube_instance_add_https_only">Nur HTTPS ligiloj estas subtenitaj</string>
<string name="peertube_instance_add_exists">La instanco jam ekzistas</string>
<string name="local">Lokaj</string>
<string name="recently_added">Freŝe aldonitaj</string>
<string name="most_liked">La plej ŝatitaj</string>
<string name="playlist_no_uploader">Aŭtomate generita (neniu alŝutilo trovita)</string>
<string name="recovering">Reakiranta</string>
<string name="error_download_resource_gone">Ne povas reakiri tion elŝuton</string>
<string name="choose_instance_prompt">Elektu instancon</string>
<string name="enable_lock_screen_video_thumbnail_title">Enablu bildeta filmeton ĉe ŝlosita ekrano</string>
<string name="enable_lock_screen_video_thumbnail_summary">Uzante la fona ludilo, bildeta filmeto vidiĝos ĉe ŝlosita ekrano</string>
<string name="clear_download_history">Forviŝi la historion de elŝutoj</string>
<string name="delete_downloaded_files">Forviŝi elŝutitajn dosierojn</string>
<string name="deleted_downloads">%1$s elŝutoj forviŝitaj</string>
<string name="videos_string">Filmetoj</string>
<string name="permission_display_over_apps">Doni la permeson por afiŝiĝi supre aliaj apoj</string>
<string name="app_language_title">Preferata aplingvo</string>
<string name="systems_language">Sistemnormo</string>
<string name="subtitle_activity_recaptcha">Premu « Finita » kiam solvita</string>
<string name="recaptcha_done_button">Finita</string>
<plurals name="dynamic_seek_duration_description">
<item quantity="other">%s sekundoj</item>
</plurals>
</resources>

View File

@@ -115,11 +115,11 @@
<string name="short_thousand">k</string>
<string name="short_million">M</string>
<string name="short_billion">MM</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="open_in_popup_mode">Abrir en modo emergente</string>
<string name="msg_popup_permission">Se necesita este permiso
\npara abrir en modo emergente</string>
<string name="reCaptcha_title">Reto reCAPTCHA</string>
<string name="title_activity_recaptcha">Reto reCAPTCHA</string>
<string name="recaptcha_request_toast">Reto reCAPTCHA requerido</string>
<string name="popup_mode_share_menu_title">Modo emergente de NewPipe</string>
<string name="popup_playing_toast">Reproduciendo en modo emergente</string>
@@ -221,7 +221,7 @@
<string name="select_a_channel">Seleccione un canal</string>
<string name="no_channel_subscribed_yet">No hay suscripciones a canales todavía</string>
<string name="select_a_kiosk">Seleccione un kiosco</string>
<string name="kiosk">Kiosco</string>
<string name="kiosk">Quiosco</string>
<string name="trending">Tendencias</string>
<string name="top_50">50 mejores</string>
<string name="show_hold_to_append_summary">Mostrar sugerencia cuando se presiona el botón de 2.º plano o emergente en la página de detalles del vídeo</string>
@@ -425,7 +425,7 @@
<string name="grid">Mostrar como grilla</string>
<string name="list">Mostrar como lista</string>
<string name="clear_finished_download">Limpiar descargas finalizadas</string>
<string name="confirm_prompt">¿Lo confirma\?</string>
<string name="confirm_prompt">¿Quiere limpiar su historial de descargas o eliminar todos los ficheros descargados\?</string>
<string name="stop">Detener</string>
<string name="max_retry_msg">Intentos máximos</string>
<string name="max_retry_desc">Cantidad máxima de intentos antes de cancelar la descarga</string>
@@ -517,5 +517,29 @@
<item quantity="one">%s escucha</item>
<item quantity="other">%s escuchas</item>
</plurals>
<string name="localization_changes_requires_app_restart">El idioma cambiará luego de que la app sea reiniciada.</string>
<string name="localization_changes_requires_app_restart">El idioma cambiará luego de que se reinicie la aplicación.</string>
<string name="seek_duration_title">Duración de búsqueda al avanzar y/o retroceder</string>
<string name="peertube_instance_url_title">Instancias de PeerTube</string>
<string name="peertube_instance_url_summary">Selecciona tus instancias favoritas de PeerTube</string>
<string name="peertube_instance_url_help">Encuentra las mejores instancias para ti en %s</string>
<string name="peertube_instance_add_title">Agregar instancia</string>
<string name="peertube_instance_add_help">Ingresar URL de la instancia</string>
<string name="peertube_instance_add_fail">No se pudo validar la instancia</string>
<string name="peertube_instance_add_https_only">Solo se admiten URL HTTPS</string>
<string name="peertube_instance_add_exists">La instancia ya existe</string>
<string name="local">Local</string>
<string name="recently_added">Agregados recientemente</string>
<string name="most_liked">Más gustados</string>
<string name="playlist_no_uploader">Generado automáticamente (no se encontró creador)</string>
<string name="choose_instance_prompt">Elige una instancia</string>
<string name="enable_lock_screen_video_thumbnail_title">Habilitar miniatura de video de la pantalla de bloqueo</string>
<string name="enable_lock_screen_video_thumbnail_summary">Al usar el reproductor de fondo, se mostrará una miniatura de video en la pantalla de bloqueo</string>
<string name="clear_download_history">Limpiar historial de descargas</string>
<string name="delete_downloaded_files">Eliminar archivos descargados</string>
<string name="deleted_downloads">Eliminadas %1$s descargas</string>
<string name="permission_display_over_apps">Dar permisos para que se muestre por sobre otras apps</string>
<string name="app_language_title">Idioma de aplicación</string>
<string name="systems_language">Predeterminado del sistema</string>
<string name="subtitle_activity_recaptcha">Pulse en «Hecho» cuando esté resuelto</string>
<string name="recaptcha_done_button">Hecho</string>
</resources>

View File

@@ -238,7 +238,7 @@
<string name="msg_popup_permission">Need õigused on vajalikud
\nhüpikakna avamiseks</string>
<string name="one_item_deleted">Kustutati 1 element.</string>
<string name="reCaptchaActivity">"reCAPTCHA "</string>
<string name="recaptcha">"reCAPTCHA "</string>
<string name="settings_category_downloads_title">Laadi alla</string>
<string name="settings_file_charset_title">Lubatud tähemärgid failinimedes</string>
<string name="settings_file_replacement_character_summary">Vigased tähemärgid asendatakse selle väärtusega</string>
@@ -370,7 +370,7 @@
<string name="tracks">Lood</string>
<string name="users">Kasutajad</string>
<string name="switch_to_main">Lülitu peamisele</string>
<string name="reCaptcha_title">reCAPTCHA nõue</string>
<string name="title_activity_recaptcha">reCAPTCHA nõue</string>
<string name="recaptcha_request_toast">reCAPTCHA nõude taotlus</string>
<string name="copyright" formatted="true">© %1$s %2$s %3$s alla</string>
<string name="app_description">Vaba kergekaaluline Androidi voogesitus.</string>

View File

@@ -139,8 +139,8 @@
<string name="no_available_dir">Ezarri deskargetarako karpeta bat ezarpenetan geroago</string>
<string name="msg_popup_permission">Baimen hau beharrezkoa da
\nlaster-leiho moduan irekitzeko</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="reCaptcha_title">reCAPTCHA erronka</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="title_activity_recaptcha">reCAPTCHA erronka</string>
<string name="recaptcha_request_toast">reCAPTCHA erronka eskatu da</string>
<string name="title_activity_about">NewPipe aplikazioari buruz</string>
<string name="action_settings">Ezarpenak</string>
@@ -199,8 +199,8 @@
</plurals>
<string name="no_videos">Bideorik ez</string>
<plurals name="videos">
<item quantity="one">Bideoa</item>
<item quantity="other">Bideoak</item>
<item quantity="one">Bideo %</item>
<item quantity="other">% bideo</item>
</plurals>
<string name="title_activity_history">Historiala</string>
<string name="title_history_search">Bilatuta</string>
@@ -488,7 +488,7 @@
<string name="error_postprocessing_stopped">NewPipe itxi egin da fitxategian lanean zegoela</string>
<string name="error_insufficient_storage">Ez dago lekurik gailuan</string>
<string name="error_progress_lost">Progresioa galdu da, fitxategia ezabatu delako</string>
<string name="confirm_prompt">Ziur al zaude\?</string>
<string name="confirm_prompt">Zure deskargen historiala garbitu nahi duzu ala deskargatutako fitxategi guztiak ezabatu\?</string>
<string name="enable_queue_limit">Mugatu deskargen ilara</string>
<string name="enable_queue_limit_desc">Deskarga bakarra aldi berean</string>
<string name="start_downloads">Hasi deskargak</string>
@@ -500,13 +500,13 @@
<string name="download_choose_new_path">Aldatu deskargen karpetak indarrean jartzeko</string>
<string name="no_one_watching">Ez dago inor ikusten</string>
<plurals name="watching">
<item quantity="one">%s ikusten</item>
<item quantity="other">%s ikusten</item>
<item quantity="one">ikusle %s</item>
<item quantity="other">%s ikusle</item>
</plurals>
<string name="no_one_listening">Ez dago inor entzuten</string>
<plurals name="listening">
<item quantity="one">%s entzuten</item>
<item quantity="other">%s entzuten</item>
<item quantity="one">entzule %s</item>
<item quantity="other">%s entzule</item>
</plurals>
<string name="downloads_storage_use_saf_title">SAF erabili</string>
<string name="downloads_storage_use_saf_summary">Biltegian Sartzeko Armazoiak kanpoko SD txartel betera jaitsierak egitea ahalbidetzen du.
@@ -517,4 +517,30 @@
<string name="drawer_header_description">Aktibatu zerbitzua, orain hautatua:</string>
<string name="localization_changes_requires_app_restart">Hizkuntza aldatuko da aplikazioa berrabiarazterakoan.</string>
<string name="default_kiosk_page_summary">Kiosko Lehenetsia</string>
<string name="seek_duration_title">Aurreratze/atzeratze bilaketaren iraupena</string>
<string name="peertube_instance_url_title">PeerTube instantziak</string>
<string name="peertube_instance_url_summary">Hautatu zure gogoko PeerTube instantziak</string>
<string name="peertube_instance_url_help">Aurkitu instantziak hemen: %s</string>
<string name="peertube_instance_add_title">Gehitu instantzia</string>
<string name="peertube_instance_add_help">Sartu instantziaren URLa</string>
<string name="peertube_instance_add_fail">Ezin izan da instantzia balioztatu</string>
<string name="peertube_instance_add_https_only">HTTPS URLak onartzen dira soilik</string>
<string name="peertube_instance_add_exists">Instantzia badago aurretik</string>
<string name="local">Lokala</string>
<string name="recently_added">Berriki gehitua</string>
<string name="most_liked">Gogokoenak</string>
<string name="playlist_no_uploader">Automatikoki sortua (igotzailea ez da aurkitu)</string>
<string name="recovering">berreskuratzen</string>
<string name="error_download_resource_gone">Ezin da deskarga hau berreskuratu</string>
<string name="choose_instance_prompt">Aukeratu instantzia</string>
<string name="enable_lock_screen_video_thumbnail_title">Gaitu bideoaren iruditxoa blokeo pantailan</string>
<string name="enable_lock_screen_video_thumbnail_summary">Bigarren planoko erreproduzigailua erabiltzean bideoaren iruditxo bat bistaratuko da blokeo pantailan</string>
<string name="clear_download_history">Garbitu deskargen historiala</string>
<string name="delete_downloaded_files">Ezabatu deskargatutako fitxategiak</string>
<string name="deleted_downloads">%1$s deskarga ezabatuta</string>
<string name="permission_display_over_apps">Eman beste aplikazioen gainean erakusteko baimena</string>
<string name="app_language_title">Aplikazioaren hizkuntza</string>
<string name="systems_language">Sisteman lehenetsia</string>
<string name="subtitle_activity_recaptcha">Sakatu \"Egina\" konponduta dagoenean</string>
<string name="recaptcha_done_button">Egina</string>
</resources>

View File

@@ -296,7 +296,7 @@
<string name="use_inexact_seek_title">زمان فعلی پخش کننده را به صورت تقریبی و سریع جلو ببر</string>
<string name="use_inexact_seek_summary">این گزینه باعث می شود هنگام جلو/عقب کردن زمان تصویر، به جای زمان دقیق انتخاب شده، به زمان غیر دقیق و نزدیک به مکان انتخاب شده برود که این کار سریع تر انجام می شود</string>
<string name="app_ui_crash">کاره یا رابط کاربری با خطا مواجه شد</string>
<string name="reCaptchaActivity">ریکپچا</string>
<string name="recaptcha">ریکپچا</string>
<string name="settings_category_downloads_title">بارگیری</string>
<string name="toggle_orientation">تغییر جهت</string>
<string name="switch_to_background">تغییر وضعیت به پس‌زمینه</string>
@@ -361,7 +361,7 @@
<string name="undo">بازگردانی</string>
<string name="background_player_append">در صف پخش کننده پس‌زمینه قرار گرفت</string>
<string name="info_labels">چه:\\nدرخواست:\\nزبان درخواست:\\nخدمت:\\nزمان GMT:\\nنگارش:\\nنگارش س.ع:\\nبازه آی‌پی:</string>
<string name="reCaptcha_title">چالش ری‌کپچا</string>
<string name="title_activity_recaptcha">چالش ری‌کپچا</string>
<string name="recaptcha_request_toast">نیاز به چالش ری‌کپچا است</string>
<string name="msg_popup_permission">این مجوز مورد نیاز است
\nتا بتوان به حالت تصویر در تصویر رفت</string>

View File

@@ -173,8 +173,8 @@
<string name="msg_copied">Kopioitu leikepöydälle</string>
<string name="no_available_dir">Valitse saatavilla oleva latauskansio</string>
<string name="msg_popup_permission">Tämä käyttöoikeus tarvitaan ponnahdusikkunan käytölle</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="reCaptcha_title">reCAPTCHA Haaste</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="title_activity_recaptcha">reCAPTCHA Haaste</string>
<string name="recaptcha_request_toast">reCAPTCHA Haaste pyydetty</string>
<string name="settings_category_downloads_title">Lataus</string>
<string name="settings_file_charset_title">Sallitut merkit tiedostonimissä</string>
@@ -400,4 +400,6 @@
<string name="unsubscribe">Peru tilaus</string>
<string name="tab_new">Uusi välilehti</string>
<string name="tab_choose">Valitse välilehti</string>
<string name="missions_header_finished">Valmis</string>
<string name="enqueue">Jono</string>
</resources>

View File

@@ -39,4 +39,7 @@
<string name="controls_popup_title">Popup</string>
<string name="controls_add_to_playlist_title">Idagdag sa</string>
<string name="download_path_title">Folder ng pag-download ng video</string>
<string name="download_path_dialog_title">Pumili ng folder kung saan ido-download ang mga bidyo</string>
<string name="download_path_audio_summary">Nakaimbak sa folder na ito ang mga nai-download na mga audio files</string>
<string name="download_path_audio_dialog_title">Pumili ng folder kung saan ido-download ang mga audio files</string>
</resources>

View File

@@ -19,14 +19,14 @@
<string name="share">Partager</string>
<string name="share_dialog_title">Partager avec</string>
<string name="show_play_with_kodi_summary">Affiche une option pour lire une vidéo via Kodi</string>
<string name="show_play_with_kodi_title">Afficher loption «Lire avec Kodi»</string>
<string name="show_play_with_kodi_title">Afficher loption « Lire avec Kodi »</string>
<string name="upload_date_text">Publiée le %1$s</string>
<string name="view_count_text">%1$s vues</string>
<string name="play_audio">Audio</string>
<string name="default_audio_format_title">Format audio par défaut</string>
<string name="download_dialog_title">Télécharger</string>
<string name="next_video_title">Suivant</string>
<string name="show_next_and_similar_title">Afficher les vidéos «Suivantes» et «Similaires»</string>
<string name="show_next_and_similar_title">Afficher les vidéos « Suivantes » et « Similaires »</string>
<string name="url_not_supported_toast">URL non pris en charge</string>
<string name="settings_category_video_audio_title">Vidéo et audio</string>
<string name="settings_category_other_title">Autre</string>
@@ -50,8 +50,8 @@
<string name="download_path_audio_title">Dossier de téléchargement audio</string>
<string name="download_path_audio_summary">Les fichiers audio téléchargés sont stockés ici</string>
<string name="download_path_audio_dialog_title">Choisissez le dossier de téléchargement des fichiers audio</string>
<string name="err_dir_create">Impossible de créer le répertoire de téléchargement «%1$s»</string>
<string name="info_dir_created">Répertoire de téléchargement «%1$s» créé</string>
<string name="err_dir_create">Impossible de créer le répertoire de téléchargement « %1$s »</string>
<string name="info_dir_created">Répertoire de téléchargement « %1$s » créé</string>
<string name="general_error">Erreur</string>
<string name="parsing_error">Impossible danalyser le site web</string>
<string name="content_not_available">Contenu indisponible</string>
@@ -93,7 +93,7 @@
<string name="add">Nouvelle mission</string>
<string name="finish">OK</string>
<string name="msg_name">Nom du fichier</string>
<string name="msg_threads">Fils de discussion</string>
<string name="msg_threads">Nombre de connexions simultanées</string>
<string name="msg_error">Erreur</string>
<string name="msg_server_unsupported">Serveur non pris en charge</string>
<string name="msg_exists">Fichier déjà existant</string>
@@ -105,24 +105,24 @@
<string name="no_available_dir">Veuillez définir ultérieurement un dossier de téléchargement dans les paramètres</string>
<string name="could_not_load_image">Impossible de charger limage</string>
<string name="app_ui_crash">Lapplication a planté</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="black_theme_title">Noir</string>
<string name="all">Tout</string>
<string name="channel">Chaîne</string>
<string name="reCaptcha_title">Défi reCAPTCHA</string>
<string name="title_activity_recaptcha">Défi reCAPTCHA</string>
<string name="recaptcha_request_toast">Défi reCAPTCHA demandé</string>
<string name="open_in_popup_mode">Ouvrir en mode flottant</string>
<string name="popup_mode_share_menu_title">Mode flottant NewPipe</string>
<string name="popup_playing_toast">Lecture en mode flottant</string>
<string name="yes">Oui</string>
<string name="later">Plus tard</string>
<string name="disabled">Désactivé</string>
<string name="disabled">Désactivés</string>
<string name="info_labels">Quoi :\\nRequête :\\nLangue du contenu :\\nService :\\nHeure UTC :\\nPaquet :\\nVersion :\\nVersion du système dexploitation :</string>
<string name="short_thousand">k</string>
<string name="short_million">M</string>
<string name="msg_popup_permission">Cette autorisation est nécessaire pour
\nutiliser le mode flottant</string>
<string name="controls_background_title">Arrière-plan</string>
<string name="controls_background_title">Lire l\'audio</string>
<string name="controls_popup_title">Flottant</string>
<string name="default_popup_resolution_title">Définition de la fenêtre flottante par défaut</string>
<string name="show_higher_resolutions_title">Afficher des définitions plus élevées</string>
@@ -130,7 +130,7 @@
<string name="default_video_format_title">Format vidéo par défaut</string>
<string name="popup_remember_size_pos_title">Mémoriser les taille et position de la fenêtre flottante</string>
<string name="popup_remember_size_pos_summary">Mémorise les dernières taille et position de la fenêtre flottante</string>
<string name="settings_category_popup_title">Fenêtre flottante</string>
<string name="settings_category_popup_title">Fenêtré</string>
<string name="filter">Filtre</string>
<string name="refresh">Rafraîchir</string>
<string name="clear">Effacer</string>
@@ -185,7 +185,7 @@
<string name="notification_channel_name">Notification NewPipe</string>
<string name="undo">Annuler</string>
<string name="enable_watch_history_summary">Garde un suivi des vidéos vues</string>
<string name="resume_on_audio_focus_gain_title">Reprendre à lobtention de la cible de saisie</string>
<string name="resume_on_audio_focus_gain_title">Reprendre lors du retour dans l\'application</string>
<string name="settings_category_player_title">Lecteur</string>
<string name="settings_category_player_behavior_title">Comportement</string>
<string name="settings_category_history_title">Historique et cache</string>
@@ -205,8 +205,8 @@
</plurals>
<string name="no_videos">Aucune vidéo</string>
<plurals name="videos">
<item quantity="one">Vidéo</item>
<item quantity="other">Vidéos</item>
<item quantity="one">%s vidéo</item>
<item quantity="other">%s vidéos</item>
</plurals>
<string name="charset_most_special_characters">Caractères spéciaux</string>
<string name="item_deleted">Élément supprimé</string>
@@ -231,8 +231,8 @@
<string name="play_queue_remove">Retirer</string>
<string name="play_queue_stream_detail">Détails</string>
<string name="play_queue_audio_settings">Paramètres audios</string>
<string name="show_hold_to_append_title">Afficher lastuce «Maintenir pour ajouter»</string>
<string name="show_hold_to_append_summary">Affiche lastuce lors de lappui du bouton «Arrière-plan» ou «Mode flottant» sur la page de détails dune vidéo</string>
<string name="show_hold_to_append_title">Afficher lastuce « Maintenir pour ajouter »</string>
<string name="show_hold_to_append_summary">Affiche lastuce lors de lappui du bouton « Arrière-plan » ou « Mode flottant » sur la page de détails dune vidéo</string>
<string name="unknown_content">[Inconnu]</string>
<string name="player_recoverable_failure">Récupération depuis lerreur du lecteur</string>
<string name="kiosk_page_summary">Kiosque</string>
@@ -275,8 +275,8 @@
<string name="export_data_summary">Exporte lhistorique, les abonnements et les listes de lecture</string>
<string name="export_complete_toast">Exporté</string>
<string name="import_complete_toast">Importé</string>
<string name="no_valid_zip_file">Aucun fichier ZIP valide</string>
<string name="could_not_import_all_files">Avertissement : impossible dimporter tous les fichiers.</string>
<string name="no_valid_zip_file">Fichier ZIP non valide</string>
<string name="could_not_import_all_files">Avertissement: Impossible d\'importer tous les fichiers.</string>
<string name="override_current_data">Cela effacera vos paramètres actuels.</string>
<string name="show_info">Afficher les infos</string>
<string name="tab_bookmarks">Listes de lecture enregistrées</string>
@@ -310,7 +310,7 @@
<string name="use_inexact_seek_title">Utiliser la recherche rapide approximative</string>
<string name="use_inexact_seek_summary">Permet au lecteur daccéder plus rapidement à une position au détriment de la précision</string>
<string name="download_thumbnail_title">Charger les miniatures</string>
<string name="download_thumbnail_summary">Désactiver pour empêcher le chargement des miniatures, afin de réduire lutilisation de la bande passante et de la mémoire. Modifier cette option vide les caches dimage en mémoire vive et sur le disque.</string>
<string name="download_thumbnail_summary">Désactivez pour empêcher le chargement des miniatures afin de réduire lutilisation de la bande passante et de la mémoire. La modification de cette option, vide le cache en mémoire vive et sur le disque.</string>
<string name="thumbnail_cache_wipe_complete_notice">Images en cache effacées</string>
<string name="metadata_cache_wipe_title">Effacer les métadonnées en cache</string>
<string name="metadata_cache_wipe_summary">Efface toutes les données de pages Web en cache</string>
@@ -325,7 +325,7 @@
<string name="drawer_header_action_paceholder_text">Quelque chose va bientôt apparaître ici ;D</string>
<string name="controls_download_desc">Télécharger le fichier de flux</string>
<string name="auto_queue_title">Vidéo suivante en file dattente</string>
<string name="auto_queue_summary">Ajoute automatiquement un flux lié lors de la lecture du dernier flux dans une file dattente sans répétition</string>
<string name="auto_queue_summary">Lecture automatique après la file d\'attente</string>
<string name="settings_category_debug_title">Débogage</string>
<string name="resize_fill">Remplir</string>
<string name="caption_auto_generated">Générés automatiquement</string>
@@ -348,11 +348,11 @@
\n1. Suivez ce lien : %1$s.
\n2. Connectez-vous à votre compte.
\n3. Un téléchargement va démarrer (celui du fichier dexportation).</string>
<string name="import_soundcloud_instructions">Veuillez importer un profil SoundCloud en saisissant lURL de votre profil ou votre identifiant.
\n
\n1. Activez le «mode bureau» dans votre navigateur web (le site nest pas disponible pour les appareils mobiles).
\n2. Suivez cette URL : %1$s.
\n3. Connectez-vous à votre compte.
<string name="import_soundcloud_instructions">Veuillez importer un profil SoundCloud en saisissant lURL de votre profil ou votre identifiant.
\n
\n1. Activez le « mode bureau » dans votre navigateur web (le site nest pas disponible pour les appareils mobiles).
\n2. Suivez cette URL : %1$s.
\n3. Connectez-vous à votre compte.
\n4. Copiez lURL du profil vers lequel vous venez dêtre redirigé.</string>
<string name="import_soundcloud_instructions_hint">votre identifiant, soundcloud.com/votreidentifiant</string>
<string name="import_network_expensive_warning">Cette opération peut charger énormément la connexion réseau.
@@ -381,7 +381,7 @@
<string name="app_license">NewPipe est un logiciel sous licence libre copyleft : vous pouvez lutiliser, létudier, le partager et laméliorer comme bon vous semble. Plus précisément, vous pouvez le redistribuer ou le modifier sous les termes de la licence générale publique GNU, comme publiée par la Free Software Foundation, dans sa version 3, ou, à votre convenance, dans une version quelconque version ultérieure.</string>
<string name="privacy_policy_title">Politique de confidentialité de NewPipe</string>
<string name="read_privacy_policy">Lire la politique de confidentialité</string>
<string name="import_settings">Voulez-vous également importer des paramètres\?</string>
<string name="import_settings">Voulez-vous également importer les paramètres\?</string>
<string name="accept">Accepter</string>
<string name="decline">Refuser</string>
<string name="privacy_policy_encouragement">Le projet NewPipe prend votre vie privée très à cœur. Par conséquent, lapplication nenvoie aucune donnée sans votre consentement.
@@ -401,7 +401,7 @@
<string name="minimize_on_exit_summary">Action lors du basculement à une autre application depuis le lecteur vidéo — %s</string>
<string name="minimize_on_exit_none_description">Aucune</string>
<string name="minimize_on_exit_background_description">Minimiser pour lire en arrière-plan</string>
<string name="minimize_on_exit_popup_description">Minimiser pour lire en mode flottant</string>
<string name="minimize_on_exit_popup_description">Basculer vers le mode fenêtré</string>
<string name="unsubscribe">Se désabonner</string>
<string name="tab_new">Nouvel onglet</string>
<string name="tab_choose">Sélectionner un onglet</string>
@@ -421,14 +421,14 @@
<string name="stop">Arrêter</string>
<string name="events">Évènements</string>
<string name="download_to_sdcard_error_message">Impossible de télécharger dans la carte mémoire externe. Voulez-vous réinitialiser lemplacement du dossier de téléchargement\?</string>
<string name="main_page_content_summary">Sélection des onglets à afficher sur la page principale</string>
<string name="main_page_content_summary">Choisir quels onglets seront visibles sur la page principale</string>
<string name="updates_setting_title">Mises à jour</string>
<string name="updates_setting_description">Afficher une notification pour proposer une mise à jour de lapplication lorsquune nouvelle version est disponible</string>
<string name="list">Liste</string>
<string name="grid">Grille</string>
<string name="auto">Auto</string>
<string name="switch_view">Changer de vue</string>
<string name="app_update_notification_content_title">Une mise à jour de NewPipe disponible!</string>
<string name="app_update_notification_content_title">Une mise à jour de NewPipe est disponible !</string>
<string name="app_update_notification_content_text">Appuyer pour télécharger</string>
<string name="missions_header_finished">Terminé</string>
<string name="missions_header_pending">En attente</string>
@@ -443,7 +443,7 @@
<string name="overwrite">Écraser</string>
<string name="overwrite_unrelated_warning">Un fichier avec ce nom existe déjà</string>
<string name="overwrite_finished_warning">Un fichier téléchargé avec ce nom existe déjà</string>
<string name="download_already_running">Il y a un téléchargement en cours avec ce nom</string>
<string name="download_already_running">Il y a déjà un téléchargement en cours avec ce nom</string>
<string name="show_error">Afficher lerreur</string>
<string name="label_code">Code</string>
<string name="error_path_creation">Le dossier de destination ne peut pas être créé</string>
@@ -464,7 +464,7 @@
<string name="error_postprocessing_failed">Le post-traitement a échoué</string>
<string name="max_retry_msg">Nombre maximum de tentatives</string>
<string name="max_retry_desc">Nombre maximum de tentatives avant dannuler le téléchargement</string>
<string name="saved_tabs_invalid_json">Utilisation des onglets par défaut, erreur lors de la lecture des onglets enregistrés</string>
<string name="saved_tabs_invalid_json">En utilisation les onglets par défaut, une erreur est survenue en lisant les onglets sauvegardés</string>
<string name="error_http_unsupported_range">Le serveur naccepte pas les téléchargements multi-fils, veuillez réessayer avec @string/msg_threads = 1</string>
<string name="show_comments_title">Afficher les commentaires</string>
<string name="show_comments_summary">Désactiver pour ne pas afficher les commentaires</string>
@@ -484,7 +484,7 @@
<string name="error_postprocessing_stopped">NewPipe a été fermé alors quil travaillait sur le fichier</string>
<string name="error_insufficient_storage">Aucun espace disponible sur le périphérique</string>
<string name="error_progress_lost">Progression perdue, car le fichier a été effacé</string>
<string name="confirm_prompt">Êtes-vous sûr\?</string>
<string name="confirm_prompt">Voulez-vous effacer l\'historique de téléchargement ou supprimer tous les fichiers téléchargés \?</string>
<string name="enable_queue_limit">Limiter la file dattente de téléchargement</string>
<string name="enable_queue_limit_desc">Un téléchargement sexécutera en même temps</string>
<string name="start_downloads">Démarrer les téléchargements</string>
@@ -508,8 +508,8 @@
<string name="default_kiosk_page_summary">Kiosque par défaut</string>
<string name="no_one_watching">Personne ne regarde</string>
<plurals name="watching">
<item quantity="one">%s regarde</item>
<item quantity="other">%s regardent</item>
<item quantity="one">%s spectateur</item>
<item quantity="other">%s spectateurs</item>
</plurals>
<string name="no_one_listening">Personne n\'écoute</string>
<plurals name="listening">
@@ -517,4 +517,30 @@
<item quantity="other">%s auditeurs</item>
</plurals>
<string name="localization_changes_requires_app_restart">La langue changera lors du redémarrage de l\'application.</string>
<string name="seek_duration_title">Avance/rembobinage rapide sur une durée</string>
<string name="peertube_instance_url_title">Instances PeerTube</string>
<string name="peertube_instance_url_summary">Choisissez vos instances PeerTube préférées</string>
<string name="peertube_instance_url_help">Cherchez des instances qui pourraient vous intéresser sur %s</string>
<string name="peertube_instance_add_title">Ajouter une instance</string>
<string name="peertube_instance_add_help">Entrez lURL de linstance</string>
<string name="peertube_instance_add_fail">Échec de validation de linstance</string>
<string name="peertube_instance_add_https_only">Sont prises en charge uniquement les URLs en HTTPS</string>
<string name="peertube_instance_add_exists">Linstance existe déjà</string>
<string name="local">Local</string>
<string name="recently_added">Ajoutées récemment</string>
<string name="most_liked">Les plus aimées</string>
<string name="recovering">récupération</string>
<string name="error_download_resource_gone">Impossible de récupérer ce téléchargement</string>
<string name="choose_instance_prompt">Choisissez une instance</string>
<string name="playlist_no_uploader">Généré automatiquement (pas de téléverseur trouvé)</string>
<string name="enable_lock_screen_video_thumbnail_title">Activer la vidéo miniaturisée sur l\'écran de verrouillage</string>
<string name="enable_lock_screen_video_thumbnail_summary">En utilisant le lecteur audio, la miniature de la vidéo sera affichée sur l\'écran de verrouillage</string>
<string name="clear_download_history">Effacer l\'historique de téléchargement</string>
<string name="delete_downloaded_files">Supprimer les fichiers téléchargés</string>
<string name="deleted_downloads">%1$s téléchargements supprimés</string>
<string name="permission_display_over_apps">Autoriser la superposition d\'applis</string>
<string name="app_language_title">Langue de l\'application</string>
<string name="systems_language">Prédéfini par le système</string>
<string name="subtitle_activity_recaptcha">Appuyez sur « Terminé » une fois résolu</string>
<string name="recaptcha_done_button">Terminé</string>
</resources>

View File

@@ -266,8 +266,8 @@
\npara abrir o vídeo no modo «popup»</string>
<string name="one_item_deleted">1 elemento foi eliminado.</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="reCaptcha_title">Desafío reCAPTCHA</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="title_activity_recaptcha">Desafío reCAPTCHA</string>
<string name="recaptcha_request_toast">Desafío reCAPTCHA solicitado</string>
<string name="settings_category_downloads_title">Descarregar</string>

View File

@@ -19,7 +19,7 @@
<string name="use_external_video_player_title">שימוש בנגן סרטונים חיצוני</string>
<string name="use_external_video_player_summary">בחלק מהרזולוציות השמע יוסר</string>
<string name="use_external_audio_player_title">שימוש בנגן סרטונים חיצוני</string>
<string name="popup_mode_share_menu_title">מצב חלון צף של NewPipe</string>
<string name="popup_mode_share_menu_title">מצב חלון צף</string>
<string name="controls_background_title">רקע</string>
<string name="controls_popup_title">חלון צף</string>
<string name="download_path_title">תיקייה להורדת סרטונים</string>
@@ -33,9 +33,9 @@
<string name="default_resolution_title">רזולוציית בררת המחדל</string>
<string name="default_popup_resolution_title">רזולוציית בררת המחדל לחלון צף</string>
<string name="show_higher_resolutions_title">הצגת רזולוציות גבוהות יותר</string>
<string name="show_higher_resolutions_summary">רק חלק מהמכשירים תומכים בצפייה בסרטונים ב־2K/4K</string>
<string name="show_higher_resolutions_summary">רק חלק מהמכשירים יכולים לנגן סרטונים ב־2K/4K</string>
<string name="play_with_kodi_title">נגינה ב־Kodi</string>
<string name="kore_not_found">היישומון Kore לא נמצא. להתקין אותו\?</string>
<string name="kore_not_found">להתקין את יישומון Kore החסר\?</string>
<string name="show_play_with_kodi_title">הצגת האפשרות לניגון עם Kodi</string>
<string name="show_play_with_kodi_summary">הצגת אפשרות לנגן סרטון דרך מרכז המדיה Kodi</string>
<string name="play_audio">שמע</string>
@@ -65,7 +65,7 @@
<string name="play_btn_text">נגינה</string>
<string name="content">תוכן</string>
<string name="show_age_restricted_content_title">תוכן עם הגבלת גיל</string>
<string name="video_is_age_restricted">הצגת סרטונים עם הגבלת גיל. ניתן לאפשר תכנים שכאלו דרך ההגדרות.</string>
<string name="video_is_age_restricted">הצגת סרטונים עם הגבלת גיל. ניתן לשנות את זה בעתיד דרך ההגדרות.</string>
<string name="duration_live">חי</string>
<string name="downloads">הורדות</string>
<string name="downloads_title">הורדות</string>
@@ -110,10 +110,10 @@
<string name="enable_search_history_summary">שמירת שאילתות החיפוש מקומית</string>
<string name="enable_watch_history_title">היסטוריית צפייה</string>
<string name="enable_watch_history_summary">תיעוד הסרטונים שנצפו</string>
<string name="resume_on_audio_focus_gain_title">להמשיך את הניגון עם החזרת המיקוד</string>
<string name="resume_on_audio_focus_gain_title">להמשיך את הניגון</string>
<string name="resume_on_audio_focus_gain_summary">להמשיך לנגן לאחר הפרעות (למשל: שיחות טלפון)</string>
<string name="show_hold_to_append_title">להציג את העצה „להחזיק כדי להוסיף לרשימת נגינה”</string>
<string name="show_hold_to_append_summary">להציג עצה בעת לחיצה על כפתור בנגן רקע או צף בעמוד פרטי סרטון</string>
<string name="show_hold_to_append_summary">להציג עצה בעת לחיצה על הרקע או על הכפתור של הנגן הצף ב„פרטים:” על הסרטון</string>
<string name="settings_category_player_title">נגן</string>
<string name="settings_category_player_behavior_title">התנהגות</string>
<string name="settings_category_history_title">היסטוריה ומטמון</string>
@@ -147,7 +147,7 @@
<string name="video">סרטון</string>
<string name="audio">שמע</string>
<string name="retry">ניסיון חוזר</string>
<string name="storage_permission_denied">הגישה לאחסון נדחתה</string>
<string name="storage_permission_denied">יש להעניק גישה לאחסון תחילה</string>
<string name="short_thousand">ק׳</string>
<string name="short_million">מ׳</string>
<string name="short_billion">מיליארד</string>
@@ -167,10 +167,10 @@
</plurals>
<string name="no_videos">אין סרטונים</string>
<plurals name="videos">
<item quantity="one">סרטון %s</item>
<item quantity="two">%s סרטונים</item>
<item quantity="many">%s סרטונים</item>
<item quantity="other">%s סרטונים</item>
<item quantity="one">סרטון</item>
<item quantity="two">סרטונים</item>
<item quantity="many">סרטונים</item>
<item quantity="other">סרטונים</item>
</plurals>
<string name="start">התחלה</string>
<string name="pause">השהיה</string>
@@ -192,8 +192,8 @@
<string name="no_available_dir">נא לציין תיקיית הורדה בהגדרות בהמשך</string>
<string name="msg_popup_permission">הרשאה זו נדרשת לטובת
\nפתיחה בחלון צף</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="reCaptcha_title">אתגר reCAPTCHA</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="title_activity_recaptcha">אתגר reCAPTCHA</string>
<string name="recaptcha_request_toast">התקבלה בקשה לאתגר reCAPTCHA</string>
<string name="settings_category_downloads_title">הורדה</string>
<string name="settings_file_charset_title">רשימת תווים אפשרית בשמות קבצים</string>
@@ -216,7 +216,7 @@
<string name="contribution_encouragement">אם יש לך רעיון כלשהו בנוגע לתרגום, שינויי עיצוב, ניקוי הקוד או שינויים מהותיים בקוד - אנו תמיד שמחים לקבל עזרה. ככל שיותר דברים מתבצעים כך היישומון משתפר!</string>
<string name="view_on_github">הצגה ב־GitHub</string>
<string name="donation_title">תרומה</string>
<string name="donation_encouragement">הפיתוח של NewPipe נערך ע״י מתנדבים שמשקיעים את זמנם כדי להגיש לך את החוויה הטובה ביותר. באפשרותך להעניק בחזרה כדי לסייע למפתחים לשפר את NewPipe בעודם נהנים מכוס קפה.</string>
<string name="donation_encouragement">הפיתוח של NewPipe נערך ע״י מתנדבים שמשקיעים את זמנם הפנוי כדי להגיש לך את חווית השימוש הטובה ביותר. באפשרותך להעניק בחזרה כדי לסייע למפתחים לשפר את NewPipe בעודם נהנים מכוס קפה.</string>
<string name="give_back">לתרום בחזרה</string>
<string name="website_title">אתר הבית</string>
<string name="website_encouragement">מומלץ לבקר באתר של NewPipe לפרטים נוספים ולחדשות.</string>
@@ -254,7 +254,7 @@
<string name="enqueue_on_popup">הוספה לתור בנגן צף חדש</string>
<string name="start_here_on_main">להתחיל לנגן מכאן</string>
<string name="start_here_on_background">להתחיל לנגן ברקע</string>
<string name="start_here_on_popup">להתחיל לנגן בחלון צף חדש</string>
<string name="start_here_on_popup">להתחיל לנגן בנגן צף חדש</string>
<string name="controls_download_desc">הורדת קובץ הזרמה</string>
<string name="show_info">הצגת מידע</string>
<string name="tab_bookmarks">רשימות נגינה מסומנות</string>
@@ -338,7 +338,7 @@
<string name="download_thumbnail_summary">כיבוי האפשרות מונע את טעינת התמונות הממוזערות, חוסך בתקשורת נתונים ובניצולת הזיכרון. שינויים באפשרות זו מוחקים את המטמון בזיכרון ובכונן.</string>
<string name="metadata_cache_wipe_summary">הסרת כל נתוני העמודים שבמטמון</string>
<string name="auto_queue_title">הוספת התזרים הבא לרשימת הנגינה אוטומטית</string>
<string name="auto_queue_summary">להוסיף אוטומטית תזרים דומה בעת נגינת התזרים האחרון בתור שאינו מחזורי</string>
<string name="auto_queue_summary">להמשיך תור נגינה סופית (בלתי מחזורית) על ידי הוספת תזרים קשור</string>
<string name="toggle_orientation">החלפת כיווניות</string>
<string name="switch_to_main">העברה לראשי</string>
<string name="import_data_summary">משכתב את ההיסטוריה והמינויים הנוכחיים שלך</string>
@@ -377,7 +377,7 @@
<string name="resize_fit">התאמה</string>
<string name="caption_setting_title">כתוביות</string>
<string name="caption_setting_description">שינוי גודל כותרת הנגן וסגנונות הרקע. נדרשת הפעלה מחדש כדי ששינויים אלה יכנסו לתוקף.</string>
<string name="enable_leak_canary_title">הפעלת LeakCanary</string>
<string name="enable_leak_canary_title">LeakCanary</string>
<string name="enable_leak_canary_summary">מעקב אחר זליגת זיכרון עשויה לגרום ליישומון להיות בלתי זמין בזמן העתקת תוכן הזיכרון לקובץ</string>
<string name="import_soundcloud_instructions_hint">המזהה שלך, soundcloud.com/המזהה שלך</string>
<string name="import_network_expensive_warning">נא לשים לב כי פעולה זו עשויה להעמיס על תקשורת הנתונים.
@@ -399,18 +399,18 @@
<string name="tab_new">לשונית חדשה</string>
<string name="tab_choose">בחירת לשונית</string>
<string name="volume_gesture_control_title">מחוות בקרת עצמת שמע</string>
<string name="volume_gesture_control_summary">ניתן להשתמש במחוות כדי לשלוט בעצמת השמע של הנגן</string>
<string name="volume_gesture_control_summary">שימוש במחוות כדי לשלוט בעצמת השמע של הנגן</string>
<string name="brightness_gesture_control_title">מחוות בקרת בהירות</string>
<string name="brightness_gesture_control_summary">ניתן להשתמש במחוות כדי לשלוט בבהירות הנגן</string>
<string name="brightness_gesture_control_summary">שימוש במחוות כדי לשלוט בבהירות הנגן</string>
<string name="settings_category_updates_title">עדכונים</string>
<string name="file_deleted">נמחק קובץ</string>
<string name="app_update_notification_channel_name">התראת עדכון יישומון</string>
<string name="app_update_notification_channel_description">התראות על גרסה חדשה של NewPipe</string>
<string name="download_to_sdcard_error_title">האחסון החיצוני אינו זמין</string>
<string name="download_to_sdcard_error_message">אין אפשרות להוריד לכרטיס SD. לאפס את מיקום תיקיית ההורדה\?</string>
<string name="saved_tabs_invalid_json">נעשה שימוש בלשוניות בררת המחדל, אירעה שגיאה בעת קריאת הלשוניות שנשמרו</string>
<string name="saved_tabs_invalid_json">לא ניתן לקרוא לשוניות שמורות, לכן נעשה שימוש באלו של בררת המחדל</string>
<string name="restore_defaults">שחזור בררות מחדל</string>
<string name="restore_defaults_confirmation">לשחזר את בררות המחדל\?</string>
<string name="restore_defaults_confirmation">לשחזר בררות מחדל\?</string>
<string name="subscribers_count_not_available">מספר המנויים אינו זמין</string>
<string name="main_page_content_summary">אילו לשוניות תופענה בעמוד הראשי</string>
<string name="selection">בחירה</string>
@@ -456,7 +456,7 @@
<string name="error_file_creation">לא ניתן ליצור את הקובץ</string>
<string name="error_path_creation">לא ניתן ליצור את תיקיית היעד</string>
<string name="error_permission_denied">ההרשאה נדחתה על ידי המערכת</string>
<string name="error_ssl_exception">החיבור המאובטח נכשל</string>
<string name="error_ssl_exception">לא ניתן להקים חיבור מאובטח</string>
<string name="error_unknown_host">לא ניתן למצוא את השרת</string>
<string name="error_connect_host">לא ניתן להתחבר לשרת</string>
<string name="error_http_no_content">השרת לא שולח נתונים</string>
@@ -470,7 +470,7 @@
<string name="pause_downloads_on_mobile">לייצר הפרעה ברשתות מדודות</string>
<string name="pause_downloads_on_mobile_desc">שימושי בעת מעבר לחיבור רשת סלולרית, למרות שישנן הורדות שלא ניתן להשהות</string>
<string name="show_comments_title">הצגת תגובות</string>
<string name="show_comments_summary">יש להשבית כדי להפסיק הצגת תגובות</string>
<string name="show_comments_summary">יש להשבית כדי להפסיק הסתרת תגובות</string>
<string name="autoplay_title">ניגון אוטומטי</string>
<plurals name="comments">
<item quantity="one">תגובות</item>
@@ -490,13 +490,13 @@
<string name="watch_history_states_deleted">מיקומי הנגינה נמחקו.</string>
<string name="missing_file">הקובץ הועבר או נמחק</string>
<string name="overwrite_unrelated_warning">כבר קיים קובץ בשם הזה</string>
<string name="overwrite_failed">לא ניתן לשכתב על הקובץ</string>
<string name="overwrite_failed">לא ניתן לשכתב את הקובץ</string>
<string name="download_already_pending">כבר יש הורדה ממתינה בשם הזה</string>
<string name="error_postprocessing_stopped">NewPipe נסגר בזמן העבודה על הקובץ</string>
<string name="error_insufficient_storage">לא נשאר מקום במכשיר</string>
<string name="error_progress_lost">התהליך אבד כיוון שהקובץ נמחק</string>
<string name="error_timeout">החיבור המתין זמן רב מדי</string>
<string name="confirm_prompt">בוודאות\?</string>
<string name="confirm_prompt">למחוק את היסטוריית ההורדות שלך או למחוק את כל הקבצים שהורדת\?</string>
<string name="enable_queue_limit">הגבלת תור ההורדה</string>
<string name="enable_queue_limit_desc">רק הורדה אחת תרוץ בו־זמנית</string>
<string name="start_downloads">התחלת הורדות</string>
@@ -506,7 +506,7 @@
<string name="downloads_storage_ask_summary_kitkat">תוצג שאלה היכן לשמור כל הורדה.
\nיש להפעיל זאת אם ברצונך להוריד לכרטיס SD חיצוני</string>
<string name="downloads_storage_use_saf_title">שימוש ב־SAF</string>
<string name="downloads_storage_use_saf_summary">תשתית גישה לאחסון מאפשרת הורדות לכרטיס SD חיוני.
<string name="downloads_storage_use_saf_summary">תשתית גישה לאחסון מאפשרת הורדות לכרטיס SD חיצוני.
\nלתשומת לבך: חלק מהמכשירים אינם נתמכים</string>
<string name="clear_playback_states_title">מחיקת מיקומי נגינה</string>
<string name="clear_playback_states_summary">מחיקת כל מיקומי הנגינה</string>
@@ -529,4 +529,30 @@
</plurals>
<string name="localization_changes_requires_app_restart">השפה תוחלף עם הפעלת היישומון מחדש.</string>
<string name="default_kiosk_page_summary">קיוסק בררת מחדל</string>
<string name="seek_duration_title">משך קפיצה מהירה קדימה/אחורה</string>
<string name="peertube_instance_url_title">מופעים של PeerTube</string>
<string name="peertube_instance_url_summary">נא לבחור את מופעי ה־PeerTube המועדפים עליך</string>
<string name="peertube_instance_url_help">איתור המופעים האהובים עליך תחת %s</string>
<string name="peertube_instance_add_title">הוספת מופע</string>
<string name="peertube_instance_add_help">נא להכניס כתובת מופע</string>
<string name="peertube_instance_add_fail">לא ניתן לאמת את המופע</string>
<string name="peertube_instance_add_https_only">יש תמיכה בכתובות HTTPS בלבד</string>
<string name="peertube_instance_add_exists">המופע כבר קיים</string>
<string name="local">מקומי</string>
<string name="recently_added">נוספו לאחרונה</string>
<string name="most_liked">האהובים ביותר</string>
<string name="playlist_no_uploader">נוצרה אוטומטית (לא נמצא מעלה)</string>
<string name="recovering">בשחזור</string>
<string name="error_download_resource_gone">לא ניתן לשחזר את ההורדה הזאת</string>
<string name="choose_instance_prompt">נא לבחור מופע</string>
<string name="enable_lock_screen_video_thumbnail_title">תמונה מוקטנת של הסרטון במסך הנעילה</string>
<string name="enable_lock_screen_video_thumbnail_summary">תמונה מוקטנת של הסרטון תופיע על מסך הנעילה בעת שימוש בנגן הרקע</string>
<string name="clear_download_history">מחיקת היסטוריית ההורדות</string>
<string name="delete_downloaded_files">למחוק את הקבצים שהורדתי</string>
<string name="deleted_downloads">נמחקו %1$s הורדות</string>
<string name="permission_display_over_apps">יש להעניק הרשאה להציג על גבי יישומונים אחרים</string>
<string name="app_language_title">שפת היישומון</string>
<string name="systems_language">בררת המחדל של המערכת</string>
<string name="subtitle_activity_recaptcha">יש ללחוץ על „סיום” לאחר הפתירה</string>
<string name="recaptcha_done_button">סיום</string>
</resources>

View File

@@ -206,8 +206,8 @@
<string name="msg_copied">क्लिपबोर्ड पर कॉपी हो गया है</string>
<string name="no_available_dir">कृपया बाद में सेटिंग्स में डाउनलोड स्थान चुने</string>
<string name="msg_popup_permission">पॉपअप के तरीके में खोलने के लिए अनुमति की जरुरत है</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="reCaptcha_title">reCAPTCHA चुनौती</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="title_activity_recaptcha">reCAPTCHA चुनौती</string>
<string name="recaptcha_request_toast">reCAPTCHA चुनौती का अनुरोध किया</string>
<string name="settings_category_downloads_title">डाउनलोड</string>
<string name="settings_file_charset_title">फाइल के नाम के लिए आवश्यक characters(जैसे - १२३, abc) की अनुमति है</string>

View File

@@ -30,12 +30,12 @@
<string name="fragment_whats_new">Što je novo</string>
<string name="controls_background_title">Pozadina</string>
<string name="controls_popup_title">Skočni prozor</string>
<string name="download_path_title">Put za preuzimanje videozapisa</string>
<string name="download_path_summary">Put za spremanje videozapisa u</string>
<string name="download_path_dialog_title">Unesi put za preuzimanje videozapisa</string>
<string name="download_path_title">Mapa za preuzimanje videozapisa</string>
<string name="download_path_summary">Preuzete video datoteke se spremaju ovdje</string>
<string name="download_path_dialog_title">Odaberi mapu za preuzimanje video datoteka</string>
<string name="download_path_audio_title">Mapa za preuzimanje zvuka</string>
<string name="download_path_audio_summary">Preuzeti zvuk je spremljen ovdje</string>
<string name="download_path_audio_dialog_title">Unesi put za preuzimanje zvučne datoteke</string>
<string name="download_path_audio_summary">Preuzete audio datoteke se spremaju ovdje</string>
<string name="download_path_audio_dialog_title">Odaberi mapu za preuzimanje audio datoteka</string>
<string name="autoplay_by_calling_app_title">Automatska reprodukcija</string>
<string name="autoplay_by_calling_app_summary">Reproducira videozapis kad je NewPipe pozvan iz druge aplikacije</string>
<string name="default_resolution_title">Zadana razlučivost</string>
@@ -61,7 +61,7 @@
<string name="show_search_suggestions_summary">Prikaži prijedloge pri traženju</string>
<string name="enable_search_history_title">Povijest pretraživanja</string>
<string name="enable_search_history_summary">Svaku pretragu spremi lokalno</string>
<string name="enable_watch_history_title">Povijest &amp; Predmemorija</string>
<string name="enable_watch_history_title">Prati povijest</string>
<string name="enable_watch_history_summary">Pratite pogledane videozapise</string>
<string name="resume_on_audio_focus_gain_title">Nastavi nakon dobivanja fokusa</string>
<string name="resume_on_audio_focus_gain_summary">Nastavi reproducirati nakon prekidanja (npr. telefonski pozivi)</string>
@@ -116,7 +116,7 @@
<string name="your_comment">Vaš komentar (na engleskom):</string>
<string name="error_details_headline">Detalji:</string>
<string name="list_thumbnail_view_description">Sličica pregleda videozapisa</string>
<string name="detail_thumbnail_view_description">Sličica pregleda videozapisa</string>
<string name="detail_thumbnail_view_description">Pokreni video, trajanje:</string>
<string name="detail_uploader_thumbnail_view_description">Profilna slika prenositelja</string>
<string name="detail_likes_img_view_description">Goreglasovi</string>
<string name="detail_dislikes_img_view_description">Doljeglasovi</string>
@@ -130,9 +130,9 @@
<string name="audio">Zvuk</string>
<string name="retry">Ponovno pokušaj</string>
<string name="storage_permission_denied">Dozvola za pisanje po pohrani je odbijena</string>
<string name="short_thousand">tis</string>
<string name="short_thousand">tis.</string>
<string name="short_million">mil</string>
<string name="short_billion">mlrd</string>
<string name="short_billion">mlrd.</string>
<string name="start">Počni</string>
<string name="pause">Pauziraj</string>
<string name="view">Reproduciraj</string>
@@ -150,11 +150,11 @@
<string name="msg_running_detail">Dodirni za detalje</string>
<string name="msg_wait">Molimo pričekajte…</string>
<string name="msg_copied">Kopirano u međuspremnik</string>
<string name="no_available_dir">Molimo odaberite dostupnu mapu za preuzimanje</string>
<string name="no_available_dir">Kasnije odredite mapu za preuzimanje u postavkama</string>
<string name="msg_popup_permission">Ova dozvola je potrebna za
\notvaranje skočnog prozora</string>
<string name="reCaptchaActivity">reCAPTCHA</string>
<string name="reCaptcha_title">reCAPTCHA zadatak</string>
<string name="recaptcha">reCAPTCHA</string>
<string name="title_activity_recaptcha">reCAPTCHA zadatak</string>
<string name="recaptcha_request_toast">Traži se reCAPTCHA zadatak</string>
<string name="settings_category_downloads_title">Preuzimanja</string>
<string name="settings_file_charset_title">Dozvoljeni znakovi u nazivima datoteka</string>
@@ -209,8 +209,8 @@
<string name="no_videos">Nema videozapisa</string>
<plurals name="videos">
<item quantity="one">%s video</item>
<item quantity="few">%s videozapisa</item>
<item quantity="other">%s videozapisi</item>
<item quantity="few">%s videa</item>
<item quantity="other">%s videa</item>
</plurals>
<string name="item_deleted">Stavka je izbrisana</string>
<string name="background_player_append">U redu čekanja za reprod. u pozadini</string>
@@ -397,7 +397,7 @@
<string name="settings_category_debug_title">Otkrivanje grešaka</string>
<string name="app_update_notification_channel_name">Obavijest o ažuriranju aplikacije</string>
<string name="toggle_orientation">Uključite ili isključite orijentaciju</string>
<string name="download_to_sdcard_error_message">Preuzimanje na vanjsku SD karticu još nije moguće. Poništite lokaciju mape za preuzimanje\?</string>
<string name="download_to_sdcard_error_message">Preuzimanje na vanjsku SD karticu nije moguće. Ponovo postaviti lokaciju mape za preuzimanje\?</string>
<string name="external_player_unsupported_link_type">Vanjski playeri ne podržavaju ove vrste veza</string>
<string name="video_streams_empty">Nije pronađen nijedan videozapis</string>
<string name="audio_streams_empty">Nije pronađen nijedan zvuk</string>
@@ -433,7 +433,7 @@
<string name="list_view_mode">Način prikaza popisa</string>
<string name="auto">Automatski</string>
<string name="missions_header_finished">Gotovo</string>
<string name="missions_header_pending">U redu za čekanje</string>
<string name="missions_header_pending">Na čekanju</string>
<string name="paused">pauzirano</string>
<string name="queued">Na redu za čekanje</string>
<string name="post_processing">naknadna obrada</string>
@@ -446,8 +446,8 @@
<string name="overwrite_finished_warning">Preuzeta datoteka s tim nazivom već postoji</string>
<string name="download_already_running">U tijeku je preuzimanje s ovim nazivom</string>
<string name="label_code">Kod</string>
<string name="error_path_creation">Datoteku nije moguće izraditi</string>
<string name="error_file_creation">Odredišnu mapu nije moguće izraditi</string>
<string name="error_path_creation">Odredišnu mapu nije moguće stvoriti</string>
<string name="error_file_creation">Datoteku nije moguće stvoriti</string>
<string name="error_permission_denied">Sustav je odbio dozvolu</string>
<string name="error_ssl_exception">Sigurna veza nije uspjela</string>
<string name="error_unknown_host">Nije moguće pronaći server</string>
@@ -460,7 +460,7 @@
<string name="stop">Stop</string>
<string name="max_retry_msg">Maksimalnih ponovnih pokušaja</string>
<string name="max_retry_desc">Maksimalni broj pokušaja prije poništavanja preuzimanja</string>
<string name="pause_downloads_on_mobile">Pauziraj prilikom prebacivanja na mobilne podatke</string>
<string name="pause_downloads_on_mobile">Prekini na mrežama s ograničenim prometom</string>
<string name="pause_downloads_on_mobile_desc">Preuzimanja koja se ne mogu zaustaviti ponovno će se pokrenuti</string>
<string name="show_comments_title">Prikaži komentare</string>
<string name="show_comments_summary">Onemogućite da biste prestali prikazivati komentare</string>

Some files were not shown because too many files have changed in this diff Show More