mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2026-01-16 06:28:02 +00:00
Compare commits
444 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3b5b9d7dab | ||
|
|
e7082baaff | ||
|
|
0bc769b971 | ||
|
|
5b98d41637 | ||
|
|
e14b7851b1 | ||
|
|
d65b8d7d18 | ||
|
|
6968dd266a | ||
|
|
8754cbb38f | ||
|
|
c7b4705538 | ||
|
|
065faf31b6 | ||
|
|
da4b27f606 | ||
|
|
e1cc84ab5f | ||
|
|
533aede80f | ||
|
|
e84d5311f9 | ||
|
|
476b3f804b | ||
|
|
9445e8e8a0 | ||
|
|
e539753279 | ||
|
|
f5f81be6fe | ||
|
|
3b8a55f0d3 | ||
|
|
b1dd6cbb6e | ||
|
|
431724f637 | ||
|
|
6e5851aea8 | ||
|
|
30e5e58178 | ||
|
|
40207b515d | ||
|
|
95a6aaac76 | ||
|
|
da43f47487 | ||
|
|
ae5360fb27 | ||
|
|
47d2ae5c5e | ||
|
|
e1101dd6f1 | ||
|
|
d460351da2 | ||
|
|
fd076f5a58 | ||
|
|
f7d73fc21b | ||
|
|
5680b7c477 | ||
|
|
9f9b53c067 | ||
|
|
18d986a57d | ||
|
|
61632b3d9d | ||
|
|
f1688fb8b1 | ||
|
|
f0e85b31aa | ||
|
|
316871714a | ||
|
|
12c72842ff | ||
|
|
4230e11c4d | ||
|
|
c76ff8d367 | ||
|
|
831e9985e2 | ||
|
|
9912ee8199 | ||
|
|
55d17b556a | ||
|
|
5495be749b | ||
|
|
54f71c623a | ||
|
|
e3a891688b | ||
|
|
09d36a5dbc | ||
|
|
ff493406cf | ||
|
|
fbcee61e04 | ||
|
|
e62e34fd5c | ||
|
|
3b57135a6e | ||
|
|
69934dee52 | ||
|
|
51f2efd48c | ||
|
|
4de2cfdcc6 | ||
|
|
7845b7678d | ||
|
|
6f9543b9cf | ||
|
|
5b541cc9fb | ||
|
|
ea54520e0b | ||
|
|
00b6bd517a | ||
|
|
9fb5aa4b46 | ||
|
|
f089cd027e | ||
|
|
5151c6cb54 | ||
|
|
9407ac8c24 | ||
|
|
6a91a3a947 | ||
|
|
ac0bcea371 | ||
|
|
302a6ff4e8 | ||
|
|
0d89667428 | ||
|
|
dbb6848a9b | ||
|
|
a843e808d1 | ||
|
|
67af05e504 | ||
|
|
c995c6fda5 | ||
|
|
3b5cf0e37c | ||
|
|
c7a9847e66 | ||
|
|
3624f1b9a2 | ||
|
|
aecc908152 | ||
|
|
9f9c6eff00 | ||
|
|
99400fa570 | ||
|
|
17d00837bd | ||
|
|
0882d9d66b | ||
|
|
0df81409bf | ||
|
|
a75deb6ba2 | ||
|
|
7478e96a15 | ||
|
|
c1d9a253b0 | ||
|
|
eb7d9f76e5 | ||
|
|
ec45d4a729 | ||
|
|
07544cd198 | ||
|
|
3f3d1bfccf | ||
|
|
d3cb887ff0 | ||
|
|
88c68315f6 | ||
|
|
2d62fa401d | ||
|
|
3ff85c2ab7 | ||
|
|
13f5d3b5ac | ||
|
|
9eb55e1be5 | ||
|
|
6adbfade2b | ||
|
|
7568616f8e | ||
|
|
c93be13dfe | ||
|
|
e9dc96944b | ||
|
|
06e536eb45 | ||
|
|
72e90b4d57 | ||
|
|
83d43f845f | ||
|
|
5ed5a81708 | ||
|
|
ce003d2683 | ||
|
|
75248d7a12 | ||
|
|
06eff256f3 | ||
|
|
a476f332f7 | ||
|
|
6d49148c32 | ||
|
|
85acc53d40 | ||
|
|
f319e3e75a | ||
|
|
3abc660eb3 | ||
|
|
4c13dda1f9 | ||
|
|
294c35b2fb | ||
|
|
badaff8ebc | ||
|
|
7045f9711c | ||
|
|
aaf5d7b89c | ||
|
|
487952f52e | ||
|
|
34e31807fc | ||
|
|
21184f8755 | ||
|
|
2bac66b5fe | ||
|
|
b5f069d080 | ||
|
|
bc393e6bcd | ||
|
|
af411a61ae | ||
|
|
2805850711 | ||
|
|
0f0a367174 | ||
|
|
7009dc574f | ||
|
|
6941917c75 | ||
|
|
9560cf59be | ||
|
|
0a2374892c | ||
|
|
5d5c2ae2ed | ||
|
|
2cceb048e3 | ||
|
|
ed9c85b25a | ||
|
|
bb8bcf3c33 | ||
|
|
b5684ee7df | ||
|
|
2c27f784f7 | ||
|
|
46c1155c64 | ||
|
|
471ce4a24b | ||
|
|
b6841158df | ||
|
|
3372bacc62 | ||
|
|
6da9096176 | ||
|
|
b589ee6c26 | ||
|
|
9f0efdd544 | ||
|
|
07c7398a96 | ||
|
|
a117e459b0 | ||
|
|
7568af408a | ||
|
|
d1801e1dbc | ||
|
|
38d193899c | ||
|
|
f95d51b307 | ||
|
|
1bf55c2139 | ||
|
|
9b09028440 | ||
|
|
0cc890a1d1 | ||
|
|
fe138f6d61 | ||
|
|
4e1638f86e | ||
|
|
daa4fd5103 | ||
|
|
a3d8848825 | ||
|
|
61d102dc75 | ||
|
|
c0519d8313 | ||
|
|
48a2d2d24b | ||
|
|
fb0d626cb2 | ||
|
|
766326ad8c | ||
|
|
2a903f66dd | ||
|
|
8712310ad9 | ||
|
|
e8c3ab87c4 | ||
|
|
90c20f124b | ||
|
|
cd225eb5fe | ||
|
|
14e852237f | ||
|
|
d36ac7a5de | ||
|
|
55a138e8da | ||
|
|
c5e6bb58bc | ||
|
|
2642d6f5f0 | ||
|
|
bcb3cb9125 | ||
|
|
f7203d4ac9 | ||
|
|
6be23a0a6f | ||
|
|
089a9f1a9c | ||
|
|
2977de1df2 | ||
|
|
eab3f8b3ff | ||
|
|
d686a2c9dc | ||
|
|
d34e5f78a9 | ||
|
|
edc9d47da7 | ||
|
|
0c5608506e | ||
|
|
bda6139f42 | ||
|
|
1ae8ca1e21 | ||
|
|
342377e69a | ||
|
|
0447e4e664 | ||
|
|
fd3d61c6a0 | ||
|
|
69bf1c5d81 | ||
|
|
fbf6351b99 | ||
|
|
a78762756a | ||
|
|
1f24c18614 | ||
|
|
153790d80a | ||
|
|
e98f27cb66 | ||
|
|
c17d80948c | ||
|
|
c486368b9b | ||
|
|
42bb96af23 | ||
|
|
e082976914 | ||
|
|
156a2eb4ff | ||
|
|
e94981e6f7 | ||
|
|
be92921034 | ||
|
|
94403a9c3c | ||
|
|
b5ea61a079 | ||
|
|
af9e2420a6 | ||
|
|
14b3cf7ccd | ||
|
|
9c58a07a72 | ||
|
|
609855f774 | ||
|
|
37409e7d90 | ||
|
|
cc83991d8d | ||
|
|
bf5e94fc1a | ||
|
|
52420d4bf1 | ||
|
|
7f7bf8474e | ||
|
|
e1145f16f2 | ||
|
|
b430a23df1 | ||
|
|
fa7173b3d5 | ||
|
|
b2d78786c2 | ||
|
|
489420e855 | ||
|
|
5bc0d2c31b | ||
|
|
e9fda96aa1 | ||
|
|
64b0ccd574 | ||
|
|
d3aadc71b1 | ||
|
|
c21ccef7bc | ||
|
|
2152375227 | ||
|
|
10d57afaac | ||
|
|
e224f8ca28 | ||
|
|
1f975c0a3a | ||
|
|
ce075395a1 | ||
|
|
167653ac60 | ||
|
|
ee0f94c232 | ||
|
|
0ed3354cee | ||
|
|
b8f726153f | ||
|
|
afc362d2b6 | ||
|
|
776d8a4406 | ||
|
|
7718581882 | ||
|
|
ba245c49da | ||
|
|
cf60033424 | ||
|
|
0e39071b5e | ||
|
|
b6028cef5b | ||
|
|
62906fb84a | ||
|
|
4797cd9184 | ||
|
|
366c55c8f4 | ||
|
|
7e93456805 | ||
|
|
de1a92539a | ||
|
|
84dd1a688e | ||
|
|
36c4063db6 | ||
|
|
9c9a432ea0 | ||
|
|
1c53b22239 | ||
|
|
5dbab85505 | ||
|
|
2873f723e8 | ||
|
|
6b7043fb9d | ||
|
|
9d5612d104 | ||
|
|
e58088d290 | ||
|
|
77aa12dd81 | ||
|
|
8c3be2c9df | ||
|
|
266c3d03fc | ||
|
|
42ff60ce85 | ||
|
|
e08e724573 | ||
|
|
b155f23d27 | ||
|
|
a2d3e2c7e0 | ||
|
|
ed18466c3b | ||
|
|
845767e2f8 | ||
|
|
a0548fdbf8 | ||
|
|
b837912e75 | ||
|
|
0cd9fb32a8 | ||
|
|
fd62411b35 | ||
|
|
134850aa04 | ||
|
|
0795135f2f | ||
|
|
85eb1dc436 | ||
|
|
2f2b8784f9 | ||
|
|
181658e5a4 | ||
|
|
7dbb2b206c | ||
|
|
ef90493c27 | ||
|
|
d949894511 | ||
|
|
570dded8d6 | ||
|
|
235ead9222 | ||
|
|
3ee6788753 | ||
|
|
e3dfab5078 | ||
|
|
5f232a059d | ||
|
|
1b708d261d | ||
|
|
3341742f66 | ||
|
|
b731c79339 | ||
|
|
29b12c2f84 | ||
|
|
ba53f6611c | ||
|
|
6eeed50418 | ||
|
|
8caf9f87a1 | ||
|
|
2e6089088b | ||
|
|
40eaa166ae | ||
|
|
41e2e5f951 | ||
|
|
ac3938d529 | ||
|
|
515ec4d66d | ||
|
|
5adc27ea2b | ||
|
|
ab089a5f93 | ||
|
|
9d8fcbbffe | ||
|
|
590722d929 | ||
|
|
a0ee1b1653 | ||
|
|
b965f88eb2 | ||
|
|
a228e702da | ||
|
|
105981b2eb | ||
|
|
055365a449 | ||
|
|
f8a7aac40d | ||
|
|
6712ea5e6f | ||
|
|
382e69273e | ||
|
|
9b71828b97 | ||
|
|
00eddcb237 | ||
|
|
49cc643dcc | ||
|
|
42ec6f0810 | ||
|
|
9f47a274a8 | ||
|
|
1f8c0a9e5e | ||
|
|
cef9ccd937 | ||
|
|
9d773d6e8a | ||
|
|
3d93ecd6ec | ||
|
|
36e38e50e9 | ||
|
|
1a8be2bbf5 | ||
|
|
92b1fa5743 | ||
|
|
335e5c05db | ||
|
|
bfead79c07 | ||
|
|
bd8014bcbd | ||
|
|
948d57d3d1 | ||
|
|
31b830d6d0 | ||
|
|
2038df976c | ||
|
|
46cc215120 | ||
|
|
3afce82aa7 | ||
|
|
88e5be237e | ||
|
|
7c4b9d8843 | ||
|
|
b83e1716fe | ||
|
|
c3e41e2427 | ||
|
|
3f67b3b73c | ||
|
|
78c9e4e1ad | ||
|
|
69c090b5a1 | ||
|
|
2c8222fd55 | ||
|
|
d071891b2a | ||
|
|
986acc5fc5 | ||
|
|
e4295fb3fa | ||
|
|
cfad3fb5de | ||
|
|
b18236a27e | ||
|
|
f6bbc69cf9 | ||
|
|
707e4f7167 | ||
|
|
11d06dc86d | ||
|
|
8f46432391 | ||
|
|
99cdaec40e | ||
|
|
b32935a1b0 | ||
|
|
ed9a3517c6 | ||
|
|
e0a39efa2b | ||
|
|
3ad0e313ca | ||
|
|
bca547ce44 | ||
|
|
6bc697f926 | ||
|
|
bff5371e41 | ||
|
|
694013c9df | ||
|
|
a76398efd0 | ||
|
|
99bcd8d043 | ||
|
|
1602ecbaf9 | ||
|
|
7e17bdf369 | ||
|
|
d316bbad44 | ||
|
|
72151c8c0c | ||
|
|
e2e0a9bfa2 | ||
|
|
8d53b07167 | ||
|
|
1df852171d | ||
|
|
399e2626fb | ||
|
|
752a76eb44 | ||
|
|
8feee05eec | ||
|
|
e9a4caaf0b | ||
|
|
8de367e03f | ||
|
|
dad88b83fb | ||
|
|
846f7f2f05 | ||
|
|
41e18ae694 | ||
|
|
deeac118a1 | ||
|
|
594d77e713 | ||
|
|
2ea404659b | ||
|
|
e2ec95e6ff | ||
|
|
db87df743d | ||
|
|
23f9ffdab7 | ||
|
|
28063c35c2 | ||
|
|
21a39b06e7 | ||
|
|
8fb29ae6c2 | ||
|
|
21895caa3a | ||
|
|
f17b92512c | ||
|
|
014682664d | ||
|
|
5bf1df9f14 | ||
|
|
dea1e0dcb9 | ||
|
|
eb5fb42da9 | ||
|
|
c46a0f7b2e | ||
|
|
835476870b | ||
|
|
718acb5059 | ||
|
|
1aa763e86c | ||
|
|
0395dc6e9e | ||
|
|
96de70b71e | ||
|
|
f44883e79f | ||
|
|
c56fb8cec2 | ||
|
|
3625a38a23 | ||
|
|
1393d3ad7f | ||
|
|
b674cfec24 | ||
|
|
f0f0c43b72 | ||
|
|
33caad4690 | ||
|
|
0afc8005d0 | ||
|
|
f04d2e76fa | ||
|
|
8e1d7f162d | ||
|
|
ee65e89230 | ||
|
|
a8e26238a8 | ||
|
|
a3dc95bef1 | ||
|
|
a29df9a2dd | ||
|
|
cc17d268fc | ||
|
|
22a9a06b87 | ||
|
|
d063d39dbc | ||
|
|
87e29dbd84 | ||
|
|
2227a7a6bd | ||
|
|
867f633d16 | ||
|
|
b9de3c202a | ||
|
|
56364c4a2c | ||
|
|
b1fd2c007d | ||
|
|
741a872c39 | ||
|
|
e1e2add616 | ||
|
|
0c664e346a | ||
|
|
7ddb856ccd | ||
|
|
17c0b981d1 | ||
|
|
7f0a9904ff | ||
|
|
2b4190d85d | ||
|
|
57e89babf1 | ||
|
|
209dc5ace9 | ||
|
|
ab7f3c7399 | ||
|
|
1e7e8d4121 | ||
|
|
04b75ef05f | ||
|
|
de19421de1 | ||
|
|
61f64a7349 | ||
|
|
6fb16bad85 | ||
|
|
694813ac90 | ||
|
|
6f3fd50ed8 | ||
|
|
c1e1c191d0 | ||
|
|
f4c8fdaf07 | ||
|
|
457ebe3aa2 | ||
|
|
8da8ce0a0a | ||
|
|
cc869b98a3 | ||
|
|
f9e7873e54 | ||
|
|
c4cba8aa37 | ||
|
|
22e4ef4034 | ||
|
|
708cdc4c62 | ||
|
|
94931df60b | ||
|
|
b3605fe6d4 | ||
|
|
11e0ed7c4f | ||
|
|
34e89448b1 | ||
|
|
9f789167da | ||
|
|
a08cd4ce6a | ||
|
|
46b12ed819 | ||
|
|
9309159c38 | ||
|
|
8e45296826 | ||
|
|
e8437052d8 | ||
|
|
cf13f5ca56 | ||
|
|
52f82ed228 |
@@ -13,7 +13,7 @@
|
||||
</p>
|
||||
<hr>
|
||||
<p align="center"><a href="#screenshots">Screenshots</a> • <a href="#description">Description</a> • <a href="#features">Features</a> • <a href="#updates">Updates</a> • <a href="#contribution">Contribution</a> • <a href="#donate">Donate</a> • <a href="#license">License</a></p>
|
||||
<p align="center"><a href="https://newpipe.schabi.org">Website</a> • <a href="https://newpipe.schabi.org/blog/">Blog</a> • <a href="https://newpipe.schabi.org/press/">Press</a></p>
|
||||
<p align="center"><a href="https://newpipe.schabi.org">Website</a> • <a href="https://newpipe.schabi.org/blog/">Blog</a> • <a href="https://newpipe.schabi.org/FAQ/">FAQ</a> • <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
2
app/.gitignore
vendored
@@ -1,3 +1,3 @@
|
||||
.gitignore
|
||||
/build
|
||||
app.iml
|
||||
*.iml
|
||||
|
||||
@@ -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}"
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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<>(
|
||||
|
||||
@@ -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()));
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 + "], " +
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,6 +137,7 @@ public class DataReader {
|
||||
|
||||
position = 0;
|
||||
readOffset = readBuffer.length;
|
||||
readCount = 0;
|
||||
}
|
||||
|
||||
public boolean canRewind() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
43
app/src/main/java/org/schabi/newpipe/util/BitmapUtils.java
Normal file
43
app/src/main/java/org/schabi/newpipe/util/BitmapUtils.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
23
app/src/main/java/org/schabi/newpipe/util/KoreUtil.java
Normal file
23
app/src/main/java/org/schabi/newpipe/util/KoreUtil.java
Normal 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();
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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:
|
||||
|
||||
9
app/src/main/res/drawable/ic_done_black_24dp.xml
Normal file
9
app/src/main/res/drawable/ic_done_black_24dp.xml
Normal 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>
|
||||
5
app/src/main/res/drawable/ic_done_white_24dp.xml
Normal file
5
app/src/main/res/drawable/ic_done_white_24dp.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
17
app/src/main/res/layout/dialog_bookmark.xml
Normal file
17
app/src/main/res/layout/dialog_bookmark.xml
Normal 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>
|
||||
@@ -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
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
10
app/src/main/res/menu/menu_recaptcha.xml
Normal file
10
app/src/main/res/menu/menu_recaptcha.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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&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&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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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">您的 ID,soundcloud.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>
|
||||
@@ -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>
|
||||
2
app/src/main/res/values-cv/strings.xml
Normal file
2
app/src/main/res/values-cv/strings.xml
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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 & 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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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 l’option « Lire avec Kodi »</string>
|
||||
<string name="show_play_with_kodi_title">Afficher l’option « 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 d’analyser 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 l’image</string>
|
||||
<string name="app_ui_crash">L’application 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 d’exploitation :</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 à l’obtention 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 l’astuce « Maintenir pour ajouter »</string>
|
||||
<string name="show_hold_to_append_summary">Affiche l’astuce lors de l’appui du bouton « Arrière-plan » ou « Mode flottant » sur la page de détails d’une vidéo</string>
|
||||
<string name="show_hold_to_append_title">Afficher l’astuce « Maintenir pour ajouter »</string>
|
||||
<string name="show_hold_to_append_summary">Affiche l’astuce lors de l’appui du bouton « Arrière-plan » ou « Mode flottant » sur la page de détails d’une vidéo</string>
|
||||
<string name="unknown_content">[Inconnu]</string>
|
||||
<string name="player_recoverable_failure">Récupération depuis l’erreur du lecteur</string>
|
||||
<string name="kiosk_page_summary">Kiosque</string>
|
||||
@@ -275,8 +275,8 @@
|
||||
<string name="export_data_summary">Exporte l’historique, 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 d’importer 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 d’accé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 l’utilisation de la bande passante et de la mémoire. Modifier cette option vide les caches d’image 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 l’utilisation 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 d’attente</string>
|
||||
<string name="auto_queue_summary">Ajoute automatiquement un flux lié lors de la lecture du dernier flux dans une file d’attente 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 d’exportation).</string>
|
||||
<string name="import_soundcloud_instructions">Veuillez importer un profil SoundCloud en saisissant l’URL de votre profil ou votre identifiant.
|
||||
\n
|
||||
\n1. Activez le « mode bureau » dans votre navigateur web (le site n’est 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 l’URL de votre profil ou votre identifiant.
|
||||
\n
|
||||
\n1. Activez le « mode bureau » dans votre navigateur web (le site n’est pas disponible pour les appareils mobiles).
|
||||
\n2. Suivez cette URL : %1$s.
|
||||
\n3. Connectez-vous à votre compte.
|
||||
\n4. Copiez l’URL 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 l’utiliser, l’étudier, le partager et l’amé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, l’application n’envoie 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 l’emplacement 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 l’application lorsqu’une 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 l’erreur</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 d’annuler 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 n’accepte 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 qu’il 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 d’attente de téléchargement</string>
|
||||
<string name="enable_queue_limit_desc">Un téléchargement s’exé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 l’URL de l’instance</string>
|
||||
<string name="peertube_instance_add_fail">Échec de validation de l’instance</string>
|
||||
<string name="peertube_instance_add_https_only">Sont prises en charge uniquement les URLs en HTTPS</string>
|
||||
<string name="peertube_instance_add_exists">L’instance 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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 & 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
Reference in New Issue
Block a user