diff --git a/.github/DISCUSSION_TEMPLATE/questions.yml b/.github/DISCUSSION_TEMPLATE/questions.yml index befb6280e..2d467d5e5 100644 --- a/.github/DISCUSSION_TEMPLATE/questions.yml +++ b/.github/DISCUSSION_TEMPLATE/questions.yml @@ -1,6 +1,3 @@ -name: Question -description: Ask about anything NewPipe-related -labels: [question] body: - type: markdown attributes: diff --git a/.github/changed-lines-count-labeler.yml b/.github/changed-lines-count-labeler.yml new file mode 100644 index 000000000..902f376c0 --- /dev/null +++ b/.github/changed-lines-count-labeler.yml @@ -0,0 +1,17 @@ +# Add 'size/small' label to any changes with less than 50 lines +size/small: + max: 49 + +# Add 'size/medium' label to any changes between 50 and 249 lines +size/medium: + min: 50 + max: 249 + +# Add 'size/large' label to any changes between 250 and 749 lines +size/large: + min: 250 + max: 749 + +# Add 'size/giant' label to any changes for more than 749 lines +size/giant: + min: 750 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 03b04b7c4..0d76e1645 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,8 +36,8 @@ jobs: contents: read steps: - - uses: actions/checkout@v3 - - uses: gradle/wrapper-validation-action@v1 + - uses: actions/checkout@v4 + - uses: gradle/wrapper-validation-action@v2 - name: create and checkout branch # push events already checked out the branch @@ -47,7 +47,7 @@ jobs: run: git checkout -B "$BRANCH" - name: set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: 17 distribution: "temurin" @@ -57,7 +57,7 @@ jobs: run: ./gradlew assembleDebug lintDebug testDebugUnitTest --stacktrace -DskipFormatKtlint - name: Upload APK - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: app path: app/build/outputs/apk/debug/*.apk @@ -80,10 +80,10 @@ jobs: contents: read steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: 17 distribution: "temurin" @@ -98,7 +98,7 @@ jobs: script: ./gradlew connectedCheck --stacktrace - name: Upload test report when tests fail # because the printed out stacktrace (console) is too short, see also #7553 - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: android-test-report-api${{ matrix.api-level }} @@ -111,19 +111,19 @@ jobs: contents: read steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: 17 distribution: "temurin" cache: 'gradle' - name: Cache SonarCloud packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.sonar/cache key: ${{ runner.os }}-sonar diff --git a/.github/workflows/image-minimizer.yml b/.github/workflows/image-minimizer.yml index 56c6eb37f..d9241c33b 100644 --- a/.github/workflows/image-minimizer.yml +++ b/.github/workflows/image-minimizer.yml @@ -17,9 +17,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: 16 @@ -27,7 +27,7 @@ jobs: run: npm i probe-image-size@7.2.3 --ignore-scripts - name: Minimize simple images - uses: actions/github-script@v6 + uses: actions/github-script@v7 timeout-minutes: 3 with: script: | diff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml new file mode 100644 index 000000000..a18daca3a --- /dev/null +++ b/.github/workflows/pr-labeler.yml @@ -0,0 +1,18 @@ +name: "PR size labeler" +on: [pull_request_target] +permissions: + contents: read + pull-requests: write + +jobs: + changed-lines-count-labeler: + runs-on: ubuntu-latest + name: Automatically labelling pull requests based on the changed lines count + permissions: + pull-requests: write + steps: + - name: Set a label + uses: TeamNewPipe/changed-lines-count-labeler@main + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + configuration-path: .github/changed-lines-count-labeler.yml diff --git a/README.md b/README.md index fe7154fe1..4e22f9260 100644 --- a/README.md +++ b/README.md @@ -13,18 +13,19 @@ - +


ScreenshotsSupported ServicesDescriptionFeaturesInstallation and updatesContributionDonateLicense

WebsiteBlogFAQPress


-*Read this document in other languages: [Deutsch](doc/README.de.md), [English](README.md), [Español](doc/README.es.md), [Français](doc/README.fr.md), [हिन्दी](doc/README.hi.md), [Italiano](doc/README.it.md), [한국어](doc/README.ko.md), [Português Brasil](doc/README.pt_BR.md), [Polski](doc/README.pl.md), [ਪੰਜਾਬੀ ](doc/README.pa.md), [日本語](doc/README.ja.md), [Română](doc/README.ro.md), [Soomaali](doc/README.so.md), [Türkçe](doc/README.tr.md), [正體中文](doc/README.zh_TW.md), [অসমীয়া](doc/README.asm.md)* +*Read this document in other languages: [Deutsch](doc/README.de.md), [English](README.md), [Español](doc/README.es.md), [Français](doc/README.fr.md), [हिन्दी](doc/README.hi.md), [Italiano](doc/README.it.md), [한국어](doc/README.ko.md), [Português Brasil](doc/README.pt_BR.md), [Polski](doc/README.pl.md), [ਪੰਜਾਬੀ ](doc/README.pa.md), [日本語](doc/README.ja.md), [Română](doc/README.ro.md), [Soomaali](doc/README.so.md), [Türkçe](doc/README.tr.md), [正體中文](doc/README.zh_TW.md), [অসমীয়া](doc/README.asm.md), [Српски](doc/README.sr.md)* -WARNING: THIS APP IS IN BETA, SO YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE IN OUR GITHUB REPOSITORY BY FILLING OUT THE ISSUE TEMPLATE. - -PUTTING NEWPIPE, OR ANY FORK OF IT, INTO THE GOOGLE PLAY STORE VIOLATES THEIR TERMS AND CONDITIONS. +> [!warning] +> THIS APP IS IN BETA, SO YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE IN OUR GITHUB REPOSITORY BY FILLING OUT THE ISSUE TEMPLATE. +> +> PUTTING NEWPIPE, OR ANY FORK OF IT, INTO THE GOOGLE PLAY STORE VIOLATES THEIR TERMS AND CONDITIONS. ## Screenshots @@ -126,16 +127,6 @@ If you like NewPipe, you're welcome to send a donation. We prefer Liberapay, as Visit NewPipe at liberapay.com Donate via Liberapay - - Bitcoin - Bitcoin QR code - 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh - - - Bountysource - Visit NewPipe at bountysource.com - Check out how many bounties you can earn. - ## Privacy Policy diff --git a/app/build.gradle b/app/build.gradle index 831b758b9..7a3b28661 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,7 +12,7 @@ plugins { } android { - compileSdk 33 + compileSdk 34 namespace 'org.schabi.newpipe' defaultConfig { @@ -20,8 +20,8 @@ android { resValue "string", "app_name", "NewPipe" minSdk 21 targetSdk 33 - versionCode 994 - versionName "0.25.2" + versionCode 996 + versionName "0.26.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -98,7 +98,9 @@ android { resources { // remove two files which belong to jsoup // no idea how they ended up in the META-INF dir... - excludes += ['META-INF/README.md', 'META-INF/CHANGES'] + excludes += ['META-INF/README.md', 'META-INF/CHANGES', + // 'COPYRIGHT' belongs to RxJava... + 'META-INF/COPYRIGHT'] } } } @@ -106,9 +108,9 @@ android { ext { checkstyleVersion = '10.12.1' - androidxLifecycleVersion = '2.5.1' - androidxRoomVersion = '2.5.2' - androidxWorkVersion = '2.7.1' + androidxLifecycleVersion = '2.6.2' + androidxRoomVersion = '2.6.1' + androidxWorkVersion = '2.8.1' icepickVersion = '3.2.0' exoPlayerVersion = '2.18.7' @@ -118,7 +120,6 @@ ext { leakCanaryVersion = '2.12' stethoVersion = '1.6.0' - mockitoVersion = '4.0.0' } configurations { @@ -133,7 +134,7 @@ checkstyle { toolVersion = checkstyleVersion } -task runCheckstyle(type: Checkstyle) { +tasks.register('runCheckstyle', Checkstyle) { source 'src' include '**/*.java' exclude '**/gen/**' @@ -154,7 +155,7 @@ task runCheckstyle(type: Checkstyle) { def outputDir = "${project.buildDir}/reports/ktlint/" def inputFiles = project.fileTree(dir: "src", include: "**/*.kt") -task runKtlint(type: JavaExec) { +tasks.register('runKtlint', JavaExec) { inputs.files(inputFiles) outputs.dir(outputDir) getMainClass().set("com.pinterest.ktlint.Main") @@ -163,7 +164,7 @@ task runKtlint(type: JavaExec) { jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED") } -task formatKtlint(type: JavaExec) { +tasks.register('formatKtlint', JavaExec) { inputs.files(inputFiles) outputs.dir(outputDir) getMainClass().set("com.pinterest.ktlint.Main") @@ -189,7 +190,7 @@ sonar { dependencies { /** Desugaring **/ - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs_nio:2.0.3' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs_nio:2.0.4' /** NewPipe libraries **/ // You can use a local version by uncommenting a few lines in settings.gradle @@ -197,7 +198,7 @@ dependencies { // name and the commit hash with the commit hash of the (pushed) commit you want to test // This works thanks to JitPack: https://jitpack.io/ implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.TeamNewPipe:NewPipeExtractor:95a3cc0a173bba28c179f9f9503b1010ec6bff21' + implementation 'com.github.Stypox:NewPipeExtractor:aaf3231fc75d7b4177549fec4aa7e672bfe84015' implementation 'com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0' /** Checkstyle **/ @@ -208,28 +209,28 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlin_version}" /** AndroidX **/ - implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.core:core-ktx:1.10.0' + implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.documentfile:documentfile:1.0.1' - implementation 'androidx.fragment:fragment-ktx:1.4.1' + implementation 'androidx.fragment:fragment-ktx:1.6.2' implementation "androidx.lifecycle:lifecycle-livedata-ktx:${androidxLifecycleVersion}" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:${androidxLifecycleVersion}" implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.1.0' - implementation 'androidx.media:media:1.6.0' - implementation 'androidx.preference:preference:1.2.0' - implementation 'androidx.recyclerview:recyclerview:1.2.1' + implementation 'androidx.media:media:1.7.0' + implementation 'androidx.preference:preference:1.2.1' + implementation 'androidx.recyclerview:recyclerview:1.3.2' implementation "androidx.room:room-runtime:${androidxRoomVersion}" implementation "androidx.room:room-rxjava3:${androidxRoomVersion}" kapt "androidx.room:room-compiler:${androidxRoomVersion}" implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' // Newer version specified to prevent accessibility regressions with RecyclerView, see: // https://developer.android.com/jetpack/androidx/releases/viewpager2#1.1.0-alpha01 - implementation 'androidx.viewpager2:viewpager2:1.1.0-beta01' + implementation 'androidx.viewpager2:viewpager2:1.1.0-beta02' implementation "androidx.work:work-runtime-ktx:${androidxWorkVersion}" implementation "androidx.work:work-rxjava3:${androidxWorkVersion}" - implementation 'com.google.android.material:material:1.9.0' + implementation 'com.google.android.material:material:1.11.0' /** Third-party libraries **/ // Instance state boilerplate elimination @@ -237,13 +238,10 @@ dependencies { kapt "frankiesardo:icepick-processor:${icepickVersion}" // HTML parser - implementation "org.jsoup:jsoup:1.16.1" + implementation "org.jsoup:jsoup:1.17.2" // HTTP client - implementation "com.squareup.okhttp3:okhttp:4.11.0" - // okhttp3:4.11.0 introduces a vulnerability from com.squareup.okio:okio@3.3.0, - // remove com.squareup.okio:okio when updating okhttp - implementation "com.squareup.okio:okio:3.4.0" + implementation "com.squareup.okhttp3:okhttp:4.12.0" // Media player implementation "com.google.android.exoplayer:exoplayer-core:${exoPlayerVersion}" @@ -272,19 +270,19 @@ dependencies { implementation "io.noties.markwon:linkify:${markwonVersion}" // Crash reporting - implementation "ch.acra:acra-core:5.10.1" + implementation "ch.acra:acra-core:5.11.3" // Properly restarting implementation 'com.jakewharton:process-phoenix:2.1.2' // Reactive extensions for Java VM - implementation "io.reactivex.rxjava3:rxjava:3.1.6" + implementation "io.reactivex.rxjava3:rxjava:3.1.8" implementation "io.reactivex.rxjava3:rxandroid:3.0.2" // RxJava binding APIs for Android UI widgets implementation "com.jakewharton.rxbinding4:rxbinding:4.0.0" // Date and time formatting - implementation "org.ocpsoft.prettytime:prettytime:5.0.6.Final" + implementation "org.ocpsoft.prettytime:prettytime:5.0.7.Final" /** Debugging **/ // Memory leak detection @@ -297,13 +295,12 @@ dependencies { /** Testing **/ testImplementation 'junit:junit:4.13.2' - testImplementation "org.mockito:mockito-core:${mockitoVersion}" - testImplementation "org.mockito:mockito-inline:${mockitoVersion}" + testImplementation 'org.mockito:mockito-core:5.6.0' androidTestImplementation "androidx.test.ext:junit:1.1.5" androidTestImplementation "androidx.test:runner:1.5.2" androidTestImplementation "androidx.room:room-testing:${androidxRoomVersion}" - androidTestImplementation "org.assertj:assertj-core:3.23.1" + androidTestImplementation "org.assertj:assertj-core:3.24.2" } static String getGitWorkingBranch() { diff --git a/app/schemas/org.schabi.newpipe.database.AppDatabase/8.json b/app/schemas/org.schabi.newpipe.database.AppDatabase/8.json new file mode 100644 index 000000000..d4a89567b --- /dev/null +++ b/app/schemas/org.schabi.newpipe.database.AppDatabase/8.json @@ -0,0 +1,737 @@ +{ + "formatVersion": 1, + "database": { + "version": 8, + "identityHash": "012fc8e7ad3333f1597347f34e76a513", + "entities": [ + { + "tableName": "subscriptions", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT, `name` TEXT, `avatar_url` TEXT, `subscriber_count` INTEGER, `description` TEXT, `notification_mode` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "avatarUrl", + "columnName": "avatar_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "subscriberCount", + "columnName": "subscriber_count", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "notificationMode", + "columnName": "notification_mode", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_subscriptions_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "search_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + "fields": [ + { + "fieldPath": "creationDate", + "columnName": "creation_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "search", + "columnName": "search", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_search_history_search", + "unique": false, + "columnNames": [ + "search" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "streams", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `stream_type` TEXT NOT NULL, `duration` INTEGER NOT NULL, `uploader` TEXT NOT NULL, `uploader_url` TEXT, `thumbnail_url` TEXT, `view_count` INTEGER, `textual_upload_date` TEXT, `upload_date` INTEGER, `is_upload_date_approximation` INTEGER)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "streamType", + "columnName": "stream_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "duration", + "columnName": "duration", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "uploader", + "columnName": "uploader", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "uploaderUrl", + "columnName": "uploader_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "viewCount", + "columnName": "view_count", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "textualUploadDate", + "columnName": "textual_upload_date", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uploadDate", + "columnName": "upload_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "isUploadDateApproximation", + "columnName": "is_upload_date_approximation", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_streams_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "stream_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, `repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "accessDate", + "columnName": "access_date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "repeatCount", + "columnName": "repeat_count", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "stream_id", + "access_date" + ] + }, + "indices": [ + { + "name": "index_stream_history_stream_id", + "unique": false, + "columnNames": [ + "stream_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)" + } + ], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "stream_state", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "progressMillis", + "columnName": "progress_time", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "stream_id" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "playlists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, `thumbnail_stream_id` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isThumbnailPermanent", + "columnName": "is_thumbnail_permanent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "thumbnailStreamId", + "columnName": "thumbnail_stream_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_playlists_name", + "unique": false, + "columnNames": [ + "name" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "playlist_stream_join", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, `join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "playlistUid", + "columnName": "playlist_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "streamUid", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "index", + "columnName": "join_index", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "playlist_id", + "join_index" + ] + }, + "indices": [ + { + "name": "index_playlist_stream_join_playlist_id_join_index", + "unique": true, + "columnNames": [ + "playlist_id", + "join_index" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)" + }, + { + "name": "index_playlist_stream_join_stream_id", + "unique": false, + "columnNames": [ + "stream_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)" + } + ], + "foreignKeys": [ + { + "table": "playlists", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "playlist_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "remote_playlists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, `thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "serviceId", + "columnName": "service_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uploader", + "columnName": "uploader", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "streamCount", + "columnName": "stream_count", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_remote_playlists_name", + "unique": false, + "columnNames": [ + "name" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)" + }, + { + "name": "index_remote_playlists_service_id_url", + "unique": true, + "columnNames": [ + "service_id", + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "feed", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `subscription_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "streamId", + "columnName": "stream_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "stream_id", + "subscription_id" + ] + }, + "indices": [ + { + "name": "index_feed_subscription_id", + "unique": false, + "columnNames": [ + "subscription_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" + } + ], + "foreignKeys": [ + { + "table": "streams", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "stream_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "feed_group", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `icon_id` INTEGER NOT NULL, `sort_order` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "icon", + "columnName": "icon_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sortOrder", + "columnName": "sort_order", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + }, + "indices": [ + { + "name": "index_feed_group_sort_order", + "unique": false, + "columnNames": [ + "sort_order" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "feed_group_subscription_join", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`group_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`group_id`, `subscription_id`), FOREIGN KEY(`group_id`) REFERENCES `feed_group`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "feedGroupId", + "columnName": "group_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "group_id", + "subscription_id" + ] + }, + "indices": [ + { + "name": "index_feed_group_subscription_join_subscription_id", + "unique": false, + "columnNames": [ + "subscription_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)" + } + ], + "foreignKeys": [ + { + "table": "feed_group", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "group_id" + ], + "referencedColumns": [ + "uid" + ] + }, + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + }, + { + "tableName": "feed_last_updated", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`subscription_id` INTEGER NOT NULL, `last_updated` INTEGER, PRIMARY KEY(`subscription_id`), FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)", + "fields": [ + { + "fieldPath": "subscriptionId", + "columnName": "subscription_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastUpdated", + "columnName": "last_updated", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "subscription_id" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "subscriptions", + "onDelete": "CASCADE", + "onUpdate": "CASCADE", + "columns": [ + "subscription_id" + ], + "referencedColumns": [ + "uid" + ] + } + ] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '012fc8e7ad3333f1597347f34e76a513')" + ] + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt index 88e737205..65f41d8fa 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt @@ -8,10 +8,12 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotEquals import org.junit.Assert.assertNull import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.schabi.newpipe.extractor.ServiceList import org.schabi.newpipe.extractor.stream.StreamType @RunWith(AndroidJUnit4::class) @@ -106,6 +108,13 @@ class DatabaseMigrationTest { Migrations.MIGRATION_6_7 ) + testHelper.runMigrationsAndValidate( + AppDatabase.DATABASE_NAME, + Migrations.DB_VER_8, + true, + Migrations.MIGRATION_7_8 + ) + val migratedDatabaseV3 = getMigratedDatabase() val listFromDB = migratedDatabaseV3.streamDAO().all.blockingFirst() @@ -140,6 +149,64 @@ class DatabaseMigrationTest { assertNull(secondStreamFromMigratedDatabase.isUploadDateApproximation) } + @Test + fun migrateDatabaseFrom7to8() { + val databaseInV7 = testHelper.createDatabase(AppDatabase.DATABASE_NAME, Migrations.DB_VER_7) + + val defaultSearch1 = " abc " + val defaultSearch2 = " abc" + + val serviceId = DEFAULT_SERVICE_ID // YouTube + // Use id different to YouTube because two searches with the same query + // but different service are considered not equal. + val otherServiceId = ServiceList.SoundCloud.serviceId + + databaseInV7.run { + insert( + "search_history", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("service_id", serviceId) + put("search", defaultSearch1) + } + ) + insert( + "search_history", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("service_id", serviceId) + put("search", defaultSearch2) + } + ) + insert( + "search_history", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("service_id", otherServiceId) + put("search", defaultSearch1) + } + ) + insert( + "search_history", SQLiteDatabase.CONFLICT_FAIL, + ContentValues().apply { + put("service_id", otherServiceId) + put("search", defaultSearch2) + } + ) + close() + } + + testHelper.runMigrationsAndValidate( + AppDatabase.DATABASE_NAME, Migrations.DB_VER_8, + true, Migrations.MIGRATION_7_8 + ) + + val migratedDatabaseV8 = getMigratedDatabase() + val listFromDB = migratedDatabaseV8.searchHistoryDAO().all.blockingFirst() + + assertEquals(2, listFromDB.size) + assertEquals("abc", listFromDB[0].search) + assertEquals("abc", listFromDB[1].search) + assertNotEquals(listFromDB[0].serviceId, listFromDB[1].serviceId) + } + private fun getMigratedDatabase(): AppDatabase { val database: AppDatabase = Room.databaseBuilder( ApplicationProvider.getApplicationContext(), diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt new file mode 100644 index 000000000..893ae82b7 --- /dev/null +++ b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt @@ -0,0 +1,130 @@ +package org.schabi.newpipe.database + +import android.content.Context +import androidx.room.Room +import androidx.test.core.app.ApplicationProvider +import io.reactivex.rxjava3.core.Single +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Before +import org.junit.Test +import org.schabi.newpipe.database.feed.dao.FeedDAO +import org.schabi.newpipe.database.feed.model.FeedEntity +import org.schabi.newpipe.database.feed.model.FeedGroupEntity +import org.schabi.newpipe.database.stream.StreamWithState +import org.schabi.newpipe.database.stream.dao.StreamDAO +import org.schabi.newpipe.database.stream.model.StreamEntity +import org.schabi.newpipe.database.subscription.SubscriptionDAO +import org.schabi.newpipe.database.subscription.SubscriptionEntity +import org.schabi.newpipe.extractor.ServiceList +import org.schabi.newpipe.extractor.channel.ChannelInfo +import org.schabi.newpipe.extractor.stream.StreamType +import java.io.IOException +import java.time.OffsetDateTime +import kotlin.streams.toList + +class FeedDAOTest { + private lateinit var db: AppDatabase + private lateinit var feedDAO: FeedDAO + private lateinit var streamDAO: StreamDAO + private lateinit var subscriptionDAO: SubscriptionDAO + + private val serviceId = ServiceList.YouTube.serviceId + + private val stream1 = StreamEntity(1, serviceId, "https://youtube.com/watch?v=1", "stream 1", StreamType.VIDEO_STREAM, 1000, "channel-1", "https://youtube.com/channel/1", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-01-01", OffsetDateTime.parse("2023-01-01T00:00:00Z")) + private val stream2 = StreamEntity(2, serviceId, "https://youtube.com/watch?v=2", "stream 2", StreamType.VIDEO_STREAM, 1000, "channel-1", "https://youtube.com/channel/1", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-01-02", OffsetDateTime.parse("2023-01-02T00:00:00Z")) + private val stream3 = StreamEntity(3, serviceId, "https://youtube.com/watch?v=3", "stream 3", StreamType.LIVE_STREAM, 1000, "channel-1", "https://youtube.com/channel/1", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-01-03", OffsetDateTime.parse("2023-01-03T00:00:00Z")) + private val stream4 = StreamEntity(4, serviceId, "https://youtube.com/watch?v=4", "stream 4", StreamType.VIDEO_STREAM, 1000, "channel-2", "https://youtube.com/channel/2", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-08-10", OffsetDateTime.parse("2023-08-10T00:00:00Z")) + private val stream5 = StreamEntity(5, serviceId, "https://youtube.com/watch?v=5", "stream 5", StreamType.VIDEO_STREAM, 1000, "channel-2", "https://youtube.com/channel/2", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-08-20", OffsetDateTime.parse("2023-08-20T00:00:00Z")) + private val stream6 = StreamEntity(6, serviceId, "https://youtube.com/watch?v=6", "stream 6", StreamType.VIDEO_STREAM, 1000, "channel-3", "https://youtube.com/channel/3", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-09-01", OffsetDateTime.parse("2023-09-01T00:00:00Z")) + private val stream7 = StreamEntity(7, serviceId, "https://youtube.com/watch?v=7", "stream 7", StreamType.VIDEO_STREAM, 1000, "channel-4", "https://youtube.com/channel/4", "https://i.ytimg.com/vi/1/hqdefault.jpg", 100, "2023-08-10", OffsetDateTime.parse("2023-08-10T00:00:00Z")) + + private val allStreams = listOf( + stream1, stream2, stream3, stream4, stream5, stream6, stream7 + ) + + @Before + fun createDb() { + val context = ApplicationProvider.getApplicationContext() + db = Room.inMemoryDatabaseBuilder( + context, AppDatabase::class.java + ).build() + feedDAO = db.feedDAO() + streamDAO = db.streamDAO() + subscriptionDAO = db.subscriptionDAO() + } + + @After + @Throws(IOException::class) + fun closeDb() { + db.close() + } + + @Test + fun testUnlinkStreamsOlderThan_KeepOne() { + setupUnlinkDelete("2023-08-15T00:00:00Z") + val streams = feedDAO.getStreams( + FeedGroupEntity.GROUP_ALL_ID, includePlayed = true, includePartiallyPlayed = true, null + ) + .blockingGet() + val allowedStreams = listOf(stream3, stream5, stream6, stream7) + assertEqual(streams, allowedStreams) + } + + @Test + fun testUnlinkStreamsOlderThan_KeepMultiple() { + setupUnlinkDelete("2023-08-01T00:00:00Z") + val streams = feedDAO.getStreams( + FeedGroupEntity.GROUP_ALL_ID, includePlayed = true, includePartiallyPlayed = true, null + ) + .blockingGet() + val allowedStreams = listOf(stream3, stream4, stream5, stream6, stream7) + assertEqual(streams, allowedStreams) + } + + private fun assertEqual(streams: List?, allowedStreams: List) { + assertNotNull(streams) + assertEquals( + allowedStreams, + streams!! + .map { it.stream } + .sortedBy { it.uid } + .toList() + ) + } + + private fun setupUnlinkDelete(time: String) { + clearAndFillTables() + Single.fromCallable { + feedDAO.unlinkStreamsOlderThan(OffsetDateTime.parse(time)) + }.blockingSubscribe() + Single.fromCallable { + streamDAO.deleteOrphans() + }.blockingSubscribe() + } + + private fun clearAndFillTables() { + db.clearAllTables() + streamDAO.insertAll(allStreams) + subscriptionDAO.insertAll( + listOf( + SubscriptionEntity.from(ChannelInfo(serviceId, "1", "https://youtube.com/channel/1", "https://youtube.com/channel/1", "channel-1")), + SubscriptionEntity.from(ChannelInfo(serviceId, "2", "https://youtube.com/channel/2", "https://youtube.com/channel/2", "channel-2")), + SubscriptionEntity.from(ChannelInfo(serviceId, "3", "https://youtube.com/channel/3", "https://youtube.com/channel/3", "channel-3")), + SubscriptionEntity.from(ChannelInfo(serviceId, "4", "https://youtube.com/channel/4", "https://youtube.com/channel/4", "channel-4")), + ) + ) + feedDAO.insertAll( + listOf( + FeedEntity(1, 1), + FeedEntity(2, 1), + FeedEntity(3, 1), + FeedEntity(4, 2), + FeedEntity(5, 2), + FeedEntity(6, 3), + FeedEntity(7, 4), + ) + ) + } +} diff --git a/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java b/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java index 8d87e90bd..8d03a1486 100644 --- a/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java +++ b/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java @@ -25,6 +25,7 @@ import android.view.ViewGroup; import androidx.annotation.IntDef; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.os.BundleCompat; import androidx.lifecycle.Lifecycle; import androidx.viewpager.widget.PagerAdapter; @@ -284,7 +285,7 @@ public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapt Bundle state = null; if (!mSavedState.isEmpty()) { state = new Bundle(); - state.putParcelableArray("states", mSavedState.toArray(new Fragment.SavedState[0])); + state.putParcelableArrayList("states", mSavedState); } for (int i = 0; i < mFragments.size(); i++) { final Fragment f = mFragments.get(i); @@ -311,13 +312,12 @@ public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapt if (state != null) { final Bundle bundle = (Bundle) state; bundle.setClassLoader(loader); - final Parcelable[] fss = bundle.getParcelableArray("states"); + final var states = BundleCompat.getParcelableArrayList(bundle, "states", + Fragment.SavedState.class); mSavedState.clear(); mFragments.clear(); - if (fss != null) { - for (final Parcelable parcelable : fss) { - mSavedState.add((Fragment.SavedState) parcelable); - } + if (states != null) { + mSavedState.addAll(states); } final Iterable keys = bundle.keySet(); for (final String key : keys) { diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index f4410a31b..ee352ae4a 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -20,9 +20,11 @@ import org.schabi.newpipe.extractor.downloader.Downloader; import org.schabi.newpipe.ktx.ExceptionUtils; import org.schabi.newpipe.settings.NewPipeSettings; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.ImageStrategy; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.util.StateSaver; +import org.schabi.newpipe.util.image.PreferredImageQuality; import java.io.IOException; import java.io.InterruptedIOException; @@ -99,8 +101,9 @@ public class App extends Application { // Initialize image loader final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); PicassoHelper.init(this); - PicassoHelper.setShouldLoadImages( - prefs.getBoolean(getString(R.string.download_thumbnail_key), true)); + ImageStrategy.setPreferredImageQuality(PreferredImageQuality.fromPreferenceKey(this, + prefs.getString(getString(R.string.image_quality_key), + getString(R.string.image_quality_default)))); PicassoHelper.setIndicatorsEnabled(MainActivity.DEBUG && prefs.getBoolean(getString(R.string.show_image_indicators_key), false)); diff --git a/app/src/main/java/org/schabi/newpipe/BaseFragment.java b/app/src/main/java/org/schabi/newpipe/BaseFragment.java index 5dde2a747..7a06771dd 100644 --- a/app/src/main/java/org/schabi/newpipe/BaseFragment.java +++ b/app/src/main/java/org/schabi/newpipe/BaseFragment.java @@ -120,9 +120,20 @@ public abstract class BaseFragment extends Fragment { } } + /** + * Finds the root fragment by looping through all of the parent fragments. The root fragment + * is supposed to be {@link org.schabi.newpipe.fragments.MainFragment}, and is the fragment that + * handles keeping the backstack of opened fragments in NewPipe, and also the player bottom + * sheet. This function therefore returns the fragment manager of said fragment. + * + * @return the fragment manager of the root fragment, i.e. + * {@link org.schabi.newpipe.fragments.MainFragment} + */ protected FragmentManager getFM() { - return getParentFragment() == null - ? getFragmentManager() - : getParentFragment().getFragmentManager(); + Fragment current = this; + while (current.getParentFragment() != null) { + current = current.getParentFragment(); + } + return current.getFragmentManager(); } } diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index ea047ce61..a096e7eaf 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -44,6 +44,7 @@ import android.widget.FrameLayout; import android.widget.Spinner; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; @@ -51,6 +52,7 @@ import androidx.core.app.ActivityCompat; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentContainerView; import androidx.fragment.app.FragmentManager; import androidx.preference.PreferenceManager; @@ -64,11 +66,13 @@ import org.schabi.newpipe.databinding.ToolbarLayoutBinding; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.services.peertube.PeertubeInstance; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; +import org.schabi.newpipe.fragments.list.comments.CommentRepliesFragment; import org.schabi.newpipe.fragments.list.search.SearchFragment; import org.schabi.newpipe.local.feed.notifications.NotificationWorker; import org.schabi.newpipe.player.Player; @@ -546,14 +550,21 @@ public class MainActivity extends AppCompatActivity { // interacts with a fragment inside fragment_holder so all back presses should be // handled by it if (bottomSheetHiddenOrCollapsed()) { - final Fragment fragment = getSupportFragmentManager() - .findFragmentById(R.id.fragment_holder); + final FragmentManager fm = getSupportFragmentManager(); + final Fragment fragment = fm.findFragmentById(R.id.fragment_holder); // If current fragment implements BackPressable (i.e. can/wanna handle back press) // delegate the back press to it if (fragment instanceof BackPressable) { if (((BackPressable) fragment).onBackPressed()) { return; } + } else if (fragment instanceof CommentRepliesFragment) { + // expand DetailsFragment if CommentRepliesFragment was opened + // to show the top level comments again + // Expand DetailsFragment if CommentRepliesFragment was opened + // and no other CommentRepliesFragments are on top of the back stack + // to show the top level comments again. + openDetailFragmentFromCommentReplies(fm, false); } } else { @@ -629,10 +640,17 @@ public class MainActivity extends AppCompatActivity { * */ private void onHomeButtonPressed() { - // If search fragment wasn't found in the backstack... - if (!NavigationHelper.tryGotoSearchFragment(getSupportFragmentManager())) { - // ...go to the main fragment - NavigationHelper.gotoMainFragment(getSupportFragmentManager()); + final FragmentManager fm = getSupportFragmentManager(); + final Fragment fragment = fm.findFragmentById(R.id.fragment_holder); + + if (fragment instanceof CommentRepliesFragment) { + // Expand DetailsFragment if CommentRepliesFragment was opened + // and no other CommentRepliesFragments are on top of the back stack + // to show the top level comments again. + openDetailFragmentFromCommentReplies(fm, true); + } else if (!NavigationHelper.tryGotoSearchFragment(fm)) { + // If search fragment wasn't found in the backstack go to the main fragment + NavigationHelper.gotoMainFragment(fm); } } @@ -828,6 +846,68 @@ public class MainActivity extends AppCompatActivity { } } + private void openDetailFragmentFromCommentReplies( + @NonNull final FragmentManager fm, + final boolean popBackStack + ) { + // obtain the name of the fragment under the replies fragment that's going to be popped + @Nullable final String fragmentUnderEntryName; + if (fm.getBackStackEntryCount() < 2) { + fragmentUnderEntryName = null; + } else { + fragmentUnderEntryName = fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 2) + .getName(); + } + + // the root comment is the comment for which the user opened the replies page + @Nullable final CommentRepliesFragment repliesFragment = + (CommentRepliesFragment) fm.findFragmentByTag(CommentRepliesFragment.TAG); + @Nullable final CommentsInfoItem rootComment = + repliesFragment == null ? null : repliesFragment.getCommentsInfoItem(); + + // sometimes this function pops the backstack, other times it's handled by the system + if (popBackStack) { + fm.popBackStackImmediate(); + } + + // only expand the bottom sheet back if there are no more nested comment replies fragments + // stacked under the one that is currently being popped + if (CommentRepliesFragment.TAG.equals(fragmentUnderEntryName)) { + return; + } + + final BottomSheetBehavior behavior = BottomSheetBehavior + .from(mainBinding.fragmentPlayerHolder); + // do not return to the comment if the details fragment was closed + if (behavior.getState() == BottomSheetBehavior.STATE_HIDDEN) { + return; + } + + // scroll to the root comment once the bottom sheet expansion animation is finished + behavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { + @Override + public void onStateChanged(@NonNull final View bottomSheet, + final int newState) { + if (newState == BottomSheetBehavior.STATE_EXPANDED) { + final Fragment detailFragment = fm.findFragmentById( + R.id.fragment_player_holder); + if (detailFragment instanceof VideoDetailFragment && rootComment != null) { + // should always be the case + ((VideoDetailFragment) detailFragment).scrollToComment(rootComment); + } + behavior.removeBottomSheetCallback(this); + } + } + + @Override + public void onSlide(@NonNull final View bottomSheet, final float slideOffset) { + // not needed, listener is removed once the sheet is expanded + } + }); + + behavior.setState(BottomSheetBehavior.STATE_EXPANDED); + } + private boolean bottomSheetHiddenOrCollapsed() { final BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(mainBinding.fragmentPlayerHolder); diff --git a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java index 856fbff8b..c4f9feba7 100644 --- a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java +++ b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.java @@ -7,6 +7,7 @@ import static org.schabi.newpipe.database.Migrations.MIGRATION_3_4; import static org.schabi.newpipe.database.Migrations.MIGRATION_4_5; import static org.schabi.newpipe.database.Migrations.MIGRATION_5_6; import static org.schabi.newpipe.database.Migrations.MIGRATION_6_7; +import static org.schabi.newpipe.database.Migrations.MIGRATION_7_8; import android.content.Context; import android.database.Cursor; @@ -27,7 +28,7 @@ public final class NewPipeDatabase { return Room .databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME) .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5, - MIGRATION_5_6, MIGRATION_6_7) + MIGRATION_5_6, MIGRATION_6_7, MIGRATION_7_8) .build(); } diff --git a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt index c46dd6348..000b83953 100644 --- a/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt @@ -20,9 +20,7 @@ import com.grack.nanojson.JsonParser import com.grack.nanojson.JsonParserException import org.schabi.newpipe.extractor.downloader.Response import org.schabi.newpipe.extractor.exceptions.ReCaptchaException -import org.schabi.newpipe.util.ReleaseVersionUtil.coerceUpdateCheckExpiry -import org.schabi.newpipe.util.ReleaseVersionUtil.isLastUpdateCheckExpired -import org.schabi.newpipe.util.ReleaseVersionUtil.isReleaseApk +import org.schabi.newpipe.util.ReleaseVersionUtil import java.io.IOException class NewVersionWorker( @@ -84,7 +82,7 @@ class NewVersionWorker( @Throws(IOException::class, ReCaptchaException::class) private fun checkNewVersion() { // Check if the current apk is a github one or not. - if (!isReleaseApk()) { + if (!ReleaseVersionUtil.isReleaseApk) { return } @@ -93,7 +91,7 @@ class NewVersionWorker( // Check if the last request has happened a certain time ago // to reduce the number of API requests. val expiry = prefs.getLong(applicationContext.getString(R.string.update_expiry_key), 0) - if (!isLastUpdateCheckExpired(expiry)) { + if (!ReleaseVersionUtil.isLastUpdateCheckExpired(expiry)) { return } } @@ -108,7 +106,7 @@ class NewVersionWorker( try { // Store a timestamp which needs to be exceeded, // before a new request to the API is made. - val newExpiry = coerceUpdateCheckExpiry(response.getHeader("expires")) + val newExpiry = ReleaseVersionUtil.coerceUpdateCheckExpiry(response.getHeader("expires")) prefs.edit { putLong(applicationContext.getString(R.string.update_expiry_key), newExpiry) } @@ -120,13 +118,13 @@ class NewVersionWorker( // Parse the json from the response. try { - val githubStableObject = JsonParser.`object`() + val newpipeVersionInfo = JsonParser.`object`() .from(response.responseBody()).getObject("flavors") - .getObject("github").getObject("stable") + .getObject("newpipe") - val versionName = githubStableObject.getString("version") - val versionCode = githubStableObject.getInt("version_code") - val apkLocationUrl = githubStableObject.getString("apk") + val versionName = newpipeVersionInfo.getString("version") + val versionCode = newpipeVersionInfo.getInt("version_code") + val apkLocationUrl = newpipeVersionInfo.getString("apk") compareAppVersionAndShowNotification(versionName, apkLocationUrl, versionCode) } catch (e: JsonParserException) { // Most likely something is wrong in data received from NEWPIPE_API_URL. diff --git a/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java b/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java index 3255489b0..e6177f6a3 100644 --- a/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java +++ b/app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java @@ -75,7 +75,7 @@ public final class QueueItemMenuUtil { return true; case R.id.menu_item_share: shareText(context, item.getTitle(), item.getUrl(), - item.getThumbnailUrl()); + item.getThumbnails()); return true; case R.id.menu_item_download: fetchStreamInfoAndSaveToDatabase(context, item.getServiceId(), item.getUrl(), diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt index f1d4c26df..7f148e9b5 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt @@ -116,7 +116,7 @@ class AboutActivity : AppCompatActivity() { /** * List of all software components. */ - private val SOFTWARE_COMPONENTS = arrayOf( + private val SOFTWARE_COMPONENTS = arrayListOf( SoftwareComponent( "ACRA", "2013", "Kevin Gaudin", "https://github.com/ACRA/acra", StandardLicenses.APACHE2 diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt index f19ecd74a..9f5ad2a7a 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt @@ -1,30 +1,40 @@ package org.schabi.newpipe.about import android.os.Bundle +import android.util.Base64 import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.webkit.WebView +import androidx.appcompat.app.AlertDialog import androidx.core.os.bundleOf import androidx.fragment.app.Fragment +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.disposables.Disposable +import io.reactivex.rxjava3.schedulers.Schedulers +import org.schabi.newpipe.BuildConfig import org.schabi.newpipe.R import org.schabi.newpipe.databinding.FragmentLicensesBinding import org.schabi.newpipe.databinding.ItemSoftwareComponentBinding +import org.schabi.newpipe.ktx.parcelableArrayList +import org.schabi.newpipe.util.Localization +import org.schabi.newpipe.util.external_communication.ShareUtils /** * Fragment containing the software licenses. */ class LicenseFragment : Fragment() { - private lateinit var softwareComponents: Array - private var activeLicense: License? = null + private lateinit var softwareComponents: List + private var activeSoftwareComponent: SoftwareComponent? = null private val compositeDisposable = CompositeDisposable() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - softwareComponents = arguments?.getParcelableArray(ARG_COMPONENTS) as Array - activeLicense = savedInstanceState?.getSerializable(LICENSE_KEY) as? License - // Sort components by name - softwareComponents.sortBy { it.name } + softwareComponents = arguments?.parcelableArrayList(ARG_COMPONENTS)!! + .sortedBy { it.name } // Sort components by name + activeSoftwareComponent = savedInstanceState?.getSerializable(SOFTWARE_COMPONENT_KEY) as? SoftwareComponent } override fun onDestroy() { @@ -39,9 +49,8 @@ class LicenseFragment : Fragment() { ): View { val binding = FragmentLicensesBinding.inflate(inflater, container, false) binding.licensesAppReadLicense.setOnClickListener { - activeLicense = StandardLicenses.GPL3 compositeDisposable.add( - showLicense(activity, StandardLicenses.GPL3) + showLicense(NEWPIPE_SOFTWARE_COMPONENT) ) } for (component in softwareComponents) { @@ -57,27 +66,72 @@ class LicenseFragment : Fragment() { val root: View = componentBinding.root root.tag = component root.setOnClickListener { - activeLicense = component.license compositeDisposable.add( - showLicense(activity, component) + showLicense(component) ) } binding.licensesSoftwareComponents.addView(root) registerForContextMenu(root) } - activeLicense?.let { compositeDisposable.add(showLicense(activity, it)) } + activeSoftwareComponent?.let { compositeDisposable.add(showLicense(it)) } return binding.root } override fun onSaveInstanceState(savedInstanceState: Bundle) { super.onSaveInstanceState(savedInstanceState) - activeLicense?.let { savedInstanceState.putSerializable(LICENSE_KEY, it) } + activeSoftwareComponent?.let { savedInstanceState.putSerializable(SOFTWARE_COMPONENT_KEY, it) } + } + + private fun showLicense( + softwareComponent: SoftwareComponent + ): Disposable { + return if (context == null) { + Disposable.empty() + } else { + val context = requireContext() + activeSoftwareComponent = softwareComponent + Observable.fromCallable { getFormattedLicense(context, softwareComponent.license) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { formattedLicense -> + val webViewData = Base64.encodeToString( + formattedLicense.toByteArray(), Base64.NO_PADDING + ) + val webView = WebView(context) + webView.loadData(webViewData, "text/html; charset=UTF-8", "base64") + + Localization.assureCorrectAppLanguage(context) + val builder = AlertDialog.Builder(requireContext()) + .setTitle(softwareComponent.name) + .setView(webView) + .setOnCancelListener { activeSoftwareComponent = null } + .setOnDismissListener { activeSoftwareComponent = null } + .setPositiveButton(R.string.done) { dialog, _ -> dialog.dismiss() } + + if (softwareComponent != NEWPIPE_SOFTWARE_COMPONENT) { + builder.setNeutralButton(R.string.open_website_license) { _, _ -> + ShareUtils.openUrlInApp(requireContext(), softwareComponent.link) + } + } + + builder.show() + } + } } companion object { private const val ARG_COMPONENTS = "components" - private const val LICENSE_KEY = "ACTIVE_LICENSE" - fun newInstance(softwareComponents: Array): LicenseFragment { + private const val SOFTWARE_COMPONENT_KEY = "ACTIVE_SOFTWARE_COMPONENT" + private val NEWPIPE_SOFTWARE_COMPONENT = SoftwareComponent( + "NewPipe", + "2014-2023", + "Team NewPipe", + "https://newpipe.net/", + StandardLicenses.GPL3, + BuildConfig.VERSION_NAME + ) + + fun newInstance(softwareComponents: ArrayList): LicenseFragment { val fragment = LicenseFragment() fragment.arguments = bundleOf(ARG_COMPONENTS to softwareComponents) return fragment diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt index 5af7eefec..56e21c88a 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt @@ -1,17 +1,8 @@ package org.schabi.newpipe.about import android.content.Context -import android.util.Base64 -import android.webkit.WebView -import androidx.appcompat.app.AlertDialog -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.disposables.Disposable -import io.reactivex.rxjava3.schedulers.Schedulers import org.schabi.newpipe.R -import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.ThemeHelper -import org.schabi.newpipe.util.external_communication.ShareUtils import java.io.IOException /** @@ -20,7 +11,7 @@ import java.io.IOException * @return String which contains a HTML formatted license page * styled according to the context's theme */ -private fun getFormattedLicense(context: Context, license: License): String { +fun getFormattedLicense(context: Context, license: License): String { try { return context.assets.open(license.filename).bufferedReader().use { it.readText() } // split the HTML file and insert the stylesheet into the HEAD of the file @@ -34,7 +25,7 @@ private fun getFormattedLicense(context: Context, license: License): String { * @param context the Android context * @return String which is a CSS stylesheet according to the context's theme */ -private fun getLicenseStylesheet(context: Context): String { +fun getLicenseStylesheet(context: Context): String { val isLightTheme = ThemeHelper.isLightThemeSelected(context) val licenseBackgroundColor = getHexRGBColor( context, if (isLightTheme) R.color.light_license_background_color else R.color.dark_license_background_color @@ -56,48 +47,6 @@ private fun getLicenseStylesheet(context: Context): String { * @param color the color number from R.color * @return a six characters long String with hexadecimal RGB values */ -private fun getHexRGBColor(context: Context, color: Int): String { +fun getHexRGBColor(context: Context, color: Int): String { return context.getString(color).substring(3) } - -fun showLicense(context: Context?, component: SoftwareComponent): Disposable { - return showLicense(context, component.license) { - setPositiveButton(R.string.dismiss) { dialog, _ -> - dialog.dismiss() - } - setNeutralButton(R.string.open_website_license) { _, _ -> - ShareUtils.openUrlInApp(context!!, component.link) - } - } -} - -fun showLicense(context: Context?, license: License) = showLicense(context, license) { - setPositiveButton(R.string.ok) { dialog, _ -> dialog.dismiss() } -} - -private fun showLicense( - context: Context?, - license: License, - block: AlertDialog.Builder.() -> AlertDialog.Builder -): Disposable { - return if (context == null) { - Disposable.empty() - } else { - Observable.fromCallable { getFormattedLicense(context, license) } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { formattedLicense -> - val webViewData = - Base64.encodeToString(formattedLicense.toByteArray(), Base64.NO_PADDING) - val webView = WebView(context) - webView.loadData(webViewData, "text/html; charset=UTF-8", "base64") - - Localization.assureCorrectAppLanguage(context) - AlertDialog.Builder(context) - .setTitle(license.name) - .setView(webView) - .block() - .show() - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt b/app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt index 354e8fef7..262641caa 100644 --- a/app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt +++ b/app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt @@ -2,6 +2,7 @@ package org.schabi.newpipe.about import android.os.Parcelable import kotlinx.parcelize.Parcelize +import java.io.Serializable @Parcelize class SoftwareComponent @@ -13,4 +14,4 @@ constructor( val link: String, val license: License, val version: String? = null -) : Parcelable +) : Parcelable, Serializable diff --git a/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java b/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java index 03e39cd43..d03823e66 100644 --- a/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java +++ b/app/src/main/java/org/schabi/newpipe/database/AppDatabase.java @@ -1,6 +1,6 @@ package org.schabi.newpipe.database; -import static org.schabi.newpipe.database.Migrations.DB_VER_7; +import static org.schabi.newpipe.database.Migrations.DB_VER_8; import androidx.room.Database; import androidx.room.RoomDatabase; @@ -38,7 +38,7 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity; FeedEntity.class, FeedGroupEntity.class, FeedGroupSubscriptionEntity.class, FeedLastUpdatedEntity.class }, - version = DB_VER_7 + version = DB_VER_8 ) public abstract class AppDatabase extends RoomDatabase { public static final String DATABASE_NAME = "newpipe.db"; diff --git a/app/src/main/java/org/schabi/newpipe/database/Converters.kt b/app/src/main/java/org/schabi/newpipe/database/Converters.kt index 0eafcede1..ec097cc1b 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Converters.kt +++ b/app/src/main/java/org/schabi/newpipe/database/Converters.kt @@ -7,7 +7,7 @@ import java.time.Instant import java.time.OffsetDateTime import java.time.ZoneOffset -object Converters { +class Converters { /** * Convert a long value to a [OffsetDateTime]. * @@ -47,6 +47,6 @@ object Converters { @TypeConverter fun feedGroupIconOf(id: Int): FeedGroupIcon { - return FeedGroupIcon.values().first { it.id == id } + return FeedGroupIcon.entries.first { it.id == id } } } diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.java b/app/src/main/java/org/schabi/newpipe/database/Migrations.java index 1886b87c2..4b1a34dd6 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.java +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.java @@ -25,6 +25,7 @@ public final class Migrations { public static final int DB_VER_5 = 5; public static final int DB_VER_6 = 6; public static final int DB_VER_7 = 7; + public static final int DB_VER_8 = 8; private static final String TAG = Migrations.class.getName(); public static final boolean DEBUG = MainActivity.DEBUG; @@ -235,6 +236,15 @@ public final class Migrations { } }; + public static final Migration MIGRATION_7_8 = new Migration(DB_VER_7, DB_VER_8) { + @Override + public void migrate(@NonNull final SupportSQLiteDatabase database) { + database.execSQL("DELETE FROM search_history WHERE id NOT IN (SELECT id FROM (SELECT " + + "MIN(id) as id FROM search_history GROUP BY trim(search), service_id ) tmp)"); + database.execSQL("UPDATE search_history SET search = trim(search)"); + } + }; + private Migrations() { } } diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt index 6947f66af..e7ed93497 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt @@ -93,18 +93,30 @@ abstract class FeedDAO { uploadDateBefore: OffsetDateTime? ): Maybe> + /** + * Remove links to streams that are older than the given date + * **but keep at least one stream per uploader**. + * + * One stream per uploader is kept because it is needed as reference + * when fetching new streams to check if they are new or not. + * @param offsetDateTime the newest date to keep, older streams are removed + */ @Query( """ - DELETE FROM feed WHERE - - feed.stream_id IN ( - SELECT s.uid FROM streams s - - INNER JOIN feed f - ON s.uid = f.stream_id - - WHERE s.upload_date < :offsetDateTime - ) + DELETE FROM feed + WHERE feed.stream_id IN (SELECT uid from ( + SELECT s.uid, + (SELECT MAX(upload_date) + FROM streams s1 + INNER JOIN feed f1 + ON s1.uid = f1.stream_id + WHERE f1.subscription_id = f.subscription_id) max_upload_date + FROM streams s + INNER JOIN feed f + ON s.uid = f.stream_id + + WHERE s.upload_date < :offsetDateTime + AND s.upload_date <> max_upload_date)) """ ) abstract fun unlinkStreamsOlderThan(offsetDateTime: OffsetDateTime) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt index d2543ae6d..1d74c6d31 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt @@ -7,6 +7,7 @@ import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamStateEntity import org.schabi.newpipe.extractor.stream.StreamInfoItem +import org.schabi.newpipe.util.image.ImageStrategy data class PlaylistStreamEntry( @Embedded @@ -28,7 +29,7 @@ data class PlaylistStreamEntry( item.duration = streamEntity.duration item.uploaderName = streamEntity.uploader item.uploaderUrl = streamEntity.uploaderUrl - item.thumbnailUrl = streamEntity.thumbnailUrl + item.thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl) return item } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java index 2e9a15d7d..7c6b4a8b0 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.java @@ -11,6 +11,7 @@ import androidx.room.PrimaryKey; import org.schabi.newpipe.database.playlist.PlaylistLocalItem; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.util.Constants; +import org.schabi.newpipe.util.image.ImageStrategy; import static org.schabi.newpipe.database.LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM; import static org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.REMOTE_PLAYLIST_NAME; @@ -69,8 +70,9 @@ public class PlaylistRemoteEntity implements PlaylistLocalItem { @Ignore public PlaylistRemoteEntity(final PlaylistInfo info) { this(info.getServiceId(), info.getName(), info.getUrl(), - info.getThumbnailUrl() == null - ? info.getUploaderAvatarUrl() : info.getThumbnailUrl(), + // use uploader avatar when no thumbnail is available + ImageStrategy.imageListToDbUrl(info.getThumbnails().isEmpty() + ? info.getUploaderAvatars() : info.getThumbnails()), info.getUploaderName(), info.getStreamCount()); } @@ -84,7 +86,10 @@ public class PlaylistRemoteEntity implements PlaylistLocalItem { && getStreamCount() == info.getStreamCount() && TextUtils.equals(getName(), info.getName()) && TextUtils.equals(getUrl(), info.getUrl()) - && TextUtils.equals(getThumbnailUrl(), info.getThumbnailUrl()) + // we want to update the local playlist data even when either the remote thumbnail + // URL changes, or the preferred image quality setting is changed by the user + && TextUtils.equals(getThumbnailUrl(), + ImageStrategy.imageListToDbUrl(info.getThumbnails())) && TextUtils.equals(getUploader(), info.getUploaderName()); } diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt b/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt index dc0db59d8..1f3654e7a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt @@ -7,6 +7,7 @@ import org.schabi.newpipe.database.history.model.StreamHistoryEntity import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_PROGRESS_MILLIS import org.schabi.newpipe.extractor.stream.StreamInfoItem +import org.schabi.newpipe.util.image.ImageStrategy import java.time.OffsetDateTime class StreamStatisticsEntry( @@ -30,7 +31,7 @@ class StreamStatisticsEntry( item.duration = streamEntity.duration item.uploaderName = streamEntity.uploader item.uploaderUrl = streamEntity.uploaderUrl - item.thumbnailUrl = streamEntity.thumbnailUrl + item.thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl) return item } diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt index c56f91949..d9c160b89 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt @@ -13,6 +13,7 @@ import org.schabi.newpipe.extractor.stream.StreamInfo import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.player.playqueue.PlayQueueItem +import org.schabi.newpipe.util.image.ImageStrategy import java.io.Serializable import java.time.OffsetDateTime @@ -67,7 +68,8 @@ data class StreamEntity( constructor(item: StreamInfoItem) : this( serviceId = item.serviceId, url = item.url, title = item.name, streamType = item.streamType, duration = item.duration, uploader = item.uploaderName, - uploaderUrl = item.uploaderUrl, thumbnailUrl = item.thumbnailUrl, viewCount = item.viewCount, + uploaderUrl = item.uploaderUrl, + thumbnailUrl = ImageStrategy.imageListToDbUrl(item.thumbnails), viewCount = item.viewCount, textualUploadDate = item.textualUploadDate, uploadDate = item.uploadDate?.offsetDateTime(), isUploadDateApproximation = item.uploadDate?.isApproximation ) @@ -76,7 +78,8 @@ data class StreamEntity( constructor(info: StreamInfo) : this( serviceId = info.serviceId, url = info.url, title = info.name, streamType = info.streamType, duration = info.duration, uploader = info.uploaderName, - uploaderUrl = info.uploaderUrl, thumbnailUrl = info.thumbnailUrl, viewCount = info.viewCount, + uploaderUrl = info.uploaderUrl, + thumbnailUrl = ImageStrategy.imageListToDbUrl(info.thumbnails), viewCount = info.viewCount, textualUploadDate = info.textualUploadDate, uploadDate = info.uploadDate?.offsetDateTime(), isUploadDateApproximation = info.uploadDate?.isApproximation ) @@ -85,7 +88,8 @@ data class StreamEntity( constructor(item: PlayQueueItem) : this( serviceId = item.serviceId, url = item.url, title = item.title, streamType = item.streamType, duration = item.duration, uploader = item.uploader, - uploaderUrl = item.uploaderUrl, thumbnailUrl = item.thumbnailUrl + uploaderUrl = item.uploaderUrl, + thumbnailUrl = ImageStrategy.imageListToDbUrl(item.thumbnails) ) fun toStreamInfoItem(): StreamInfoItem { @@ -93,7 +97,7 @@ data class StreamEntity( item.duration = duration item.uploaderName = uploader item.uploaderUrl = uploaderUrl - item.thumbnailUrl = thumbnailUrl + item.thumbnails = ImageStrategy.dbUrlToImageList(thumbnailUrl) if (viewCount != null) item.viewCount = viewCount as Long item.textualUploadDate = textualUploadDate diff --git a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.java b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.java index 0e4bda490..a61a22a84 100644 --- a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.java +++ b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.java @@ -10,6 +10,7 @@ import androidx.room.PrimaryKey; import org.schabi.newpipe.extractor.channel.ChannelInfo; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; import org.schabi.newpipe.util.Constants; +import org.schabi.newpipe.util.image.ImageStrategy; import static org.schabi.newpipe.database.subscription.SubscriptionEntity.SUBSCRIPTION_SERVICE_ID; import static org.schabi.newpipe.database.subscription.SubscriptionEntity.SUBSCRIPTION_TABLE; @@ -57,8 +58,8 @@ public class SubscriptionEntity { final SubscriptionEntity result = new SubscriptionEntity(); result.setServiceId(info.getServiceId()); result.setUrl(info.getUrl()); - result.setData(info.getName(), info.getAvatarUrl(), info.getDescription(), - info.getSubscriberCount()); + result.setData(info.getName(), ImageStrategy.imageListToDbUrl(info.getAvatars()), + info.getDescription(), info.getSubscriberCount()); return result; } @@ -138,7 +139,7 @@ public class SubscriptionEntity { @Ignore public ChannelInfoItem toChannelInfoItem() { final ChannelInfoItem item = new ChannelInfoItem(getServiceId(), getUrl(), getName()); - item.setThumbnailUrl(getAvatarUrl()); + item.setThumbnails(ImageStrategy.dbUrlToImageList(getAvatarUrl())); item.setSubscriberCount(getSubscriberCount()); item.setDescription(getDescription()); return item; diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 9e9909e85..fa312e55e 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -16,6 +16,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.IBinder; +import android.provider.Settings; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -74,6 +75,7 @@ import org.schabi.newpipe.util.ThemeHelper; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Objects; @@ -146,7 +148,6 @@ public class DownloadDialog extends DialogFragment registerForActivityResult( new StartActivityForResult(), this::requestDownloadPickVideoFolderResult); - /*////////////////////////////////////////////////////////////////////////// // Instance creation //////////////////////////////////////////////////////////////////////////*/ @@ -267,8 +268,8 @@ public class DownloadDialog extends DialogFragment if (!videoStreams.get(i).isVideoOnly()) { continue; } - final AudioStream audioStream = SecondaryStreamHelper - .getAudioStreamFor(audioStreams.getStreamsList(), videoStreams.get(i)); + final AudioStream audioStream = SecondaryStreamHelper.getAudioStreamFor( + context, audioStreams.getStreamsList(), videoStreams.get(i)); if (audioStream != null) { secondaryStreams.append(i, new SecondaryStreamHelper<>(audioStreams, audioStream)); @@ -564,7 +565,6 @@ public class DownloadDialog extends DialogFragment } } - /*////////////////////////////////////////////////////////////////////////// // Listeners //////////////////////////////////////////////////////////////////////////*/ @@ -783,6 +783,7 @@ public class DownloadDialog extends DialogFragment final StoredDirectoryHelper mainStorage; final MediaFormat format; final String selectedMediaType; + final long size; // first, build the filename and get the output folder (if possible) // later, run a very very very large file checking logic @@ -794,6 +795,7 @@ public class DownloadDialog extends DialogFragment selectedMediaType = getString(R.string.last_download_type_audio_key); mainStorage = mainStorageAudio; format = audioStreamsAdapter.getItem(selectedAudioIndex).getFormat(); + size = getWrappedAudioStreams().getSizeInBytes(selectedAudioIndex); if (format == MediaFormat.WEBMA_OPUS) { mimeTmp = "audio/ogg"; filenameTmp += "opus"; @@ -806,6 +808,7 @@ public class DownloadDialog extends DialogFragment selectedMediaType = getString(R.string.last_download_type_video_key); mainStorage = mainStorageVideo; format = videoStreamsAdapter.getItem(selectedVideoIndex).getFormat(); + size = wrappedVideoStreams.getSizeInBytes(selectedVideoIndex); if (format != null) { mimeTmp = format.mimeType; filenameTmp += format.getSuffix(); @@ -815,6 +818,7 @@ public class DownloadDialog extends DialogFragment selectedMediaType = getString(R.string.last_download_type_subtitle_key); mainStorage = mainStorageVideo; // subtitle & video files go together format = subtitleStreamsAdapter.getItem(selectedSubtitleIndex).getFormat(); + size = wrappedSubtitleStreams.getSizeInBytes(selectedSubtitleIndex); if (format != null) { mimeTmp = format.mimeType; } @@ -870,6 +874,22 @@ public class DownloadDialog extends DialogFragment return; } + // Check for free memory space (for api 24 and up) + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + final long freeSpace = mainStorage.getFreeMemory(); + if (freeSpace <= size) { + Toast.makeText(context, getString(R. + string.error_insufficient_storage), Toast.LENGTH_LONG).show(); + // move the user to storage setting tab + final Intent storageSettingsIntent = new Intent(Settings. + ACTION_INTERNAL_STORAGE_SETTINGS); + if (storageSettingsIntent.resolveActivity(context.getPackageManager()) != null) { + startActivity(storageSettingsIntent); + } + return; + } + } + // check for existing file with the same name checkSelectedDownload(mainStorage, mainStorage.findFile(filenameTmp), filenameTmp, mimeTmp); @@ -1052,7 +1072,7 @@ public class DownloadDialog extends DialogFragment final char kind; int threads = dialogBinding.threads.getProgress() + 1; final String[] urls; - final MissionRecoveryInfo[] recoveryInfo; + final List recoveryInfo; String psName = null; String[] psArgs = null; long nearLength = 0; @@ -1117,9 +1137,7 @@ public class DownloadDialog extends DialogFragment urls = new String[] { selectedStream.getContent() }; - recoveryInfo = new MissionRecoveryInfo[] { - new MissionRecoveryInfo(selectedStream) - }; + recoveryInfo = List.of(new MissionRecoveryInfo(selectedStream)); } else { if (secondaryStream.getDeliveryMethod() != PROGRESSIVE_HTTP) { throw new IllegalArgumentException("Unsupported stream delivery format" @@ -1129,12 +1147,14 @@ public class DownloadDialog extends DialogFragment urls = new String[] { selectedStream.getContent(), secondaryStream.getContent() }; - recoveryInfo = new MissionRecoveryInfo[] {new MissionRecoveryInfo(selectedStream), - new MissionRecoveryInfo(secondaryStream)}; + recoveryInfo = List.of( + new MissionRecoveryInfo(selectedStream), + new MissionRecoveryInfo(secondaryStream) + ); } DownloadManagerService.startMission(context, urls, storage, kind, threads, - currentInfo.getUrl(), psName, psArgs, nearLength, recoveryInfo); + currentInfo.getUrl(), psName, psArgs, nearLength, new ArrayList<>(recoveryInfo)); Toast.makeText(context, getString(R.string.download_has_started), Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java b/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java index 6b34c8e90..831a8cc4b 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorActivity.java @@ -17,6 +17,7 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.IntentCompat; import com.grack.nanojson.JsonWriter; @@ -105,7 +106,7 @@ public class ErrorActivity extends AppCompatActivity { actionBar.setDisplayShowTitleEnabled(true); } - errorInfo = intent.getParcelableExtra(ERROR_INFO); + errorInfo = IntentCompat.getParcelableExtra(intent, ERROR_INFO, ErrorInfo.class); // important add guru meditation addGuruMeditation(); diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt index d87fa3330..6d8c1bd63 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt @@ -11,7 +11,6 @@ import org.schabi.newpipe.extractor.exceptions.AccountTerminatedException import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException import org.schabi.newpipe.extractor.exceptions.ExtractionException -import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor.DeobfuscateException import org.schabi.newpipe.ktx.isNetworkRelated import org.schabi.newpipe.util.ServiceHelper @@ -96,7 +95,6 @@ class ErrorInfo( throwable is ContentNotAvailableException -> R.string.content_not_available throwable != null && throwable.isNetworkRelated -> R.string.network_error throwable is ContentNotSupportedException -> R.string.content_not_supported - throwable is DeobfuscateException -> R.string.youtube_signature_deobfuscation_error throwable is ExtractionException -> R.string.parsing_error throwable is ExoPlaybackException -> { when (throwable.type) { diff --git a/app/src/main/java/org/schabi/newpipe/error/UserAction.java b/app/src/main/java/org/schabi/newpipe/error/UserAction.java index 976173373..c8701cd77 100644 --- a/app/src/main/java/org/schabi/newpipe/error/UserAction.java +++ b/app/src/main/java/org/schabi/newpipe/error/UserAction.java @@ -19,6 +19,7 @@ public enum UserAction { REQUESTED_PLAYLIST("requested playlist"), REQUESTED_KIOSK("requested kiosk"), REQUESTED_COMMENTS("requested comments"), + REQUESTED_COMMENT_REPLIES("requested comment replies"), REQUESTED_FEED("requested feed"), REQUESTED_BOOKMARK("bookmark"), DELETE_FROM_HISTORY("delete from history"), diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 023642955..d50f0b0d8 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -38,6 +38,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.databinding.FragmentMainBinding; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.local.playlist.LocalPlaylistFragment; import org.schabi.newpipe.settings.tabs.Tab; import org.schabi.newpipe.settings.tabs.TabsManager; import org.schabi.newpipe.util.NavigationHelper; @@ -193,7 +194,6 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte } binding.pager.setAdapter(null); - binding.pager.setOffscreenPageLimit(tabsList.size()); binding.pager.setAdapter(pagerAdapter); updateTabsIconAndDescription(); @@ -217,6 +217,12 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte setTitle(tabsList.get(tabPosition).getTabName(requireContext())); } + public void commitPlaylistTabs() { + pagerAdapter.getLocalPlaylistFragments() + .stream() + .forEach(LocalPlaylistFragment::commitChanges); + } + private void updateTabLayoutPosition() { final ScrollableTabLayout tabLayout = binding.mainTabLayout; final ViewPager viewPager = binding.pager; @@ -268,10 +274,18 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte updateTitleForTab(tab.getPosition()); } - private static final class SelectedTabsPagerAdapter + public static final class SelectedTabsPagerAdapter extends FragmentStatePagerAdapterMenuWorkaround { private final Context context; private final List internalTabsList; + /** + * Keep reference to LocalPlaylistFragments, because their data can be modified by the user + * during runtime and changes are not committed immediately. However, in some cases, + * the changes need to be committed immediately by calling + * {@link LocalPlaylistFragment#commitChanges()}. + * The fragments are removed when {@link LocalPlaylistFragment#onDestroy()} is called. + */ + private final List localPlaylistFragments = new ArrayList<>(); private SelectedTabsPagerAdapter(final Context context, final FragmentManager fragmentManager, @@ -298,9 +312,17 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte ((BaseFragment) fragment).useAsFrontPage(true); } + if (fragment instanceof LocalPlaylistFragment) { + localPlaylistFragments.add((LocalPlaylistFragment) fragment); + } + return fragment; } + public List getLocalPlaylistFragments() { + return localPlaylistFragments; + } + @Override public int getItemPosition(@NonNull final Object object) { // Causes adapter to reload all Fragments when diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java index ae334b761..e3bdc6592 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java @@ -4,7 +4,13 @@ import static android.text.TextUtils.isEmpty; import static org.schabi.newpipe.extractor.utils.Utils.isBlank; import static org.schabi.newpipe.util.text.TextLinkifier.SET_LINK_MOVEMENT_METHOD; +import android.graphics.Typeface; import android.os.Bundle; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; +import android.text.style.StyleSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -23,10 +29,12 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.databinding.FragmentDescriptionBinding; import org.schabi.newpipe.databinding.ItemMetadataBinding; import org.schabi.newpipe.databinding.ItemMetadataTagsBinding; +import org.schabi.newpipe.extractor.Image; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.stream.Description; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; +import org.schabi.newpipe.util.image.ImageStrategy; import org.schabi.newpipe.util.text.TextLinkifier; import java.util.List; @@ -176,6 +184,74 @@ public abstract class BaseDescriptionFragment extends BaseFragment { layout.addView(itemBinding.getRoot()); } + private String imageSizeToText(final int heightOrWidth) { + if (heightOrWidth < 0) { + return getString(R.string.question_mark); + } else { + return String.valueOf(heightOrWidth); + } + } + + protected void addImagesMetadataItem(final LayoutInflater inflater, + final LinearLayout layout, + @StringRes final int type, + final List images) { + final String preferredImageUrl = ImageStrategy.choosePreferredImage(images); + if (preferredImageUrl == null) { + return; // null will be returned in case there is no image + } + + final ItemMetadataBinding itemBinding = + ItemMetadataBinding.inflate(inflater, layout, false); + itemBinding.metadataTypeView.setText(type); + + final SpannableStringBuilder urls = new SpannableStringBuilder(); + for (final Image image : images) { + if (urls.length() != 0) { + urls.append(", "); + } + final int entryBegin = urls.length(); + + if (image.getHeight() != Image.HEIGHT_UNKNOWN + || image.getWidth() != Image.WIDTH_UNKNOWN + // if even the resolution level is unknown, ?x? will be shown + || image.getEstimatedResolutionLevel() == Image.ResolutionLevel.UNKNOWN) { + urls.append(imageSizeToText(image.getHeight())); + urls.append('x'); + urls.append(imageSizeToText(image.getWidth())); + } else { + switch (image.getEstimatedResolutionLevel()) { + case LOW: + urls.append(getString(R.string.image_quality_low)); + break; + default: // unreachable, Image.ResolutionLevel.UNKNOWN is already filtered out + case MEDIUM: + urls.append(getString(R.string.image_quality_medium)); + break; + case HIGH: + urls.append(getString(R.string.image_quality_high)); + break; + } + } + + urls.setSpan(new ClickableSpan() { + @Override + public void onClick(@NonNull final View widget) { + ShareUtils.openUrlInBrowser(requireContext(), image.getUrl()); + } + }, entryBegin, urls.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + if (preferredImageUrl.equals(image.getUrl())) { + urls.setSpan(new StyleSpan(Typeface.BOLD), entryBegin, urls.length(), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + + itemBinding.metadataContentView.setText(urls); + itemBinding.metadataContentView.setMovementMethod(LinkMovementMethod.getInstance()); + layout.addView(itemBinding.getRoot()); + } + private void addTagsMetadataItem(final LayoutInflater inflater, final LinearLayout layout) { final List tags = getTags(); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java index 92219883b..ada12fc8e 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java @@ -112,8 +112,13 @@ public class DescriptionFragment extends BaseDescriptionFragment { streamInfo.getSupportInfo()); addMetadataItem(inflater, layout, true, R.string.metadata_host, streamInfo.getHost()); - addMetadataItem(inflater, layout, true, R.string.metadata_thumbnail_url, - streamInfo.getThumbnailUrl()); + + addImagesMetadataItem(inflater, layout, R.string.metadata_thumbnails, + streamInfo.getThumbnails()); + addImagesMetadataItem(inflater, layout, R.string.metadata_uploader_avatars, + streamInfo.getUploaderAvatars()); + addImagesMetadataItem(inflater, layout, R.string.metadata_subchannel_avatars, + streamInfo.getSubChannelAvatars()); } private void addPrivacyMetadataItem(final LayoutInflater inflater, final LinearLayout layout) { diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index 686e102f1..bcdeb7ef7 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -24,7 +24,6 @@ import android.content.pm.ActivityInfo; import android.database.ContentObserver; import android.graphics.Color; import android.graphics.Rect; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -54,6 +53,7 @@ import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.widget.Toolbar; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; import androidx.preference.PreferenceManager; import com.google.android.exoplayer2.PlaybackException; @@ -71,8 +71,9 @@ import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.ReCaptchaActivity; import org.schabi.newpipe.error.UserAction; -import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.Image; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.stream.AudioStream; @@ -83,11 +84,13 @@ import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.fragments.EmptyFragment; +import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.list.comments.CommentsFragment; import org.schabi.newpipe.fragments.list.videos.RelatedItemsFragment; import org.schabi.newpipe.ktx.AnimationType; import org.schabi.newpipe.local.dialog.PlaylistDialog; import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.local.playlist.LocalPlaylistFragment; import org.schabi.newpipe.player.Player; import org.schabi.newpipe.player.PlayerService; import org.schabi.newpipe.player.PlayerType; @@ -103,16 +106,17 @@ import org.schabi.newpipe.player.ui.VideoPlayerUi; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.ExtractorHelper; +import org.schabi.newpipe.util.InfoCache; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PermissionHelper; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.PlayButtonHelper; import org.schabi.newpipe.util.StreamTypeUtil; import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.util.external_communication.KoreUtils; import org.schabi.newpipe.util.external_communication.ShareUtils; -import org.schabi.newpipe.util.PlayButtonHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import java.util.ArrayList; import java.util.Iterator; @@ -471,10 +475,23 @@ public final class VideoDetailFragment binding.detailControlsBackground.setOnClickListener(v -> openBackgroundPlayer(false)); binding.detailControlsPopup.setOnClickListener(v -> openPopupPlayer(false)); - binding.detailControlsPlaylistAppend.setOnClickListener(makeOnClickListener(info -> + binding.detailControlsPlaylistAppend.setOnClickListener(makeOnClickListener(info -> { + if (getFM() != null && currentInfo != null) { + final Fragment fragment = getParentFragmentManager(). + findFragmentById(R.id.fragment_holder); + + // commit previous pending changes to database + if (fragment instanceof LocalPlaylistFragment) { + ((LocalPlaylistFragment) fragment).commitChanges(); + } else if (fragment instanceof MainFragment) { + ((MainFragment) fragment).commitPlaylistTabs(); + } + disposables.add(PlaylistDialog.createCorrespondingDialog(requireContext(), List.of(new StreamEntity(info)), - dialog -> dialog.show(getParentFragmentManager(), TAG))))); + dialog -> dialog.show(getParentFragmentManager(), TAG))); + } + })); binding.detailControlsDownload.setOnClickListener(v -> { if (PermissionHelper.checkStoragePermissions(activity, PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) { @@ -483,7 +500,7 @@ public final class VideoDetailFragment }); binding.detailControlsShare.setOnClickListener(makeOnClickListener(info -> ShareUtils.shareText(requireContext(), info.getName(), info.getUrl(), - info.getThumbnailUrl()))); + info.getThumbnails()))); binding.detailControlsOpenInBrowser.setOnClickListener(makeOnClickListener(info -> ShareUtils.openUrlInBrowser(requireContext(), info.getUrl()))); binding.detailControlsPlayWithKodi.setOnClickListener(makeOnClickListener(info -> @@ -723,7 +740,7 @@ public final class VideoDetailFragment final boolean isPlayerStopped = !isPlayerAvailable() || player.isStopped(); if (playQueueItem != null && isPlayerStopped) { updateOverlayData(playQueueItem.getTitle(), - playQueueItem.getUploader(), playQueueItem.getThumbnailUrl()); + playQueueItem.getUploader(), playQueueItem.getThumbnails()); } } @@ -996,6 +1013,20 @@ public final class VideoDetailFragment updateTabLayoutVisibility(); } + public void scrollToComment(final CommentsInfoItem comment) { + final int commentsTabPos = pageAdapter.getItemPositionByTitle(COMMENTS_TAB_TAG); + final Fragment fragment = pageAdapter.getItem(commentsTabPos); + if (!(fragment instanceof CommentsFragment)) { + return; + } + + // unexpand the app bar only if scrolling to the comment succeeded + if (((CommentsFragment) fragment).scrollToComment(comment)) { + binding.appBarLayout.setExpanded(false, false); + binding.viewPager.setCurrentItem(commentsTabPos, false); + } + } + /*////////////////////////////////////////////////////////////////////////// // Play Utils //////////////////////////////////////////////////////////////////////////*/ @@ -1414,7 +1445,7 @@ public final class VideoDetailFragment super.showLoading(); //if data is already cached, transition from VISIBLE -> INVISIBLE -> VISIBLE is not required - if (!ExtractorHelper.isCached(serviceId, url, InfoItem.InfoType.STREAM)) { + if (!ExtractorHelper.isCached(serviceId, url, InfoCache.Type.STREAM)) { binding.detailContentRootHiding.setVisibility(View.INVISIBLE); } @@ -1465,11 +1496,6 @@ public final class VideoDetailFragment displayUploaderAsSubChannel(info); } - final Drawable buddyDrawable = - AppCompatResources.getDrawable(activity, R.drawable.placeholder_person); - binding.detailSubChannelThumbnailView.setImageDrawable(buddyDrawable); - binding.detailUploaderThumbnailView.setImageDrawable(buddyDrawable); - if (info.getViewCount() >= 0) { if (info.getStreamType().equals(StreamType.AUDIO_LIVE_STREAM)) { binding.detailViewCountView.setText(Localization.listeningCount(activity, @@ -1536,13 +1562,13 @@ public final class VideoDetailFragment binding.detailSecondaryControlPanel.setVisibility(View.GONE); checkUpdateProgressInfo(info); - PicassoHelper.loadDetailsThumbnail(info.getThumbnailUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + PicassoHelper.loadDetailsThumbnail(info.getThumbnails()).tag(PICASSO_VIDEO_DETAILS_TAG) .into(binding.detailThumbnailImageView); showMetaInfoInTextView(info.getMetaInfo(), binding.detailMetaInfoTextView, binding.detailMetaInfoSeparator, disposables); if (!isPlayerAvailable() || player.isStopped()) { - updateOverlayData(info.getName(), info.getUploaderName(), info.getThumbnailUrl()); + updateOverlayData(info.getName(), info.getUploaderName(), info.getThumbnails()); } if (!info.getErrors().isEmpty()) { @@ -1587,7 +1613,7 @@ public final class VideoDetailFragment binding.detailUploaderTextView.setVisibility(View.GONE); } - PicassoHelper.loadAvatar(info.getUploaderAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + PicassoHelper.loadAvatar(info.getUploaderAvatars()).tag(PICASSO_VIDEO_DETAILS_TAG) .into(binding.detailSubChannelThumbnailView); binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); binding.detailUploaderThumbnailView.setVisibility(View.GONE); @@ -1619,10 +1645,10 @@ public final class VideoDetailFragment binding.detailUploaderTextView.setVisibility(View.GONE); } - PicassoHelper.loadAvatar(info.getSubChannelAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + PicassoHelper.loadAvatar(info.getSubChannelAvatars()).tag(PICASSO_VIDEO_DETAILS_TAG) .into(binding.detailSubChannelThumbnailView); binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE); - PicassoHelper.loadAvatar(info.getUploaderAvatarUrl()).tag(PICASSO_VIDEO_DETAILS_TAG) + PicassoHelper.loadAvatar(info.getUploaderAvatars()).tag(PICASSO_VIDEO_DETAILS_TAG) .into(binding.detailUploaderThumbnailView); binding.detailUploaderThumbnailView.setVisibility(View.VISIBLE); } @@ -1797,7 +1823,7 @@ public final class VideoDetailFragment return; } - updateOverlayData(info.getName(), info.getUploaderName(), info.getThumbnailUrl()); + updateOverlayData(info.getName(), info.getUploaderName(), info.getThumbnails()); if (currentInfo != null && info.getUrl().equals(currentInfo.getUrl())) { return; } @@ -1826,7 +1852,7 @@ public final class VideoDetailFragment if (currentInfo != null) { updateOverlayData(currentInfo.getName(), currentInfo.getUploaderName(), - currentInfo.getThumbnailUrl()); + currentInfo.getThumbnails()); } updateOverlayPlayQueueButtonVisibility(); } @@ -2191,7 +2217,7 @@ public final class VideoDetailFragment playerHolder.stopService(); setInitialData(0, null, "", null); currentInfo = null; - updateOverlayData(null, null, null); + updateOverlayData(null, null, List.of()); } /*////////////////////////////////////////////////////////////////////////// @@ -2373,11 +2399,11 @@ public final class VideoDetailFragment private void updateOverlayData(@Nullable final String overlayTitle, @Nullable final String uploader, - @Nullable final String thumbnailUrl) { + @NonNull final List thumbnails) { binding.overlayTitleTextView.setText(isEmpty(overlayTitle) ? "" : overlayTitle); binding.overlayChannelTextView.setText(isEmpty(uploader) ? "" : uploader); binding.overlayThumbnail.setImageDrawable(null); - PicassoHelper.loadDetailsThumbnail(thumbnailUrl).tag(PICASSO_VIDEO_DETAILS_TAG) + PicassoHelper.loadDetailsThumbnail(thumbnails).tag(PICASSO_VIDEO_DETAILS_TAG) .into(binding.overlayThumbnail); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java index e7e9f5aad..dd5eb6c8a 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java @@ -231,6 +231,8 @@ public abstract class BaseListInfoFragment setTitle(name); binding.channelTitleView.setText(name); - if (!PicassoHelper.getShouldLoadImages()) { + if (!ImageStrategy.shouldLoadImages()) { // do not waste space for the banner if it is not going to be loaded binding.channelBannerImage.setImageDrawable(null); } @@ -234,7 +234,7 @@ public class ChannelFragment extends BaseStateFragment case R.id.menu_item_share: if (currentInfo != null) { ShareUtils.shareText(requireContext(), name, currentInfo.getOriginalUrl(), - currentInfo.getAvatarUrl()); + currentInfo.getAvatars()); } break; default: @@ -355,7 +355,7 @@ public class ChannelFragment extends BaseStateFragment channel.setServiceId(info.getServiceId()); channel.setUrl(info.getUrl()); channel.setData(info.getName(), - info.getAvatarUrl(), + ImageStrategy.imageListToDbUrl(info.getAvatars()), info.getDescription(), info.getSubscriberCount()); channelSubscription = null; @@ -579,17 +579,17 @@ public class ChannelFragment extends BaseStateFragment currentInfo = result; setInitialData(result.getServiceId(), result.getOriginalUrl(), result.getName()); - if (PicassoHelper.getShouldLoadImages() && !isBlank(result.getBannerUrl())) { - PicassoHelper.loadBanner(result.getBannerUrl()).tag(PICASSO_CHANNEL_TAG) + if (ImageStrategy.shouldLoadImages() && !result.getBanners().isEmpty()) { + PicassoHelper.loadBanner(result.getBanners()).tag(PICASSO_CHANNEL_TAG) .into(binding.channelBannerImage); } else { // do not waste space for the banner, if the user disabled images or there is not one binding.channelBannerImage.setImageDrawable(null); } - PicassoHelper.loadAvatar(result.getAvatarUrl()).tag(PICASSO_CHANNEL_TAG) + PicassoHelper.loadAvatar(result.getAvatars()).tag(PICASSO_CHANNEL_TAG) .into(binding.channelAvatarView); - PicassoHelper.loadAvatar(result.getParentChannelAvatarUrl()).tag(PICASSO_CHANNEL_TAG) + PicassoHelper.loadAvatar(result.getParentChannelAvatars()).tag(PICASSO_CHANNEL_TAG) .into(binding.subChannelAvatarView); binding.channelTitleView.setText(result.getName()); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java index 8712ab4d9..95ac42eed 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.fragments.list.channel; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -14,7 +15,10 @@ import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.channel.tabs.ChannelTabInfo; +import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; +import org.schabi.newpipe.extractor.linkhandler.ReadyChannelTabListLinkHandler; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder; @@ -114,6 +118,30 @@ public class ChannelTabFragment extends BaseListInfoFragment { + + public static final String TAG = CommentRepliesFragment.class.getSimpleName(); + + private CommentsInfoItem commentsInfoItem; // the comment to show replies of + private final CompositeDisposable disposables = new CompositeDisposable(); + + + /*////////////////////////////////////////////////////////////////////////// + // Constructors and lifecycle + //////////////////////////////////////////////////////////////////////////*/ + + // only called by the Android framework, after which readFrom is called and restores all data + public CommentRepliesFragment() { + super(UserAction.REQUESTED_COMMENT_REPLIES); + } + + public CommentRepliesFragment(@NonNull final CommentsInfoItem commentsInfoItem) { + this(); + this.commentsInfoItem = commentsInfoItem; + // setting "" as title since the title will be properly set right after + setInitialData(commentsInfoItem.getServiceId(), commentsInfoItem.getUrl(), ""); + } + + @Nullable + @Override + public View onCreateView(@NonNull final LayoutInflater inflater, + @Nullable final ViewGroup container, + @Nullable final Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_comments, container, false); + } + + @Override + public void onDestroyView() { + disposables.clear(); + super.onDestroyView(); + } + + @Override + protected Supplier getListHeaderSupplier() { + return () -> { + final CommentRepliesHeaderBinding binding = CommentRepliesHeaderBinding + .inflate(activity.getLayoutInflater(), itemsList, false); + final CommentsInfoItem item = commentsInfoItem; + + // load the author avatar + PicassoHelper.loadAvatar(item.getUploaderAvatars()).into(binding.authorAvatar); + binding.authorAvatar.setVisibility(ImageStrategy.shouldLoadImages() + ? View.VISIBLE : View.GONE); + + // setup author name and comment date + binding.authorName.setText(item.getUploaderName()); + binding.uploadDate.setText(Localization.relativeTimeOrTextual( + getContext(), item.getUploadDate(), item.getTextualUploadDate())); + binding.authorTouchArea.setOnClickListener( + v -> NavigationHelper.openCommentAuthorIfPresent(requireActivity(), item)); + + // setup like count, hearted and pinned + binding.thumbsUpCount.setText( + Localization.likeCount(requireContext(), item.getLikeCount())); + // for heartImage goneMarginEnd was used, but there is no way to tell ConstraintLayout + // not to use a different margin only when both the next two views are gone + ((ConstraintLayout.LayoutParams) binding.thumbsUpCount.getLayoutParams()) + .setMarginEnd(DeviceUtils.dpToPx( + (item.isHeartedByUploader() || item.isPinned() ? 8 : 16), + requireContext())); + binding.heartImage.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE); + binding.pinnedImage.setVisibility(item.isPinned() ? View.VISIBLE : View.GONE); + + // setup comment content + TextLinkifier.fromDescription(binding.commentContent, item.getCommentText(), + HtmlCompat.FROM_HTML_MODE_LEGACY, getServiceById(item.getServiceId()), + item.getUrl(), disposables, null); + + return binding.getRoot(); + }; + } + + + /*////////////////////////////////////////////////////////////////////////// + // State saving + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void writeTo(final Queue objectsToSave) { + super.writeTo(objectsToSave); + objectsToSave.add(commentsInfoItem); + } + + @Override + public void readFrom(@NonNull final Queue savedObjects) throws Exception { + super.readFrom(savedObjects); + commentsInfoItem = (CommentsInfoItem) savedObjects.poll(); + } + + + /*////////////////////////////////////////////////////////////////////////// + // Data loading + //////////////////////////////////////////////////////////////////////////*/ + + @Override + protected Single loadResult(final boolean forceLoad) { + return Single.fromCallable(() -> new CommentRepliesInfo(commentsInfoItem, + // the reply count string will be shown as the activity title + Localization.replyCount(requireContext(), commentsInfoItem.getReplyCount()))); + } + + @Override + protected Single> loadMoreItemsLogic() { + // commentsInfoItem.getUrl() should contain the url of the original + // ListInfo, which should be the stream url + return ExtractorHelper.getMoreCommentItems( + serviceId, commentsInfoItem.getUrl(), currentNextPage); + } + + + /*////////////////////////////////////////////////////////////////////////// + // Utils + //////////////////////////////////////////////////////////////////////////*/ + + @Override + protected ItemViewMode getItemViewMode() { + return ItemViewMode.LIST; + } + + /** + * @return the comment to which the replies are shown + */ + public CommentsInfoItem getCommentsInfoItem() { + return commentsInfoItem; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesInfo.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesInfo.java new file mode 100644 index 000000000..cc160c395 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesInfo.java @@ -0,0 +1,22 @@ +package org.schabi.newpipe.fragments.list.comments; + +import org.schabi.newpipe.extractor.ListInfo; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; + +import java.util.Collections; + +public final class CommentRepliesInfo extends ListInfo { + /** + * This class is used to wrap the comment replies page into a ListInfo object. + * + * @param comment the comment from which to get replies + * @param name will be shown as the fragment title + */ + public CommentRepliesInfo(final CommentsInfoItem comment, final String name) { + super(comment.getServiceId(), + new ListLinkHandler("", "", "", Collections.emptyList(), null), name); + setNextPage(comment.getReplies()); + setRelatedItems(Collections.emptyList()); // since it must be non-null + } +} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java index 5a5f84968..e25e02794 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java @@ -110,4 +110,14 @@ public class CommentsFragment extends BaseListInfoFragment + headerBinding.playlistDescriptionReadMore.setText( + Boolean.TRUE.equals(isEllipsized) ? R.string.show_more : R.string.show_less + )); + ellipsizer.setOnContentChanged(canBeEllipsized -> { + headerBinding.playlistDescriptionReadMore.setVisibility( + Boolean.TRUE.equals(canBeEllipsized) ? View.VISIBLE : View.GONE); + if (Boolean.TRUE.equals(canBeEllipsized)) { + ellipsizer.ellipsize(); + } + }); + ellipsizer.setContent(description); + headerBinding.playlistDescriptionReadMore.setOnClickListener(v -> ellipsizer.toggle()); + } else { + headerBinding.playlistDescription.setVisibility(View.GONE); + headerBinding.playlistDescriptionReadMore.setVisibility(View.GONE); + } + if (!result.getErrors().isEmpty()) { showSnackBarError(new ErrorInfo(result.getErrors(), UserAction.REQUESTED_PLAYLIST, result.getUrl(), result)); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 4bae6f1ca..eef3455ae 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -1,6 +1,7 @@ package org.schabi.newpipe.fragments.list.search; import static androidx.recyclerview.widget.ItemTouchHelper.Callback.makeMovementFlags; +import static org.schabi.newpipe.extractor.utils.Utils.isBlank; import static org.schabi.newpipe.ktx.ViewUtils.animate; import static org.schabi.newpipe.util.ExtractorHelper.showMetaInfoInTextView; import static java.util.Arrays.asList; @@ -389,7 +390,7 @@ public class SearchFragment extends BaseListFragment suggestionPublisher - .onNext(searchEditText.getText().toString()), + .onNext(getSearchEditString()), throwable -> showSnackBarError(new ErrorInfo(throwable, UserAction.DELETE_FROM_HISTORY, "Deleting item failed"))); @@ -723,9 +726,9 @@ public class SearchFragment extends BaseListFragment - searchHistoryEntries.stream() - .map(entry -> new SuggestionItem(true, entry)) - .collect(Collectors.toList())); + searchHistoryEntries.stream() + .map(entry -> new SuggestionItem(true, entry)) + .collect(Collectors.toList())); } private Observable> getRemoteSuggestionsObservable(final String query) { @@ -792,12 +795,12 @@ public class SearchFragment extends BaseListFragment showSnackBarError(new ErrorInfo( - throwable, UserAction.GET_SUGGESTIONS, searchString, serviceId))); + throwable, UserAction.GET_SUGGESTIONS, searchString, serviceId))); } @Override @@ -805,7 +808,13 @@ public class SearchFragment extends BaseListFragment NavigationHelper.getIntentByLink(activity, - streamingService, theSearchString)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(intent -> { - getFM().popBackStackImmediate(); - activity.startActivity(intent); - }, throwable -> showTextError(getString(R.string.unsupported_url)))); - return; - } + showLoading(); + disposables.add(Observable + .fromCallable(() -> NavigationHelper.getIntentByLink(activity, + streamingService, theSearchString)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(intent -> { + getFM().popBackStackImmediate(); + activity.startActivity(intent); + }, throwable -> showTextError(getString(R.string.unsupported_url)))); + return; } catch (final Exception ignored) { // Exception occurred, it's not a url } + // prepare search lastSearchedString = this.searchString; this.searchString = theSearchString; infoListAdapter.clearStreamItemList(); @@ -842,13 +852,17 @@ public class SearchFragment extends BaseListFragment { }, + ignored -> { + }, throwable -> showSnackBarError(new ErrorInfo(throwable, UserAction.SEARCHED, theSearchString, serviceId)) )); + + // load search results suggestionPublisher.onNext(theSearchString); startLoading(false); } @@ -938,6 +952,14 @@ public class SearchFragment extends BaseListFragment cannot be bundled without creating some containers @@ -1080,7 +1105,7 @@ public class SearchFragment extends BaseListFragment suggestionPublisher - .onNext(searchEditText.getText().toString()), + .onNext(getSearchEditString()), throwable -> showSnackBarError(new ErrorInfo(throwable, UserAction.DELETE_FROM_HISTORY, "Deleting item failed"))); disposables.add(onDelete); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java index 65664e0e3..e46937ede 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java @@ -21,18 +21,17 @@ import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.info_list.ItemViewMode; import org.schabi.newpipe.ktx.ViewUtils; -import org.schabi.newpipe.util.RelatedItemInfo; import java.io.Serializable; import java.util.function.Supplier; import io.reactivex.rxjava3.core.Single; -public class RelatedItemsFragment extends BaseListInfoFragment +public class RelatedItemsFragment extends BaseListInfoFragment implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String INFO_KEY = "related_info_key"; - private RelatedItemInfo relatedItemInfo; + private RelatedItemsInfo relatedItemsInfo; /*////////////////////////////////////////////////////////////////////////// // Views @@ -69,7 +68,7 @@ public class RelatedItemsFragment extends BaseListInfoFragment getListHeaderSupplier() { - if (relatedItemInfo == null || relatedItemInfo.getRelatedItems() == null) { + if (relatedItemsInfo == null || relatedItemsInfo.getRelatedItems() == null) { return null; } @@ -97,8 +96,8 @@ public class RelatedItemsFragment extends BaseListInfoFragment loadResult(final boolean forceLoad) { - return Single.fromCallable(() -> relatedItemInfo); + protected Single loadResult(final boolean forceLoad) { + return Single.fromCallable(() -> relatedItemsInfo); } @Override @@ -110,7 +109,7 @@ public class RelatedItemsFragment extends BaseListInfoFragment { + /** + * This class is used to wrap the related items of a StreamInfo into a ListInfo object. + * + * @param info the stream info from which to get related items + */ + public RelatedItemsInfo(final StreamInfo info) { + super(info.getServiceId(), new ListLinkHandler(info.getOriginalUrl(), info.getUrl(), + info.getId(), Collections.emptyList(), null), info.getName()); + setRelatedItems(new ArrayList<>(info.getRelatedItems())); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java index 68f19ee97..d959c6327 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.java @@ -13,8 +13,7 @@ import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.info_list.holder.ChannelInfoItemHolder; import org.schabi.newpipe.info_list.holder.ChannelMiniInfoItemHolder; -import org.schabi.newpipe.info_list.holder.CommentsInfoItemHolder; -import org.schabi.newpipe.info_list.holder.CommentsMiniInfoItemHolder; +import org.schabi.newpipe.info_list.holder.CommentInfoItemHolder; import org.schabi.newpipe.info_list.holder.InfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistInfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistMiniInfoItemHolder; @@ -87,8 +86,7 @@ public class InfoItemBuilder { return useMiniVariant ? new PlaylistMiniInfoItemHolder(this, parent) : new PlaylistInfoItemHolder(this, parent); case COMMENT: - return useMiniVariant ? new CommentsMiniInfoItemHolder(this, parent) - : new CommentsInfoItemHolder(this, parent); + return new CommentInfoItemHolder(this, parent); default: throw new RuntimeException("InfoType not expected = " + infoType.name()); } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java index a13f0e5aa..575568c00 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java @@ -21,8 +21,7 @@ import org.schabi.newpipe.info_list.holder.ChannelCardInfoItemHolder; import org.schabi.newpipe.info_list.holder.ChannelGridInfoItemHolder; import org.schabi.newpipe.info_list.holder.ChannelInfoItemHolder; import org.schabi.newpipe.info_list.holder.ChannelMiniInfoItemHolder; -import org.schabi.newpipe.info_list.holder.CommentsInfoItemHolder; -import org.schabi.newpipe.info_list.holder.CommentsMiniInfoItemHolder; +import org.schabi.newpipe.info_list.holder.CommentInfoItemHolder; import org.schabi.newpipe.info_list.holder.InfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistCardInfoItemHolder; import org.schabi.newpipe.info_list.holder.PlaylistGridInfoItemHolder; @@ -79,8 +78,7 @@ public class InfoListAdapter extends RecyclerView.Adapter ShareUtils.shareText(fragment.requireContext(), item.getName(), item.getUrl(), - item.getThumbnailUrl())), + item.getThumbnails())), /** * Opens a {@link DownloadDialog} after fetching some stream info. diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java index 3b375d6eb..7afc05c6c 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java @@ -13,7 +13,7 @@ import org.schabi.newpipe.extractor.channel.ChannelInfoItem; import org.schabi.newpipe.extractor.utils.Utils; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.Localization; public class ChannelMiniInfoItemHolder extends InfoItemHolder { @@ -56,7 +56,7 @@ public class ChannelMiniInfoItemHolder extends InfoItemHolder { itemAdditionalDetailView.setText(getDetailLine(item)); } - PicassoHelper.loadAvatar(item.getThumbnailUrl()).into(itemThumbnailView); + PicassoHelper.loadAvatar(item.getThumbnails()).into(itemThumbnailView); itemView.setOnClickListener(view -> { if (itemBuilder.getOnChannelSelectedListener() != null) { diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java new file mode 100644 index 000000000..a3f0384ad --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java @@ -0,0 +1,188 @@ +package org.schabi.newpipe.info_list.holder; + +import static org.schabi.newpipe.util.ServiceHelper.getServiceById; + +import android.text.method.LinkMovementMethod; +import android.text.style.URLSpan; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; +import org.schabi.newpipe.info_list.InfoItemBuilder; +import org.schabi.newpipe.local.history.HistoryRecordManager; +import org.schabi.newpipe.util.DeviceUtils; +import org.schabi.newpipe.util.Localization; +import org.schabi.newpipe.util.NavigationHelper; +import org.schabi.newpipe.util.external_communication.ShareUtils; +import org.schabi.newpipe.util.image.ImageStrategy; +import org.schabi.newpipe.util.image.PicassoHelper; +import org.schabi.newpipe.util.text.CommentTextOnTouchListener; +import org.schabi.newpipe.util.text.TextEllipsizer; + +public class CommentInfoItemHolder extends InfoItemHolder { + + private static final int COMMENT_DEFAULT_LINES = 2; + private final int commentHorizontalPadding; + private final int commentVerticalPadding; + + private final RelativeLayout itemRoot; + private final ImageView itemThumbnailView; + private final TextView itemContentView; + private final ImageView itemThumbsUpView; + private final TextView itemLikesCountView; + private final TextView itemTitleView; + private final ImageView itemHeartView; + private final ImageView itemPinnedView; + private final Button repliesButton; + + @NonNull + private final TextEllipsizer textEllipsizer; + + public CommentInfoItemHolder(final InfoItemBuilder infoItemBuilder, + final ViewGroup parent) { + super(infoItemBuilder, R.layout.list_comment_item, parent); + + itemRoot = itemView.findViewById(R.id.itemRoot); + itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView); + itemContentView = itemView.findViewById(R.id.itemCommentContentView); + itemThumbsUpView = itemView.findViewById(R.id.detail_thumbs_up_img_view); + itemLikesCountView = itemView.findViewById(R.id.detail_thumbs_up_count_view); + itemTitleView = itemView.findViewById(R.id.itemTitleView); + itemHeartView = itemView.findViewById(R.id.detail_heart_image_view); + itemPinnedView = itemView.findViewById(R.id.detail_pinned_view); + repliesButton = itemView.findViewById(R.id.replies_button); + + commentHorizontalPadding = (int) infoItemBuilder.getContext() + .getResources().getDimension(R.dimen.comments_horizontal_padding); + commentVerticalPadding = (int) infoItemBuilder.getContext() + .getResources().getDimension(R.dimen.comments_vertical_padding); + + textEllipsizer = new TextEllipsizer(itemContentView, COMMENT_DEFAULT_LINES, null); + textEllipsizer.setStateChangeListener(isEllipsized -> { + if (Boolean.TRUE.equals(isEllipsized)) { + denyLinkFocus(); + } else { + determineMovementMethod(); + } + }); + } + + @Override + public void updateFromItem(final InfoItem infoItem, + final HistoryRecordManager historyRecordManager) { + if (!(infoItem instanceof CommentsInfoItem)) { + return; + } + final CommentsInfoItem item = (CommentsInfoItem) infoItem; + + + // load the author avatar + PicassoHelper.loadAvatar(item.getUploaderAvatars()).into(itemThumbnailView); + if (ImageStrategy.shouldLoadImages()) { + itemThumbnailView.setVisibility(View.VISIBLE); + itemRoot.setPadding(commentVerticalPadding, commentVerticalPadding, + commentVerticalPadding, commentVerticalPadding); + } else { + itemThumbnailView.setVisibility(View.GONE); + itemRoot.setPadding(commentHorizontalPadding, commentVerticalPadding, + commentHorizontalPadding, commentVerticalPadding); + } + itemThumbnailView.setOnClickListener(view -> openCommentAuthor(item)); + + + // setup the top row, with pinned icon, author name and comment date + itemPinnedView.setVisibility(item.isPinned() ? View.VISIBLE : View.GONE); + itemTitleView.setText(Localization.concatenateStrings(item.getUploaderName(), + Localization.relativeTimeOrTextual(itemBuilder.getContext(), item.getUploadDate(), + item.getTextualUploadDate()))); + + + // setup bottom row, with likes, heart and replies button + itemLikesCountView.setText( + Localization.likeCount(itemBuilder.getContext(), item.getLikeCount())); + + itemHeartView.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE); + + final boolean hasReplies = item.getReplies() != null; + repliesButton.setOnClickListener(hasReplies ? v -> openCommentReplies(item) : null); + repliesButton.setVisibility(hasReplies ? View.VISIBLE : View.GONE); + repliesButton.setText(hasReplies + ? Localization.replyCount(itemBuilder.getContext(), item.getReplyCount()) : ""); + ((RelativeLayout.LayoutParams) itemThumbsUpView.getLayoutParams()).topMargin = + hasReplies ? 0 : DeviceUtils.dpToPx(6, itemBuilder.getContext()); + + + // setup comment content and click listeners to expand/ellipsize it + textEllipsizer.setStreamingService(getServiceById(item.getServiceId())); + textEllipsizer.setStreamUrl(item.getUrl()); + textEllipsizer.setContent(item.getCommentText()); + textEllipsizer.ellipsize(); + + //noinspection ClickableViewAccessibility + itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE); + + itemView.setOnClickListener(view -> { + textEllipsizer.toggle(); + if (itemBuilder.getOnCommentsSelectedListener() != null) { + itemBuilder.getOnCommentsSelectedListener().selected(item); + } + }); + + itemView.setOnLongClickListener(view -> { + if (DeviceUtils.isTv(itemBuilder.getContext())) { + openCommentAuthor(item); + } else { + final CharSequence text = itemContentView.getText(); + if (text != null) { + ShareUtils.copyToClipboard(itemBuilder.getContext(), text.toString()); + } + } + return true; + }); + } + + private void openCommentAuthor(@NonNull final CommentsInfoItem item) { + NavigationHelper.openCommentAuthorIfPresent((FragmentActivity) itemBuilder.getContext(), + item); + } + + private void openCommentReplies(@NonNull final CommentsInfoItem item) { + NavigationHelper.openCommentRepliesFragment((FragmentActivity) itemBuilder.getContext(), + item); + } + + private void allowLinkFocus() { + itemContentView.setMovementMethod(LinkMovementMethod.getInstance()); + } + + private void denyLinkFocus() { + itemContentView.setMovementMethod(null); + } + + private boolean shouldFocusLinks() { + if (itemView.isInTouchMode()) { + return false; + } + + final URLSpan[] urls = itemContentView.getUrls(); + + return urls != null && urls.length != 0; + } + + private void determineMovementMethod() { + if (shouldFocusLinks()) { + allowLinkFocus(); + } else { + denyLinkFocus(); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java deleted file mode 100644 index 4fc2d9f84..000000000 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsInfoItemHolder.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.schabi.newpipe.info_list.holder; - -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.InfoItem; -import org.schabi.newpipe.extractor.comments.CommentsInfoItem; -import org.schabi.newpipe.info_list.InfoItemBuilder; -import org.schabi.newpipe.local.history.HistoryRecordManager; - -/* - * Created by Christian Schabesberger on 12.02.17. - * - * Copyright (C) Christian Schabesberger 2016 - * ChannelInfoItemHolder .java is part of NewPipe. - * - * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - */ - -public class CommentsInfoItemHolder extends CommentsMiniInfoItemHolder { - public final TextView itemTitleView; - private final ImageView itemHeartView; - private final ImageView itemPinnedView; - - public CommentsInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) { - super(infoItemBuilder, R.layout.list_comments_item, parent); - - itemTitleView = itemView.findViewById(R.id.itemTitleView); - itemHeartView = itemView.findViewById(R.id.detail_heart_image_view); - itemPinnedView = itemView.findViewById(R.id.detail_pinned_view); - } - - @Override - public void updateFromItem(final InfoItem infoItem, - final HistoryRecordManager historyRecordManager) { - super.updateFromItem(infoItem, historyRecordManager); - - if (!(infoItem instanceof CommentsInfoItem)) { - return; - } - final CommentsInfoItem item = (CommentsInfoItem) infoItem; - - itemTitleView.setText(item.getUploaderName()); - - itemHeartView.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE); - - itemPinnedView.setVisibility(item.isPinned() ? View.VISIBLE : View.GONE); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java deleted file mode 100644 index 1c8db26d6..000000000 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java +++ /dev/null @@ -1,279 +0,0 @@ -package org.schabi.newpipe.info_list.holder; - -import static android.text.TextUtils.isEmpty; - -import android.graphics.Paint; -import android.text.Layout; -import android.text.method.LinkMovementMethod; -import android.text.style.URLSpan; -import android.util.Log; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.text.HtmlCompat; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.error.ErrorUtil; -import org.schabi.newpipe.extractor.InfoItem; -import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.ServiceList; -import org.schabi.newpipe.extractor.StreamingService; -import org.schabi.newpipe.extractor.comments.CommentsInfoItem; -import org.schabi.newpipe.extractor.exceptions.ExtractionException; -import org.schabi.newpipe.extractor.stream.Description; -import org.schabi.newpipe.info_list.InfoItemBuilder; -import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.DeviceUtils; -import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.util.PicassoHelper; -import org.schabi.newpipe.util.external_communication.ShareUtils; -import org.schabi.newpipe.util.text.CommentTextOnTouchListener; -import org.schabi.newpipe.util.text.TextLinkifier; - -import java.util.function.Consumer; - -import io.reactivex.rxjava3.disposables.CompositeDisposable; - -public class CommentsMiniInfoItemHolder extends InfoItemHolder { - private static final String TAG = "CommentsMiniIIHolder"; - private static final String ELLIPSIS = "…"; - - private static final int COMMENT_DEFAULT_LINES = 2; - private static final int COMMENT_EXPANDED_LINES = 1000; - - private final int commentHorizontalPadding; - private final int commentVerticalPadding; - - private final Paint paintAtContentSize; - private final float ellipsisWidthPx; - - private final RelativeLayout itemRoot; - private final ImageView itemThumbnailView; - private final TextView itemContentView; - private final TextView itemLikesCountView; - private final TextView itemPublishedTime; - - private final CompositeDisposable disposables = new CompositeDisposable(); - @Nullable private Description commentText; - @Nullable private StreamingService streamService; - @Nullable private String streamUrl; - - CommentsMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId, - final ViewGroup parent) { - super(infoItemBuilder, layoutId, parent); - - itemRoot = itemView.findViewById(R.id.itemRoot); - itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView); - itemLikesCountView = itemView.findViewById(R.id.detail_thumbs_up_count_view); - itemPublishedTime = itemView.findViewById(R.id.itemPublishedTime); - itemContentView = itemView.findViewById(R.id.itemCommentContentView); - - commentHorizontalPadding = (int) infoItemBuilder.getContext() - .getResources().getDimension(R.dimen.comments_horizontal_padding); - commentVerticalPadding = (int) infoItemBuilder.getContext() - .getResources().getDimension(R.dimen.comments_vertical_padding); - - paintAtContentSize = new Paint(); - paintAtContentSize.setTextSize(itemContentView.getTextSize()); - ellipsisWidthPx = paintAtContentSize.measureText(ELLIPSIS); - } - - public CommentsMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, - final ViewGroup parent) { - this(infoItemBuilder, R.layout.list_comments_mini_item, parent); - } - - @Override - public void updateFromItem(final InfoItem infoItem, - final HistoryRecordManager historyRecordManager) { - if (!(infoItem instanceof CommentsInfoItem)) { - return; - } - final CommentsInfoItem item = (CommentsInfoItem) infoItem; - - PicassoHelper.loadAvatar(item.getUploaderAvatarUrl()).into(itemThumbnailView); - if (PicassoHelper.getShouldLoadImages()) { - itemThumbnailView.setVisibility(View.VISIBLE); - itemRoot.setPadding(commentVerticalPadding, commentVerticalPadding, - commentVerticalPadding, commentVerticalPadding); - } else { - itemThumbnailView.setVisibility(View.GONE); - itemRoot.setPadding(commentHorizontalPadding, commentVerticalPadding, - commentHorizontalPadding, commentVerticalPadding); - } - - - itemThumbnailView.setOnClickListener(view -> openCommentAuthor(item)); - - try { - streamService = NewPipe.getService(item.getServiceId()); - } catch (final ExtractionException e) { - // should never happen - ErrorUtil.showUiErrorSnackbar(itemBuilder.getContext(), "Getting StreamingService", e); - Log.w(TAG, "Cannot obtain service from comment service id, defaulting to YouTube", e); - streamService = ServiceList.YouTube; - } - streamUrl = item.getUrl(); - commentText = item.getCommentText(); - ellipsize(); - - //noinspection ClickableViewAccessibility - itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE); - - if (item.getLikeCount() >= 0) { - itemLikesCountView.setText( - Localization.shortCount( - itemBuilder.getContext(), - item.getLikeCount())); - } else { - itemLikesCountView.setText("-"); - } - - if (item.getUploadDate() != null) { - itemPublishedTime.setText(Localization.relativeTime(item.getUploadDate() - .offsetDateTime())); - } else { - itemPublishedTime.setText(item.getTextualUploadDate()); - } - - itemView.setOnClickListener(view -> { - toggleEllipsize(); - if (itemBuilder.getOnCommentsSelectedListener() != null) { - itemBuilder.getOnCommentsSelectedListener().selected(item); - } - }); - - - itemView.setOnLongClickListener(view -> { - if (DeviceUtils.isTv(itemBuilder.getContext())) { - openCommentAuthor(item); - } else { - final CharSequence text = itemContentView.getText(); - if (text != null) { - ShareUtils.copyToClipboard(itemBuilder.getContext(), text.toString()); - } - } - return true; - }); - } - - private void openCommentAuthor(final CommentsInfoItem item) { - if (isEmpty(item.getUploaderUrl())) { - return; - } - final AppCompatActivity activity = (AppCompatActivity) itemBuilder.getContext(); - try { - NavigationHelper.openChannelFragment( - activity.getSupportFragmentManager(), - item.getServiceId(), - item.getUploaderUrl(), - item.getUploaderName()); - } catch (final Exception e) { - ErrorUtil.showUiErrorSnackbar(activity, "Opening channel fragment", e); - } - } - - private void allowLinkFocus() { - itemContentView.setMovementMethod(LinkMovementMethod.getInstance()); - } - - private void denyLinkFocus() { - itemContentView.setMovementMethod(null); - } - - private boolean shouldFocusLinks() { - if (itemView.isInTouchMode()) { - return false; - } - - final URLSpan[] urls = itemContentView.getUrls(); - - return urls != null && urls.length != 0; - } - - private void determineMovementMethod() { - if (shouldFocusLinks()) { - allowLinkFocus(); - } else { - denyLinkFocus(); - } - } - - private void ellipsize() { - itemContentView.setMaxLines(COMMENT_EXPANDED_LINES); - linkifyCommentContentView(v -> { - boolean hasEllipsis = false; - - final CharSequence charSeqText = itemContentView.getText(); - if (charSeqText != null && itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) { - // Note that converting to String removes spans (i.e. links), but that's something - // we actually want since when the text is ellipsized we want all clicks on the - // comment to expand the comment, not to open links. - final String text = charSeqText.toString(); - - final Layout layout = itemContentView.getLayout(); - final float lineWidth = layout.getLineWidth(COMMENT_DEFAULT_LINES - 1); - final float layoutWidth = layout.getWidth(); - final int lineStart = layout.getLineStart(COMMENT_DEFAULT_LINES - 1); - final int lineEnd = layout.getLineEnd(COMMENT_DEFAULT_LINES - 1); - - // remove characters up until there is enough space for the ellipsis - // (also summing 2 more pixels, just to be sure to avoid float rounding errors) - int end = lineEnd; - float removedCharactersWidth = 0.0f; - while (lineWidth - removedCharactersWidth + ellipsisWidthPx + 2.0f > layoutWidth - && end >= lineStart) { - end -= 1; - // recalculate each time to account for ligatures or other similar things - removedCharactersWidth = paintAtContentSize.measureText( - text.substring(end, lineEnd)); - } - - // remove trailing spaces and newlines - while (end > 0 && Character.isWhitespace(text.charAt(end - 1))) { - end -= 1; - } - - final String newVal = text.substring(0, end) + ELLIPSIS; - itemContentView.setText(newVal); - hasEllipsis = true; - } - - itemContentView.setMaxLines(COMMENT_DEFAULT_LINES); - if (hasEllipsis) { - denyLinkFocus(); - } else { - determineMovementMethod(); - } - }); - } - - private void toggleEllipsize() { - final CharSequence text = itemContentView.getText(); - if (!isEmpty(text) && text.charAt(text.length() - 1) == ELLIPSIS.charAt(0)) { - expand(); - } else if (itemContentView.getLineCount() > COMMENT_DEFAULT_LINES) { - ellipsize(); - } - } - - private void expand() { - itemContentView.setMaxLines(COMMENT_EXPANDED_LINES); - linkifyCommentContentView(v -> determineMovementMethod()); - } - - private void linkifyCommentContentView(@Nullable final Consumer onCompletion) { - disposables.clear(); - if (commentText != null) { - TextLinkifier.fromDescription(itemContentView, commentText, - HtmlCompat.FROM_HTML_MODE_LEGACY, streamService, streamUrl, disposables, - onCompletion); - } - } -} diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java index bf5f57db3..c9216d9a9 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java @@ -9,7 +9,7 @@ import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.Localization; public class PlaylistMiniInfoItemHolder extends InfoItemHolder { @@ -46,7 +46,7 @@ public class PlaylistMiniInfoItemHolder extends InfoItemHolder { .localizeStreamCountMini(itemStreamCountView.getContext(), item.getStreamCount())); itemUploaderView.setText(item.getUploaderName()); - PicassoHelper.loadPlaylistThumbnail(item.getThumbnailUrl()).into(itemThumbnailView); + PicassoHelper.loadPlaylistThumbnail(item.getThumbnails()).into(itemThumbnailView); itemView.setOnClickListener(view -> { if (itemBuilder.getOnPlaylistSelectedListener() != null) { diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java index a84c98404..80f62eed3 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java @@ -12,10 +12,6 @@ import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.Localization; -import androidx.preference.PreferenceManager; - -import static org.schabi.newpipe.MainActivity.DEBUG; - /* * Created by Christian Schabesberger on 01.08.16. *

@@ -81,7 +77,9 @@ public class StreamInfoItemHolder extends StreamMiniInfoItemHolder { } } - final String uploadDate = getFormattedRelativeUploadDate(infoItem); + final String uploadDate = Localization.relativeTimeOrTextual(itemBuilder.getContext(), + infoItem.getUploadDate(), + infoItem.getTextualUploadDate()); if (!TextUtils.isEmpty(uploadDate)) { if (viewsAndDate.isEmpty()) { return uploadDate; @@ -92,20 +90,4 @@ public class StreamInfoItemHolder extends StreamMiniInfoItemHolder { return viewsAndDate; } - - private String getFormattedRelativeUploadDate(final StreamInfoItem infoItem) { - if (infoItem.getUploadDate() != null) { - String formattedRelativeTime = Localization - .relativeTime(infoItem.getUploadDate().offsetDateTime()); - - if (DEBUG && PreferenceManager.getDefaultSharedPreferences(itemBuilder.getContext()) - .getBoolean(itemBuilder.getContext() - .getString(R.string.show_original_time_ago_key), false)) { - formattedRelativeTime += " (" + infoItem.getTextualUploadDate() + ")"; - } - return formattedRelativeTime; - } else { - return infoItem.getTextualUploadDate(); - } - } } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java index 6dd06e47f..01f3be6b3 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java @@ -16,7 +16,7 @@ import org.schabi.newpipe.ktx.ViewUtils; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.StreamTypeUtil; import org.schabi.newpipe.views.AnimatedProgressBar; @@ -87,7 +87,7 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder { } // Default thumbnail is shown on error, while loading and if the url is empty - PicassoHelper.loadThumbnail(item.getThumbnailUrl()).into(itemThumbnailView); + PicassoHelper.loadThumbnail(item.getThumbnails()).into(itemThumbnailView); itemView.setOnClickListener(view -> { if (itemBuilder.getOnStreamSelectedListener() != null) { diff --git a/app/src/main/java/org/schabi/newpipe/ktx/Bundle.kt b/app/src/main/java/org/schabi/newpipe/ktx/Bundle.kt new file mode 100644 index 000000000..61721d546 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/ktx/Bundle.kt @@ -0,0 +1,9 @@ +package org.schabi.newpipe.ktx + +import android.os.Bundle +import android.os.Parcelable +import androidx.core.os.BundleCompat + +inline fun Bundle.parcelableArrayList(key: String?): ArrayList? { + return BundleCompat.getParcelableArrayList(this, key, T::class.java) +} diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 83882d35f..0b61f45fb 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -607,9 +607,13 @@ class FeedFragment : BaseStateFragment() { execOnEnd = { // Disabled animations would result in immediately hiding the button // after it showed up - if (DeviceUtils.hasAnimationsAnimatorDurationEnabled(context)) { - // Hide the new items-"popup" after 10s - hideNewItemsLoaded(true, 10000) + // Context can be null in some cases, so we have to make sure it is not null in + // order to avoid a NullPointerException + context?.let { + if (DeviceUtils.hasAnimationsAnimatorDurationEnabled(it)) { + // Hide the new items button after 10s + hideNewItemsLoaded(true, 10000) + } } } ) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt index d795dcb08..4a071d6df 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt @@ -18,8 +18,8 @@ import org.schabi.newpipe.extractor.stream.StreamType.POST_LIVE_AUDIO_STREAM import org.schabi.newpipe.extractor.stream.StreamType.POST_LIVE_STREAM import org.schabi.newpipe.extractor.stream.StreamType.VIDEO_STREAM import org.schabi.newpipe.util.Localization -import org.schabi.newpipe.util.PicassoHelper import org.schabi.newpipe.util.StreamTypeUtil +import org.schabi.newpipe.util.image.PicassoHelper import java.util.concurrent.TimeUnit import java.util.function.Consumer diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt index 782f5ee47..8ea89368d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt @@ -22,7 +22,7 @@ import org.schabi.newpipe.R import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.local.feed.service.FeedUpdateInfo import org.schabi.newpipe.util.NavigationHelper -import org.schabi.newpipe.util.PicassoHelper +import org.schabi.newpipe.util.image.PicassoHelper /** * Helper for everything related to show notifications about new streams to the user. @@ -58,7 +58,7 @@ class NotificationHelper(val context: Context) { .setAutoCancel(true) .setCategory(NotificationCompat.CATEGORY_SOCIAL) .setGroupSummary(true) - .setGroup(data.originalInfo.url) + .setGroup(data.url) .setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY) // Build a summary notification for Android versions < 7.0 @@ -73,7 +73,7 @@ class NotificationHelper(val context: Context) { context, data.pseudoId, NavigationHelper - .getChannelIntent(context, data.originalInfo.serviceId, data.originalInfo.url) + .getChannelIntent(context, data.serviceId, data.url) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), 0, false @@ -88,7 +88,7 @@ class NotificationHelper(val context: Context) { // Show individual stream notifications, set channel icon only if there is actually // one - showStreamNotifications(newStreams, data.originalInfo.serviceId, bitmap) + showStreamNotifications(newStreams, data.serviceId, bitmap) // Show summary notification manager.notify(data.pseudoId, summaryBuilder.build()) @@ -97,7 +97,7 @@ class NotificationHelper(val context: Context) { override fun onBitmapFailed(e: Exception, errorDrawable: Drawable) { // Show individual stream notifications - showStreamNotifications(newStreams, data.originalInfo.serviceId, null) + showStreamNotifications(newStreams, data.serviceId, null) // Show summary notification manager.notify(data.pseudoId, summaryBuilder.build()) iconLoadingTargets.remove(this) // allow it to be garbage-collected diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt index de640dbbb..a40bf35dc 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt @@ -137,7 +137,7 @@ class NotificationWorker( .enqueueUniquePeriodicWork( WORK_TAG, if (force) { - ExistingPeriodicWorkPolicy.REPLACE + ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE } else { ExistingPeriodicWorkPolicy.KEEP }, diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt index 3d19de9c6..1c2826e7a 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt @@ -26,7 +26,7 @@ object FeedEventManager { } sealed class Event { - object IdleEvent : Event() + data object IdleEvent : Event() data class ProgressEvent(val currentProgress: Int = -1, val maxProgress: Int = -1, @StringRes val progressMessage: Int = 0) : Event() { constructor(@StringRes progressMessage: Int) : this(-1, -1, progressMessage) } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt index b86c856fc..0b6a8068c 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt @@ -277,14 +277,14 @@ class FeedLoadManager(private val context: Context) { notification.value!!.newStreams = filterNewStreams(info.streams) feedDatabaseManager.upsertAll(info.uid, info.streams) - subscriptionManager.updateFromInfo(info.uid, info.originalInfo) + subscriptionManager.updateFromInfo(info) if (info.errors.isNotEmpty()) { feedResultsHolder.addErrors( info.errors.map { FeedLoadService.RequestException( info.uid, - "${info.originalInfo.serviceId}:${info.originalInfo.url}", + "${info.serviceId}:${info.url}", it ) } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt index 12fbe8d41..84cd8ed59 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt @@ -3,29 +3,48 @@ package org.schabi.newpipe.local.feed.service import org.schabi.newpipe.database.subscription.NotificationMode import org.schabi.newpipe.database.subscription.SubscriptionEntity import org.schabi.newpipe.extractor.Info +import org.schabi.newpipe.extractor.channel.ChannelInfo import org.schabi.newpipe.extractor.stream.StreamInfoItem +import org.schabi.newpipe.util.image.ImageStrategy +/** + * Instances of this class might stay around in memory for some time while fetching the feed, + * because of [FeedLoadManager.BUFFER_COUNT_BEFORE_INSERT]. Therefore this class should contain + * as little data as possible to avoid out of memory errors. In particular, avoid storing whole + * [ChannelInfo] objects, as they might contain raw JSON info in ready channel tabs link handlers. + */ data class FeedUpdateInfo( val uid: Long, @NotificationMode val notificationMode: Int, val name: String, val avatarUrl: String, - val originalInfo: Info, + val url: String, + val serviceId: Int, + // description and subscriberCount are null if the constructor info is from the fast feed method + val description: String?, + val subscriberCount: Long?, val streams: List, val errors: List, ) { constructor( subscription: SubscriptionEntity, - originalInfo: Info, + info: Info, streams: List, errors: List, ) : this( uid = subscription.uid, notificationMode = subscription.notificationMode, - name = subscription.name, - avatarUrl = subscription.avatarUrl, - originalInfo = originalInfo, + name = info.name, + avatarUrl = (info as? ChannelInfo)?.avatars?.let { + // if the newly fetched info is not from fast feed, then it contains updated avatars + ImageStrategy.imageListToDbUrl(it) + } ?: subscription.avatarUrl, + url = info.url, + serviceId = info.serviceId, + // there is no description and subscriberCount in the fast feed + description = (info as? ChannelInfo)?.description, + subscriberCount = (info as? ChannelInfo)?.subscriberCount, streams = streams, errors = errors, ) @@ -34,7 +53,7 @@ data class FeedUpdateInfo( * Integer id, can be used as notification id, etc. */ val pseudoId: Int - get() = originalInfo.url.hashCode() + get() = url.hashCode() lateinit var newStreams: List } diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java index 240ca0462..336f5cfe3 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java @@ -8,7 +8,7 @@ import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry; import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.Localization; import java.time.format.DateTimeFormatter; diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java index c98a8b60b..89a714fd7 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java @@ -16,7 +16,7 @@ import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.views.AnimatedProgressBar; diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java index 41f2df1d0..150a35eb5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java @@ -16,7 +16,7 @@ import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; import org.schabi.newpipe.views.AnimatedProgressBar; diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java index 70987a6fc..d14c1a231 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java @@ -8,7 +8,7 @@ import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity; import org.schabi.newpipe.local.LocalItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; import java.time.format.DateTimeFormatter; diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 0d8f81334..51da52ae0 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -41,6 +41,7 @@ import org.schabi.newpipe.databinding.PlaylistControlBinding; import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder; import org.schabi.newpipe.info_list.dialog.InfoItemDialog; import org.schabi.newpipe.info_list.dialog.StreamDialogDefaultEntry; @@ -51,8 +52,8 @@ import org.schabi.newpipe.player.playqueue.SinglePlayQueue; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; -import org.schabi.newpipe.util.external_communication.ShareUtils; import org.schabi.newpipe.util.PlayButtonHelper; +import org.schabi.newpipe.util.external_communication.ShareUtils; import java.util.ArrayList; import java.util.Collections; @@ -71,7 +72,7 @@ import io.reactivex.rxjava3.subjects.PublishSubject; public class LocalPlaylistFragment extends BaseLocalListFragment, Void> implements PlaylistControlViewHolder { - // Save the list 10 seconds after the last change occurred + /** Save the list 10 seconds after the last change occurred. */ private static final long SAVE_DEBOUNCE_MILLIS = 10000; private static final int MINIMUM_INITIAL_DRAG_VELOCITY = 12; @State @@ -92,13 +93,20 @@ public class LocalPlaylistFragment extends BaseLocalListFragment debouncedSaveSignal; private CompositeDisposable disposables; - /* Has the playlist been fully loaded from db */ + /** Whether the playlist has been fully loaded from db. */ private AtomicBoolean isLoadingComplete; - /* Has the playlist been modified (e.g. items reordered or deleted) */ + /** Whether the playlist has been modified (e.g. items reordered or deleted) */ private AtomicBoolean isModified; - /* Flag to prevent simultaneous rewrites of the playlist */ + /** Flag to prevent simultaneous rewrites of the playlist. */ private boolean isRewritingPlaylist = false; + /** + * The pager adapter that the fragment is created from when it is used as frontpage, i.e. + * {@link #useAsFrontPage} is {@link true}. + */ + @Nullable + private MainFragment.SelectedTabsPagerAdapter tabsPagerAdapter = null; + public static LocalPlaylistFragment getInstance(final long playlistId, final String name) { final LocalPlaylistFragment instance = new LocalPlaylistFragment(); instance.setInitialData(playlistId, name); @@ -158,6 +166,17 @@ public class LocalPlaylistFragment extends BaseLocalListFragmentCommit changes immediately if the playlist has been modified.

+ * Delete operations and other modifications will be committed to ensure that the database + * is up to date, e.g. when the user adds the just deleted stream from another fragment. + */ + public void commitChanges() { + if (isModified != null && isModified.get()) { + saveImmediate(); + } + } + @Override protected void initListeners() { super.initListeners(); @@ -291,6 +310,9 @@ public class LocalPlaylistFragment extends BaseLocalListFragment Single.just(playlist.stream() .map(PlaylistStreamEntry::getStreamEntity) - .map(StreamEntity::getUrl) + .map(streamEntity -> { + if (shouldSharePlaylistDetails) { + return context.getString(R.string.video_details_list_item, + streamEntity.getTitle(), streamEntity.getUrl()); + } else { + return streamEntity.getUrl(); + } + }) .collect(Collectors.joining("\n")))) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(urlsText -> ShareUtils.shareText(requireContext(), name, urlsText), + .subscribe(urlsText -> ShareUtils.shareText( + context, name, shouldSharePlaylistDetails + ? context.getString(R.string.share_playlist_content_details, + name, urlsText) : urlsText), throwable -> showUiErrorSnackbar(this, "Sharing playlist", throwable))); } @@ -841,5 +880,29 @@ public class LocalPlaylistFragment extends BaseLocalListFragment + sharePlaylist(/* shouldSharePlaylistDetails= */ true) + ) + .setNegativeButton(R.string.share_playlist_with_list, (dialog, which) -> + sharePlaylist(/* shouldSharePlaylistDetails= */ false) + ) + .show(); + } + + public void setTabsPagerAdapter( + @Nullable final MainFragment.SelectedTabsPagerAdapter tabsPagerAdapter) { + this.tabsPagerAdapter = tabsPagerAdapter; + } } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt index dda4326e9..fe2321059 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt @@ -341,8 +341,7 @@ class SubscriptionFragment : BaseStateFragment() { val actions = DialogInterface.OnClickListener { _, i -> when (i) { 0 -> ShareUtils.shareText( - requireContext(), selectedItem.name, selectedItem.url, - selectedItem.thumbnailUrl + requireContext(), selectedItem.name, selectedItem.url, selectedItem.thumbnails ) 1 -> ShareUtils.openUrlInBrowser(requireContext(), selectedItem.url) 2 -> deleteChannel(selectedItem) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt index 3c11ce152..488d8b3d2 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt @@ -12,13 +12,13 @@ import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.subscription.NotificationMode import org.schabi.newpipe.database.subscription.SubscriptionDAO import org.schabi.newpipe.database.subscription.SubscriptionEntity -import org.schabi.newpipe.extractor.Info import org.schabi.newpipe.extractor.channel.ChannelInfo import org.schabi.newpipe.extractor.channel.tabs.ChannelTabInfo -import org.schabi.newpipe.extractor.feed.FeedInfo import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.local.feed.FeedDatabaseManager +import org.schabi.newpipe.local.feed.service.FeedUpdateInfo import org.schabi.newpipe.util.ExtractorHelper +import org.schabi.newpipe.util.image.ImageStrategy class SubscriptionManager(context: Context) { private val database = NewPipeDatabase.getInstance(context) @@ -71,7 +71,12 @@ class SubscriptionManager(context: Context) { subscriptionTable.getSubscription(info.serviceId, info.url) .flatMapCompletable { Completable.fromRunnable { - it.setData(info.name, info.avatarUrl, info.description, info.subscriberCount) + it.setData( + info.name, + ImageStrategy.imageListToDbUrl(info.avatars), + info.description, + info.subscriberCount + ) subscriptionTable.update(it) } } @@ -91,19 +96,15 @@ class SubscriptionManager(context: Context) { } } - fun updateFromInfo(subscriptionId: Long, info: Info) { - val subscriptionEntity = subscriptionTable.getSubscription(subscriptionId) + fun updateFromInfo(info: FeedUpdateInfo) { + val subscriptionEntity = subscriptionTable.getSubscription(info.uid) - if (info is FeedInfo) { - subscriptionEntity.name = info.name - } else if (info is ChannelInfo) { - subscriptionEntity.setData( - info.name, - info.avatarUrl, - info.description, - info.subscriberCount - ) - } + subscriptionEntity.name = info.name + subscriptionEntity.avatarUrl = info.avatarUrl + + // these two fields are null if the feed info was fetched using the fast feed method + info.description?.let { subscriptionEntity.description = it } + info.subscriberCount?.let { subscriptionEntity.subscriberCount = it } subscriptionTable.update(subscriptionEntity) } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt index 19c581c08..41761fb01 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt @@ -55,10 +55,10 @@ class FeedGroupDialog : DialogFragment(), BackPressable { private var groupSortOrder: Long = -1 sealed class ScreenState : Serializable { - object InitialScreen : ScreenState() - object IconPickerScreen : ScreenState() - object SubscriptionsPickerScreen : ScreenState() - object DeleteScreen : ScreenState() + data object InitialScreen : ScreenState() + data object IconPickerScreen : ScreenState() + data object SubscriptionsPickerScreen : ScreenState() + data object DeleteScreen : ScreenState() } @State @JvmField var selectedIcon: FeedGroupIcon? = null @@ -370,7 +370,7 @@ class FeedGroupDialog : DialogFragment(), BackPressable { private fun setupIconPicker() { val groupAdapter = GroupieAdapter() - groupAdapter.addAll(FeedGroupIcon.values().map { PickerIconItem(it) }) + groupAdapter.addAll(FeedGroupIcon.entries.map { PickerIconItem(it) }) feedGroupCreateBinding.iconSelector.apply { layoutManager = GridLayoutManager(requireContext(), 7, RecyclerView.VERTICAL, false) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt index eff1a4400..292bda394 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt @@ -110,8 +110,8 @@ class FeedGroupDialogViewModel( } sealed class DialogEvent { - object ProcessingEvent : DialogEvent() - object SuccessEvent : DialogEvent() + data object ProcessingEvent : DialogEvent() + data object SuccessEvent : DialogEvent() } data class Filter(val query: String, val showOnlyUngrouped: Boolean) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt index bee2e910a..bc39dafe6 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt @@ -9,7 +9,7 @@ import org.schabi.newpipe.R import org.schabi.newpipe.extractor.channel.ChannelInfoItem import org.schabi.newpipe.util.Localization import org.schabi.newpipe.util.OnClickGesture -import org.schabi.newpipe.util.PicassoHelper +import org.schabi.newpipe.util.image.PicassoHelper class ChannelItem( private val infoItem: ChannelInfoItem, @@ -39,7 +39,7 @@ class ChannelItem( itemChannelDescriptionView.text = infoItem.description } - PicassoHelper.loadAvatar(infoItem.thumbnailUrl).into(itemThumbnailView) + PicassoHelper.loadAvatar(infoItem.thumbnails).into(itemThumbnailView) gesturesListener?.run { viewHolder.root.setOnClickListener { selected(infoItem) } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt index aadb2fc73..3a4c6e41b 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt @@ -10,7 +10,7 @@ import org.schabi.newpipe.database.subscription.SubscriptionEntity import org.schabi.newpipe.databinding.PickerSubscriptionItemBinding import org.schabi.newpipe.ktx.AnimationType import org.schabi.newpipe.ktx.animate -import org.schabi.newpipe.util.PicassoHelper +import org.schabi.newpipe.util.image.PicassoHelper data class PickerSubscriptionItem( val subscriptionEntity: SubscriptionEntity, diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsExportService.java b/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsExportService.java index d56d16f3c..54809068a 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsExportService.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsExportService.java @@ -25,6 +25,7 @@ import android.content.Intent; import android.net.Uri; import android.util.Log; +import androidx.core.content.IntentCompat; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import org.reactivestreams.Subscriber; @@ -65,7 +66,7 @@ public class SubscriptionsExportService extends BaseImportExportService { return START_NOT_STICKY; } - final Uri path = intent.getParcelableExtra(KEY_FILE_PATH); + final Uri path = IntentCompat.getParcelableExtra(intent, KEY_FILE_PATH, Uri.class); if (path == null) { stopAndReportError(new IllegalStateException( "Exporting to a file, but the path is null"), diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsImportService.java b/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsImportService.java index d624e1038..442c7fddb 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsImportService.java +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/services/SubscriptionsImportService.java @@ -30,6 +30,7 @@ import android.util.Pair; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.IntentCompat; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import org.reactivestreams.Subscriber; @@ -108,7 +109,7 @@ public class SubscriptionsImportService extends BaseImportExportService { if (currentMode == CHANNEL_URL_MODE) { channelUrl = intent.getStringExtra(KEY_VALUE); } else { - final Uri uri = intent.getParcelableExtra(KEY_VALUE); + final Uri uri = IntentCompat.getParcelableExtra(intent, KEY_VALUE, Uri.class); if (uri == null) { stopAndReportError(new IllegalStateException( "Importing from input stream, but file path is null"), diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index defc8ba21..c012f6008 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -619,11 +619,13 @@ public final class PlayQueueActivity extends AppCompatActivity final MenuItem audioTrackSelector = menu.findItem(R.id.action_audio_track); final List availableStreams = - Optional.ofNullable(player.getCurrentMetadata()) + Optional.ofNullable(player) + .map(Player::getCurrentMetadata) .flatMap(MediaItemTag::getMaybeAudioTrack) .map(MediaItemTag.AudioTrack::getAudioStreams) .orElse(null); - final Optional selectedAudioStream = player.getSelectedAudioStream(); + final Optional selectedAudioStream = Optional.ofNullable(player) + .flatMap(Player::getSelectedAudioStream); if (availableStreams == null || availableStreams.size() < 2 || selectedAudioStream.isEmpty()) { diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 1a323176c..49e72328e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -87,6 +87,7 @@ import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.extractor.stream.AudioStream; +import org.schabi.newpipe.extractor.Image; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; @@ -117,7 +118,7 @@ import org.schabi.newpipe.player.ui.VideoPlayerUi; import org.schabi.newpipe.util.DependentPreferenceHelper; import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.NavigationHelper; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.SerializedCache; import org.schabi.newpipe.util.StreamTypeUtil; @@ -805,10 +806,10 @@ public final class Player implements PlaybackListener, Listener { }; } - private void loadCurrentThumbnail(final String url) { + private void loadCurrentThumbnail(final List thumbnails) { if (DEBUG) { - Log.d(TAG, "Thumbnail - loadCurrentThumbnail() called with url = [" - + (url == null ? "null" : url) + "]"); + Log.d(TAG, "Thumbnail - loadCurrentThumbnail() called with thumbnails = [" + + thumbnails.size() + "]"); } // first cancel any previous loading @@ -817,12 +818,12 @@ public final class Player implements PlaybackListener, Listener { // Unset currentThumbnail, since it is now outdated. This ensures it is not used in media // session metadata while the new thumbnail is being loaded by Picasso. onThumbnailLoaded(null); - if (isNullOrEmpty(url)) { + if (thumbnails.isEmpty()) { return; } // scale down the notification thumbnail for performance - PicassoHelper.loadScaledDownThumbnail(context, url) + PicassoHelper.loadScaledDownThumbnail(context, thumbnails) .tag(PICASSO_PLAYER_THUMBNAIL_TAG) .into(currentThumbnailTarget); } @@ -1792,7 +1793,7 @@ public final class Player implements PlaybackListener, Listener { maybeAutoQueueNextStream(info); - loadCurrentThumbnail(info.getThumbnailUrl()); + loadCurrentThumbnail(info.getThumbnails()); registerStreamViewed(); notifyMetadataUpdateToListeners(); diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayerService.java b/app/src/main/java/org/schabi/newpipe/player/PlayerService.java index ad6c9405d..e7abf4320 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayerService.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayerService.java @@ -29,6 +29,7 @@ import android.os.IBinder; import android.util.Log; import org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi; +import org.schabi.newpipe.player.notification.NotificationPlayerUi; import org.schabi.newpipe.util.ThemeHelper; import java.lang.ref.WeakReference; @@ -59,6 +60,14 @@ public final class PlayerService extends Service { ThemeHelper.setTheme(this); player = new Player(this); + /* + Create the player notification and start immediately the service in foreground, + otherwise if nothing is played or initializing the player and its components (especially + loading stream metadata) takes a lot of time, the app would crash on Android 8+ as the + service would never be put in the foreground while we said to the system we would do so + */ + player.UIs().get(NotificationPlayerUi.class) + .ifPresent(NotificationPlayerUi::createNotificationAndStartForeground); } @Override @@ -68,16 +77,38 @@ public final class PlayerService extends Service { + "], flags = [" + flags + "], startId = [" + startId + "]"); } + /* + Be sure that the player notification is set and the service is started in foreground, + otherwise, the app may crash on Android 8+ as the service would never be put in the + foreground while we said to the system we would do so + The service is always requested to be started in foreground, so always creating a + notification if there is no one already and starting the service in foreground should + not create any issues + If the service is already started in foreground, requesting it to be started shouldn't + do anything + */ + if (player != null) { + player.UIs().get(NotificationPlayerUi.class) + .ifPresent(NotificationPlayerUi::createNotificationAndStartForeground); + } + if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()) - && player.getPlayQueue() == null) { - // No need to process media button's actions if the player is not working, otherwise the - // player service would strangely start with nothing to play + && (player == null || player.getPlayQueue() == null)) { + /* + No need to process media button's actions if the player is not working, otherwise + the player service would strangely start with nothing to play + Stop the service in this case, which will be removed from the foreground and its + notification cancelled in its destruction + */ + stopSelf(); return START_NOT_STICKY; } - player.handleIntent(intent); - player.UIs().get(MediaSessionPlayerUi.class) - .ifPresent(ui -> ui.handleMediaButtonIntent(intent)); + if (player != null) { + player.handleIntent(intent); + player.UIs().get(MediaSessionPlayerUi.class) + .ifPresent(ui -> ui.handleMediaButtonIntent(intent)); + } return START_NOT_STICKY; } @@ -87,7 +118,7 @@ public final class PlayerService extends Service { Log.d(TAG, "stopForImmediateReusing() called"); } - if (!player.exoPlayerIsNull()) { + if (player != null && !player.exoPlayerIsNull()) { // Releases wifi & cpu, disables keepScreenOn, etc. // We can't just pause the player here because it will make transition // from one stream to a new stream not smooth @@ -98,7 +129,7 @@ public final class PlayerService extends Service { @Override public void onTaskRemoved(final Intent rootIntent) { super.onTaskRemoved(rootIntent); - if (!player.videoPlayerSelected()) { + if (player != null && !player.videoPlayerSelected()) { return; } onDestroy(); diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt index 8acd70413..ff0bb269d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt @@ -160,13 +160,12 @@ class MainPlayerGestureListener( } override fun onScroll( - initialEvent: MotionEvent, + initialEvent: MotionEvent?, movingEvent: MotionEvent, distanceX: Float, distanceY: Float ): Boolean { - - if (!playerUi.isFullscreen) { + if (initialEvent == null || !playerUi.isFullscreen) { return false } diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt index 23edcaeb8..0b94bf364 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt @@ -167,7 +167,7 @@ class PopupPlayerGestureListener( } override fun onFling( - e1: MotionEvent, + e1: MotionEvent?, e2: MotionEvent, velocityX: Float, velocityY: Float @@ -218,11 +218,14 @@ class PopupPlayerGestureListener( } override fun onScroll( - initialEvent: MotionEvent, + initialEvent: MotionEvent?, movingEvent: MotionEvent, distanceX: Float, distanceY: Float ): Boolean { + if (initialEvent == null) { + return false + } if (isResizing) { return super.onScroll(initialEvent, movingEvent, distanceX, distanceY) diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/ExceptionTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/ExceptionTag.java index ebedf8c71..95a4f74af 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/ExceptionTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/ExceptionTag.java @@ -3,6 +3,7 @@ package org.schabi.newpipe.player.mediaitem; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.player.playqueue.PlayQueueItem; +import org.schabi.newpipe.util.image.ImageStrategy; import java.util.List; import java.util.Optional; @@ -74,7 +75,7 @@ public final class ExceptionTag implements MediaItemTag { @Override public String getThumbnailUrl() { - return item.getThumbnailUrl(); + return ImageStrategy.choosePreferredImage(item.getThumbnails()); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java index 1119fb903..346bb92fa 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java @@ -81,8 +81,9 @@ public interface MediaItemTag { @NonNull default MediaItem asMediaItem() { + final String thumbnailUrl = getThumbnailUrl(); final MediaMetadata mediaMetadata = new MediaMetadata.Builder() - .setArtworkUri(Uri.parse(getThumbnailUrl())) + .setArtworkUri(thumbnailUrl == null ? null : Uri.parse(thumbnailUrl)) .setArtist(getUploaderName()) .setDescription(getTitle()) .setDisplayTitle(getTitle()) diff --git a/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java b/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java index 689f5c72b..e24a93615 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java @@ -6,6 +6,7 @@ import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.stream.VideoStream; +import org.schabi.newpipe.util.image.ImageStrategy; import java.util.Collections; import java.util.List; @@ -95,7 +96,7 @@ public final class StreamInfoTag implements MediaItemTag { @Override public String getThumbnailUrl() { - return streamInfo.getThumbnailUrl(); + return ImageStrategy.choosePreferredImage(streamInfo.getThumbnails()); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java index 6f76a91d1..737ebc5dd 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java @@ -1,10 +1,12 @@ package org.schabi.newpipe.player.mediasession; import static org.schabi.newpipe.MainActivity.DEBUG; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_RECREATE_NOTIFICATION; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; +import android.os.Build; import android.support.v4.media.MediaMetadataCompat; import android.support.v4.media.session.MediaSessionCompat; import android.util.Log; @@ -14,15 +16,23 @@ import androidx.annotation.Nullable; import androidx.media.session.MediaButtonReceiver; import com.google.android.exoplayer2.ForwardingPlayer; +import com.google.android.exoplayer2.Player.RepeatMode; import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector; import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.player.Player; +import org.schabi.newpipe.player.notification.NotificationActionData; +import org.schabi.newpipe.player.notification.NotificationConstants; import org.schabi.newpipe.player.ui.PlayerUi; import org.schabi.newpipe.player.ui.VideoPlayerUi; import org.schabi.newpipe.util.StreamTypeUtil; +import java.util.List; +import java.util.Objects; import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class MediaSessionPlayerUi extends PlayerUi implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -34,6 +44,10 @@ public class MediaSessionPlayerUi extends PlayerUi private final String ignoreHardwareMediaButtonsKey; private boolean shouldIgnoreHardwareMediaButtons = false; + // used to check whether any notification action changed, before sending costly updates + private List prevNotificationActions = List.of(); + + public MediaSessionPlayerUi(@NonNull final Player player) { super(player); ignoreHardwareMediaButtonsKey = @@ -63,6 +77,10 @@ public class MediaSessionPlayerUi extends PlayerUi sessionConnector.setMetadataDeduplicationEnabled(true); sessionConnector.setMediaMetadataProvider(exoPlayer -> buildMediaMetadata()); + + // force updating media session actions by resetting the previous ones + prevNotificationActions = List.of(); + updateMediaSessionActions(); } @Override @@ -80,6 +98,7 @@ public class MediaSessionPlayerUi extends PlayerUi mediaSession.release(); mediaSession = null; } + prevNotificationActions = List.of(); } @Override @@ -163,4 +182,109 @@ public class MediaSessionPlayerUi extends PlayerUi return builder.build(); } + + + private void updateMediaSessionActions() { + // On Android 13+ (or Android T or API 33+) the actions in the player notification can't be + // controlled directly anymore, but are instead derived from custom media session actions. + // However the system allows customizing only two of these actions, since the other three + // are fixed to play-pause-buffering, previous, next. + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + // Although setting media session actions on older android versions doesn't seem to + // cause any trouble, it also doesn't seem to do anything, so we don't do anything to + // save battery. Check out NotificationUtil.updateActions() to see what happens on + // older android versions. + return; + } + + // only use the fourth and fifth actions (the settings page also shows only the last 2 on + // Android 13+) + final List newNotificationActions = IntStream.of(3, 4) + .map(i -> player.getPrefs().getInt( + player.getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]), + NotificationConstants.SLOT_DEFAULTS[i])) + .mapToObj(action -> NotificationActionData + .fromNotificationActionEnum(player, action)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // avoid costly notification actions update, if nothing changed from last time + if (!newNotificationActions.equals(prevNotificationActions)) { + prevNotificationActions = newNotificationActions; + sessionConnector.setCustomActionProviders( + newNotificationActions.stream() + .map(data -> new SessionConnectorActionProvider(data, context)) + .toArray(SessionConnectorActionProvider[]::new)); + } + } + + @Override + public void onBlocked() { + super.onBlocked(); + updateMediaSessionActions(); + } + + @Override + public void onPlaying() { + super.onPlaying(); + updateMediaSessionActions(); + } + + @Override + public void onBuffering() { + super.onBuffering(); + updateMediaSessionActions(); + } + + @Override + public void onPaused() { + super.onPaused(); + updateMediaSessionActions(); + } + + @Override + public void onPausedSeek() { + super.onPausedSeek(); + updateMediaSessionActions(); + } + + @Override + public void onCompleted() { + super.onCompleted(); + updateMediaSessionActions(); + } + + @Override + public void onRepeatModeChanged(@RepeatMode final int repeatMode) { + super.onRepeatModeChanged(repeatMode); + updateMediaSessionActions(); + } + + @Override + public void onShuffleModeEnabledChanged(final boolean shuffleModeEnabled) { + super.onShuffleModeEnabledChanged(shuffleModeEnabled); + updateMediaSessionActions(); + } + + @Override + public void onBroadcastReceived(final Intent intent) { + super.onBroadcastReceived(intent); + if (ACTION_RECREATE_NOTIFICATION.equals(intent.getAction())) { + // the notification actions changed + updateMediaSessionActions(); + } + } + + @Override + public void onMetadataChanged(@NonNull final StreamInfo info) { + super.onMetadataChanged(info); + updateMediaSessionActions(); + } + + @Override + public void onPlayQueueEdited() { + super.onPlayQueueEdited(); + updateMediaSessionActions(); + } } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java index 2e54b1129..3339869c1 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java @@ -20,6 +20,7 @@ import com.google.android.exoplayer2.util.Util; import org.schabi.newpipe.player.Player; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueueItem; +import org.schabi.newpipe.util.image.ImageStrategy; import java.util.ArrayList; import java.util.Collections; @@ -137,9 +138,12 @@ public class PlayQueueNavigator implements MediaSessionConnector.QueueNavigator .putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, player.getPlayQueue().size()); descBuilder.setExtras(additionalMetadata); - final Uri thumbnailUri = Uri.parse(item.getThumbnailUrl()); - if (thumbnailUri != null) { - descBuilder.setIconUri(thumbnailUri); + try { + descBuilder.setIconUri(Uri.parse( + ImageStrategy.choosePreferredImage(item.getThumbnails()))); + } catch (final Throwable e) { + // no thumbnail available at all, or the user disabled image loading, + // or the obtained url is not a valid `Uri` } return descBuilder.build(); diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasession/SessionConnectorActionProvider.java b/app/src/main/java/org/schabi/newpipe/player/mediasession/SessionConnectorActionProvider.java new file mode 100644 index 000000000..a5c9fccc9 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/mediasession/SessionConnectorActionProvider.java @@ -0,0 +1,47 @@ +package org.schabi.newpipe.player.mediasession; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.media.session.PlaybackStateCompat; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector; + +import org.schabi.newpipe.player.notification.NotificationActionData; + +import java.lang.ref.WeakReference; + +public class SessionConnectorActionProvider implements MediaSessionConnector.CustomActionProvider { + + private final NotificationActionData data; + @NonNull + private final WeakReference context; + + public SessionConnectorActionProvider(final NotificationActionData notificationActionData, + @NonNull final Context context) { + this.data = notificationActionData; + this.context = new WeakReference<>(context); + } + + @Override + public void onCustomAction(@NonNull final Player player, + @NonNull final String action, + @Nullable final Bundle extras) { + final Context actualContext = context.get(); + if (actualContext != null) { + actualContext.sendBroadcast(new Intent(action)); + } + } + + @Nullable + @Override + public PlaybackStateCompat.CustomAction getCustomAction(@NonNull final Player player) { + return new PlaybackStateCompat.CustomAction.Builder( + data.action(), data.name(), data.icon() + ).build(); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationActionData.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationActionData.java new file mode 100644 index 000000000..b3abcd0b5 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationActionData.java @@ -0,0 +1,187 @@ +package org.schabi.newpipe.player.notification; + +import static com.google.android.exoplayer2.Player.REPEAT_MODE_ALL; +import static com.google.android.exoplayer2.Player.REPEAT_MODE_ONE; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_CLOSE; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_FORWARD; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_REWIND; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_NEXT; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PAUSE; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PREVIOUS; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_REPEAT; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_SHUFFLE; + +import android.annotation.SuppressLint; +import android.content.Context; + +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.player.Player; + +import java.util.Objects; + +public final class NotificationActionData { + + @NonNull + private final String action; + @NonNull + private final String name; + @DrawableRes + private final int icon; + + + public NotificationActionData(@NonNull final String action, @NonNull final String name, + @DrawableRes final int icon) { + this.action = action; + this.name = name; + this.icon = icon; + } + + @NonNull + public String action() { + return action; + } + + @NonNull + public String name() { + return name; + } + + @DrawableRes + public int icon() { + return icon; + } + + + @SuppressLint("PrivateResource") // we currently use Exoplayer's internal strings and icons + @Nullable + public static NotificationActionData fromNotificationActionEnum( + @NonNull final Player player, + @NotificationConstants.Action final int selectedAction + ) { + + final int baseActionIcon = NotificationConstants.ACTION_ICONS[selectedAction]; + final Context ctx = player.getContext(); + + switch (selectedAction) { + case NotificationConstants.PREVIOUS: + return new NotificationActionData(ACTION_PLAY_PREVIOUS, + ctx.getString(R.string.exo_controls_previous_description), baseActionIcon); + + case NotificationConstants.NEXT: + return new NotificationActionData(ACTION_PLAY_NEXT, + ctx.getString(R.string.exo_controls_next_description), baseActionIcon); + + case NotificationConstants.REWIND: + return new NotificationActionData(ACTION_FAST_REWIND, + ctx.getString(R.string.exo_controls_rewind_description), baseActionIcon); + + case NotificationConstants.FORWARD: + return new NotificationActionData(ACTION_FAST_FORWARD, + ctx.getString(R.string.exo_controls_fastforward_description), + baseActionIcon); + + case NotificationConstants.SMART_REWIND_PREVIOUS: + if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { + return new NotificationActionData(ACTION_PLAY_PREVIOUS, + ctx.getString(R.string.exo_controls_previous_description), + R.drawable.exo_notification_previous); + } else { + return new NotificationActionData(ACTION_FAST_REWIND, + ctx.getString(R.string.exo_controls_rewind_description), + R.drawable.exo_controls_rewind); + } + + case NotificationConstants.SMART_FORWARD_NEXT: + if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { + return new NotificationActionData(ACTION_PLAY_NEXT, + ctx.getString(R.string.exo_controls_next_description), + R.drawable.exo_notification_next); + } else { + return new NotificationActionData(ACTION_FAST_FORWARD, + ctx.getString(R.string.exo_controls_fastforward_description), + R.drawable.exo_controls_fastforward); + } + + case NotificationConstants.PLAY_PAUSE_BUFFERING: + if (player.getCurrentState() == Player.STATE_PREFLIGHT + || player.getCurrentState() == Player.STATE_BLOCKED + || player.getCurrentState() == Player.STATE_BUFFERING) { + return new NotificationActionData(ACTION_PLAY_PAUSE, + ctx.getString(R.string.notification_action_buffering), + R.drawable.ic_hourglass_top); + } + + // fallthrough + case NotificationConstants.PLAY_PAUSE: + if (player.getCurrentState() == Player.STATE_COMPLETED) { + return new NotificationActionData(ACTION_PLAY_PAUSE, + ctx.getString(R.string.exo_controls_pause_description), + R.drawable.ic_replay); + } else if (player.isPlaying() + || player.getCurrentState() == Player.STATE_PREFLIGHT + || player.getCurrentState() == Player.STATE_BLOCKED + || player.getCurrentState() == Player.STATE_BUFFERING) { + return new NotificationActionData(ACTION_PLAY_PAUSE, + ctx.getString(R.string.exo_controls_pause_description), + R.drawable.exo_notification_pause); + } else { + return new NotificationActionData(ACTION_PLAY_PAUSE, + ctx.getString(R.string.exo_controls_play_description), + R.drawable.exo_notification_play); + } + + case NotificationConstants.REPEAT: + if (player.getRepeatMode() == REPEAT_MODE_ALL) { + return new NotificationActionData(ACTION_REPEAT, + ctx.getString(R.string.exo_controls_repeat_all_description), + R.drawable.exo_media_action_repeat_all); + } else if (player.getRepeatMode() == REPEAT_MODE_ONE) { + return new NotificationActionData(ACTION_REPEAT, + ctx.getString(R.string.exo_controls_repeat_one_description), + R.drawable.exo_media_action_repeat_one); + } else /* player.getRepeatMode() == REPEAT_MODE_OFF */ { + return new NotificationActionData(ACTION_REPEAT, + ctx.getString(R.string.exo_controls_repeat_off_description), + R.drawable.exo_media_action_repeat_off); + } + + case NotificationConstants.SHUFFLE: + if (player.getPlayQueue() != null && player.getPlayQueue().isShuffled()) { + return new NotificationActionData(ACTION_SHUFFLE, + ctx.getString(R.string.exo_controls_shuffle_on_description), + R.drawable.exo_controls_shuffle_on); + } else { + return new NotificationActionData(ACTION_SHUFFLE, + ctx.getString(R.string.exo_controls_shuffle_off_description), + R.drawable.exo_controls_shuffle_off); + } + + case NotificationConstants.CLOSE: + return new NotificationActionData(ACTION_CLOSE, ctx.getString(R.string.close), + R.drawable.ic_close); + + case NotificationConstants.NOTHING: + default: + // do nothing + return null; + } + } + + + @Override + public boolean equals(@Nullable final Object obj) { + return (obj instanceof NotificationActionData other) + && this.action.equals(other.action) + && this.name.equals(other.name) + && this.icon == other.icon; + } + + @Override + public int hashCode() { + return Objects.hash(action, name, icon); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java index 89bf0b22a..b9607f7ea 100644 --- a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java @@ -13,7 +13,7 @@ import org.schabi.newpipe.util.Localization; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; @@ -65,10 +65,16 @@ public final class NotificationConstants { public static final int CLOSE = 11; @Retention(RetentionPolicy.SOURCE) - @IntDef({NOTHING, PREVIOUS, NEXT, REWIND, FORWARD, SMART_REWIND_PREVIOUS, SMART_FORWARD_NEXT, - PLAY_PAUSE, PLAY_PAUSE_BUFFERING, REPEAT, SHUFFLE, CLOSE}) + @IntDef({NOTHING, PREVIOUS, NEXT, REWIND, FORWARD, + SMART_REWIND_PREVIOUS, SMART_FORWARD_NEXT, PLAY_PAUSE, PLAY_PAUSE_BUFFERING, REPEAT, + SHUFFLE, CLOSE}) public @interface Action { } + @Action + public static final int[] ALL_ACTIONS = {NOTHING, PREVIOUS, NEXT, REWIND, FORWARD, + SMART_REWIND_PREVIOUS, SMART_FORWARD_NEXT, PLAY_PAUSE, PLAY_PAUSE_BUFFERING, REPEAT, + SHUFFLE, CLOSE}; + @DrawableRes public static final int[] ACTION_ICONS = { 0, @@ -95,16 +101,6 @@ public final class NotificationConstants { CLOSE, }; - @Action - public static final int[][] SLOT_ALLOWED_ACTIONS = { - new int[] {PREVIOUS, REWIND, SMART_REWIND_PREVIOUS}, - new int[] {REWIND, PLAY_PAUSE, PLAY_PAUSE_BUFFERING}, - new int[] {NEXT, FORWARD, SMART_FORWARD_NEXT, PLAY_PAUSE, PLAY_PAUSE_BUFFERING}, - new int[] {NOTHING, PREVIOUS, NEXT, REWIND, FORWARD, SMART_REWIND_PREVIOUS, - SMART_FORWARD_NEXT, REPEAT, SHUFFLE, CLOSE}, - new int[] {NOTHING, NEXT, FORWARD, SMART_FORWARD_NEXT, REPEAT, SHUFFLE, CLOSE}, - }; - public static final int[] SLOT_PREF_KEYS = { R.string.notification_slot_0_key, R.string.notification_slot_1_key, @@ -165,14 +161,11 @@ public final class NotificationConstants { /** * @param context the context to use * @param sharedPreferences the shared preferences to query values from - * @param slotCount remove indices >= than this value (set to {@code 5} to do nothing, or make - * it lower if there are slots with empty actions) * @return a sorted list of the indices of the slots to use as compact slots */ - public static List getCompactSlotsFromPreferences( + public static Collection getCompactSlotsFromPreferences( @NonNull final Context context, - final SharedPreferences sharedPreferences, - final int slotCount) { + final SharedPreferences sharedPreferences) { final SortedSet compactSlots = new TreeSet<>(); for (int i = 0; i < 3; i++) { final int compactSlot = sharedPreferences.getInt( @@ -180,14 +173,14 @@ public final class NotificationConstants { if (compactSlot == Integer.MAX_VALUE) { // settings not yet populated, return default values - return new ArrayList<>(SLOT_COMPACT_DEFAULTS); + return SLOT_COMPACT_DEFAULTS; } - // a negative value (-1) is set when the user does not want a particular compact slot - if (compactSlot >= 0 && compactSlot < slotCount) { + if (compactSlot >= 0) { + // compact slot is < 0 if there are less than 3 checked checkboxes compactSlots.add(compactSlot); } } - return new ArrayList<>(compactSlots); + return compactSlots; } } diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationPlayerUi.java index 4b1fc417f..75b27545c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationPlayerUi.java @@ -17,7 +17,6 @@ import org.schabi.newpipe.player.helper.PlayerHelper; import org.schabi.newpipe.player.ui.PlayerUi; public final class NotificationPlayerUi extends PlayerUi { - private boolean foregroundNotificationAlreadyCreated = false; private final NotificationUtil notificationUtil; public NotificationPlayerUi(@NonNull final Player player) { @@ -25,15 +24,6 @@ public final class NotificationPlayerUi extends PlayerUi { notificationUtil = new NotificationUtil(player); } - @Override - public void initPlayer() { - super.initPlayer(); - if (!foregroundNotificationAlreadyCreated) { - notificationUtil.createNotificationAndStartForeground(); - foregroundNotificationAlreadyCreated = true; - } - } - @Override public void destroy() { super.destroy(); @@ -122,4 +112,8 @@ public final class NotificationPlayerUi extends PlayerUi { super.onPlayQueueEdited(); notificationUtil.createNotificationIfNeededAndUpdate(false); } + + public void createNotificationAndStartForeground() { + notificationUtil.createNotificationAndStartForeground(); + } } diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java index 05c2e3af6..30420b0c7 100644 --- a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java @@ -1,16 +1,19 @@ package org.schabi.newpipe.player.notification; +import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; +import static androidx.media.app.NotificationCompat.MediaStyle; +import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_CLOSE; + import android.annotation.SuppressLint; +import android.app.PendingIntent; import android.content.Intent; import android.content.pm.ServiceInfo; import android.graphics.Bitmap; import android.os.Build; import android.util.Log; -import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.app.PendingIntentCompat; @@ -23,23 +26,12 @@ import org.schabi.newpipe.player.Player; import org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi; import org.schabi.newpipe.util.NavigationHelper; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.Optional; -import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; -import static androidx.media.app.NotificationCompat.MediaStyle; -import static com.google.android.exoplayer2.Player.REPEAT_MODE_ALL; -import static com.google.android.exoplayer2.Player.REPEAT_MODE_ONE; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_CLOSE; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_FORWARD; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_REWIND; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_NEXT; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PAUSE; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PREVIOUS; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_REPEAT; -import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_SHUFFLE; - /** * This is a utility class for player notifications. */ @@ -100,29 +92,21 @@ public final class NotificationUtil { final NotificationCompat.Builder builder = new NotificationCompat.Builder(player.getContext(), player.getContext().getString(R.string.notification_channel_id)); + final MediaStyle mediaStyle = new MediaStyle(); - initializeNotificationSlots(); - - // count the number of real slots, to make sure compact slots indices are not out of bound - int nonNothingSlotCount = 5; - if (notificationSlots[3] == NotificationConstants.NOTHING) { - --nonNothingSlotCount; + // setup media style (compact notification slots and media session) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + // notification actions are ignored on Android 13+, and are replaced by code in + // MediaSessionPlayerUi + final int[] compactSlots = initializeNotificationSlots(); + mediaStyle.setShowActionsInCompactView(compactSlots); } - if (notificationSlots[4] == NotificationConstants.NOTHING) { - --nonNothingSlotCount; - } - - // build the compact slot indices array (need code to convert from Integer... because Java) - final List compactSlotList = NotificationConstants.getCompactSlotsFromPreferences( - player.getContext(), player.getPrefs(), nonNothingSlotCount); - final int[] compactSlots = compactSlotList.stream().mapToInt(Integer::intValue).toArray(); - - final MediaStyle mediaStyle = new MediaStyle().setShowActionsInCompactView(compactSlots); player.UIs() .get(MediaSessionPlayerUi.class) .flatMap(MediaSessionPlayerUi::getSessionToken) .ifPresent(mediaStyle::setMediaSession); + // setup notification builder builder.setStyle(mediaStyle) .setPriority(NotificationCompat.PRIORITY_HIGH) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) @@ -157,7 +141,11 @@ public final class NotificationUtil { notificationBuilder.setContentText(player.getUploaderName()); notificationBuilder.setTicker(player.getVideoTitle()); - updateActions(notificationBuilder); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + // notification actions are ignored on Android 13+, and are replaced by code in + // MediaSessionPlayerUi + updateActions(notificationBuilder); + } } @@ -209,12 +197,35 @@ public final class NotificationUtil { // ACTIONS ///////////////////////////////////////////////////// - private void initializeNotificationSlots() { + /** + * The compact slots array from settings contains indices from 0 to 4, each referring to one of + * the five actions configurable by the user. However, if the user sets an action to "Nothing", + * then all of the actions coming after will have a "settings index" different than the index + * of the corresponding action when sent to the system. + * + * @return the indices of compact slots referred to the list of non-nothing actions that will be + * sent to the system + */ + private int[] initializeNotificationSlots() { + final Collection settingsCompactSlots = NotificationConstants + .getCompactSlotsFromPreferences(player.getContext(), player.getPrefs()); + final List adjustedCompactSlots = new ArrayList<>(); + + int nonNothingIndex = 0; for (int i = 0; i < 5; ++i) { notificationSlots[i] = player.getPrefs().getInt( player.getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]), NotificationConstants.SLOT_DEFAULTS[i]); + + if (notificationSlots[i] != NotificationConstants.NOTHING) { + if (settingsCompactSlots.contains(i)) { + adjustedCompactSlots.add(nonNothingIndex); + } + nonNothingIndex += 1; + } } + + return adjustedCompactSlots.stream().mapToInt(Integer::intValue).toArray(); } @SuppressLint("RestrictedApi") @@ -227,115 +238,15 @@ public final class NotificationUtil { private void addAction(final NotificationCompat.Builder builder, @NotificationConstants.Action final int slot) { - final NotificationCompat.Action action = getAction(slot); - if (action != null) { - builder.addAction(action); + @Nullable final NotificationActionData data = + NotificationActionData.fromNotificationActionEnum(player, slot); + if (data == null) { + return; } - } - @Nullable - private NotificationCompat.Action getAction( - @NotificationConstants.Action final int selectedAction) { - final int baseActionIcon = NotificationConstants.ACTION_ICONS[selectedAction]; - switch (selectedAction) { - case NotificationConstants.PREVIOUS: - return getAction(baseActionIcon, - R.string.exo_controls_previous_description, ACTION_PLAY_PREVIOUS); - - case NotificationConstants.NEXT: - return getAction(baseActionIcon, - R.string.exo_controls_next_description, ACTION_PLAY_NEXT); - - case NotificationConstants.REWIND: - return getAction(baseActionIcon, - R.string.exo_controls_rewind_description, ACTION_FAST_REWIND); - - case NotificationConstants.FORWARD: - return getAction(baseActionIcon, - R.string.exo_controls_fastforward_description, ACTION_FAST_FORWARD); - - case NotificationConstants.SMART_REWIND_PREVIOUS: - if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { - return getAction(R.drawable.exo_notification_previous, - R.string.exo_controls_previous_description, ACTION_PLAY_PREVIOUS); - } else { - return getAction(R.drawable.exo_controls_rewind, - R.string.exo_controls_rewind_description, ACTION_FAST_REWIND); - } - - case NotificationConstants.SMART_FORWARD_NEXT: - if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { - return getAction(R.drawable.exo_notification_next, - R.string.exo_controls_next_description, ACTION_PLAY_NEXT); - } else { - return getAction(R.drawable.exo_controls_fastforward, - R.string.exo_controls_fastforward_description, ACTION_FAST_FORWARD); - } - - case NotificationConstants.PLAY_PAUSE_BUFFERING: - if (player.getCurrentState() == Player.STATE_PREFLIGHT - || player.getCurrentState() == Player.STATE_BLOCKED - || player.getCurrentState() == Player.STATE_BUFFERING) { - // null intent -> show hourglass icon that does nothing when clicked - return new NotificationCompat.Action(R.drawable.ic_hourglass_top, - player.getContext().getString(R.string.notification_action_buffering), - null); - } - - // fallthrough - case NotificationConstants.PLAY_PAUSE: - if (player.getCurrentState() == Player.STATE_COMPLETED) { - return getAction(R.drawable.ic_replay, - R.string.exo_controls_pause_description, ACTION_PLAY_PAUSE); - } else if (player.isPlaying() - || player.getCurrentState() == Player.STATE_PREFLIGHT - || player.getCurrentState() == Player.STATE_BLOCKED - || player.getCurrentState() == Player.STATE_BUFFERING) { - return getAction(R.drawable.exo_notification_pause, - R.string.exo_controls_pause_description, ACTION_PLAY_PAUSE); - } else { - return getAction(R.drawable.exo_notification_play, - R.string.exo_controls_play_description, ACTION_PLAY_PAUSE); - } - - case NotificationConstants.REPEAT: - if (player.getRepeatMode() == REPEAT_MODE_ALL) { - return getAction(R.drawable.exo_media_action_repeat_all, - R.string.exo_controls_repeat_all_description, ACTION_REPEAT); - } else if (player.getRepeatMode() == REPEAT_MODE_ONE) { - return getAction(R.drawable.exo_media_action_repeat_one, - R.string.exo_controls_repeat_one_description, ACTION_REPEAT); - } else /* player.getRepeatMode() == REPEAT_MODE_OFF */ { - return getAction(R.drawable.exo_media_action_repeat_off, - R.string.exo_controls_repeat_off_description, ACTION_REPEAT); - } - - case NotificationConstants.SHUFFLE: - if (player.getPlayQueue() != null && player.getPlayQueue().isShuffled()) { - return getAction(R.drawable.exo_controls_shuffle_on, - R.string.exo_controls_shuffle_on_description, ACTION_SHUFFLE); - } else { - return getAction(R.drawable.exo_controls_shuffle_off, - R.string.exo_controls_shuffle_off_description, ACTION_SHUFFLE); - } - - case NotificationConstants.CLOSE: - return getAction(R.drawable.ic_close, - R.string.close, ACTION_CLOSE); - - case NotificationConstants.NOTHING: - default: - // do nothing - return null; - } - } - - private NotificationCompat.Action getAction(@DrawableRes final int drawable, - @StringRes final int title, - final String intentAction) { - return new NotificationCompat.Action(drawable, player.getContext().getString(title), - PendingIntentCompat.getBroadcast(player.getContext(), NOTIFICATION_ID, - new Intent(intentAction), FLAG_UPDATE_CURRENT, false)); + final PendingIntent intent = PendingIntentCompat.getBroadcast(player.getContext(), + NOTIFICATION_ID, new Intent(data.action()), FLAG_UPDATE_CURRENT, false); + builder.addAction(new NotificationCompat.Action(data.icon(), data.name(), intent)); } private Intent getIntentForNotification() { @@ -364,7 +275,7 @@ public final class NotificationUtil { final Bitmap thumbnail = player.getThumbnail(); if (thumbnail == null || !showThumbnail) { // since the builder is reused, make sure the thumbnail is unset if there is not one - builder.setLargeIcon(null); + builder.setLargeIcon((Bitmap) null); return; } diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java index bf31ea9b1..759c51267 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java @@ -3,12 +3,14 @@ package org.schabi.newpipe.player.playqueue; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.schabi.newpipe.extractor.Image; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.util.ExtractorHelper; import java.io.Serializable; +import java.util.List; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.schedulers.Schedulers; @@ -24,7 +26,7 @@ public class PlayQueueItem implements Serializable { private final int serviceId; private final long duration; @NonNull - private final String thumbnailUrl; + private final List thumbnails; @NonNull private final String uploader; private final String uploaderUrl; @@ -38,7 +40,7 @@ public class PlayQueueItem implements Serializable { PlayQueueItem(@NonNull final StreamInfo info) { this(info.getName(), info.getUrl(), info.getServiceId(), info.getDuration(), - info.getThumbnailUrl(), info.getUploaderName(), + info.getThumbnails(), info.getUploaderName(), info.getUploaderUrl(), info.getStreamType()); if (info.getStartPosition() > 0) { @@ -48,20 +50,20 @@ public class PlayQueueItem implements Serializable { PlayQueueItem(@NonNull final StreamInfoItem item) { this(item.getName(), item.getUrl(), item.getServiceId(), item.getDuration(), - item.getThumbnailUrl(), item.getUploaderName(), + item.getThumbnails(), item.getUploaderName(), item.getUploaderUrl(), item.getStreamType()); } @SuppressWarnings("ParameterNumber") private PlayQueueItem(@Nullable final String name, @Nullable final String url, final int serviceId, final long duration, - @Nullable final String thumbnailUrl, @Nullable final String uploader, + final List thumbnails, @Nullable final String uploader, final String uploaderUrl, @NonNull final StreamType streamType) { this.title = name != null ? name : EMPTY_STRING; this.url = url != null ? url : EMPTY_STRING; this.serviceId = serviceId; this.duration = duration; - this.thumbnailUrl = thumbnailUrl != null ? thumbnailUrl : EMPTY_STRING; + this.thumbnails = thumbnails; this.uploader = uploader != null ? uploader : EMPTY_STRING; this.uploaderUrl = uploaderUrl; this.streamType = streamType; @@ -88,8 +90,8 @@ public class PlayQueueItem implements Serializable { } @NonNull - public String getThumbnailUrl() { - return thumbnailUrl; + public List getThumbnails() { + return thumbnails; } @NonNull diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java index e7aeb9638..066f92c26 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java @@ -6,7 +6,7 @@ import android.view.MotionEvent; import android.view.View; import org.schabi.newpipe.util.Localization; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ServiceHelper; public class PlayQueueItemBuilder { @@ -33,7 +33,7 @@ public class PlayQueueItemBuilder { holder.itemDurationView.setVisibility(View.GONE); } - PicassoHelper.loadThumbnail(item.getThumbnailUrl()).into(holder.itemThumbnailView); + PicassoHelper.loadThumbnail(item.getThumbnails()).into(holder.itemThumbnailView); holder.itemRoot.setOnClickListener(view -> { if (onItemClickListener != null) { diff --git a/app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHolder.java b/app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHolder.java index 50ffa2f2a..26065de15 100644 --- a/app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHolder.java +++ b/app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHolder.java @@ -14,7 +14,7 @@ import androidx.collection.SparseArrayCompat; import com.google.common.base.Stopwatch; import org.schabi.newpipe.extractor.stream.Frameset; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import java.util.Comparator; import java.util.List; diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java index 92e38a6a2..03f90a344 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java @@ -740,7 +740,7 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh String videoUrl = player.getVideoUrl(); videoUrl += ("&t=" + seconds); ShareUtils.shareText(context, currentItem.getTitle(), - videoUrl, currentItem.getThumbnailUrl()); + videoUrl, currentItem.getThumbnails()); } } }; diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 119c43b95..b51aaa638 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -226,7 +226,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa final PlayQueueItem currentItem = player.getCurrentItem(); if (currentItem != null) { ShareUtils.shareText(context, currentItem.getTitle(), - player.getVideoUrlAtCurrentTime(), currentItem.getThumbnailUrl()); + player.getVideoUrlAtCurrentTime(), currentItem.getThumbnails()); } })); binding.share.setOnLongClickListener(v -> { diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index ec3b1b2d7..ec2bed67a 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -12,7 +12,9 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.localization.ContentCountry; import org.schabi.newpipe.extractor.localization.Localization; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.ImageStrategy; +import org.schabi.newpipe.util.image.PicassoHelper; +import org.schabi.newpipe.util.image.PreferredImageQuality; import java.io.IOException; @@ -35,9 +37,11 @@ public class ContentSettingsFragment extends BasePreferenceFragment { .getPreferredContentCountry(requireContext()); initialLanguage = defaultPreferences.getString(getString(R.string.app_language_key), "en"); - findPreference(getString(R.string.download_thumbnail_key)).setOnPreferenceChangeListener( + final Preference imageQualityPreference = requirePreference(R.string.image_quality_key); + imageQualityPreference.setOnPreferenceChangeListener( (preference, newValue) -> { - PicassoHelper.setShouldLoadImages((Boolean) newValue); + ImageStrategy.setPreferredImageQuality(PreferredImageQuality + .fromPreferenceKey(requireContext(), (String) newValue)); try { PicassoHelper.clearCache(preference.getContext()); Toast.makeText(preference.getContext(), diff --git a/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java index 0f4c9765e..d78ade49d 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java @@ -10,7 +10,7 @@ import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.local.feed.notifications.NotificationWorker; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import java.util.Optional; diff --git a/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java index 3776d78f6..32e33d55b 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java @@ -23,7 +23,7 @@ public class MainSettingsFragment extends BasePreferenceFragment { setHasOptionsMenu(true); // Otherwise onCreateOptionsMenu is not called // Check if the app is updatable - if (!ReleaseVersionUtil.isReleaseApk()) { + if (!ReleaseVersionUtil.INSTANCE.isReleaseApk()) { getPreferenceScreen().removePreference( findPreference(getString(R.string.update_pref_screen_key))); diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java index 0f25be630..37335421d 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java @@ -19,7 +19,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.database.subscription.SubscriptionEntity; import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.local.subscription.SubscriptionManager; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import org.schabi.newpipe.util.ThemeHelper; import java.util.List; diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java index e8491d52c..147d20a36 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java @@ -25,7 +25,7 @@ import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.local.playlist.LocalPlaylistManager; import org.schabi.newpipe.local.playlist.RemotePlaylistManager; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.util.image.PicassoHelper; import java.util.List; import java.util.Vector; diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java index 215caaa38..b7bafde75 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -128,6 +128,20 @@ public final class SettingMigrations { } }; + public static final Migration MIGRATION_5_6 = new Migration(5, 6) { + @Override + protected void migrate(@NonNull final Context context) { + final boolean loadImages = sp.getBoolean("download_thumbnail_key", true); + + sp.edit() + .putString(context.getString(R.string.image_quality_key), + context.getString(loadImages + ? R.string.image_quality_default + : R.string.image_quality_none_key)) + .apply(); + } + }; + /** * List of all implemented migrations. *

@@ -140,12 +154,13 @@ public final class SettingMigrations { MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5, + MIGRATION_5_6, }; /** * Version number for preferences. Must be incremented every time a migration is necessary. */ - private static final int VERSION = 5; + private static final int VERSION = 6; public static void runMigrationsIfNeeded(@NonNull final Context context, diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java index 3ee6668bf..529e53442 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java @@ -266,7 +266,7 @@ public class SettingsActivity extends AppCompatActivity implements */ private void ensureSearchRepresentsApplicationState() { // Check if the update settings are available - if (!ReleaseVersionUtil.isReleaseApk()) { + if (!ReleaseVersionUtil.INSTANCE.isReleaseApk()) { SettingsResourceRegistry.getInstance() .getEntryByPreferencesResId(R.xml.update_settings) .setSearchable(false); diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index aae9cfca5..a1f563724 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -13,6 +13,7 @@ import androidx.preference.ListPreference; import com.google.android.material.snackbar.Snackbar; import org.schabi.newpipe.R; +import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.PermissionHelper; import java.util.LinkedList; @@ -26,7 +27,7 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { addPreferencesFromResourceRegistry(); updateSeekOptions(); - + updateResolutionOptions(); listener = (sharedPreferences, key) -> { // on M and above, if user chooses to minimise to popup player on exit @@ -48,10 +49,84 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { } } else if (getString(R.string.use_inexact_seek_key).equals(key)) { updateSeekOptions(); + } else if (getString(R.string.show_higher_resolutions_key).equals(key)) { + updateResolutionOptions(); } }; } + /** + * Update default resolution, default popup resolution & mobile data resolution options. + *
+ * Show high resolutions when "Show higher resolution" option is enabled. + * Set default resolution to "best resolution" when "Show higher resolution" option + * is disabled. + */ + private void updateResolutionOptions() { + final Resources resources = getResources(); + final boolean showHigherResolutions = getPreferenceManager().getSharedPreferences() + .getBoolean(resources.getString(R.string.show_higher_resolutions_key), false); + + // get sorted resolution lists + final List resolutionListDescriptions = ListHelper.getSortedResolutionList( + resources, + R.array.resolution_list_description, + R.array.high_resolution_list_descriptions, + showHigherResolutions); + final List resolutionListValues = ListHelper.getSortedResolutionList( + resources, + R.array.resolution_list_values, + R.array.high_resolution_list_values, + showHigherResolutions); + final List limitDataUsageResolutionValues = ListHelper.getSortedResolutionList( + resources, + R.array.limit_data_usage_values_list, + R.array.high_resolution_limit_data_usage_values_list, + showHigherResolutions); + final List limitDataUsageResolutionDescriptions = ListHelper + .getSortedResolutionList(resources, + R.array.limit_data_usage_description_list, + R.array.high_resolution_list_descriptions, + showHigherResolutions); + + // get resolution preferences + final ListPreference defaultResolution = findPreference( + getString(R.string.default_resolution_key)); + final ListPreference defaultPopupResolution = findPreference( + getString(R.string.default_popup_resolution_key)); + final ListPreference mobileDataResolution = findPreference( + getString(R.string.limit_mobile_data_usage_key)); + + // update resolution preferences with new resolutions, entries & values for each + defaultResolution.setEntries(resolutionListDescriptions.toArray(new String[0])); + defaultResolution.setEntryValues(resolutionListValues.toArray(new String[0])); + defaultPopupResolution.setEntries(resolutionListDescriptions.toArray(new String[0])); + defaultPopupResolution.setEntryValues(resolutionListValues.toArray(new String[0])); + mobileDataResolution.setEntries( + limitDataUsageResolutionDescriptions.toArray(new String[0])); + mobileDataResolution.setEntryValues(limitDataUsageResolutionValues.toArray(new String[0])); + + // if "Show higher resolution" option is disabled, + // set default resolution to "best resolution" + if (!showHigherResolutions) { + if (ListHelper.isHighResolutionSelected(defaultResolution.getValue(), + R.array.high_resolution_list_values, + resources)) { + defaultResolution.setValueIndex(0); + } + if (ListHelper.isHighResolutionSelected(defaultPopupResolution.getValue(), + R.array.high_resolution_list_values, + resources)) { + defaultPopupResolution.setValueIndex(0); + } + if (ListHelper.isHighResolutionSelected(mobileDataResolution.getValue(), + R.array.high_resolution_limit_data_usage_values_list, + resources)) { + mobileDataResolution.setValueIndex(0); + } + } + } + /** * Update fast-forward/-rewind seek duration options * according to language and inexact seek setting. diff --git a/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java b/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java index 3e92f297e..7dfddef20 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java +++ b/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java @@ -5,35 +5,22 @@ import static org.schabi.newpipe.player.notification.NotificationConstants.ACTIO import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.content.res.ColorStateList; +import android.os.Build; import android.util.AttributeSet; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.RadioButton; -import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.content.res.AppCompatResources; -import androidx.core.widget.TextViewCompat; import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; import org.schabi.newpipe.App; import org.schabi.newpipe.R; -import org.schabi.newpipe.databinding.ListRadioIconItemBinding; -import org.schabi.newpipe.databinding.SingleChoiceDialogViewBinding; import org.schabi.newpipe.player.notification.NotificationConstants; -import org.schabi.newpipe.util.DeviceUtils; -import org.schabi.newpipe.util.ThemeHelper; -import org.schabi.newpipe.views.FocusOverlayView; +import java.util.ArrayList; import java.util.List; import java.util.stream.IntStream; @@ -45,8 +32,9 @@ public class NotificationActionsPreference extends Preference { } - @Nullable private NotificationSlot[] notificationSlots = null; - @Nullable private List compactSlots = null; + private NotificationSlot[] notificationSlots; + private List compactSlots; + //////////////////////////////////////////////////////////////////////////// // Lifecycle @@ -56,6 +44,11 @@ public class NotificationActionsPreference extends Preference { public void onBindViewHolder(@NonNull final PreferenceViewHolder holder) { super.onBindViewHolder(holder); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + ((TextView) holder.itemView.findViewById(R.id.summary)) + .setText(R.string.notification_actions_summary_android13); + } + holder.itemView.setClickable(false); setupActions(holder.itemView); } @@ -75,13 +68,29 @@ public class NotificationActionsPreference extends Preference { //////////////////////////////////////////////////////////////////////////// private void setupActions(@NonNull final View view) { - compactSlots = NotificationConstants.getCompactSlotsFromPreferences(getContext(), - getSharedPreferences(), 5); + compactSlots = new ArrayList<>(NotificationConstants.getCompactSlotsFromPreferences( + getContext(), getSharedPreferences())); notificationSlots = IntStream.range(0, 5) - .mapToObj(i -> new NotificationSlot(i, view)) + .mapToObj(i -> new NotificationSlot(getContext(), getSharedPreferences(), i, view, + compactSlots.contains(i), this::onToggleCompactSlot)) .toArray(NotificationSlot[]::new); } + private void onToggleCompactSlot(final int i, final CheckBox checkBox) { + if (checkBox.isChecked()) { + compactSlots.remove((Integer) i); + } else if (compactSlots.size() < 3) { + compactSlots.add(i); + } else { + Toast.makeText(getContext(), + R.string.notification_actions_at_most_three, + Toast.LENGTH_SHORT).show(); + return; + } + + checkBox.toggle(); + } + //////////////////////////////////////////////////////////////////////////// // Saving @@ -99,143 +108,10 @@ public class NotificationActionsPreference extends Preference { for (int i = 0; i < 5; i++) { editor.putInt(getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]), - notificationSlots[i].selectedAction); + notificationSlots[i].getSelectedAction()); } editor.apply(); } } - - - //////////////////////////////////////////////////////////////////////////// - // Notification action - //////////////////////////////////////////////////////////////////////////// - - private static final int[] SLOT_ITEMS = { - R.id.notificationAction0, - R.id.notificationAction1, - R.id.notificationAction2, - R.id.notificationAction3, - R.id.notificationAction4, - }; - - private static final int[] SLOT_TITLES = { - R.string.notification_action_0_title, - R.string.notification_action_1_title, - R.string.notification_action_2_title, - R.string.notification_action_3_title, - R.string.notification_action_4_title, - }; - - private class NotificationSlot { - - final int i; - @NotificationConstants.Action int selectedAction; - - ImageView icon; - TextView summary; - - NotificationSlot(final int actionIndex, final View parentView) { - this.i = actionIndex; - - final View view = parentView.findViewById(SLOT_ITEMS[i]); - setupSelectedAction(view); - setupTitle(view); - setupCheckbox(view); - } - - void setupTitle(final View view) { - ((TextView) view.findViewById(R.id.notificationActionTitle)) - .setText(SLOT_TITLES[i]); - view.findViewById(R.id.notificationActionClickableArea).setOnClickListener( - v -> openActionChooserDialog()); - } - - void setupCheckbox(final View view) { - final CheckBox compactSlotCheckBox = view.findViewById(R.id.notificationActionCheckBox); - compactSlotCheckBox.setChecked(compactSlots.contains(i)); - view.findViewById(R.id.notificationActionCheckBoxClickableArea).setOnClickListener( - v -> { - if (compactSlotCheckBox.isChecked()) { - compactSlots.remove((Integer) i); - } else if (compactSlots.size() < 3) { - compactSlots.add(i); - } else { - Toast.makeText(getContext(), - R.string.notification_actions_at_most_three, - Toast.LENGTH_SHORT).show(); - return; - } - - compactSlotCheckBox.toggle(); - }); - } - - void setupSelectedAction(final View view) { - icon = view.findViewById(R.id.notificationActionIcon); - summary = view.findViewById(R.id.notificationActionSummary); - selectedAction = getSharedPreferences().getInt( - getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]), - NotificationConstants.SLOT_DEFAULTS[i]); - updateInfo(); - } - - void updateInfo() { - if (NotificationConstants.ACTION_ICONS[selectedAction] == 0) { - icon.setImageDrawable(null); - } else { - icon.setImageDrawable(AppCompatResources.getDrawable(getContext(), - NotificationConstants.ACTION_ICONS[selectedAction])); - } - - summary.setText(NotificationConstants.getActionName(getContext(), selectedAction)); - } - - void openActionChooserDialog() { - final LayoutInflater inflater = LayoutInflater.from(getContext()); - final SingleChoiceDialogViewBinding binding = - SingleChoiceDialogViewBinding.inflate(inflater); - - final AlertDialog alertDialog = new AlertDialog.Builder(getContext()) - .setTitle(SLOT_TITLES[i]) - .setView(binding.getRoot()) - .setCancelable(true) - .create(); - - final View.OnClickListener radioButtonsClickListener = v -> { - selectedAction = NotificationConstants.SLOT_ALLOWED_ACTIONS[i][v.getId()]; - updateInfo(); - alertDialog.dismiss(); - }; - - for (int id = 0; id < NotificationConstants.SLOT_ALLOWED_ACTIONS[i].length; ++id) { - final int action = NotificationConstants.SLOT_ALLOWED_ACTIONS[i][id]; - final RadioButton radioButton = ListRadioIconItemBinding.inflate(inflater) - .getRoot(); - - // if present set action icon with correct color - final int iconId = NotificationConstants.ACTION_ICONS[action]; - if (iconId != 0) { - radioButton.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, iconId, 0); - - final var color = ColorStateList.valueOf(ThemeHelper - .resolveColorFromAttr(getContext(), android.R.attr.textColorPrimary)); - TextViewCompat.setCompoundDrawableTintList(radioButton, color); - } - - radioButton.setText(NotificationConstants.getActionName(getContext(), action)); - radioButton.setChecked(action == selectedAction); - radioButton.setId(id); - radioButton.setLayoutParams(new RadioGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - radioButton.setOnClickListener(radioButtonsClickListener); - binding.list.addView(radioButton); - } - alertDialog.show(); - - if (DeviceUtils.isTv(getContext())) { - FocusOverlayView.setupFocusObserver(alertDialog); - } - } - } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationSlot.java b/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationSlot.java new file mode 100644 index 000000000..981ba3e75 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationSlot.java @@ -0,0 +1,172 @@ +package org.schabi.newpipe.settings.custom; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.ColorStateList; +import android.os.Build; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.ImageView; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import android.widget.TextView; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.content.res.AppCompatResources; +import androidx.core.widget.TextViewCompat; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.databinding.ListRadioIconItemBinding; +import org.schabi.newpipe.databinding.SingleChoiceDialogViewBinding; +import org.schabi.newpipe.player.notification.NotificationConstants; +import org.schabi.newpipe.util.DeviceUtils; +import org.schabi.newpipe.util.ThemeHelper; +import org.schabi.newpipe.views.FocusOverlayView; + +import java.util.Objects; +import java.util.function.BiConsumer; + +class NotificationSlot { + + private static final int[] SLOT_ITEMS = { + R.id.notificationAction0, + R.id.notificationAction1, + R.id.notificationAction2, + R.id.notificationAction3, + R.id.notificationAction4, + }; + + private static final int[] SLOT_TITLES = { + R.string.notification_action_0_title, + R.string.notification_action_1_title, + R.string.notification_action_2_title, + R.string.notification_action_3_title, + R.string.notification_action_4_title, + }; + + private final int i; + private @NotificationConstants.Action int selectedAction; + private final Context context; + private final BiConsumer onToggleCompactSlot; + + private ImageView icon; + private TextView summary; + + NotificationSlot(final Context context, + final SharedPreferences prefs, + final int actionIndex, + final View parentView, + final boolean isCompactSlotChecked, + final BiConsumer onToggleCompactSlot) { + this.context = context; + this.i = actionIndex; + this.onToggleCompactSlot = onToggleCompactSlot; + + selectedAction = Objects.requireNonNull(prefs).getInt( + context.getString(NotificationConstants.SLOT_PREF_KEYS[i]), + NotificationConstants.SLOT_DEFAULTS[i]); + final View view = parentView.findViewById(SLOT_ITEMS[i]); + + // only show the last two notification slots on Android 13+ + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || i >= 3) { + setupSelectedAction(view); + setupTitle(view); + setupCheckbox(view, isCompactSlotChecked); + } else { + view.setVisibility(View.GONE); + } + } + + void setupTitle(final View view) { + ((TextView) view.findViewById(R.id.notificationActionTitle)) + .setText(SLOT_TITLES[i]); + view.findViewById(R.id.notificationActionClickableArea).setOnClickListener( + v -> openActionChooserDialog()); + } + + void setupCheckbox(final View view, final boolean isCompactSlotChecked) { + final CheckBox compactSlotCheckBox = view.findViewById(R.id.notificationActionCheckBox); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + // there are no compact slots to customize on Android 13+ + compactSlotCheckBox.setVisibility(View.GONE); + view.findViewById(R.id.notificationActionCheckBoxClickableArea) + .setVisibility(View.GONE); + return; + } + + compactSlotCheckBox.setChecked(isCompactSlotChecked); + view.findViewById(R.id.notificationActionCheckBoxClickableArea).setOnClickListener( + v -> onToggleCompactSlot.accept(i, compactSlotCheckBox)); + } + + void setupSelectedAction(final View view) { + icon = view.findViewById(R.id.notificationActionIcon); + summary = view.findViewById(R.id.notificationActionSummary); + updateInfo(); + } + + void updateInfo() { + if (NotificationConstants.ACTION_ICONS[selectedAction] == 0) { + icon.setImageDrawable(null); + } else { + icon.setImageDrawable(AppCompatResources.getDrawable(context, + NotificationConstants.ACTION_ICONS[selectedAction])); + } + + summary.setText(NotificationConstants.getActionName(context, selectedAction)); + } + + void openActionChooserDialog() { + final LayoutInflater inflater = LayoutInflater.from(context); + final SingleChoiceDialogViewBinding binding = + SingleChoiceDialogViewBinding.inflate(inflater); + + final AlertDialog alertDialog = new AlertDialog.Builder(context) + .setTitle(SLOT_TITLES[i]) + .setView(binding.getRoot()) + .setCancelable(true) + .create(); + + final View.OnClickListener radioButtonsClickListener = v -> { + selectedAction = NotificationConstants.ALL_ACTIONS[v.getId()]; + updateInfo(); + alertDialog.dismiss(); + }; + + for (int id = 0; id < NotificationConstants.ALL_ACTIONS.length; ++id) { + final int action = NotificationConstants.ALL_ACTIONS[id]; + final RadioButton radioButton = ListRadioIconItemBinding.inflate(inflater) + .getRoot(); + + // if present set action icon with correct color + final int iconId = NotificationConstants.ACTION_ICONS[action]; + if (iconId != 0) { + radioButton.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, iconId, 0); + + final var color = ColorStateList.valueOf(ThemeHelper + .resolveColorFromAttr(context, android.R.attr.textColorPrimary)); + TextViewCompat.setCompoundDrawableTintList(radioButton, color); + } + + radioButton.setText(NotificationConstants.getActionName(context, action)); + radioButton.setChecked(action == selectedAction); + radioButton.setId(id); + radioButton.setLayoutParams(new RadioGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + radioButton.setOnClickListener(radioButtonsClickListener); + binding.list.addView(radioButton); + } + alertDialog.show(); + + if (DeviceUtils.isTv(context)) { + FocusOverlayView.setupFocusObserver(alertDialog); + } + } + + @NotificationConstants.Action + public int getSelectedAction() { + return selectedAction; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/streams/io/StoredDirectoryHelper.java b/app/src/main/java/org/schabi/newpipe/streams/io/StoredDirectoryHelper.java index 74fc74c76..0fe2e0408 100644 --- a/app/src/main/java/org/schabi/newpipe/streams/io/StoredDirectoryHelper.java +++ b/app/src/main/java/org/schabi/newpipe/streams/io/StoredDirectoryHelper.java @@ -5,11 +5,15 @@ import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; +import android.os.Build; +import android.os.storage.StorageManager; +import android.os.storage.StorageVolume; import android.provider.DocumentsContract; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import androidx.documentfile.provider.DocumentFile; import org.schabi.newpipe.settings.NewPipeSettings; @@ -23,6 +27,7 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -30,6 +35,8 @@ import static android.provider.DocumentsContract.Document.COLUMN_DISPLAY_NAME; import static android.provider.DocumentsContract.Root.COLUMN_DOCUMENT_ID; import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; +import us.shandian.giga.util.Utility; + public class StoredDirectoryHelper { private static final String TAG = StoredDirectoryHelper.class.getSimpleName(); public static final int PERMISSION_FLAGS = Intent.FLAG_GRANT_READ_URI_PERMISSION @@ -168,6 +175,44 @@ public class StoredDirectoryHelper { return docTree == null; } + /** + * Get free memory of the storage partition (root of the directory). + * @return amount of free memory in the volume of current directory (bytes) + */ + @RequiresApi(api = Build.VERSION_CODES.N) // Necessary for `getStorageVolume()` + public long getFreeMemory() { + final Uri uri = getUri(); + final StorageManager storageManager = (StorageManager) context. + getSystemService(Context.STORAGE_SERVICE); + final List volumes = storageManager.getStorageVolumes(); + + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + if (split.length > 0) { + final String volumeId = split[0]; + + for (final StorageVolume volume : volumes) { + // if the volume is an internal system volume + if (volume.isPrimary() && volumeId.equalsIgnoreCase("primary")) { + return Utility.getSystemFreeMemory(); + } + + // if the volume is a removable volume (normally an SD card) + if (volume.isRemovable() && !volume.isPrimary()) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + try { + final String sdCardUUID = volume.getUuid(); + return storageManager.getAllocatableBytes(UUID.fromString(sdCardUUID)); + } catch (final Exception e) { + // do nothing + } + } + } + } + } + return Long.MAX_VALUE; + } + /** * Only using Java I/O. Creates the directory named by this abstract pathname, including any * necessary but nonexistent parent directories. diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index 07d0f516d..066d5f570 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -27,6 +27,7 @@ import android.util.Log; import android.view.View; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.text.HtmlCompat; import androidx.preference.PreferenceManager; @@ -113,14 +114,14 @@ public final class ExtractorHelper { public static Single getStreamInfo(final int serviceId, final String url, final boolean forceLoad) { checkServiceId(serviceId); - return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.STREAM, + return checkCache(forceLoad, serviceId, url, InfoCache.Type.STREAM, Single.fromCallable(() -> StreamInfo.getInfo(NewPipe.getService(serviceId), url))); } public static Single getChannelInfo(final int serviceId, final String url, final boolean forceLoad) { checkServiceId(serviceId); - return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.CHANNEL, + return checkCache(forceLoad, serviceId, url, InfoCache.Type.CHANNEL, Single.fromCallable(() -> ChannelInfo.getInfo(NewPipe.getService(serviceId), url))); } @@ -130,7 +131,7 @@ public final class ExtractorHelper { final boolean forceLoad) { checkServiceId(serviceId); return checkCache(forceLoad, serviceId, - listLinkHandler.getUrl(), InfoItem.InfoType.CHANNEL, + listLinkHandler.getUrl(), InfoCache.Type.CHANNEL_TAB, Single.fromCallable(() -> ChannelTabInfo.getInfo(NewPipe.getService(serviceId), listLinkHandler))); } @@ -145,10 +146,11 @@ public final class ExtractorHelper { listLinkHandler, nextPage)); } - public static Single getCommentsInfo(final int serviceId, final String url, + public static Single getCommentsInfo(final int serviceId, + final String url, final boolean forceLoad) { checkServiceId(serviceId); - return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.COMMENT, + return checkCache(forceLoad, serviceId, url, InfoCache.Type.COMMENTS, Single.fromCallable(() -> CommentsInfo.getInfo(NewPipe.getService(serviceId), url))); } @@ -162,11 +164,20 @@ public final class ExtractorHelper { CommentsInfo.getMoreItems(NewPipe.getService(serviceId), info, nextPage)); } + public static Single> getMoreCommentItems( + final int serviceId, + final String url, + final Page nextPage) { + checkServiceId(serviceId); + return Single.fromCallable(() -> + CommentsInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage)); + } + public static Single getPlaylistInfo(final int serviceId, final String url, final boolean forceLoad) { checkServiceId(serviceId); - return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.PLAYLIST, + return checkCache(forceLoad, serviceId, url, InfoCache.Type.PLAYLIST, Single.fromCallable(() -> PlaylistInfo.getInfo(NewPipe.getService(serviceId), url))); } @@ -179,9 +190,10 @@ public final class ExtractorHelper { PlaylistInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage)); } - public static Single getKioskInfo(final int serviceId, final String url, + public static Single getKioskInfo(final int serviceId, + final String url, final boolean forceLoad) { - return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.PLAYLIST, + return checkCache(forceLoad, serviceId, url, InfoCache.Type.KIOSK, Single.fromCallable(() -> KioskInfo.getInfo(NewPipe.getService(serviceId), url))); } @@ -193,7 +205,7 @@ public final class ExtractorHelper { } /*////////////////////////////////////////////////////////////////////////// - // Utils + // Cache //////////////////////////////////////////////////////////////////////////*/ /** @@ -205,24 +217,25 @@ public final class ExtractorHelper { * @param forceLoad whether to force loading from the network instead of from the cache * @param serviceId the service to load from * @param url the URL to load - * @param infoType the {@link InfoItem.InfoType} of the item + * @param cacheType the {@link InfoCache.Type} of the item * @param loadFromNetwork the {@link Single} to load the item from the network * @return a {@link Single} that loads the item */ private static Single checkCache(final boolean forceLoad, - final int serviceId, final String url, - final InfoItem.InfoType infoType, - final Single loadFromNetwork) { + final int serviceId, + @NonNull final String url, + @NonNull final InfoCache.Type cacheType, + @NonNull final Single loadFromNetwork) { checkServiceId(serviceId); final Single actualLoadFromNetwork = loadFromNetwork - .doOnSuccess(info -> CACHE.putInfo(serviceId, url, info, infoType)); + .doOnSuccess(info -> CACHE.putInfo(serviceId, url, info, cacheType)); final Single load; if (forceLoad) { - CACHE.removeInfo(serviceId, url, infoType); + CACHE.removeInfo(serviceId, url, cacheType); load = actualLoadFromNetwork; } else { - load = Maybe.concat(ExtractorHelper.loadFromCache(serviceId, url, infoType), + load = Maybe.concat(ExtractorHelper.loadFromCache(serviceId, url, cacheType), actualLoadFromNetwork.toMaybe()) .firstElement() // Take the first valid .toSingle(); @@ -237,15 +250,17 @@ public final class ExtractorHelper { * @param the item type's class that extends {@link Info} * @param serviceId the service to load from * @param url the URL to load - * @param infoType the {@link InfoItem.InfoType} of the item + * @param cacheType the {@link InfoCache.Type} of the item * @return a {@link Single} that loads the item */ - private static Maybe loadFromCache(final int serviceId, final String url, - final InfoItem.InfoType infoType) { + private static Maybe loadFromCache( + final int serviceId, + @NonNull final String url, + @NonNull final InfoCache.Type cacheType) { checkServiceId(serviceId); return Maybe.defer(() -> { //noinspection unchecked - final I info = (I) CACHE.getFromKey(serviceId, url, infoType); + final I info = (I) CACHE.getFromKey(serviceId, url, cacheType); if (MainActivity.DEBUG) { Log.d(TAG, "loadFromCache() called, info > " + info); } @@ -259,11 +274,17 @@ public final class ExtractorHelper { }); } - public static boolean isCached(final int serviceId, final String url, - final InfoItem.InfoType infoType) { - return null != loadFromCache(serviceId, url, infoType).blockingGet(); + public static boolean isCached(final int serviceId, + @NonNull final String url, + @NonNull final InfoCache.Type cacheType) { + return null != loadFromCache(serviceId, url, cacheType).blockingGet(); } + + /*////////////////////////////////////////////////////////////////////////// + // Utils + //////////////////////////////////////////////////////////////////////////*/ + /** * Formats the text contained in the meta info list as HTML and puts it into the text view, * while also making the separator visible. If the list is null or empty, or the user chose not diff --git a/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.java b/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.java index edcb565a0..bc15f3f02 100644 --- a/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/FilenameUtils.java @@ -7,6 +7,7 @@ import androidx.preference.PreferenceManager; import org.schabi.newpipe.R; +import java.util.regex.Matcher; import java.util.regex.Pattern; public final class FilenameUtils { @@ -51,7 +52,7 @@ public final class FilenameUtils { final Pattern pattern = Pattern.compile(charset); - return createFilename(title, pattern, replacementChar); + return createFilename(title, pattern, Matcher.quoteReplacement(replacementChar)); } /** diff --git a/app/src/main/java/org/schabi/newpipe/util/InfoCache.java b/app/src/main/java/org/schabi/newpipe/util/InfoCache.java index a07f05828..b9c91f8a5 100644 --- a/app/src/main/java/org/schabi/newpipe/util/InfoCache.java +++ b/app/src/main/java/org/schabi/newpipe/util/InfoCache.java @@ -27,7 +27,6 @@ import androidx.collection.LruCache; import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.extractor.Info; -import org.schabi.newpipe.extractor.InfoItem; import java.util.Map; @@ -48,14 +47,27 @@ public final class InfoCache { // no instance } + /** + * Identifies the type of {@link Info} to put into the cache. + */ + public enum Type { + STREAM, + CHANNEL, + CHANNEL_TAB, + COMMENTS, + PLAYLIST, + KIOSK, + } + public static InfoCache getInstance() { return INSTANCE; } @NonNull - private static String keyOf(final int serviceId, @NonNull final String url, - @NonNull final InfoItem.InfoType infoType) { - return serviceId + url + infoType.toString(); + private static String keyOf(final int serviceId, + @NonNull final String url, + @NonNull final Type cacheType) { + return serviceId + ":" + cacheType.ordinal() + ":" + url; } private static void removeStaleCache() { @@ -83,19 +95,22 @@ public final class InfoCache { } @Nullable - public Info getFromKey(final int serviceId, @NonNull final String url, - @NonNull final InfoItem.InfoType infoType) { + public Info getFromKey(final int serviceId, + @NonNull final String url, + @NonNull final Type cacheType) { if (DEBUG) { Log.d(TAG, "getFromKey() called with: " + "serviceId = [" + serviceId + "], url = [" + url + "]"); } synchronized (LRU_CACHE) { - return getInfo(keyOf(serviceId, url, infoType)); + return getInfo(keyOf(serviceId, url, cacheType)); } } - public void putInfo(final int serviceId, @NonNull final String url, @NonNull final Info info, - @NonNull final InfoItem.InfoType infoType) { + public void putInfo(final int serviceId, + @NonNull final String url, + @NonNull final Info info, + @NonNull final Type cacheType) { if (DEBUG) { Log.d(TAG, "putInfo() called with: info = [" + info + "]"); } @@ -103,18 +118,19 @@ public final class InfoCache { final long expirationMillis = ServiceHelper.getCacheExpirationMillis(info.getServiceId()); synchronized (LRU_CACHE) { final CacheData data = new CacheData(info, expirationMillis); - LRU_CACHE.put(keyOf(serviceId, url, infoType), data); + LRU_CACHE.put(keyOf(serviceId, url, cacheType), data); } } - public void removeInfo(final int serviceId, @NonNull final String url, - @NonNull final InfoItem.InfoType infoType) { + public void removeInfo(final int serviceId, + @NonNull final String url, + @NonNull final Type cacheType) { if (DEBUG) { Log.d(TAG, "removeInfo() called with: " + "serviceId = [" + serviceId + "], url = [" + url + "]"); } synchronized (LRU_CACHE) { - LRU_CACHE.remove(keyOf(serviceId, url, infoType)); + LRU_CACHE.remove(keyOf(serviceId, url, cacheType)); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index f45f3786d..f1904565d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -4,6 +4,7 @@ import static org.schabi.newpipe.extractor.ServiceList.YouTube; import android.content.Context; import android.content.SharedPreferences; +import android.content.res.Resources; import android.net.ConnectivityManager; import androidx.annotation.NonNull; @@ -45,10 +46,10 @@ public final class ListHelper { List.of(MediaFormat.MP3, MediaFormat.M4A, MediaFormat.WEBMA); // Use a Set for better performance private static final Set HIGH_RESOLUTION_LIST = Set.of("1440p", "2160p"); - // Audio track types in order of priotity. 0=lowest, n=highest + // Audio track types in order of priority. 0=lowest, n=highest private static final List AUDIO_TRACK_TYPE_RANKING = List.of(AudioTrackType.DESCRIPTIVE, AudioTrackType.DUBBED, AudioTrackType.ORIGINAL); - // Audio track types in order of priotity when descriptive audio is preferred. + // Audio track types in order of priority when descriptive audio is preferred. private static final List AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE = List.of(AudioTrackType.ORIGINAL, AudioTrackType.DUBBED, AudioTrackType.DESCRIPTIVE); @@ -188,13 +189,16 @@ public final class ListHelper { /** * Return a {@link Stream} list which only contains streams which can be played by the player. - *
- * Some formats are not supported. For more info, see {@link #SUPPORTED_ITAG_IDS}. - * Torrent streams are also removed, because they cannot be retrieved. + * + *

+ * Some formats are not supported, see {@link #SUPPORTED_ITAG_IDS} for more details. + * Torrent streams are also removed, because they cannot be retrieved, like OPUS streams using + * HLS as their delivery method, since they are not supported by ExoPlayer. + *

* * @param the item type's class that extends {@link Stream} * @param streamList the original stream list - * @param serviceId + * @param serviceId the service ID from which the streams' list comes from * @return a stream list which only contains streams that can be played the player */ @NonNull @@ -203,6 +207,8 @@ public final class ListHelper { final int youtubeServiceId = YouTube.getServiceId(); return getFilteredStreamList(streamList, stream -> stream.getDeliveryMethod() != DeliveryMethod.TORRENT + && (stream.getDeliveryMethod() != DeliveryMethod.HLS + || stream.getFormat() != MediaFormat.OPUS) && (serviceId != youtubeServiceId || stream.getItagItem() == null || SUPPORTED_ITAG_IDS.contains(stream.getItagItem().id))); @@ -239,6 +245,41 @@ public final class ListHelper { videoOnlyStreams, ascendingOrder, preferVideoOnlyStreams); } + /** + * Get a sorted list containing a set of default resolution info + * and additional resolution info if showHigherResolutions is true. + * + * @param resources the resources to get the resolutions from + * @param defaultResolutionKey the settings key of the default resolution + * @param additionalResolutionKey the settings key of the additional resolutions + * @param showHigherResolutions if higher resolutions should be included in the sorted list + * @return a sorted list containing the default and maybe additional resolutions + */ + public static List getSortedResolutionList( + final Resources resources, + final int defaultResolutionKey, + final int additionalResolutionKey, + final boolean showHigherResolutions) { + final List resolutions = new ArrayList<>(Arrays.asList( + resources.getStringArray(defaultResolutionKey))); + if (!showHigherResolutions) { + return resolutions; + } + final List additionalResolutions = Arrays.asList( + resources.getStringArray(additionalResolutionKey)); + // keep "best resolution" at the top + resolutions.addAll(1, additionalResolutions); + return resolutions; + } + + public static boolean isHighResolutionSelected(final String selectedResolution, + final int additionalResolutionKey, + final Resources resources) { + return Arrays.asList(resources.getStringArray( + additionalResolutionKey)) + .contains(selectedResolution); + } + /** * Filter the list of audio streams and return a list with the preferred stream for * each audio track. Streams are sorted with the preferred language in the first position. @@ -259,7 +300,9 @@ public final class ListHelper { final Comparator cmp = getAudioFormatComparator(context); for (final AudioStream stream : audioStreams) { - if (stream.getDeliveryMethod() == DeliveryMethod.TORRENT) { + if (stream.getDeliveryMethod() == DeliveryMethod.TORRENT + || (stream.getDeliveryMethod() == DeliveryMethod.HLS + && stream.getFormat() == MediaFormat.OPUS)) { continue; } @@ -600,6 +643,7 @@ public final class ListHelper { context.getString(R.string.best_resolution_key), defaultFormat, videoStreams); } + @Nullable private static MediaFormat getDefaultFormat(@NonNull final Context context, @StringRes final int defaultFormatKey, @StringRes final int defaultFormatValueKey) { @@ -608,18 +652,14 @@ public final class ListHelper { final String defaultFormat = context.getString(defaultFormatValueKey); final String defaultFormatString = preferences.getString( - context.getString(defaultFormatKey), defaultFormat); + context.getString(defaultFormatKey), + defaultFormat + ); - MediaFormat defaultMediaFormat = getMediaFormatFromKey(context, defaultFormatString); - if (defaultMediaFormat == null) { - preferences.edit().putString(context.getString(defaultFormatKey), defaultFormat) - .apply(); - defaultMediaFormat = getMediaFormatFromKey(context, defaultFormat); - } - - return defaultMediaFormat; + return getMediaFormatFromKey(context, defaultFormatString); } + @Nullable private static MediaFormat getMediaFormatFromKey(@NonNull final Context context, @NonNull final String formatKey) { MediaFormat format = null; @@ -653,7 +693,7 @@ public final class ListHelper { } } - private static boolean isLimitingDataUsage(final Context context) { + static boolean isLimitingDataUsage(@NonNull final Context context) { return getResolutionLimit(context) != null; } @@ -695,7 +735,7 @@ public final class ListHelper { /** * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. * - *

The prefered stream will be ordered last.

+ *

The preferred stream will be ordered last.

* * @param context app context * @return Comparator @@ -710,7 +750,7 @@ public final class ListHelper { /** * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate. * - *

The prefered stream will be ordered last.

+ *

The preferred stream will be ordered last.

* * @param defaultFormat the default format to look for * @param limitDataUsage choose low bitrate audio stream @@ -752,7 +792,7 @@ public final class ListHelper { *
  • Language is English
  • * * - *

    The prefered track will be ordered last.

    + *

    The preferred track will be ordered last.

    * * @param context App context * @return Comparator @@ -789,7 +829,7 @@ public final class ListHelper { *
  • Language is English
  • * * - *

    The prefered track will be ordered last.

    + *

    The preferred track will be ordered last.

    * * @param preferredLanguage Preferred audio stream language * @param preferOriginalAudio Get the original audio track regardless of its language @@ -834,6 +874,7 @@ public final class ListHelper { return Comparator.comparing(AudioStream::getAudioLocale, Comparator.nullsLast( Comparator.comparing(locale -> locale.getDisplayName(appLoc)))) - .thenComparing(AudioStream::getAudioTrackType); + .thenComparing(AudioStream::getAudioTrackType, Comparator.nullsLast( + Comparator.naturalOrder())); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/Localization.java b/app/src/main/java/org/schabi/newpipe/util/Localization.java index c4034252d..0485413cc 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Localization.java +++ b/app/src/main/java/org/schabi/newpipe/util/Localization.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.util; +import static org.schabi.newpipe.MainActivity.DEBUG; + import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; @@ -22,6 +24,7 @@ import org.ocpsoft.prettytime.units.Decade; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.localization.ContentCountry; +import org.schabi.newpipe.extractor.localization.DateWrapper; import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.AudioTrackType; @@ -82,7 +85,7 @@ public final class Localization { .fromLocale(getPreferredLocale(context)); } - public static ContentCountry getPreferredContentCountry(final Context context) { + public static ContentCountry getPreferredContentCountry(@NonNull final Context context) { final String contentCountry = PreferenceManager.getDefaultSharedPreferences(context) .getString(context.getString(R.string.content_country_key), context.getString(R.string.default_localization_key)); @@ -92,41 +95,43 @@ public final class Localization { return new ContentCountry(contentCountry); } - public static Locale getPreferredLocale(final Context context) { + public static Locale getPreferredLocale(@NonNull final Context context) { return getLocaleFromPrefs(context, R.string.content_language_key); } - public static Locale getAppLocale(final Context context) { + public static Locale getAppLocale(@NonNull final Context context) { return getLocaleFromPrefs(context, R.string.app_language_key); } - public static String localizeNumber(final Context context, final long number) { + public static String localizeNumber(@NonNull final Context context, final long number) { return localizeNumber(context, (double) number); } - public static String localizeNumber(final Context context, final double number) { + public static String localizeNumber(@NonNull final Context context, final double number) { final NumberFormat nf = NumberFormat.getInstance(getAppLocale(context)); return nf.format(number); } - public static String formatDate(final OffsetDateTime offsetDateTime, final Context context) { + public static String formatDate(@NonNull final Context context, + @NonNull final OffsetDateTime offsetDateTime) { return DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(getAppLocale(context)).format(offsetDateTime .atZoneSameInstant(ZoneId.systemDefault())); } @SuppressLint("StringFormatInvalid") - public static String localizeUploadDate(final Context context, - final OffsetDateTime offsetDateTime) { - return context.getString(R.string.upload_date_text, formatDate(offsetDateTime, context)); + public static String localizeUploadDate(@NonNull final Context context, + @NonNull final OffsetDateTime offsetDateTime) { + return context.getString(R.string.upload_date_text, formatDate(context, offsetDateTime)); } - public static String localizeViewCount(final Context context, final long viewCount) { + public static String localizeViewCount(@NonNull final Context context, final long viewCount) { return getQuantity(context, R.plurals.views, R.string.no_views, viewCount, localizeNumber(context, viewCount)); } - public static String localizeStreamCount(final Context context, final long streamCount) { + public static String localizeStreamCount(@NonNull final Context context, + final long streamCount) { switch ((int) streamCount) { case (int) ListExtractor.ITEM_COUNT_UNKNOWN: return ""; @@ -140,7 +145,8 @@ public final class Localization { } } - public static String localizeStreamCountMini(final Context context, final long streamCount) { + public static String localizeStreamCountMini(@NonNull final Context context, + final long streamCount) { switch ((int) streamCount) { case (int) ListExtractor.ITEM_COUNT_UNKNOWN: return ""; @@ -153,12 +159,13 @@ public final class Localization { } } - public static String localizeWatchingCount(final Context context, final long watchingCount) { + public static String localizeWatchingCount(@NonNull final Context context, + final long watchingCount) { return getQuantity(context, R.plurals.watching, R.string.no_one_watching, watchingCount, localizeNumber(context, watchingCount)); } - public static String shortCount(final Context context, final long count) { + public static String shortCount(@NonNull final Context context, final long count) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { return CompactDecimalFormat.getInstance(getAppLocale(context), CompactDecimalFormat.CompactStyle.SHORT).format(count); @@ -179,36 +186,58 @@ public final class Localization { } } - public static String listeningCount(final Context context, final long listeningCount) { + public static String listeningCount(@NonNull final Context context, final long listeningCount) { return getQuantity(context, R.plurals.listening, R.string.no_one_listening, listeningCount, shortCount(context, listeningCount)); } - public static String shortWatchingCount(final Context context, final long watchingCount) { + public static String shortWatchingCount(@NonNull final Context context, + final long watchingCount) { return getQuantity(context, R.plurals.watching, R.string.no_one_watching, watchingCount, shortCount(context, watchingCount)); } - public static String shortViewCount(final Context context, final long viewCount) { + public static String shortViewCount(@NonNull final Context context, final long viewCount) { return getQuantity(context, R.plurals.views, R.string.no_views, viewCount, shortCount(context, viewCount)); } - public static String shortSubscriberCount(final Context context, final long subscriberCount) { + public static String shortSubscriberCount(@NonNull final Context context, + final long subscriberCount) { return getQuantity(context, R.plurals.subscribers, R.string.no_subscribers, subscriberCount, shortCount(context, subscriberCount)); } - public static String downloadCount(final Context context, final int downloadCount) { + public static String downloadCount(@NonNull final Context context, final int downloadCount) { return getQuantity(context, R.plurals.download_finished_notification, 0, downloadCount, shortCount(context, downloadCount)); } - public static String deletedDownloadCount(final Context context, final int deletedCount) { + public static String deletedDownloadCount(@NonNull final Context context, + final int deletedCount) { return getQuantity(context, R.plurals.deleted_downloads_toast, 0, deletedCount, shortCount(context, deletedCount)); } + public static String replyCount(@NonNull final Context context, final int replyCount) { + return getQuantity(context, R.plurals.replies, 0, replyCount, + String.valueOf(replyCount)); + } + + /** + * @param context the Android context + * @param likeCount the like count, possibly negative if unknown + * @return if {@code likeCount} is smaller than {@code 0}, the string {@code "-"}, otherwise + * the result of calling {@link #shortCount(Context, long)} on the like count + */ + public static String likeCount(@NonNull final Context context, final int likeCount) { + if (likeCount < 0) { + return "-"; + } else { + return shortCount(context, likeCount); + } + } + public static String getDurationString(final long duration) { final String output; @@ -241,7 +270,8 @@ public final class Localization { * @return duration in a human readable string. */ @NonNull - public static String localizeDuration(final Context context, final int durationInSecs) { + public static String localizeDuration(@NonNull final Context context, + final int durationInSecs) { if (durationInSecs < 0) { throw new IllegalArgumentException("duration can not be negative"); } @@ -278,7 +308,7 @@ public final class Localization { * @param track an {@link AudioStream} of the track * @return the localized name of the audio track */ - public static String audioTrackName(final Context context, final AudioStream track) { + public static String audioTrackName(@NonNull final Context context, final AudioStream track) { final String name; if (track.getAudioLocale() != null) { name = track.getAudioLocale().getDisplayLanguage(getAppLocale(context)); @@ -298,7 +328,8 @@ public final class Localization { } @Nullable - private static String audioTrackType(final Context context, final AudioTrackType trackType) { + private static String audioTrackType(@NonNull final Context context, + final AudioTrackType trackType) { switch (trackType) { case ORIGINAL: return context.getString(R.string.audio_track_type_original); @@ -314,20 +345,45 @@ public final class Localization { // Pretty Time //////////////////////////////////////////////////////////////////////////*/ - public static void initPrettyTime(final PrettyTime time) { + public static void initPrettyTime(@NonNull final PrettyTime time) { prettyTime = time; // Do not use decades as YouTube doesn't either. prettyTime.removeUnit(Decade.class); } - public static PrettyTime resolvePrettyTime(final Context context) { + public static PrettyTime resolvePrettyTime(@NonNull final Context context) { return new PrettyTime(getAppLocale(context)); } - public static String relativeTime(final OffsetDateTime offsetDateTime) { + public static String relativeTime(@NonNull final OffsetDateTime offsetDateTime) { return prettyTime.formatUnrounded(offsetDateTime); } + /** + * @param context the Android context; if {@code null} then even if in debug mode and the + * setting is enabled, {@code textual} will not be shown next to {@code parsed} + * @param parsed the textual date or time ago parsed by NewPipeExtractor, or {@code null} if + * the extractor could not parse it + * @param textual the original textual date or time ago string as provided by services + * @return {@link #relativeTime(OffsetDateTime)} is used if {@code parsed != null}, otherwise + * {@code textual} is returned. If in debug mode, {@code context != null}, + * {@code parsed != null} and the relevant setting is enabled, {@code textual} will + * be appended to the returned string for debugging purposes. + */ + public static String relativeTimeOrTextual(@Nullable final Context context, + @Nullable final DateWrapper parsed, + final String textual) { + if (parsed == null) { + return textual; + } else if (DEBUG && context != null && PreferenceManager + .getDefaultSharedPreferences(context) + .getBoolean(context.getString(R.string.show_original_time_ago_key), false)) { + return relativeTime(parsed.offsetDateTime()) + " (" + textual + ")"; + } else { + return relativeTime(parsed.offsetDateTime()); + } + } + public static void assureCorrectAppLanguage(final Context c) { final Resources res = c.getResources(); final DisplayMetrics dm = res.getDisplayMetrics(); @@ -336,7 +392,8 @@ public final class Localization { res.updateConfiguration(conf, dm); } - private static Locale getLocaleFromPrefs(final Context context, @StringRes final int prefKey) { + private static Locale getLocaleFromPrefs(@NonNull final Context context, + @StringRes final int prefKey) { final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); final String defaultKey = context.getString(R.string.default_localization_key); final String languageCode = sp.getString(context.getString(prefKey), defaultKey); @@ -352,8 +409,10 @@ public final class Localization { return new BigDecimal(value).setScale(1, RoundingMode.HALF_UP).doubleValue(); } - private static String getQuantity(final Context context, @PluralsRes final int pluralId, - @StringRes final int zeroCaseStringId, final long count, + private static String getQuantity(@NonNull final Context context, + @PluralsRes final int pluralId, + @StringRes final int zeroCaseStringId, + final long count, final String formattedCount) { if (count == 0) { return context.getString(zeroCaseStringId); diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index b0d7dcf73..5dee32371 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.util; +import static android.text.TextUtils.isEmpty; import static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams; import android.annotation.SuppressLint; @@ -17,6 +18,7 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; @@ -29,8 +31,10 @@ import org.schabi.newpipe.RouterActivity; import org.schabi.newpipe.about.AboutActivity; import org.schabi.newpipe.database.feed.model.FeedGroupEntity; import org.schabi.newpipe.download.DownloadActivity; +import org.schabi.newpipe.error.ErrorUtil; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.DeliveryMethod; @@ -41,6 +45,7 @@ import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.fragments.list.channel.ChannelFragment; +import org.schabi.newpipe.fragments.list.comments.CommentRepliesFragment; import org.schabi.newpipe.fragments.list.kiosk.KioskFragment; import org.schabi.newpipe.fragments.list.playlist.PlaylistFragment; import org.schabi.newpipe.fragments.list.search.SearchFragment; @@ -476,6 +481,35 @@ public final class NavigationHelper { item.getServiceId(), uploaderUrl, item.getUploaderName()); } + /** + * Opens the comment author channel fragment, if the {@link CommentsInfoItem#getUploaderUrl()} + * of {@code comment} is non-null. Shows a UI-error snackbar if something goes wrong. + * + * @param activity the activity with the fragment manager and in which to show the snackbar + * @param comment the comment whose uploader/author will be opened + */ + public static void openCommentAuthorIfPresent(@NonNull final FragmentActivity activity, + @NonNull final CommentsInfoItem comment) { + if (isEmpty(comment.getUploaderUrl())) { + return; + } + try { + openChannelFragment(activity.getSupportFragmentManager(), comment.getServiceId(), + comment.getUploaderUrl(), comment.getUploaderName()); + } catch (final Exception e) { + ErrorUtil.showUiErrorSnackbar(activity, "Opening channel fragment", e); + } + } + + public static void openCommentRepliesFragment(@NonNull final FragmentActivity activity, + @NonNull final CommentsInfoItem comment) { + defaultTransaction(activity.getSupportFragmentManager()) + .replace(R.id.fragment_holder, new CommentRepliesFragment(comment), + CommentRepliesFragment.TAG) + .addToBackStack(CommentRepliesFragment.TAG) + .commit(); + } + public static void openPlaylistFragment(final FragmentManager fragmentManager, final int serviceId, final String url, @NonNull final String name) { diff --git a/app/src/main/java/org/schabi/newpipe/util/RelatedItemInfo.java b/app/src/main/java/org/schabi/newpipe/util/RelatedItemInfo.java deleted file mode 100644 index f96bb0d54..000000000 --- a/app/src/main/java/org/schabi/newpipe/util/RelatedItemInfo.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.schabi.newpipe.util; - -import org.schabi.newpipe.extractor.InfoItem; -import org.schabi.newpipe.extractor.ListInfo; -import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; -import org.schabi.newpipe.extractor.stream.StreamInfo; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class RelatedItemInfo extends ListInfo { - public RelatedItemInfo(final int serviceId, final ListLinkHandler listUrlIdHandler, - final String name) { - super(serviceId, listUrlIdHandler, name); - } - - public static RelatedItemInfo getInfo(final StreamInfo info) { - final ListLinkHandler handler = new ListLinkHandler( - info.getOriginalUrl(), info.getUrl(), info.getId(), Collections.emptyList(), null); - final RelatedItemInfo relatedItemInfo = new RelatedItemInfo( - info.getServiceId(), handler, info.getName()); - final List relatedItems = new ArrayList<>(info.getRelatedItems()); - relatedItemInfo.setRelatedItems(relatedItems); - return relatedItemInfo; - } -} diff --git a/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt b/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt index 5a54b29d2..3ea19fa4f 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt @@ -1,97 +1,39 @@ package org.schabi.newpipe.util import android.content.pm.PackageManager -import android.content.pm.Signature import androidx.core.content.pm.PackageInfoCompat import org.schabi.newpipe.App import org.schabi.newpipe.error.ErrorInfo import org.schabi.newpipe.error.ErrorUtil.Companion.createNotification import org.schabi.newpipe.error.UserAction -import java.security.MessageDigest -import java.security.NoSuchAlgorithmException -import java.security.cert.CertificateEncodingException -import java.security.cert.CertificateException -import java.security.cert.CertificateFactory -import java.security.cert.X509Certificate import java.time.Instant import java.time.ZonedDateTime import java.time.format.DateTimeFormatter object ReleaseVersionUtil { // Public key of the certificate that is used in NewPipe release versions - private const val RELEASE_CERT_PUBLIC_KEY_SHA1 = - "B0:2E:90:7C:1C:D6:FC:57:C3:35:F0:88:D0:8F:50:5F:94:E4:D2:15" + private const val RELEASE_CERT_PUBLIC_KEY_SHA256 = + "cb84069bd68116bafae5ee4ee5b08a567aa6d898404e7cb12f9e756df5cf5cab" - @JvmStatic - fun isReleaseApk(): Boolean { - return certificateSHA1Fingerprint == RELEASE_CERT_PUBLIC_KEY_SHA1 - } - - /** - * Method to get the APK's SHA1 key. See https://stackoverflow.com/questions/9293019/#22506133. - * - * @return String with the APK's SHA1 fingerprint in hexadecimal - */ - private val certificateSHA1Fingerprint: String - get() { - val app = App.getApp() - val signatures: List = try { - PackageInfoCompat.getSignatures(app.packageManager, app.packageName) - } catch (e: PackageManager.NameNotFoundException) { - showRequestError(app, e, "Could not find package info") - return "" - } - if (signatures.isEmpty()) { - return "" - } - val x509cert = try { - val cf = CertificateFactory.getInstance("X509") - cf.generateCertificate(signatures[0].toByteArray().inputStream()) as X509Certificate - } catch (e: CertificateException) { - showRequestError(app, e, "Certificate error") - return "" - } - - return try { - val md = MessageDigest.getInstance("SHA1") - val publicKey = md.digest(x509cert.encoded) - byte2HexFormatted(publicKey) - } catch (e: NoSuchAlgorithmException) { - showRequestError(app, e, "Could not retrieve SHA1 key") - "" - } catch (e: CertificateEncodingException) { - showRequestError(app, e, "Could not retrieve SHA1 key") - "" - } - } - - private fun byte2HexFormatted(arr: ByteArray): String { - val str = StringBuilder(arr.size * 2) - for (i in arr.indices) { - var h = Integer.toHexString(arr[i].toInt()) - val l = h.length - if (l == 1) { - h = "0$h" - } - if (l > 2) { - h = h.substring(l - 2, l) - } - str.append(h.uppercase()) - if (i < arr.size - 1) { - str.append(':') - } - } - return str.toString() - } - - private fun showRequestError(app: App, e: Exception, request: String) { - createNotification( - app, ErrorInfo(e, UserAction.CHECK_FOR_NEW_APP_VERSION, request) + @OptIn(ExperimentalStdlibApi::class) + val isReleaseApk by lazy { + @Suppress("NewApi") + val certificates = mapOf( + RELEASE_CERT_PUBLIC_KEY_SHA256.hexToByteArray() to PackageManager.CERT_INPUT_SHA256 ) + val app = App.getApp() + try { + PackageInfoCompat.hasSignatures(app.packageManager, app.packageName, certificates, false) + } catch (e: PackageManager.NameNotFoundException) { + createNotification( + app, ErrorInfo(e, UserAction.CHECK_FOR_NEW_APP_VERSION, "Could not find package info") + ) + false + } } fun isLastUpdateCheckExpired(expiry: Long): Boolean { - return Instant.ofEpochSecond(expiry).isBefore(Instant.now()) + return Instant.ofEpochSecond(expiry) < Instant.now() } /** diff --git a/app/src/main/java/org/schabi/newpipe/util/SecondaryStreamHelper.java b/app/src/main/java/org/schabi/newpipe/util/SecondaryStreamHelper.java index 9415135cf..75d9a3892 100644 --- a/app/src/main/java/org/schabi/newpipe/util/SecondaryStreamHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/SecondaryStreamHelper.java @@ -1,5 +1,7 @@ package org.schabi.newpipe.util; +import android.content.Context; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -9,6 +11,7 @@ import org.schabi.newpipe.extractor.stream.Stream; import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.util.StreamItemAdapter.StreamInfoWrapper; +import java.util.Comparator; import java.util.List; public class SecondaryStreamHelper { @@ -25,14 +28,19 @@ public class SecondaryStreamHelper { } /** - * Find the correct audio stream for the desired video stream. + * Finds an audio stream compatible with the provided video-only stream, so that the two streams + * can be combined in a single file by the downloader. If there are multiple available audio + * streams, chooses either the highest or the lowest quality one based on + * {@link ListHelper#isLimitingDataUsage(Context)}. * + * @param context Android context * @param audioStreams list of audio streams - * @param videoStream desired video ONLY stream - * @return selected audio stream or null if a candidate was not found + * @param videoStream desired video-ONLY stream + * @return the selected audio stream or null if a candidate was not found */ @Nullable - public static AudioStream getAudioStreamFor(@NonNull final List audioStreams, + public static AudioStream getAudioStreamFor(@NonNull final Context context, + @NonNull final List audioStreams, @NonNull final VideoStream videoStream) { final MediaFormat mediaFormat = videoStream.getFormat(); if (mediaFormat == null) { @@ -41,33 +49,36 @@ public class SecondaryStreamHelper { switch (mediaFormat) { case WEBM: - case MPEG_4:// ¿is mpeg-4 DASH? + case MPEG_4: // Is MPEG-4 DASH? break; default: return null; } - final boolean m4v = (mediaFormat == MediaFormat.MPEG_4); + final boolean m4v = mediaFormat == MediaFormat.MPEG_4; + final boolean isLimitingDataUsage = ListHelper.isLimitingDataUsage(context); - for (final AudioStream audio : audioStreams) { - if (audio.getFormat() == (m4v ? MediaFormat.M4A : MediaFormat.WEBMA)) { - return audio; + Comparator comparator = ListHelper.getAudioFormatComparator( + m4v ? MediaFormat.M4A : MediaFormat.WEBMA, isLimitingDataUsage); + int preferredAudioStreamIndex = ListHelper.getAudioIndexByHighestRank( + audioStreams, comparator); + + if (preferredAudioStreamIndex == -1) { + if (m4v) { + return null; + } + + comparator = ListHelper.getAudioFormatComparator( + MediaFormat.WEBMA_OPUS, isLimitingDataUsage); + preferredAudioStreamIndex = ListHelper.getAudioIndexByHighestRank( + audioStreams, comparator); + + if (preferredAudioStreamIndex == -1) { + return null; } } - if (m4v) { - return null; - } - - // retry, but this time in reverse order - for (int i = audioStreams.size() - 1; i >= 0; i--) { - final AudioStream audio = audioStreams.get(i); - if (audio.getFormat() == MediaFormat.WEBMA_OPUS) { - return audio; - } - } - - return null; + return audioStreams.get(preferredAudioStreamIndex); } public T getStream() { diff --git a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java index acd019ba0..c712157b3 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ServiceHelper.java @@ -144,6 +144,19 @@ public final class ServiceHelper { .orElse(""); } + /** + * @param serviceId the id of the service + * @return the service corresponding to the provided id + * @throws java.util.NoSuchElementException if there is no service with the provided id + */ + @NonNull + public static StreamingService getServiceById(final int serviceId) { + return ServiceList.all().stream() + .filter(s -> s.getServiceId() == serviceId) + .findFirst() + .orElseThrow(); + } + public static void setSelectedServiceId(final Context context, final int serviceId) { String serviceName; try { diff --git a/app/src/main/java/org/schabi/newpipe/util/StateSaver.java b/app/src/main/java/org/schabi/newpipe/util/StateSaver.java index 91dc5f35b..61fdb602f 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StateSaver.java +++ b/app/src/main/java/org/schabi/newpipe/util/StateSaver.java @@ -27,6 +27,7 @@ import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.os.BundleCompat; import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.MainActivity; @@ -82,7 +83,8 @@ public final class StateSaver { return null; } - final SavedState savedState = outState.getParcelable(KEY_SAVED_STATE); + final SavedState savedState = BundleCompat.getParcelable( + outState, KEY_SAVED_STATE, SavedState.class); if (savedState == null) { return null; } diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java index 118b77026..7524e5413 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java @@ -23,10 +23,13 @@ import androidx.core.content.FileProvider; import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.R; -import org.schabi.newpipe.util.PicassoHelper; +import org.schabi.newpipe.extractor.Image; +import org.schabi.newpipe.util.image.ImageStrategy; +import org.schabi.newpipe.util.image.PicassoHelper; import java.io.File; import java.io.FileOutputStream; +import java.util.List; public final class ShareUtils { private static final String TAG = ShareUtils.class.getSimpleName(); @@ -249,7 +252,7 @@ public final class ShareUtils { // If loading of images has been disabled, don't try to generate a content preview if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && !TextUtils.isEmpty(imagePreviewUrl) - && PicassoHelper.getShouldLoadImages()) { + && ImageStrategy.shouldLoadImages()) { final ClipData clipData = generateClipDataForImagePreview(context, imagePreviewUrl); if (clipData != null) { @@ -261,6 +264,29 @@ public final class ShareUtils { openAppChooser(context, shareIntent, false); } + /** + * Open the android share sheet to share a content. + * + *

    + * For Android 10+ users, a content preview is shown, which includes the title of the shared + * content and an image preview the content, if the preferred image chosen by {@link + * ImageStrategy#choosePreferredImage(List)} is in the image cache. + *

    + * + * @param context the context to use + * @param title the title of the content + * @param content the content to share + * @param images a set of possible {@link Image}s of the subject, among which to choose with + * {@link ImageStrategy#choosePreferredImage(List)} since that's likely to + * provide an image that is in Picasso's cache + */ + public static void shareText(@NonNull final Context context, + @NonNull final String title, + final String content, + final List images) { + shareText(context, title, content, ImageStrategy.choosePreferredImage(images)); + } + /** * Open the android share sheet to share a content. * diff --git a/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.java b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.java new file mode 100644 index 000000000..da97179b6 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.java @@ -0,0 +1,195 @@ +package org.schabi.newpipe.util.image; + +import static org.schabi.newpipe.extractor.Image.HEIGHT_UNKNOWN; +import static org.schabi.newpipe.extractor.Image.WIDTH_UNKNOWN; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.schabi.newpipe.extractor.Image; + +import java.util.Comparator; +import java.util.List; + +public final class ImageStrategy { + + // when preferredImageQuality is LOW or MEDIUM, images are sorted by how close their preferred + // image quality is to these values (H stands for "Height") + private static final int BEST_LOW_H = 75; + private static final int BEST_MEDIUM_H = 250; + + private static PreferredImageQuality preferredImageQuality = PreferredImageQuality.MEDIUM; + + private ImageStrategy() { + } + + public static void setPreferredImageQuality(final PreferredImageQuality preferredImageQuality) { + ImageStrategy.preferredImageQuality = preferredImageQuality; + } + + public static boolean shouldLoadImages() { + return preferredImageQuality != PreferredImageQuality.NONE; + } + + + static double estimatePixelCount(final Image image, final double widthOverHeight) { + if (image.getHeight() == HEIGHT_UNKNOWN) { + if (image.getWidth() == WIDTH_UNKNOWN) { + // images whose size is completely unknown will be in their own subgroups, so + // any one of them will do, hence returning the same value for all of them + return 0; + } else { + return image.getWidth() * image.getWidth() / widthOverHeight; + } + } else if (image.getWidth() == WIDTH_UNKNOWN) { + return image.getHeight() * image.getHeight() * widthOverHeight; + } else { + return image.getHeight() * image.getWidth(); + } + } + + /** + * {@link #choosePreferredImage(List)} contains the description for this function's logic. + * + * @param images the images from which to choose + * @param nonNoneQuality the preferred quality (must NOT be {@link PreferredImageQuality#NONE}) + * @return the chosen preferred image, or {@link null} if the list is empty + * @see #choosePreferredImage(List) + */ + @Nullable + static String choosePreferredImage(@NonNull final List images, + final PreferredImageQuality nonNoneQuality) { + // this will be used to estimate the pixel count for images where only one of height or + // width are known + final double widthOverHeight = images.stream() + .filter(image -> image.getHeight() != HEIGHT_UNKNOWN + && image.getWidth() != WIDTH_UNKNOWN) + .mapToDouble(image -> ((double) image.getWidth()) / image.getHeight()) + .findFirst() + .orElse(1.0); + + final Image.ResolutionLevel preferredLevel = nonNoneQuality.toResolutionLevel(); + final Comparator initialComparator = Comparator + // the first step splits the images into groups of resolution levels + .comparingInt(i -> { + if (i.getEstimatedResolutionLevel() == Image.ResolutionLevel.UNKNOWN) { + return 3; // avoid unknowns as much as possible + } else if (i.getEstimatedResolutionLevel() == preferredLevel) { + return 0; // prefer a matching resolution level + } else if (i.getEstimatedResolutionLevel() == Image.ResolutionLevel.MEDIUM) { + return 1; // the preferredLevel is only 1 "step" away (either HIGH or LOW) + } else { + return 2; // the preferredLevel is the furthest away possible (2 "steps") + } + }) + // then each level's group is further split into two subgroups, one with known image + // size (which is also the preferred subgroup) and the other without + .thenComparing(image -> + image.getHeight() == HEIGHT_UNKNOWN && image.getWidth() == WIDTH_UNKNOWN); + + // The third step chooses, within each subgroup with known image size, the best image based + // on how close its size is to BEST_LOW_H or BEST_MEDIUM_H (with proper units). Subgroups + // without known image size will be left untouched since estimatePixelCount always returns + // the same number for those. + final Comparator finalComparator = switch (nonNoneQuality) { + case NONE -> initialComparator; // unreachable + case LOW -> initialComparator.thenComparingDouble(image -> { + final double pixelCount = estimatePixelCount(image, widthOverHeight); + return Math.abs(pixelCount - BEST_LOW_H * BEST_LOW_H * widthOverHeight); + }); + case MEDIUM -> initialComparator.thenComparingDouble(image -> { + final double pixelCount = estimatePixelCount(image, widthOverHeight); + return Math.abs(pixelCount - BEST_MEDIUM_H * BEST_MEDIUM_H * widthOverHeight); + }); + case HIGH -> initialComparator.thenComparingDouble( + // this is reversed with a - so that the highest resolution is chosen + i -> -estimatePixelCount(i, widthOverHeight)); + }; + + return images.stream() + // using "min" basically means "take the first group, then take the first subgroup, + // then choose the best image, while ignoring all other groups and subgroups" + .min(finalComparator) + .map(Image::getUrl) + .orElse(null); + } + + /** + * Chooses an image amongst the provided list based on the user preference previously set with + * {@link #setPreferredImageQuality(PreferredImageQuality)}. {@code null} will be returned in + * case the list is empty or the user preference is to not show images. + *
    + * These properties will be preferred, from most to least important: + *
      + *
    1. The image's {@link Image#getEstimatedResolutionLevel()} is not unknown and is close + * to {@link #preferredImageQuality}
    2. + *
    3. At least one of the image's width or height are known
    4. + *
    5. The highest resolution image is finally chosen if the user's preference is {@link + * PreferredImageQuality#HIGH}, otherwise the chosen image is the one that has the height + * closest to {@link #BEST_LOW_H} or {@link #BEST_MEDIUM_H}
    6. + *
    + *
    + * Use {@link #imageListToDbUrl(List)} if the URL is going to be saved to the database, to avoid + * saving nothing in case at the moment of saving the user preference is to not show images. + * + * @param images the images from which to choose + * @return the chosen preferred image, or {@link null} if the list is empty or the user disabled + * images + * @see #imageListToDbUrl(List) + */ + @Nullable + public static String choosePreferredImage(@NonNull final List images) { + if (preferredImageQuality == PreferredImageQuality.NONE) { + return null; // do not load images + } + + return choosePreferredImage(images, preferredImageQuality); + } + + /** + * Like {@link #choosePreferredImage(List)}, except that if {@link #preferredImageQuality} is + * {@link PreferredImageQuality#NONE} an image will be chosen anyway (with preferred quality + * {@link PreferredImageQuality#MEDIUM}. + *
    + * To go back to a list of images (obviously with just the one chosen image) from a URL saved in + * the database use {@link #dbUrlToImageList(String)}. + * + * @param images the images from which to choose + * @return the chosen preferred image, or {@link null} if the list is empty + * @see #choosePreferredImage(List) + * @see #dbUrlToImageList(String) + */ + @Nullable + public static String imageListToDbUrl(@NonNull final List images) { + final PreferredImageQuality quality; + if (preferredImageQuality == PreferredImageQuality.NONE) { + quality = PreferredImageQuality.MEDIUM; + } else { + quality = preferredImageQuality; + } + + return choosePreferredImage(images, quality); + } + + /** + * Wraps the URL (coming from the database) in a {@code List} so that it is usable + * seamlessly in all of the places where the extractor would return a list of images, including + * allowing to build info objects based on database objects. + *
    + * To obtain a url to save to the database from a list of images use {@link + * #imageListToDbUrl(List)}. + * + * @param url the URL to wrap coming from the database, or {@code null} to get an empty list + * @return a list containing just one {@link Image} wrapping the provided URL, with unknown + * image size fields, or an empty list if the URL is {@code null} + * @see #imageListToDbUrl(List) + */ + @NonNull + public static List dbUrlToImageList(@Nullable final String url) { + if (url == null) { + return List.of(); + } else { + return List.of(new Image(url, -1, -1, Image.ResolutionLevel.UNKNOWN)); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java b/app/src/main/java/org/schabi/newpipe/util/image/PicassoHelper.java similarity index 69% rename from app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java rename to app/src/main/java/org/schabi/newpipe/util/image/PicassoHelper.java index ece0c7e87..4b116bdf9 100644 --- a/app/src/main/java/org/schabi/newpipe/util/PicassoHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/image/PicassoHelper.java @@ -1,13 +1,16 @@ -package org.schabi.newpipe.util; +package org.schabi.newpipe.util.image; import static org.schabi.newpipe.MainActivity.DEBUG; -import static org.schabi.newpipe.extractor.utils.Utils.isBlank; +import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; +import static org.schabi.newpipe.util.image.ImageStrategy.choosePreferredImage; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.util.Log; +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.graphics.BitmapCompat; @@ -19,9 +22,11 @@ import com.squareup.picasso.RequestCreator; import com.squareup.picasso.Transformation; import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.Image; import java.io.File; import java.io.IOException; +import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.OkHttpClient; @@ -41,13 +46,12 @@ public final class PicassoHelper { @SuppressLint("StaticFieldLeak") private static Picasso picassoInstance; - private static boolean shouldLoadImages; public static void init(final Context context) { picassoCache = new LruCache(10 * 1024 * 1024); picassoDownloaderClient = new OkHttpClient.Builder() .cache(new okhttp3.Cache(new File(context.getExternalCacheDir(), "picasso"), - 50 * 1024 * 1024)) + 50L * 1024L * 1024L)) // this should already be the default timeout in OkHttp3, but just to be sure... .callTimeout(15, TimeUnit.SECONDS) .build(); @@ -87,47 +91,53 @@ public final class PicassoHelper { picassoInstance.setIndicatorsEnabled(enabled); // useful for debugging } - public static void setShouldLoadImages(final boolean shouldLoadImages) { - PicassoHelper.shouldLoadImages = shouldLoadImages; + + public static RequestCreator loadAvatar(@NonNull final List images) { + return loadImageDefault(images, R.drawable.placeholder_person); } - public static boolean getShouldLoadImages() { - return shouldLoadImages; - } - - - public static RequestCreator loadAvatar(final String url) { + public static RequestCreator loadAvatar(@Nullable final String url) { return loadImageDefault(url, R.drawable.placeholder_person); } - public static RequestCreator loadThumbnail(final String url) { + public static RequestCreator loadThumbnail(@NonNull final List images) { + return loadImageDefault(images, R.drawable.placeholder_thumbnail_video); + } + + public static RequestCreator loadThumbnail(@Nullable final String url) { return loadImageDefault(url, R.drawable.placeholder_thumbnail_video); } - public static RequestCreator loadDetailsThumbnail(final String url) { - return loadImageDefault(url, R.drawable.placeholder_thumbnail_video, false); + public static RequestCreator loadDetailsThumbnail(@NonNull final List images) { + return loadImageDefault(choosePreferredImage(images), + R.drawable.placeholder_thumbnail_video, false); } - public static RequestCreator loadBanner(final String url) { - return loadImageDefault(url, R.drawable.placeholder_channel_banner); + public static RequestCreator loadBanner(@NonNull final List images) { + return loadImageDefault(images, R.drawable.placeholder_channel_banner); } - public static RequestCreator loadPlaylistThumbnail(final String url) { + public static RequestCreator loadPlaylistThumbnail(@NonNull final List images) { + return loadImageDefault(images, R.drawable.placeholder_thumbnail_playlist); + } + + public static RequestCreator loadPlaylistThumbnail(@Nullable final String url) { return loadImageDefault(url, R.drawable.placeholder_thumbnail_playlist); } - public static RequestCreator loadSeekbarThumbnailPreview(final String url) { + public static RequestCreator loadSeekbarThumbnailPreview(@Nullable final String url) { return picassoInstance.load(url); } - public static RequestCreator loadNotificationIcon(final String url) { + public static RequestCreator loadNotificationIcon(@Nullable final String url) { return loadImageDefault(url, R.drawable.ic_newpipe_triangle_white); } - public static RequestCreator loadScaledDownThumbnail(final Context context, final String url) { + public static RequestCreator loadScaledDownThumbnail(final Context context, + @NonNull final List images) { // scale down the notification thumbnail for performance - return PicassoHelper.loadThumbnail(url) + return PicassoHelper.loadThumbnail(images) .transform(new Transformation() { @Override public Bitmap transform(final Bitmap source) { @@ -174,19 +184,29 @@ public final class PicassoHelper { } @Nullable - public static Bitmap getImageFromCacheIfPresent(final String imageUrl) { + public static Bitmap getImageFromCacheIfPresent(@NonNull final String imageUrl) { // URLs in the internal cache finish with \n so we need to add \n to image URLs return picassoCache.get(imageUrl + "\n"); } - private static RequestCreator loadImageDefault(final String url, final int placeholderResId) { + private static RequestCreator loadImageDefault(@NonNull final List images, + @DrawableRes final int placeholderResId) { + return loadImageDefault(choosePreferredImage(images), placeholderResId); + } + + private static RequestCreator loadImageDefault(@Nullable final String url, + @DrawableRes final int placeholderResId) { return loadImageDefault(url, placeholderResId, true); } - private static RequestCreator loadImageDefault(final String url, final int placeholderResId, + private static RequestCreator loadImageDefault(@Nullable final String url, + @DrawableRes final int placeholderResId, final boolean showPlaceholderWhileLoading) { - if (!shouldLoadImages || isBlank(url)) { + // if the URL was chosen with `choosePreferredImage` it will be null, but check again + // `shouldLoadImages` in case the URL was chosen with `imageListToDbUrl` (which is the case + // for URLs stored in the database) + if (isNullOrEmpty(url) || !ImageStrategy.shouldLoadImages()) { return picassoInstance .load((String) null) .placeholder(placeholderResId) // show placeholder when no image should load diff --git a/app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.java b/app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.java new file mode 100644 index 000000000..7106359b3 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.java @@ -0,0 +1,39 @@ +package org.schabi.newpipe.util.image; + +import android.content.Context; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.Image; + +public enum PreferredImageQuality { + NONE, + LOW, + MEDIUM, + HIGH; + + public static PreferredImageQuality fromPreferenceKey(final Context context, final String key) { + if (context.getString(R.string.image_quality_none_key).equals(key)) { + return NONE; + } else if (context.getString(R.string.image_quality_low_key).equals(key)) { + return LOW; + } else if (context.getString(R.string.image_quality_high_key).equals(key)) { + return HIGH; + } else { + return MEDIUM; // default to medium + } + } + + public Image.ResolutionLevel toResolutionLevel() { + switch (this) { + case LOW: + return Image.ResolutionLevel.LOW; + case MEDIUM: + return Image.ResolutionLevel.MEDIUM; + case HIGH: + return Image.ResolutionLevel.HIGH; + default: + case NONE: + return Image.ResolutionLevel.UNKNOWN; + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TextEllipsizer.java b/app/src/main/java/org/schabi/newpipe/util/text/TextEllipsizer.java new file mode 100644 index 000000000..184b73304 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/text/TextEllipsizer.java @@ -0,0 +1,193 @@ +package org.schabi.newpipe.util.text; + +import android.graphics.Paint; +import android.text.Layout; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.text.HtmlCompat; + +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.stream.Description; + +import java.util.function.Consumer; + + +import io.reactivex.rxjava3.disposables.CompositeDisposable; + +/** + *

    Class to ellipsize text inside a {@link TextView}.

    + * This class provides all utils to automatically ellipsize and expand a text + */ +public final class TextEllipsizer { + private static final int EXPANDED_LINES = Integer.MAX_VALUE; + private static final String ELLIPSIS = "…"; + + @NonNull private final CompositeDisposable disposable = new CompositeDisposable(); + + @NonNull private final TextView view; + private final int maxLines; + @NonNull private Description content; + @Nullable private StreamingService streamingService; + @Nullable private String streamUrl; + private boolean isEllipsized = false; + @Nullable private Boolean canBeEllipsized = null; + + @NonNull private final Paint paintAtContentSize = new Paint(); + private final float ellipsisWidthPx; + @Nullable private Consumer stateChangeListener = null; + @Nullable private Consumer onContentChanged; + + public TextEllipsizer(@NonNull final TextView view, + final int maxLines, + @Nullable final StreamingService streamingService) { + this.view = view; + this.maxLines = maxLines; + this.content = Description.EMPTY_DESCRIPTION; + this.streamingService = streamingService; + + paintAtContentSize.setTextSize(view.getTextSize()); + ellipsisWidthPx = paintAtContentSize.measureText(ELLIPSIS); + } + + public void setOnContentChanged(@Nullable final Consumer onContentChanged) { + this.onContentChanged = onContentChanged; + } + + public void setContent(@NonNull final Description content) { + this.content = content; + canBeEllipsized = null; + linkifyContentView(v -> { + final int currentMaxLines = view.getMaxLines(); + view.setMaxLines(EXPANDED_LINES); + canBeEllipsized = view.getLineCount() > maxLines; + view.setMaxLines(currentMaxLines); + if (onContentChanged != null) { + onContentChanged.accept(canBeEllipsized); + } + }); + } + + public void setStreamUrl(@Nullable final String streamUrl) { + this.streamUrl = streamUrl; + } + + public void setStreamingService(@NonNull final StreamingService streamingService) { + this.streamingService = streamingService; + } + + /** + * Expand the {@link TextEllipsizer#content} to its full length. + */ + public void expand() { + view.setMaxLines(EXPANDED_LINES); + linkifyContentView(v -> isEllipsized = false); + } + + /** + * Shorten the {@link TextEllipsizer#content} to the given number of + * {@link TextEllipsizer#maxLines maximum lines} and add trailing '{@code …}' + * if the text was shorted. + */ + public void ellipsize() { + // expand text to see whether it is necessary to ellipsize the text + view.setMaxLines(EXPANDED_LINES); + linkifyContentView(v -> { + final CharSequence charSeqText = view.getText(); + if (charSeqText != null && view.getLineCount() > maxLines) { + // Note that converting to String removes spans (i.e. links), but that's something + // we actually want since when the text is ellipsized we want all clicks on the + // comment to expand the comment, not to open links. + final String text = charSeqText.toString(); + + final Layout layout = view.getLayout(); + final float lineWidth = layout.getLineWidth(maxLines - 1); + final float layoutWidth = layout.getWidth(); + final int lineStart = layout.getLineStart(maxLines - 1); + final int lineEnd = layout.getLineEnd(maxLines - 1); + + // remove characters up until there is enough space for the ellipsis + // (also summing 2 more pixels, just to be sure to avoid float rounding errors) + int end = lineEnd; + float removedCharactersWidth = 0.0f; + while (lineWidth - removedCharactersWidth + ellipsisWidthPx + 2.0f > layoutWidth + && end >= lineStart) { + end -= 1; + // recalculate each time to account for ligatures or other similar things + removedCharactersWidth = paintAtContentSize.measureText( + text.substring(end, lineEnd)); + } + + // remove trailing spaces and newlines + while (end > 0 && Character.isWhitespace(text.charAt(end - 1))) { + end -= 1; + } + + final String newVal = text.substring(0, end) + ELLIPSIS; + view.setText(newVal); + isEllipsized = true; + } else { + isEllipsized = false; + } + view.setMaxLines(maxLines); + }); + } + + /** + * Toggle the view between the ellipsized and expanded state. + */ + public void toggle() { + if (isEllipsized) { + expand(); + } else { + ellipsize(); + } + } + + /** + * Whether the {@link #view} can be ellipsized. + * This is only the case when the {@link #content} has more lines + * than allowed via {@link #maxLines}. + * @return {@code true} if the {@link #content} has more lines than allowed via + * {@link #maxLines} and thus can be shortened, {@code false} if the {@code content} fits into + * the {@link #view} without being shortened and {@code null} if the initialization is not + * completed yet. + */ + @Nullable + public Boolean canBeEllipsized() { + return canBeEllipsized; + } + + private void linkifyContentView(final Consumer consumer) { + final boolean oldState = isEllipsized; + disposable.clear(); + TextLinkifier.fromDescription(view, content, + HtmlCompat.FROM_HTML_MODE_LEGACY, streamingService, streamUrl, disposable, + v -> { + consumer.accept(v); + notifyStateChangeListener(oldState); + }); + + } + + /** + * Add a listener which is called when the given content is changed, + * either from ellipsized to full or vice versa. + * @param listener The listener to be called, or {@code null} to remove it. + * The Boolean parameter is the new state. + * Ellipsized content is represented as {@code true}, + * normal or full content by {@code false}. + */ + public void setStateChangeListener(@Nullable final Consumer listener) { + this.stateChangeListener = listener; + } + + private void notifyStateChangeListener(final boolean oldState) { + if (oldState != isEllipsized && stateChangeListener != null) { + stateChangeListener.accept(isEllipsized); + } + } + +} diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java b/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java index e59a3dc05..1419ac85a 100644 --- a/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java @@ -92,7 +92,7 @@ public final class TextLinkifier { * {@link HtmlCompat#fromHtml(String, int)}. *

    * - * @param textView the {@link TextView} to set the the HTML string block linked + * @param textView the {@link TextView} to set the HTML string block linked * @param htmlBlock the HTML string block to be linked * @param htmlCompatFlag the int flag to be set when {@link HtmlCompat#fromHtml(String, * int)} will be called diff --git a/app/src/main/java/org/schabi/newpipe/views/player/CircleClipTapView.kt b/app/src/main/java/org/schabi/newpipe/views/player/CircleClipTapView.kt index e3d142916..8554e7194 100644 --- a/app/src/main/java/org/schabi/newpipe/views/player/CircleClipTapView.kt +++ b/app/src/main/java/org/schabi/newpipe/views/player/CircleClipTapView.kt @@ -80,10 +80,10 @@ class CircleClipTapView(context: Context?, attrs: AttributeSet) : View(context, updatePathShape() } - override fun onDraw(canvas: Canvas?) { + override fun onDraw(canvas: Canvas) { super.onDraw(canvas) - canvas?.clipPath(shapePath) - canvas?.drawPath(shapePath, backgroundPaint) + canvas.clipPath(shapePath) + canvas.drawPath(shapePath, backgroundPaint) } } diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java index 009a4f4be..42ff3ca8c 100755 --- a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java @@ -23,7 +23,6 @@ import android.os.Handler; import android.os.Handler.Callback; import android.os.IBinder; import android.os.Message; -import android.os.Parcelable; import android.util.Log; import android.widget.Toast; @@ -36,6 +35,7 @@ import androidx.core.app.NotificationCompat.Builder; import androidx.core.app.PendingIntentCompat; import androidx.core.app.ServiceCompat; import androidx.core.content.ContextCompat; +import androidx.core.content.IntentCompat; import androidx.preference.PreferenceManager; import org.schabi.newpipe.R; @@ -49,6 +49,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import us.shandian.giga.get.DownloadMission; import us.shandian.giga.get.MissionRecoveryInfo; @@ -359,29 +360,29 @@ public class DownloadManagerService extends Service { */ public static void startMission(Context context, String[] urls, StoredFileHelper storage, char kind, int threads, String source, String psName, - String[] psArgs, long nearLength, MissionRecoveryInfo[] recoveryInfo) { - Intent intent = new Intent(context, DownloadManagerService.class); - intent.setAction(Intent.ACTION_RUN); - intent.putExtra(EXTRA_URLS, urls); - intent.putExtra(EXTRA_KIND, kind); - intent.putExtra(EXTRA_THREADS, threads); - intent.putExtra(EXTRA_SOURCE, source); - intent.putExtra(EXTRA_POSTPROCESSING_NAME, psName); - intent.putExtra(EXTRA_POSTPROCESSING_ARGS, psArgs); - intent.putExtra(EXTRA_NEAR_LENGTH, nearLength); - intent.putExtra(EXTRA_RECOVERY_INFO, recoveryInfo); - - intent.putExtra(EXTRA_PARENT_PATH, storage.getParentUri()); - intent.putExtra(EXTRA_PATH, storage.getUri()); - intent.putExtra(EXTRA_STORAGE_TAG, storage.getTag()); + String[] psArgs, long nearLength, + ArrayList recoveryInfo) { + final Intent intent = new Intent(context, DownloadManagerService.class) + .setAction(Intent.ACTION_RUN) + .putExtra(EXTRA_URLS, urls) + .putExtra(EXTRA_KIND, kind) + .putExtra(EXTRA_THREADS, threads) + .putExtra(EXTRA_SOURCE, source) + .putExtra(EXTRA_POSTPROCESSING_NAME, psName) + .putExtra(EXTRA_POSTPROCESSING_ARGS, psArgs) + .putExtra(EXTRA_NEAR_LENGTH, nearLength) + .putExtra(EXTRA_RECOVERY_INFO, recoveryInfo) + .putExtra(EXTRA_PARENT_PATH, storage.getParentUri()) + .putExtra(EXTRA_PATH, storage.getUri()) + .putExtra(EXTRA_STORAGE_TAG, storage.getTag()); context.startService(intent); } private void startMission(Intent intent) { String[] urls = intent.getStringArrayExtra(EXTRA_URLS); - Uri path = intent.getParcelableExtra(EXTRA_PATH); - Uri parentPath = intent.getParcelableExtra(EXTRA_PARENT_PATH); + Uri path = IntentCompat.getParcelableExtra(intent, EXTRA_PATH, Uri.class); + Uri parentPath = IntentCompat.getParcelableExtra(intent, EXTRA_PARENT_PATH, Uri.class); int threads = intent.getIntExtra(EXTRA_THREADS, 1); char kind = intent.getCharExtra(EXTRA_KIND, '?'); String psName = intent.getStringExtra(EXTRA_POSTPROCESSING_NAME); @@ -389,7 +390,9 @@ public class DownloadManagerService extends Service { String source = intent.getStringExtra(EXTRA_SOURCE); long nearLength = intent.getLongExtra(EXTRA_NEAR_LENGTH, 0); String tag = intent.getStringExtra(EXTRA_STORAGE_TAG); - Parcelable[] parcelRecovery = intent.getParcelableArrayExtra(EXTRA_RECOVERY_INFO); + final var recovery = IntentCompat.getParcelableArrayListExtra(intent, EXTRA_RECOVERY_INFO, + MissionRecoveryInfo.class); + Objects.requireNonNull(recovery); StoredFileHelper storage; try { @@ -404,15 +407,11 @@ public class DownloadManagerService extends Service { else ps = Postprocessing.getAlgorithm(psName, psArgs); - MissionRecoveryInfo[] recovery = new MissionRecoveryInfo[parcelRecovery.length]; - for (int i = 0; i < parcelRecovery.length; i++) - recovery[i] = (MissionRecoveryInfo) parcelRecovery[i]; - final DownloadMission mission = new DownloadMission(urls, storage, kind, ps); mission.threadCount = threads; mission.source = source; mission.nearLength = nearLength; - mission.recoveryInfo = recovery; + mission.recoveryInfo = recovery.toArray(MissionRecoveryInfo[]::new); if (ps != null) ps.setTemporalDir(DownloadManager.pickAvailableTemporalDir(this)); diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index 23f1bf6a7..31e7f663d 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -490,7 +490,7 @@ public class MissionAdapter extends Adapter implements Handler.Callb showError(mission, UserAction.DOWNLOAD_POSTPROCESSING, R.string.error_postprocessing_failed); return; case ERROR_INSUFFICIENT_STORAGE: - msg = R.string.error_insufficient_storage; + msg = R.string.error_insufficient_storage_left; break; case ERROR_UNKNOWN_EXCEPTION: if (mission.errObject != null) { diff --git a/app/src/main/java/us/shandian/giga/util/Utility.java b/app/src/main/java/us/shandian/giga/util/Utility.java index 3cfa22bd9..c75269757 100644 --- a/app/src/main/java/us/shandian/giga/util/Utility.java +++ b/app/src/main/java/us/shandian/giga/util/Utility.java @@ -2,6 +2,8 @@ package us.shandian.giga.util; import android.content.Context; import android.os.Build; +import android.os.Environment; +import android.os.StatFs; import android.util.Log; import androidx.annotation.ColorInt; @@ -26,10 +28,8 @@ import java.io.ObjectOutputStream; import java.io.Serializable; import java.net.HttpURLConnection; import java.util.Locale; -import java.util.Random; import okio.ByteString; -import us.shandian.giga.get.DownloadMission; public class Utility { @@ -40,6 +40,20 @@ public class Utility { UNKNOWN } + /** + * Get amount of free system's memory. + * @return free memory (bytes) + */ + public static long getSystemFreeMemory() { + try { + final StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getPath()); + return statFs.getAvailableBlocksLong() * statFs.getBlockSizeLong(); + } catch (final Exception e) { + // do nothing + } + return -1; + } + public static String formatBytes(long bytes) { Locale locale = Locale.getDefault(); if (bytes < 1024) { diff --git a/app/src/main/res/layout-land/list_stream_card_item.xml b/app/src/main/res/layout-land/list_stream_card_item.xml new file mode 120000 index 000000000..70228ee1d --- /dev/null +++ b/app/src/main/res/layout-land/list_stream_card_item.xml @@ -0,0 +1 @@ +../layout/list_stream_item.xml \ No newline at end of file diff --git a/app/src/main/res/layout/comment_replies_header.xml b/app/src/main/res/layout/comment_replies_header.xml new file mode 100644 index 000000000..ed5ba1a10 --- /dev/null +++ b/app/src/main/res/layout/comment_replies_header.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_comments.xml b/app/src/main/res/layout/fragment_comments.xml index b1b644d8c..2a8c747cd 100644 --- a/app/src/main/res/layout/fragment_comments.xml +++ b/app/src/main/res/layout/fragment_comments.xml @@ -9,7 +9,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" - tools:listitem="@layout/list_comments_item" /> + tools:listitem="@layout/list_comment_item" /> + android:src="@drawable/ic_pin" /> + tools:text="Author Name, Lorem ipsum • 5 months ago" /> - + tools:text="@tools:sample/lorem/random[1]" /> + android:src="@drawable/ic_heart" /> - + android:layout_alignParentEnd="true" + android:layout_marginStart="@dimen/video_item_detail_heart_margin" + android:minHeight="0dp" + tools:text="543 replies" /> diff --git a/app/src/main/res/layout/list_comments_mini_item.xml b/app/src/main/res/layout/list_comments_mini_item.xml deleted file mode 100644 index 606a237c5..000000000 --- a/app/src/main/res/layout/list_comments_mini_item.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/playlist_header.xml b/app/src/main/res/layout/playlist_header.xml index 9c038db3a..c761240d9 100644 --- a/app/src/main/res/layout/playlist_header.xml +++ b/app/src/main/res/layout/playlist_header.xml @@ -80,10 +80,32 @@ tools:text="234 videos" /> + + + + + android:layout_below="@id/playlist_description_read_more"> - + android:id="@+id/summary" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + android:clickable="false" + android:focusable="false" + android:gravity="center" + android:text="@string/notification_actions_summary" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + - + - + - + - + - + diff --git a/app/src/main/res/menu/menu_recaptcha.xml b/app/src/main/res/menu/menu_recaptcha.xml index 89fa024d0..fd614df32 100644 --- a/app/src/main/res/menu/menu_recaptcha.xml +++ b/app/src/main/res/menu/menu_recaptcha.xml @@ -5,6 +5,6 @@ diff --git a/app/src/main/res/values-ar-rLY/strings.xml b/app/src/main/res/values-ar-rLY/strings.xml index 1fd5b15c9..c57ead36a 100644 --- a/app/src/main/res/values-ar-rLY/strings.xml +++ b/app/src/main/res/values-ar-rLY/strings.xml @@ -2,17 +2,860 @@ استخدم مشغل فيديو خارجي مشاركة مع - اعدادات + الإعدادات بحث تنزيل ملف البث - تحميل - مشاركه + تنزيل + إعادة النشر فتح في نافدة منبثقة افتح في المتصفح إلغاء تثبيت - لم يتم العثور على مشغل بث (يمكنك تثبيت VLC لتشغيله). + لم يتم العثور على مشغل بث (يمكنك تثبيت VLC لتشغيلها). لم يتم العثور على مشغل بث. يرجى تثبيت VLC؟ تم النشر في %1$s - انقر على \"بحث\" للبدء + اضغط على عدسة المكبرة للبدء. + جودة الصورة + لا تتوفر تدفقات فيديو للاعبين الخارجيين + تعطيل تحديد النص في الوصف + + لم يتم حذف أي تنزيل + تم حذف تنزيل واحد + تم حذف تنزيلَيْن + تم حذف %1$s تنزيلات + تم حذف %1$s تنزيلاً + تم حذف %1$s تنزيل + + زر الإجراء الثاني + الافتراضي + الفيديوهات + إلغاء + تطبيق مجاني خفيف البث على أندرويد. + التاريخ + إيقاف التحميل مؤقتًا + قم بقص الصورة المصغرة للفيديو الموضحة في الإشعار من نسبة العرض إلى الارتفاع 16: 9 إلى 1: 1 + التحديثات + تعليق مثبت + إزالة ما تمت مشاهدته + استرد + قم بتشغيل \"وضع تقييد المحتوى\" في يوتيوب + + لا ساعة + ساعة واحدة + ساعتان + %d ساعات + %d ساعة + %d ساعة + + حذف سجل المشاهدة بالكامل؟ + تشغيل بواسطة كودي + تم حذف عنصر واحد. + ضع في اعتبارك أن هذه العملية يمكن أن تكون مكلفة اذا كنت تستخدم بيانات اشتراك انترنت. +\n +\nهل تريد الاستمرار؟ + إغلاق + يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك، لا يجمع التطبيق أي بيانات دون موافقتك. +\nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير الأعطال. + + لاشيء مُحدّد + واحدة محددة + إثنتان محدَّدتان + %d محددة + %d محددة + %d محددة + + لا يوجد بث متاح للتنزيل + هل تريد استعادة الإعدادات الافتراضية؟ + تحميل المحتوى المطلوب + إضافة نموذج + تراخيص الجهات الخارجية + حذف كل مواقف التشغيل + عن التطبيق والأسئلة الشائعة + استيراد الاشتراكات أو تصديرها من القائمة المكونة من 3 نقاط + الملفات المحملة + لا يوجد مثل هذا الملف/مصدر المحتوى + الأكثر إعجابًا + بليون + تعذر تحميل موجز \'%s\'. + ؟ + التحقق من وجود تحديثات + مثيلات خوادم پيرتيوب + +100 فيديو + ألف + مثيل الخادم موجود بالفعل + طلب تأكيد قبل مسح قائمة الانتظار + المشتركون + تمت مشاهدتها جزئيا + إضافة إلى + رابط غير مدعوم + تبرَّع + الحصول على إشعار + إذاعة + + لا تنزيل اكتَمَل + اكتَمَل تنزيل واحد + تنزيلان اكتَمَلَا + %s تنزيلات اكتَمَلت + %s تنزيلًا اكتَمَل + %s تنزيل اكتَمَل + + سرعة الأداء + إزالة الإشارة المرجعية + تم إنشاء قائمة التشغيل + وحدة التخزين الخارجية غير متوفرة + عرض المعلومات + الشائعة + تم إلغاء الاشتراك في القناة + تخزين طلبات البحث محليًّا + تلوين الإشعارات + توليد تلقائي + لا يمكن التحقق من صحة المثال + عرض خيار التشغيل بواسطة كودي + الوضع السريع + إظهار الموجزات التالية + معظم الأحرف الخاصة + إزالة جميع بيانات صفحات الويب المخزنة مؤقّتًا + محو سجل البحث + إظهار تفاصيل القناة + + لا مُشاهِد + مُشاهِد واحد + مُشاهِدان + %s مُشاهِدين + %s مُشاهِدًا + %s مُشاهِد + + عرض تلميح عند الضغط على زر استخدام المشغل الخلفي أو النافذة المنبثقة في صفحة تفاصيل الفديو + نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا + انتهى وقت الاتصال + غير معروف + تشغيل تلقائي + الإجراء الافتراضي عند فتح المحتوى — %s + إعدادات الصوت + إشعارات أحداث البث الجديدة + الحد الأقصى لعدد المحاولات قبل إلغاء التحميل + تفضيل قائمة التشغيل + الألسنة التي سيتم عرضها على صفحات القناة + إزالة التكرارات؟ + تعليقك (باللغة الإنجليزية): + تصدير إلى + حساب التجزئة + إظهار/إخفاء الموجزات + مِن الأفضل فتحه بـ + الخصوصيّة + لا يمكن الكتابة فوق الملف + الفيديوهات + اسحب لإعادة ترتيب + إظهار \"تعطل المشغل\" + يمكنك الآن تحديد نص داخل الوصف. لاحظ أن الصفحة قد تومض وقد لا تكون الروابط قابلة للنقر أثناء وضع التحديد. + تم وضع التالي على قائمة الانتظار + اسحب العناصر لإزالتها + معلومات: + حساب منشئ المحتوى قد تم إنهائه. +\nلن يتمكن NewPipe من تحميل هذه الخلاصة في المستقبل. +\nهل تريد إلغاء الاشتراك من هذه القناة؟ + تصغير إلى مشغل منبثق + تم إغلاق NewPipe أثناء العمل على الملف + مشغل الخلفية + وصفي + تذكر خصائص النوافذ المنبثقة + الإبلاغ عن طريق البريد الإلكتروني + عذرًا، لم ينبغِ أن يحدث ذلك. + إنشاء قائمة تشغيل جديدة + حدث خطأٌ ما: %1$s + لم يتم العثور على نتائج + فتح الموقع + + لا موجَزات + موجَز واحد + موجَزان + %s موجَزات + %s موجَزًا + %s موجز + + وضع الجهاز اللوحي + تعذر التعرف على الرابط. فتح باستخدام تطبيق آخر؟ + تم مسح ملفات تعريف الارتباط reCAPTCHA + التفاصيل + تشغيل قائمة الانتظار + تعيين كصورة مصغرة لقائمة التشغيل + العدد الأقصى للمحاولات + عذرًا، حدث خطأ ما. + عرض على GitHub + التفاصيل: + تردد الصوت + هل تعتقد أن تحميل التغذية بطيءٌ جدًا؟ إذا كان الأمر كذلك، فحاول تمكين التحميل السريع (يمكنك تغييره في الإعدادات أو بالضغط على الزر أدناه). +\n +\nيقدم NewPipe استراتيجيتين لتحميل الخلاصة: +\n• جلب قناة الاشتراك بأكملها، وهي بطيئة ولكنها كاملة. +\n• استخدام نقطة نهاية خدمة مخصصة، وهي سريعة ولكنها عادةً لا تكتمل. +\n +\nالفرق بين الاثنين هو أن العنصر السريع عادة ما يفتقر إلى بعض المعلومات، مثل مدة العنصر أو نوعه (لا يمكن التمييز بين مقاطع الفيديو المباشرة والأخرى العادية) وقد يعيد عناصر أقل. +\n +\nيوتيوب هو مثال على الخدمة التي تقدمها هذه طريقة سريعة مع تغذية RSS الخاصة بها. +\n +\nلذا فإن الاختيار يتلخص في ما تفضله: السرعة أو المعلومات الدقيقة. + تم حذف الملف + تنزيل + صفحة القناة + تصدير السجل، وقوائم تشغيل، والإعدادات، والاشتراكات + هل تريد حذف قائمة التشغيل هذه؟ + اللغة الإفتراضية للمحتوى + جاري المعالجة ... قد يستغرق لحظة + قراءة الرخصة + ألسنة القنوات + معاينة مصغرة على شريط التمرير + ما الجديد + آخر تحديث للموجز: %s + الخطأ + زر الإجراء الخامس + جديد وساخن + استعمال التقديم السريع الغير دقيق + التنزيل + امنح الإذن بالعرض فوق التطبيقات الأخرى + داخلي + مستوى الصوت + إزالة التكرارات + تبديل الكل + فشلت المعالجة الاولية + انقر للحصول على التفاصيل + اختر الاقتراحات التي تريد إظهارها عند البحث + إنشاء + الحروف والأرقام + هل تقصد \"%1$s\"؟ + عناصر الموجز الجديدة + المميزة + عرض المحتوى الذي يُحتمل أن يكون غير مناسب للأطفال لأن له حدًا عمريًا (مثل 18+) + بدأ التشغيل في الخلفية + ستتغير اللغة بمجرد إعادة تشغيل التطبيق + القصيرة + قوائم التشغيل + تنظيف + اختيار مثيل + كلها + مجموعات القنوات + جارٍ معالجة الموجز… + + لا فيديو + فيديو واحد + فيديوهاتان + %s فيديوهات + %s فيديوهات + %s فيديو + + جودة منخفضة (أصغر) + إظهار خطأ + عرض دقّات أعلى + تحتوي قوائم التشغيل رمادية اللون بالفعل على هذا العنصر. + تمت إضافتها إلى قائمة التشغيل + + اليوم + منذ يوم واحد + منذ يومَين + منذ %d أيام + منذ %d يومًا + منذ %d يوم + + تقرير على GitHub + أسود + بث جديد + معرفك, soundcloud.com/هويتك + ضغط مطول للإدراج الى قائمة الانتظار + خاص + اغلق التطبيق قسريا + تعذر استيراد الاشتراكات + إيقاف مؤقت + تعذر تحميل التعليقات + اقتراحات البحث عن بعد + استخدم ميزة فك ترميز وحدة فك التشفير الاحتياطية في ExoPlayer + يلغي السجل الحالي والاشتراكات وقوائم التشغيل والإعدادات (اختياريًا) + تعطل التطبيق / واجهة المستخدم + إعادة التسمية + لم يتبقى مساحة في الجهاز + تعذر إعداد قائمة التنزيل + اختر مجلد التنزيل لملفات الفيديو + تم تعطيل الإشعارات + هل تريد حذف هذه المجموعة؟ + المظهر + تشغيل + يحذف تاريخ البحث عن الكلمات الرئيسية + التنبيهات المتعلقة بالإبلاغ عن الأخطاء + نسخة احتياطية + حدث خطأ للمشغل غير قابل للاسترداد + زر الإجراء الرابع + القادمة + [غير معروف] + الحُلّة الليلية + داكن + المحتوى الإفتراضي حسب البلد + رافع الصورة الرمزية المصغرة + بدون + استمر عند إنهاء قائمة التشغيل (الغير المتكررة) من خلال إلحاق التدفق المرتبط + ملء الشاشة + لم يُختر أي اشتراك + + لا مشارك + مٌشارِك واحد + مُشارِكان + %s مشارِكين + %s مشارِكون + %s مشارك + + جلب البيانات الوصفية… + إظهار مؤشرات الصور + انقر للتنزيل %s + تعطيل الوضع السريع + , + صفحة قائمة التشغيل + تبديل تدوير الشاشة + تحديث NewPipe متاح! + تم حذف سجل البحث + قم بإيقاف التشغيل لإخفاء مربعات المعلومات الوصفية بمعلومات إضافية حول منشئ البث أو محتوى البث أو طلب البحث + إشعارات لتقدم تجزئة الفيديو + تحطيم المشغل + الصوت + بدء التنزيلات + مشترك + لا يمكن إنشاء المجلد الوجهة + يتم تخزين الملفات الصوتية التي تم تنزيلها هنا + لا شيء + الإطلاع على سياسة الخصوصية + يوفر YouTube \"وضع تقييد المحتوى\" الذي يخفي المحتوى المحتمل للكبار + عطّله لإخفاء التعليقات + واجه NewPipe خطأ، اضغط للتقرير + الكشك الافتراضي + اقتراحات البحث + تسريع إلى الأمام أثناء الصمت + إدارة بعض إعدادات ExoPlayer. تتطلب هذه التغييرات إعادة تشغيل المشغل لتصبح سارية المفعول + تمت إضافة وقت (أوقات) مكررة %d + فقط بعض الأجهزة تدعم تشغيل مقاطع فيديو 2K/4K + استيراد قاعدة البيانات + جودة منخفضة + موضع الألسنة الرئيسية + استخدم مشغل صوت خارجي + تعذر تغيير حالة الاشتراك + أحذف + فصول + استخدام منتقي مجلد النظام (SAF) + متوفر في بعض الخدمات، وعادةً ما يكون أسرع بكثير ولكن قد يُرجع كمية محدودة من العناصر وغالبًا ما تكون معلومات غير مكتملة (مثلًا بدون مدة أو نوع عنصر أو حالة مباشرة) + اجعل أندرويد يخصص لون الإشعار وفقا للّون الرئيسي في الصورة المصغرة (لاحظ أن هذا غير متوفر على جميع الأجهزة) + يتم التشغيل في الخلفية + الخادم لا يقوم بإرسال البيانات + سياسة خصوصية NewPipe + طلب اختبار الكابتشا مطلوب + إذا كنت تواجه مشكلة في استخدام التطبيق ، فتأكد من مراجعة هذه الإجابات للأسئلة الشائعة! + التحميلات + هل تريد إزالة جميع التدفقات المكررة في قائمة التشغيل هذه؟ + قد تتسبب مراقبة تسرب الذاكرة في عدم استجابة التطبيق عند تفريغ السجلات + تم فقد التقدم بسبب حذف الملف + التسمية + الانتقال إلى وضع ملئ الشاشة + لا يمكن الاتصال بالخادم + إظهار تسرب الذاكرة + + صفر ثانية + ثانية واحدة + ثانيتان + %d ثوانٍ + %d ثانية + %d ثانية + + سيتم سؤالك عن مكان حفظ كل تنزيل. +\nتمكين منتقي مجلد النظام (SAF) إذا كنت تريد التنزيل إلى بطاقة SD خارجية + استئناف التشغيل + جودة غير معروفة + هذا المحتوى غير متوفر في بلدك. + خطأ في الشبكة + محتوى الشاشة الرئيسية + إيقاف + الوسوم + المضيف + ابحث عن مثيلات الخوادم التي تناسبك على %s + مطلوب اتصال الشبكة + تشغيل التحقق من وجود تدفقات جديدة + دون مشاهدات + بدأ التشغيل في نافذة منبثقة + قائمة انتظار تلقائيّة + غير محمل: %d + قائمة الانتظار + هذا الفيديو مقيد بالفئة العمرية. +\nنظرًا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن لـ NewPipe الوصول إلى أي من تدفقات الفيديو الخاصة به، وبالتالي لا يتمكن من تشغيلها. + إضافة إلى قائمة التشغيل + القنوات + لا تظهر + أدخل عنوان للمثيل + ماذا:\\nطلب:\\nلغة المحتوى:\\nبلد المحتوى:\\nلغة التطبيق:\\nالخدمات:\\nتوقيت جرينتش:\\nالحزمة:\\nالإصدار:\\nOS نسخة: + يزيل الصوت في بعض الجودات + جلب ألسنة القنوات + جودة عالية (أكبر) + أسئلة مكررة + لم يتم تعيين مجلد التحميل، الرجاء اختيار مجلد التحميل الافتراضي الآن + عتبة تحديث الموجز + يمكنك اختيار نسقك الليلي المفضل أدناه + أنت تقوم بتشغيل أحدث إصدار من NewPipe + احذف + رفض + ابدأ + تحليل + إظهار الوصف + مرة واحدة فقط + الصور الرمزية + معدل البحث + قم بتمكين هذا الخيار إذا كانت لديك مشكلات في تهيئة وحدة فك التشفير ، والتي تعود إلى أجهزة فك التشفير ذات الأولوية الأقل إذا فشلت تهيئة وحدات فك التشفير الأولية. قد ينتج عن ذلك أداء تشغيل ضعيف مقارنة باستخدام وحدات فك التشفير الأساسية + تم محو ذاكرة التخزين المؤقتّة للبيانات الوصفيّة + وضع علامة تمت مشاهدته + اجراء الإيماءة اليمنى + الرموز المسموح بها في أسماء الملفات + %1$s %2$s + آخر ما تم تشغيله + استخدم دائمًا الحل البديل لإعداد سطح إخراج فيديو ExoPlayer + البث التالي + تم تعطيل نفق وسائل الإعلام عن طريق التقصير على جهازك لأن نموذج جهازك معروف بأنه لا يدعمه. + الصور الرمزية للقناة الفرعية + بث مباشر + هل تريد أيضا استيراد الإعدادات؟ + امسح البيانات الوصفيّة المخزّنة مؤقّتًا + حذف الملفات المحملة + يقوم هذا الحل البديل بتحرير وإعادة إنشاء نماذج برامج ترميز الفيديو عند حدوث تغيير في السطح، بدلا من تعيين السطح إلى برنامج الترميز مباشرة. تم استخدام هذا الإعداد بالفعل بواسطة ExoPlayer على بعض الأجهزة التي تعاني من هذه المشكلة ، وهذا الإعداد له تأثير فقط على Android 6 والإصدارات الأحدث +\n +\nقد يؤدي تمكين هذا الخيار إلى منع أخطاء التشغيل عند تبديل مشغل الفيديو الحالي أو التبديل إلى وضع ملء الشاشة + موافق + تتبّع مقاطع الفيديو التي تمّت مشاهدتها + لم يتم العثور على أي بث صوتي + تم تغيير الصورة المصغرة لقائمة التشغيل. + توقف + فاتح + التاريخ + تشغيل في وضع منبثق + كتم الصوت + هذا الإذن مطلوب +\nللفتح في وضع النافذة المنبثقة + الموجز + ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل. +\nهل أنت واثق؟ لا يمكن التراجع عن هذا! + عدم الإعجاب + مشاهدة على الموقع + هذا الخيار متاح فقط إذا تم تحديد %s للسمة + إعادة المحاولة + المشغل + الفنانين + بدأ التنزيل + يجب أن يكون هناك مسار صوتي موجود بالفعل في هذا البث + هذا المحتوى خاص، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe. + الدقة الافتراضية للنوافذ المنبثقة + تم إفراغ مساحة ذاكرة التخزين المؤقتة الخاصة بالصور + إشعار الإبلاغ عن الأخطاء + لغة التطبيق + تحميل الموجز… + التحقق يدويا من وجود إصدارات جديدة + لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. +\nالرجاء تثبيت مدير ملفات متوافق مع إطار عمل الوصول إلى التخزين + إظهار خيار تعطل عند استخدام المشغل + يرجى مراجعة ما إذا توجد بالفعل مشكلة تناقش التحطم الموجود بالفعل. عند إنشاء تذاكر مكررة، فإنك تستغرق منا وقتًا يمكن أن نقضيه في إصلاح الخطأ الفعلي. + فتح قائمة انتظار التسغيل + قم بتحرير كل إشعار أدناه من خلال النقر عليه. حدد ما يصل إلى ثلاثة منها لتظهر في الإشعار المضغوط باستخدام مربعات الاختيار الموجودة على اليمين + ماذا حدث: + ترجمات نصية توضيحية + الصورة الرمزية للقناة + جلب من موجز مخصص عندما يكون متاحًا + لا يمكن أن يكون اسم الملف فارغًا + حدد المسار الصوتي الأصلي بغض النظر عن اللغة + الإشعارات + الفيديو والصوت + جديد + إزالة مقاطع الفيديو التي تمت مشاهدتها؟ + الالبومات + المسارات + حدد مثيلات PeerTube المفضلة لديك + إشعار المشغل + خاصية التقديم الغير دقيق تسمح للمشغل بالقفز خلال الفديو بشكل أسرع مع دقة قفز أقل. خاصية القفز ل5، 15 او 25 لا تعمل مع القفز الغير دقيق + متوقف + نافذة منبثقة + قم باستيراد ملف تعريف SoundCloud عن طريق كتابة عنوان URL أو معرفك: +\n +\n1. تمكين \"وضع سطح المكتب\" في متصفح الويب (الموقع غير متاح للأجهزة المحمولة) +\n2. انتقل إلى عنوان URL هذا: %1$s +\n3. تسجيل الدخول عندما يطلب منك +\n4. انسخ عنوان URL للملف الشخصي الذي تمت إعادة توجيهك إليه. + اختر قائمة تشغيل + الحد العمري + لا يوجد تطبيق على جهازك يمكنه فتح هذا + يُرجى الإنتظار… + تبديل الخدمة، المحدد حاليًا: + سجل المشاهدة + لا تقم بتحميل الصور + الإخطار بأحداث البث الجديدة من الاشتراكات + اسم الملف + الملف غير موجود أو الإذن بالقراءة أو الكتابة إليه غير موجود + عرض مقاطع الفيديو \"التالية\" و \"المشابهة\" + الوقت بعد التحديث الأخير قبل اعتبار الاشتراك قديمًا — %s + استرداد المشغل من الخطأ + عالية الجودة + حدد الجودة للمشغلين الخارجيين + أُعجب بها منشئ المحتوى + عن + عرض نتائج ل: %s + افتح باستخدام + هل تريد حذف هذا العنصر من سجل البحث؟ + الأكثر تشغيلا + عرض الوقت الأصلي على العناصر + استعادة مِن + الدقة الافتراضية + استئناف التشغيل + تقديم المحتوى + قد يؤدي التبديل من مشغل إلى آخر إلى استبدال قائمة الانتظار الخاصة بك + يتم تخزين ملفات الفيديو التي تم تنزيلها هنا + إشعار تجزئة الفيديو + حدد مسار الصوت للمشغلات الخارجية + استخدم الصورة المصغرة لكل من خلفية شاشة القفل والإشعارات + تراجع + تنسيق غير معروف + الألبومات + لا توجد تدفقات صوتية متاحة للمشغلات الخارجية + محلي + إعادة المحتوى + سيميتون + إعادة التشغيل + يوجد ملف بهذا الاسم مسبقاً + قم بإيقاف التشغيل لإخفاء وصف الفيديو والمعلومات الإضافية + صيغة الفيديو الافتراضية + زر الإجراء الثالث + لا يمكن التنزيل على بطاقة SD الخارجية. هل تريد إعادة تعيين موقع مجلد التنزيل؟ + تعذر تحميل كافة الصور المصغرة + التيارات ذات الصلة + لا يمكن استرداد هذا التنزيل + إظهار الاشتراكات غير المجمعة فقط + حذف محفوظات البثوث التي تم تشغيلها ومواقف التشغيل + في قائمة الانتظار + تمكين الوضع السريع + مدبلجة + اقتراحات البحث المحلية + اقتصاص الصورة المصغرة إلى نسبة العرض إلى الارتفاع 1:1 + تم تعطيل التعليقات + موقع الويب + سجل البحث + فتح الدرج + ∞ فيديو + الخادم لا يقبل التنزيل المتعدد، إعادة المحاولة مع @string/msg_threads = 1 + إعادة تعيين + تذكر آخر مكان وحجم للنافذة المنبثقة + تمت عملية التصدير + تعذر تحليل الموقع + الألسنة التي سيتم جلبها عند تحديث الموجز. ليس لهذا الخيار أي تأثير إذا تم تحديث القناة باستخدام الوضع السريع. + قم بإنشاء تنبيه بالخطأ + إشعارات لإصدار NewPipe الجديد + استعادة الضبط الافتراضي + المقاطعة على الشبكات المقيسة + هذا سوف يُزيل إعداداتك الحالية. + + لا مشاهدة + مشاهدة واحدة + مُشاهَدتان + %s مُشاهَدات + %s مُشاهَدةً + %s مُشاهَدة + + إستيراد + الأحداث + حذف مواقف التشغيل + زر الإجراء الأول + لاشيء + تلقائي (سمة الجهاز) + يتم الآن استخدام الألسنة الافتراضية بعد حدوث خطأ أثناء قراءة الألسنة المحفوظة + تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل التطبيق لتصبح التغييرات سارية المفعول + المحتوى غير متوفر + دائماً + حدد مسارًا صوتيًا يحتوي على أوصاف للأشخاص ضعاف البصر إذا كان ذلك متاحًا + لا حدود + مدة, تشغيل الفيديو: + محو سجل المشاهدة + إجراء الإيماءة اليسرى + لاتوجد فيديوهات + تنبيهات NewPipe + محو جميع الملفات التي تم تنزيلها من القرص؟ + اضغط على \"تم\" عند حلها + لا أحد يستمع + تكرار + إضافة إلى قائمة الانتظار + يقوم نيوبايب بالتنزيل + النوعية متوسطة + يسمح \"Storage Access Framework\" بالتنزيل على بطاقة SD خارجية + تنبيه: تعذر استيراد كافة الملفات. + مجلد الصوتيات المحفوظة + الإشارات المرجعية + حذف كل مواقف التشغيل؟ + تفضل الصوت الوصفي + خلط + بدء التشغيل تلقائياً — %s + إغلاق الدرج + هذا المحتوى ليس مدعومًا من قبل NewPipe. +\n +\nنأمل أن يكون مدعومًا في التحديثات القادمة. + + لا دقيقة + دقيقة واحدة + دقيقتان + %d دقائق + %d دقيقة + %d دقيقة + + المشغل المنبثق + الصورة الرمزية للرفع + التوقيع + محتوى مقيد للبالغين + متابعة التشغيل بعد المقاطعات (مثل المكالمات الهاتفية) + عملية الاستعادة جارية … + قم بتغيير حجم الفاصل الزمني للتحميل على المحتويات التدريجية (حاليا %s). قد تؤدي القيمة المنخفضة إلى تسريع التحميل الأولي + تفضيل الصوت الأصلي + الإعجابات + خطأ + اختر مجلد التنزيل للملفات الصوتية + استيراد اشتراكات YouTube من Google takeout: +\n +\n1. انتقل إلى عنوان URL هذا: %1$s +\n2. تسجيل الدخول عند سؤالك +\n3. انقر على \"جميع البيانات المدرجة\"، ثم على \"إلغاء تحديد جميع\"، ثم حدد فقط \"الاشتراكات\" وانقر على \"موافق\" +\n4. انقر على \"الخطوة التالية\" ثم على \"إنشاء التصدير\" +\n5. انقر على زر \"تحميل\" بعد ظهوره +\n6. انقر على IMPORT FILE أدناه وحدد الملف البريدي تحميلها +\n7. [إذا فشل استيراد الرمز البريدي] استخراج ملف .csv (عادة تحت عنوان \"يوتيوب ويوتيوب الموسيقى / الاشتراكات / الاشتراكات.csv\")، انقر على IMPORT FILE أدناه وحدد ملف csv المستخرج + جارٍ التحميل + هذا مسار SoundCloud Go+، على الأقل في بلدك، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe. + فقط على شبكة Wi-Fi + إظهار الصورة المصغرة + ضوابط سرعة التشغيل + رد الجميل + تم حذف سجل المشاهدة + سجل المشاهَدة و ذاكرة التخزين المؤقتة + النسبة المئوية + تحدي الكابتشا + ليس هناك مشترِكون + يتوفر هذا المحتوى فقط للمستخدمين الذين قاموا بالدفع، لذلك لا يمكن بثه أو تنزيله عبر NewPipe. + حديثة + تعذر تحديث الاشتراك + سيتم استبدال قائمة انتظار للمشغل النشط + التقسيم + اشتراك + أنشأها %s + الحرف الإستبدالي + وضع مظهر ”عرض القائمة“ + بدء تشغيل المشغل الرئيسي في وضع ملء الشاشة + تصغير عند تبديل التطبيق + الصوت : %s + خطوة + حل + %s يقدم هذا السبب: + الدفق المحدد غير مدعوم من قبل المشغلون الخارجيون + عن تطبيق نيوپايپ + تسريع إلى الأمام/-ترجيع وقت البحث + تم رفضها من قبل النظام + ليس هناك تعليقات + مليون + جاري التحقق من وجود تحديثات… + المحتوى + اسأل عن مكان التنزيل + معطل + خطأ في تحميل الخلاصة + الإخطارات حول التدفقات الجديدة للاشتراكات + لا توجد مشاهدة + الإنتقال إلى التشغيل في الخلفية + المستخدمين + القائمة + لا يمكن تشغيل هذا البث + امسح ملفات تعريف الارتباط reCAPTCHA + اللافتات + ساهم + الإجراء عند التبديل إلى تطبيق آخر من مشغل الفيديو الرئيسي — %s + قوائم التشغيل + عامة + قم بتعطيل نفق الوسائط إذا واجهت شاشة سوداء أو تقطيع اثناء تشغيل الفيديو. + يوجد ملف تحميل بهذا الاسم موجود مسبقاً + تلقائي + هل تريد محو سجل التنزيل، أم تريد حذف جميع الملفات التي تم تنزيلها؟ + أفضل دقة + فرز + الشبكة + استعادة آخر موقف تشغيل + تم إنهاء الحساب + اختر إيماءة للنصف الأيمن من شاشة المشغل + الحصول على المعلومات… + الكتابة فوق + نقل الملف أو حذفه + الأغاني + تطبيق Kore غير موجود. هل تريد تثبيته؟ + هنالك تحميل قيد التقدم بهذا الاسم + الإنتقال إلى الرئيسية + صيغة الصوت الافتراضية + حدث خطأ، انظر للإشعار + الفيديو + مفيد عند التبديل إلى بيانات الجوال، ولكن لا يمكن تعليق بعض التنزيلات + انقل محدد اللسان الرئيسي إلى الأسفل + LeakCanary غير متوفر + عدد المشتركين غير متاح + حدد الاشتراكات + الاشتراكات + NewPipe هو برنامج مفتوح المصدر وبحقوق متروكة: يمكنك استخدام الكود ودراسته وتحسينه كما شئت. وعلى وجه التحديد يمكنك إعادة توزيعه / أو تعديله تحت شروط رخصة GNU العمومية والتي نشرتها مؤسسة البرمجيات الحرة، سواء الإصدار 3 من الرخصة، أو (باختيارك) أي إصدار أحدث. + اعرض خيار لتشغيل الفيديو عبر مركز وسائط Kodi + قيد المعالجة + إعادة تسمية + لا يمكن إنشاء الملف + حد قائمة انتظار التنزيل + أي شبكة + فشل التنزيل + الافتراضي ExoPlayer + تنظيف تاريخ التحميل + هناك تنزيل معلق بهذا الاسم + انتهى + أُضيف مؤخرًا + يتم استبدال الرموز غير المسموح بها بهذه القيمة + لا شيء هنا سوى الصراصير + مُنشأة تلقائيًا (لم يتم العثور على رافع) + المسار الصوتي + مفيد ، على سبيل المثال ، إذا كنت تستخدم سماعة رأس بأزرار مادية مكسورة + المشغل الخارجي لا يدعم هذه الأنواع من الروابط + ستكون النصوص الأصلية من الخدمات مرئية في عناصر البث + الإنتقال إلى التشغيل في النافذة المنبثقة + تعذر العثور على الخادم + تقرير الأخطاء خارج دورة الحياة + البطاقة + حدد كشك + لا يوفر وضع الموجز السريع مزيدًا من المعلومات حول هذا الموضوع. + يرجى تحديد مجلد التنزيل لاحقا في الإعدادات + سيتم سؤالك عن مكان حفظ كل تنزيل + لاتوجد بثوث مباشرة + صفحة فارغة + أبدا + فشل النسخ إلى الحافظة + من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR)، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية. +\nويجب عليك قبولها لإرسال تقرير الأخطاء إلينا. + فرض الإبلاغ عن استثناءات Rx غير القابلة للتسليم خارج دورة حياة الجزء أو النشاط بعد التخلص منها + ضبط إشعار مشغل البث الحالي + تصدير قاعدة البيانات + إلغاء تعيين الصورة المصغرة الدائمة + تعليقات + تكبير + الصنف + تناسب مع الشاشة + إظهار مؤشّرات وضع التشغيل في القوائم + اختر جودة الصور وما إذا كنت تريد تحميل الصور على الإطلاق، لتقليل استخدام البيانات والذاكرة. تؤدي التغييرات إلى مسح ذاكرة التخزين المؤقت للصور الموجودة في الذاكرة وعلى القرص — %s + حجم الفاصل الزمني لتحميل التشغيل + حذف سِجل البحث بالكامل؟ + اللغة + السلوك + لا يوجد مثل هذا المجلد + شغِّل + إلغاء الإرتباط (قد يسبب تشويه) + امسح البيانات + لا توجد إشارات مرجعية لقائمة التشغيل بعدُ + يتم تطوير NewPipe من قبل متطوعين يقضون وقت فراغهم لتقديم أفضل تجربة لك. حان الوقت لرد المساعدة مع المطورين وجعل NewPipe أكثر و أفضل بينما يستمتعون بفنجان من القهوة. + إظهار التعليقات + تم نسخه إلى الحافظة + المزيد من الخيارات + وضع البث القادم تلقائيا في قائمة الإنتظار + الدعم + ملف مضغوط ZIP غير صالح + غير موجود + حدد موضوعك الليلي المفضل — %s + صفحة الكشك + + لا مُستمِع + مُستَمِع واحد + مُستمِعان + %s مُستَمِعين + %s مُستَمِعًا + %s مستمع + + غير مدرج + المؤتمرات + إستيراد ملف + إظهار خطأ snackbar + قم بزيارة موقع NewPipe لمزيد من المعلومات والمستجدات. + لم يتم الاشتراك في أي قناة بعد + لا تبدأ تشغيل مقاطع الفيديو في المشغل المصغر، ولكن قم بتدوير وضع ملء الشاشة مباشرة، إذا تم تأمين التدوير التلقائي. لا يزال بإمكانك الوصول إلى المشغل المصغر عن طريق الخروج من ملء الشاشة + تراخيص NewPipe + تحديث دائمًا + التراخيص + عملية التصدير جارية … + تصغير إلى مشغل الخلفية + تنبيهات مشغل NewPipe + تمَّت عملية الإستيراد + الصور المصغرة + تحميل تفاصيل البث… + إظهار تلميح \"اضغط للفتح\" + الحد من جودة الفيديو عند استخدام بيانات الهاتف المحمول + سيتم تشغيل تنزيل واحد في نفس الوقت + قبول + إعدادات ExoPlayer + تنبيه تحديث التطبيق + غير صامت + امسح ملفات تعريف الارتباط التي يخزنها NewPipe عند حل reCAPTCHA + نظرا لقيود مشغل ExoPlayer مدة التقديم تم ضبطها الى %d ثانية + أفضل ٥٠ + السطوع + تمكين تحديد نص في الوصف + شاهَدتَها بالكامل + بدون ترجمات نصية توضيحية + المواضع في القوائم + الملف + التحديثات + النظام الافتراضي + لا يتم عرض التدفقات التي لم يدعمها برنامج التنزيل بعد + لم يتم العثور على أي بث مرئي + وضع التالي على قائمة الانتظار + إظهار معلومات التعريف + اختر قناة + © %1$sبواسطة%2$sتحت%3$s + تعطيل نفق الوسائط + المسارات + اسم المجموعة فارغ + يتم دعم عناوين URL HTTPS فقط + المدة + لا يمكن تصدير الاشتراكات + لاتوجد بثوث + يمكنك تحديد ثلاثة إجراءات كحد أقصى لإظهارها في الإشعار المضغوط! + إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل! + اختار الألسنة التي تودّ ظهورها على الصفحة الرئيسية + مجلد تحميل الفيديو + هذا الفيديو مقيد بالفئة العمرية. +\n +\nقم بتفيل \"%1$s\" في الإعدادات إذا كنت تريد رؤيته. + تجاهل أحداث ازرار الوسائط الأجهزة + اختر لسانًا + الصوت + تم حذف كل مواقف التشغيل + في الخلفية + القنوات + الرخصة + إلغاء الاشتراك + لقد اشتركت الآن في هذه القناة + بدءًا من Android 10، يتم دعم \"Storage Access Framework\" فقط + إنشاء اسم فريد + أظهر أشرطة ملونة لبيكاسو أعلى الصور تشير إلى مصدرها: الأحمر للشبكة والأزرق للقرص والأخضر للذاكرة + فشل الاتصال الآمن + يتوفر هذا الفيديو فقط لأعضاء YouTube Music Premium، لذلك لا يمكن بثه أو تنزيله من قبل NewPipe. + البث السابق + تشغيل الكل + السمة + أبلِغ + اختر إيماءة للنصف الأيسر من شاشة المشغل + نسخ التقرير مُنسق + مباشر + إظهار تنبيه للمطالبة بتحديث التطبيق عندما يتوفر إصدار جديد + السؤال دائماً + منجز + تقرير عن المشكلة + أُضيفَ إلى قائمة الانتظار + لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. +\nيرجى تثبيت مدير ملفات أو محاولة تعطيل \"%s\" في إعدادات التنزيل + مشغل الفيديو + بواسطة %s + وصف + ريثما + شارك الرابط التشعبي للقائمة + شارِكها بالترجمات النصية + %1$s +\n%2$s + شارِك قائمة التشغيل + شارِك قائمة التشغيل بتفاصيليها مثل اسم قائمة التشغيل وعناوين الفيديو أو كقائمة بسيطة من عناوين تشعّبيّة للفيديوهات + - %1$s: %2$s \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index d0cf90db4..d69564493 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -45,7 +45,6 @@ تعذر تحميل كافة الصور المصغرة خطأ تعذر تحليل الموقع - تعذر فك تشفير توقيع رابط الفيديو اضغط على عدسة المكبرة للبدء. اشتراك مشترك @@ -243,7 +242,6 @@ الإشارات المرجعية استعمال التقديم السريع الغير دقيق خاصية التقديم الغير دقيق تسمح للمشغل بالقفز خلال الفديو بشكل أسرع مع دقة قفز أقل. خاصية القفز ل5، 15 او 25 لا تعمل مع القفز الغير دقيق - تحميل الصور المصغرة تم إفراغ مساحة ذاكرة التخزين المؤقتة الخاصة بالصور الملف لا يوجد مثل هذا المجلد @@ -260,7 +258,6 @@ عملية التصدير جارية … إستيراد ملف معرفك, soundcloud.com/هويتك - قم بإيقاف تشغيله لمنع تحميل الصور المصغرة وحفظ البيانات واستخدام الذاكرة. تمسح التغييرات كلاً من ذاكرة التخزين المؤقت للصورة الموجودة في الذاكرة والموجودة على القرص امسح البيانات الوصفيّة المخزّنة مؤقّتًا إزالة جميع بيانات صفحات الويب المخزنة مؤقّتًا تم محو ذاكرة التخزين المؤقتّة للبيانات الوصفيّة @@ -410,7 +407,7 @@ لا يمكن الكتابة فوق الملف هناك تنزيل معلق بهذا الاسم تم إغلاق NewPipe أثناء العمل على الملف - لم يتبقى مساحة في الجهاز + لم يتبقى مساحة في الجهاز تم فقد التقدم بسبب حذف الملف انتهى وقت الاتصال هل تريد محو سجل التنزيل، أم تريد حذف جميع الملفات التي تم تنزيلها؟ @@ -469,7 +466,7 @@ لغة التطبيق النظام الافتراضي اضغط على \"تم\" عند حلها - منجز + منجز الفيديوهات %d ثانية @@ -587,7 +584,7 @@ خلط تكرار يمكنك تحديد ثلاثة إجراءات كحد أقصى لإظهارها في الإشعار المضغوط! - قم بتحرير كل إشعار أدناه من خلال النقر عليه. حدد ما يصل إلى ثلاثة منها لتظهر في الإشعار المضغوط باستخدام مربعات الاختيار الموجودة على اليمين + قم بتحرير كل إجراء إعلام أدناه من خلال النقر عليه. حدد ما يصل إلى ثلاثة منها ليتم عرضها في الإشعار المضغوط باستخدام مربعات الاختيار الموجودة على اليمين. زر الإجراء الخامس زر الإجراء الرابع زر الإجراء الثالث @@ -644,7 +641,6 @@ خاص غير مدرج عامة - رابط الصورة المصغرة المضيف الدعم اللغة @@ -818,4 +814,59 @@ تم تعطيل نفق وسائل الإعلام عن طريق التقصير على جهازك لأن نموذج جهازك معروف بأنه لا يدعمه. لاتوجد بثوث لاتوجد بثوث مباشرة + الفيديوات + المشتركون + ما هي التبويبات المعروضة على صفحات القناة + تبويبات القنوات + الفديوهات القصيرة + جلب البيانات الوصفية… + تبديل تدوير الشاشة + الانتقال إلى وضع ملئ الشاشة + اجلب تبويبات القنوات + البث التالي + فتح قائمة انتظار التسغيل + حول + تقديم المحتوى + الألبومات + إعادة المحتوى + إعادة التشغيل + علامات التبويب لجلبها عند تحديث الخلاصة. ليس لهذا الخيار أي تأثير إذا تم تحديث القناة باستخدام الوضع السريع. + قوائم التشغيل + شغِّل + المزيد من الخيارات + المسارات + المدة + القنوات + البث السابق + مباشر + جودة الصورة + ؟ + جودة منخفضة + الصور الرمزية + الصور الرمزية للقناة الفرعية + لا تقم بتحميل الصور + عالية الجودة + النوعية متوسطة + الصورة الرمزية للرفع + اللافتات + اختر جودة الصور وما إذا كنت تريد تحميل الصور على الإطلاق، لتقليل استخدام البيانات والذاكرة. تؤدي التغييرات إلى مسح ذاكرة التخزين المؤقت للصور الموجودة في الذاكرة وعلى القرص — %s + الصور المصغرة + مشاركة عنوان القائمة + مشاركة العناوين + %1$s +\n%2$s + مشاركة قائمة التشغيل + شارك تفاصيل قائمة التشغيل مثل اسم قائمة التشغيل وعناوين الفيديو أو كقائمة بسيطة من عناوين URL للفيديو + - %1$s: %2$s + + رد %s + رد %s + ردان%s + ردود%s + ردود %s + ردود %s + + عرض المزيد + عرض أقل + قم بتحرير كل إجراء إعلام أدناه من خلال النقر عليه. يتم تعيين الإجراءات الثلاثة الأولى (تشغيل/إيقاف مؤقت، السابق والتالي) بواسطة النظام ولا يمكن تخصيصها. \ No newline at end of file diff --git a/app/src/main/res/values-as/strings.xml b/app/src/main/res/values-as/strings.xml index 93e9e363e..fc9d5b2b6 100644 --- a/app/src/main/res/values-as/strings.xml +++ b/app/src/main/res/values-as/strings.xml @@ -62,7 +62,6 @@ লোড ব্যৱধানৰ আকাৰ সলনি কৰক (বৰ্তমানে %s) । এটা কম মানে প্ৰাৰম্ভিক ভিডিঅ\' লোডিং দ্ৰুত কৰিব পাৰে। পৰিৱৰ্তনৰ বাবে এটা খেলুৱৈ পুনৰাৰম্ভৰ প্ৰয়োজন থাম্বনেইলত থকা মূল ৰং অনুসৰি এণ্ড্ৰইডক জাননীৰ ৰং কাষ্টমাইজ কৰিবলৈ কওক (মন কৰিব যে এইটো সকলো ডিভাইচতে উপলব্ধ নহয়) সক্ৰিয় প্লেয়াৰৰ queue সলনি কৰা হ’ব - থাম্বনেইল লোড কৰক মন্তব্য দেখুৱাওক বিৱৰণ দেখুৱাওক মেটা তথ্য দেখুৱাওক @@ -96,6 +95,5 @@ ভিডিঅ\'ৰ বিৱৰণ আৰু অতিৰিক্ত তথ্য লুকুৱাবলৈ বন্ধ কৰক মন্তব্য লুকুৱাবলৈ বন্ধ কৰক \'পৰৱৰ্তী\' আৰু \'সাদৃশ্য থকা\' ভিডিঅ\' দেখুৱাওক - থাম্বনেইলসমূহ লোড কৰা, তথ্য আৰু মেমৰি ব্যৱহাৰ সংৰক্ষণ কৰা ৰোধ কৰিবলে বন্ধ কৰক। পৰিবৰ্তনসমূহে ইন-মেমৰি আৰু অন-ডিস্ক কেশ্ব দুয়োটা পৰিষ্কাৰ কৰে ষ্ট্ৰিমৰ সৃষ্টিকৰ্তা, ষ্ট্ৰিমৰ বিষয়বস্তু বা এটা সন্ধান অনুৰোধৰ বিষয়ে অতিৰিক্ত তথ্যৰ সৈতে মেটা তথ্যৰ বাকচসমূহ লুকুৱাবলৈ বন্ধ কৰক \ No newline at end of file diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index a238758af..c0ac7e6d5 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -136,7 +136,6 @@ \nOnu görmək istəyirsinizsə, tənzimləmələrdə \"%1$s\" seçimini aktivləşdirin.
    YouTube potensial yetkin məzmunu gizlədən \"Məhdud Rejim\" təmin edir \"PeerTube\" nümunələri - Miniatürləri yüklə Yığcam bildirişdə göstərmək üçün ən çoxu üç fəaliyyət seçə bilərsiniz! Həmişə yenilə Axın @@ -269,7 +268,7 @@ Əlaqəli elementlər Baxılmış kimi işarələ ilə aç - Gecə Teması + Gecə teması Ani pəncərə xüsusiyyətlərini xatırla Ani pəncərənin son ölçüsü və mövqeyini xatırla Video yayımı tapılmadı @@ -287,7 +286,6 @@ Səs yayımı tapılmadı Digər tətbiqlərin üzərində göstərməyə icazə ver İlkin tənzimləmələri qaytarmaq istəyirsiniz\? - Miniatürləri yükləməyi, məlumata qənaət və yaddaş istifadəsin azaltmaq üçün söndür. Dəyişikliklər həm yaddaşdaxilində, həm də diskdə təsvir keşini təmizləyir Növbətini növbələ Təkrar Cəhd Et Cari oynatma yayımı bildirişini konfiqurasiya et @@ -329,7 +327,7 @@ Hələ endirmə qovluğu təyin edilməyib, indi standart endirmə qovluğu seç reCAPTCHA çağırışı reCAPTCHA sorğusu göndərildi - Bitdi + Bitdi Etibarsız simvollar bu dəyərlə əvəz olunur Əvəzedici xarakter Ən xüsusi simvollar @@ -550,7 +548,7 @@ İzləniləni sil Sistem qovluğu seçicisini (SAF) istifadə et Bağlantı fasiləsi - Cihazda yer qalmayıb + Cihazda yer qalmayıb Fayl üzərində işləyərkən NewPipe bağlandı Emaldan sonra uğursuz oldu Serverə qoşulmaq mümkün deyil @@ -631,7 +629,6 @@ Sahib Siyahıdan kənar Şəxsi - Miniatür URL Yaş həddi Dil İctimai @@ -644,7 +641,6 @@ Oynadıcı bildirişi Yeni yayımlar Xəta hesabatı bildirişi - Video URL\'i imzası şifrəsi qırılmadı Endirmək üçün yayım mövcud deyil Xəta baş verdi, bildirişi gör Şərhiniz (İngiliscə): @@ -661,7 +657,7 @@ Hələ,əlfəcinlənmiş pleylistlər yoxdur Bu, cari quraşdırmanızı ləğv edəcək. Növbəyə qoy - Qara ekranla qarşılaşsanız və ya videonu oynatdıqda səs qırılarsa, media tunelini deaktiv edin + Qara ekranla qarşılaşsanız və ya videonu oynatdıqda səs pozularsa, media tunelin qeyri-aktiv edin Növbəti sıraya salındı Fonda oynatmağa başla Yayım təfərrüatları yüklənir… @@ -698,7 +694,7 @@ Bu video yalnız YouTube Music Premium üzvləri üçün əlçatandır, ona görə də NewPipe tərəfindən yayımlamaq və ya endirmək mümkün deyil. İndi açıqlamadakı mətni seçə bilərsiniz. Nəzərə alın ki, seçim rejimində səhifə titrəyə və linklər kliklənməyə bilər. Bildirişdə göstərilən video miniatürünü 16:9-dan 1:1 görünüş nisbətinə qədər kəs - Aşağıdakı hər bir bildiriş fəaliyyətini üzərinə toxunaraq redaktə et. Sağdakı təsdiq qutularından istifadə edərək yığcam bildirişdə göstərmək üçün onların üçünü seç + Aşağıdakı hər bir bildiriş fəaliyyətini üzərinə toxunaraq düzəliş edin. Sağdakı təsdiq qutularından istifadə edərək yığcam bildirişdə göstərmək üçün onların üçünü seçin. Belə fayl/məzmun mənbəyi yoxdur Seçilən yayım xarici oynadıcılar tərəfindən dəstəklənmir Yükləyici tərəfindən hələ dəstəklənməyən yayımlar göstərilmir @@ -760,4 +756,18 @@ təsviri Həmişə ExoPlayer-in video çıxış səthi tənzimləməsin istifadə et Qabaqcıl məzmunda yükləmə aralığı həcmin dəyişdir (hazırda %s). Daha aşağı dəyər onların ilkin yüklənilməsin sürətləndirə bilər + Yayım yoxdur + Canlı yayım yoxdur + Media tunelləmə cihazınızda standart olaraq qeyri-aktiv edilib, çünki cihazınızın modelinin bunu dəstəkləmədiyi məlumdur. + %1$s %2$s + Əsas səhifə mövqeyi + Əsas səhifə seçicini aşağıya köçür + Üst Məlumat Yüklənir… + Kanal səhifələrin əldə et + Avatarlar + Alt kanal avatarları + Axın yenilənərkən əldə edilən səhifələr.Kanal sürətli rejim istifadə edərək yenilənirsə, bu seçimin heç bir təsiri yoxdur. + Yükləyici avatarları + Miniatürlər + Aşağıdakı hər bildirişə vuraraq ona düzəliş edin. İlk üç əməl (oynatma/fasilə, əvvəlki və sonrakı) sistem tərəfindən təyin olunub və dəyişdirilə bilməz. \ No newline at end of file diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index f9c6109e6..5cc516f46 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -25,7 +25,6 @@ En direuto Fallu Nun pudieron cargase toles miniatures - Nun pudo sabese la robla de la URL del videu Nun pudo analizase\'l sitiu web Buff… Esto nun debió asoceder. Perdona mas asocedió daqué malo. @@ -172,7 +171,7 @@ Yá esiste un ficheru baxáu con esti nome nun pue sobrecribise\'l ficheru Hai una descarga pendiente con esti nome - Nun queda espaciu nel preséu + Nun queda espaciu nel preséu Escosó\'l tiempu d\'espera de la conexón Nun pudieron importase les soscripciones Sotítulos @@ -206,8 +205,6 @@ \n3. Anicia sesión cuando se te pida \n4. Copia la URL del perfil al que te redirixeron.
    soundcloud.com/LaToID - Cargar les miniatures - Desactiva esta opción pa eviar la carga de miniatures y aforrar datos y usu de memoria. Los cambeos llimpien la caché d\'imáxenes temporal y permanente. Minimizar al cambiar d\'aplicación Minimizar al reproductor en segundu planu Minimizar al reproductor en ventanu @@ -423,7 +420,7 @@ Un aplicación llibre pa ver/sentir plataformes de tresmisión n\'Android. Caráuteres de troquéu Los caráuteres que nun son válidos van trocase por esti valor - Fecho + Fecho Primi «Fecho» al resolvelu Desanicióse 1 elementu. Defini una capeta de descargues dempués, nos axustes de l\'aplicación diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index affa805e6..c3c187891 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -24,10 +24,8 @@ Barcha keshlangan veb-sahifa ma\'lumotlarini olib tashlash Keshlangan metadatalarni o\'chirish Rasm keshi o\'chirildi - Eskizlarni yuklash, ma\'lumotlarni tejash va xotiradan foydalanishni oldini olish uchun o\'chirib qo\'ying. O\'zgarishlar xotiradagi va diskdagi rasm keshini tozalaydi. sharhlarni yashirishni o\'chirish Izohlarni ko\'rsatish - Eskizlarni yuklang Aktiv ijro etish navbati almashtiriladi Bir ijro etishdan boshqasiga o\'tish sizning navbatingizni almashtirishi mumkin Navbatni tozalashdan oldin tasdiqlashni so\'rash @@ -60,7 +58,7 @@ Kodi bilan ijro etish Faqat ba\'zi qurilmalar 2K / 4K videolarni ijro etishi mumkin Yuqori o\'lchamlarni ko\'rsatish - "Standart pop-up o\'lchamlari" + Standart pop-up o\'lchamlari Standart o\'lchamlari Audio fayllar uchun yuklab olish papkasini tanlash Yuklab olingan videofayllar shu yerda saqlanadi @@ -216,7 +214,7 @@ Noto\'g\'ri belgilar ushbu qiymat bilan almashtiriladi Fayl nomidagi ruxsat berilgan belgilar Yuklab olish - Bajarildi + Bajarildi reCAPTCHA muammosi so\'raldi Hal etilganda \"Bajarildi\" tugmasini bosing reCAPTCHA muammosi @@ -314,7 +312,6 @@ Yuklab olish menyusi sozlanmadi Tarkib mavjud emas Veb-saytni tahlil qilib bo\'lmadi - Videoning URL manzilini o\'chirib bo\'lmadi Barcha eskizlarni yuklab bo\'lmadi Tarmoqda xato Tashqi SD-kartaga yuklab olishning iloji yo\'q. Yuklash papkasining joylashuvi tiklansinmi\? @@ -419,7 +416,7 @@ Ushbu yuklab olishni tiklab bo\'lmaydi Ulanish vaqti tugadi Siljish yo\'qoldi, chunki fayl o\'chirildi - Qurilmada bo\'sh joy qolmadi + Qurilmada bo\'sh joy qolmadi NewPipe fayl ustida ishlash paytida yopilgan Keyingi ishlov berilmadi Topilmadi diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 979553372..c41a9e6bb 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -6,8 +6,8 @@ Патокавы плэер не знойдзены (вы можаце ўсталяваць VLC каб прайграць). Усталяваць Скасаваць - Адкрыць у браўзеры - Адкрыць у асобным акне + Адкрыць ў браўзеры + Адкрыць ў асобным акне Падзяліцца Спампаваць Загрузка файла прамой трансляцыі @@ -37,12 +37,12 @@ Загружаныя аўдыёфайлы захоўваюцца тут Абярыце тэчку загрузкі для аўдыёфайлаў Разрознянне па змаўчанні - Разрозненне усплываючага акна + Разрозненне ўсплываючага акна Высокія разрозненні Толькі некаторыя прылады могуць прайграваць відэа ў 2K/4K - Прайграць у Kodi - Усталяваць адсутную праграму Kore\? - Паказаць опцыю \"Прайграць у Kodi\" + Прайграць ў Kodi + Ўсталяваць адсутную праграму Kore? + Паказаць опцыю \"Прайграць ў Kodi\" Паказаць опцыю прайгравання відэа праз медыяцэнтр Kodi Аўдыё Фармат аўдыё па змаўчанні @@ -55,8 +55,6 @@ Запамінаць памер і становішча ўсплываючага акна Хуткі пошук пазіцыі Недакладны пошук дазваляе плэеру знаходзіць пазіцыі хутчэй са зніжанай дакладнасцю. Пошук цягам 5, 15 ці 25 секунд пры гэтым немажлівы - Загружаць мініяцюры - Адключыце, каб не загружаць мініяцюры і зэканоміць трафік і памяць. Змена налады ачысьціць кэш малюнкаў Кэш малюнкаў ачышчаны Ачысціць кэш метададзеных Выдаліць усе загружаныя дадзеныя вэб-старонак @@ -72,7 +70,7 @@ Узнавіць прайграванне Працягваць прайграванне пасля перапынкаў (напрыклад, тэлефонных званкоў) Загрузіць - \"Наступнае\" и \"Прапанаванае\" відэа + \"Наступнае\" і \"Прапанаванае\" відэа Паказаць падказку \"Утрымлівайце, каб паставіць у чаргу\" Паказаць падказку пры націсканні фонавай або ўсплывальнай кнопкі ў відэа \"Падрабязнасці:\" URL не падтрымліваецца @@ -126,7 +124,6 @@ Памылка Памылка сеткі Не атрымалася загрузіць усе мініяцюры - Не атрымалася расшыфраваць подпіс URL у відэа Не атрымалася разабраць вэб-сайт Кантэнт недаступны Не атрымалася стварыць меню загрузкі @@ -230,7 +227,7 @@ \nПалітыка прыватнасці NewPipe падрабязна тлумачыць, якія дадзеныя адпраўляюцца і захоўваюцца пры адпраўцы справаздачы аб збоях.
    Прачытаць палітыку Ліцэнзія NewPipe - NewPipe - гэта праграмнае забеспячэнне, свабоднае ад копілефта: вы можаце выкарыстоўваць, вывучаць, дзяліцца і паляпшаць яго па жаданні. У прыватнасці, вы можаце распаўсюджваць і/ці змяняць яго ў адпаведнасці з умовамі Агульнай грамадскай ліцэнзіі GNU, апублікаванай Фондам свабоднага праграмнага забеспячэння, альбо версіі 3 Ліцэнзіі, альбо (на ваш выбар) любой пазнейшай версіі. + NewPipe - гэта праграмнае забеспячэнне, свабоднае ад копілефта: вы можаце выкарыстоўваць, вывучаць, дзяліцца і паляпшаць яго па жаданні. Ў прыватнасці, вы можаце распаўсюджваць і/ці змяняць яго ў адпаведнасці з умовамі Агульнай грамадскай ліцэнзіі GNU, апублікаванай Фондам свабоднага праграмнага забеспячэння, альбо версіі 3 Ліцэнзіі, альбо (на ваш выбар) любой пазнейшай версіі. Прачытаць ліцэнзію Гісторыя Гісторыя @@ -256,8 +253,8 @@ Выдаліць Падрабязнасці Налады аўдыё - Утрымлівайце, каб дадаць у чаргу - Пачаць адсюль у фоне + Утрымлівайце, каб дадаць ў чаргу + Пачаць адсюль ў фоне Пачніце гуляць ва ўсплываючым акне Адкрыць бакавую панэль Зачыніць бакавую панэль @@ -265,16 +262,16 @@ Пры адкрыцці спасылкі на кантэнт — %s Відэаплэер Фонавы плэер - Плэер у акне + Аконны прайгравальнік Заўсёды пытацца Атрыманне звестак… Загрузка запытанага кантэнту Стварыць плэйліст Перайменаваць Імя - Дадаць у плэйліст - Усталяваць як мініяцюру плэйліста - Дадаць плэйліст у закладкі + Дадаць ў плэйліст + Ўсталяваць як мініяцюру плэйліста + Дадаць плэйліст ў закладкі Выдаліць закладку Выдаліць плэйліст\? Плэйліст створаны @@ -292,7 +289,7 @@ Прымусова паведамляць пра недастаўляемыя Rx-выключэнні па-за фрагментам або жыццёвым цыкле пасля выдалення Імпарт Імпарт з - Экспарт у + Экспарт ў Імпарт… Экспарт… Імпарт файла @@ -302,17 +299,17 @@ Імпарт падпісак YouTube з Google Takeout: \n \n1. Перайдзіце па гэтым URL: %1$s -\n2. Увайдзіце, калі вас папросяць +\n2. Ўвайдзіце, калі вас папросяць \n3. Націсніце на «Усе дадзеныя ўключаны», затым на «Адмяніць выбар усіх», затым выберыце толькі «падпіскі» і націсніце «ОК» \n4. Націсніце на «Наступны крок», а затым на «Стварыць экспарт» \n5. Націсніце на кнопку «Спампаваць» пасля таго, як яна з\'явіцца \n6. Пстрыкніце ФАЙЛ ІМПАРТУВАЦЬ ніжэй і выберыце спампаваны файл .zip \n7. [Калі імпарт .zip не ўдаецца] Распакуйце файл .csv (звычайна ў раздзеле \"YouTube і YouTube Music/subscriptions/subscriptions.csv\"), націсніце ФАЙЛ ІМПАРТУВАЦЬ ніжэй і выберыце выняты файл CSV - Імпарт падпісак з SoundCloud набраўшы альбо URL, альбо ваш ID: -\n -\n1. Уключыце \"рэжым працоўнага стала\" у браўзэры (сайт недаступны на тэлефоне) -\n2. Перайдзіце на: %1$s -\n3. Увайдзіце, калі неабходна + Імпарт падпісак з SoundCloud набраўшы альбо URL, альбо ваш ID: +\n +\n1. Ўключыце \"рэжым працоўнага стала\" ў браўзэры (сайт недаступны на тэлефоне) +\n2. Перайдзіце на: %1$s +\n3. Увайдзіце, калі неабходна \n4. Скапіруйце адрас з адраснага радка. вашID, soundcloud.com/вашID Гэтае дзеянне можа выклікаць вялікі расход трафіку. @@ -325,7 +322,7 @@ Прапускаць цішыню Крок Скід - У адпаведнасці з Агульным рэгламентам па абароне дадзеных ЕС (GDPR), звяртаем вашу ўвагу на палітыку прыватнасці NewPipe. Калі ласка, уважліва азнаёмцеся з ёй. + Ў адпаведнасці з Агульным рэгламентам па абароне дадзеных ЕС (GDPR), звяртаем вашу ўвагу на палітыку прыватнасці NewPipe. Калі ласка, уважліва азнаёмцеся з ёй. \nВам неабходна прыняць яе ўмовы, каб адправіць нам справаздачу пра памылку. Прыняць Адмовіцца @@ -334,8 +331,8 @@ Пры згортванні плэера Дзеянне пры пераключэнні са стандартнага плэера на іншае прыкладанне — %s Нічога не рабіць - Фонавы плэер - Плэер у акне + Згарнуць ў фонавы плэер + Плэер ў акне Адпісацца Абярыце ўкладку Абнаўленні @@ -359,14 +356,14 @@ Скончана У чарзе прыпынена - у чарзе + дададзены ў чаргу постапрацоўка - Паставіць у чаргу + Дадаць ў чаргу Дзеянне забаронена сістэмай Памылка загрузкі Стварыць унікальнае імя Перазапісаць - Загрузка з такім імем ужо выконваецца + Загрузка з такім імем ўжо выконваецца Паказаць тэкст памылкі Немагчыма стварыць папку прызначэння Немагчыма стварыць файл @@ -380,7 +377,7 @@ Спыніць Максімум спробаў Колькасць спробаў перад адменай загрузкі - Перапыніць у платных сетках + Перапыніць ў платных сетках Карысна пры пераключэнні на мабільную сетку, хоць некаторыя загрузкі не могуць быць прыпыненыя Падзеі Канферэнцыі @@ -397,12 +394,12 @@ Ачысціць дадзеныя Пазіцыі прайгравання выдалены Файл перамешчаны ці выдалены - Файл з такім імем ужо існуе - Файл з такім імем ужо існуе + Файл з такім імем ўжо існуе + Файл з такім імем ўжо існуе немагчыма перазапісаць файл - У чарзе ўжо ёсць загрузка з такім імем + Ў чарзе ўжо ёсць загрузка з такім імем NewPipe была зачынена падчас працы над файлам - Скончылася вольнае месца на прыладзе + Скончылася вольнае месца на прыладзе Прагрэс страчаны, так як файл быў выдалены Час злучэння выйшла Вы ўпэўнены\? @@ -411,8 +408,8 @@ Пачаць загрузку Прыпыніць загрузку Запытваць тэчку загрузкі - Вам будзе прапанавана ўказаць месца захавання кожнай загрузкі. -\nУключыце сістэмны выбарнік тэчкі (SAF), калі вы хочаце загружаць файлы на знешнюю SD-картку + Вам будзе прапанавана указаць месца захавання кожнай загрузкі. +\nЎключыце сістэмны выбарнік тэчкі (SAF), калі вы хочаце загружаць файлы на знешнюю SD-картку Выкарыстоўвайце сродак выбару сістэмных тэчак (SAF) \'Storage Access Framework\' дазваляе загружаць на знешнюю SD-картку Пераключыць службу, выбраную ў дадзены момант: @@ -429,7 +426,7 @@ Кнопка другога дзеяння Кнопка першага дзеяння Групы каналаў - Як у сістэме + Як ў сістэме Мова прылады Выберыце экзэмпляр Выдаліць загружаныя файлы @@ -445,18 +442,18 @@ Ніколі Толькі па Wi-Fi Паказаць арыгінальны час на элементах - Уключыць гук + Ўключыць гук Цішына - Дадаць у чаргу - Даданае у чаргу + Дадаць ў чаргу + Даданае ў чаргу Чарга прайгравання Найбольш папулярнае Лакальнае Нядаўна дададзенае - Няма закладак у плейлісце + Няма закладак ў плейлісце Выберыце плэйліст Кіёск па змаўчанні - Так + Так Націсніце \"Так\" калі вырашана ∞ відэа 100+ відэа @@ -481,7 +478,7 @@ Кнопка пятага дзеяння Афарбоўваць апавяшчэнне асноўным колерам мініяцюры. Падтрымваецца не ўсімі прыладамі У кампактным апавяшчэнні дасяжна не больш за тры дзеянні! - Дзеянні можна змяніць, націснуўшы на іх. Адзначце не больш за трох для адлюстравання ў кампактным апавяшчэнні + Адрэдагуйце кожнае дзеянне апавяшчэння, націснуўшы на яго. Выберыце да трох з іх, якія будуць адлюстроўвацца ў кампактным апавяшчэнні, выкарыстоўваючы сцяжкі справа. Не ўдалося распазнаць URL-адрас. Адкрыць у іншай праграме\? Апавяшченне плэера Апавяшчэнні @@ -500,9 +497,9 @@ Падпіскі не выбраны Апошняе абнаўленне: %s Аўтаматычна (тэма прылады) - Выберыце ўлюбёную начную тэму - %s + Выберыце любімую начную тэму - %s Дазвол вылучэння тэксту ў апісанні - Ніжэй вы можаце абраць улюбёную начную тэму + Вы можаце выбраць сваю любімую начную тэму ніжэй Гэта опцыя даступна толькі тады, калі %s будзе выбранай тэмаю Загрузка пачалась Апавяшчэнні адключаныя @@ -522,7 +519,7 @@ Адкрыць з дапамогай Начная тэма Адкрыць вэб-сайт - Цяпер Вы можаце вылучаць тэкст у апісанні. Звярніце ўвагу, што ў рэжыме вылучэння старонка можа мігацець, а спасылкі могуць быць недаступныя для націскання. + Цяпер Вы можаце вылучаць тэкст ў апісанні. Звярніце ўвагу, што ў рэжыме вылучэння старонка можа мігацець, а спасылкі могуць быць недаступныя для націскання. Запусціць галоўны прайгравальнік у поўнаэкранным рэжыме Паказаць дэталі канала Нізкая якасць (менш) @@ -577,14 +574,14 @@ Выдалена %1$s зазагрузак Выдалена %1$s зазагрузак - Выдаліць усе загружаныя файлы з дыска\? + Выдаліць ўсе загружаныя файлы з дыска? %d хвіліна %d хвіліны %d хвілінаў %d хвілінаў - Змяніць памер інтэрвалу загрузкі прагрэсіўнага змесціва (у цяперашні час %s). Меншае значэнне можа паскорыць іх першапачатковую загрузку + Змяніць памер інтэрвалу загрузкі прагрэсіўнага змесціва (ў цяперашні час %s). Меншае значэнне можа паскорыць іх першапачатковую загрузку Выключыце, каб схаваць апісанне відэа і дадатковую інфармацыю Прапановы лакальнага пошуку Наладзіць апавяшчэнне аб бягучым прайграванні патоку @@ -611,7 +608,7 @@ Разлік хэша Вырашана Створана аўтаматычна (запампавальнік не знойдзены) - Плэйлісты, якія пазначаны шэрым, ужо ўтрымліваюць гэты элемент. + Плэйлісты, якія пазначаны шэрым, ўжо ўтрымліваюць гэты элемент. %s новы стрым %s новыя стрымы @@ -619,14 +616,14 @@ %s новых стрымаў Каментарыі - У чаргу далей - У чарзе наступны + Ў чаргу далей + Ў чарзе наступны Загрузка звестак аб стрыме… Апрацоўка... Можа заняць некаторы час Дублікат дададзены %d раз LeakCanary недаступны Паказаць уцечкі памяці - Адключыце мультымедыйнае тунэляванне, калі ў вас з\'яўляецца чорны экран або заіканне падчас прайгравання відэа + Адключыце мультымедыйнае тунэляванне, калі ў вас з\'яўляецца чорны экран або заіканне падчас прайгравання відэа. Не ўдалося скапіраваць у буфер абмену Папка спампоўкі пакуль не ўстаноўлена, выберыце папку спампоўкі па змаўчанні Часта задаюць пытанні @@ -653,7 +650,7 @@ Праверка абнаўленняў… Выдаліць дублікаты\? Выдаліць дублікаты - Вы хочаце выдаліць усе паўтаральныя стрымы ў гэтым плэйлісце\? + Вы хочаце выдаліць ўсе паўтаральныя стрымы ў гэтым плэйлісце? Новыя элементы стужкі %d выбраны @@ -690,21 +687,20 @@ Стужка Час пасля апошняга абнаўлення, перш чым падпіска лічыцца састарэлай — %s Памылка загрузкі стужкі - Уліковы запіс аўтара быў спынены. -\nNewPipe не зможа загрузіць гэты канал у будучыні. -\nВы хочаце адмовіцца ад падпіскі на гэты канал\? + Ўліковы запіс аўтара быў спынены. +\nNewPipe не зможа загрузіць гэты канал ў будучыні. +\nВы хочаце адмовіцца ад падпіскі на гэты канал? Рэжым хуткай загрузкі стужкі не дае дадатковай інфармацыі аб гэтым. Атрымлівайце са спецыяльнага канала, калі ён даступны - Уключыць хуткі рэжым + Ўключыць хуткі рэжым Катэгорыя Тэгі Ліцэнзія Хост - URL мініяцюры Не ў спісе Прыватная , - Пераключыць усё + Пераключыць ўсё Стрымы, якія яшчэ не падтрымліваюцца загрузчыкам, не адлюстроўваюцца Мініяцюра аватара канала Аўтар: %s @@ -733,7 +729,7 @@ Уліковы запіс спынены %s дае наступную прычыну: Рэкамендаваны - Унутраная + Ўнутраная Цалкам прагледзеў Гэты кантэнт даступны толькі для аплачаных карыстальнікаў, таму NewPipe не можа яго трансляваць або спампоўваць. Даступны ў некаторых службах, звычайна нашмат хутчэй, але можа вяртаць абмежаваную колькасць элементаў і часта няпоўную інфармацыю (напрыклад, без працягласці, тыпу элемента, без актыўнага стану) @@ -743,7 +739,7 @@ Ніякая праграма на вашай прыладзе не можа адкрыць гэта Стандартнае значэнне ExoPlayer Часткова прагледжана - Як вы думаеце, загрузка корму адбываецца занадта павольна\? Калі так, паспрабуйце ўключыць хуткую загрузку (гэта можна змяніць у наладах або націснуўшы кнопку ніжэй). + Як вы думаеце, загрузка корму адбываецца занадта павольна? Калі так, паспрабуйце ўключыць хуткую загрузку (гэта можна змяніць ў наладах або націснуўшы кнопку ніжэй). \n \nNewPipe прапануе дзве стратэгіі загрузкі корму: \n• Атрыманне ўсяго канала падпіскі павольнае, але поўнае. @@ -779,10 +775,68 @@ арыгінальны дубляваны апісальны - Гукавая дарожка ўжо павінна прысутнічаць у гэтай плыні - Уключыце гэту опцыю, калі ў вас ёсць праблемы з ініцыялізацыяй дэкодэра, якая вяртаецца да дэкодэраў з больш нізкім прыярытэтам, калі ініцыялізацыя асноўных дэкодэраў не ўдаецца. Гэта можа прывесці да нізкай прадукцыйнасці прайгравання, чым пры выкарыстанні асноўных дэкодэраў + Гукавая дарожка ўжо павінна прысутнічаць ў гэтай плыні + Ўключыце гэту опцыю, калі ў вас ёсць праблемы з ініцыялізацыяй дэкодэра, якая вяртаецца да дэкодэраў з больш нізкім прыярытэтам, калі ініцыялізацыя асноўных дэкодэраў не ўдаецца. Гэта можа прывесці да нізкай прадукцыйнасці прайгравання, чым пры выкарыстанні асноўных дэкодэраў Кіраванне некаторымі наладамі ExoPlayer. Каб гэтыя змены ўступілі ў сілу, патрабуецца перазапуск гульца Гэты абыходны шлях вызваляе і паўторна стварае відэакодэкі, калі адбываецца змяненне паверхні, замест таго, каб усталёўваць паверхню непасрэдна для кодэка. ExoPlayer ужо выкарыстоўваецца на некаторых прыладах з гэтай праблемай, гэты параметр мае ўплыў толькі на прыладах з Android 6 і вышэй \n \nУключэнне гэтай опцыі можа прадухіліць памылкі прайгравання пры пераключэнні бягучага відэаплэера або пераключэнні ў поўнаэкранны рэжым + Якасць выявы + Відэа + \? + Падпісчыкі + Якія ўкладкі паказаны на старонках канала + Падзяліцца спісам URL-адрасоў + Падзяліцца назвамі + %1$s +\n%2$s + Ўкладкі канала + Shorts + Загрузка метаданых… + Змяніць арыентацыю экрана + Нізкая якасць + Размяшчэнне асноўных укладак + Пераключыцца ў поўнаэкранны рэжым + Атрыманне ўкладак канала + Аватары + Наступны стрым + Медыятунэляванне было адключана па змаўчанні на вашай прыладзе, таму што ваша мадэль не падтрымлівае яго. + Аватары падканалаў + Адкрыйце чаргу прайгравання + Не загружаць выявы + Высокая якасць + Аб канале + Падзеліцца падборкай + Пераматаць наперад + Альбомы + Пераматаць назад + Паўтарыць + Атрыманыя ўкладкі пры абнаўленні стужкі. Гэты параметр не прымяняецца, калі канал абнаўляецца ў хуткім рэжыме. + Падзяліцца падборкай з такімі дэталямі, як назва спіса прайгравання і назвы відэа, або проста спіс URL-адрасоў відэа + Сярэдняя якасць + Загрузнік аватараў + Банеры + Падборкі + - %1$s: %2$s + Перамясціць селектар галоўнай укладкі ўніз + Няма жывых трансляцый + Выберыце якасць выявы і ці спампоўваць выявы ўвогуле, каб паменшыць выкарыстанне дадзеных і памяці. Змены ачышчаюць кэш малюнкаў як ў памяці, так і на дыску - %s + Прайграць + Іншыя опцыі + Мініяцюры + Дарожкі + Працягласць + Няма трансляцый + Каналы + Папярэдні стрым + Жывая трансляцыя + + %s адказ + %s адказы + %s адказаў + %s адказаў + + Паказаць больш + Паказаць менш + Адрэдагуйце кожнае дзеянне апавяшчэння, націснуўшы на яго. Першыя тры дзеянні (прайграванне/паўза, папярэдняе і наступнае) задаюцца сістэмай і не могуць быць зменены. \ No newline at end of file diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 24bf7a764..78dcd0a93 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -151,7 +151,6 @@ Добавяне към Използвай бързо, но неточно превъртане По-бързо превъртане с по-ниска прецизност. Превъртане с по 5, 15 или 25 секунди няма да работи с тази опция - Зареждай миниатюри Кеш-паметта с изображения е изтрита Изтрий кешираните метаданни Премахни всички метаданни за уебстраници от кеш-паметта @@ -177,7 +176,6 @@ Изтрива историята с въвежданите за търсене ключови думи Изтрий цялата история на търсенията\? Историята на търсенията е изтрита. - URL подписът на клипа не можа да бъде дешифрован Външните плейъри не поддържат този вид линкове Невалидна директория Невалиден файл или източник на съдържание @@ -205,7 +203,6 @@ Прочетете нашата политика за поверителност Лицензът на NewPipe Липсва стрийм плейър (можете да изтеглите VLC, за да пуснете стрийма). - Изключете, за да спрете зареждането на всички миниатюри, спестявайки трафик и памет. При промяна на тази настройка, текущата кеш-памет на изображенията ще бъде изтрита Показвай подсказка при избор на фоновия режим или режим в прозорец от екрана за „Детайли“ към видео Изтрива историята на възпроизвежданите стриймове и позицията на възпроизвеждането Не са намерени видео стриймове @@ -424,7 +421,6 @@ Поддръжка Сървър Публичен - Миниатюра линк Език на интерфейса Спри звука пост-обработката @@ -449,7 +445,7 @@ Отбелязан със сърце от автора Конференции Най-харесвани - Готово + Готово Коментари Езикът ще се смени след рестартиране на приложението Скрит @@ -471,7 +467,7 @@ Изберете инстанция Коментарите са изключени Кои раздели се показват на началната страница - Няма свободно място на устройството + Няма свободно място на устройството %d секунда %d секунди @@ -559,4 +555,19 @@ Наскоро добавено Буфериране Разбийте плейъра + Изключете, за да скриете полетата с мета информация с допълнителна информация за създателя на потока, съдържанието на потока или заявка за търсене + Автоматично поставяне в опашка + Редактирайте всяко действие за известяване по-долу, като го докоснете. Изберете до три от тях, които да бъдат показани в компактното известие, като използвате квадратчетата за отметка вдясно + Изберете оригиналния аудио запис независимо от езика + Превключването от един плейър на друг може да замени вашата опашка + Изберете аудиозапис с описания за хора с увредено зрение, ако има такъв + Действие с жест наляво + Предпочитай описателно аудио + Променете размера на интервала на зареждане на прогресивно съдържание (в момента %s). По-ниска стойност може да ускори първоначалното им зареждане + Предпочитай оригинално аудио + Опашката на активния плейър ще бъде заменена + Полезно, например, ако използвате слушалки със счупени физически бутони + Размер на интервала на зареждане при възпроизвеждане + Игнорирайте събитията с хардуерни медийни бутони + Изберете жест за лявата половина на екрана на плейъра \ No newline at end of file diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 4e6655e45..7ac77e353 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -61,7 +61,6 @@ ত্রুটি নেটওয়ার্ক ত্রুটি সব থাম্বনেইল লোড করা যায়নি - ভিডিও URL স্বাক্ষর ডিক্রিপ্ট করা যায়নি ওয়েবসাইট বিশ্লেষন করা যায়নি কন্টেন্ট উপলব্ধ নয় ডাউনলোড মেনু সেটআপ করা যায়নি @@ -140,8 +139,6 @@ দ্রুত-ফরওয়ার্ড/-পুনরায় সন্ধান সময়কাল মন্তব্যসমূহ লুকাতে বন্ধ করুন মন্তব্যসমূহ দেখাও - থাম্বনেইল লোড করো - থাম্বনেইল প্রদর্শন বন্ধ করার মাধ্যমে, ডাটা এবং মেমোরি সংরক্ষণ করুন। অপশনটি‌ পরিবর্তনে ইন-মেমোরি এবং অন-ডিস্ক ইমেজ ক্যাশ উভয়ই মুছে যাবে। ছবির ক্যাশ মোছা হয়েছে সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো ক্যাশ করা মেটাডেটা মোছ @@ -168,7 +165,7 @@ বন্ধ করুন ডাউনলোড করা ফাইলগুলো ডিলিট করুন ডাওন লোড ইতিহাস মুছুন - ডিভাইস এ স্পেস নেই + ডিভাইস এ স্পেস নেই পাওয়া যায় নি সার্ভার পাওয়া যায় নি এরর দেখান @@ -260,7 +257,7 @@ পিয়ার টিউব এর ইন্সটান্স সমূহ ছক স্থানীয় - হয়েছে + হয়েছে ইভেন্টগুলো আপডেট কোনোটি না @@ -300,7 +297,7 @@ থাম্বনেল ১:১ অনুপাতে সেট করো সিস্টেম ডিফল্ট প্লেলিস্ট বুকমার্ক করুন - "যখন পর্যাপ্ত নিবেদিত ফিড থেকে ডাটা সংগ্রহ করুন" + যখন পর্যাপ্ত নিবেদিত ফিড থেকে ডাটা সংগ্রহ করুন সবসময় হালনগাদ করুন শেষ হালনাগাদের পর একটি সাবস্ক্রিপশনের আগের সময় সেকেলে বিবেচিত — %s ফিড হালনাগাদ প্রবেশস্থল @@ -320,11 +317,11 @@ চ্যানেল গ্রুপ %d দিন - "%d দিন" + %d দিন %d ঘন্টা - "%d ঘন্টা" + %d ঘন্টা %d মিনিট diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 162dfde39..29522f6ad 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -44,7 +44,6 @@ ডাউনলোড মেনু সেটআপ করা যায়নি কন্টেন্ট উপলব্ধ নয় ওয়েবসাইট বিশ্লেষন করা যায়নি - ভিডিও URL স্বাক্ষর ডিক্রিপ্ট করা যায়নি সব থাম্বনেইল লোড করা যায়নি নেটওয়ার্ক ত্রুটি ত্রুটি @@ -79,10 +78,8 @@ সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো ক্যাশ করা মেটাডেটা মুছো ছবির ক্যাশ মুছে ফেলা হয়েছে - থাম্বনেইল প্রদর্শন বন্ধ করার মাধ্যমে, ডাটা এবং মেমোরি সংরক্ষণ করুন। অপশনটি‌ পরিবর্তনে ইন-মেমোরি এবং অন-ডিস্ক ইমেজ ক্যাশ উভয়ই মুছে যাবে মতামত প্রদর্শন বন্ধ করতে অপশনটি বন্ধ করুন মতামত প্রদর্শন করুন - থাম্বনেইল লোড করুন দ্রুত-ফরওয়ার্ড/-পুনরায় সন্ধান সময়কাল অনির্দিষ্ট সন্ধান প্লেয়ারকে আরো দ্রুত গতিতে সন্ধান করার সুবিধা দেয়, কিন্তু এটি সম্পূর্ণ নির্ভুল নাও হতে পারে ৷ ৫, ১৫ ও ২৫ সেকেন্ডের জন্য এটা কাজ করবে না ৷ দ্রুত টানা ব্যাবহার করুন @@ -144,7 +141,7 @@ অ্যাপ এর ভাষা বন্ধ করুন ডাওন লোড ইতিহাস মুছুন - ডিভাইস এ স্পেস নেই + ডিভাইস এ স্পেস নেই পাওয়া যায় নি সার্ভার পাওয়া যায় নি ডাউন লোড হয় নি @@ -242,7 +239,7 @@ যোগদান নিউ পাইপ এর সম্বন্ধে শব্দ ও নম্বর - হয়েছে + হয়েছে কোন মন্তব্য নেই কোন সাবস্ক্রাইবার নেই ডাউন লোড এর জন্য কোন স্ট্রিম নেই @@ -278,7 +275,7 @@ নিউ পাইপ ওয়েব সাইট এ যান বিস্তারিত বিবরণ ও খবর এর জন্য ১০০+ ভিডিও - "%s শ্রোতা" + %s শ্রোতা %s শ্রোতা গন বিবরণ diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 6c3cca7a1..c0851f9d6 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -10,7 +10,7 @@ বন্ধ করুন ডাউনলোড করা ফাইলগুলো ডিলিট করুন ডাওন লোড ইতিহাস মুছুন - ডিভাইস এ স্পেস নেই + ডিভাইস এ স্পেস নেই পাওয়া যায় নি সার্ভার পাওয়া যায় নি এরর দেখান @@ -78,7 +78,7 @@ নিউপাইপ এর সম্বন্ধে শব্দ ও নম্বর ডাউনলোড - হয়েছে + হয়েছে reCAPTCHA চ্যালেঞ্জ অনুরোধ করা হয়েছে reCAPTCHA চ্যালেঞ্জ একটি আইটেম ডিলিট হয়েছে। @@ -140,7 +140,6 @@ ডাউনলোড মেনু সেটআপ করা যায়নি কন্টেন্ট উপলব্ধ নয় ওয়েবসাইট বিশ্লেষন করা যায়নি - ভিডিও URL স্বাক্ষর ডিক্রিপ্ট করা যায়নি সব থাম্বনেইল লোড করা যায়নি নেটওয়ার্ক ত্রুটি বাহ্যিক স্টোরেজ নেই @@ -225,10 +224,8 @@ সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো ক্যাশ করা মেটাডেটা মুছো ছবির ক্যাশ মুছে ফেলা হয়েছে - থাম্বনেইল প্রদর্শন বন্ধ করার মাধ্যমে, ডাটা এবং মেমোরি সংরক্ষণ করুন। অপশনটি‌ পরিবর্তনে ইন-মেমোরি এবং অন-ডিস্ক ইমেজ ক্যাশ উভয়ই মুছে যাবে মতামত প্রদর্শন বন্ধ করতে অপশনটি বন্ধ করুন মতামত প্রদর্শন করুন - থাম্বনেইল লোড করুন দ্রুত-ফরওয়ার্ড/-পুনরায় সন্ধান সময়কাল অনির্দিষ্ট সন্ধান, চালককে আরো দ্রুত গতিতে সন্ধান করার সুবিধা দেয়, কিন্তু এটি সম্পূর্ণ নির্ভুল নাও হতে পারে ৷ ৫, ১৫ ও ২৫ সেকেন্ডের জন্য এটা কাজ করবে না। দ্রুত টানা ব্যাবহার করুন @@ -246,17 +243,17 @@ প্রথম ক্রিয়া বোতাম থাম্বনেলে ১:১ অনুপাতে করো Kodi মিডিয়া সেন্টারে এর মাধ্যমে ভিডিও প্লে করার জন্য একটি বিকল্প প্রদর্শন কর - \"Kodi দ্বারা চালান\" বিকল্পটি প্রদর্শন কর - অনুপস্থিত কোড অ্যাপ ইনস্টল করবেন\? - Kodi দ্বারা চালাও + \"Kodi-তে প্লে করুন\" দেখান + Kodi ইনস্টল করবেন? + Kodi-তে প্লে করুন শুধুমাত্র কিছু ডিভাইস 2K/4K ভিডিও চালাতে পারে - উচ্চতর রেজুলেশন প্রদর্শন করা হবে - সহজাত ভাসমান আকার - সহজাত আকার - অডিও ফাইলগুলির জন্য ডাউনলোডের ফোল্ডার নির্বাচন করুন - ডাউনলোড করা অডিও ফাইলগুলি এখানে সঞ্চিত থাকে + উচ্চতর রেজুলেশন দেখান + স্বাভাবিক পপ-আপ রেজুলেশন + স্বাভাবিক রেজুলেশন + অডিও ডাউনলোডের জন্য ফোল্ডার নির্বাচন করুন + ডাউনলোড করা অডিও এখানে থাকবে অডিও ডাউনলোড ফোল্ডার - ভিডিওগুলি ডাউনলোডের জন্য ফোল্ডার নির্বাচন করুন + ভিডিও ডাউনলোডের জন্য ফোল্ডার নির্বাচন করুন ডাউনলোড করা ভিডিওগুলো এখানে থাকে ভিডিও ডাউনলোড করার ফোল্ডার যুক্ত করুন @@ -264,33 +261,33 @@ ব্যাকগ্রাউন্ড ট্যাব পছন্দ করুন বুকমার্ক করা প্লেলিস্টসমূহ - সদস্যতা + সাবস্ক্রিবশন তথ্য দেখুন - সদস্যতা হালনাগাদে ব্যর্থ - সদস্যতা পরিবর্তন করা যায়নি - চ্যানেল থেকে আনসাবস্ক্রাইব্ড + সাবস্ক্রিবশন হালনাগাদ করা সম্ভব হয়নি + সাবস্ক্রিবশন পরিবর্তন করা সম্ভব হয়নি + চ্যানেল আনসাবস্ক্রাইব করা হয়েছে আনসাবস্ক্রাইব - সাবস্ক্রাইব করা আছে + পূর্ব-সাবস্ক্রাইবকৃত সাবস্ক্রাইব - বহির্গত অডিও প্লেয়ার ব্যবহার করুন - কিছু রেজোলিউশনে অডিও অপসারণ করে দেয় - বাইরের ভিডিও প্লেয়ার ব্যবহার করুন + অন্যান্য অডিও প্লেয়ার ব্যবহার করুন + কিছু কিছু রেজুলেশনে অডিও ঠিকঠাক থাকবে না + অন্যান্য ভিডিও প্লেয়ার ব্যবহার করুন শেয়ার করুন - রেজাল্ট দেখানো হচ্ছেঃ %s - তুমি কি বুঝিয়েছো ‘%1$s’\? + ফলাফল দেখানো হচ্ছেঃ %s + আপনি কি ‘%1$s’ বোঝাচ্ছেন? সেটিংস খুঁজুন - স্ট্রিম ফাইল ডাউনলোড করুন - ডাউনলোউড + ডাউনলোড করুন + ডাউনলোড শেয়ার - ভাসমান অবস্থায় খুলো - ব্রাউজারে খুলো + পপআপ মুডে চালু করুন + ব্রাউজারে চালু করুন বাতিল ইনস্টল - কোনো ধারা চালক পাওয়া যায়নি (প্লে করতে VLC ইন্সটল করতে পারো)। - কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি। VLC ইনস্টল করতে চান\? + কোনো মিডিয়া প্লেয়ার পাওয়া যায়নি (মিডিয়া প্লে করতে VLC ইন্সটল করতে পারেন)। + কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি। VLC ইনস্টল করতে চান কি? প্রকাশকাল %1$s - আতশী কাঁচে টিপ দিয়ে শুরু করো। + আতশ কাঁচে চাপ দিয়ে শুরু করো। বাফারিং সাফল পঞ্চম অ্যাকশন বাটন @@ -345,7 +342,7 @@ রিক্যাপচা কুকিগুলো পরিষ্কার করা হয়েছে হ্যাঁ, এবং আংশিকভাবে দেখা ভিডিও ব্যবস্থা দ্বারা ক্রিয়া অস্বীকার করা হয়েছে - "স্বয়ংক্রিয়ভাবে প্লেব্যাক শুরু করো %s — তে" + স্বয়ংক্রিয়ভাবে প্লেব্যাক শুরু করো %s — তে একটি পপ-আপে প্লে শুরু করো পটভূমিতে প্লে শুরু করো অ্যান্ড্রয়েডে মুক্তভাবে ও সহজে প্রচার দেখার অ্যাপ। @@ -435,7 +432,7 @@ অধ্যায় মতামত বর্ণনা - দিয়ে খুলো + অন্য অ্যাপে ওপেন করুন ফিড হালনাগাদ সীমা খালি গ্রুপ নাম কোনো সদস্যতা নির্বাচিত হয়নি @@ -534,7 +531,8 @@ রিক্যাপচা পূরণ করলে নিউপাইপ যেসব কুকি রাখে তা মুছো ধারা ভুক্তিতে সেবাগুলোর মূল লেখা দৃশ্যমান হবে অনুসন্ধান ইতিহাস থেকে এই ভুক্তিটি মুছবে\? - প্রত্যেক ডাউনলোড কোথায় রাখা হবে তা জিজ্ঞেস করা হবে + প্রত্যেক ডাউনলোড কোথায় রাখা হবে তা জিজ্ঞেস করা হবে। +\nমেমোরি কার্ডে ডাউনলোড করতে সিস্টেম ফোল্ডার পিকার (SAF) এনেবল করুন এই নামের একটি ডাউনলোড চলমান অ্যাপ আবার শুরু হলে ভাষা পাল্টাবে মিডিয়া সুরঙ্গকরণ অক্ষম @@ -550,7 +548,6 @@ প্রক্রিয়াকরণ ফিডে ত্রুটি ওয়েবসাইট খুলুন অ্যাকাউন্ট ধ্বংসকৃত - প্রতিচ্ছবি সংযোগ বয়সসীমা অভ্যন্তরীণ ব্যক্তিগত @@ -570,10 +567,10 @@ বন্ধ চালু - ডাউনলোড সমাপ্ত - %sটি ডাউনলোড সমাপ্ত + ডাউনলোড শেষ + %sটি ডাউনলোড শেষ - দেখা হয়েছে চিহ্নিত করো + দেখা হয়েছে বলে চিহ্নিত করুন চালক বিজ্ঞপ্তি নিম্ন মান(ছোট) মূল তৈরিকারকের পছন্দ করা @@ -627,8 +624,8 @@ ত্রুটি স্ন্যাকবার দেখাও নতুন সংস্করণের জন্য নিজে দেখো - %1$sটি ডাউনলোড মুছা হয়েছে - %1$sটি ডাউনলোড মুছা হয়েছে + %1$sটি ডাউনলোড মোছা হয়েছে + %1$sটি ডাউনলোড মোছা হয়েছে \"চালক বন্ধ করো\" দেখাও বিজ্ঞপ্তি নিষ্ক্রিয় diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 50dcf839c..4921a6aa8 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -73,7 +73,6 @@ Prebacivanje sa jednog pokretača na drugi bi van moglo zamijeniti pokretni red Isključite da sakrijete komentare Pitajte za potvrdu prije isčišćavanja reda - Isključite kako bi ste spriječili učitavanje sličica, sto če vam spasiti korištenje podataka i memorije. Promjene čiste slike oboje u memoriji i predmešiju na disku Prikažite komentare Pokažite \'Sljedeće\' i \'Slične\' video zapise Prikažite opis @@ -115,5 +114,4 @@ Pokrenite s KODI-jem Vrijeme premotavanja naprijed/nazad Aktivni pokretni red će biti zamijenjen - Učitajte sličice \ No newline at end of file diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 010823e43..19a74923f 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -121,7 +121,6 @@ Recorda la darrera mida i posició del reproductor emergent Cerca ràpida poc precisa La cerca poc precisa permet que el reproductor cerqui una posició més ràpidament amb menys precisió. Cerques de 5, 15 o 25 segons no funcionaran - Carrega les miniatures S\'ha eliminat la memòria cau d\'imatges Elimina les metadades de la memòria cau S\'ha esborrat la memòria cau de metadades @@ -138,7 +137,6 @@ Notificació de NewPipe Notificacions per al reproductor de NewPipe No s\'han pogut carregar totes les miniatures - No s\'ha pogut desxifrar la signatura de l\'URL del vídeo No s\'ha pogut processar el lloc web Contingut no disponible No s\'ha pogut configurar el menú de baixades @@ -153,7 +151,7 @@ El fitxer no existeix o bé no teniu permisos de lectura/escriptura El nom del fitxer no pot estar en blanc S\'ha produït un error: %1$s - Informeu de l\'error per correu electrònic + Informeu per correu electrònic S\'han produït alguns errors. Informe Informació: @@ -217,7 +215,6 @@ Toca \"Cerca\" per començar. Elimina l\'àudio en algunes resolucions Reproductor d\'àudio extern - Desactiveu-ho per no guardar miniatures i estalviar dades i memòria. Canviant aquesta opció, s\'eliminarà la memòria cau d\'imatges tant de la memòria com de l\'emmagatzematge Emmagatzema les cerques localment Crea un historial de vídeos visualitzats Reprèn la reproducció @@ -388,7 +385,7 @@ Reprèn la reproducció No es pot sobreescriure el fitxer Hi ha una baixada pendent amb aquest nom - No hi ha espai disponible al dispositiu + No hi ha espai disponible al dispositiu S\'ha perdut el progrés perquè s\'ha eliminat el fitxer S\'ha excedit el temps d\'espera de la connexió Esteu segurs que voleu esborrar el vostre historial de baixades o esborrar-ne tots els fitxers\? @@ -538,7 +535,7 @@ Local Encara no hi ha llistes de reproducció favorites Sel·leccioneu una llista de reproducció - Fet + Fet Calculant-ne la funció de verificació Si us plau, comproveu abans si el problema que ha causat aquesta fallada ja ha estat informat. Els tiquets per duplicat fan que perdem temps que podríem aprofitar resolent-los. Avisa del problema a GitHub @@ -564,7 +561,7 @@ Mescla Repeteix El màxim d\'accions que poden aparèixer en una notificació compacta és de tres! - Editeu cada acció de la notificació tocant el botó corresponent. Podeu seleccionar-ne fins a tres, que es mostraran a les notificacions en format compacte + Editeu cada acció de la notificació tocant el botó corresponent. Podeu seleccionar-ne fins a tres, que es mostraran a les notificacions en format compacte. Cinquè botó d\'acció Quart botó d\'acció Tercer botó d\'acció @@ -602,7 +599,6 @@ Privat Descatalogat Públic - URL de la miniatura Amfitrió Suport Idioma @@ -696,9 +692,26 @@ Cualitat desconeguda Ordenar Configura la notificació de reproducció actual. - Canvia la mida de l\'interval de càrrega (actualment %s). Un valor inferior pot accelerar la càrrega inicial del vídeo. Els canvis requereixen un reinici del jugador. + Canvia la mida de l\'interval de càrrega en continguts progressius (actualment %s). Un valor inferior pot accelerar la càrrega inicial del vídeo. Ignora els esdeveniments dels botons de reproducció físics Útil, per exemple, si feu servir uns auriculars amb els botons físicament trencats Trieu un gest per la part esquerra de la pantalla Mida de l\'interval de càrrega de reproducció + Acció de gest esquerra + Editeu cada acció de notificació de sota tocant-la. Les tres primeres accions (reproduir/pausa, anterior i següent) són establertes pel sistema i no es poden personalitzar. + Tria un gest per a la meitat dreta del reproductor + Acció del gest dret + Brillantor + Volum + Cap + Mou el selector de pestanya principal a la part inferior + Posició de les pestanyes principals + Prefereix àudio descriptiu + Seleccioneu la pista d\'àudio original independentment de l\'idioma + Prefereix l\'àudio original + Mode ràpid + Carregant Metadades… + Seleccioneu una pista d\'àudio amb descripcions per a persones amb discapacitat visual si està disponible + Nous streams + Notificacions sobre nous streams per a subscripcions \ No newline at end of file diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index f761323f9..7c60b33c0 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -16,13 +16,12 @@ پڕۆژەی نیوپایپ زانیارییە تایبەتییەکانت بە وردی دەپارێزێت. هەروەها به‌رنامه‌كه‌ هیچ زانایارییەکت بەبێ ئاگاداری تۆ بەکارنابات. \n‫سیاسەتی تایبەتی نیوپایپ بە وردی ڕوونکردنەوەت دەداتێ لەسەر ئەو زانیاریانەی وەریاندەگرێت و بەکاریاندەبات. ناتوانرێت لە بیرگەی دەرەکیدا داببەزێنرێت . شوێنی فۆڵده‌ری دابه‌زاندنەکان ڕێکبخرێتەوە؟ - ناکارای بكه‌ بۆ وەستاندنی باركردنی وێنۆچكه‌كان، داتا دەپارێزێت و کەمتر بیرگە بەکاردەبات, گۆڕینی ئه‌مه‌ ده‌بێته‌ هۆی سڕینه‌وه‌یان له‌سه‌ر بیرگه‌ی مۆبایله‌كه‌ت - ئایا مەبەستت ئه‌مه‌یه‌ \"%1$s\"؟ + مەبەستت لە ئەمەیە ٪1$s ؟ ماوەی نوێكردنه‌وه‌ی فیید هێڵەکی به‌رده‌وامبوون له‌ (به‌بێ دووباره‌كردنه‌وه‌) نۆبه‌تی کارپێکەر به‌پێی په‌خشی هاوشێوه‌ سنووردانانی نۆرەی دابەزاندن - بیرگەی ناوەکیت پڕ بووە + بیرگەی ناوەکیت پڕ بووە ژمارەی بەژداری نادیارە ناتوانرێت لەسەر ئەو فایله‌وه‌ جێگیر بکرێت په‌ڕه‌ هەڵبژێرە @@ -34,7 +33,7 @@ ناو چارەسەرکردن هه‌ره‌سی هێنا بچوکبوونەوە لەکاتی گۆڕینی به‌رنامه‌ - فایلی ڤیدیۆ دابه‌زێنراوەکان لێرەدا هەڵدەگیرێن + فایلی ڤیدیۆ داگیراوەکان لێرەدا هەڵدەگیرێن هەناردە کردنی مێژوو ، بەژدارییه‌كان ، خشته‌لێدانه‌كان و ڕێكخستنه‌كان بردنەپێشی ناتەواوی خێرا وا لە لێدەرەکە دەکات کە بەخێرایی شوێنەکە بگۆڕێت. بردنەپێشی ٥ یان ١٥ یان ٢٥ چرکەیی لەگەڵ ئەمەدا کارناکات سکاڵاکردن لەسەر نەگەیاندنی Rx ی پەسەندنەکرا لە دەرەوەی پارچە یان چالاکی لەدوای پوختەکردن @@ -91,7 +90,7 @@ لێدان به‌ Kodi ناتوانرێت لێدوانەکان باربکرێن بەستەری دۆخ دابنێ - فایلی دەنگە دابه‌زێنراوەکان لێرەدا هەڵدەگیرێن + فایلی دەنگە داگیراوەکان لێرەدا هەڵدەگیرێن ببورە، هەندێك کێشە ڕوویدا. هەناردە کردن بۆ ڕەفتار @@ -106,14 +105,13 @@ لادانی نیشانه‌كراو مۆڵەتەکان ناتوانرێت به‌ژداریكردنه‌كه‌ نوێبكرێته‌وه‌ - پاشبنەما + پشت شاشە بێ ئەنجامه‌ زمان دەگۆڕدرێت لەدوای داگیرساندنەوەی به‌رنامه‌كه‌ لادانی سەیرکراو پیشاندانی نیشانەکەری شوێنی کارپێکەر لە خشتەکاندا - باركردنی وێنۆچكه‌كان شوێنەکان لە خشتەکاندا - به‌ژداریت + به‌ژداریتکرد بەهۆی گۆڕانکاری لە شێوەی ژێرنووسکردنەکە. پێویستە به‌رنامه‌كه‌ دابگیرسێنیته‌وه‌ %d دیار کراوه‌ @@ -134,8 +132,8 @@ ‫%s بینراو ‫%s بینراوان - ڕاگرتن - فۆڵدەری دابه‌زاندنی فایله‌ دەنگییەکان هەڵبژێرە + وەستاندن + فۆڵدەری داگرتنی فایله‌ دەنگییەکان هەڵبژێرە نوێ سڕینەوەی مێژووی سەیرکراو بەردەوام بوونی کارپێکەر @@ -160,7 +158,7 @@ لێدانی گشتی هەمان فایل/بابەت بوونی نییە دەستپێکردن - به‌ژداری + به‌ژداریکردن بژاردەی ”لێدان بە Kodi“ پیشانبدرێت به‌ژدارییه‌كان پەڕەی بەتاڵ @@ -201,12 +199,12 @@ وێنۆچکەی سه‌روێنه‌ی کەناڵ دەتەوێت ڕێکخستنەکانیش هاوردە بكرینه‌وه‌؟ هیچ لێدەرێکی ڤیدیۆیی نه‌دۆزرایه‌وه‌. ده‌ته‌وێت VLC دابمەزرێنیت؟ - فۆڵده‌ری دابه‌زاندنی ڤیدیۆ + فۆڵده‌ری داگرتنی ڤیدیۆ کردنەوەی پلیکانە ڕووناك ئەو پێشنیازکراوانە هەڵبژێرە کە پیشان دەدرێن لەکاتی گەڕاندا کردارەکە هه‌ره‌سی هێنا, چونکە ئەو فایله‌ سڕاوەتەوە - زیادکردن بۆ + زیادی بکە بۆ به‌ژداری نییه‌ دۆخی پێرتووب خشتەلێدان سازکرا @@ -216,7 +214,7 @@ ∞ ڤیدیۆ بەکارهێنانی بردنەپێشی ناتەواوی خێرا هەڵەیەک ڕوویدا : %1$s - فۆڵده‌ری دابه‌زاندن بۆ فایلی ڤیدیۆکان هەڵبژێرە + فۆڵده‌ری داگرتن بۆ فایلی ڤیدیۆکان هەڵبژێرە ساز کراوه‌ لەلایەن %s بەکارهێنەران بابەت @@ -230,7 +228,7 @@ سیاسەتی تایبەتی نیوپایپ دابه‌زاندن ناكاراکردنی دۆخی خێرا - كردنه‌وه‌ له‌ وێبگه‌ر + ئەم بڕگەی پێڕستە ڤیدیۆیەک یان ستریمێکی دەنگی دەکاتەوە لە وێبگەڕێکدا ڕاژەکە هیچ داتایەک نانێرێت شوێنی کارپێکراوەکان سڕانەوە پەیامەکانی وەشانە نوێیەکانی نیوپایپ @@ -263,7 +261,7 @@ %d ڕۆژان ناولێنانه‌وه‌ - دابه‌زاندن + داگرتن باشە سڕینه‌وه‌ی پاشماوەی مێتاداتا ناتوانرێت ئەمه‌ داببه‌زێنرێته‌وه‌ @@ -295,7 +293,7 @@ دابه‌زاندنێكی دیكه‌ له‌ نۆره‌دایه‌ بەهەمان ناو هیچ بەژدارییەک دیار نەکراوە ناوی کۆمەڵە بەتاڵە - كرا + كرا بەدڵه‌كان بیرهاتنه‌وه‌ی كۆتا قه‌باره‌ و شوێنی په‌نجه‌ره‌ سازکردن @@ -328,7 +326,7 @@ قه‌باره‌ی بنەڕەتی بچووککردنەوە بۆ پەنجەرە گۆرانییەکان - دابه‌زاندنی فایلی پەخش + داگرتنی فایلی پەخش شێوازی پیشاندانی خشتە زیادکردنی دۆخ پەسەند @@ -344,7 +342,7 @@ بابەتی پەڕەی سەرەکی دیار کردنی بەژدارییەکان هاورده‌كردنی فایل - فۆڵده‌ری دابه‌زاندنی ده‌نگ + فۆڵده‌ری داگرتنی ده‌نگ هه‌ندێك له‌ قه‌باره‌كان ده‌نگیان تێدا نامێنێته‌وه‌ ڕووداوەکان وێنۆچکەی کەسی بەرزکەرەوە @@ -385,7 +383,6 @@ هەمان فۆڵدەر بوونی نییە نیشانه‌كردنی خشته‌لێدان ناوی فایل ناکرێت بەتاڵ بێت - ناتوانرێت واژووی بەستەری ڤیدیۆ بخوێنرێتەوە پیشاندانی پەیامێک بۆ ئامادەبوونی به‌رنامه‌ لەکاتی بەردەست بوونی وەشانی نوێ مێژووی سەیرکردن سکاڵا لەسەر کێشەکان @@ -393,7 +390,7 @@ دەستپێکردنی لێدان لە پاشبنەماوە ناوفایل دانان لەسەر وێنۆچکەی خشتەلێدان - دەربارەی نیوپایپ + دەربارەی NewPipe زیادکردن بۆ خشتەلێدان (نەزانراو) زمانی به‌رنامه‌ @@ -472,7 +469,7 @@ سڕینەوەی پاشماوەی هەموو ماڵپه‌ڕه‌كان بەرنامەکە نه‌دۆزرایه‌وه‌. دابمه‌زرێت؟ ناتوانرێ پشتگیری دۆخەکە بکرێ - دامەزراندن + دابەزاندن ڤیدیۆکان بەستەرەکە پشتگیری نەکراوە قیڕ @@ -487,7 +484,7 @@ لەیەک کاتدا تەنیا یەک بابەت دادەبەزێنرێت دەتەوێت بگەڕێنرێتەوە بۆ شێوازی بنەڕەتی؟ وەستاندنی دابەزاندنەکان - دەربارە + دەربارە و پرسیارەکان پیشاندانی لێدوانەکان بۆ جێبەجێکردنی فرمانەکان لەگەڵ یاسای پاراستنی داتای گشتی ئەوروپیدا (GDPR) , ئێمە سەرنجت ڕادەکێشین بۆ سیاسەتە تایبەتییەکانی نیوپایپ. تکایە بەئاگادارییەوە بیخوێنەره‌وە. \nپێویستە په‌سه‌ندی بکەیت بۆ ناردنی سکاڵاکانت. @@ -505,7 +502,7 @@ کاتی دوای دواین نوێکردنەوە پێش بەژداربوون ڕەچاوکراوە — %s بیرگەی دەرەکی بەردەست نییە گێڕانەوەی کارپێکەر بۆ شوێنی پێشووتر - پاشگه‌زبوونه‌وه‌ + هەڵوەشاندنەوه تراکەکان ڕێکخستنەکانی دەنگ پرست پێ دەکرێت بۆ شوێنی دابەزاندنی هەر بابەتێک. @@ -544,7 +541,7 @@ تێکەڵکردن دووبارە دەتوانیت تا سێ كردار دیار بكه‌یت تا پیشان بدرێن له‌ پەیامەکەدا! - ده‌ستكاری هه‌ر یه‌كێك له‌م كردارانه‌ی خواره‌وه‌ بكه‌ له‌ڕێگه‌ی كرته‌ له‌سه‌ریان. ده‌توانیت تا زیاتر له‌ سێ دانه‌یان هه‌ڵبژێریت له‌ ڕێگای چوارگۆشه‌كانی لای ڕاسته‌وه‌یان، تا پیشان بدرێن له‌ پەیامەکاندا + دەستکاریکردنی هەر کردارێکی ئاگادارکەرەوە لە خوارەوە بە دەستلێدان. ۳- دانە هەڵبژێرە لە ڕێگەی بەکارهێنانی سندوقەبچوکەکە لای ڕاستەوە نیشان دەدرێت پێنجه‌م كرداری دوگمه‌ چواره‌م كرداری دوگمه‌ سێیه‌م كرداری دوگمه‌ @@ -558,7 +555,7 @@ پیشاندانی زانیاری مێتا ناكارایبكه‌ بۆ شاردنه‌وه‌ی دیسکریپشن له‌سه‌ر ڤیدیۆ و زانیاری زیاتر پیشاندانی دیسکریپشن - ڕووكاری شه‌و + ڕووكاری تاریک ئه‌ندرۆید ڕه‌نگی پەیام دڵخواز ده‌كات به‌پێی ڕه‌نگی سه‌ره‌كی وێنۆچكه‌كه‌ ( ڕه‌چاوی ئه‌وه‌ بكه‌ كه‌ ئه‌م تایبه‌تمه‌ندییه‌ هه‌موو ئامێرێك ناگرێته‌وه‌ ) ڕه‌نگكردنی پەیام یوتوب ”دۆخی قه‌ده‌غه‌كراو” پێشكه‌ش ده‌كات كه‌ بابەتە نه‌شیاوه‌كان ده‌شارێته‌وه‌ @@ -585,12 +582,11 @@ \nجا ده‌ته‌وێت به‌ژداری لابده‌یت له‌م كه‌ناڵه‌؟ ناتوانرێت فیید باربکرێت تا ً`%s` . هه‌ڵه‌ له‌ باركردنی فیید - ئه‌م تایبه‌تمه‌ندییه‌ كارابكه‌ گه‌ر ڕوونمای ڕه‌ش یاخوود جامبوونی کارپێکەرت ئه‌زموون كرد + ئەگەر تووشی شاشەی ڕەش یان لکەلکە بوویت لە کاتی پەخشکردنی ڤیدیۆدا، تونێلکردنی میدیا لەکاربخە. ناوەکی تایبەتی خشتەنەکراو گشتی - بەستەری وێنۆچکە هۆست پشتگیری زمان @@ -669,11 +665,11 @@ لێدوانی هەڵواسراو کڕاش کردنی لێدەر پیشاندانی هەڵەی سناکباڕ - هیچ ڕێکخەرێکی فایلی گونجاو نەدۆزرایەوە بۆ ئەم کردارە. -\nتکایە ڕێکخەری فایلییەک دابمەزرێنە لۆ هەوڵدانی ناکاراکردنی \'%s\' لە ڕێکخستنەکانی دابەزاندندا. + هیچ FileManager پەڕگەی گونجاو بۆ ئەم کردارە نەدۆزراوەتەوە. +\nتکایە بەڕێوەبەری پەڕگەیەک دابمەزرێنە یان هەوڵبدە \'%s\' لە Settings بڕۆ Download لەکاربخە LeakCanary بەردەست نییە - هیچ ڕێکخەرێکی فایلی گونجاو نەدۆزرایەوە بۆ ئەم کردارە. -\nتکایە ڕێکخەرێکی فایلی دابمەزرێنە کە گونجاوبێت لەگەڵ دەسەڵاتی گەیشتن بە بیرگە. + هیچ FileManager گونجاو نەدۆزرایەوە بۆ ئەم کردارە. +\nتکایە FileManager دابمەزرێنە کە گونجاوبێت لەگەڵ دەسەڵاتی گەیشتن بە بیرگە. پشکنین کردن بۆ پەخشی نوێ پەیامەکانی پەخشە نوێیەکان پەیام بکرێم لەکاتی هەبوونی پەخشی نوێی بەژدارییەکان @@ -698,4 +694,12 @@ لەسەدا نیمچەتەن بنەڕەتی ExoPlayer + دیاریکردنی تراکی دەنگی ئەسڵی بێ گوێدانە زمانەکە + دەستکاریکردنی هەر کردارێکی ئاگادارکەرەوە لە خوارەوە بە دەستلێدان. یەکەم سێ کردار (لێدان/وەستان، پێشوو و دواتر) لەلایەن سیستەمەکەوە دانراوە و ناتوانرێت دەستکاری بکرێت. + پەسەند کردنی دەنگی وەسفکراو + گۆڕینی قەبارەی ماوەی لۆد لەسەر ناوەڕۆکی پێشکەوتوو (ئێستا ٪s). بەهایەکی کەمتر لەوانەیە بارکردنی سەرەتا خێراتر بکات + پەسەندکردنی دەنگی ئەسڵی + بەسوودە، بۆ نموونە، ئەگەر هێدسێتێک بەکاربهێنیت لەگەڵ دوگمەی فیزیکی شکاو + قەبارەی نێوان بارکردنی پەخشکردن + دوگمەی ڕووداوەکانی میدیای هاردوێر بەجێبهێڵە \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 1eb38085c..02f6486c9 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -39,7 +39,6 @@ Chyba Chyba sítě Nebylo možné nahrát všechny náhledy - Nebylo možné dekódovat URL videa Nebylo možné analyzovat stránku Obsah není k dispozici Přehrát video, délka: @@ -251,8 +250,6 @@ Vynutit hlášení nedoručitelných výjimek Rx mimo životnost fragmentu nebo aktivity po odstranění Použít rychlé nepřesné hledání Nepřesné hledání umožní přehrávači posouvat se rychleji, ale se sníženou přesností. Posouvání po 5, 15 nebo 25 vteřinách s tímto nefunguje - Načítat náhledy - Vypnutím zabráníte načítání miniatur, ukládání dat a spotřebě paměti. Změny vymažou mezipaměť obrázků v paměti i na disku Mezipaměť obrázků vymazána Vymazat metadata v mezipaměti Odstranit všechna data webových stránek v mezipaměti @@ -399,7 +396,7 @@ soubor nelze přepsat Soubor s tímto názvem již čeká na stažení NewPipe byl ukončen v průběhu zpracovávání souboru - V zařízení nezbývá žádné místo + V zařízení nezbývá žádné místo Postup ztracen, protože soubor byl smazán Jste si jisti smazáním své historie stahování nebo smazáním všech stažených souborů\? Omezit frontu stahování @@ -454,7 +451,7 @@ Jazyk aplikace Jazyk systému Po vyřešení klepněte na „Hotovo“ - Hotovo + Hotovo Videa %d vteřina @@ -557,7 +554,7 @@ Promíchat Opakovat Do kompaktního oznámení lze vybrat nejvíce tři akce! - Upravte každou akci oznámení níže poklepáním. Pomocí zaškrtávacích políček vpravo vyberte až tři z nich, které se mají zobrazit v kompaktním oznámení + Upravte každou akci oznámení níže poklepáním. Pomocí zaškrtávacích políček vpravo vyberte až tři z nich, které se mají zobrazit v kompaktním oznámení. Páté akční tlačítko Čtvrté akční tlačítko Třetí akční tlačítko @@ -615,7 +612,6 @@ Soukromé Neuvedeno v seznamu Veřejné - URL miniatury Server Podpora Jazyk @@ -779,4 +775,56 @@ Na vašem zařízení byl zakázán media tunelling, protože model vašeho zařízení jej nepodporuje. Žádná videa Žádné živé přenosy + Načítání metadat… + Karty kanálu k načtení + Karty, které načíst při aktualizaci odběrů. Tato možnost nemá žádný účinek, pokud je kanál aktualizován pomocí rychlého režimu. + Nahrané avatary + Náhledy + Kvalita obrázků + Videa + \? + Odběratelé + Které karty mají být zobrazeny na stránkách kanálů + Sdílet URL seznamu + Sdílet s názvy + %1$s +\n%2$s + Karty kanálu + Shorts + Přepnout orientaci obrazovky + Nízká kvalita + Přepnout celou obrazovku + Avatary + Další stream + Subkanálové avatary + Otevřít frontu přehrávání + Nenačítat obrázky + Vysoká kvalita + Informace + Sdílet playlist + Přetočení vpřed + Alba + Přetočení zpět + Znovu přehrát + Sdílejte playlist s podrobnostmi jako je jeho název a názvy videí, nebo jako jednoduchý seznam adres videí + Střední kvalita + Bannery + Playlisty + - %1$s: %2$s + Zvolte si kvalitu obrázků a volbu, zda se mají obrázky vůbec načítat, abyste snížili spotřebu dat a paměti. Změny vymažou mezipaměť obrázků v paměti i na disku — %s + Přehrát + Další možnosti + Skladby + Trvání + Kanály + Předchozí stream + Živě + + %s odpověď + %s odpovědi + %s odpovědí + + Zobrazit více + Upravte každou akci oznámení níže poklepáním. První tři akce (přehrání/pozastavení, předchozí a další) jsou nastaveny systémem a nemohou být přizpůsobeny. + Zobrazit méně \ No newline at end of file diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 0bd7e9875..f48ed7b3b 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -3,67 +3,65 @@ Tryk på forstørrelsesglasset for at komme i gang. Udgivet den %1$s Ingen streamafspiller blev fundet. Installér VLC\? - Ingen streamafspiller fundet (du kan installere VLC for at afspille den). - Installer - Annuller + Ingen streamafspiller blev fundet (du kan installere VLC for at afspille den). + Installér + Annullér Åbn i browser - Åbn i pop op-tilstand + Åbn i popup-tilstand Del - Download - Download stream-fil + Hent + Hent stream-fil Søg Indstillinger Mente du \"%1$s\"\? Del med - Benyt ekstern videoafspiller + Brug ekstern videoafspiller Fjerner lyd ved nogle opløsninger Brug ekstern lydafspiller - Abonner + Abonnér Abonnerer - Afmeld abonnement - Abonnement afmeldt + Afmeld + Kanal afmeldt Kunne ikke ændre abonnement Kunne ikke opdatere abonnement Vis info Abonnementer - Gemte spillelister - Vælg fane + Gemte Playlister + Vælg Fane Nyheder Baggrund - Pop op + Popup Føj til - Mappe til download af video - Downloadede videoer gemmes her - Angiv download-mappe for videofiler - Download-mappe for lydfiler - Downloadede lydfiler gemmes her - Angiv download-mappe for lydfiler + Lagringsmappe til videoer + Hentede videoer gemmes her + Vælg lagringsmappe til videofiler + Lagringsmappe til lydfiler + Hentede lydfiler gemmes her + Vælg lagringsmappe til lydfiler Standardopløsning - Standardopløsning for pop op + Standardopløsning til popup Vis højere opløsninger Kun nogle enheder kan afspille 2K-/4K-videoer Afspil med Kodi - Installer manglede Kode-app\? + Installér manglende Kore-app? Vis valgmuligheden \"Afspil med Kodi\" - Vis en knap til at afspille en video via Kodi-mediecenteret + Vis en mulighed for at afspille en video via Kodi-mediecenter Lyd - Standardformat for lydfiler - Standardformat for videofiler + Standard lydformat + Standard videoformat Tema - Lyst - Mørkt + Lys + Mørk Sort - Husk størrelse og placering af pop op - Husk sidste størrelse og placering af pop op-afspiller + Husk popup-egenskaber + Husk sidste størrelse og placering af popup-afspiller Brug hurtig og upræcis søgning - Upræcis søgning lader afspilleren finde placeringer hurtigere, men mindre præcist. Søgninger på 5, 15 eller 25 sekunder fungerer ikke med denne indstilling slået til - Indlæs miniaturebilleder - Slå fra for at undgå indlæsning af billeder, hvorved der spares data og hukommelse. Ændringer sletter billedcachen i både ram og lager - Billedcache slettet - Slet metadata-cachen - Slet alle websidedata fra cachen - Metadata-cache slettet - Føj automatisk næste stream til køen + Upræcis søgning lader afspilleren finde positioner hurtigere, men med nedsat præcision. Søgning i 5, 15 eller 25 sekunder fungerer ikke med dette + Billedcache ryddet + Ryd metadata-cache + Fjern alle cached websidedata + Metadata-cache ryddet + Føj automatisk næste stream til kø Fortsæt en afspilningskø, der afsluttes (ikke-gentagende), ved at tilføje en lignende stream Søgeforslag Vælg forslagene, der vises, når der søges @@ -73,100 +71,99 @@ Husk sete videoer Fortsæt afspilning Fortsæt afspilning efter afbrydelser (fx telefonopkald) - Download + Hent Vis \'Næste\' og \'Lignende\' videoer Vis \"Hold for at sætte i kø\"-tip - Vis et tip når der trykkes på baggrunds- eller pop op-knappen på siden med videodetaljer - Denne webadresse er ikke understøttet + Vis tip, når du trykker på baggrunden eller popup-knappen i video \"Detaljer:\" + Ikke-understøttet URL Standardland for indhold Standardsprog for indhold Afspiller - Opførsel + Adfærd Video og lyd Historik og cache Udseende Fejlretning Opdateringer Afspiller i baggrunden - Afspiller i pop op-tilstand + Afspiller i popup-tilstand Indhold Vis aldersbegrænset indhold Live - Downloads - Downloads + Hentet + Hentet Fejlrapport Alle Kanaler - Spillelister + Playlister Én video %s videoer Numre Brugere - Slået fra - Slet + Deaktiveret + Ryd Bedste opløsning Fortryd Fil slettet - Afspil alle + Afspil Alle Altid - Kun én gang + Kun Én Gang Fil - NewPipe notifikation + NewPipe-notifikation Notifikationer for NewPipes afspiller - Notifikation om opdatering af app - Notifikationer for nye NewPipe versioner + Notifikation om app-opdatering + Notifikationer for nye NewPipe-versioner [Ukendt] Skift til baggrund - Skift til pop op + Skift til popup Skift til hovedafspiller - Importer database - Eksporter database - Overskriver din nuværende historik, abonnementer, spillelister og (hvis det ønskes) indstillinger - Eksporter historik, abonnementer, spillelister og indstillinger - Slet visningshistorik + Importér database + Eksportér database + Overskriver din nuværende historik, abonnementer, playlister og (hvis det ønskes) indstillinger + Eksportér historik, abonnementer, playlister og indstillinger + Ryd visningshistorik Sletter historikken over afspillede streams og afspilningspositionerne Slet hele visningshistorikken\? - Visningshistorikken blev slettet - Slet søgehistorik - Sletter historikken for søgeord - Slet hele søgehistorikken\? - Søgehistorikken blev slettet + Visningshistorik slettet + Ryd søgehistorik + Sletter historik for søgeord + Slet hele søgehistorik? + Søgehistorik slettet Fejl Eksternt lager utilgængeligt - Det er endnu ikke muligt at downloade til et eksternt SD-kort. Nulstil download-mappens placering\? + Det er endnu ikke muligt at hente til et eksternt SD-kort. Nulstil lagringsmappens placering? Netværksfejl Kunne ikke indlæse alle miniaturebilleder - Kunne ikke dekryptere URL-signatur for video - Kunne ikke analysere websted - Indhold ikke tilgængeligt - Kunne ikke oprette downloadmenu - App/brugergrænseflade gik ned + Kunne ikke analysere webside + Indhold utilgængeligt + Kunne ikke opsætte download-menu + App/UI gik ned Kunne ikke afspille denne stream Uoprettelig afspillerfejl opstod - Prøver at genoprette efter afspillerfejl + Genopretter efter afspillerfejl Eksterne afspillere understøtter ikke disse typer af links Ingen videostreams fundet Ingen lydstreams fundet Mappen findes ikke Fil eller indholdskilde findes ikke - Filen eksister ikke eller der mangler rettigheder til at læse eller skrive til den - Filavnet kan ikke være tomt + Filen findes ikke, ellers mangler der tilladelse til at læse eller skrive til den + Filnavn må ikke være tomt Der opstod en fejl: %1$s - Ingen streams er tilgængelige for download + Ingen streams tilgængelige til hentning Bruger standardfaner pga. fejl ved indlæsning af gemte faner - Genskab standardindstillinger - Vil du genoprette standardindstillingerne\? + Gendan standardindstillinger + Vil du gendanne standardindstillinger? Undskyld, dette skulle ikke være sket. - Rapporter via e-mail + Rapportér via e-mail Beklager, noget gik galt. - Rapporter - Information: + Rapportér + Info: Hvad skete der: Din kommentar (på engelsk): Detaljer: - Afspil video, længde: + Afspil video, varighed: Uploaders profilbillede Synes godt om Kan ikke lide @@ -176,7 +173,7 @@ Lyd Prøv igen Ingen abonnenter - Antallet af abonnenter er ikke tilgængeligt + Antal abonnenter utilgængeligt Ingen visninger %s visning @@ -193,17 +190,17 @@ Filnavn Tråde Fejl - NewPiper downloader + NewPipe henter Tryk for detaljer Vent venligst… - Kopieret til udklipsholderen - Vælg senere en tilgængelig downloadmappe i indstillingerne - Denne tilladelse behøves for -\nat åbne i pop op-tilstand + Kopieret til udklipsholder + Angiv venligst en lagringsmappe senere i indstillinger + Denne tilladelse er nødvendig for +\nat åbne i popup-tilstand 1 element slettet. reCAPTCHA-udfordring - Der blev anmodet om en reCAPTCHA-udfordring - Download + reCAPTCHA-udfordring anmodet + Hent Tilladte tegn i filnavne Ugyldige tegn bliver erstattet med denne værdi Erstatningstegn @@ -212,30 +209,30 @@ Om NewPipe Tredjepartslicenser © %1$s af %2$s under %3$s - Om & Ofte stillede spørgsmål + Om & Ofte Stillede Spørgsmål Licenser Åben letvægtsstreaming på Android. Bidrag til projektet - Hvad enten du har idéer til oversættelse, designændringer, kodeoprydning eller virkelig tunge kodeændringer, så er hjælp altid velkommen. Jo mere der bliver gjort, jo bedre bliver det! + Uanset om du har idéer til oversættelse, designændringer, oprydning i koden eller virkelig store kodeændringer, er hjælp altid velkommen. Jo mere der bliver gjort, jo bedre bliver det! Se på GitHub - Doner - NewPipe er udviklet af frivillige, der bruger deres fritid på at give dig den bedst mulige brugeroplevelse. Giv noget tilbage for at hjælpe NewPipes udviklere til at gøre appen endnu bedre, mens de nyder en kop kaffe. + Donér + NewPipe er udviklet af frivillige, der bruger deres fritid på at give dig den bedste brugeroplevelse. Giv noget tilbage og hjælp udviklerne med at gøre NewPipe endnu bedre, mens de nyder en kop kaffe. Giv noget tilbage - Websted - Besøg NewPipes websted for mere information og nyheder. - NewPipes fortrolighedspolitik - Læs fortrolighedspolitik - NewPipes licens - NewPipe er copyleft, fri software: Du kan bruge, studere, dele og forbedre den som du vil. Specifikt kan du redistribuere og/eller ændre den under betingelserne i GNU General Public License som udgivet af Free Software Foundation, enten version 3 af licensen eller (efter dit ønske) en vilkårlig senere version. + Webside + Besøg NewPipes webside for mere information og nyheder. + NewPipes Privatlivspolitik + Læs privatlivspolitik + NewPipes Licens + NewPipe er copyleft, fri software: Du kan bruge, studere, dele og forbedre den, som du vil. Specifikt kan du redistribuere og/eller ændre den under betingelserne i GNU General Public License som udgivet af Free Software Foundation, enten version 3 af licensen eller (efter dit ønske) en vilkårlig senere version. Læs licens Historik Historik Vil du slette dette element fra søgehistorikken\? - Sidst afspillet - Mest spillede - Indhold af hovedsiden + Sidst Afspillet + Mest Afspillet + Indhold af hovedside Hvilke faner vises på hovedsiden - Tom side + Tom Side Kioskside Kanalside Vælg en kanal @@ -243,7 +240,7 @@ Vælg en kiosk Eksporteret Importeret - Ikke en gyldig ZIP-fil + Ingen gyldig ZIP-fil Advarsel: Kunne ikke importere alle filer. Dette vil overskrive dine nuværende indstillinger. Vil du også importere indstillinger\? @@ -253,47 +250,47 @@ Fjern Detaljer Lydindstillinger - Hold for at føje til kø - Foretrukket \'åbn\'-handling + Hold for at sætte i kø + Foretrukken \'åbn\'-handling Videoafspiller Baggrundsafspiller - Pop op-afspiller + Popup-afspiller Spørg altid - Henter info … + Henter info… Indlæser det ønskede indhold - Ny spilleliste + Ny Playliste Omdøb Navn - Føj til spilleliste - Slet denne spilleliste\? - Spilleliste oprettet - Ingen undertekster + Føj til playliste + Slet denne playliste? + Playliste oprettet + Ingen Undertekster Tilpas Udfyld Zoom Autogenereret Undertekster - Eksporter til + Eksportér til Nulstil - Accepter + Acceptér Afvis Ingen begrænsning - Begræns opløsning når der bruges mobildata + Begræns opløsning, når mobildata bruges Opdateringer Listevisning Liste Gitter Automatisk Færdig - Afventning + Afventer efterbehandling - Læg i kø + Sæt i kø Handling afvist af systemet - Download fejlede - Generer unikt navn + Hentning mislykkedes + Generér unikt navn Overskriv En fil med dette navn eksisterer allerede - En downloadet fil med dette navn eksisterer allerede + En hentet fil med dette navn eksisterer allerede Der er en download i gang med dette navn Vis fejl Filen kan ikke oprettes @@ -304,10 +301,10 @@ Serveren sender ikke data Serveren accepterer ikke multitrådede downloads; prøv igen med @string/msg_threads = 1 Ikke fundet - Efterbehandling fejlede + Efterbehandling mislykkedes Stop Hændelser - Intet at se her + Ikke andet end fårekyllinger her t mio. mia. @@ -319,63 +316,63 @@ Kunne ikke importere abonnementer Kunne ikke eksportere abonnementer Konferencer - Start afspilningen i baggrunden - Start afspilning i et pop op - Åbn skuffe - Luk skuffe - Hvad:\\nForespørgsel:\\nIndholdssprog:\\nIndholdsland:\\nAppsprog:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersion:\\nOS-version: - Standardhandling når indhold åbnes – %s - Anvend som spillelistens miniaturebillede - Bogmærk spilleliste - Fjern bogmærke - Føjet til spillelisten - Miniaturebillede for spilleliste ændret. + Start afspilning i baggrunden + Start afspilning i et popup + Åbn Skuffe + Luk Skuffe + Hvad:\\nForespørgsel:\\nIndholdssprog:\\nIndholdsland:\\nApp-sprog:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersion:\\nOS-version: + Standardhandling ved åbning af indhold — %s + Anvend som playlistens miniaturebillede + Bogmærk Playliste + Fjern Bogmærke + Føjet til playliste + Ændret playlistens miniaturebillede. Ændr undertekststørrelse og baggrundsstil. Kræver genstart af appen for at træde i kraft - Monitorering for hukommelseslækager kan få appen til ikke at svare under heap dumping - Rapporter out-of-lifecycle-fejl - Importer - Importer fra - Importerer … - Eksporterer … - Importer fil + Overvågning af hukommelseslækager kan medføre, at appen ikke reagerer, når heap-dumpning udføres + Rapportér out-of-lifecycle-fejl + Importér + Importér fra + Importerer… + Eksporterer… + Importér fil Forrige eksport - Importer YouTube-abonnementer ved at downloade eksportfilen: + Importér YouTube-abonnementer ved at hente eksportfilen: \n \n1. Gå til denne webadresse: %1$s -\n2. Log ind når du bliver bedt om det -\n3. Klik på \"Alle Youtube-data medtages\" og fravælg alt bortset fra \"abonnementer\". -\n4. Klik på \"Næste trin\" og derefter \"Opret eksport\". -\n5. Klik på \"Download\" knappen efter den popper frem. -\n6. Klik på \"IMPORTER FIL\" nederst på denne side og vælg den downloadede .zip fil. -\n7. [Såfremt .zip-importeringen slår fejl] Uddrag .csv filen (som normalt findes i \"YouTube og YouTube Music/abonnementer/abonnementer.csv\"). Klik på \"IMPORTER FIL\" nederst på denne side, og vælg den uddragede .csv fil +\n2. Log ind, når du bliver bedt om det +\n3. Klik på \"Alle Youtube-data medtages\", og fravælg alt bortset fra \"abonnementer\". +\n4. Klik på \"Næste trin\", og derefter \"Opret eksport\". +\n5. Klik på \"Download\"-knappen efter den popper frem. +\n6. Klik på \"IMPORTÉR FIL\" nederst på denne side, og vælg den hentede .zip-fil. +\n7. [Såfremt .zip-importeringen slår fejl] Uddrag .csv-filen (som normalt findes i \"YouTube og YouTube Music/abonnementer/abonnementer.csv\"). Klik på \"IMPORTÉR FIL\" nederst på denne side, og vælg den uddragede .csv-fil ditID, soundcloud.com/ditID - Bemærk at denne operation kan kræve meget netværkstrafik. + Bemærk, at denne operation kan kræve meget netværkstrafik. \n -\nVil du fortsætte\? - Knapper for afspilningshastighed +\nVil du fortsætte? + Knapper for Afspilningshastighed Tempo Tonehøjde Spol forbi stilhed Skridt Vis en notifikation for at foreslå opdatering af appen, når en ny version er tilgængelig - Minimer ved appskift - Handling når der skiftes til en anden app fra hovedvideoafspilleren — %s + Minimér ved appskift + Handling ved skift til anden app fra hovedvideoafspiller — %s Ingen - Minimer til baggrundsafspiller - Minimer til pop op-afspiller + Minimér til baggrundsafspiller + Minimér til popup-afspiller En NewPipe-opdatering er tilgængelig! sat på pause sat i kø - Maksimalt antal genforsøg - Maksimalt antal forsøg før downloaden opgives + Maks. antal genforsøg + Maks. antal forsøg, før downloaden annulleres Afbryd på forbrugsafregnede netværk Nyttigt ved skift til mobildata, selv om nogle downloads ikke kan sættes på pause - Kun HTTPS adresser understøttes + Kun HTTPS-URL\'er understøttes Instansen findes allerede Kunne ikke validere instansen - Skriv instansens adresse + Indtast instans-URL Tilføj instans - Find de instanserne du kan lide på %s + Find de instanser, du kan lide på %s Vælg dine yndlings PeerTube-instanser PeerTube-instanser Afspil automatisk @@ -387,11 +384,11 @@ Vis kommentarer Ingenting Gentag - Femte handlingstast - Fjerde handlingstast - Første handlingstast - Anden handlingstast - Tredje handlingstast + Femte handlingsknap + Fjerde handlingsknap + Første handlingsknap + Anden handlingsknap + Tredje handlingsknap Viser resultater for: %s Åbn med LeakCanary er ikke tilgængelig @@ -413,7 +410,7 @@ Vis ikke Bland Vis beskrivelse - Åbn hjemmeside + Åbn webside Sprog Lav kvalitet (mindre) Start afspilning automatisk — %s @@ -427,138 +424,138 @@ %1$s download slettet %1$s downloads slettet - Slet alle downloadede filer fra drevet\? + Slet alle hentede filer fra drevet? Sæt downloads på pause - Start hovedafspilleren i fuldskærmstilstand - Downloadmappe endnu ikke valgt. Vælg standardmappen nu - Læg automatisk i kø - Konfigurer det spillende streams notifikation - Vis aldersbegrænset indhold (f.eks. 18+) - Slå YouTube \"begrænset tilstand\" til - YouTube har en \"begrænset tilstand\" der skjuler videoer som potientielt er skadelige for børn + Start hovedafspiller i fuld skærm + Lagringsmappe endnu ikke valgt; vælg standardmappen nu + Sæt automatisk i kø + Konfigurér notifikation om igangværende stream + Vis indhold, der muligvis er uegnet for børn, fordi det har en aldersgrænse (f.eks. 18+) + Slå YouTubes \"Begrænset Tilstand\" til + YouTube tilbyder en \"Begrænset Tilstand\", som skjuler potentielt voksenindhold Denne video er aldersbegrænset. \n -\nSlå \"%1$s\" fra i indstillingerne hvis du vil se den. +\nSlå \"%1$s\" til i indstillingerne, hvis du vil se den. Nye streams Notifikationer om nye streams fra abonnementer - reCAPTCHA cookies er ryddet + reCAPTCHA-cookies blev ryddet Slet alle afspilningspositioner\? Filen er flyttet eller slettet - NewPipe stødte ind i en fejl, tryk for at rapportere - Rapporter på GitHub + NewPipe stødte ind i en fejl; tryk for at rapportere + Rapportér på GitHub Høj kvalitet (større) Begræns downloadkøen - Ryd de cookies som NewPipe opbevarer når du løser en reCAPTCHA - Farvelæg notifikationen - Afspillernotifikation - En fejl opstod, se notifikationen - Slå fra for at skjule videobeskrivelsen og yderligere information - Slå fra for at gemme metainformationskasser med yderligere information om streammets skaber, streammets indhold eller en søgeforespørgsel + Ryd de cookies, som NewPipe opbevarer, når du løser en reCAPTCHA + Farvelæg notifikation + Afspiller-notifikation + En fejl opstod; se notifikationen + Slå fra for at skjule videobeskrivelse og yderligere information + Slå fra for at skjule metainfo-bokse med yderligere information om streamskaberen, streamindhold eller en søgeforespørgsel Download fuldført %s downloads fuldført - Den aktive spilleliste bliver udskiftet - Hvis du skifter fra en spiller til en anden, kan din kø blive erstattet - Vis metainformation + Den aktive afspillerkø bliver udskiftet + Ændring fra én afspiller til en anden kan erstatte din kø + Vis metainfo Lokale søgeforslag - Fjerne søgeforslag - Start ikke videoer i miniafspilleren, men gå direkte til fuldskærmstilstand, hvis automatisk rotering er låst. Du kan stadig se miniafspilleren, hvis du går ud af fuldskærmstilstand - Kunne ikke genkende addressen. Vil du åbne den i en anden app\? - Videohashfunktion notifikation - Notifikationer om videohashfunktioners status + Forslag til fjernsøgning + Start ikke videoer i miniafspilleren, men skift direkte til fuldskærmstilstand, hvis automatisk rotation er låst. Du kan stadig få adgang til miniafspilleren ved at forlade fuldskærm + Kunne ikke genkende URL. Åbn med en anden app? + Videohash-notifikation + Notifikationer om videohashing fremskridt Fejlrapport-notifikation Notifikationer for at rapportere fejl Slet afspilningspositioner Sletter alle afspilningspositioner - Spørg hvor filen skal downloades - Et download ad gangen - Slet downloadede filer - Vil du rydde din download historik eller slette alle downloadede filer\? + Spørg, hvor filen skal hentes + Ét download ad gangen + Slet hentede filer + Vil du rydde din downloadhistorik eller slette alle hentede filer? Kan ikke gendanne dette download - Ryd download historik - NewPipe projektet tager dit privatliv seriøst. Derfor samler appen intet data uden dit samtykke. -\nNewPipes fortrolighedspolitik forklarer i detaljer, hvilke data der bliver sendt og opbevaret når du sender en nedbrudsrapport. - Kopier en formatteret rapport + Ryd downloadhistorik + NewPipe-projektet tager dit privatliv meget alvorligt. Derfor indsamler appen ikke nogen data uden dit samtykke. +\nNewPipes privatlivspolitik forklarer i detaljer, hvilke data der sendes og gemmes, når du sender en nedbrudsrapport. + Kopiér formateret rapport Giv tilladelse til at vise over andre apps Vis indikatorer for afspilningsposition i lister Afspilningspositioner slettet - Ryd reCAPTCHA cookies + Ryd reCAPTCHA-cookies Der er en afventende download med dette navn Start downloads Beskær miniaturebillede til 1:1 format Beskær video-miniaturebillede i notifikationen fra 16:9 til 1:1 format - Rediger hver eneste varselshandling nedenunder ved at trykke på dem. Vælg op til tre af dem som bliver vist i den lille notifikation, via afkrydsningsfelterne til højre - Du kan kun vælge op til tre handlinger som kan vises i den lille notifikation! - Buffer + Redigér hver underretningshandling nedenfor ved at trykke på dem. Vælg op til tre af dem, som bliver vist i den lille notifikation via afkrydsningsfelterne til højre. + Du kan kun vælge op til tre handlinger, der kan vises i den lille notifikation! + Buffering Få Android til at vælge notifikationens farve ud fra den primære farve i miniaturebilledet (virker ikke på alle enheder) - Nattema - Frem- og tilbagesøgningstid + Nat-tema + Søgningsvarighed for spole frem/tilbage Denne video er aldersbegrænset. -\nPga. YouTubes politik om aldersbegrænsede videoer har NewPipe ikke adgang til videoen. +\nPga. nye YouTube-politikker om aldersbegrænsede videoer har NewPipe ikke adgang til nogen af dens videostreams og kan derfor ikke afspille dem. Crash afspilleren - Spørg om bekræftelse før du rydder en kø - Forhåndsvisning af miniaturebilleder på statuslinjen + Spørg om bekræftelse, før du rydder en kø + Forhåndsvisning af miniaturebilleder på statuslinje Sæt i kø som næste - Er sat som næste i køen + Sat i kø som næste Download er begyndt Vis miniaturebilleder på både låseskærmen og notifikationer Nylige Notifikationer er slået fra Kommentarer - Relaterede objekter + Relaterede emner Stryg på elementer for at fjerne dem - Vælg en spilleliste - Ingen spilleliste-bogmærker endnu - Sproget ændres når appen genstarter - Spillekø + Vælg en playliste + Ingen playliste-bogmærker endnu + Sproget ændres, når appen genstarter + Afspillerkø Vis kanalens detaljer Sæt i kø Sat i kø - Loader streamets detaljer… - Processere... Det kan tage et øjeblik - Vis hukommelsestab - Deaktiver medietunneler + Indlæser streamdetaljer… + Behandler… Det kan tage et øjeblik + Vis hukommelseslækager + Deaktivér medietunneling Vis billedindikatorer Netværkskrav Alle netværk Kontrolfrekvens Notifikationer ved nye streams - Giv besked om nye streams fra abonnementer + Underret om nye streams fra abonnementer Tjek manuelt efter opdateringer Tjekker efter opdateringer… - Gendanner - \"Hurtig feed\"-tilstand viser ikke mere information om dette. + gendanner + \"Hurtig feed\"-tilstand oplyser ikke mere info om dette. Tjek efter opdateringer Fjern sete videoer\? - Deaktiver medietunneler hvis du oplever en sort skærm eller hak ved videoafspilning - Venligst tjek om der allerede eksisterer en problemrapport som diskuterer dit crash. Hvis du opretter duplikatrapporter, tager du tid fra os som vi kunne bruge på at fikse fejlen. + Deaktivér medietunneling, hvis du oplever en sort skærm eller hakken ved videoafspilning. + Tjek venligst, om der allerede findes et problem, der diskuterer dit nedbrud. Når du opretter flere tickets, tager du tid fra os, som vi kunne bruge på at løse den faktiske fejl. Tjek efter nye streams Lav en fejlnotifikation Lokale - Udgiverens bruger er blevet slettet. -\nNewpipe kan ikke indlæse dette feed i fremtiden. -\nVil du fjerne dit abonnement på denne kanal\? - Feedet blev sidst opdateret for %s + Udgiverens konto er blevet lukket. +\nNewPipe vil ikke være i stand til at indlæse dette feed i fremtiden. +\nØnsker du at afmelde denne kanal? + Feed sidst opdateret: %s Ikke indlæst: %d Indlæser feed… Nye feed elementer - Tid siden sidste opdatering for at et abonnoment bliver forældet - %s - Altid opdater + Tid efter sidste opdatering, før et abonnement betragtes som forældet — %s + Altid opdatér Vælg abonnementer Dette indhold er ikke tilgængeligt i dit land. Af %s - Videoer, der er blevet set før og efter, at de er blevet tilføjet til spillelisten, vil blive fjernet. -\nEr du sikker\? Dette kan ikke gøres om! + Videoer, der er blevet set før og efter tilføjelse til playlisten, vil blive fjernet. +\nEr du sikker? Dette kan ikke fortrydes! Vis miniaturebillede Tags Aldersbegrænsning - Dette indhold er ikke understøttet af NewPipe. + Dette indhold understøttes endnu ikke af NewPipe. \n \nVi håber at kunne understøtte det i en fremtiden. - Dette indhold er kun tilgængeligt for brugere som har betalt for det. Det kan ikke blive streamet eller downloadet af NewPipe. - Bruger slettet - Dette indhold er privat, så det jan ikke blive streamet eller downloadet af NewPipe. + Dette indhold er kun tilgængeligt for brugere, som har betalt for det, så det kan ikke streames eller downloades af NewPipe. + Konto lukket + Dette indhold er privat, så det kan ikke streames eller downloades af NewPipe. Nyligt tilføjede Fremhævede %s giver denne grund: @@ -573,10 +570,10 @@ Vil du slette denne gruppe\? Licens - %s nyt stream + %s ny stream %s nye streams - Semitone + Halvtone %d time %d timer @@ -586,16 +583,16 @@ %d dage Lavet af %s - Slå hurtigtilstand fra - Slå hurtigtilstand til - Hent fra det dedikerede feed når det er muligt + Deaktivér hurtig-tilstand + Aktivér hurtig-tilstand + Hent fra dedikeret feed, når det er tilgængeligt Feed opdateringsgrænse Feed %d valgt %d valgte - Processerer feed… + Behandler feed… Kanalgrupper %d minut @@ -604,27 +601,27 @@ Fjern sete Vælg en instans Forbindelse afbrudt - Fremskridt tabt fordi filen blev slettet + Fremskridt tabt, fordi filen blev slettet NewPipe blev lukket under arbejde på filen - Kan ikke overskrive filen - For at være i overenstemmelse med GDPR fanger vi din opmærksomhed hentil NewPipes privatpolitik. Venligst læs den med omhu. -\nDu skal acceptere den for at sende os en fejlrapport. + kan ikke overskrive filen + For at overholde den europæiske databeskyttelsesforordning (GDPR) henviser vi hermed din opmærksomhed til NewPipes privatlivspolitik. Læs den venligst omhyggeligt. +\nDu skal acceptere den for at kunne sende os fejlrapporten. Aflænk (kan skabe forvrængning) - Importer en SoundCloud profil ved at skrive enten dit URL eller ID: + Importér en SoundCloud-profil ved at skrive enten dit URL eller ID: \n -\n1. Slå \"desktop-version\" til i mobilbrowsere. +\n1. Slå \"desktop-tilstand\" til i mobilbrowsere. \n2. Gå til denne adresse: %1$s -\n3. Log ind når du bliver spurgt -\n4. Kopier adressen på den profil du bliver henstillet til. - Vis den oprindelige tidsforskel på elementer +\n3. Log ind, når du bliver bedt om det +\n4. Kopiér adressen på den profil, du bliver omdirigeret til. + Vis oprindelig tid siden på elementer Autogenereret (ingen uploader fundet) Slå lyd til Sæt på lydløs Mest likede Kunne ikke indlæse kommentarer Standard Kiosk - Færdig - Tryk på \"Færdig\" når den er løst + Færdig + Tryk på \"Færdig\", når den er løst Ingen kommentarer ∞ videoer Ingen lyttere @@ -635,26 +632,26 @@ Ingen seere Skift service, nuværende valg: Kommentarer er slået fra - Ingen apps på din enhed kan åbne dette - Ingen ledig plads på enheden - App sprog + Ingen app på din enhed kan åbne dette + Ingen ledig plads på enheden + App-sprog Ja, og delvist sete videoer Fejl ved indlæsning af feed Kunne ikke indlæse feed for \'%s\'. - Vis \"crash afspilleren\" + Vis \"Crash afspilleren\" Crash appen - Vis et crash alternativ når afspilleren er i brug + Vis en crash mulighed, når afspilleren er i brug Vis en fejl snackbar - Brug system mappevælger (SAF) + Brug systemets mappevælger (SAF) Kanalens avatar-miniaturebillede Dette er et SoundCloud Go+-nummer, i hvert fald i dit land, så det kan ikke streames eller downloades af NewPipe. Der blev ikke fundet nogen passende filhåndtering til denne handling. -\nInstaller en Storage Access Framework-kompatibel filhåndtering +\nInstallér venligst en Storage Access Framework-kompatibel filhåndtering Der blev ikke fundet nogen passende filhåndtering til denne handling. -\nInstaller et filhåndteringsprogram eller prøv at deaktivere \'%s\' i download-indstillingerne +\nInstallér venligst en filhåndtering, eller prøv at deaktivere \'%s\' i downloadindstillingerne Aktivér valg af tekst i beskrivelsen Automatisk (enhedstema) - Deaktiver valg af tekst i beskrivelsen + Deaktivér valg af tekst i beskrivelsen Fastgjort kommentar Du abonnerer nu på denne kanal , @@ -663,51 +660,50 @@ Den er tilgængelig i nogle tjenester og er normalt meget hurtigere, men kan returnere et begrænset antal elementer og ofte ufuldstændige oplysninger (f.eks. ingen varighed, elementtype, ingen live-status) Ukendt format Ukendt kvalitet - Hjertemarkeret af indholdsskaberen - Intervalstørrelse for afspilningsindlæsning + Hjertemarkeret af skaber + Størrelse på afspilningsinterval ExoPlayer-standard Tomt gruppenavn Du vil blive spurgt, hvor du vil gemme hver enkelt download. -\nAktiver systemet mappevælger (SAF), hvis du vil downloade til et eksternt SD-kort - Originaltekster fra tjenester vil være synlige i stream-emner +\nAktivér systemets mappevælger (SAF), hvis du vil hente til et eksternt SD-kort + Originaltekster fra tjenester vil være synlige i stream-elementer Ingen videostreams er tilgængelige for eksterne afspillere - URL til miniaturebillede Fra Tablet-tilstand - Denne video er kun tilgængelig for YouTube Music Premium-medlemmer, så den kan ikke streames eller downloades af NewPipe. - \"Storage Access Framework\" gør det muligt at downloade til et eksternt SD-kort - Fremtving indberetning af ikke-leverbare Rx-undtagelser uden for fragmentets eller aktivitetens livscyklus efter bortskaffelse - Tryk for at downloade %s + Denne video er kun tilgængelig for YouTube Musik Premium-medlemmer, så den kan ikke streames eller downloades af NewPipe. + \"Storage Access Framework\" gør det muligt at hente til et eksternt SD-kort + Tving rapportering af ikke-levérbare Rx-undtagelser uden for fragmentets eller aktivitetens livscyklus efter bortskaffelse + Tryk for at hente %s Fra og med Android 10 understøttes kun \"Storage Access Framework\" - Synes du, at feed-indlæsning er for langsom\? Hvis det er tilfældet, så prøv at aktivere hurtig indlæsning (du kan ændre det i indstillingerne eller ved at trykke på knappen nedenfor). + Synes du, at feed-indlæsning er for langsom? Hvis det er tilfældet, så prøv at aktivere hurtig indlæsning (du kan ændre det i indstillingerne eller ved at trykke på knappen nedenfor). \n \nNewPipe tilbyder to strategier til feed-indlæsning: \n- Hentning af hele abonnementskanalen, hvilket er langsomt, men komplet. \n- Brug af et dedikeret service endpoint, hvilket er hurtigt, men normalt ikke komplet. \n -\nForskellen mellem de to er, at den hurtige metode normalt mangler nogle oplysninger, f.eks. elementets varighed eller type (kan ikke skelne mellem livevideoer og normale videoer), og den returnerer muligvis færre elementer. +\nForskellen mellem de to, er, at den hurtige metode normalt mangler nogle oplysninger, f.eks. elementets varighed eller type (kan ikke skelne mellem livevideoer og normale videoer), og den returnerer muligvis færre elementer. \n \nYouTube er et eksempel på en tjeneste, der tilbyder denne hurtige metode med sit RSS-feed. \n \nValget er altså et spørgsmål om, hvad du foretrækker: hastighed eller præcise oplysninger. - Den valgte stream er ikke understøttet af eksterne afspillere + Den valgte stream understøttes ikke af eksterne afspillere Denne indstilling er kun tilgængelig, hvis %s er valgt som tema - Du kan nu vælge tekst i beskrivelsen. Bemærk, at siden kan flimre, og at links muligvis ikke kan klikkes på, mens du er i valgtilstand. + Du kan nu vælge tekst inde i beskrivelsen. Bemærk, at siden kan flimre, og at links muligvis ikke kan klikkes på, mens du er i markeringstilstand. Streams, som endnu ikke understøttes af downloaderen, vises ikke Hurtig tilstand Importér eller eksportér abonnementer fra 3-punktsmenuen Ofte stillede spørgsmål Hvis du har problemer med at bruge appen, bør du tjekke disse svar på almindelige spørgsmål! - Se på hjemmeside + Se på webside Vis Picasso-farvede bånd oven på billeder, der angiver deres kilde: rød for netværk, blå for disk og grøn for hukommelse Du kører den nyeste version af NewPipe - På grund af ExoPlayer-begrænsninger blev søgetiden sat til %d sekunder + Pga. ExoPlayer-begrænsninger blev søgevarigheden sat til %d sekunder Vis kun ikke-grupperede abonnementer - Side med spillelister + Playlisteside Du kan vælge dit foretrukne nattema nedenfor - Vælg dit foretrukne nattema - %s + Vælg dit foretrukne nattema — %s Support - Host + Vært Offentlig Ikke oplyst Privat @@ -717,9 +713,104 @@ Ingen lydstreams er tilgængelige for eksterne afspillere Vælg kvalitet til eksterne afspillere Sortér - Ignorer hardware medie knapper + Ignorér hardware medie-knap begivenheder Brugbart f.eks. hvis du bruger et headset med ødelagte fysiske knapper - Playlists der er grået ud, indeholder allerede dette objekt. - Inaktiver permanent thumbnail - Fejlede at kopiere til udklipsholderen - + Playlisterne, der er nedtonede, indeholder allerede dette element. + Fjern permanent miniaturebillede + Kunne ikke kopiere til udklipsholder + Brug det originale lydspor uanset sprog + Foretræk lydbeskrivelser + Foretræk original lyd + Hvis tilgængeligt, brug lydbeskrivelser for personer med nedsat syn + Redigér hver underretningshandling nedenfor ved at trykke på dem. De første tre handlinger (afspil/sæt på pause, forrige og næste) er indstillet af systemet og kan ikke tilpasses. + Indlæser Metadata… + Fjern duplikater? + Vælg kvaliteten af billeder, og om billeder overhovedet skal indlæses, for at reducere data- og hukommelsesforbrug. Ændringer rydder både billedcachen i hukommelsen og på disken — %s + Middel kvalitet + Høj kvalitet + Ingen + Set helt + Ingen streams + Vis/skjul streams + Lysstyrke + Lydstyrke + Vælg bevægelse til venstre halvdel af afspillerens skærm + Vælg bevægelse til højre halvdel af afspillerens skærm + Højre bevægelseshandling + Ingen live streams + Lyd: %s + Lydspor + Fjern duplikater + Vis følgende streams + Hent kanal-faner + Faner, der skal hentes, når feedet opdateres. Denne indstilling har ingen effekt, hvis en kanal opdateres i hurtig-tilstand. + Miniaturebilleder + Vælg lydspor til eksterne afspillere + Ukendt + Delvist set + Kommende + original + Videoer + Numre + Live + Kanaler + Playlister + Album + Om + Kanal-faner + Hvilke faner vises på kanalsiderne + Åbn afspilningskø + Skift til fuld skærm + Skift skærmretning + Forrige stream + Næste stream + Afspil + Afspil igen + Varighed + Spol tilbage + Billedkvalitet + Indlæs ikke billeder + Lav kvalitet + Del Playliste + Del playliste med detajler såsom playlistenavn og videotitler eller som en simpel liste over video-URL\'er + Del med Titler + Del URL-liste + + %s svar + %s svar + + Vis mere + Vis mindre + Skift intervalstørrelsen for indlæsning af progressivt indhold (i øjeblikket %s). En lavere værdi kan fremskynde den første indlæsning + Ønsker du at fjerne alle duplikerede streams i denne playliste? + Spol frem + Venstre bevægelseshandling + ExoPlayer-indstillinger + Administrér nogle ExoPlayer-indstillinger. Disse ændringer kræver genstart af afspilleren for at træde i kraft + Position for hovedfaner + Flyt hovedfanens vælger til bunden + Duplikat tilføjet %d gang(e) + Medietunneling var som standard deaktiveret på din enhed, fordi din enhedsmodel er kendt for ikke at understøtte det. + Uploader-avatars + Underkanal-avatars + Avatars + Bannere + Abonnenter + Et lydspor bør allerede være til stede i denne stream + Brug ExoPlayers fallback-funktion til dekoderen + oversat + beskrivende + Shorts + Flere muligheder + \? + - %1$s: %2$s + %1$s +\n%2$s + Aktivér denne indstilling, hvis du oplever initialiseringsproblemer med dekodere, som falder tilbage til dekodere af lavere prioritet, hvis de primære dekoderes initialisering fejler. Dette kan resultere i dårligere afspilningsydelse end ved brug af primære dekodere + Denne løsning frigiver og genindstiller video-codecs, når en overflade ændres, i stedet for at indstille overfladen til codec\'en direkte. Denne indstilling bruges allerede af ExoPlayer på nogle enheder med dette problem, men har kun effekt på Android 6 og nyere. +\n +\nAktivering af denne indstilling kan forhindre afspilningsfejl, når du skifter den aktuelle videoafspiller eller skifter til fuld skærm + Brug altid ExoPlayers overfladeindstilling til video-output som løsning + Kort + %1$s %2$s + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5283f1afa..c7506c649 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -27,7 +27,7 @@ Video und Audio Bevorzugte Sprache des Inhalts Video abspielen, Dauer: - Avatarbild des Benutzers + Profilbild des Benutzers Gefällt mir nicht Gefällt mir Externen Video-Player verwenden @@ -43,7 +43,6 @@ Aussehen Fehler Konnte nicht alle Vorschaubilder laden - Konnte Video-URL-Signatur nicht entschlüsseln Konnte Webseite nicht analysieren Inhalt nicht verfügbar Inhalt @@ -100,12 +99,12 @@ Nur manche Geräte können Videos in 2K/4K abspielen Hintergrund Pop-up - Pop-up Eigenschaften merken + Eigenschaften des Pop-ups merken Entfernt Tonspur bei manchen Auflösungen Letzte Größe und Position des Pop-ups merken Suchvorschläge Vorschläge auswählen, die bei der Suche angezeigt werden sollen - Löschen + löschen Beste Auflösung Über NewPipe Lizenzen @@ -172,17 +171,17 @@ Audio-Einstellungen Konnte diesen Stream nicht abspielen Inhalt der Hauptseite - Kanal-Seite + Kanalseite Details Top 50 Nicht behebbarer Wiedergabefehler aufgetreten Wiederherstellen nach einem Wiedergabefehler Kiosk-Seite Kiosk auswählen - Tipp anzeigen, wenn der Hintergrundwiedergabe- oder Pop-up-Knopf „Details:“ im Video gedrückt wird + Tipp anzeigen, wenn die Hintergrundwiedergabe- oder Pop-up-Schaltfläche „Details:“ im Video gedrückt wird Neu und Heiß Halten, um zur Wiedergabeliste hinzuzufügen - „Halten zum Einreihen“ Tipp anzeigen + „Halten zum Einreihen“-Tipp anzeigen [Unbekannt] Wiedergabe im Hintergrund starten Wiedergabe in einem Pop-up starten @@ -206,7 +205,7 @@ Video-Player Wiedergabe im Hintergrund Popup-Player - Informationen werden abgerufen … + Erhalte Informationen … Gewünschten Inhalt laden Datenbank importieren Datenbank exportieren @@ -253,7 +252,6 @@ Beachte, dass diese Aktion das Netzwerk stark belasten kann. \n \nMöchtest du fortfahren\? - Vorschaubilder laden Bilder-Cache gelöscht Zwischengespeicherte (Metadaten) löschen Alle zwischengespeicherten Website-Daten entfernen @@ -270,7 +268,6 @@ Geschwindigkeit Tonhöhe Entkoppeln (kann zu Verzerrungen führen) - Ausschalten, um das Laden von Vorschaubildern zu verhindern, was Daten- und Speicherverbrauch spart. Änderungen löschen den Bildzwischenspeicher sowohl im Arbeitsspeicher als auch auf dem internen Speicher Nächsten Stream automatisch einreihen Wiedergabe durch Anhängen eines verwandten Streams an die Warteschlange (ohne Wiederholungsschleife) fortsetzen Wiedergabeliste mit Lesezeichen versehen @@ -408,7 +405,7 @@ Datei kann nicht überschrieben werden Es ist ein ausstehender Download mit diesem Namen vorhanden NewPipe wurde während der Verarbeitung der Datei geschlossen - Kein Speicherplatz mehr auf dem Gerät + Kein Speicherplatz mehr auf dem Gerät Vorgang abgebrochen, da die Datei gelöscht wurde Möchtest du deinen Downloadverlauf oder alle heruntergeladenen Dateien löschen\? Downloadwarteschlange begrenzen @@ -428,7 +425,7 @@ Niemand schaut zu %s Zuschauer - %s Zuschauer + %s Zuschauende Niemand hört zu @@ -458,7 +455,7 @@ Sprache der App Systemstandard „Fertig“ drücken, wenn es gelöst wurde - Fertig + Fertig Videos %d Sekunde @@ -497,15 +494,15 @@ Zeit nach der letzten Aktualisierung, bevor ein Abonnement als veraltet angesehen wird — %s Schnellmodus aktivieren Schnellmodus deaktivieren - Abos zuletzt aktualisiert: %s + Feed zuletzt aktualisiert: %s Grenzwert für Feed-Aktualisierung - Aus fest zugeordnetem Feed abholen wenn verfügbar + Aus fest zugeordnetem Feed abrufen wenn verfügbar Steht in manchen Diensten zur Verfügung, ist meist viel schneller, liefert aber eventuell eine eingeschränkte Anzahl an Elementen und oft unvollständige Informationen (z. B. keine Videolänge, keinen Elementtyp, keinen Live-Status) Glaubst du, dass das Laden von Feeds zu langsam ist\? Wenn ja, versuche den Schnelllademodus einzuschalten (du kannst ihn in den Einstellungen oder über die Schaltfläche unten ändern). \n \nNewPipe bietet zwei Feed-Ladestrategien: -\n• die Abholung des gesamten abonnierten Kanals, was langsam aber vollständig geschieht. -\n• die Verwendung eines fest zugeordneten Serviceendpunkts, was schnell aber für gewöhnlich inkomplett ist. +\n• das Abrufen des gesamten abonnierten Kanals, was langsam aber vollständig geschieht. +\n• das Verwenden eines fest zugeordneten Serviceendpunkts, was schnell aber für gewöhnlich inkomplett ist. \n \nDer Unterschied zwischen den beiden ist, dass der schnellen normalerweise einige Informationen fehlen, wie die Dauer oder der Typ des Elements (keine Unterscheidung zwischen Live-Videos und normalen) und sie eventuell weniger Elemente liefert. \n @@ -544,7 +541,7 @@ Nur über WLAN Nie Du kannst maximal drei Aktionen auswählen, die in der Kompaktbenachrichtigung angezeigt werden sollen! - Bearbeite jede Benachrichtigungsaktion unten, indem du darauf tippst. Wähle mithilfe der Kontrollkästchen rechts bis zu drei aus, die in der Kompaktbenachrichtigung angezeigt werden sollen + Bearbeite jede Benachrichtigungsaktion unten, indem du auf sie tippst. Wähle mithilfe der Kontrollkästchen rechts bis zu drei aus, die in der Kompaktbenachrichtigung angezeigt werden sollen. Konnte die angegebene URL nicht erkennen. Mit einer anderen Anwendung öffnen\? Fünfte Aktionstaste Vierte Aktionstaste @@ -576,7 +573,7 @@ Vorschaubild anzeigen Hash wird berechnet Benachrichtigungen über den Hashing-Fortschritt von Videos - Video-Hash Benachrichtigung + Video-Hash-Benachrichtigung Letzte Metadaten anzeigen Ausschalten, um Metadaten-Felder mit zusätzlichen Informationen zu Stream-Ersteller, -Inhalten oder einer Suchanfrage auszublenden @@ -601,10 +598,10 @@ Lösen Download hat begonnen Du kannst dein bevorzugtes Nachtdesign unten auswählen - Wähle dein bevorzugtes Nachtdesign – %s + Wähle dein bevorzugtes Nachtdesign — %s Automatisch (Gerätedesign) Nachtdesign - Kanal-Details anzeigen + Kanaldetails anzeigen Deaktiviere das Media-Tunneling, wenn bei der Videowiedergabe ein schwarzer Bildschirm oder Stottern auftritt. Media-Tunneling deaktivieren Intern @@ -617,7 +614,6 @@ Schlagwörter Kategorie Nicht gelistet - Vorschaubild-URL Server Unterstützung Abonnenten @@ -628,7 +624,7 @@ \nNewPipe wird diesen Feed in Zukunft nicht mehr laden können. \nMöchtest du dich von diesem Kanal abmelden\? Konto geschlossen - Der Schnelllademodus liefert hierzu keine weiteren Informationen. + Der Schnellmodus liefert hierzu keine weiteren Informationen. Noch kein Downloadordner festgelegt, wähle jetzt den Standard-Downloadordner Webseite öffnen Ab Android 10 wird nur noch „Storage Access Framework“ unterstützt @@ -666,7 +662,7 @@ \"Player abstürzen lassen\" anzeigen Player abstürzen lassen Zeigt eine Absturzoption an, wenn der Player verwendet wird - Benachrichtigung über Fehlerberichte + Fehlerbericht-Benachrichtigung Benachrichtigungen zur Meldung von Fehlern Bei NewPipe ist ein Fehler aufgetreten. Zum Melden antippen Ein Fehler ist aufgetreten, siehe die Benachrichtigung @@ -686,7 +682,7 @@ %s neuer Stream %s neue Streams - Stream-Details laden … + Lade Stream-Details … Über neue Streams aus Abonnements benachrichtigen , Jedes Netzwerk @@ -713,7 +709,7 @@ Häufig gestellte Fragen Wenn du Probleme bei der Verwendung der App hast, lies bitte die Antworten auf häufig gestellte Fragen! Sortieren - Schneller Modus + Schnellmodus Du verwendest die neueste Version von NewPipe Antippen um %s herunterzuladen Importieren oder Exportieren von Abonnements über das 3-Punkte-Menü @@ -775,4 +771,46 @@ Alben Tabs auf den Kanalseiten Welche Tabs auf den Kanalseiten angezeigt werden + Lade Metadaten … + Über + Tabs der Kanalseiten abrufen + Tabs, die beim Aktualisieren des Feeds abgerufen werden. Diese Option hat keine Auswirkungen, wenn ein Kanal im Schnellmodus aktualisiert wird. + Titel + Bildschirmausrichtung umschalten + Vollbildmodus umschalten + Wiedergabewarteschlange öffnen + Vorspulen + Zurückspulen + Wiederholen + Abspielen + Nächster Stream + Mehr Optionen + Dauer + Vorheriger Stream + Bildqualität + \? + Geringe Qualität + Bilder nicht laden + Hohe Qualität + Mittlere Qualität + Banner + Vorschaubilder + Profilbilder + Profilbilder des Unterkanals + Profilbilder des Benutzers + Wähle die Bildqualität und ob überhaupt Bilder geladen werden sollen, um die Daten- und Speichernutzung zu reduzieren. Änderungen löschen sowohl den Bilder-Cache im Speicher als auch auf der Festplatte — %s + URL-Liste teilen + Mit Titeln teilen + %1$s +\n%2$s + Wiedergabeliste teilen + Teile die Wiedergabeliste mit Details wie dem Namen der Wiedergabeliste und den Videotiteln oder als einfache Liste von Video-URLs + - %1$s: %2$s + + %s Antwort + %s Antworten + + Mehr zeigen + Weniger zeigen + Bearbeite jede Benachrichtigungsaktion unten, indem du auf sie tippst. Die ersten drei Aktionen (Abspielen/Pause, Zurück und Weiter) sind vom System vorgegeben und können nicht angepasst werden. \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 094ac0ccd..18ab48318 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -90,8 +90,6 @@ Ενθύμηση του τελευταίου μεγέθους και θέσης του παραθύρου Χρήση γρήγορης ανακριβούς αναζήτησης Η μην ακριβής αναζήτηση επιτρέπει στην εφαρμογή να αναζητεί θέσεις στο βίντεο γρηγορότερα με μειωμένη ακρίβεια. Δε λειτουργεί για διαστήματα των 5, 15 ή 25 δευτερολέπτων - Φόρτωση μικρογραφιών - Με την απενεργοποίηση δε φορτώνονται οι μικρογραφίες, εξοικονομώντας δεδομένα και μνήμη. Οι αλλαγές σβήνουν τις προσωρινά αποθηκευμένες εικόνες στη μνήμη και στον δίσκο Εκκαθαρίστηκε η προσωρινή μνήμη εικόνων Εκκαθάριση προσωρινά αποθηκευμένων μεταδεδομένων Αφαίρεση όλων των προσωρινά αποθηκευμένων δεδομένων ιστοσελίδων @@ -147,7 +145,6 @@ Διαγραφή ολόκληρου του ιστορικού αναζητήσεων; Το ιστορικό αναζητήσεων διαγράφηκε Δεν ήταν δυνατή η φόρτωση όλων των εικονιδίων - Δεν ήταν δυνατή η αποκρυπτογράφηση της υπογραφής της URL του βίντεο Δεν ήταν δυνατή η ανάλυση του ιστοτόπου Το περιεχόμενο δεν είναι διαθέσιμο Δεν ήταν δυνατή η ρύθμιση του μενού λήψεων @@ -398,7 +395,7 @@ δεν είναι δυνατή η αντικατάσταση του αρχείου Υπάρχει μια εκκρεμής λήψη με αυτό το όνομα Το NewPipe τερματίστηκε ενώ επεξεργάζονταν το αρχείο - Δεν υπάρχει αρκετός χώρος στη συσκευή + Δεν υπάρχει αρκετός χώρος στη συσκευή Η πρόοδος χάθηκε, επειδή το αρχείο διαγράφηκε Λήξη χρονικού ορίου σύνδεσης Θέλετε να διαγράψετε το ιστορικό λήψεων σας ή να διαγράψετε όλα τα αρχεία που έχετε λάβει; @@ -462,7 +459,7 @@ Αναπαραγωγή ουράς Δεν υπάρχουν σελιδοδείκτες λίστας αναπαραγωγής ακόμα Επιλέξτε μια λίστα αναπαραγωγής - Τέλος + Τέλος Πατήστε «Τέλος» όταν επιλυθεί ∞ βίντεο 100+ βίντεο @@ -485,7 +482,7 @@ Ανάμιξη Επανάληψη Μπορείτε να επιλέξετε το πολύ τρεις ενέργειες για εμφάνιση στη σύντομη ειδοποίηση! - Επεξεργαστείτε κάθε ενέργεια ειδοποίησης παρακάτω πατώντας πάνω της. Επιλέξτε έως και τρεις από αυτές για να εμφανίζονται στη σύντομη ειδοποίηση, χρησιμοποιώντας τα πλαίσια ελέγχου στα δεξιά + Επεξεργαστείτε κάθε ενέργεια ειδοποίησης παρακάτω πατώντας πάνω της. Επιλέξτε έως και τρεις από αυτές για να εμφανίζονται στη σύντομη ειδοποίηση, χρησιμοποιώντας τα πλαίσια ελέγχου στα δεξιά. Κουμπί πέμπτης ενέργειας Κουμπί τέταρτης ενέργειας Κουμπί τρίτης ενέργειας @@ -598,13 +595,12 @@ Αυτόματο (θέμα συσκευής) Νυχτερινό θέμα Εμφάνιση λεπτομερειών καναλιού - Απενεργοποιήστε το media tunneling, αν εμφανίζεται μαύρη οθόνη ή διακοπτόμενος ήχος κατά την αναπαραγωγή βίντεο + Απενεργοποιήστε το media tunneling, αν παρατηρείτε μαύρη οθόνη ή διακοπές κατά την αναπαραγωγή βίντεο. Απενεργοποίηση media tunneling Εσωτερικό Ιδιωτικό Εκτός λίστας Δημόσιο - URL εικονιδίου Υποστήριξη Γλώσσα Όριο ηλικίας @@ -766,4 +762,55 @@ Το media tunneling απενεργοποιήθηκε από προεπιλογή στη συσκευή σας, επειδή το μοντέλο της συσκευής σας είναι γνωστό ότι δεν το υποστηρίζει. Καμία ζωντανή ροή Καμία ροή + Φόρτωση μεταδεδομένων… + Βίντεο + Συνδρομητές + Ποιες καρτέλες εμφανίζονται στις σελίδες των καναλιών + Καρτέλες καναλιών + Σύντομα + Λήψη καρτελών καναλιών + Σχετικά + Άλμπουμ + Καρτέλες για ανάκτηση κατά την ενημέρωση της ροής. Αυτή η επιλογή δεν έχει καμία επίδραση εάν ένα κανάλι ενημερώνεται χρησιμοποιώντας τη γρήγορη λειτουργία. + Λίστες + Κομμάτια + Κανάλια + Ζωντανά + Εναλλαγή προσανατολισμού οθόνης + Λειτουργία πλήρους οθόνης + Επόμενη ροή + Άνοιγμα ουράς αναπαραγωγής + Εμπρός + Πίσω + Επανάληψη + Αναπαραγωγή + Περισσότερες επιλογές + Διάρκεια + Προηγούμενη ροή + Ποιότητα εικόνας + ; + Χαμηλή ποιότητα + Άβαταρ + Άβαταρ υπο-καναλιών + Μη φόρτωση εικόνων + Υψηλή ποιότητα + Μέτρια ποιότητα + Άβαταρ δημιουργών + Επιλέξτε την ποιότητα των εικόνων και εάν δε θέλετε να φορτώσετε εικόνες, για να μειώσετε τη χρήση δεδομένων και μνήμης. Οι αλλαγές εκκαθαρίζουν την κρυφή μνήμη εικόνων, τόσο στη μνήμη όσο και στον δίσκο — %s + Μικρογραφίες + Ταμπέλες + Κοινοποίηση λίστας URL + Κοινοποίηση με τίτλους + %1$s +\n%2$s + Κοινοποίηση λίστας + Μοιραστείτε τη λίστα αναπαραγωγής με λεπτομέρειες όπως το όνομα της λίστας αναπαραγωγής και τους τίτλους βίντεο ή ως μια απλή λίστα διευθύνσεων URL βίντεο + - %1$s: %2$s + + %s απάντηση + %s απαντήσεις + + Εμφάνιση περισσοτέρων + Εμφάνιση λιγότερων + Επεξεργαστείτε κάθε ενέργεια ειδοποίησης παρακάτω πατώντας σε αυτήν. Οι τρεις πρώτες ενέργειες (αναπαραγωγή/παύση, προηγούμενηο και επόμενο) ορίζονται από το σύστημα και δεν μπορούν να τροποποιηθούν. \ No newline at end of file diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index c8cc728b5..808aa2573 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -76,7 +76,6 @@ Behaviour Select your favourite PeerTube instances Continue playing after interruptions (e.g. phone calls) - Turn off to prevent loading thumbnails, saving data and memory usage. Changes clear both in-memory and on-disc image cache. Published on %1$s Report this error via e-mail Select your favorite night theme – %s diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index a3a7a6af4..3dc932388 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -36,7 +36,6 @@ Ĉu instali la mankan aplikaĵon Kore\? Montri \'Sekvajn\' kaj \'Similajn\' videojn Ĉiuj bildetoj ne ŝargeblas - La subskribo de la ligilo de la filmeto ne malĉifreblas La retejo ne analizeblas Ludi filmeton, daŭro: Bildeto de la alŝutinto @@ -80,7 +79,6 @@ Memori lastan grandon kaj pozicion de ŝprucfenestro Uzi rapidan malekzaktan serĉon Malekzakta serĉo permesas ke, la ludilo serĉi poziciojn pli rapide sed kun malpli ekzakto. Serĉi por 5, 15 aŭ 25 sekundoj ne funckias kun ĉi tio opcio - Ŝarĝi bildetojn Ne povis konstrui la dosierujon de elŝuto Enhavo limigita al aĝo Nuna @@ -113,8 +111,8 @@ Konservi la historio de serĉo lokale Rigardu historion Spuri la viditajn filmetojn - NewPipe Sciigo - Sciigoj por NewPipe fonaj kaj ŝprucfenestraj ludiloj + Sciigo de NewPipe + Sciigoj por ludilo de NewPipe Ludilo Konduto Historio kaj kaŝmemoro @@ -181,7 +179,6 @@ \n2. Iru tien: %1$s \n3. Ensalutu kiam oni petas vin \n4. Kopiu la ligilon de profilo ke oni kondikis vin. - Malŝaltu por malebligi ŝarĝajn bildetojn por konservi datumuzadon kaj memoruzadon. Ŝanĝoj vakigi ambaŭ en memoran kaj en diskan bildkaŝmemoron Bildokaŝmemoro vakigis Vakigi kaŝmemorigitajn metadatumojn Vakigi tutajn kaŝmemorigitajn retpaĝajn datumojn @@ -204,8 +201,8 @@ Elektu ongleton Ĝisdatigoj Dosiero forviŝita - Sciigo por ĝisdatigi apon - Sciigo por nova versio de NewPipe + Sciigo por ĝisdatigo de apo + Sciigo por novaj versioj de NewPipe Ekstera konservejo malhavebla Elŝuti al ekstera SD-karto ne eblas. Ĉu vi volas restarigi la elŝutan dosierujon \? viciĝita @@ -409,7 +406,7 @@ Elŝutita dosieron kun ĉi tiu nomo jam ekzistas Estas pritraktata elŝuto kun ĉi tiu nomo NewPipe estis fermita dum laborante sur la dosiero - Neniu spaco havebla sur la aparato + Neniu spaco havebla sur la aparato Progreso perdita, ĉar la dosiero estis forviŝita Eltempiĝo de Konekto Ŝangi la servon, nuntempe elektita: @@ -448,7 +445,7 @@ Preferata aplingvo Sistemnormo Premu “Finita” kiam solvita - Finita + Finita %d sekundo %d sekundoj @@ -549,4 +546,69 @@ Kraŝi la ludilo Envicigita Envicigi + Laŭteco + Neniu + Permesi al Android agordi koloron de sciigo laŭ la precipa koloro de videaĵminiaturo (noti, ke ĉi tio ne disponeblas en ĉiuj iloj) + Aŭtomata vicigado + Ago de dekstra gesto + Redakti ĉiun agon de sciigo per tuŝi gin. Elekti maksimume tri agon por montri en la kompakta sciigo per markobutonoj dekstre. + Elekti la originalan aŭdiotrakon malgraŭ lingvo + Elekti aŭdiotrakon kun priskriboj por vidmalkapabluloj kiam ebla + Ago de maldekstra gesto + Preferi priskribajn aŭdiotrakojn + Ŝangi la grandecon de elŝuta intervalo por progresiva enhavo (aktuale %s). Malplia valoro eble povas rapidigi ĝian komencan ŝargadon + Preferi originalan aŭdaĵon + Elekti geston por dekstra duono de ludil-ekrano + Utila, ekzemple, se vi uzas kaptelefonon, kiu havas difektajn fizikajn butonojn + Grandeco de intervalo de legada elŝuto + Heleco + Vi povas elekti maksimume tri agoj por montri en la kompakta sciigo! + Ignori eventoj de aparataroj plurmediaj butonoj + Elekti geston por maldekstra duono de ludil-ekrano + Ŝalti \"Limigitan Reĝimon\" de YouTube + Rapida reĝimo + Ne eblas rekoni la ligilon. Ĉu malfermi per alia apo\? + Kuketojn de reCAPTCHA estis forigita + Montri enhavon, kiu eble maltaŭgas por infanoj, ĉar ĝi havas aĝo-limon (kiel \"18+\") + Novaj fluoj + Foraj serĉsugestoj + Sciigoj por raporti erarojn + Ŝargante metadatumoj… + Sciigo por kreado de haketaĵoj de videoj + YouTube provizas \"Limigitan Reĝimon\", kiu kaŝas enhavon, kiu potence maltaŭgas por infanoj + Ĉi tiu video estas aĝo-limigita. +\nPro novaj reguloj de YouTube, kiuj aplikas al aĝo-limigitaj videoj, NewPipe ne povas atingi iun ajn video-fluoj de ĉi tiu video kaj konsekvence ne povas ludi ĝin. + Sciigo por erar-raportoj + Sciigoj + Ludila sciigo + Sciigo por haketado de videoj + Lokaj serĉsugestoj + Ŝalti ĉefan ludilon plenekrane + Sciigo por novaj fluoj de abonoj + Forigi kuketojn de reCAPTCHA + Agordi la sciigon por ĉi-momente ludantaj datumtorentoj + Ne komenci ludi videojn en la mini-ludilo, sed ŝalti plenekranan reĝimon rekte, se aŭtomata rotacio ŝlositas. Vi ankoraŭ povus atingi mini-ludilon, se vi elirus plenekranan reĝimon. + Forigi kuketojn, kiujn NewPipe konservas, kiam vi solvas reCAPTCHA-taskojn + NewPipe renkontis eraron, tuŝi por raporti + Pozicio de la ĉefaj langetoj + Transloki la ĉefan langet-elektilon al la malsupro + + %s nova fluo + %s novaj fluoj + + Raporti per GitHub + Komentoj malŝaltitas + Eraro okazis, vidu sciigon + Neniuj tujelsendoj + Neniuj fluoj + Kopii formatitan raporton + Importi aŭ eksporti abonojn per la tri-punkta menuo + Kalkulado de haketaĵo + Oftaj demandoj + Neniu dosierujo por elŝutoj agordita, bonvolu elekti la defaŭltan elŝuto-dosierujon nun + Bonvolu certigi, ĉu erarraporto, kiu diskutas pri via eraro, jam ekzistas. Kreado de duoblaĵaj erarraportoj forprenas tempon el ni, kiun ni povus uzi por ripari la veran eraron. + Rilatajn erojn + Solvi + Malsukcesis kopii al la tondujo + Oni petos al vi kien salvi ĉiujn elŝutojn \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d1d7fdcd4..b17c4d169 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -38,7 +38,6 @@ Error Error de conexión No se pudo cargar las miniaturas - No se pudo descifrar la URL del vídeo No se pudo analizar el sitio web Mostrar vídeos \'Siguientes\' y \'Similares\' Idioma predefinido del contenido @@ -48,7 +47,7 @@ Miniatura del avatar del usuario Contenido Mostrar contenido con restricción de edad - Pulsa la lupa para empezar. + Toca la lupa para empezar. En directo Descargas Descargas @@ -288,8 +287,6 @@ Esta operación puede causar un uso intensivo de la red. \n \n¿Quieres continuar\? - Cargar miniaturas - Desactivar para evitar la carga de miniaturas y ahorrar datos y memoria. Se vaciará la caché de imágenes en la memoria volátil y en el disco Se vació la caché de imágenes Vaciar metadatos en memoria caché Quitar todos los datos guardados de páginas web @@ -379,7 +376,7 @@ No encontrado Falló el posprocesamiento NewPipe se cerró mientras se trabajaba en el archivo - No hay suficiente espacio disponible en el dispositivo + No hay suficiente espacio disponible en el dispositivo Progreso perdido, porque el archivo fue borrado El tiempo de conexión expiro No se puede recuperar esta descarga @@ -457,7 +454,7 @@ Idioma de aplicación Predefinido del sistema Pulsa en «Hecho» al resolverlo - Hecho + Hecho Vídeos %d segundo @@ -497,7 +494,7 @@ Nombre de grupo vacío ¿Borrar este grupo\? Nuevo - Contenido + Fuente Velocidad de actualización del contenido Tiempo para que una suscripción se considere desactualizada — %s Actualizar siempre @@ -561,7 +558,7 @@ Almacenar en memoria (búfer) Repetir ¡Puedes seleccionar como máximo tres acciones para mostrar en la notificación compacta! - Edite cada una de las acciones de notificación que aparecen a continuación pulsando sobre ellas. Seleccione hasta tres de ellas para que se muestren en la notificación compacta utilizando las casillas de verificación de la derecha + Edite cada acción de notificación pulsando sobre ella. Seleccione hasta tres de ellas para que se muestren en la notificación compacta utilizando las casillas de verificación de la derecha. Botón de quinta acción Botón de cuarta acción Botón de tercera acción @@ -616,7 +613,6 @@ Privado No listado Público - URL de la miniatura Soporte Lenguaje Límite de edad @@ -782,4 +778,56 @@ Como se sabe que este dispositivo no es compatible con la tunelización de medios, esta función está desactivada de forma predeterminada. Sin retransmisiones Sin transmisiones en directo + Vídeos + Suscriptores + Qué pestañas se muestran en las páginas de los canales + Pestañas del canal + Cortos + Cargando los metadatos… + Recuperar las fichas del canal + Acerca de + Álbumes + Pestañas para recuperar al actualizar el canal. Esta opción no tiene efecto si el canal se actualiza en modo rápido. + Listas de reproducción + Pistas + Canales + En directo + Alternar la orientación de la pantalla + Alternar a pantalla completa + Siguiente retransmisión + Abrir la cola de reproducción + Avanzar + Rebobinar + Volver a reproducir + Reproducir + Más opciones + Duración + Retransmisión anterior + Calidad de la imagen + \? + Baja calidad + Avatares + Avatares de los subcanales + No cargar las imágenes + Calidad alta + Calidad media + avatares subidos + Banners + Elige la calidad de las imágenes y si cargar imágenes en su totalidad, para reducir el uso de datos y memoria. Los cambios borran la caché de las imágenes en la memoria y en el disco - %s + Miniaturas + Compartir la lista de la dirección URL + Compartir con los títulos + %1$s +\n%2$s + Compartir la lista de reproducción + Compartir las listas de reproducción con los detalles como el nombre de la lista y los títulos de los vídeos o como una simple lista de una dirección URL con los vídeos + - %1$s: %2$s + + %s respuesta + %s respuestas + %s respuestas + + Ver más + Mostrar menos + Edite cada acción de notificación pulsando sobre ella. Las tres primeras acciones (reproducir/pausa, anterior y siguiente) las establece el sistema y no se pueden personalizar. \ No newline at end of file diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index b55870c75..1234aec5e 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -55,8 +55,6 @@ Pea hüpikakna viimane suurus ja asukoht meeles Kasuta ebatäpset kerimist Ebatäpne kerimine lubab meediamängijal otsida asukohta kiiremini täpsuse arvel. Sellega ei tööta 5, 15 või 25 sekundi kaupa kerimine - Laadi pisipildid - Lülita välja, et keelata pisipiltide laadimist, andmete salvestamist ja mälukasutust. Muutmine puhastab vahemälu nii kettal kui ka mälus Pildid kustutati vahemälust Kustuta metaandmed vahemälust Kustuta veebilehtede andmed vahemälust @@ -121,7 +119,6 @@ Viga Võrgu viga Kõiki pisipilte ei õnnestunud laadida - Video URLi dekrüptimine nurjus Veebilehe töötlemine nurjus Sisu pole saadaval Allalaadimismenüü seadistamine nurjus @@ -414,7 +411,7 @@ Aja segi Korda Sa saad valida kuni kolm tegevust, mida kuvatakse lühiteavituses! - Muuda iga teavituse tegevusi sellel toksates. Vali märkekastides paremal kuni kolm teavitust, mida kuvada lühiteates + Muuda iga teavituse tegevusi sellel toksates. Vali märkekastides paremal kuni kolm teavitust, mida kuvada lühiteates. Viies tegevusnupp Neljas tegevusnupp Kolmas tegevusnupp @@ -497,7 +494,7 @@ Esitusloendi järjehoidjaid veel pole Vali esitusloend Vaikimisi seadistatud kiosk - Valmis + Valmis Kui oled lõpetanud, siis vajuta „Valmis“ nuppu Kommentaare pole ∞ videot @@ -508,7 +505,7 @@ Kustuta allalaadimiste ajalugu Seda allalaadimist ei saa uuesti alustada Ühendus aegus - Seadmes pole enam ruumi + Seadmes pole enam ruumi Sellise nimega allalaadimine on juba pooleli faili asendamine ei õnnestu Uus @@ -586,7 +583,6 @@ Sisemine Privaatne Avalik - Pisipildi URL Kasutajatugi Keel Vanusepiir @@ -766,4 +762,55 @@ Kuna on teada, et see seade ei toeta meedia tunneldamist, siis on see funktsionaalsus vaikimisi välja lülitatud. Meediavoogusid ei leidu Otseeetris meediavoogusid ei leidu + Pildikvaliteet + Videod + \? + Tellijad + Kanali lehel kuvatavad kaardid + Kanali kaardid + Lühivideod + Laadime metateavet… + Vaheta ekraani paigutust + Madal kvaliteet + Lülita täisekraan sisse/välja + Laadi kanali kaardid + Tunnuspildid + Järgmine meediavoog + Alamkanali tunnuspilt + Ava esitusjärjekord + Ära laadi pilte + Parim kvaliteet + Kanali teave + Keri edasi + Albumid + Keri tagasi + Korda esitust + Andmevoo uuendamisel laaditavad kanali kaardid. Kui kanalite uuendamine toimub kiirrežiimis, siis see eelistus ei ole kasutusel. + Keskmine kvaliteet + Üleslaadija tunnuspilt + Reklaampildid + Esitusloendid + Vali soovitud pildikvaliteet või sootuks ära luba piltide laadimist ning nii saad muuta võrguliikluse ja mälu mahtu. Muudatusega eemaldatakse puhverdatud pildid nii mälust kui andmekandjalt — %s + Esita + Lisavalikud + Pisipildid + Palad + Kestus + Kanalid + Eelmine meediavoog + Otseeeter + Jaga url\'ide loendina + Jagamisel lisa pealkirjad + %1$s +\n%2$s + Jaga esitusloendit + Jaga esitusloendit kas väga detailse teabega palade kohta või lihtsa url\'ide loendina + - %1$s: %2$s + Näita veel + + %s vastus + %s vastust + + Näita vähem + Muuda iga teavituse tegevust sellel toksates. Kolm esimest tegevust (esita/peata esitus, eelmine video, järgmine video) on süsteemsed ja neid ei saa muuta. \ No newline at end of file diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index c8d16b698..3c36a85ae 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -14,7 +14,7 @@ Aukeratu bideoak deskargatzeko karpeta Lehenetsitako bereizmena Jo Kodirekin - Kode aplikazioa instalatu\? + Falta den Kore aplikazioa instalatu nahi duzu? Erakutsi \"Jo Kodirekin\" aukera Erakutsi bideoa Kodi multimedia zentroarekin erreproduzitzeko aukera Audioa @@ -28,7 +28,7 @@ Igotzailearen abatarraren iruditxoa Ez dute gustoko Gustoko dute - Ez da jario erreproduzigailurik aurkitu. VLC instalatu\? + Ez da igorpen-erreproduzigailurik aurkitu. VLC instalatu? \"%1$s\" esan nahi al zenuen\? Erabili kanpo bideo-erreproduzigailua Erabili kanpo audio-erreproduzigailua @@ -68,7 +68,6 @@ Errorea Sare-errorea Ezin izan dira iruditxo guztiak deskargatu - Ezin izan da bideoaren URL sinadura deskodetu Ezin izan da webgunea analizatu Edukia ez dago eskuragarri Ezin izan da deskargen menua ezarri @@ -110,7 +109,7 @@ © %1$s %2$s. %3$s Honi buruz eta ohiko galderak Lizentziak - Androiderako streaming libre eta arina. + Igorpen libre eta arinak Android-en. Ikusi GitHub zerbitzarian NewPipe Lizentzia Ideiak, itzulpenak, diseinu aldaketak, kode garbiketak, kode aldaketa sakonak badituzu, laguntza beti da ongi etorria. Eginaz hobetzen da! @@ -168,7 +167,7 @@ Aldatu bigarren planora Aldatu laster-leihora Aldatu nagusira - Ezin izan da jario hau erreproduzitu + Ezin izan da igorpen hau erreproduzitu Erreproduzigailuaren errore berreskuraezina gertatu da Erreproduzigailuaren erroretik berreskuratzen Dohaintza @@ -195,29 +194,28 @@ Laster-leihoan erreproduzitzen hasi Ireki tiradera Itxi tiradera - Ez da jario erreproduzigailurik aurkitu (VLC instalatu dezakezu edukia ikusi ahal izateko). + Ez da igorpen-erreproduzigailurik aurkitu (VLC instalatu dezakezu erreproduzitzeko). Beti Behin besterik ez Kanpo erreproduzigailuek ez dituzte mota honetako estekak onartzen - Ez da bideo jariorik aurkitu - Ez da audio jariorik aurkitu + Ez da bideo-igorpenik aurkitu + Ez da audio-igorpenik aurkitu Bideo erreproduzigailua Bigarren planoko erreproduzigailua Laster-leiho erreproduzigailua Informazioa eskuratzen… Kargatzen eskatutako edukia - Deskargatu jario fitxategia + Deskargatu igorpen-fitxategia Erakutsi informazioa Gogoko erreprodukzio-zerrendak Gehitu hona Erabili bilaketa azkar ez zehatza - Kargatu iruditxoak Irudien cachea ezabatuta Ezabatu cacheko metadatuak Kendu cachetik webguneen datu guztiak Metadatuen cachea ezabatuta - Gehitu hurrengo jarioa ilarara - Jarraitu bukaerako (errepikapenik gabe) ilara erlazionatutako jario bat gehituz + Gehitu automatikoki hurrengo igorpena ilarara + Gehitu ilararen amaieran lotutako igorpen bat errepikatu gabe Arazketa Fitxategia Inportatu datu-basea @@ -225,7 +223,7 @@ Zure uneko historiala, harpidetzak eta (aukeran) ezarpenak gainidazten ditu Esportatu historiala, harpidetzak, erreprodukzio-zerrendak eta ezarpenak Garbitu ikusitakoaren historiala - Jotako jarioen historiala eta erreprodukzio puntuak ezabatzen ditu + Erreproduzitutako igorpen-historia eta erreprodukzio-kokapenak ezabatzen ditu Ezabatu ikusitakoaren historia osoa\? Ikusitakoaren historiala ezabatuta Garbitu bilaketa historiala @@ -237,7 +235,7 @@ Fitxategia ez dago edo ez dago baimenik irakurri edo idazteko Fitxategi izena ezin da hutsik egon Errore bat gertatu da: %1$s - Ez dago jariorik deskargatzeko eskuragarri + Ez dago igorpenik eskuragarri deskargatzeko Arrastatu ordena aldatzeko Sortu Baztertu @@ -262,7 +260,7 @@ Kendu gogokoa Erreprodukzio zerrenda hau ezabatu\? Erreprodukzio-zerrenda sortuta - Erreprodukzio-zerrendatua + Zerrendara gehitua Erreprodukzio zerrendaren iruditxoa aldatuta. Azpititulurik ez Doitu @@ -307,7 +305,6 @@ Desaktibatu (distortsioa sor lezake) Ezarpenak ere inportatu nahi dituzu? Bilaketa ez zehatzak posizioak azkarrago baina prezisio gutxiagoz bilatzea ahalbidetzen du. 5, 15 edo 25 segundo bilatzea ez du honekin funtzionatzen - Desgaitu koadro txikiak ez kargatzeko, datuak eta memoria aurreztuz. Aldaketak memoria eta diskoko irudien cacheak garbituko ditu NewPipe Software Librea eta Copyleft da: Erabili, ikertu, partekatu eta hobetu dezakezu. Zehazki, elkarbanatzea eta aldatzea Free Software Foundation-ek argitaratutako GNU General Public License-ren 3. bertsioa edo berriagoren baten terminoen arabera egiteko baimena duzu. Behartu aktibitatearen bizitza ziklotik kanpo baztertu eta gero entregatu ezin diren Rx salbuespenen inguruko txostena NewPipe pribatutasun politika @@ -399,7 +396,7 @@ Ezin da fitxategia gainidatzi Badago izen bereko deskarga bat burutzeke NewPipe itxi egin da fitxategian lanean zegoela - Ez dago lekurik gailuan + Ez dago lekurik gailuan Progresioa galdu da, fitxategia ezabatu delako Zure deskargen historiala garbitu nahi duzu ala deskargatutako fitxategi guztiak ezabatu\? Mugatu deskargen ilara @@ -449,7 +446,7 @@ Aplikazioaren hizkuntza Sistemaren lehenetsia Sakatu \"Egina\" konponduta dagoenean - Egina + Egina Bideoak segundu %d @@ -560,7 +557,7 @@ %s bilaketaren erantzunak erakusten Ilaran jarri da Jarri ilaran - Zerbitzuen jatorrizko testuak transmisioko elementuetan ikusgai egongo dira + Zerbitzuen jatorrizko testuak igorpenaren elementuetan ikusgai egongo dira Erakutsi «orain dela» jatorrizko denbora elementuetan Editatu beheko jakinarazpen ekintza bakoitza gainean sakatuz. Hautatu horietako hiru gehienez jakinarazpen trinkoan erakusteko eskuineko kontrol laukiak erabiliz Androidek miniaturako kolore nagusiaren arabera jakinarazpenaren kolorea pertsonalizatzea baimendu (kontuan izan ez dagoela gailu guztietan erabilgarri) @@ -571,7 +568,7 @@ Bideo hash jakinarazpena Hash-a kalkulatzen Azkenak - Desgaitu jario sortzailearen informazio gehigarria, jarioaren edukia edo bilaketa eskaera duten informazio koadroak ezkutatzeko + Desgaitu igorpen-sortzailearen informazio gehigarria, igorpenaren edukia edo bilaketa-eskaera duten metadatuen informazio-koadroak ezkutatzeko Erakutsi meta informazioa Ez dago zure gailuan hau ireki dezakeen aplikaziorik Kapituluak @@ -583,22 +580,22 @@ Ireki honekin Irratia Nabarmenduak - Eduki hau ordaindu duten erabiltzaileentzat soilik dago eskuragarri, eta NewPipe-k ezin du tramsmititu edo deskargatu. - Bideo hau YouTube Music Premium kideentzako soilik eskuragarri dago, eta NewPipe-k ezin du transmititu edo deskargatu. - Eduki hau pribatua da, eta NewPipe-k ezin du transmititu edo deskargatu. - Hau SoundCloud Go+ pista bat da, zure herrialdean gutxienez, eta NewPipe-k ezin du transmititu edo deskargatu. + Eduki hau ordaindu duten erabiltzaileentzat soilik dago erabilgarri, eta NewPipe-k ezin du igorri edo deskargatu. + Bideo hau YouTube Music Premium kideentzako soilik erabilgarri dago, eta NewPipe-k ezin du igorri edo deskargatu. + Eduki hau pribatua da, eta NewPipe-k ezin du igorri edo deskargatu. + Hau SoundCloud Go+ zerbitzuko pista bat da, zure herrialdean behintzat, eta NewPipe-k ezin du igorri edo deskargatu. Eduki hau ez dago eskuragarri zure herrialdean. Aplikazioa kraskatu Ebatzi Bideo hau adinez mugatua dago. -\nAdinez mugatutako bideoekiko YouTube-ren politika berriengatik, NewPipe-k ezin ditu bideo hauek atzitu eta ezin ditu erreproduzitu. +\nAdinez mugatutako bideoekiko YouTube-ren politika berriengatik, NewPipe-k ezin ditu bideoen igorpen hauek atzitu eta erreproduzitu. Deskarga hasi da Behean gaueko gai gogokoena hauta dezakezu Hautatu zure gaueko gai gogokoena — %s Automatikoa (gailuaren gaia) - Gau Gaia + Gauaren gaia kanalaren xehetasunak erakutsi - Desaktibatu hedabideen tunela bideo-erreprodukzioan pantaila beltz bat edo totelka ari bada + Desgaitu edukien tunela bideo-erreprodukzioan pantaila beltza badago edo bideoa totelka ari bada. Hedabideen tunela desaktibatu Itzalita Piztuta @@ -626,7 +623,6 @@ Kontua ezabatu da Jario azkarrak ez du honi buruz informazio gehiagorik ematen. Adin muga - Miniaturaren URL-a Barnekoa Zerrendatu gabea Ostalaria @@ -654,7 +650,7 @@ Ez hasi bideoak mini erreproduzitzailean eta hasi bideoak pantaila osoan zuzenean, auto biraketa blokeatuta badago. Mini erreproduzitzailea erabili dezakezu pantaila osotik irtetzean Hasi erreproduzitzaile nagusia pantaila osoan Isatsari bideo hau erantsita - Gehitu bideo hau isatsari + Gehitu jarraian Erakutsi \"Itxi erreproduzigailua\" Prozesatzen... Itxoin mesedez Erroreen txostenen jakinarazpena @@ -674,37 +670,37 @@ Erreproduzigailua erabiltzean ustekabean ixteko aukera ematen du Erakutsi errore barra bat Sortu errore jakinarazpen bat - Konfiguratu uneko erreprodukzioaren jakinarazpenak + Konfiguratu unean erreproduzitzen ari den igorpenaren jakinarazpena Jakinarazpenak Erreproduzigailuaren jakinarazpenak - Jario berriak - Egiaztatu jario berriak - Jario berrien jakinarazpenak + Igorpen berriak + Bilatu igorpen berriak + Igorpen berrien jakinarazpenak Edozein sare Jakinarazpenak desgaituta daude Kanal honetara harpidetu zara , Txandakatu denak - Harpidetzen jario berriei buruz jakinarazi + Harpidetzen igorpen berriei buruz jakinarazi Ezabatu deskargatutako fitxategi guztiak biltegitik\? - Harpidetzentzako jario berrien jakinarazpenak - Jarioaren xehetasunak kargatzen… + Harpidetzen igorpen berrien jakinarazpenak + Igorpenaren xehetasunak kargatzen… - jario berri %s - %s jario berri + igorpen berri %s + %s igorpen berri LeakCanary ez dago eskuragarri Egiaztapen maiztasuna Jakinarazi ExoPlayer lehenetsia - Beharrezko sare konexioa + Beharrezko sareko konexioa Portzentaia Semitonoa Erreprodukzioaren kargatze-tartearen tamaina - Deskargatzaileak onartzen ez dituen jarioak ez dira erakusten - Hautatutako jarioa ez dago kanpoko erreproduzigailu batengatik onartuta - Ez dago kanpoko erreproduzigailu batengatik onartuta dagoen audio jariorik - Ez dago kanpoko erreproduzigailu batengatik onartuta dagoen bideo jariorik + Deskargatzaileak onartzen ez dituen igorpenak ez dira erakusten + Hautatutako igorpena ez dute kanpoko erreproduzitzaileek onartzen + Ez dato erabilgarri audio-igorpenik kanpoko erreproduzitzaileentzat + Ez dago erabilgarri bideo-igorpenik kanpoko erreproduzitzaileentzat Formatu ezezaguna Kalitate ezezaguna Hautatu kanpoko erreproduzigailuen kalitatea @@ -715,7 +711,7 @@ Betiko miniatura kendu NewPipe-en azken bertsioa erabiltzen ari zara Sakatu %s deskargatzeko - Kopia %d behin/aldiz gehitua + Kopia %d aldiz gehitu da Txartela Aukera hau Gaiarako %s aukeratua badago soilik dago erabilgarri Ordenatu @@ -726,10 +722,49 @@ Erabilgarria, adibidez, botoi fisiko hautsiak dituen entzungailua erabiltzen ari bazara Kendu bikoiztuak Kendu bikoiztuak\? - Jario bikoiztu guztiak kendu nahi dituzu erreprodukzio-zerrenda honetatik\? - Erakutsi hurrengo jarioak - Erakutsi/Ezkutatu jarioak + Igorpen bikoiztu guztiak kendu nahi dituzu zerrenda honetatik? + Erakutsi hurrengo igorpenak + Erakutsi/Ezkutatu igorpenak Partzialki ikusita Guztiz ikusia Laster agertzeko + Harpidedunak + Ezezaguna + Bolumena + Erabili ExoPlayer-en deskodetzailearen ordezko eginbidea + Bat ere ez + Metadatuak kargatzen… + Kudeatu ExoPlayer-en ezarpen batzuk. Aldaketa hauek eragina izan dezaten, erreproduzitzailea berrabiarazi behar da. + Fitxa nagusien kokapena + Lortu kanalaren fitxak + Abatarrak + Gaitu aukera hau deskodetzailea hasieratzeko arazoak badituzu, hala nola, lehentasun gutxiago duen deskodetzailetara igarotzea deskodetzaile nagusiaren hasieratzeak huts egiten badu. Aukera honek erreprodukzioak kalitate urria izatea ekar dezake, deskodetzaile nagusiak erabiltzean ez bezala. + Eskuineko keinuaren ekintza + Erabili beti ExoPlayer-en bideo-irteeraren interfazeko ezarpenaren konponbidea + Hurrengo igorpena + Edukien tunela desgaitu da lehenespenez gailuan, gailuaren modeloak ez du onartzen eta. + Azpikanalen abatarrak + Audio-pista bat egon behar da igorpen honetan jada + Hautatu jatorrizko audioaren pista hizkuntza zein den kontuan hartu gabe + Hautatu kanpoko erreproduzitzailearen audio-pista + Lortuko diren fitxak jarioa eguneratzean. Aukera honek ez du eraginik kanal bat modu azkarra erabiliz eguneratzen bada. + Hautatu ikusmen-urritasuna dutenentzako azalpenak dituzten audio-pista bat erabilgarri badago + Ezkerreko keinuaren ekintza + Hobetsi audio deskribatzailea + Igotako abatarrak + Aldatu eduki progresiboen kargatze-tartearen tamaina (oraingoa: %s). Balio baxu batek hasierako kargatzea bizkortu dezake. + Hobetsi jatorrizko audioa + Audioa: %s + Bannerrak + Aukeratu erreproduzigailuaren pantailaren eskuin erdiaren keinua + Mugitu fitxa-hautatzaile nagusia azpira + Audio-pista + Zuzeneko igorpenik ez + Miniaturak + ExoPlayer-en ezarpenak + Distira + Igorpenik ez + Aurreko igorpena + Aukeratu erreproduzitzailearen pantailaren ezker erdiaren keinua + Zuzenekoa \ No newline at end of file diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 3d8e8da9b..01d26857e 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -46,7 +46,6 @@ خطا خطای شبکه نمی‌توان تمام بندانگشتی‌ها را بار کرد - نمی‌توان امضای نشانی اینترنتی ویدیو را رمزگشایی کرد نمی‌توان پایگاه وب را تجزیه کرد محتوا در دسترس نیست نمی‌توان فهرست بارگیری را برپا ساخت @@ -96,7 +95,6 @@ تنها برخی دستگاه‌ها توانایی پخش ویدیوهای 2K و 4K را دارند قالب ویدیویی پیش‌گزیده سیاه - بار کردن بندانگشتی‌ها قرار دادن خودکار جریان بعدی در صف پیشنهادهای جستجو گزینش پیشنهادها برای نمایش هنگام جست‌وجو @@ -270,7 +268,6 @@ پخش ادامه یابد ذخیره محلی نتایج جستجو صف پخش در حال پایان (بدون تکرار) را با افزودن یک جریان مرتبط ادامه دهید - برای پیش‌گیری از بار کردن بندانگشتی‌ها و ذخیرهٔ داده و فضای ذخیره، خاموش کنید. تغییرات، انبارهٔ تصاویر روی حافظه و دیسک را پاک می‌کند ادامه پخش بازگرداندن آخرین موقعیت پخش موقعیت در فهرست‌ها @@ -387,7 +384,7 @@ ناتوانی در بازنویسی پرونده یک بارگیری دیگر با همین نام در صف قرار دارد نیوپایپ در خلال کار روی پرونده، بسته شد - فضایی روی دستگاه باقی نمانده است + فضایی روی دستگاه باقی نمانده است پیشرفت کار متوفق شد زیرا پرونده پاک شده است پایان زمان اتصال می‌خواهید تاریخچه بارگیری را پاک کنید یا همه پرونده‌هایی که بارگیری شده‌اند؟ @@ -474,7 +471,7 @@ محلی با آغاز دوبارهٔ کاره، زبان تغییر خواهد کرد کیوسک پیش‌فرض - انجام شد + انجام شد وقتی انجام شد، «Done» یا «انجام شد» را بفشارید ∞ ویدیو بیش از ۱۰۰ ویدیو @@ -569,7 +566,6 @@ حالت رایانک گشودن پایگاه وب حساب از بین رفت - نشانی بندانگشتی کرانهٔ عمر موارد مرتبط نمایش شرح diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 641e55b21..c27115689 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -82,13 +82,12 @@ Virhe Verkkovirhe Kaikkia esikatselukuvia ei voitu ladata - Videon URL-allekirjoituksen salausta ei voitu purkaa Verkkosivua ei voitu jäsentää Sisältö ei ole saatavilla Latausvalikkoa ei voitu asettaa Sovellus/UI kaatui Pahoittelut, noin ei olisi pitänyt käydä. - Raportoi tämä virhe sähköpostin kautta + Raportoi sähköpostin kautta Pahoittelut, jokin meni vikaan. Raportti Mitä tapahtui: @@ -146,7 +145,7 @@ Suurin osa erikoismerkeistä Tietoja NewPipe Kolmannen osapuolen Lisenssit - Tietoja + Tietoja & UKK Lisenssit Vapaata ja kevyttä suoratoistoa Androidilla. Näytä GitHub:ssa @@ -196,8 +195,6 @@ Lisää soittolistaan Käytä nopeampaa epätarkkaa pikakelausta Epätarkka kelaus mahdollistaa videon kelauksen nopeammin huonommalla tarkkuudella. Kelaaminen 5, 15 tai 25 sekunnin hyppäyksin ei toimi tämän kanssa - Lataa esikatselukuvat - Poista käytöstä estääksesi esikatselukuvien lataus. Tämä säästää dataa ja vähentää muistin käyttöä. Asetuksen muuttaminen poistaa muistissa ja levyllä olevan kuvavälimuistin Kuvavälimuisti tyhjennetty Poista tallennettu metatieto Poista kaikki tallennettu sivutieto @@ -343,7 +340,7 @@ Kieli vaihtuu, kun sovellus uudelleenkäynnistetään Kommentteja ei voitu ladata Mitkä välilehdet näytetään pääsivulla - Valmis + Valmis Paina ”Valmis”, kun ratkaistu ∞ videota 100+ videota @@ -484,7 +481,7 @@ Tätä latausta ei voi palauttaa Yhteys aikakatkaistiin Eteneminen menetettiin, koska tiedosto poistettiin - Laitteella ei ole tilaa + Laitteella ei ole tilaa NewPipe suljettiin, kun se käsitteli tiedostoa Jälkikäsittely epäonnistui Ei löytynyt @@ -597,12 +594,11 @@ Tämä video on ikärajoitettu. \nYouTuben uusien ikärajoitusperiaatteiden mukaisesti NewPipella ei ole pääsyä videoon eikä sitä voida toistaa. Yöteema - Pienoiskuvakkeen osoite Poista käytöstä tekstinvalinta kuvauskentän sisältä Voit nyt valita tekstin kuvauskentän sisältä. Huomioithan, että valintatilan aikana sivu voi vilkkua ja linkit eivät ehkä ole klikattavia. %s tuo tämän syyn: Säätövivun kuvakkeen esikatselu - Poista median tunnelointi käytöstä, jos havaitset mustan näyttöruudun tai änkytystä videon toistossa + Poista median tunnelointi käytöstä, jos havaitset mustan näyttöruudun tai änkytystä videon toistossa. Poista median tunnelointi käytöstä Nopea syötetila ei tarjoa enempää tietoa tästä. \'Storage Access Framework\' on tuettu vain Android 10:stä alkaen @@ -671,7 +667,7 @@ Toiminnolle ei löytynyt sopivaa tiedostonhallintaohjelmaa. \nAsenna tiedostonhallintaohjelma, joka on yhteensopiva Storage Access Frameworkin kanssa. Toiminnolle ei löytynyt sopivaa tiedostonhallintaohjelmaa. -\nAsenna tiedostonhallintaohjelma tai kokeile asettaa \'%s\' pois käytöstä latausasetuksista. +\nAsenna tiedostonhallintaohjelma tai kokeile asettaa \'%s\' pois käytöstä latausasetuksista Näytä soitinta käytettäessä soittimen kaatamisen vaihtoehto Näytä virheen ponnahdusilmoitus Uudet syötteet @@ -699,4 +695,108 @@ Uusia lähetysvirtoja Muuta progressiivisen sisällön latausvälin kokoa (tällä hetkellä %s). Pienempi arvo saattaa nopeuttaa ensimmäistä latausta. Tästä on hyötyä esim. silloin, jos käyttämiesi kuulokkeiden fyysiset painikkeet eivät toimi. + Kuvanlaatu + Ulkoisille soittimille ei ole saatavilla videostriimiä + Videot + Tuo tai vie tilauksia kolmen pisteen valikosta + Tilaajat + Osittain katsottu + Nopea tila + Näytä seuraavat streamit + Tuntematon + Ilmoitukset uusista streameista + Mitä välilehtiä kanavasivuilla näytetään + Poistetaanko kaksoiskappaleet\? + Näytä/piilota streamit + Jaa URL-luettelo + + %s uusi streami + %s uudet streamit + + Jaa otsikoiden kanssa + Poista kaksoiskappaleet + Shortsit + Harmaana näkyvät soittolistat sisältävät jo tämän kohteen. + Käytä ExoPlayerin dekooderin varatoimintoa + Ilmoitukset on poistettu käytöstä + Tuleva + Ladataan Metadata… + Lataa %s napauttamalla + , + Vaihda näytön suuntaa + Hallitse joitain ExoPlayer-asetuksia. Nämä muutokset edellyttävät soittimen uudelleenkäynnistystä tullakseen voimaan + Kopio lisätty %d kertaa + Heikkolaatu + Päävälilehtien sijainti + Jos sinulla on ongelmia sovelluksen käytössä, muista katsoa nämä vastaukset yleisiin kysymyksiin! + Koko näyttö päälle/pois + Tuntematon laatu + Vaadittu verkkoyhteys + Suorita uusien streamien tarkistaminen + Hae kanavavälilehdet + Usein Kysytyt Kysymykset + Käytät uusinta NewPipen versiota + Avatarit + Ota tämä vaihtoehto käyttöön, jos sinulla on dekooderin alustusongelmia, jotka liittyvät alemman prioriteetin dekooderiin, jos ensisijaisen dekooderin alustus epäonnistuu. Tämä voi heikentää toiston suorituskykyä kuin käytettäessä ensisijaisia dekoodeja + Seuraava stream + Mediatunnelointi oli oletuksena poistettu käytöstä laitteessasi, koska laitemallisi ei tue sitä. + Alikanavan avatarit + Katso verkkosivuilla + Tämä vaihtoehto on käytettävissä vain, jos %s on valittu teemaksi + Tässä streamissa pitäisi jo olla ääniraita + Avaa soittojono + Älä lataa kuvia + Ilmoita tilausten uusista streameista + Korkealaatu + Valitse laatu ulkoisille soittimille + Tietoja + Jaa soittolista + Eteenpäin + Valitse ääniraita ulkoisille soittimille + Tuntematon muoto + Albumit + Ulkoisille soittimille ei ole saatavilla äänistreameja + Kelaa taaksepäin + Noudettavat välilehdet syötettä päivitettäessä. Tällä valinnalla ei ole vaikutusta, jos kanava päivitetään käyttämällä nopeaa tilaa. + Poistetaanko kaikki ladatut tiedostot levyltä\? + Jaa soittolista, jossa on tietoja, kuten soittolistan nimi ja videon nimi, tai yksinkertainen luettelo videoiden URL-osoitteista + Keskilaatu + Lataajan avatarit + Prosentti + Audio: %s + Ulkoiset soittimet eivät tue valittua suoratoistoa + Ilmoitukset uusista tilausten striimeistä + Bannerit + Soittolistat + Järjestä + Siirrä päävälilehden valitsin alas + Mikä tahansa verkko + ExoPlayer oletusarvo + Ääniraita + Kortti + Ei live streamejä + Kopioiminen leikepöydälle epäonnistui + Poista pysyvä pikkukuva + Valitse kuvien laatu ja lataako kuvia ollenkaan, jotta tiedon- ja muistin käyttö vähenee. Muutokset tyhjentävät sekä muistin että levyn kuvavälimuistin – %s + Toista + Lisää vaihtoehtoja + Pikkukuvat + Ladataan streamin tietoja… + ExoPlayerin asetukset + Täysin katsottu + Kesto + Ei streamejä + Kanavat + Olet nyt tilannut tämän kanavan + Edellinen stream + Live + Haluatko poistaa kaikki ylimääräiset identtiset suoratoistot tästä soittolistasta\? + Suoratoistot, joita lataaja ei vielä tue, ei näytetä + + %s vastaus + %s vastausta + + Näytä lisää + Näytä vähemmän + Kanavan välilehdet \ No newline at end of file diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 4cafaff85..00ce78257 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -26,10 +26,10 @@ Hindi ma-update ang pagsubaybay Ipakita ang impormasyon Mga Pagsubaybay - Mga naka-bookmark na playlist + Nakabookmark na Playlists Pumili ng Tab Anong Bago - Background + Likuran Palutangin Idagdag Sa Folder ng mga na-download na video @@ -47,8 +47,7 @@ Ipakita ang \"I-play gamit Kodi\" Pangalawang action button Pangatlong action button - Pinapayagan ng di-saktong seek ang player na mag-seek sa mga posisyon nang mabilis ngunit na may pinababang kasaktuhan. Di ito gagana sa pag-seek nang 5, 15, o 25 segundo. - Patayin para mapigilan ang pag-load sa mga thumbnail, para makatipid ng data at paggamit sa memory. Lilinisin ang parehong image cache na nasa memory at nasa disk + Pinapayagan ng di-saktong seek ang player na mag-seek sa mga posisyon nang mabilis ngunit na may pinababang kasaktuhan. Di ito gagana sa pag-seek nang 5, 15, o 25 segundo Piliin ang mga mungkahing ipapakita habang naghahanap Patayin para itago ang paglalarawan ng video at karagdagang impormasyon I-edit ang bawat action sa abiso sa baba sa pamamagitan ng pagpindot sa mga ito. Pumili ng hanggang tatlong ipapakita sa siksik na abiso gamit ang mga checkbox sa kanan @@ -70,7 +69,6 @@ Kumpirmahin muna bago linisin ang pila Maaaring mapalitan ang pila mo kung magpapalit ka ng player Papalitan ang aktibong pila sa player - I-load ang mga thumbnail Ipakita ang paglalarawan Ipakita ang meta info Patayin para itago ang mga meta infobox na may karagdagang impormasyon tungkol sa creator ng stream, laman nito o ng hinanap @@ -159,7 +157,6 @@ Lisensya Wika Pribado - URL ng Thumbnail Hindi nakalista Nakapatay Bago at patok @@ -254,4 +251,15 @@ Hangganan ng Edad Oo, pati na rin ang mga napanood nang video Kusa (tema ng device) + Tanggalin ang kabuuan ng watch history? + Walang mga stream na maaaring i-download + I-import o i-export ang mga subskripsyon galing sa 3-dot menu + Impormasyon: + Paumanhin, hindi dapat iyon nangyari. + Paumanhin, mayroon nagkamali. + Hindi maisaayos ang download menu + Ang search history ay tinanggal + Walang nanonood + Wala dito + Walang folder na ganoon \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b899ec7f8..51b572dce 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -51,7 +51,6 @@ Afficher le contenu avec limite d’âge En direct Impossible de charger toutes les miniatures - Impossible de déchiffrer la signature URL de la vidéo Désolé, cela n’aurait pas dû se produire. Signaler par courriel Information : @@ -244,8 +243,6 @@ Zoomer Utiliser la recherche rapide approximative Permet au lecteur d’accéder plus rapidement à une position au détriment de la précision. Se déplacer de 5, 15 ou 25 secondes est impossible avec cette option - Charger les miniatures - 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 Images en cache effacées Effacer les métadonnées en cache Efface toutes les données des pages Web en cache @@ -398,7 +395,7 @@ impossible d’écraser le fichier Il y a un téléchargement en attente avec ce nom NewPipe a été fermé alors qu’il travaillait sur le fichier - Aucun espace disponible sur l’appareil + Aucun espace disponible sur l’appareil Progression perdue car le fichier a été supprimé Voulez-vous effacer l’historique de téléchargement ou supprimer tous les fichiers téléchargés \? Limiter la file d’attente de téléchargement @@ -454,7 +451,7 @@ Langue de l’application Prédéfini par le système Appuyez sur « Terminé » une fois résolu - Terminé + Terminé Vidéos En raison des contraintes d’ExoPlayer, le pas de déplacement a été réglée à %d secondes Couper le son @@ -550,7 +547,7 @@ Jamais Uniquement en Wi-Fi Démarrer la lecture automatiquement — %s - Liste de lecture + File de lecture Impossible de reconnaitre l’URL fournie. Voulez-vous l’ouvrir avec une autre application \? Ajout auto. à la file La file de lecture du lecteur actif sera remplacée @@ -560,7 +557,7 @@ Lire aléatoirement Répéter Vous pouvez sélectionner au maximum trois actions à faire figurer dans la notification compacte ! - Modifiez chaque action de notification ci-dessous en appuyant dessus. Sélectionnez jusqu’à trois d’entre elles pour les faire apparaitre dans la notification compacte en utilisant les cases à cocher à droite + Modifiez chaque action de notification ci-dessous en appuyant dessus. Sélectionnez jusqu’à trois d’entre elles pour les faire apparaître dans la notification compacte en utilisant les cases à cocher à droite. Cinquième bouton d’action Quatrième bouton d’action Troisième bouton d’action @@ -618,7 +615,6 @@ Privé Non répertorié Public - URL de la miniature Hôte Support Langue @@ -667,8 +663,8 @@ Balayez un élément pour le supprimer Ne pas lancer les vidéos dans le mini lecteur mais directement en plein écran si la rotation automatique est verrouillée. Vous pouvez toujours accéder au mini-lecteur en quittant le mode plein écran Lancer le lecteur principal en plein écran - Ajouter à la file de lecture - Ajouté à la file de lecture + Placer en suivant dans la file + Placé en suivant dans la file Traitement en cours… Veuillez patienter Vérifier manuellement de nouvelles versions Vérification des mises à jour… @@ -781,4 +777,56 @@ La tunnelisation multimédia a été désactivée par défaut sur votre appareil car votre modèle d\'appareil est connu pour ne pas la supporter. Aucun flux Aucun direct + Qualité de l’image + Vidéos + Onglets de chaîne + Chargement des métadonnées … + Basse qualité + Avatars + Flux suivant + Ne pas charger d’images + Haute qualité + À propos + Albums + Qualité moyenne + Bannières + Listes de lecture + Plus d’options + Miniatures + Pistes + Durée + Chaînes + Flux précédent + Direct + \? + Abonnés + Shorts + Onglets de chaîne à récupérer + Onglets à récupérer lors de la mise à jour du flux. Cette option n’a aucun effet si une chaîne est mise à jour en utilisant le mode rapide. + Partager une liste d\'URLs + %1$s +\n%2$s + Partager la liste de lecture + - %1$s : %2$s + Choisir quels onglets seront visibles sur les pages de chaîne + Changer l’orientation de l’écran + Basculer en plein écran + Partager avec les noms + Avatars de sous-chaîne + Ouvrir la file de lecture + Avancer + Rembobiner + Rejouer + Partager la liste de lecture avec des détails tel que son nom et le titre de ses vidéos ou simplement la liste des URLs des vidéos + Avatars du téléverseur + Sélectionnez la qualité des images et si les images doivent être chargées, pour réduire l\'utilisation de la mémoire et de données. Les modifications vident à la fois le cache des images en mémoire et sur le disque — %s + Lire + + %s réponse + %s réponses + %s réponses + + Modifiez chaque action de notification ci-dessous en appuyant dessus. Les trois premières actions (lire/pause, précédent, suivant) sont définies par le système et ne peuvent pas être personnalisées. + Afficher plus + Afficher moins \ No newline at end of file diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 98d3d472b..93a43ddd2 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -55,8 +55,6 @@ Lembrar o tamaño e a posición anteriores do «popup» Usar un salto inexacto mais inexacto A busca inexacta permite ao reprodutor procurar posicións máis rápidas con precisión reducida. A busca de 5, 15 ou 25 segundos non funciona con isto - Carregar miniaturas - Desactíveo para evitar a carga de miniaturas e poupar datos e memoria. Modificar esta opción limpa a caché de imaxes da memoria e do disco A caché de imaxes foi limpada Os metadatos da caché foron eliminados Eliminar todos os datos de páxinas en caché @@ -125,7 +123,6 @@ Erro Erro de rede Non foi posíbel carregar todas as miniaturas - Non foi posíbel descifrar a asinatura do vídeo Non foi posíbel procesar o sitio web Contido non dispoñíbel Non foi posíbel configurar o menú de descargas @@ -422,7 +419,7 @@ Non se pode recuperar esta descarga O tempo de espera da conexión Perdeuse o progreso porque se eliminou o ficheiro - Non queda espazo no dispositivo + Non queda espazo no dispositivo NewPipe pechouse mentres se traballaba no ficheiro Fallou o post-procesamento Non se atopou @@ -472,7 +469,7 @@ Seleccionar unha lista de reprodución Quiosco predeterminado Que lapelas se amosan na páxina principal - Feito + Feito Prema \"Feito\" cando o resolva Ningún comentario ∞ vídeos @@ -549,7 +546,6 @@ Interno Privado Público - URL da miniatura Apoio Idioma Límite de idade @@ -592,7 +588,7 @@ Desactíveo para ocultar a descrición do vídeo e a información adicional Ver descrición Pedir confirmación antes de baleirar unha cola - Tema Escuro + Tema escuro Nada Abrir con Non listado @@ -632,7 +628,7 @@ Miniatura na barra de busca Mostrar indicadores de imaxe - Desactive o túnel multimedia se experimentaren unha pantalla en negro ou interrupcións na reprodución + Desactive o túnel multimedia se experimentar unha pantalla en negro ou interrupcións na reprodución. Desactivar túnel multimedia Engadido á cola Cartafol de descarga aínda non definido, escolla o cartafol agora @@ -713,7 +709,7 @@ Se tes problemas para usala aplicación, asegúrate de consultar estas respostas ás preguntas comúns! Ordenar Modo rápido - Estás executandola última versión de NewPipe + Estás executando a última versión de NewPipe Toca para descargar %s Importa ou exporta subscricións dende o menú dos 3 puntos Esta opción só está dispoñible se %s está seleccionado para o tema @@ -761,4 +757,5 @@ Mova o selector da lapela principal para a parte inferior Posición prinicipal das lapelas A tunelización da multimedia foi deshabilitada por defecto, porque o seu modelo de dispositivo carece de soporte. + Sen emisións \ No newline at end of file diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 5c55d0bad..6cae41316 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -63,7 +63,6 @@ שגיאה שגיאת רשת אין אפשרות לטעון את כל התמונות הממוזערות - לא ניתן לפענח את חתימת כתובת הסרטון ניתוח האתר לא התאפשר תוכן אינו זמין לא הייתה אפשרות להכין את תפריט ההורדה @@ -268,8 +267,6 @@ קצב שימוש בחיפוש מהיר ולא מדויק חיפוש גס מאפשר לנגן לחפש נקודת זמן מהר יותר, ברמת דיוק נמוכה יותר. חיפוש של 5, 15 או 25 שניות לא עובד עם ההגדרה הזאת - טעינת תמונות ממוזערות - כיבוי האפשרות מונע את טעינת התמונות הממוזערות, חוסך בתקשורת נתונים ובניצולת הזיכרון. שינויים באפשרות זו מוחקים את המטמון בזיכרון ובכונן הסרת כל נתוני העמודים שבמטמון הוספת התזרים הבא לרשימת הנגינה אוטומטית להמשיך תור נגינה סופית (בלתי מחזורית) על ידי הוספת תזרים קשור @@ -404,7 +401,7 @@ לא ניתן לשכתב את הקובץ כבר יש הורדה ממתינה בשם הזה NewPipe נסגר בזמן העבודה על הקובץ - לא נשאר מקום במכשיר + לא נשאר מקום במכשיר התהליך אבד כיוון שהקובץ נמחק החיבור המתין זמן רב מדי למחוק את היסטוריית ההורדות שלך או למחוק את כל הקבצים שהורדת\? @@ -459,7 +456,7 @@ שפת היישומון ברירת המחדל של המערכת יש ללחוץ על „סיום” לאחר הפתירה - סיום + סיום סרטונים שנייה אחת @@ -567,7 +564,7 @@ ערבוב חזרה ניתן לבחור עד שלוש פעולות בלבד שתופענה בהתראות המצומצמות! - ניתן לערוך כל התראה להלן בלחיצה עליה. מותר לבחור עד שלוש מהן שתופענה בהתראה המצומצמת באמצעות תיבות הסימן שמשמאל + ניתן לערוך כל התראה להלן בלחיצה עליה. מותר לבחור עד שלוש מהן שתופענה בהתראה המצומצמת באמצעות תיבות הסימן שמשמאל. כפתור פעולה חמישי כפתור פעולה רביעי כפתור פעולה שלישי @@ -624,7 +621,6 @@ פרטי לא מופיע ברשימות ציבורי - כתובת תמונה ממוזערת אירוח תמיכה שפה @@ -792,4 +788,56 @@ תיעול מדיה הושבת כברירת מחדל במכשיר שלך כיוון שדגם המכשיר ידוע בכך שאינו תומך בזה. אין תזרימים חיים אין תזרימים + סרטונים + מנויים + אין לשוניות מופיעות בעמודי הערוץ + לשוניות ערוץ + Shorts‎ + נתוני העל נטענים… + משיכת לשוניות הערוץ + על אודות + אלבומים + לשוניות למשיכה בעת עדכון ערוץ העדכונים. לאפשרות זו אין השפעה אם הערוץ מתעדכן במצב מהיר. + רשימות נגינה + רצועות + ערוצים + שידור חי + החלפת כיוון מסך + מילוי המסך/רגיל + התזרים הבא + פתיחת תור נגינה + דילוג קדימה + החזרה אחורה + נגינה חוזרת + נגינה + אפשרויות נוספות + משך + התזרים הקודם + איכות תמונה + \? + איכות נמוכה + תמונות ייצוגיות + תמונות ייצוגיות של תת־ערוצים + לא לטעון תמונות + איכות גבוהה + איכות בינונית + תמונות ייצוגיות של מעלים + כרזות + נא לבחור את איכות התמונות והאם בכלל להוריד אותן כדי לחסוך בצריכת נתונים ושימוש בזיכרון. השינויים מפנים הן את מטמון השמירה בזיכרון והן בכונן — %s + תמונות ממוזערות + שיתוף רשימת כתובות + שיתוף עם כותרות + %1$s +\n%2$s + שיתוף רשימת נגינה + שיתוף רשימת נגינה עם פרטים כגון שם רשימת נגינה וכותרות סרטונים או כרשימה פשוטה של כתובות סרטונים + - %1$s: %2$s + להציג עוד + להציג פחות + + תשובה %s + %s תשובות + %s תשובות + + אפשר לערוך כל פעולה בהתראה להלן על ידי נגיעה בה. שלוש הפעולות הראשונות (נגינה/השהיה, הקודם והבא) מוגדרות על ידי המערכת ונעולות לעריכה. \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index a2bbaf672..a425a9b04 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -1,136 +1,135 @@ %1$s पे प्रकाशित हुआ - स्ट्रीमिंग के लिए चालक नहीं मिला। क्या आप वीएलसी इंस्टॉल करना चाहेंगे\? - स्थापित करें + स्ट्रीमिंग के लिए प्लेयर नहीं मिला। क्या आप वीएलसी इंस्टॉल करना चाहेंगे\? + इंस्टॉल करें ब्राउज़र में खोलें पॉपअप मोड में खोलें शेयर करें - डाउनलोड करे + डाउनलोड करें खोजें सेटिंग्स सब्सक्राइब करें - सब्सक्राइड है + सब्सक्राइब है चैनल अनसब्सक्राईब हुआ सब्सक्रिप्शनस बैकग्राउंड पॉपअप - ध्वनि + ऑडियो रौशनी काला देखे हुए वीडियोज़ का इतिहास - डाउनलोड करे + डाउनलोड करें वीडियो और ऑडियो इतिहास और कैश बैकग्राउंड में चल रहा है कोई विऊ नहीं - कोई वीडियो नहीं है - न्यूपाइप के बारे में जाने + कोई वीडियो नहीं + न्यूपाइप के बारे में जानें तृतीय-पक्ष लाइसेंस ऐप के बारे में और सामान्य प्रश्न लाइसेंस - गिटहब में देखें + गिटहब पर देखें न्यूपाइप का लाइसेंस लाइसेंस पढ़ें योगदान करें इतिहास इतिहास फ़िलहाल चर्चा में है - ऑडियो सेटिंग + ऑडियो सेटिंग्स आरंभ करने के लिए आवर्धक कांच को स्पर्श करें। रद्द करें क्या आप का मतलब \"%1$s\" था\? - के साथ शेयर करे - कोई दूसरा वीडियो चालक प्रयोग करें - कुछ वीडियो गुणवत्ता स्तर पर ध्वनि हट सकती है - कोई दूसरा ध्वनि चालक उपयोग करें + के साथ शेयर करें + बाहरी वीडियो प्लेयर का उपयोग करें + कुछ रिजॉल्युशनों पर ध्वनि हट सकती है + बाहरी ऑडियो प्लेयर का उपयोग करें सब्सक्रिप्शन बदली नहीं जा सकी सब्सक्रिप्शन अपडेट नहीं किया जा सका क्या नया है - वीडियो डाउनलोड का फ़ोल्डर - डाउनलोड की गई वीडियो फ़ाइलें यहां संग्रहीत हैं + वीडियो के लिए डाउनलोड फ़ोल्डर + डाउनलोड की गई वीडियो फ़ाइलें यहां संग्रहित होती हैं वीडियो फ़ाइलों के लिए डाउनलोड फ़ोल्डर चुनें - ध्वनि डाउनलोड फ़ोल्डर - डाउनलोड की गई ध्वनि फ़ाइलें यहां संग्रहीत हैं - ध्वनि फ़ाइलों के लिए डाउनलोड फ़ोल्डर चुनें - प्रथम स्थापित गुणवत्ता स्तर - पॉपअप का प्रथम स्थापित गुणवत्ता स्तर - उच्च गुणवत्ता स्तर दिखाएं - केवल कुछ ही डिवाईस 2के/4के मे वीडियो चला सकते हैं - कोडी मे चलाए - गैर- मौजूदा Kore ऐप स्थापित करें\? - \"कोडी मे चलाएं\" वाला विकल्प दिखाएँ - कोडी मीडिया सेंटर से वीडियो चलने के लिए विकल्प प्रदर्शित करें - प्रथम स्थापित ध्वनि फॉर्मेट - प्रथम स्थापित वीडियो फॉर्मेट - ऐप थीम + ऑडियो के लिए डाउनलोड फ़ोल्डर + डाउनलोड की गई ऑडियो फ़ाइलें यहां संग्रहित होती हैं + ऑडियो फ़ाइलों के लिए डाउनलोड फ़ोल्डर चुनें + डिफ़ॉल्ट रिजॉल्युशन + पॉपअप का डिफ़ॉल्ट रिजॉल्युशन + उच्च रिजॉल्युशन दिखाएं + केवल कुछ ही डिवाईस 2K/4K में वीडियो चला सकते हैं + Kodi में चलाएं + गैर- मौजूदा Kore ऐप इंस्टॉल करें\? + \"Kodi में चलाएं\" वाला विकल्प दिखाएँ + Kodi मीडिया सेंटर से वीडियो चलने के लिए विकल्प प्रदर्शित करें + डिफ़ॉल्ट ऑडियो फॉर्मेट + डिफ़ॉल्ट वीडियो फॉर्मेट + थीम गहरा - वीडियो पॉपअप का आकार और उसकी स्थिति को याद रखें + वीडियो पॉपअप के गुणस्वभाव को याद रखें वीडियो पॉपअप की अंतिम स्थिति और आकार को याद रखें खोज में सुझाव - खोज के दौरान दिखाये जाने वाले सुझाव चुने + खोज के दौरान दिखाये जाने वाले सुझाव चुनें खोज का इतिहास - खोज के डेटा को सिर्फ डिवाइस मेमोरी में रखे + खोज क्वेरीज़ को स्थानीय रूप से संग्रहित करें देखे गए वीडियोज़ की सूची रखें प्लेबैक फिर से शुरू करें - रुकावटें खत्म होने के बाद वीडियो प्ले करें (जैसे - फ़ोन कॉल) - \'अगला\' और \'समान\' वीडियो दिखाए + रुकावटें (जैसे कि फ़ोन कॉल) खत्म होने के बाद वीडियो प्ले जारी रखें + \'अगला\' और \'समान\' वीडियो दिखाएं \"कतार में जोड़ने के लिए स्पर्श बनाये रखें\" दिखाएं जब बैकग्राउंड और पॉपअप बटन वीडियो के विवरण पन्ने में दबाई जाए तो सलाह दिखाएं असमर्थित URL - डिफ़ॉल्ट विषय की भाषा + डिफ़ॉल्ट सामग्री की भाषा प्लेयर - चाल चलन + व्यवहार दिखावट - वीडियो पॉपअप के अंदाज में चल रहा + वीडियो पॉपअप के अंदाज में चल रहा है विषयवस्तु आयु प्रतिबंधित सामग्री दिखाएं लाइव - डाउनलोड - डाउनलोड + डाउनलोडस + डाउनलोडस त्रुटी की रिपोर्ट - सारे - बंद करे - साफ़ - बेहतर वीडियो की क्वालिटी - वापस जाएँ - सारे प्ले करे - NewPipe की सूचनापत्र - न्यूपाइप के बैकग्राउंड में चल रहे वीडियो और पॉपअप वीडियो के लिए सूचनापत्र - [नहीं जानते] + सभी + बंद किया + साफ करें + उत्तम रिजॉल्युशन + वापिस + सभी प्ले करें + न्यूपाइप की नोटीफिकेशन + न्यूपाइप के बैकग्राउंड और पॉपअप प्लेयर के लिए नोटीफिकेशन + [अज्ञात] त्रुटी नेटवर्क में त्रुटी - सारे thumbnail(फोटो जो फ़ोन की मेमोरी में है ) भरे नहीं जा सकते - वीडियो के URL हस्ताक्षर को डीऑबफस्केट नहीं कर सकते - इस website का निरंक्षण नहीं कर सकते + सभी थंमनेल लोड नहीं किए जा सके + वैबसाइट parse नहीं हो सकी विषय वस्तु उपलब्ध नहीं है - डाउनलोड मेनू को स्थापित नहीं कर सकते - APP/UI टूट गया + डाउनलोड मेनू स्थापित नहीं किया जा सका + APP/UI करैश हो गई इस वीडियो को चलाने में असफल हुए - कभी ठीक न होने वाले वीडियो प्लेयर की त्रुटी आ रही है + अनचाही वीडियो प्लेयर त्रुटी आयी है वीडियो प्लेयर त्रुटी से ठीक हो रहा है - खेद है की, ऐसा होना नहीं चाहिए था. - रिपोर्ट को ईमेल से भेजे - माफ़ करे, कुछ त्रुटि हो गई। + खेद है, कि ऐसा होना नहीं चाहिए था। + रिपोर्ट को ईमेल से भेजें + माफ़ करें, कुछ त्रुटि हो गई। रिपोर्ट करें जानकारी: क्या हुआ: क्या:\\nअनुरोध:\\nसामग्री भाषा:\\nसामग्री देश:\\nऐप भाषा:\\nसेवा:\\nजीएमटी समय:\\nपैकेज:\\nसंस्करण:\\nOS संस्करण: - आपकी टिप्पणी: + आपकी टिप्पणी(अंग्रेजी में): विवरण: - वीडियो चलाये, समय : - अपलोडर के thumbnail वाले फोटो + वीडियो चलाएं, अवधि : + अपलोडर का अवतार थंमनेल पसंद नापसंद - कोई परिणाम नहीं मिला - यहां के खालीपन को दूर करने के लिए कुछ सर्च करें या किसी चैनल को सब्सक्राइब करें और प्लेलिसट बनाकर उसमें वीडियो जोड़े + कोई परिणाम नहीं + यहां के खालीपन को दूर करने के लिए कुछ सर्च करें या किसी चैनल को सब्सक्राइब करें और प्लेलिसट बनाकर उसमें वीडियो जोड़ें वीडियो ऑडियो - फिर से कोशिश करे + फिर से कोशिश करें हज़ार - करोड़ + मिलियन अरब - कोई सब्सक्राइबर नहीं है + कोई सब्सक्राइबर नहीं %s सब्सक्राइबर %s सब्सक्राइबर्स @@ -141,7 +140,7 @@ %s वीडियो - %s वीडियोस् + %s वीडियोज़ शुरू रोकें @@ -149,75 +148,75 @@ चेकसम ठीक है फाइल का नाम - मेसेज के thread + थ्रेड्स त्रुटी - न्यूपाइप डाउनलोड हो रहा है - विवरण देखने के लिए दबाये + न्यूपाइप डाउनलोड कर रही है + विवरण के लिए टैप करें कृपया प्रतीक्षा करें… क्लिपबोर्ड पर कॉपी हो गया है - कृपया बाद में सेटिंग्स में डाउनलोड स्थान चुने - पॉपअप के तरीके में खोलने के लिए + कृपया बाद में सेटिंग्स में डाउनलोड स्थान चुनें + पॉपअप मोड में खोलने के लिए \nइस अनुमति की जरुरत है reCAPTCHA चुनौती reCAPTCHA चुनौती का अनुरोध किया डाउनलोड - फाइल के नाम के लिए आवश्यक कैरेक्टर (जैसे - १२३, abc) की अनुमति है - अमान्य कैरेक्टर्स इस संख्या से बदल जायेंगे + फ़ाइल नाम में अनुमत कैरेक्टर + अमान्य कैरेक्टर्स इस संख्या से बदल दिए जायेंगे रिप्लेसमेंट करैक्टर वर्ण और अंक - विशेष कैरेक्टर्स - %2$s के द्वारा © %1$s जो %3$s के अधीन आते है + सबसे विशेष कैरेक्टर्स + %2$s के द्वारा © %1$s जो %3$s के अधीन आते हैं एंड्राइड के लिए हल्का और मुफ्त स्ट्रीमिंग एप्लिकेशन। - अगर आपके पास कोई सुझाव हो जैसे -अनुवाद , डिजाईन में बदलाव ,code को साफ़ रखना , या फिर code में जायदा बदलाव लाना हो तो - साहयता के लिए आपका स्वागत है . जितना ज्यादा होगा उतना बेहतर होगा ! - क्या आप इसको खोज इतिहास के मिटाना चाहते है ? - मुख्य पेज की विषयवस्तु + अगर आपके पास कोई सुझाव हो जैसे कि - अनुवाद करना, डिजाईन में बदलाव करना, कोड को साफ़ रखना, या फिर कोड में जायदा बदलाव लाना हो तो - सहायता के लिए आपका स्वागत है। जितना ज्यादा होगा उतना बेहतर होगा ! + क्या आप इसको खोज इतिहास से मिटाना चाहते हैं \? + मुख्य पृष्ठ की विषयवस्तु खाली पन्ना - kiosk पन्ना - चैनल वाला पन्ना - चैनल को चुने - अभी तक किसी भी चैनल के सदस्य नहीं है - kiosk को चुने - टॉप 50 - नया और प्रचलित - निकाले + कियोस्क पन्ना + चैनल पन्ना + चैनल चुनें + अभी तक किसी चैनल की सब्सक्रिप्शन नहीं है + कियोस्क चुनें + शीर्ष 50 + नए और प्रचलित + निकालें विवरण - जोड़ने के लिए पकड़ें रहे - पृष्टभूमि में चलाना शुरू करे - पॉपअप में चलाना शुरू करे - स्ट्रीमिंग करने के लिए कोई चालक उपलब्ध नहीं है (आप इसे चलाने के लिए वीएलसी चालक स्थापित कर सकते हैं)। + कतार में जोड़ने के लिए दबाकर रखें + बैकग्राउंड में चलाना शुरू करें + पॉपअप में चलाना शुरू करें + स्ट्रीमिंग करने के लिए प्लेयर नहीं मिला (आप इसे चलाने के लिए वीएलसी प्लेयर इंस्टॉल कर सकते हैं)। स्ट्रीम फाइल डाउनलोड करें जानकारी दिखाएं बुकमार्क की गई प्लेलिस्टें में शामिल करें - डिफ़ॉल्ट देश का विषय + सामग्री का डिफ़ॉल्ट देश हमेशा - सिर्फ एक बार के लिए + सिर्फ एक बार बैकग्राउंड में स्विच करें पॉपअप मोड में जाएं मुख्य पर स्विच करें डेटाबेस आयात करें डेटाबेस निर्यात करें - आपके वर्तमान इतिहास, सब्सक्रिप्शनस, प्लेलिस्ट और (वैकल्पिक रूप से) सेटिंग्स को अधिभावी करेगा + आपके वर्तमान इतिहास, सब्सक्रिप्शनस, प्लेलिस्ट और (वैकल्पिक रूप से) सेटिंग्स को ओवरराइड करता है इतिहास, सब्सक्रिप्शन, प्लेलिस्ट और सेटिंग निर्यात करें - एक्सटर्नल प्लेयर इन प्रकार के लिंक सपोर्ट नहीं करता + बाहरी प्लेयर्स इन प्रकार के लिंक सपोर्ट नहीं करते कोई वीडियो स्ट्रीम नहीं मिला - कोई ऑडियो स्ट्रीम नहीं मिली + कोई ऑडियो स्ट्रीम नहीं मिला फिर से क्रम देने के लिए खींचें बनाइये ख़ारिज करें नाम बदलें दान करें - न्यूपाइप स्वयंसेवकों द्वारा विकसित किया जाता है जो आपको अच्छा अनुभव देने के लिए अपना खाली समय व्यतीत करते हैं। स्वयंसेवको को मदद भेजे, ताकि वह न्यूपाइप को और अच्छा बना सके। + न्यूपाइप स्वयंसेवकों द्वारा विकसित किया जाता है जो आपको अच्छा अनुभव देने के लिए अपना खाली समय इस एप्लिकेशन को देते हैं। स्वयंसेवको को मदद भेजे, ताकि वह न्यूपाइप को और अच्छा बना सके। वापस दें वेबसाइट अधिक जानकारी और खबरों के लिए न्यूपाइप की वेबसाइट पर जाएं। पिछला चलाया गया अधिकतम चलाए गए - निर्यात किए गए - आयातित - कोई मांय ज़िप फ़ाइल नहीं + निर्यात संपन्न हुआ + आयात संपन्न हुआ + कोई वैध ज़िप फ़ाइल नहीं है चेतावनी: सभी फ़ाइलों को आयात नहीं किया जा सका। - यह आपके वर्तमान सेटअप को ओवरराइड करेगा । + यह आपके वर्तमान सेटअप को ओवरराइड कर देगा। ड्रावर खोलें ड्रावर बंद करें वीडियो प्लेयर @@ -230,69 +229,67 @@ नाम बदलें नाम प्लेलिस्ट में जोड़ें - प्लेलिस्ट थंमनेल के रूप में सेट करें + प्लेलिस्ट थंमनेल के रूप में सैंट करें प्लेलिस्ट बुकमार्क करें बुकमार्क हटायें - प्लेलिस्ट को हटाना चाहते हैं\? - सूची बना दी गई + प्लेलिस्ट को मिटाना चाहते हैं\? + प्लेलिस्ट बना दी गई प्लेलिस्ट में जोड़ा गया - प्लेलिस्ट का थंमनेल बदल दिया गया है। - कोई अनुशीर्षक नहीं है + प्लेलिस्ट का थंमनेल बदल दिया गया। + कोई अनुशीर्षक नहीं फिट भरें - ज़ूम करें + ज़ूम डीबग करें - ऑटो-जनरेटेड + अपने-आप बनी हीप डंप करने के दौरान मेमोरी लीक मॉनिटरिंग ऐप को अनुत्तरदायी बना सकता है - Out-of-Lifecycle त्रुटियों की रिपोर्ट करें - थंमनेल लोड करें + चक्र से बाहर त्रुटियों की रिपोर्ट करें तेज और अनिश्चित तलाश का प्रयोग करें अनिश्चित खोज से प्लेयर में कम सटीकता से लेकिन तेजी से वीडियो पोजीशन्स की तलाश कर सकता हैं। 5, 15 या 25 सेकंड की तलाश में यह काम नहीं करता - डेटा खपत, मेमोरी उपयोग की बचत और थंमनेल लोड होने से रोकने के लिए बंद करें। इस बदलाव से इन-मेमोरी और ऑन-डिस्क छवि कैश दोनों मिट जाते हैं चित्र कैश मिटाया गया कैश मेटाडेटा मिटाएं कैश किए गए सभी वेबपेज का डेटा हटाएं मेटाडाटा कैश मिटाया गया अगली स्ट्रीम को अपने आप जोड़े - गैर-दोहराने वाली कतार में अंतिम स्ट्रीम चलाते समय संबंधित स्ट्रीम को स्वतः संलग्न करें + खत्म होने वाली पर ना-दोहराने वाली प्लेबैक कतार को संबंधित स्ट्रीम जोड़ते हुए जारी रखें फाइल चेनल्स - सूची - क्स + प्लेलिस्ट + ट्रैकस उपभोगता देखे हुए वीडियो की सूची साफ करें चलाये गए स्ट्रीम के इतिहास और प्लेबैक स्थानों को साफ करता है - देखे गए सभी का इतिहास साफ करें\? - देखा हुआ इतिहास साफ कर दिया गया - ढूंढने के इतिहास को साफ करें - ढूंढे गए शब्दो का इतिहास साफ करता है - पूरे खोज इतिहास को मिटा दे \? - खोज के इतिहास को साफ कर दिया - एसी कोई भी फ़ोल्डर मौजूद नहीं है + क्या देखा गया सब इतिहास मिटा दिया जाए\? + देखा हुआ इतिहास मिटा दिया गया + खोज इतिहास को साफ करें + खोजे गए शब्दों का इतिहास साफ करता है + पूरे खोज इतिहास को मिटा दें\? + खोज इतिहास मिटाया गया + ऐसा कोई फ़ोल्डर मौजूद नहीं अमान्य फाइल/विषय - वस्तु का स्रोत - फ़ाइल मौजूद नहीं है या उसे पढ़ने या लिखने की पर्याप्त अनुमति नही़ं है + फ़ाइल मौजूद नहीं है या उसे पढ़ने या लिखने की पर्याप्त अनुमति नहीं है फ़ाइल का नाम खाली नहीं हो सकता - एक भूल हुई: %1$s - डाउनलोड करने के लिए कोई स्ट्रीम उपलब्ध नही है - एक चीज़ साफ कर दी गई। + एक त्रुटी उत्पन्न हुई: %1$s + डाउनलोड करने के लिए कोई स्ट्रीम उपलब्ध नहीं है + एक आइटम मिटा दी गई। न्यूपाइप की गोपनीयता नीति - न्यूपाइप परियोजना आपकी गोपनीयता को बहोत गंभीर रूप से लेता है। इसलिए, ऐप आपकी अनुमति के बिना कोई डेटा जमा नही करता। -\nन्यूपाइप की गोपनीयता नीति विस्तार से समज़ाती है कि कोनसा डेटा भेजा या संग्रह किया जाता है जब आप क्रेश विवरण भेजते है। - गोपनीयता नीति पढ़े - क्या आप सेटिंग्स भी आयात करना चाहते है? - तरजीही \'open\' एक्शन + न्यूपाइप परियोजना आपकी गोपनीयता को बहुत गंभीर रूप से लेता है। इसलिए, ऐप आपकी अनुमति के बिना कोई डेटा जमा नहीं करता। +\nन्यूपाइप की गोपनीयता नीति विस्तार से समझाती है कि कौनसा डेटा भेजा और संग्रह किया जाता है जब आप क्रेश विवरण भेजते हैं। + गोपनीयता नीति पढें + क्या आप सेटिंग्स भी आयात करना चाहते हैं\? + \'खोलने\' पर तरजीही एक्शन सामग्री खोलते समय डिफ़ॉल्ट कारवाही — %s अनुशीर्षक - प्लेयर अनुशीर्षक के शब्दों का परिमाण और पृष्ठभूमि शैलियों को बदले। लागू करने के लिए ऐप को पुनः प्रारम्भ करना जरूरी है + प्लेयर कैप्शन टेक्स्ट स्केल और पृष्ठभूमि शैलियों को संशोधित करें। प्रभावी होने के लिए ऐप को पुनरारंभ करना आवश्यक है आयात - से आयात करे + से आयात करें पर निर्यात करे आयात किया जा रहा है… निर्यात किया जा रहा है… - फाइल आयात करे + फाइल आयात करें पहले वाला निर्यात - सब्सक्रिप्शन आयात नही कर सके - सब्सक्रिप्शन निर्यात नही कर सके + सब्सक्रिप्शन आयात नहीं कर सके + सब्सक्रिप्शन निर्यात नहीं कर सके गूगल टेकआउट से यूट्यूब सदस्यता आयात करें: \n \n1. इस यूआरएल पर जाएं: %1$s @@ -303,77 +300,77 @@ \n6. नीचे आयात फ़ाइल पर क्लिक करें और डाउनलोड की गई .zip फ़ाइल चुनें \n7. [यदि .zip आयात विफल हो जाता है] .csv फ़ाइल निकालें (आमतौर पर \"यूट्यूब और यूट्यूब म्युज़िक/सब्सक्रिपशन/subscriptions.csv\" के अंतर्गत), नीचे आयात फ़ाइल पर क्लिक करें और निकाली गई सीएसवी फ़ाइल चुनें आपका आईडी, soundcloud.com/(आपका आईडी) - ध्यान रखे, यह तरीका नेटवर्क साधनो के लिए मंहगा हो सकता है। + ध्यान रखें, यह तरीका नेटवर्क खर्चीला हो सकता है। \n -\nक्या आप आगे बढ़ना चाहते है? - चलाने की गति के नियंत्रण - गति - ऊंचाई - अनहुक (बिगाड़ सकता है) - खामोशी के समय तेज़ी से आगे बढ़े +\nक्या आप आगे बढ़ना चाहते हैं\? + प्लेबैक स्पीड कंट्रोल + ताल + पिच + अनहुक (आवाज़ में बिगाड़ पड़ सकता है) + खामोशी के समय तेज़ी से आगे बढ़ें कदम - रीसेट - स्वीकारे - अस्वीकार करे + रीसेट करें + स्वीकार करें + अस्वीकार करें असीमित - मोबाइल डेटा उपयोग करते समय रिजॉल्युशन को सिमित करे - ऐप बदलते समय उसे मिनिमाइज करे - मुख्य वीडियो चालक से दूसरी ऐप पर जाने पर — %s - कोई नही - बैकग्राउंड प्लेयर में बदले - पॉपअप प्लेयर में बदले + मोबाइल डेटा उपयोग करते समय रिजॉल्युशन को सीमित करें + ऐप बदलते समय उसे मिनिमाइज करें + मुख्य वीडियो प्लेयर से दूसरी ऐप पर जाने पर कार्रवाई — %s + कोई नहीं + बैकग्राउंड प्लेयर में बदलें + पॉपअप प्लेयर में बदलें न्यूपाइप एक काॅपीलेफ़्ट फ़्री साॅफ़्टवेर है: इसे आप अपनी इच्छा के अनुसार इस्तेमाल, जाँच, बाँट तथा और बेहतर बना सकते है। खास तौर पर आप इसे फ़्री साॅफ़्टवेर फ़ाउंडेशन के द्वारा जारी जीएनयू जनरल पब्लिक लाइसेंस के तीसरे या उसके बाद आने वाले कोई भी वर्णन के शर्तों के मुताबिक फिर से बाँट या बदल सकते हैं। अनसब्सक्राईब करें - टैब चुने + टैब चुनें कतारबद्ध करें - अपडेट + अपडेटस फाइल मिटा दी गयी - ऐप अपडेट अधिसूचना - नए NewPipe अपडेट की सूचनापत्र + ऐप अपडेट नोटीफिकेशन + नए नयूपाईप अपडेट का नोटीफिकेशन एक्सटर्नल स्टोरेज अनुपलब्ध - SD कार्ड पर डाउनलोड करना संभव नहीं।डाउनलोड स्थान पुनः चुने\? - सामान्य चुनाव पर लौटें - क्या आप सामान्य चुनाव पर लौटना चाहते है\? - सब्सक्राइबर स॔ख्या अनुपलब्ध + SD कार्ड पर डाउनलोड करना संभव नहीं। डाउनलोड स्थान पुनः चुनें\? + डिफ़ॉल्टस पुन: स्थापित करें + क्या आप डिफ़ॉल्टस पर लौटना चाहते है\? + सब्सक्राइबर संख्या अनुपलब्ध मुख्य पृष्ठ पर कौन से टैब दिखाए जाते हैं - अपडेट + अपडेटस सूची न्यूपाइप अपडेट उपलब्ध! समाप्त अपूर्ण रोका हुआ कतार में - प्रक्रिया के बाद + पोस्ट-प्रोसेसिंग कार्य सिस्टम द्वारा अस्वीकार डाउनलोड विफल रहा - अनोखा नाम बनाये - ऊपर लिखना + अनोखा नाम बनायें + ओवरराइट करें इस नाम का एक डाउनलोड चालू है - गंतव्य फ़ोल्डर नहीं बनाया जा सकता + डेस्टीनेशन फ़ोल्डर नहीं बनाया जा सकता फ़ाइल नहीं बनाई जा सकती सुूरक्षित कनेक्शन विफल सर्वर नहीं ढूँढ सका सर्वर से जुड़ नहीं सकता सर्वर डेटा नहीं भेजता है नहीं मिला - प्रक्रिया के बाद का कार्य विफल रहा - रोके + पोसट प्रोसेसिंग विफल रही + रोकें अधिकतम पुनर्प्रयास डाउनलोड रद्द करने से पहले प्रयासों की अधिकतम संख्या - मीटर्ड नेटवर्क पर रोके + मीटर्ड नेटवर्क पर रोकें मोबाइल डाटा का इस्तेमाल करते समय उपयोगी है, परंतु कुछ डाउन्लोड रोके नहीं जा सकते है घटनायें - सम्मेलनों + कॉन्फ्रेंस टिप्पणियां दिखाएं टिप्पणियां छिपाने के लिए इसे बंद करे - ऑटोप्ले करे + ऑटोप्ले कोई टिपण्णी नहीं - टिप्पणियाँ लोड नहीं कर सका - बंद करे + टिप्पणियाँ लोड नहीं हो पाई + बंद करें प्लेबैक वापस चालू करें आखिरी प्लेबैक पोजिशन पर वापस लौटे सूचियों में स्थान - प्लेबैक पोजिशन के निशान सूचियों में दिखाए + प्लेबैक पोजिशन के निशान सूचियों में दिखाएं डाटा मिटायें प्लेबैक स्थान मिटा दिए गए फाइल की जगह बदली गयी या फिर फाइल मिटा दी गयी @@ -382,7 +379,7 @@ फाइल को ओवरराइट नहीं कर सकते इस नाम का एक डाउनलोड बाकी है फ़ाइल पर कार्य करते समय न्यूपाइप बंद किया गया - डिवाइस पर जगह समाप्त + डिवाइस पर जगह समाप्त प्रगति खो गई, क्योंकि फ़ाइल मिटा दी गई थी कनेक्शन का समय समाप्त क्या आप अपना डाउनलोड इतिहास मिटाना चाहते हैं या सभी डाउनलोड की गई फ़ाइलों को हटाना चाहते हैं\? @@ -390,41 +387,41 @@ एक ही समय में एक डाउनलोड चलेगा डाउनलोड प्रारंभ करें डाउनलोड रोकें - डाउनलोड कहाँ करने के लिए पूछे + डाउनलोड कहाँ करना है, के लिए पूछें आपको हर डाउनलोड का स्थान पूछा जाएगा -\nयदि आप बाहरी एसडी कार्ड में डाउनलोड करना चाहते हैं तो सिस्टम फोल्डर पिकर (एसएएफ) को सक्षम करें - सिस्टम फोल्डर पिकर (एसएएफ) का प्रयोग करें - प्लेबैक स्थानों को मिटाये - सारे प्लेबैक स्थानों को मिटाये - सारे प्लेबैक स्थानों को मिटाये\? - फ्रेगमेंट या एक्टिविटी लाइफसाइकिल के बाद Rx सन्देश ना पहुँचाया जा सके तोह ज़रूर कोशिश करे +\nयदि आप बाहरी एसडी कार्ड में डाउनलोड करना चाहते हैं तो सिस्टम फोल्डर पिकर (SAF) को सक्षम करें + सिस्टम फोल्डर पिकर (SAF) का प्रयोग करें + प्लेबैक स्थानों को मिटाएं + सारे प्लेबैक स्थानों को मिटाता है + सारे प्लेबैक स्थानों को मिटाएं\? + निपटान के बाद खंड या गतिविधि जीवन चक्र के बाहर अविभाज्य आरएक्स अपवादों की रिपोर्टिंग को बलपूर्वक लागू करें साउंडक्लाउड प्रोफाइल निर्यात करने के लिए आईडी या युआरएल दीजिये: \n -\n1. अपने वेब ब्राउज़र में \"डेस्कटॉप मोड\" चालू करे (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है) -\n2. इस युआरएल को खोले: %1$s -\n3. लॉग इन करे -\n4. आप जिस प्रोफाइल युआरएल पे भेजे जाते है उसे कॉपी करे। - यूरोप के जेनेरल डाटा प्रोटेक्शन रेगुलेशन (जीडीपीआर) का पालन करने के लिए, हम आपका ध्यान न्यूपाइप की नयी प्राइवेसी पालिसी पे डालना चाहते है। इसे बारीकी से पढ़िए। -\nआपको अगर हमें कोई त्रुटि रिपोर्ट भेजना हो तो इसे स्वीकार करे। - सामान्य टैब्स का इस्तेमाल, सहेजे टैब्स को पढ़ने में रूकावट - जब इस ऐप के लिए अपडेट उपलब्ध हो, तब अधिसूचना दिखाई जाये +\n1. अपने वेब ब्राउज़र में \"डेस्कटॉप मोड\" चालू करें (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है) +\n2. इस युआरएल को खोलें: %1$s +\n3. लॉग इन करें +\n4. आप जिस प्रोफाइल युआरएल पे भेजे जाते हैं उसे कॉपी करें। + यूरोपीय जनरल डेटा प्रोटेक्शन रेगुलेशन (जीडीपीआर) का अनुपालन करने के लिए, हम आपका ध्यान न्यूपाइप की गोपनीयता नीति पे डालना चाहते हैं। इसे बारीकी से पढ़िए। +\nआपको अगर हमें कोई त्रुटि रिपोर्ट भेजना हो तो इसे स्वीकार करना होगा। + सहेजे टैब्स को पढ़ने में रूकावट, इसलिए सामान्य टैब्स का इस्तेमाल हो रहा है + जब नई अपडेट उपलब्ध हो, तब एप अपडेट करने के लिए अधिसूचना दिखाई जाये सूचि देखने वाला ढंग ग्रिड ऑटो - त्रुटि दिखाए + त्रुटि दिखाएं सर्वर मल्टी थ्रेडेड डाउनलोड स्वीकार नहीं करता, पुनः कोशिश करे @string/msg_threads = 1 के साथ \'स्टोरेज एक्सेस फ्रेमवर्क\' आपको बाहरी एसडी कार्ड पर डाउनलोड करने देता है - सेवा चुने, वर्तमान चुनाव : - सामान्य कीओस्क - कोई दर्शक नहीं + सेवा चुनें, वर्तमान चुनाव : + डिफ़ॉल्ट कियोस्क + कोई दर्शक नहीं देख रहा %s दर्शक है %s दर्शक हैं - कोई नहीं सुन रहा है + कोई श्रोता नहीं सुन रहा %s श्रोता - %s श्रोताए + %s श्रोता ऐप के पुनः आरंभ होने के बाद भाषा बदल जाएगी तेज मोड सक्षम करें @@ -442,17 +439,17 @@ \nतो आखिर में चुनाव आपकी पसंद पर है: गति या फिर सटीक जानकारी। यह सामग्री फिलहाल न्यूपाइप सपोर्ट नहीं करता है। \n -\nइसे आशा से भविष्य के संस्करणों में सपोर्ट किया जायेगा। +\nआशा है कि भविष्य के संस्करणों में सपोर्ट किया जायेगा। चैनल का अवतार थंमनेल %s के द्वारा %s के द्वारा बनाया गया - प्लेलिस्ट पृष्ठ - %s : के लिए परिणाम दिखया जा रहा है - हो गया + प्लेलिस्ट पन्ना + %s : के लिए परिणाम दिखाया जा रहा है + संपन्न कलाकार - गाने + गीत कभी नहीं - reCAPTCHA कुकीज़ को साफ़ कर दिए गए हैं + reCAPTCHA कुकीज़ साफ़ कर दिए गए ReCAPTCHA कुकीज़ साफ़ करें एल्बम वीडियो @@ -461,27 +458,27 @@ \nयदि आप इसे देखना चाहते हैं तो सेटिंग में \"%1$s\" चालू करें। यूट्यूब एक \"प्रतिबंधित मोड\" प्रदान करता है जो संभावित रूप से परिपक्व सामग्री को छुपाता है यूट्यूब का \"प्रतिबंधित मोड\" चालू करें - बच्चों के लिए अनुपयुक्त सामग्री दिखाएं क्योंकि इसकी आयु सीमा है (जैसे 18) + वह सामग्री भी दिखाएं जो आयु सीमा की वजह से शायद बच्चों के लिए अनुपयुक्त हो (जैसे 18+) केवल HTTPS यूआरएल ही समर्थित हैं URL की पहचान नहीं हो सकी। दूसरे ऐप से खोलें\? अपने आप कतार में जोड़े कतार को मिटाने से पहले सत्यापन के लिए पूछें - तलाश अवधि फास्ट-फ़ॉरवर्ड /- रिवाइंड करे - एंड्रॉइड को थम्बनेल में मुख्य रंग के अनुसार अधिसूचना रंग को अनुकूलित करने की अनुमति दे (ध्यान दें कि यह सभी उपकरणों पर उपलब्ध नहीं है) - अभिसूचना को रंगीन करें + फास्ट-फ़ॉरवर्ड /- रिवाइंड करने की अवधि + एंड्रॉइड को थंमनेल में मुख्य रंग के अनुसार नोटीफिकेशन रंग को अनुकूलित करने की अनुमति दें (ध्यान दें कि यह सभी उपकरणों पर उपलब्ध नहीं है) + नोटीफिकेशन को रंगीन करें कुछ नहीं बफरिंग - शफल करे + शफल करें दोहराएं - आप संछिप्त अभिसूचना में दिखाए जाने वाले विकल्प में से अधिकतम 3 को चुन सकते है ! - नीचे दी गई प्रत्येक अधिसूचना क्रिया को उस पर टैप करके संपादित करें। दाईं ओर चेकबॉक्स का उपयोग करके उनमें से अधिकतम तीन का चयन करें जिन्हें कॉम्पैक्ट अधिसूचना में दिखाया जाना है + आप कंपैकट नोटीफिकेशन में दिखाए जाने वाले विकल्प में से अधिकतम 3 को चुन सकते है ! + नीचे दी गई प्रत्येक नोटीफिकेशन क्रिया को उस पर टैप करके संपादित करें। दाईं ओर चेकबॉक्स का उपयोग करके उनमें से अधिकतम तीन का चयन करें जिन्हें कंपैकट नोटीफिकेशन में दिखाया जाना है। पांचवा एक्शन बटन चतुर्थी एक्शन बटन तृतीय एक्शन बटन द्वितीय एक्शन बटन प्रथम एक्शन बटन - नोटिफिकेशन में दिखाए गए वीडियो थम्बनेल को 16:9 के बजाय 1:1 के अनुपात में दिखाए - थम्बनेल को 1:1 के अनुपात में दिखाएं + नोटीफिकेशन में दिखाए गए वीडियो थंमनेल को 16:9 के बजाय 1:1 के अनुपात में दिखाएँ + थंमनेल को 1:1 के अनुपात में करें %d घंटा %d घंटे @@ -499,14 +496,14 @@ केवल वाईफाई पर स्वचालित रूप से प्लेबैक शुरू करें —%s मेमरी लीक दर्शाएँ - मौन हटायें - मौन + अवाज चालू करें + अवाज बंद करें सबसे पसंद किए गए हाल ही में जोड़ा स्थानीय - अभी कोई प्लेलिस्ट का बुक्मार्क नहीं है - प्लेलिस्ट का चयन करें - ∞ विडीओज़ + अभी कोई प्लेलिस्ट बुक्मार्क नहीं की हुई + प्लेलिस्ट चुनें + अनगिनत विडीओज़ 100+ विडीओज़ विवरण संबंधित स्ट्रीमस @@ -514,18 +511,18 @@ कृपया जांचें लें कि क्या आपके क्रैश पर चर्चा करने वाला मुद्दा पहले से मौजूद है। डुप्लिकेट टिकट बनाते समय, आप हमसे समय लेते हैं जो हम वास्तविक बग को ठीक करने के लिए खर्च कर सकते हैं। गिटहब पर रिपोर्ट करें अन्य ऐप्स पर प्रदर्शित करने की अनुमति दें - विडीओ हैशिंग की प्रगति की सूचना - वीडियो हैश अधिसूचना + विडीओ हैशिंग की प्रगति का नोटीफिकेशन + वीडियो हैश नोटीफिकेशन स्ट्रीम निर्माता, स्ट्रीम सामग्री या खोज अनुरोध के बारे में अतिरिक्त जानकारी के साथ मेटा जानकारी बक्से को छिपाने के लिए बंद करें - मेटा जानकारी दिखाएँ + मेटा जानकारी दिखाएं वीडियो का विवरण और अतिरिक्त जानकारी छिपाने के लिए इसे बंद करें विवरण दिखाएं - सक्रिय चालक की क़तार बदल दी जाएगी - एक चालक से दूसरे चालक में जाने से आपकी कतार बदल सकती है + सक्रिय प्लेयर की क़तार बदल दी जाएगी + एक प्लेयर से दूसरे प्लेयर में जाने से आपकी कतार बदल सकती है इसमें खोलें थंमनेल दिखाएं - लॉक स्क्रीन और नोटिफिकेशन दोनों के लिए थंमनेल का इस्तेमाल करे - पाठ + लॉक स्क्रीन और नोटिफिकेशन दोनों के लिए थंमनेल का इस्तेमाल करें + चैप्टर आपके डिवाइस का कोई भी ऐप इसे नहीं खोल सकता है यह सामग्री आपके देश में उपलब्ध नहीं है। यह एक साउंडक्लाउड गो+ ट्रैक है, कम से कम आपके देश में, इस कारण इसे न्यूपाइप द्वारा स्ट्रीम या डाउनलोड नहीं किया जा सकता है। @@ -535,36 +532,36 @@ रेडियो ऑटोमैटिक (डिवाइस थीम) अपनी पसंदीदा नाइट थीम चुने — %s - आप अपनी पसंदीदा नाइट थीम नीचे चुन सकते है - डाउलोड शुरू हो गया है + आप अपनी पसंदीदा नाइट थीम नीचे चुन सकते हैं + डाउनलोड शुरू हो गया है यह वीडियो आयु-प्रतिबंधित है। \nयूट्यूब की नई नीतियों के कारण न्यूपाइप किसी भी आयु प्रतिबंधित वीडियो स्ट्रीम का इस्तेमाल नहीं कर सकता है और इस कारण इसे वीडियो को प्ले करने में असमर्थ है। - पियरट्यूब उदाहरण - विशेष रुप से प्रदर्शित + पियरट्यूब इंसटैंस + फीचर्ड रात्रि थीम - हैश की गणना - स्वरूपित रिपोर्ट कॉपी करें - कुकी साफ़ करें जिसे न्यूपाइप आपके द्वारा रीकैप्चा हल करने पर संग्रहीत करता है - उदाहरण पहले से मौजूद है + हैश की गणना कर रहा है + फार्मेट की हूई रिपोर्ट कॉपी करें + कुकी साफ़ करें जिसे न्यूपाइप आपके द्वारा रीकैप्चा हल करने पर संग्रहित करता है + इंसटैंस पहले से मौजूद है इंसटैंस मान्य नहीं किया जा सका इंसटैंस यूआरएल दर्ज करें - उदाहरण जोड़ें + इंसटैंस जोड़ें %s पर अपनी पसंद के इंसटैंस ढूँढ़ें अपने पसंदीदा पीयर ट्यूब इंसटैंस चुनें मुख्य प्लेयर को पूर्ण स्क्रीन में शुरू करें मिनी प्लेयर में वीडियो शुरू न करें, लेकिन ऑटो रोटेशन लॉक होने पर सीधे फुल स्क्रीन मोड पर जाएं। आप अब भी फ़ुलस्क्रीन से बाहर निकलकर मिनी प्लेयर तक पहुंच सकते हैं टिप्पणियाँ करना बंद है देखा हुआ चिह्नित करें - चालक सूचनापत्र - सूचनापत्र - चालक असफल हुआ + प्लेयर नोटीफिकेशन + नोटीफिकेशन + प्लेयर क्रैश करें स्थानीय खोज सुझाव सार्वजनिक - अभी चल रही स्ट्रीम अधिसूचना को कॉन्फ़िगर करें + चल रही स्ट्रीम नोटीफिकेशन को कॉन्फ़िगर करें नई स्ट्रीमें - सब्सक्रिप्शनस के नई स्ट्रीमों के बारे में अधिसूचनाएं - त्रुटि रिपोर्ट अधिसूचना - त्रुटियों की रिपोर्ट करने के लिए अधिसूचनाएं + सब्सक्रिप्शनस की नई स्ट्रीमों के नोटीफिकेशन + त्रुटि रिपोर्ट नोटीफिकेशन + त्रुटियों की रिपोर्ट करने के लिए नोटीफिकेशन न्यूपाइप को एक त्रुटि का सामना करना पड़ा, रिपोर्ट करने के लिए टैप करें हल करें कतारबद्ध करें @@ -586,16 +583,16 @@ निम्न गुणवत्ता (छोटा) सीकबार थंमनेल पूर्वावलोकन उच्च गुणवत्ता (बड़ा) - अपडेट्स के लिए जांच हो रही है… - ठीक हो रहा है + अपडेटस के लिए जांच हो रही है… + पुन: प्राप्ति हो रही डिस्क से सभी डाउनलोड की गई फ़ाइलें मिटाएं\? एंड्रॉइड 10 से शुरू होकर केवल \'स्टोरेज एक्सेस फ्रेमवर्क\' समर्थित है एक इंस्टेंस चुनें हां, और आंशिक रूप से देखे गए वीडियो भी - फीड लोड हो रही है… + फ़ीड लोड हो रही है… फ़ीड अपडेट चरणसीमा - फ़ीड लोड करने में गड़बड़ी - \'%s\' के लिए फ़ीड लोड नहीं कर सका। + फ़ीड लोड करने में त्रुटि हूई + \'%s\' के लिए फ़ीड लोड नहीं हो सकी। हाल ही के विवरण में पाठ का चयन सक्षम करें गोपनीयता @@ -603,27 +600,26 @@ आयु सीमा सहायता होसट - अधिसूचनाएं अक्षम हैं + नोटीफिकेशन अक्षम हैं गैर-सूचीबद्ध सबको टॉगल करें अधिसूचना पायें , - नए संस्करणों के लिए मैन्युअल रूप से जांचें - एग्ज़ोप्लेयर के कमी के कारण खोज की अवधि %d सेकंड पर सेट की गई - खाता समाप्त किया गया + नई अपडेट के लिए मैन्युअल रूप से जांचें + एक्सोप्लेयर की बंदिश के कारण सीक करने की अवधि %d सेकंड पर सेट की गई + खाता बंद किया गया जो स्ट्रीम अभी तक डाउनलोडर द्वारा समर्थित नहीं हैं, वो नहीं दिखाई जाती बाहरी प्लेयरस के लिए क्वालिटी का चयन करें - अज्ञात प्रारूप + अज्ञात फार्मेट अज्ञात क्वालिटी ऐप को क्रैश करें श्रेणी आपसे पूछा जाएगा कि प्रत्येक डाउनलोड को कहां सहेजना है - थंमनेल यूआरएल ऑफ़ हमेशा अपडेट करें विवरण में पाठ का चयन अक्षम करें मत दिखाओ - दूरस्थ खोज सुझाव + रिमोट खोज सुझाव %s नई स्ट्रीम %s नई स्ट्रीमें @@ -631,33 +627,33 @@ प्रतिशत सैमीटोन - डाउनलोड समाप्त - %s डाउनलोडस समाप्त + डाउनलोड संपूर्ण + %s डाउनलोड संपूर्ण %d दिन - %d दिनो + %d दिन %d चयनित %d चयनित हुए - एग्ज़ोप्लेयर डिफ़ॉल्ट + एक्सोप्लेयर डिफ़ॉल्ट प्लेबैक लोड अंतराल आकार समूह का नाम नहीं सब्सक्रिप्शनस चुनें क्या आप इस समूह को हटाना चाहते हैं\? नया फ़ीड - नई फ़ीड आइटम - फ़ीड संसाधित हो रही है … + नये फ़ीड आइटम + फ़ीड प्रोसेस हो रही है … वेबसाइट खोलें उपलब्ध होने पर समर्पित फ़ीड से प्राप्त करें भाषा ऑन स्वतः बने (कोई अपलोडर नहीं मिला) चैनल समूह - कई बार पूछे प्रश्न + अक्सर पूछे जाते प्रश्न वेबसाइट पर देखें आइटम हटाने के लिए स्वाइप करें मीडिया टनलिंग अक्षम करें @@ -669,25 +665,25 @@ यदि आपको ऐप का उपयोग करने में परेशानी हो रही है, तो सामान्य प्रश्नों के इन उत्तरों को देखना सुनिश्चित करें! कतार में आगे जोड़ें प्रगतिशील सामग्री पर लोड अंतराल आकार बदलें (वर्तमान में %s)। एक कम मान उनकी आरंभिक लोडिंग को गति दे सकता है - लीककैनरी उपलब्ध नहीं है - एक त्रुटी हुई है, अधिसूचना देखें + लीक-कैनरी उपलब्ध नहीं है + एक त्रुटी हुई है, नोटीफिकेशन देखें यदि वीडियो प्लेबैक पर आप काली स्क्रीन या रुक-रुक कर वीडियो चलने का अनुभव करते हैं तो मीडिया टनलिंग को अक्षम करें। छवियों के शीर्ष पर पिकासो रंगीन रिबन दिखाएँ जो उनके स्रोत को दर्शाता है: नेटवर्क के लिए लाल, डिस्क के लिए नीला और मेमोरी के लिए हरा - गड़बड़ी की सूचना बनाएं + त्रुटी की नोटीफिकेशन बनाएं इस डाउनलोड को पुनर्प्राप्त नहीं किया जा सकता अभी तक कोई डाउनलोड फ़ोल्डर सेट नहीं किया गया है, अब डिफ़ॉल्ट डाउनलोड फ़ोल्डर चुनें हल होने पर \"संपन्न\" दबाएं चैनल विवरण दिखाएं आइटम्स का असल अपलोड समय दिखाएं सेवाओं से मूल पाठ स्ट्रीम आइटम में दिखाई देंगे - प्लेलिस्ट में जोड़े गए पहले और बाद में देखे गए वीडियो हटा दिए जाएंगे। + प्लेलिस्ट में शामिल, पहले और बाद में देखे जा चुके वीडियो हटा दिए जाएंगे। \nक्या यक़ीनन आप ऐसा चाह्ते हैं\? इसे असंपादित नहीं किया जा सकेगा! %d मिनट %d मिनट्स - फीड अंतिम अपडेट: %s - कोई सदस्यता चयनित नहीं है + फ़ीड आख़िरी दफा %s को अपडेट हुई + कोई सब्सक्रिप्शन नहीं चुनी हूई केवल असमूहीकृत सब्सक्रिप्शनस दिखाएं फ़ास्ट फ़ीड मोड इस पर अधिक जानकारी प्रदान नहीं करता है। अपडेट अंतराल जब सब्सक्रिप्शन फ़ीड दोबारा अपडेट किये जा सकें — %s @@ -696,7 +692,7 @@ \nक्या आप इस चैनल की सदस्यता समाप्त करना चाहते हैं\? चयनित स्ट्रीम बाहरी प्लेयरस द्वारा समर्थित नहीं है इस क्रिया के लिए कोई उपयुक्त फ़ाइल प्रबंधक नहीं मिला। -\nकृपया स्टोरेज एक्सेस फ्रेमवर्क संगत फ़ाइल प्रबंधक स्थापित करें +\nकृपया स्टोरेज एक्सेस फ्रेमवर्क संगत फ़ाइल प्रबंधक इंस्टॉल करें निजी आंतरिक पिन की हुई टिप्पणी @@ -705,9 +701,9 @@ आपने इस चैनल को अभी सब्सक्राइब किया है बाहरी प्लेयरस के लिए कोई वीडियो स्ट्रीम उपलब्ध नहीं है बाहरी प्लेयरस के लिए कोई ऑडियो स्ट्रीम उपलब्ध नहीं है - कुछ सेवाओं में उपलब्ध, यह आमतौर पर बहुत तेज होता है लेकिन सीमित मात्रा में आइटम और अक्सर अधूरी जानकारी (जैसे कोई अवधि नहीं, आइटम प्रकार, कोई लाइव स्थिति नहीं) लौटा सकता है + कुछ सेवाओं में उपलब्ध, यह आमतौर पर बहुत तेज होता है लेकिन सीमित मात्रा में जानकारी प्रदान कर पाता है और वह भी अक्सर अधूरी जानकारी (जैसे कि अवधि, आइटम की किसम, स्ट्रीम लाइव है, नहीं बता पाता) इस क्रिया के लिए कोई उपयुक्त फ़ाइल प्रबंधक नहीं मिला। -\nकृपया फ़ाइल प्रबंधक स्थापित करें या डाउनलोड सेटिंग में \'%s\' को अक्षम करने का प्रयास करें +\nकृपया फ़ाइल प्रबंधक इंस्टॉल करें या डाउनलोड सेटिंग में \'%s\' को अक्षम करने का प्रयास करें %1$s डाउनलोड हटाए गए %1$s डाउनलोड्स हटाए गए @@ -718,14 +714,14 @@ आप न्यूपाइप का नवीनतम संस्करण चला रहे हैं %s डाउनलोड करने के लिए टैप करें यह विकल्प केवल तभी उपलब्ध होता है जब थीम के लिए %s का चयन किया जाता है - स्थायी थंमनेल अनसेट करें + स्थायी थंमनेल अनसैंट करें कार्ड क्लिपबोर्ड पर कॉपी करने में विफल धुंधली की गई प्‍लेलिस्‍ट में पहले से ही यह आइटम है। डुप्लीकेट जोड़ा गया %d बार डुप्लीकेट हटाएं - डुप्लीकेट हटाएं\? - क्या आप इस प्लेलिस्ट की सभी डुप्लीकेट स्ट्रीम हटाना चाहते हैं\? + डुप्लीकेट हटाए जाएं\? + क्या आप इस प्लेलिस्ट में मौजूद सभी डुप्लीकेट स्ट्रीम हटाना चाहते हैं\? निम्नलिखित स्ट्रीम दिखाएँ आगामी हार्डवेयर मीडिया बटन घटनाओं की अनदेखी करें @@ -735,7 +731,7 @@ आंशिक रूप से देखा गया बाएँ इशारा क्रिया चमक - आवाज + आवाज़ कोई नहीं प्लेयर स्क्रीन के बाएँ आधे हिस्से के लिए जेस्चर चुनें प्लेयर स्क्रीन के दाहिने आधे हिस्से के लिए जेस्चर चुनें @@ -748,15 +744,15 @@ ऑडियो ट्रैक बाहरी प्लेयर्स के लिए ऑडियो ट्रैक का चयन करें अज्ञात - ExoPlayer सेटिंग्स + एक्सोप्लेयर सेटिंग्स एक्सोप्लेयर के डिकोडर फॉलबैक फीचर का उपयोग करें - हमेशा ExoPlayer के वीडियो आउटपुट सतह सेटिंग वर्कअराउंड का उपयोग करें + हमेशा एक्सोप्लेयर के वीडियो आउटपुट सतह सेटिंग वर्कअराउंड का उपयोग करें मूल - डब + डब की हूई वर्णनात्मक एक ऑडियो ट्रैक पहले से ही इस स्ट्रीम में मौजूद होना चाहिए इस विकल्प को सक्षम करें यदि आपके पास डिकोडर आरंभीकरण समस्याएं हैं, जो प्राथमिक डिकोडर आरंभ करने में विफल होने पर कम प्राथमिकता वाले डिकोडर पर वापस आ जाती हैं। प्राथमिक डिकोडर का उपयोग करते समय इसके परिणामस्वरूप खराब प्लेबैक प्रदर्शन हो सकता है - कुछ ExoPlayer सेटिंग्स प्रबंधित करें। इन परिवर्तनों को प्रभावी बनाने के लिए किसी प्लेयर को पुनरारंभ करने की आवश्यकता होती है + कुछ एक्सोप्लेयर सेटिंग्स प्रबंधित करें। इन परिवर्तनों को प्रभावी बनाने के लिए किसी प्लेयर को पुनरारंभ करने की आवश्यकता होती है सतह को सीधे कोडेक पर सेट करने के बजाय, सतह परिवर्तन होने पर यह वर्कअराउंड वीडियो कोडेक्स को जारी और पुन: चालू करता है। इस समस्या के साथ कुछ उपकरणों पर ExoPlayer द्वारा पहले से ही उपयोग किया जाता है, इस सेटिंग का केवल Android 6 और उच्चतर पर प्रभाव पड़ता है \n \nइस विकल्प को सक्षम करने से वर्तमान वीडियो प्लेयर स्विच करते समय या फुलस्क्रीन पर स्विच करते समय प्लेबैक त्रुटियों को रोका जा सकता है @@ -766,4 +762,55 @@ आपके डिवाइस पर मीडिया टनलिंग डिफ़ॉल्ट रूप से अक्षम कर दी गई थी क्योंकि यह ज्ञात है कि आपका डिवाइस मॉडल इसका समर्थन नहीं करता। कोई स्ट्रीम नहीं कोई लाइव स्ट्रीम नहीं + वीडियोज़ + सब्सक्राइबर्स + चैनल पेजों पर कौन से टैब दिखाए जाते हैं + चैनल टैब्स + शॉर्ट्स + मेटाडेटा लोड हो रहा है… + चैनल टैब प्राप्त करें + बारे में + एल्बम्स + फ़ीड अपडेट करते समय प्राप्त करने वाले टैब। यदि किसी चैनल को तेज़ मोड का उपयोग करके अपडेट किया जाता है तो इस विकल्प का कोई प्रभाव नहीं पड़ता है। + प्लेलिस्ट्स + ट्रैक्स + चैनल्स + लाइव + स्क्रीन ओरिएंटेशन टॉगल करें + फ़ुलस्क्रीन टॉगल करें + अगली स्ट्रीम + प्ले कतार खोलें + फॉरवर्ड करें + रिवाइंड करें + पुनः चलाएं + चलाएं + अधिक विकल्प + अवधि + पिछली स्ट्रीम + छवि की गुणवत्ता + \? + कम गुणवत्ता + अवतार + उप-चैनल अवतार + छवियाँ लोड न करें + उच्च गुणवत्ता + मध्यम गुणवत्ता + अपलोडर अवतार + बैनर + डेटा और मेमोरी उपयोग को कम करने के लिए छवियों की गुणवत्ता और छवियों को लोड करना है या नहीं, चुनें। परिवर्तन इन-मेमोरी और ऑन-डिस्क छवि कैश दोनों को साफ़ करते हैं - %s + थंमनेल + URL सूची साझा करें + शीर्षकों के साथ साझा करें + %1$s +\n%2$s + प्लेलिस्ट साझा करें + प्लेलिस्ट को प्लेलिस्ट नाम और वीडियो शीर्षक जैसे विवरण के साथ या वीडियो यूआरएल की एक सरल सूची के रूप में साझा करें + - %1$s: %2$s + + %s जवाब + %s जवाब + + और दिखाओ + नीचे दी गई प्रत्येक अधिसूचना कार्रवाई पर टैप करके उसे संपादित करें। पहली तीन क्रियाएँ (चलाएँ/रोकें, पिछली और अगली) सिस्टम द्वारा निर्धारित की जाती हैं और इन्हें अनुकूलित नहीं किया जा सकता है। + कम दिखाएं \ No newline at end of file diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 80b734fcd..8f077fdea 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -15,7 +15,7 @@ Dijeli s Koristi vanjski video player Uklanja audiosnimku pri nekim rezolucijama - Koristi vanjski audio player + Koristi eksterni audio player Pretplati se Pretplaćeno Pretplata na kanal otkazana @@ -36,7 +36,7 @@ Prikaži veće rezolucije Samo neki uređaji podržavaju reprodukciju 2K/4K videa Reproduciraj s Kodijem - Instalirati nedostajući Kode program\? + Instalirati nedostajuću Kore aplikaciju? Prikaži opciju „Reproduciraj pomoću Kodija” Prikaži opciju za reproduciranje videozapisa putem Kodija Audiosnimka @@ -56,7 +56,7 @@ Prati gledana videa Nastavi reprodukciju Nastavi reproducirati nakon prekidanja (npr. telefonski pozivi) - Preuzmi + Preuzimanje Prikaži videa „Sljedeći” i „Slični” URL nije podržan Zadani jezik sadržaja @@ -69,7 +69,7 @@ Uživo Preuzimanja Preuzimanja - Prijavi grešku + Izvještaj o grešci Sve Isključeno Očisti @@ -77,18 +77,17 @@ Greška Greška u mreži Nije bilo moguće učitati sve sličice - Nije bilo moguće dešifrirati URL potpis videozapisa Nije bilo moguće obraditi stranicu Sadržaj nije dostupan Nije bilo moguće postaviti izbornik za preuzimanje - Program/korisničko sučelje su preknuli raditi + Aplikacija/korisničko sučelje su preknuli raditi Oprosti, ovo se nije trebalo dogoditi. - Prijavi pogrešku putem e-maila + Prijavi putem e-maila Žao nam je, došlo je do neke greške. Prijavi Informacije: Što se dogodilo: - Što:\\nZahtjev:\\nJezik sadržaja:\\nZemlja sadržaja:\\nJezik programa:\\nUsluga:\\nGMT vrijeme:\\nPaket:\\nVerzija:\\nVerzija OS-a: + Što:\\nZahtjev:\\nJezik sadržaja:\\nZemlja sadržaja:\\nJezik aplikacije:\\nUsluga:\\nGMT vrijeme:\\nPaket:\\nVerzija:\\nVerzija OS-a: Tvoj komentar (na engleskom): Detalji: Pokreni video, trajanje: @@ -129,7 +128,7 @@ © %1$s od %2$s pod %3$s O aplikaciji i ČPP Licence - Slobodan i mali YouTube program za Android. + Slobodan i mali streaming na Android uređaju. Pogledaj na GitHubu NewPipe licenca Ako imate ideja za prijevod, promjene u dizajnu, čišćenje koda ili neke veće promjene u kodu, pomoć je uvijek dobro došla. Što više radimo, to bolji postajemo! @@ -182,8 +181,8 @@ Novi i popularni Ukloni Detalji - Postavke za audiosnimke - Drži pritisnuto za dodavanje u popis izvođenja + Postavke za audio snimke + Drži pritisnuto za dodavanje u popis [Nepoznato] Doniraj Web-stranica @@ -213,12 +212,11 @@ Ispuni Zumiraj Automatski generirani - Praćenje curenja memorije može uzrokovati greške u radu programa prilikom odlaganje gomile + Praćenje curenja memorije može uzrokovati greške u radu aplikacije prilikom odlaganje gomile Izvijesti o krajevima životnog ciklusa Prikaži informacije Zabilježene playliste Dodaj u - Učitaj sličice Slikovna predmemorija obrisana Izbriši metapodatke iz predmemorije Kanali @@ -304,24 +302,23 @@ Datoteka obrisana Obavijest za nove NewPipe verzije Briše povijest ključnih riječi pretraživanja - Vanjska pohrana nije dostupna + Eksterna memorija nije dostupna Aktualiziranja - Prikaži obavijest i zatraži aktualiziranje programa kad je dostupna nova verzija + Prikaži obavijest za aktualiziranje aplikacije kad je dostupna nova verzija Popis - Popločeno - Dostupna je nova verzija za NewPipe! + Mreža + Dostupna je nova NewPipe verzija! Preuzimanje nije uspjelo Prikaži pogrešku - Isključi za sprečavanje učitavanja sličica, čime se štedi korištenje podataka i memorije. Promjene čiste predmemoriju slika radne memorije i diska Izbriši sve podatke web-stranica iz predmemorije Metapodaci su izbrisani Automatski dodaj sljedeći stream u popisa izvođenja Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog streama Zadana zemlja sadržaja Otkrivanje grešaka - Obavijest o novoj verziji programa - Preuzimanje na vanjsku SD karticu nije moguće. Ponovo postaviti lokaciju mape za preuzimanje\? - Vanjski playeri ne podržavaju ove vrste poveznica + Obavijest o novoj verziji aplikacije + Preuzimanje na eksternu SD karticu nije moguće. Ponovo postaviti lokaciju mape za preuzimanje? + Eksterni playeri ne podržavaju ove vrste poveznica Nije pronađen nijedan videozapis Nije pronađena nijedna audiosnimka Nema takve datoteke/izvora sadržaja @@ -331,13 +328,13 @@ Obnovi standardne vrijednosti Želiš li obnoviti standardne vrijednosti\? Broj pretplatnika nije dostupan - NewPipe razvijaju volonteri koji provode vrijeme kako bi doprinijeli najboljem iskustvu. Doprinesi programerima kako bi poboljšali NewPipe dok uživaju u šalici kave. + NewPipe razvijaju volonteri koji provode vrijeme kako bi doprinijeli najboljem korisničkom iskustvu. Doprinesi programerima kako bi poboljšali NewPipe dok uživaju u šalici kave. Koje su kartice prikazane na glavnoj stranici Konferencije Željena radnja za otvaranje Zadana radnja pri otvaranju sadržaja — %s Titlovi - Promijeni veličinu podnaslova i pozadinske stilove playera. Zahtijeva ponovno pokretanje programa + Promijeni veličinu titlova i stilove pozadine playera. Zahtijeva ponovno pokretanje aplikacije Prisilno izvijesti o neisporučivim Rx iznimaka izvan fragmenta ili životnog ciklusa aktivnosti nakon odlaganja Uvezi SoundCloud profil upisom URL-a ili svog ID-a: \n @@ -348,8 +345,8 @@ Brzina Visina tona Odspoji (može prouzročiti izobličenje) - Smanji prilikom mijenjanje programa - Radnja prilikom prebacivanja na drugi program iz glavnog video playera – %s + Smanji prilikom mijenjanje aplikacije + Radnja prilikom prebacivanja na drugu aplikaciju iz glavnog video playera – %s Smanji na pozadinski player Smanji na skočni player Način prikaza kao popis @@ -359,7 +356,7 @@ pauzirano stavljeno u popis izvođenja naknadna obrada - Popis izvođenja + Dodaj u popis Sustav je odbio radnju Generiraj jedinstveni naziv Prepiši @@ -387,8 +384,8 @@ Nije bilo moguće učitati komentare Zatvori NewPipe je copyleft libre softver: Može se koristiti, proučavati i poboljšavati po volji. Konkretno, može se redistribuirati i / ili modificirati pod uvjetima GNU opće javne licence koju je objavila zaklada Free Software Foundation, pod verzijom 3 licence, ili (po vlastitom izboru) bilo koje kasnije verzije. - Projekt NewPipe ozbiljno shvaća tvou privatnost. Stoga program ne prikuplja nikakve podatke bez tvog pristanka. -\nNewPipe pravila o privatnosti detaljno objašnjavaju koji se podaci šalju i spremaju kad šalješ izvještaje o prekidu rada programa. + Projekt NewPipe ozbiljno shvaća temu o privatnosti. Stoga aplikacija ne prikuplja podatke bez tvog pristanka. +\nNewPipe pravila o privatnosti detaljno objašnjavaju koji se podaci šalju i spremaju kad šalješ izvještaje o prekidu rada aplikacije. Kako bismo se uskladili s Europskom općom uredbom o zaštiti podataka (GDPR), ovime upozoravamo na NewPipe politiku privatnosti. Pažljivo je pročitaj. \nZa slanje izvješća o pogreškama moraš prihvatiti politiku privatnosti. Nastavi reprodukciju @@ -409,7 +406,7 @@ Izbrisati sve pozicije reprodukcije\? Nitko ne gleda Nitko ne sluša - Jezik će se promijeniti nakon ponovnog pokretanja programa + Jezik će se promijeniti nakon ponovnog pokretanja aplikcije Standardni kiosk Podržani su samo HTTP URL-ovi Lokalni @@ -417,8 +414,8 @@ Automatski generirano (prenositelj nedefiniran) Očisti povijest preuzimanja Izbriši preuzete datoteke - Dopusti prikaz iznad drugih programa - Jezik programa + Dopusti prikaz preko drugih aplikacija + Jezik aplikacije Zadani sustav Videa Isključi zvuk @@ -427,22 +424,22 @@ Želiš li izbrisati ovu grupu\? Nova Uvijek aktualiziraj - Omogući brz način - Onemogući brz način - Memorija uređaja je popunjena + Uključi brzi način + Isključi brzi način + Memorija uređaja je popunjena Najomiljeniji Pritisni „Gotovo” kad je riješeno - Gotovo + Gotovo ∞ videa Više od 100 videa Prijavi grešku na GitHub-u - Umjetnici + Izvođači Albumi Pjesme Stvoren od %s Nikada Ograniči popis preuzimanja - Koristi birač mapa sustava (SAF) + Koristi sustavksi birač mapa (SAF) Ukloni pregledano Ukloni pogledana videa\? @@ -474,12 +471,12 @@ Gumb druge radnje Gumb prve radnje Prikazuju se rezultati za: %s - Nije bilo moguće prepoznati URL. Želiš li otvoriti s drugim programom\? + Nije bilo moguće prepoznati URL. Otvoriti s jednom drugom aplikacijom? Odreži sličicu na omjer 1:1 Učitavanje u predmemoriju Istovremeno se pokreće jedno preuzimanje Dodano u popis izvođenja - Dodaj u popis izvođenja + Dodaj u popis Reproduciraj popis izvođenja Automatski popis izvođenja Popis izvođenja aktivnog playera će se zamijeniti @@ -512,7 +509,7 @@ Da, i djelomično pogledana videa Odaberi jednu instancu Aplikacija će te pitati kamo spremati preuzimanja. -\nOmogući birač mapa sustava (SAF), ako želiš preuzimati na vanjsku SD karticu +\nUključi sustavksi birač mapa (SAF) ako želiš preuzeti na eksternu SD karticu Nije moguće obnoviti ovo preuzimanje Napredak je izgubljen, jer je datoteka izbrisana NewPipe se zatvorio tijekom rada s datotekom @@ -553,7 +550,7 @@ Promiješaj Ponovi Provjeri je li problem već postoji. Prijavljivanje istog već prijavljenog problema krade nam vrijeme koje bismo mogli utrošiti na ispravljanje greške. - Za uređivanje radnji u obavijestima, dodirni ih. Označi do tri radnje za prikaz u kompaktnoj obavijesti koristeći oznake na desnoj strani + Uredi radnje obavijesti dodirom. Označi do tri radnje za prikaz u kompaktnoj obavijesti koristeći potvrdna polja na desnoj strani. Zbog ograničenja ExoPlayera, trajanje premotavanja postavljeno je na %d s Neka Android prilagodi boju obavijesti prema glavnoj boji sličice (ovo nije dostupno na svim uređajima) Oboji obavijest @@ -563,7 +560,7 @@ Koristi sličicu za pozadinu zaključanog ekrana i za obavijesti Prikaži sličicu Prikaži izvorno vrijeme stavki - „Storage Access Framework” omogućuje preuzimanje na SD karticu + „Storage Access Framework” dozvoljava preuzimanje na eksternu SD karticu Izvorni tekstovi usluga bit će vidljivi u stavkama prijenosa Dostupno je u nekim uslugama. Obično je puno brže, ali može dohvatiti ograničenu količinu stavki i često nepotpune podatke (npr. bez trajanja, vrste stavke, bez stanja uživo) Misliš da je učitavanje feeda presporo\? Ako da, pokušaj omogućiti brzo učitavanje (možeš ga promijeniti u postavkama ili pritiskom na donji gumb). @@ -584,7 +581,7 @@ Isključi za skrivanje polja metapodataka s dodatnim podacima o autoru streama, sadržaju streama ili zahtjevu za pretraživanje Prikaži metapodatke Povezane stavke - Nijedan program na tvom uređaju ovo ne može otvoriti + Nijedna aplikacija na tvom uređaju ovo ne može otvoriti Poglavlja Opis Komentari @@ -604,12 +601,12 @@ Ovaj je video dostupan samo za „YouTube Music Premium” članove, stoga ga NewPipe ne može emitirati ili preuzeti. Ovaj sadržaj je privatan, stoga ga NewPipe ne može emitirati ili preuzeti. Ovaj sadržaj nije dostupan u tvojoj zemlji. - Prekini program + Prekini aplikaciju Riješi - Noćna tema + Tamna tema Prikaži detalje kanala Isključi tuneliranje medija ako doživiš crni ekran ili isprekidanu reprodukciju videa. - Iskljuci medija tuneling + Isključi tuneliranje medija Isklj. Uklj. Način rada na tabletu @@ -618,15 +615,14 @@ Privatno Nenavedeno Javno - URL sličice - Poslužitelj + Računalo Podrška Jezik Dobna granica Licenca Oznake Kategorija - Onemogući biranje teksta u opisu + Isključi biranje teksta u opisu Omogući biranje teksta u opisu Račun ukinut Autorov račun je ukinut. @@ -641,7 +637,7 @@ Visoka kvaliteta (veća) Pregled sličica premotavanja Mapa za preuzimanje još nije postavljena, odaberi standardnu mapu za preuzimanje - Komentari su onemogućeni + Komentari su isključeni Označi kao pogledano Način rada brzog feeda ne pruža više informacija o ovome. Interno @@ -650,15 +646,15 @@ %s pruža ovaj razlog: Obrada u tijeku … Može malo potrajati Za ukljanjanje stavki povuci ih - Prikazati indikatore slike + Prikaži indikatore slike Preuzimanje je gotovo %s preuzimanja su gotova %s preuzimanja su gotova Pokreni glavni player u cjeloekranskom prikazu - Reproduciraj sljedeći - Sljedeći u popisu izvođenja + Dodaj u popis kao sljedeći + Dodano u popis kao sljedeći Prikaži Picassove vrpce u boji na slikama koje označavaju njihov izvor: crvena za mrežu, plava za disk i zelena za memoriju Izbrisano %1$s preuzimanje @@ -684,7 +680,7 @@ Novi videozapisi Obavijesti novih streamova od pretplaćenih kanala Želiš li izbrisati sve preuzete datoteke\? - Obavijesti su onemogućene + Obavijesti su isljučene Pretplatio/la si se na ovaj kanal , Uključi/isključi sve @@ -699,16 +695,16 @@ Potrebna mrežna veza Primaj obavijesti Za ovu radnju nije pronađen odgovarajući upravljač datoteka. -\nInstaliraj upravljač datoteka ili pokušaj onemogućiti „%s” u postavkama preuzimanja +\nInstaliraj upravljač datoteka ili pokušaj isključiti „%s” u postavkama preuzimanja Prikvačeni komentar Prikazuje opciju prekida rada kad se player koristi Prikaži „Prekini rad playera” ExoPlayer standard Posto Poluton - Streamovi koje program za preuzimanje još ne podržava se ne prikazuju - Vanjski playeri ne podržavaju odabrani stream - Promijeni veličinu intervala učitavanja (trenutačno %s). Niža vrijednost može ubrzati početno učitavanje videa. Promjene zahtijevaju ponovno pokretanje playera + Streamovi koje aplikacija za preuzimanje još ne podržava se ne prikazuju + Eksterni playeri ne podržavaju odabrani stream + Promijenite veličinu intervala učitavanja progresivnog sadržaja (trenutno %s). Niža vrijednost može ubrzati učitavanje %s novi stream %s nova streama @@ -717,9 +713,112 @@ Veličina intervala učitavanja reprodukcije Nepoznat format Nepoznata kvaliteta - Nijedan stream audiosnimaka nije dostupan za vanjske playere - Nijedan video stream nije dostupan za vanjske playere - Odaberi kvalitetu za vanjske playere + Nema audio prijenosa za eksterne playere + Nema video prijenosa za eksterne playere + Odaberi kvalitetu za eksterne playere Za ovu radnju nije pronađen odgovrajući upravljač datoteka. \nInstaliraj „Storage Access Framework” kompatibilni upravljač datoteka + Uredite neke ExoPlayer postavke. Ove promjene zahtjevaju ponovo pokretanje aplikacije + Desna gesta + Odaberite gestu za lijevu polovicu zaslona + Lijeva gesta + Svjetlina + ExoPlayer postavke + Uredite svaku radnju obavijesti ispod tako da je dodirnete. Prve tri akcije (reprodukcija/pauza, prethodna i sljedeća) postavlja sustav i ne mogu se prilagoditi. + Odaberite gestu za desnu polovicu zaslona + Glasnoća + Ništa + Pregledano + Djelomično pregledano + Najava + Razvrstaj + Koristi razervnu funkciju ExoPlayer dekodera + Ignoriranje hardverskih medijskih gumba + Korisno, na primjer, ako koristite slušalice s pokvarenim fizičkim gumbima + Odaberite zvučni zapis s opisima za slabovidne osobe ako je dostupan + Preferiraj originalni zvuk + Odaberite izvorni audio zapis bez obzira na jezik + Preferirajte opisni zvuk + Odaberi audio snimku za eksterne playere + Nepoznato + %1$s %2$s + Nema prijenosa + Položaj glavnih kartica + Premjesti glavni birač kartica dolje + Nema prijenosa uživo + Neuspjelo kopiranje u međuspremnik + Često postavljena pitanja + Ako imaš problema s korištenjem aplikacije, pogledaj odgovore na česta pitanja! + Pogledaj na web stranici + Audio snimka: %s + Traka audio snimke + Zasivljene playliste već sadrže ovu stavku. + Poništi stalni prikaz sličica + Duplikat je dodan %d put(a) + Kartica + Koristiš najnoviju NewPipe verziju + Dodirani za preuzimanje %s + Ukloni duplikate + Ukloniti duplikate? + Želiš li ukloniti sve duple prijenose iz ove playliste? + Pokaži sljedeće prijenose + Pokaži/Sakrij prijenose + Kartice za dohvaćanja kanala + Ova je opcija dostupna samo ako je %s odabrano za temu + Minijature + Avatari + Avatari prenositelja + Avatari podkanala + Pretplatnici + Natpisi + Audio zapis bi već trebao biti prisutan u ovom prijenosu + original + Uživo + Videa + Snimke + Kratka videa + sinkronizirano + opisno + Albumi + Kanali + Playliste + Kartice koje se prikazuju na stranici kanala + Uključi/Isključi položaj ekrana + Informacije + Kartice kanala + Uključi cjeloekranski prikaz + Prethodni prijenos + Sljedeći prijenos + Reproduciraj ponovo + Natrag + Naprijed + Kvaliteta slike + Više opcija + Odaberi kvalitetu slika i da li uopće učitati slike kako bi se smanjilo korištenje podataka i memorije. Promjene brišu predmemoriju slika u memoriji i na disku – %s + Ne učitavaj slike + Niska kvaliteta + Srednja kvaliteta + Visoka kvaliteta + \? + Dijeli playlistu s detaljima kao što su ime playliste i naslovi videa ili kao jednostavan popis URL-ova videa + Dijeli s naslovima + Dijeli popis URL-ova + – %1$s: %2$s + Pokaži više + Pokaži manje + Brzi modus + Učitavanje metapodataka … + Trajanje + Uvezi ili izvezi pretplate iz izbornika s 3 točke + Otvori popis reprodukcije + Reproduciraj + Dijeli playlistu + %1$s +\n%2$s + + %s odgovor + %s odgovora + %s odgovora + + Tuneliranje medija je standardno deaktivirano na tvom uređaju jer je poznato da model tvog uređaja to ne podržava. \ No newline at end of file diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 9f3ddf9cf..13a488f07 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -55,7 +55,6 @@ Elnézést, ennek nem kellett volna megtörténnie. Jelentés e-mailben Nem sikerült a letöltési menü beállítása - Nem sikerült a videó URL aláírásának feloldása Újra Videó Hang @@ -136,8 +135,6 @@ Hozzáadás ehhez Gyorsabb, de pontatlan tekerés használata A pontatlan tekerés lehetővé teszi, hogy gyorsabban ugorjon a pozíciókra, de kisebb pontossággal. Az 5, 15, vagy 25 másodperces tekerés nem működik ebben a módban - Bélyegképek betöltése - Kapcsolja ki, hogy a megelőzze a bélyegképek betöltését, így csökkentve az adat- és memóriahasználatot. A megváltoztatása törli a memóriában és a meghajtón lévő képgyorsítótárat A bélyegkép gyorsítótár törölve Gyorsítótárazott metaadatok törlése Minden gyorsítótárazott weboldaladat törlése @@ -351,7 +348,7 @@ A letöltést nem lehet helyrehozni Kapcsolati időtúllépés Az előrehaladás elveszett, mert a fájlt törölték - Nincs hely az eszközön + Nincs hely az eszközön A NewPipe leállt a fájl feldolgozása közben Utófeldolgozás sikertelen Nincs talalat @@ -460,7 +457,7 @@ Feliratkozások kiválasztása © %1$s %2$s, %3$s licenc alatt Harmadik féltől származó licencek - Kész + Kész Nincs megjegyzés ∞ videó 100+ videó @@ -572,7 +569,7 @@ Feldolgozás… Ez eltarthat egy ideig Az eltávolítás utáni, fragment vagy activity életcikluson kívüli, nem kézbesíthető Rx kivételek jelentésének kényszerítése Eredeti „ennyi ideje” megjelenítése az elemeken - Tiltsa le a médiacsatornázást, ha fekete képernyőt vagy akadozást tapasztal videólejátszáskor + Tiltsa le a médiacsatornázást, ha fekete képernyőt vagy akadozást tapasztal videólejátszáskor. Picasso színes szalagok megjelenítése a képek fölött, megjelölve a forrásukat: piros a hálózathoz, kék a lemezhez, zöld a memóriához Minden letöltésnél meg fogja kérdezni, hogy hova mentse el Válasszon egy példányt @@ -607,7 +604,6 @@ Licenc Korhatár Kiszolgáló - Bélyegkép URL Nyilvános Nem listázott Ki @@ -761,4 +757,60 @@ Eltávolítja az ismétlődéseket\? Eltávolítja az összes ismétlődő közvetítést ebből a lejátszólistáról\? eredeti + Kezdőlap pozíció + A médiacsatornázás alapértelmezés szerint le van tiltva az Ön készülékén, mivel az Ön készülékmodellje nem támogatja azt. + Kezdőlap választó alulra helyezése + Nincs élő adatfolyam + Nincs adatfolyam + Az alábbi értesítési műveletek szerkesztéséhez koppintson rá. Az első három műveletet (lejátszás/szünet, előző és következő) a rendszer állítja be, és nem szabhatók testre. + Csatornalapok lekérése + A hírcsatorna frissítésekor lekérendő lapok. Ennek az opciónak nincs hatása, ha egy csatorna frissítése gyors módban történik. + Miniatűrök + Feltöltő avatarjai + Alcsatorna avatarok + Avatarok + Bannerek + Feliratkozók + Csatornák + Lejátszási listák + Albumok + Névjegy + Csatorna fülek + Milyen lapok jelennek meg a csatornaoldalakon + Lejátszási sor megnyitása + Képernyő tájolásának váltása + Teljes képernyőre váltás + Következő közvetítés + Előző közvetítés + Lejátszás + Visszajátszás + További opciók + Időtartam + Visszatekerés + Előre + Képminőség + Az adat- és memóriahasználat csökkentése érdekében válassza ki a képek minőségét valamint azt, hogy a képek egyáltalán betöltésre kerüljenek. A változtatások törlik a memóriában és a lemezen lévő képgyorsítótárat – %s + Ne töltsön be képeket + Alacsony minőség + Közepes minőség + Magas minőségű + \? + Lejátszási lista megosztása + Lejátszási lista megosztása olyan részletekkel, mint például a lejátszási lista neve és a videó címe, vagy a videó URL-jei egyszerű listájaként + Megosztás címekkel + %1$s +\n%2$s + + %s válasz + %s válaszok + + Továbbiak + Mutass kevesebbet + Metaadatok betöltése… + URL-lista megosztása + - %1$s: %2$s + Videók + Dalok + Rövidek + Élő \ No newline at end of file diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml index 033e93c0e..5becf32fb 100644 --- a/app/src/main/res/values-hy/strings.xml +++ b/app/src/main/res/values-hy/strings.xml @@ -192,7 +192,7 @@ Նշել նվագացանկ Տառեր և թվեր Բեռնումներ - Եղավ + Եղավ Նվագել ամենը Ուղիղ Շարունակել նվագարկումը diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index d4ae5b455..f6cc54e32 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -29,7 +29,7 @@ Initiar discargas Pausar le discargas Seliger un instantia - Non poteva connecter con le servitor + Non pote connecter con le servitor Publicate le %1$s Discargar le file de fluxo Resolution predefinite @@ -104,7 +104,7 @@ Vacuar le chronologia de reproductiones Videos Dele le chronologia del contenido observate e positiones de reproduction - Positiones de reproduction delite. + Positiones de reproduction delite Vacuar le chronologia de cerca Error de rete Contento non disponibile @@ -127,7 +127,7 @@ NewPipe discargante A proposito de NewPipe © %1$s per %2$s sub %3$s - A proposito de + FAQ e A proposito de Licentias Contribuer Vider in GitHub @@ -140,7 +140,7 @@ Le plus reproducite Contento del pagina principal Selige un canal - Preste + Preste Rememorar ultime grandor e position del reproductor emergente Rememorar grandor e position del fenestra emergente @@ -160,7 +160,7 @@ Chronologia Dele le chronologia de parolas clave de cerca Deler omne chronologia de cerca\? - Chronologia de cerca delite. + Chronologia de recerca delite Exportar le chronologia, subscriptiones, listas de reproduction e configurationes Reimplaciar tu chronologia, subscriptiones e (optionalmente) configurationes currente Le videos jam observate ante e post de esser addite al lista de reproduction essera removite. @@ -173,7 +173,7 @@ %s visualisationes Nemo is observante - Chronologia de reproductiones vacuate. + Chronologia de reproductiones vacuate Deler omne chronologia de reproductiones\? Pardono, qualcosa vadeva incorrecte. Pardono, illo non deberea haber ocurrite. @@ -227,7 +227,6 @@ Interne Aperir con Suggestiones de recerca remote - Cargar miniaturas Monstrante resultatos pro: %s Solmente alicun apparatos pote reproducer videos 2K/4K Initiar le reproductor principal in schermo plen @@ -243,4 +242,7 @@ Per %s Radio Create per %s + Marcar como reguardate + OK + Usar reproductor de video externe \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 292430861..1ca35cfb8 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -1,26 +1,26 @@ - Ketuk kaca pembesar untuk segera memulai. - Dipublikasikan pada tanggal %1$s + Sentuh kaca pembesar untuk memulai. + Dipublikasikan pada %1$s Pasang Batal - Buka di browser + Buka di peramban Bagikan Unduh - Telusuri + Telusur Pengaturan Bagikan dengan Gunakan pemutar video eksternal Gunakan pemutar audio eksternal - Folder unduhan Video + Folder unduhan video Berkas video yang diunduh akan disimpan di sini Pilih folder unduhan untuk berkas video - Folder unduhan Audio + Folder unduhan audio Berkas audio yang diunduh akan disimpan di sini Pilih folder unduhan untuk berkas audio Pilih kualitas Putar dengan Kodi - Instal aplikasi Kode yang hilang\? + Pasang aplikasi Kore yang hilang? Tampilkan opsi \"Putar dengan Kodi\" Tampilkan opsi untuk memutar video via Kodi Audio @@ -66,7 +66,7 @@ Mulai Jeda Ceksum - OK + Oke Nama berkas Galat NewPipe Sedang Mengunduh @@ -74,8 +74,7 @@ Mohon tunggu… Disalin ke papan klip Silakan pilih folder unduhan di pengaturan - Pemutar stream tidak ditemukan. Pasang VLC\? - Tidak bisa dekripsi tanda tangan URL video + Pemutar stream tidak ditemukan. Pasang VLC? App/UI rusak Apa:\\nPermintaan:\\nBahasa Konten:\\nNegara Konten:\\nBahasa Apl:\\nLayanan:\\nWaktu GMT:\\nPaket:\\nVersi:\\nVersi OS: Thread @@ -86,19 +85,19 @@ r J T - Buka dalam mode popup + Buka di mode tampilan kecil Izin ini dibutuhkan untuk \nmembuka di mode sembul Memutar dalam mode sembul Dinonaktifkan Format video - Pilih kualitas mode popup + Kualitas popup bawaan Tampilkan kualitas yang lebih tinggi Hanya perangkat tertentu saja yang bisa memutar video 2K/4K Latar Belakang - Munculan + Sembulan Bersihkan - Menghapus audio pada beberapa resolusi + Menghapus audio di beberapa resolusi Ingat properti popup Ingat ukuran dan posisi terakhir popup Saran pencarian @@ -132,8 +131,6 @@ Notifikasi NewPipe Riwayat Riwayat - Muat thumbnail - Matikan agar thumbnail tidak dimuat, menghemat penggunaan data dan memori. Perubahan menghapus cache gambar baik di memori dan disk Cache gambar dihapus Hapus cache metadata Hapus semua data cache halaman web @@ -240,11 +237,11 @@ Isi Perbesar Otomatis dibuat - Pemutar stream tidak ditemukan (Anda bisa memasang VLC untuk memutarnya). + Pemutar stream ditemukan (kamu bisa pasang VLC untuk memutarnya). Unduh berkas stream Tidak bisa mengubah langganan Tampilkan info - Tambahkan Ke + Tambah Ke Hapus riwayat tontonan Hapus riwayat video yang diputar dan posisi pemutaran Hapus seluruh riwayat tontonan\? @@ -257,7 +254,7 @@ 1 item dihapus. Daftar Putar Putar otomatis video berikutnya - Berhenti berlanggan channel + Berhenti berlangganan saluran Tidak bisa memperbarui langganan Langganan Gunakan tinjau cepat tak pasti @@ -325,7 +322,7 @@ Nihil Minimalkan ke pemutar latar belakang Minimalkan ke pemutar popup - Berhenti Berlanggan + Berhenti Berlangganan Pilih Tab Tema Pembaruan @@ -392,7 +389,7 @@ tidak bisa menimpa ulang berkas Ada unduhan yang dijeda dengan nama ini NewPipe telah ditutup saat sedang memproses berkas - Tidak ada ruang kosong tersisa pada perangkat + Tidak ada ruang kosong tersisa pada perangkat Kehilangan laju, karena berkas telah dihapus Apakah Anda yakin ingin menghapus semua riwayat unduhan dan berkas yang telah diunduh\? Batasi antrean unduhan @@ -442,7 +439,7 @@ Izinkan untuk ditampilkan di atas aplikasi lain Bahasa apl Default sistem - Selesai + Selesai Durasi maju/mundur cepat Tekan \"Selesai\" saat selesai Video @@ -537,7 +534,7 @@ Aduk Ulangi Anda bisa memilih hingga tiga tindakan untuk ditampilkan dalam notifikasi ringkas! - Sentuh untuk menyunting tindakan notifikasi di bawah. Pilih hingga tiga diantaranya untuk ditampilkan dalam notifikasi ringkas dengan menggunakan kotak centang di sebelah kanan + Sentuh untuk menyunting tindakan notifikasi di bawah. Pilih hingga tiga diantaranya untuk ditampilkan dalam notifikasi ringkas dengan menggunakan kotak centang di sebelah kanan. Tombol tindakan kelima Tombol tindakan keempat Tombol tindakan ketiga @@ -588,13 +585,12 @@ Tema malam Pengunduhan dimulai Tampilkan detail channel - Nonaktifkan terowongan media (tunnel) jiaka anda mengalami sebuah layar hitam atau kerusakan dalam memutar video. + Nonaktifkan terowongan media (tunnel) jika anda mengalami sebuah layar hitam atau kerusakan dalam memutar video. Nonaktifkan terowongan media (tunnel) Internal Privasi Tidak didaftar Publik - Alamat URL gambar mini/thumbnail Host Dukungan Bahasa @@ -650,7 +646,7 @@ Item feed baru Tampilkan \"Mogokkan pemutar\" Menampilkan opsi penghentian ketika menggunakan pemain video - Hentikan pemain video + Hentikan pemutar video Notifikasi untuk melaporkan kegalatan Notifikasi laporan kegalatan Sebuah kegalatan terjadi, lihat notifikasinya @@ -751,4 +747,56 @@ Posisi tab utama %1$s %2$s Terowongan media dinonaktifkan secara bawaan di perangkat Anda karena model perangkat Anda tidak mendukungnya. + Tidak ada siaran langsung + Video + Pelanggan + Tab apa saja yang ditampilkan di halaman saluran + Tab saluran + Shorts + Memuat Metadata… + Dapatjan tab saluran + Tentang + Album + Tab untuk didapatkan ketika memperarui umpan. Opsi ini tidak memiliki efek jika saluran diperbarui menggunakan mode cepat. + Daftar putar + Trek + Tidak ada saluran + Saluran + Langsung + Saklar orientasi layar + Saklar layar penuh + Saluran berikutnya + Buka antrean pemain + Maju + Mundur + Putar ulang + Putar + Opsi tambahan + Durasi + Saluran sebelumnya + Kualitas gambar + \? + Kualitas rendah + Avatar + Avatar sub-channel + Jangan tampilkan gambar + Kualitas tinggi + Kualitas sedang + Avatar pengunggah + Pilih kualitas dan visibilitas gambar, untuk mengurangi penggunaan data dan memori. Perubahan menghapus cache dalam diska dan memori - %s + Thumbnail + Bagikan daftar URL + Bagikan dengan Judul + %1$s +\n%2$s + Bagikan Daftar Putar + Bagikan daftar putar dengan detail seperti nama daftar putar dan judul video atau sebagai daftar video URL yang sederhana + Banner + - %1$s: %2$s + Sentuh untuk menyunting tindakan notifikasi di bawah. Tiga tindakan pertama (mainkan/jeda, sebelumnya dan selanjutnya) disetel oleh sistem dan tidak bisa dikustomisasi. + Tampilkan lebih sedikit + Tampilkan lebih banyak + + %s balasan + \ No newline at end of file diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index e27217971..c35d7a685 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -177,7 +177,6 @@ Nota hraða en ónákvæma leit Lengd skrefs Biðja um staðfestingu áður en röð er hreinsuð - Sækja smámyndir Sýna ummæli Sjálfvirk biðröð Hreinsa gögn @@ -251,7 +250,7 @@ Afritað á klemmuspjald 1 atriði eytt. Leysa - Lokið + Lokið Beðið eftir þraut reCAPTCHA Leyfi þriðja aðila Hugbúnaðarleyfi @@ -486,7 +485,6 @@ Frá %s Reikningi lokað Aldurstakmark - Vefslóð smámyndar Fest ummæli Spjaldtölvuhamur Virkt @@ -613,7 +611,6 @@ Stærð forhleðslu Breyta stærð forhleðslu (nú %s). Lægra gildi gæti flýtt fyrir upphaflegu hleðslu myndbands. Breytingar krefjast endurræsingar spilara Biðröð spilarans verður skipt út - Slökktu á til að hlaða ekki niður smámyndum til að spara bandbreidd og vinnsluminni. Breytingar eyða myndskyndiminni í bæði vinnsluminni og geymslu Slökktu á til að fela lýsigagnareiti með viðbótarupplýsingum um straumhöfund, straumefni eða leitarbeiðni Fjarlæga öll síðugögn úr skyndiminni Bæta svipuðum straumum við biðröðina þegar síðasta er spilað og endurspilun er ekki virkjuð @@ -648,7 +645,6 @@ Áhorfsferli eytt Eyða spilunarstöðum Eyðir öllum spilunarstöðum - Mistókst að afkóða vefslóð myndbandar Niðurhal á SD kort er ekki mögulegt. Endurstilla niðurhalsmöppu\? Strjúktu til að fjarlægja Engir spilunarlistar bókamerktir ennþá @@ -684,7 +680,7 @@ Netþjónninn sendir ekki gögn Netþjónninn styður ekki fjölþráðuð niðurhöl, reyndu aftur með @string/msg_threads = 1 NewPipe var lokað á meðan unnið var að skrá - Ekkert pláss eftir á tæki + Ekkert pláss eftir á tæki Framvinda tapaðist vegna þess að skránni var eytt Get ekki endurheimt þetta niðurhal Hreinsa niðurhalsferil diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 05604e998..3d8162880 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -43,7 +43,6 @@ Errore Errore di connessione Impossibile caricare tutte le copertine - Impossibile decriptare la firma dell\'URL del video Contenuto non disponibile Impossibile analizzare il sito web Impossibile impostare il menu di download @@ -287,8 +286,6 @@ Tieni presente che questa operazione può consumare una grande quantità di traffico dati. \n \nVuoi continuare? - Carica copertine - Disabilita per prevenire il caricamento delle copertine, risparmiando dati e memoria. La modifica di questa opzione cancellerà la cache delle immagini in memoria e sul disco Cache immagini svuotata Svuota la cache dei metadati Elimina i dati delle pagine web memorizzati nella cache @@ -402,7 +399,7 @@ impossibile sovrascrivere il file C\'è un download in corso con questo nome NewPipe è stato chiuso mentre lavorava sul file - Spazio insufficiente sul dispositivo + Spazio insufficiente sul dispositivo Progresso perso poiché il file è stato eliminato Vuoi cancellare la cronologia dei download o eliminare tutti i file scaricati\? Sarà avviato un solo download per volta @@ -454,7 +451,7 @@ Lingua dell\'applicazione Predefinita di sistema Premere \"Fatto\" quando risolto - Fatto + Fatto Video %d secondo @@ -552,7 +549,7 @@ La coda del lettore attivo sarà sostituita Chiedi prima di svuotare la coda Cambiare tipo di riproduzione potrebbe sostituire gli elementi in coda - Le azioni dei pulsanti della notifica possono essere modificate qua sotto. Selezionane fino a 3, utilizzando le caselle di controllo sulla destra. Verranno visualizzate nella notifica compatta + Le azioni dei pulsanti della notifica possono essere modificate qua sotto. Selezionane fino a tre da mostrare nella notifica compatta, usando le caselle di controllo sulla destra. Azione pulsante 5 Azione pulsante 4 Azione pulsante 3 @@ -614,7 +611,6 @@ Privato Non in elenco Pubblico - URL copertina Host Supporto Lingua @@ -779,4 +775,56 @@ Il tunneling multimediale è stato disabilitato per impostazione predefinita sul dispositivo in uso, poiché è noto che il modello del dispositivo non lo supporta. Nessuna trasmissione Nessuna trasmissione in diretta + Video + Iscritti + Quali schede mostrare nelle pagine del canale + Schede canale + Shorts + Caricamento metadati… + Recupera schede del canale + Informazioni + Album + Schede da recuperare quando si aggiorna il feed. Questa opzione non ha effetto se un canale viene aggiornato usando la modalità veloce. + Playlist + Tracce + Canali + Dirette + Qualità immagine + \? + Cambia orientamento schermo + Qualità bassa + Attiva/disattiva schermo intero + Avatar + Video successivo + Avatar del sotto-canale + Apri coda di riproduzione + Non caricare immagini + Qualità alta + Avanti + Riavvolgi + Ricomincia + Qualità media + Avatar dell\'autore + Banner + Scegli la qualità delle immagini e se caricarle o meno, per ridurre l\'utilizzo di dati e memoria. Le modifiche svuotano la cache immagini sia in memoria che su disco — %s + Riproduci + Altre opzioni + Miniature + Durata + Video precedente + Condividi elenco URL + Condividi con i titoli + %1$s +\n%2$s + Condividi playlist + Condividi la playlist con dettagli come il suo nome e i titoli video o come un semplice elenco di URL video + - %1$s: %2$s + + %s risposta + %s risposte + %s risposte + + Mostra altro + Le azioni dei pulsanti della notifica possono essere modificate qua sotto. Le prime tre (riproduci/pausa, precedente e successivo) sono impostate dal sistema e non possono essere cambiate. + Mostra meno \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 0eeeaf8dd..03117abad 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -43,7 +43,6 @@ 音楽ファイルをダウンロードするフォルダーを選択して下さい エラー 全てのサムネイルを読み込めませんでした - 動画のURLを復号できませんでした ウェブサイトを解析できませんでした コンテンツが利用できません 保存メニューを設定できませんでした @@ -196,7 +195,6 @@ 動画をダウンロード 情報を表示 ブックマークしたプレイリスト - サムネイルを読み込む 画像キャッシュを消去しました キャッシュを消去 アプリ内のキャッシュデータをすべて削除します @@ -254,7 +252,6 @@ プライバシーポリシーを確認 おおまかなシーク おおまかなシークを使用することで精度が下がる代わりに高速にシークができます。5 秒、15 秒または 25 秒間隔のシークはできません - サムネイルの読み込みと保存を無効化します。(このオプションを切り替えるとメモリとディスク上の画像キャッシュが消去されます) キューに関連動画を追加して再生を続ける (繰り返ししない場合) すべての再生履歴を削除しますか? すべての検索履歴を削除しますか? @@ -393,7 +390,7 @@ ファイルを上書きできません 同じファイル名のダウンロードが既に進行中です ファイルの作業中に NewPipe が閉じられました - デバイスに空き容量がありません + デバイスに空き容量がありません ファイルが削除されたため、進行状況が失われました ダウンロード履歴、またはダウンロードしたファイルを消去しますか\? ダウンロード キューの制限 @@ -444,7 +441,7 @@ アプリの言語 システムの既定 解けたら「完了」を押してください - 完了 + 完了 動画 %d 秒 @@ -534,7 +531,7 @@ URL を認識できませんでした。他のアプリで開きますか? 通知に表示されるサムネイルを 16:9 から正方形にします サムネイルを正方形にする - 以下をタップして通知のアクションを編集します。右側にあるチェックボックスを使用してコンパクトな通知に表示するものを 3 つまで選択します + 以下をタップして通知のアクションを編集します。右側にあるチェックボックスを使用してコンパクトな通知に表示するものを3つまで選択します。 コンパクトな通知に表示されるアクションは 3 つまで選ぶことができます! 5 番目のアクションボタン 4 番目のアクションボタン @@ -602,7 +599,6 @@ 言語 サポート ホスト - サムネイルの URL ウェブサイトを開く ダウンロードのたびに保存する場所を尋ねます ダウンロードフォルダーがまだ設定されていません。今すぐデフォルトのフォルダーを選択してください @@ -753,4 +749,54 @@ お使いのデバイスのモデルではメディアトンネリングがサポートされていないため、このデバイスではメディアトンネリングがデフォルトで無効になっています。 ストリームはありません ライブ配信はありません + 登録者 + メタ情報を読み込んでいます… + 動画 + チャンネルページに表示されるタブ + チャンネルタブ + ショート + チャンネルタブを取得する + 詳細 + アルバム + フィードを更新するときに取得するタブ。 高速モードを使用してチャンネルを更新する場合は、効果がありません。 + プレイリスト + トラック + チャンネル + ライブ + 画面の向きを切り替える + フルスクリーンに切り替える + 次のストリーム + 再生キューを開く + フォワード + 巻き戻し + リプレイ + 再生 + その他のオプション + 期間 + 前のストリーム + 品質 + + 低品質 + アバター + サブチャンネルのアバター + 画像を読み込まない + 高品質 + 中品質 + アップローダーのアバター + バナー + 画像の品質と画像を読み込むかどうかを選択して、データとメモリの使用量を削減します。 変更により、メモリ内とディスク上の画像キャッシュの両方がクリアされます — %s + サムネイル + URLリストで共有 + タイトル付きで共有 + %1$s +\n%2$s + プレイリストを共有 + プレイリスト名やビデオタイトルなどの詳細を含むプレイリスト、またはビデオURLのみのシンプルなリストとしてプレイリストを共有します + - %1$s: %2$s + + %sの返信 + + もっと見る + 表示を少なくする + 以下の通知アクションをタップして編集します。 最初の3つのアクション (再生/一時停止、前へ、次へ)はシステムによって設定されており、カスタマイズすることはできません。 \ No newline at end of file diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml index 2f68f9bc9..7f71a2f41 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -10,11 +10,9 @@ Antri otomatis stream bare Sampah metadata wes dibusak Busak kabeh sampah ora kanggo - Pateni ben gambar cilik ora ketok, ora boros data lan memori. Iku bakal ngresiki sampah gambar. Sampah gambar wes resik Pateni gawe ngumpetke komentar Duduhke komentar - Duduhke gambar cilik Durasi cepet maju/mundure Eling-eling ukuran lan posisi ngambang terakhir Eling-eling ukuran lan posisi ngambang diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 89c2193da..cbeb27d9d 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -42,7 +42,6 @@ არაზუსტი ძიება საშუალებას აძლევს მოთამაშეს უფრო სწრაფად მოიძიოს პოზიციები შემცირებული სიზუსტით. 5, 15 ან 25 წამის ძიება ამით არ მუშაობს სწრაფი წინსვლა/-გადახვევა ძიების ხანგრძლივობა ერთი მოთამაშიდან მეორეზე გადართვამ შესაძლოა შეცვალოს თქვენი რიგი - გამორთეთ ესკიზების ჩატვირთვის თავიდან ასაცილებლად, მონაცემთა დაზოგვისა და მეხსიერების გამოყენების თავიდან ასაცილებლად. იცვლება როგორც მეხსიერებაში, ასევე დისკზე გამოსახულების ქეშის გასუფთავება ძიების შეთავაზებები წაშალეთ ყველა ქეშირებული ვებგვერდის მონაცემები შემდეგი ნაკადის ავტომატური შეყვანა @@ -57,14 +56,14 @@ ჩამოტვირთვა თვალყური ადევნეთ ნანახ ვიდეოებს არ დაიწყოთ ვიდეოები მინი პლეერში, არამედ პირდაპირ გადადით სრულეკრანიან რეჟიმში, თუ ავტომატური როტაცია დაბლოკილია. თქვენ კვლავ შეგიძლიათ მინი პლეერზე წვდომა სრულეკრანიდან გასვლით - დასაწყებად შეეხეთ გამადიდებელ შუშას. - გამოქვეყნდა%1$s - დაინსტალირება + დასაწყებად შეეხეთ გამადიდებელს. + გამოქვეყნების თარიღი: %1$s + დაყენება კარგი - გახსენით ბრაუზერში + გახსენი ვებგვერდად მონიშნეთ ნანახად - გახსენით popup რეჟიმში - გახსნა როგორც + გახსენი ამომხტარ მდგომარეობაში + გახსენი რაღაცით გაზიარება გადმოწერა ნაკადის ფაილი ჩამოტვირთვა @@ -107,7 +106,6 @@ შავი დამახსოვრება ამომხტარი ფანჯრის თვისებები აქტიური მოთამაშის რიგი შეიცვლება - ჩატვირთეთ ესკიზები კომენტარების ჩვენება გამორთეთ კომენტარების დასამალად \"შემდეგი\" და \"მსგავსი\" ვიდეოების ჩვენება @@ -123,7 +121,7 @@ აჩვენეთ წვერი \"შეაჩერე რიგში\" რჩევის ჩვენება ფონზე ან ამომხტარ ღილაკზე დაჭერისას ვიდეოში \"დეტალები:\" URL მხარდაუჭერელია - ნაგულისხმევი კონტენტის ქვეყანა + ჩანაწერის სასურველი ქვეყანა ნაგულისხმევი შინაარსის ენა PeerTube-ის შემთხვევები იპოვეთ თქვენთვის სასურველი შემთხვევები %s-ზე @@ -141,9 +139,9 @@ მიმდინარე დამკვრელი ნაკადის შეტყობინების კონფიგურაცია ვუკრავ ფონზე ვუკრავ ამომხტარი ფანჯარაში - კონტენტი - ასაკით შეზღუდული კონტენტის ჩვენება - ბავშვებისთვის შესაძლოა შეუფერებელი კონტენტის ჩვენება, რადგან მას აქვს ასაკობრივი ზღვარი (როგორიცაა 18+) + მასალა + მაჩვენე ასაკით შეზღუდული მასალა + მაჩვენე ბავშვებისთვის შეუფერებელი მასალა (თუნდაც 18 წლის ქვევით შეზღუდული) YouTube გთავაზობთ „შეზღუდულ რეჟიმს“, რომელიც მალავს პოტენციურად ზრდასრულთა კონტენტს ჩამოტვირთვები ჩამოტვირთვები @@ -197,9 +195,8 @@ გარე მეხსიერება მიუწვდომელია Ქსელის შეცდომა ყველა ესკიზის ჩატვირთვა ვერ მოხერხდა - ვიდეოს URL-ის ხელმოწერის დებფუსირება ვერ მოხერხდა ვებსაიტის გარჩევა ვერ მოხერხდა - კონტენტი მიუწვდომელია + მასალა ხელმიუწვდომელია ჩამოტვირთვის მენიუს დაყენება ვერ მოხერხდა აპი/UI გათიშულია ამ ნაკადის დაკვრა ვერ მოხერხდა @@ -295,7 +292,7 @@ როდესაც მოგვარდება, დააჭირეთ შესრულებულია მოთხოვნილია reCAPTCHA გამოწვევა ამოხსნა - შესრულებულია + შესრულებულია შემცვლელი პერსონაჟი ასოები და ციფრები NewPipe-ის შესახებ @@ -321,7 +318,7 @@ ისტორია გსურთ წაშალოთ ეს ელემენტი ძიების ისტორიიდან\? ბოლოს დაუკრა - უმეტესად დაკვრილი + ხშირად დაკრული მთავარი გვერდის შინაარსი რა ჩანართებია ნაჩვენები მთავარ გვერდზე გადაფურცლეთ ელემენტები მათი ამოსაშლელად @@ -361,7 +358,7 @@ ფონური დამკვრელი ამომხტარი დამკვრელი ყოველთვის იკითხე - მოთხოვნილი კონტენტის ჩატვირთვა + მოთხოვნილი მასალა მზადდება გადარქმევა სახელი დასაკრავ სიაში დამატება @@ -464,7 +461,7 @@ სერვერი არ იღებს მრავალ ნაკადის ჩამოტვირთვებს, ხელახლა სცადეთ @string/msg_threads = 1 არ მოიძებნა შემდგომი დამუშავება ვერ მოხერხდა - მოწყობილობაზე არ არის დარჩენილი თავისუფალი ადგილი + მოწყობილობაზე არ არის დარჩენილი თავისუფალი ადგილი Კავშირის დრო ამოიწურა ამ ჩამოტვირთვის აღდგენა შეუძლებელია გადმოწერილი ფაილების წაშლა @@ -549,11 +546,11 @@ თქვენს მოწყობილობაზე არცერთ აპლიკაციას არ შეუძლია ამის გახსნა ამ მოქმედებისთვის შესაბამისი ფაილების მენეჯერი ვერ მოიძებნა. \n გთხოვთ, დააინსტალიროთ Storage Access Framework თავსებადი ფაილ მენეჯერი - ეს კონტენტი მიუწვდომელია თქვენს ქვეყანაში. - ეს კონტენტი პირადია, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. + ეს ხელმიუწვდომელია თქვენი ქვეყნიდან. + ეს მასალა პირადულია, ამიტომაც NewPipe-ს მისი არც მთლიანად და არც თანდათანობით ჩამოწერა არ შეუძლია. ანგარიში შეწყვეტილია %s იძლევა ამ მიზეზს: - ეს კონტენტი ხელმისაწვდომია მხოლოდ მომხმარებლებისთვის, რომლებმაც გადაიხადეს, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. + ეს მასალა ხელმისაწვდომია მხოლოდ გადამხდელებისთვის, ამიტომაც NewPipe-ს მისი არც მთლიანად და არც თანდათანობით ჩამოწერა არ შეუძლია. გამორჩეული რადიო აირჩიეთ თქვენი საყვარელი ღამის თემა — %s @@ -567,7 +564,6 @@ Ასაკობრივი შეზღუდვა Ენა მასპინძელი - მინიატურების URL საჯარო დამალული პირადი @@ -740,4 +736,10 @@ მუდმივი მინიატურის მოხსნა წავშალო დუბლიკატები\? ნაწილობრივ ნანახი + მზადდება ზედაპირული მახასიათებლები… + თავდაპირველი ხმის ჩანაწერი აირჩიე ენის მიუხედავად + აირჩიე მხედველობადაქვეითებულებისათვის დახასიათებული ხმის ჩანაწერი, თუ არის + არჩიე თავდაპირველი ხმის ჩანაწერი + ხმა: %s + ხმის ჩანაწერი \ No newline at end of file diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index ed4ef0f3b..4c40518a9 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -69,7 +69,7 @@ Iẓiki Immed Adigan - Immed + Immed Wennez Snulfu-d Qbel diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index a6b3daec9..c248c35f4 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -1,2 +1,7 @@ - \ No newline at end of file + + Бастау үшін үлкейткіш әйнекті басыңыз. + %1$s жарияланды + Ағындық ойнатқыш табылмады (оны ойнату үшін VLC орнатуға болады). + Ағындық ойнатқыш табылмады. VLC орнату керек пе\? + \ No newline at end of file diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index 41f2742ab..b55be410d 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -98,7 +98,6 @@ Menuya dakêşanê nehat saz kirin Naverok tune Malperê nekare parsek bike - Nekarî îmzeya URL-ya vîdyoyê deobfuscate bike Nekarî hemî wêneyan barkir Çewtiya torê Dakêşandin ji karta SD ya derveyî re ne gengaz e. Cihê peldanka dakêşanê ji nû ve were çêkirin\? @@ -242,8 +241,6 @@ Vîdyoyên \'Pêş\' û \'Bi vî rengî\' nîşan bidin Zivirandin da ku şîroveyan veşêrin Şîroveyan nîşan bide - Ji bo pêşîgirtina li barkirina nîgarkêşan, daneya daneyê û karanîna bîranînê xilas bibe vemirînin. Guherandinên kaşeya wêneyê hem di bîra û hem jî li ser dîskê paqij dikin. - Nîgarên barkêş Dê rêza lîstikvanê çalak were guhertin Guhertina ji lîstikvanek bi yeke din dibe ku dewsa dorê we bigire Berî paqijkirina dorê ji pejirandinê bipirsin @@ -391,7 +388,7 @@ Vê dakêşanê nikare paşde bibe Dema girêdanê Pêşkeftin winda bû, ji ber ku pel hate jêbirin - Cih li cîhazê namîne + Cih li cîhazê namîne Dema ku pel dixebitî NewPipe hate girtin Pêvajoya şûnda têk çû Peyda nebû @@ -540,7 +537,7 @@ Karakteyên nederbasdar bi vê nirxê têne veguheztin Di navên pelan de tîpan destûr dan Dakêşînin - Kirî + Kirî reCAPTCHA dijwarî xwestin Dema ku çareser bibe \"Kirî\" çap bikin Tevlêbûnên YouTube-ê ji barkirina Google-ê bikişînin: diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml index a6b3daec9..ec598114d 100644 --- a/app/src/main/res/values-kn/strings.xml +++ b/app/src/main/res/values-kn/strings.xml @@ -1,2 +1,43 @@ - \ No newline at end of file + + ಗೆ ಸೇರಿಸಿ + ಮಾಹಿತಿಯನ್ನು ತೋರಿಸಿ + ಚಾನಲ್ ಅನ್‌ಸಬ್‌ಸ್ಕ್ರೈಬ್ ಮಾಡಲಾಗಿದೆ + ಪಾಪ್‌ಅಪ್ ಮೋಡ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿ + ನೀವು \"%1$s\" ಎಂದು ಅರ್ಥೈಸಿದ್ದೀರಾ? + ಬಳಸಿ ಹಂಚಿಕೊಳ್ಳಿ + ವೀಡಿಯೊ ಫೈಲ್‌ಗಳಿಗಾಗಿ ಡೌನ್‌ಲೋಡ್ ಫೋಲ್ಡರ್ ಆಯ್ಕೆಮಾಡಿ + ಸಬ್‌ಸ್ಕ್ರೈಬ್ ಮಾಡಲಾಗಿದೆ + ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ಆಡಿಯೊ ಫೈಲ್‌ಗಳನ್ನು ಇಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ + ಬಾಹ್ಯ ಆಡಿಯೊ ಪ್ಲೇಯರ್ ಬಳಸಿ + ಚಂದಾದಾರಿಕೆಯನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ + ಪ್ರಾರಂಭಿಸಲು ಭೂತಗನ್ನಡಿಯನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ. + ಕೆಲವು ರೆಸಲ್ಯೂಶನ್‌ಗಳಲ್ಲಿ ಆಡಿಯೊವನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ + %1$s ರಂದು ಪ್ರಕಟಿಸಲಾಗಿದೆ + ವೀಕ್ಷಿಸಲಾಗಿದೆ ಎಂದು ಗುರುತಿಸಿ + ಯಾವುದೇ ಸ್ಟ್ರೀಮ್ ಪ್ಲೇಯರ್ ಕಂಡುಬಂದಿಲ್ಲ (ಅದನ್ನು ಪ್ಲೇ ಮಾಡಲು ನೀವು VLC ಅನ್ನು ಸ್ಥಾಪಿಸಬಹುದು). + ಸರಿ + ಬ್ರೌಸರ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿ + ಪಾಪ್ಅಪ್ + ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ + ಇದಕ್ಕೆ ಫಲಿತಾಂಶಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ: %s + ಇದರೊಂದಿಗೆ ತೆರೆಯಿರಿ + ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ವೀಡಿಯೊ ಫೈಲ್‌ಗಳನ್ನು ಇಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ + ಸ್ಟ್ರೀಮ್ ಫೈಲ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ + ರದ್ದುಗೊಳಿಸಿ + ಆಡಿಯೋ ಡೌನ್‌ಲೋಡ್ ಫೋಲ್ಡರ್ + ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಲಾದ ಪ್ಲೇಪಟ್ಟಿಗಳು + ಚಂದಾದಾರಿಕೆಯನ್ನು ನವೀಕರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ + ಸಬ್‌ಸ್ಕ್ರೈಬ್ + ಹುಡುಕಿ + ಚಂದಾದಾರಿಕೆಗಳು + ಸೆಟ್ಟಿಂಗ್‌ಗಳು + ಬಾಹ್ಯ ವೀಡಿಯೊ ಪ್ಲೇಯರ್ ಬಳಸಿ + ಸ್ಥಾಪಿಸಿ + ಯಾವುದೇ ಸ್ಟ್ರೀಮ್ ಪ್ಲೇಯರ್ ಕಂಡುಬಂದಿಲ್ಲ. VLC ಸ್ಥಾಪಿಸುವುದೇ? + ಶೇರ್ ಮಾಡಿ + ವೀಡಿಯೊ ಡೌನ್‌ಲೋಡ್ ಫೋಲ್ಡರ್ + ಟ್ಯಾಬ್ ಆಯ್ಕೆಮಾಡಿ + ಹಿನ್ನೆಲೆ + ಅನ್‌ಸಬ್‌ಸ್ಕ್ರೈಬ್ ಮಾಡಿ + \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 127db9bcb..d03be0920 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -47,7 +47,6 @@ 라이브 오류 모든 썸네일을 불러올 수 없습니다 - 비디오 URL 서명을 복호화할 수 없습니다 웹사이트를 가져올 수 없습니다 컨텐츠를 사용할 수 없습니다 다운로드 메뉴를 설정할 수 없습니다 @@ -278,8 +277,6 @@ 경고: 데이터가 많이 소모될 수 있습니다. \n \n계속하시겠습니까\? - 썸네일 로드하기 - 동영상 썸네일을 로드하지 않으며, 데이터와 메모리 사용을 최대한 줄입니다. 이 옵션을 선택 시 모든 메모리 캐시와 저장소 캐시를 삭제합니다 이미지 캐시 지워짐 캐시된 메타데이터 지우기 캐시된 모든 웹페이지 데이터 지우기 @@ -392,7 +389,7 @@ 파일을 덮어쓰기할 수 없습니다 해당 이름으로 대기된 다운로드가 있습니다 파일 작업 중에 Newpipe가 종료되었습니다 - 남은 저장공간이 없습니다 + 남은 저장공간이 없습니다 파일이 삭제되어 진행이 중지되었습니다 연결시간 초과 모든 다운로드 기록과 파일을 삭제합니다.확실합니까\? @@ -462,7 +459,7 @@ 이 비디오는 연령제한이 있습니다. \n \n만약, 시청을 원한다면 설정에 \"%1$s\"를 활성화 하세요. - 완료 + 완료 아티스트 앨범 비디오 @@ -627,7 +624,6 @@ 창작자의 마음 비공개 비공개 - 썸네일 URL 호스트 이제 이 채널을 구독했습니다 알림 받기 @@ -703,7 +699,7 @@ 빠른 모드 점 3개 메뉴에서 구독 가져오기 또는 내보내기 최신 버전의 NewPipe를 실행 중입니다 - %s를 다운로드하려면 탭하세요. + %s를 다운로드하려면 탭하세요 영구 썸네일 설정 해제 이 옵션은 %s가 테마로 선택되었을 경우에만 사용할 수 있습니다 중복 추가 %d 번 @@ -751,4 +747,50 @@ %1$s %2$s 메인 탭 위치 장치 모델에서 미디어 터널링을 지원하지 않는 것으로 알려져 있기 때문에 장치에서 기본적으로 미디어 터널링이 비활성화되었습니다. + 이미지 품질 + 동영상 + \? + 구독자 + 채널 페이지에 표시되는 탭 + URL 목록 공유 + 타이틀로 공유 + %1$s +\n%2$s + 채널 탭 + 쇼츠 + 메타데이터 불러오기 중… + 화면 방향 전환 + 낮은 품질 + 전체화면 전환 + 채널 탭 가져오기 + 아바타 + 다음 스트림 + 하위 채널 아바타 + 재생 대기열 열기 + 이미지를 불러오지 마세요 + 높은 품질 + 정보 + 재생목록 공유 + 앞으로 + 앨범 + 되감기 + 다시 재생 + 피드를 업데이트할 때 가져올 탭입니다. 빠른 모드를 사용하여 채널을 업데이트하는 경우 이 옵션은 효과가 없습니다. + 재생목록 이름, 동영상 제목 등의 세부정보 또는 간단한 동영상 URL 목록으로 재생목록을 공유하세요 + 중간 품질 + 업로더 아바타 + 배너 + 재생목록 + - %1$s: %2$s + 실시간 스트림 없음 + 데이터 및 메모리 사용량을 줄이기 위해 이미지 품질과 이미지 불러오기 여부를 선택하세요. 변경 사항이 메모리 내 및 디스크 내 이미지 캐시를 모두 지움 — %s + 재생 + 추가 옵션 + 썸네일 + 트랙 + 지속 + 스트림 없음 + 채널 + 이전 스트림 + 실시간 \ No newline at end of file diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 8d1ffbab8..cc59938b4 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -53,9 +53,6 @@ ڕه‌ش بیرهاتنه‌وه‌ی شوێن و قه‌باره‌ی په‌نجه‌ره‌ بیرهاتنه‌وه‌ی كۆتا قه‌باره‌ و شوێنی په‌نجه‌ره‌ی بچووك - باركردنی وێنۆچكه‌كان - ناچالاكی بكه‌ بۆ ڕاگرتنی وێنۆچكه‌كان له‌ باركردن و پاشه‌كه‌وتبوون له‌سه‌ر بیرگه‌ی ئامێره‌كه‌ت. -\nگۆڕینی ئه‌مه‌ ده‌بێته‌ هۆی سڕینه‌وه‌یان له‌سه‌ر بیرگه‌ی مۆبایله‌كه‌ت. پاشماوه‌ی وێنۆچكه‌كان سڕایه‌وه‌ بەکارهێنانی گەڕانی ناوردی خێرا خاوێنکردنەوەی پاشماوەی داتا @@ -330,7 +327,6 @@ پیشاندانی ڕێنمایی ”داگرتن تا پاشکۆ” پیشاندانی ڕێنمایی کاتێ لە پاشبنەما یاخوود پەنجەرەدا گرتە دەکرێ لەسەر وردەکاری ڤیدیۆیەک پەرەسەندوو - ناتوانرێ واژووی بەستەری ڤیدیۆ بخوێنرێتەوە نەگێڕانەوەی کارپێکەر بۆ پێش کێشە ڕوویدا گێڕانەوەی کارپێکەر بۆکاتی پێش کێشە هەمان فۆڵدەر بوونی نییە @@ -422,7 +418,7 @@ بەسوودە بۆ کاتی گۆڕینی هێڵ بۆ داتای مۆبایل, لەگەڵ ئەوەشدا زۆربەی دابەزاندنەکان ڕاناگرێت داخستن ئەپ داخرا لەکاتی کارکردن لەسەر ئەو پەڕگەیە - بیرگەی ناوەکیت پڕبووە + بیرگەی ناوەکیت پڕبووە کردارەکە شکستی هێنا, چونکە ئەو پەڕگەیە سڕاوەتەوە هێڵی ئینتەرنێت نەما ئایا دەتەوێ مێژووی دابەزاندنەکانت بسڕدرێنەوە یان هەموو فایلە دابەزێنراوەکانت بسڕدرێنەوە؟ @@ -448,7 +444,7 @@ زمانی ئەپ بنەڕەتی سیستەم گرتە بکە لەسەر ”تەواو” کاتێ کە چارەسەرکرا - تەواو + تەواو ڤیدیۆکان %d چرکە diff --git a/app/src/main/res/values-la/strings.xml b/app/src/main/res/values-la/strings.xml index 42b619efc..16961c30b 100644 --- a/app/src/main/res/values-la/strings.xml +++ b/app/src/main/res/values-la/strings.xml @@ -93,7 +93,7 @@ %d secundus %d secundi - Factum + Factum Quaere semper Index Nullus limus diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 1c8ba59ae..84699cf6d 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -64,7 +64,6 @@ Klaida Tinklo klaida Negalima įkelti visų miniatiūrų - Negalima iššifruoti vaizdo įrašo skaitmeninio parašo Negalima apdoroti tinklapio Turinys neprieinamas Negalima sutvarkyti atsisiuntimų meniu @@ -190,7 +189,7 @@ Išsami informacija Garso nustatymai Laikykite, kad įtrauktumėte į eilę - Pradėti groti foniniame rėžime + Pradėti groti foniniame režime Pradėti groti langelio grotuve Nerastas srauto grotuvas (galite įdiegti VLC kad grotumėte). Parsisiųsti srauto failą @@ -374,8 +373,6 @@ Atstatyti paskutinį atkūrimo laiką Tęsti atkūrimą Rodyti aprašymą - Norėdami taupyti duomenų srautą, atminties naudojimą išjunkite. Pakeitimai išvalys duomenis atmintyje ir diske - Įkelti miniatiūras Aktyvaus grotuvo eilė bus pakeista Perjungimas iš vieno grotuvo į kitą gali pakeisti jūsų eilę Prieš išvalant eilę prašyti patvirtinimo @@ -508,7 +505,7 @@ NewPipe į jūsų privatumą žiūri labai rimtai. Programa be jūsų sutikimo nerenka jokių duomenų. \nNewPipe privatumo politika išsamiai parodo kokie duomenys siunčiami ir saugomi pranešant apie problemą. NewPipe privatumo politika - Atlikta + Atlikta Išspręsta Paspauskite \"atlikta\" kai išspręsta Patikrinkite ar apie problemą su kuria susidūrėte dar nėra pranešta. Sukurdami kelis pranešimus apie tą pačią problemą atimate iš mūsų laiką kurį galėtume skirti klaidų taisymui. @@ -556,7 +553,7 @@ Elementams rodyti orginalų \"prieš\" laiką Nepavyksta prisijungti prie serverio Failo sukurti nepavyko - Įrenginyje nebėra vietos + Įrenginyje nebėra vietos Nepavyko rasti serverio Sistema uždraudė veiksmą Rodyti tik negrupuotas prenumeratas @@ -619,7 +616,6 @@ Viešas Privatus Neįtrauktas į sąrašą - Paveikslėlio URL Serveris Pagalba Kalba diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index c8d3221eb..ab3f7b94c 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -77,7 +77,7 @@ Nederīgas rakstzīmes tiks aizvietotas ar šo Atļautās rakstzīmes failu nosaukumos Lejupielādēt - Pabeigts + Pabeigts reCAPTCHA izaicinājums dots Nospiediet \"Pabeigts\", kad to atrisinat reCAPTCHA izaicinājums @@ -192,7 +192,6 @@ Nevarēja iestatīt lejupielādes izvēlni Saturs nav pieejams Nevarēja apstrādāt mājaslapu - Nevarēja saprast video URL parakstu Nevarēja ielādēt visus video attēlus Tīkla kļūda Lejupielādēt uz SD karti nav iespējams. Atiestatīt lejupielāžu mapes lokāciju\? @@ -372,7 +371,7 @@ Nevar atgūt šo lejupielādi Savienojums pārtraukts Progress zaudēts, jo fails tika izdzēsts - Ierīcē nav vietas + Ierīcē nav vietas Strādājot ar failu, NewPipe tika aizvērts Pēcapstrāde neizdevās Nav atrasts @@ -517,8 +516,6 @@ Rādīt \'Nākošos\' un \'Līdzīgos\' videoklipus Izslēdziet, lai paslēptu komentārus Rādīt komentārus - Izslēdziet, ja vēlaties nelādēt video attēlus, ietaupot datus un atmiņu. Opcija notīra kešatmiņu, izdzēšot visus saglabātos video attēlus - Ielādēt video attēlus Tagadējā atskaņošanas rinda tiks aizvietota Mainoties vienam video uz citu, iespējams, notīrīsies jūsu atskaņošanas rinda Prasīt apstiprinājumu, pirms notīrīt atskaņošanas rindu @@ -655,7 +652,6 @@ Zemas kvalitātes (mazāks) Privātums Sarakstā neiekļauts - Video attēla URL Uzņēmums Attālinātie meklēšanas ieteikumi Atzīmēt kā skatītu diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 524c82aef..8e03b26dd 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -55,8 +55,6 @@ Запамти ја последната големина и место на прозорчето Брзо, непрецизно премотување Со непрецизното премотување се пребарува побрзо, но со намалена презицност. - Прочитај мали видео-сликички - Оневозможете, за да не се читаат малите видео-сликички за штедење на меморија и интернет. Промената на оваа опцијата ќе ја избрише кеш-меморијата. Кешираните слики се избришани Избришете ги кешираните мета-податоци Избришете ги сите кеш-податоци од веб-страни @@ -114,7 +112,6 @@ Грешка Мрежна грешка Не можеа да се прочитаат сите сликички - Невозможно децифрирање на URL потписот Не може да се прочита страната Содржината е недостапна Неуспешно поставување на менито за превземања @@ -382,7 +379,7 @@ Ддотека со ова име веќе постои Преземената дадотека со ова име веќе постои NewPipe беше затворен додека работеше на датотеката - Не останува простор на уредот + Не останува простор на уредот Истечено време за поврзување Дали си сигурен\? Ограничи ја редицата за преземање diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 29769acae..c439593f7 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -131,7 +131,7 @@ സ്വീകാര്യമല്ലാത്ത അടയാളങ്ങൾ ഈ അടയാളം കൊണ്ട് മാറ്റുന്നതാണ് ഫയൽനാമങ്ങളിൽ അനുവദിച്ചിട്ടുള്ള അടയാളങ്ങൾ ഡൗൺലോഡ് - ഓകെ + ഓകെ reCAPTCHA ചാലഞ്ചിനായി അഭ്യർത്ഥിച്ചു തീർന്നാൽ \"Done\" അമർത്തുക reCAPTCHA ചാലഞ്ച് @@ -226,7 +226,6 @@ ഡൗൺലോഡ് മെനു തുറക്കാനായില്ല കന്റെന്റ് ലഭ്യമല്ല വെബ്സൈറ്റ് വ്യാപരിക്കാനായില്ല - വീഡിയോ URL സിഗ്നേച്ചർ ഡീക്രിപ്റ്റ് ചെയ്യാൻ സാധിച്ചില്ല ലഘുചിത്രങ്ങൾ ലോഡ് ചെയ്യാനായില്ല നെറ്റ്‌വർക്ക് പിശക് എസ്ഡി കാർഡിലേക്ക്‌ ഡൗൺലോഡ് അസാധ്യം. ഡൗൺലോഡ് ഫോൾഡർ മാറ്റട്ടെ\? @@ -331,10 +330,8 @@ കാഷെ ആയ ഡേറ്റ നീക്കംചെയ്യുക കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി ഇമേജ് കാചെ തുടച്ചുമാറ്റി - ലഘുചിങ്ങൾ ലോഡ് ചെയ്യാതിരിക്കാനും ഡേറ്റയും മെമ്മറിയും ലാഭിക്കാനുമായി ഓഫ്ചെയ്യുക. എസ് ഡീ കാർഡിലെയും മെമ്മറിയിലെയും കാച്ചേ ക്ലിയർ ചെയ്യും കമന്റുകൾ മറയ്ക്കാനായി ഓഫ് ചെയ്യുക കമന്റുകൾ കാണിക്കുക - ലഘുചിത്രങ്ങൾ ലോഡ്‌ ചെയ്യുക ഫാസ്റ്റ്-ഫോർവേർഡ്/റീവൈൻഡ് സമയദൈർഘ്യം Inexact seek ഉപയോഗിക്കുക കുറഞ്ഞ കൃത്യതയോടെ സീക് ചെയ്യാൻ ഇൻ എക്സക്ട് സഹായിക്കുന്നു. 5,15,25 സെക്കൻഡ് സീക്‌ ഈ മോഡിൽ പ്രവർത്തിക്കുകയില്ല @@ -497,7 +494,7 @@ ഈ ഡൗൺലോഡ് വീണ്ടെടുക്കാനാവില്ല കണക്ഷൻ കാലഹരണപ്പെട്ടു ഫയൽ ഇല്ലാതാക്കിയതിനാൽ പുരോഗതി നഷ്‌ടപ്പെട്ടു - ഉപകരണത്തിൽ ഇനിയൊരു സ്ഥലവും ബാക്കിയില്ല + ഉപകരണത്തിൽ ഇനിയൊരു സ്ഥലവും ബാക്കിയില്ല ഫയലിൽ പ്രവർത്തിക്കുമ്പോൾ ന്യൂപൈപ്പ് അടച്ചു പോസ്റ്റ്-പ്രോസസ്സിംഗ് പരാജയപ്പെട്ടു കണ്ടെത്താനായില്ല @@ -611,7 +608,6 @@ സ്വകാര്യം ലിസ്റ്റ് ചെയ്യപ്പെടാത്തത് പൊതുവായത് - ചെറുചിത്രം URL ഹോസ്റ്റ് പിന്തുണ ഭാഷ diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 648849205..8c6b88716 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -57,8 +57,6 @@ Mengingat saiz dan posisi popup terakhir Gunakan tinjau laju tidak tepat Membolehkan pemain untuk meninjau ke posisi lebih laju dengan kurang ketepatan. Mencari 5, 15 atau 25 saat tidak berfungsi dengan ini - Muatkan thumbnail - Matikan untuk mengelakkan pemuatan thumbnail, menjimat penggunaan data dan ingatan. Perubahan akan menghapus cache imej dari ingatan dan disk Cache imej dihapuskan Hapuskan cache metadata Hapuskan semua cache data halaman web @@ -135,7 +133,6 @@ Tidak mampu Memuat turun ke kad SD luar. Tetapkan semula lokasi folder muat turun\? Ralat rangkaian Tidak dapat memuat semua thumbnail - Tidak dapat menyahsulit tanda tangan URL video Tidak dapat menghuraikan laman web Kandungan tidak tersedia Tidak dapat menyediakan menu muat turun @@ -380,7 +377,7 @@ %s pendengar Tekan \"Selesai\" saat selesai - Selesai + Selesai Selesaikan Tidak ada ulasan @@ -435,4 +432,8 @@ Jangan tunjuk Nyahbisu Minta Android menyesuaikan warna pemberitahuan sesuai dengan warna utama di thumbnail (perhatikan bahawa ini tidak tersedia dalam semua perangkat) + Auto-main + Sambung main + Tidak boleh memuat komentar + Tutup \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index da6193e90..6f232ba06 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -30,7 +30,7 @@ Mørk Lys Last ned - Vis \"Neste\" og \"Lignende\" -videoer + Vis «Neste» og «Lignende» -videoer Nettadressen støttes ikke Forvalgt innholdsspråk Video og lyd @@ -46,7 +46,6 @@ Vis aldersbegrenset innhold Feil Kunne ikke laste inn alle miniatyrbilder - Kunne ikke dekryptere signaturen til videoens nettadresse Kunne ikke tolke nettside Innholdet er utilgjengelig Kunne ikke sette opp nedlastingsmeny @@ -257,7 +256,6 @@ Eksporterer… Importer fil Forrige eksport - Last miniatyrbilder Bildehurtiglager tømt Tøm hurtiglagret metadata Fjern all hurtiglagret nettsidedata @@ -304,7 +302,6 @@ \n3. Logg inn når forespurt \n4. Kopier profil-nettadressen du ble videresendt til. Unøyaktig spoling lar spilleren søke posisjoner raskere med redusert presisjon. Å søke i 5, 15 eller 25 sekunder fungerer ikke med dette - Skru av for å stoppe innlasting av miniatyrbilder, noe som sparer data- og minnebruk. Endring av dette vil tømme både disk- og minne-hurtiglager Fortsett fullendt (ikke-repeterende) avspillingskø ved å legge til en relatert strøm Overvåkning av minnelekkasjer kan forårsake at appen ikke svarer under heap dumping Rapporter feil utenfor livssyklusen @@ -398,7 +395,7 @@ Kan ikke overskrive filen Det finnes en ventende nedlasting ved dette navnet NewPipe ble lukket under arbeid med filen - Ingen ledig plass på enheten + Ingen ledig plass på enheten Framdrift gikk tapt, fordi filen ble slettet Tilkoblingsavbrudd Ønsker du å slette din nedlastingshistorikk eller slette alle nedlastede filer\? @@ -449,7 +446,7 @@ Programspråk Systemforvalg Trykk \"Ferdig\" når den er løst - Ferdig + Ferdig Videoer %d sekund @@ -561,7 +558,7 @@ Tøm reCAPTCHA-kaker reCAPTCHA-kaker har blitt slettet Tøm kaker som NewPipe lagrer når du løser en reCAPTCHA - YouTube tilbyr en \"Begrenset modus\" som skjuler potensielt modent innhold + YouTube tilbyr «Begrenset modus» som skjuler innhold antatt å være for voksne Vis innhold som muligens er uegnet for barn fordi det har en aldersgrense (som 18+) La Android tilpasse varselets farge i henhold til hovedfargen i miniatyrbildet (merk at dette ikke er tilgjengelig på alle enheter) Fargelegg merknad @@ -596,7 +593,7 @@ Radio Framhevet Løs - Nattema + Nattdrakt Vis kanaldetaljer Skru av media-tunnelering hvis du opplever svart skjerm eller videohakking Skru av media-tunnelering @@ -623,7 +620,6 @@ Privat Ulistet Offentlig - Miniatyrbilde-nettadresse Tjener Støtte Språk @@ -677,7 +673,7 @@ LeakCanary er ikke tilgjengelig ExoPlayer-forvalg Intervallstørrelse for avspillingsinnlasting - Bytt avspillinginnlastingens intervallstørrelse (for øyeblikket %s). En lavere verdi kan øke hastigheten på den første videoinnlastingen. Endringer krever en omstart av spilleren + Endre størrelsen på lasteintervallet på progressivt innhold (for øyeblikket %s). En lavere verdi kan øke hastigheten på den første videoinnlastingen. Endringer krever omstart av spilleren Spillervarsel Varsler Nye strømmer @@ -740,4 +736,66 @@ Delvis sett Nyttig hvis hodsettet ditt har knapper som fungerer dårlig Vis følgende strømmer + \? + Abonnenter + %1$s +\n%2$s + Kanalfaner + Laster inn metadata … + Lav kvalitet + Hent kanalfaner + Avatarer + Neste strøm + Underkanalavatarer + Åpne avspillingskø + Velg opprinnelig lydspor uavhengig av språk + Ikke last inn bilder + Høy kvalitet + Om + Del spilleliste + Album + Gjenta + Velg et lydspor med beskrivelser for synshemmede hvis tilgjengelig + Middels kvalitet + Foretrekk beskrivende lyd + Opplasteravatarer + Foretrekk opprinnelig lyd + Lyd: %s + Spillelister + Lydspor + Ingen direktestrømmer + Spill av + Flere alternativer + Miniatyrbilder + Spor + Varighet + Ingen strømmer + Kanaler + Forrige strøm + Vis mer + + %s svar + %s svar + + Flytt hovedfanevelgeren til bunnen + Hovedfaneposisjon + Videoer + Ukjent + Direkte + Spol tilbake + Spol forover + Bildekvalitet + Vis mindre + Del med titler + Del nettadresse først + - %1$s: %2$s + ExoPlayer-innstillinger + %1$s %2$s + beskrivende + Veksle fullskjermsvising + Bytt skjermretning + Rediger hver merknadshandling nedenfor ved å trykke på den. De første tre (spill av/pause, forrige, og neste) kan ikke tilpasses. + Bruk ExoPlayers dekodings-tilbakefall + Håndter noen ExoPlayer-innstillinger. Disse endringeren krever omstart av avspilleren. + Hvilke faner som vises på kanalsidene \ No newline at end of file diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 05c82808e..5e6c1eece 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -56,10 +56,8 @@ पछिल्लो आकार र पपअप को स्थिति सम्झना तेज \'inexact\' खोज्न प्रयोग गर्नुहोस \'Inexact\' प्लेयर कम सटीक छिटो स्थितिहरू गर्न खोज्न अनुमति दिन्छ खोज्छन्। 5, 15 वा 25 सेकेन्ड को लागि खोजी यो काम गर्दैन। - थम्बनेल लोड टिप्पणीहरू देखाऊ टिप्पणीहरू लुकाउन, बन्द गर्नुहोस - डाटा र स्मृति उपयोग सुरक्षित गर्न, थम्बनेलहरू लोड रोक्न, बन्द गर्नुहोस। परिवर्तनहरू दुवै मा-स्मृति र-डिस्क छवि क्यास खाली गर्छ। छवि क्यास सखाप क्यास मेटाडाटा हटाउ सबै क्यास वेबपेज डाटा हटाउ @@ -140,7 +138,6 @@ बाह्य एस डी कार्ड (SD card) छैन। डाउनलोड फोल्डर स्थान रिसेट गर्ने\? नेटवर्क त्रुटि सबै थम्बनेल लोड गर्न सकेन - भिडियो URL हस्ताक्षर डिक्रिप्टगर्न सकेन वेबसाइट पार्स गर्न सकिँएन सामग्री अनउपलब्ध डाउनलोड मेनु स्थापित गर्न सकिएन @@ -392,7 +389,7 @@ फाइल अधिलेखन गर्न सकिएन यसै नाम सितको एक फाइल डाउनलोड हुने प्रक्रियामा छ फाइल मा काम गर्दा NewPipe बन्द भएको थियो - उपकरणमा कुनै ठाउँ बाकी छैन + उपकरणमा कुनै ठाउँ बाकी छैन प्रगति हरायो, किनभने फाइल मेटिएको थियो जडान समय सकियो तपाईं आफ्नो डाउनलोड इतिहास वा डाउनलोड फाइल मेटाउन चाहनुहुन्छ\? @@ -444,7 +441,7 @@ सिस्टम पूर्वनिर्धारित reCAPTCHA चुनौती प्रेस हल गर्दा \"डन\" - सकियो + सकियो भिडियोहरु %d सेकेन्ड diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index bf77f9da3..637eb1751 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -55,8 +55,6 @@ Onthoud laatste grootte en positie van pop-up Snel, minder exact spoelen gebruiken Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie. 5, 15 en 25 seconden werken niet - Miniatuurvoorbeelden laden - Schakel dit uit voor het laden van miniatuurvoorbeelden te verhinderen; dit bespaart mobiele gegevens en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache Afbeeldingscache gewist Gecachete metagegevens wissen Alle gecachete webpagina-gegevens wissen @@ -114,7 +112,6 @@ Fout Netwerkfout Kon niet alle miniaturen laden - Kon video-URL-ondertekening niet ontsleutelen Kon website niet verwerken Inhoud niet beschikbaar Kon downloadmenu niet instellen @@ -468,7 +465,7 @@ Download geschiedenis verwijderen Kan deze download niet herstellen Verbinding time-out - Geen vrije ruimte meer op het apparaat + Geen vrije ruimte meer op het apparaat NewPipe werd gesloten terwijl het bezig was met het bestand Er staat al een download met deze naam in wacht Kan bestand niet overschrijven @@ -493,7 +490,7 @@ Geen afspeellijst bladwijzers Selecteer een afspeellijst Standaard kiosk - Klaar + Klaar Tik op ‘Klaar’ zodra opgelost ∞ video\'s 100+ video\'s diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index b6622c210..edb822366 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -44,7 +44,6 @@ Fout Netwerkfout Kan niet alle miniatuurvoorbeelden laden - Kan video-URL-ondertekening niet ontsleutelen Kan website niet verwerken Inhoud niet beschikbaar Kan downloadmenu niet instellen @@ -217,7 +216,7 @@ Dit overschrijft je huidige configuratie. Streambestand downloaden Informatie tonen - Bijgehouden afspeellijsten + Bijgehouden afspeellijsten Toevoegen aan Versleep om de volgorde te wijzigen Aanmaken @@ -284,8 +283,6 @@ Let op: deze actie kan veel MB’s van je mobiele netwerk gebruiken. \n \nWil je doorgaan? - Miniatuurvoorbeelden laden - Schakel dit uit om het laden van miniatuurvoorbeelden te verhinderen; dit bespaart mobiele data en geheugen. Het wijzigen van deze instelling wist het geheugen en de afbeeldingscache Afbeeldingscache gewist Gecachete metagegevens wissen Alle gecachete webpagina-gegevens wissen @@ -377,7 +374,7 @@ Stop Maximum aantal keer proberen Maximum aantal pogingen voordat de download wordt geannuleerd - Pauzeren bij mobiele data verbinding + Pauzeren bij mobiele gegevens­verbinding Handig voor wanneer u naar mobiel internet overschakelt, hoewel sommige downloads niet gepauzeerd kunnen worden Gebeurtenissen Conferenties @@ -389,7 +386,7 @@ Kan reacties niet laden Sluiten Het \'Storage Access Framework\' staat downloads naar een externe SD kaart toe - Wis data + Gegevens wissen Afspelen hervatten Verder afspelen vanaf laatste positie Posities in lijst @@ -399,7 +396,7 @@ Een bestand met dezelfde naam bestaat al Kan bestand niet overschrijven Er is al een download met deze naam bezig - Geen vrije ruimte meer op het apparaat + Geen vrije ruimte meer op het apparaat Voortgang verloren, omdat bestand was verwijderd Wilt u de downloadgeschiedenis of alle gedownloade bestanden verwijderen\? Download­wachtrij limiteren @@ -446,7 +443,7 @@ App-taal Systeemtaal gebruiken Druk op ‘Klaar’ als u dit heeft opgelost - Klaar + Klaar Video\'s Door beperkingen van ExoPlayer is de zoekduur ingesteld op %d seconden Geluid dempen @@ -546,7 +543,7 @@ Willekeurig afspelen Herhaal Je kan maximaal drie acties selecteren om te tonen in de compacte notificatie! - Pas elke meldings­actie hieronder aan door er op te tikken. Selecteer tot drie acties die getoond worden in de compacte melding door gebruik te maken van de selectievakjes aan de rechterkant + Pas elke meldings­actie hieronder aan door er op te tikken. Selecteer tot drie acties die getoond worden in de compacte melding door gebruik te maken van de selectievakjes aan de rechterkant. Vijfde actieknop Vierde actieknop Derde actieknop @@ -602,7 +599,6 @@ Privé Niet vermeld Openbaar - Miniatuur-URL Host Ondersteuning Taal @@ -714,7 +710,7 @@ Sorteer Snelle modus Importeer of exporteer abonnementen vanuit het 3-punten menu - U heeft de laatste versie van NewPipe + U heeft de nieuwste versie van NewPipe Druk om %s te downloaden Kon niet naar klembord kopiëren Deze instelling is alleen beschikbaar als %s als thema ingesteld is @@ -761,9 +757,60 @@ origineel nagesynchroniseerd beschrijvend - Secties onderaan weergeven + Verplaats de tabselector naar beneden Positie van sectie-tabbladen Geen streams Geen live-streams Media-tunneling is standaard uitgeschakeld op uw apparaat omdat uw apparaatmodel dit niet ondersteunt. + Afbeeldings­kwaliteit + Video\'s + \? + Abonnees + Welke tabbladen worden getoond op kanaal­pagina\'s + Kanaal­tabbladen + Shorts + Metagegevens laden… + Scherm­oriëntatie omschakelen + Lage kwaliteit + Volledig scherm omschakelen + Kanaal­tabbladen ophalen + Profielfoto\'s + Volgende stream + Subkanaal-profielfoto\'s + Wachtrij openen + Afbeeldingen niet laden + Hoge kwaliteit + Over + Vooruitspoelen + Albums + Terugspoelen + Opnieuw afspelen + Tabbladen om op te halen bij het bijwerken van de feed. Deze optie heeft geen effect als een kanaal wordt bingewerkt via de snelle modus. + Gemiddelde kwaliteit + Uploader-profielfoto\'s + Banieren + Afspeellijsten + Kies de kwaliteit van afbeeldingen en of deze überhaupt geladen moeten worden, om gegevens- en geheugengebruik te verminderen. Wijzigingen wissen de afbeeldings­cache — %s + Afspelen + Meer opties + Miniaturen + Nummers + Duur + Kanalen + Vorige stream + Live + URL-lijst delen + Delen met titels + %1$s +\n%2$s + Afspeellijst delen + Deel afspeellijst met details zoals afspeellijstnaam en videotitels of als een eenvoudige lijst met video-URL\'s + - %1$s: %2$s + + %s antwoord + %s antwoorden + + Meer tonen + Minder tonen + Bewerk elke meldings­actie hieronder door erop te tikken. De eerste drie acties (afspelen/pauzeren, vorige en volgende) zijn ingesteld door het systeem en kunnen niet worden aangepast. \ No newline at end of file diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index 55c3cdc62..a6d12fe2a 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -90,7 +90,6 @@ Stadfest radtømming Byte ifrå ein avspelar til ein annan kan skifta ut rada di Den noverande avspelingsrada vil verta skift ut - Hent fram småbilete Sjå bort ifrå mediaknappetrykk Nyttig om du til dømes nyttar høyretelefonar med skadde knappar Ingen diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml index e177035b2..6956d6b78 100644 --- a/app/src/main/res/values-nqo/strings.xml +++ b/app/src/main/res/values-nqo/strings.xml @@ -85,7 +85,6 @@ ߛߋ߲߬ߠߊ߬ ߕߏߟߏ߲ߟߊ߲ ߠߊ߫ ߕߎ߲߰ߠߌ߲ ߘߌߣߊ߬ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ ߞߊ߬ ߕߙߏߞߏ ߞߟߋߞߟߋ߫ ߞߘߎ ߟߊ߫ ߖߊ߲߬ߖߊ߲߬ ߠߎ߬ ߡߊߓߌ߬ߟߊ߬ ߏ߬ ߢߊߕߣߐ ߞߊߓߏ߬߸ ߣߴߌ ߦߋ߫ ߕߟߏߡߊߘߏ߲ ߠߊߓߊ߯ߙߊ ߟߊ߫ ߡߍ߲ ߞߘߎ߬ ߜߎ ߟߎ߬ ߕߍ߫ ߛߐ߲߬ - ߞߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߟߎ߬ ߖߛߐ߫ ߣߎߡߊ߲߫ ߖߍ߰ߙߍ ߞߍߟߌ ߕߏߟߏ߲ߟߊ߲߫ ߥߊ߲߬ߥߊ߲ ߞߌߣߌ߲߫ ߕߟߊ ߖߍ߰ߙߍ ߛߎߥߊ߲ߘߌ߫ ߞߌߣߌ߲߫ ߖߍ߰ߙߍ ߞߍߟߌ @@ -151,7 +150,6 @@ ߝߎ߬ߕߎ߲߬ߕߌ ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲߫ ߕߍ߫ ߦߋ߲߬ ߞߙߏ߬ߝߏ߫ ߝߎ߬ߕߎ߲߬ߕߌ - ߦߋߡߍ߲ߕߊ߫ ߛߘߌ߬ߜߋ߲߫ ߞߟߊ߬ߣߐ߮ ߡߊ߫ ߝߙߍߕߍߓߐ߫ ߟߊ߫ ߗߍߦߙߐ ߡߊ߫ ߛߋ߫ ߘߐߛߏ߯ߙߋ߫ ߟߊ߫ ߞߣߐߘߐ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߟߥߊ߬ߟߌ߬ߟߊ߲ ߓߘߊ߫ ߜߊߘߊ߲߫ @@ -207,7 +205,6 @@ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ ߓߍ߯ ߖߐ߬ߛߌ߫ ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲߫ ߞߊ߲߬ ߟߊ߬ߖߌ߰ߟߌ ߕߍ߫ ߓߍ߲߬. ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߘߌ߲߬ߞߌߙߊ ߢߡߊߛߊ߬ߦߌ߬ ؟ ߟߊ߬ߖߌ߰ߟߌ ߢߣߊߥߟߊ߫ ߕߍ߫ ߛߋ߫ ߘߐߛߌ߰ ߟߊ߫ - ߊ߬ ߟߊߛߊ߬ ߞߏߛߊ߫ ߞߏ߬ߋߞߏ߬ߋ ߟߎ߬ ߞߊߣߊ߬ ߖߛߐ߫߸ ߞߊ߬ ߟߐ߲ߕߊ ߣߌ߫ ߦߟߌߕߏߟߊ߲ ߡߊߞߐߙߐ߲ߞߐߙߐ߲߫. ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߘߌ߫ ߖߌ߬ߦߊ߬ߓߍ ߟߎ߬ ߦߟߌߡߊߛߌ ߓߍ߯ ߖߏ߬ߛߌ߫ ߦߟߌߕߏߟߊ߲ ߣߌ߫ ߝߘߍ߬ߜߍߟߍ߲ ߞߊ߲߬ ߞߊ߬ ߞߊ߲߬ߞߎߡߊ ߟߎ߫ ߦߌ߬ߘߊ߬ ߊ߬ ߟߊߛߊ߬ ߞߊ߬ ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߢߡߊߘߏ߲߰ ߞߊ߬ ߦߋߡߍ߲ߕߊ߫ ߣߊ߬ߕߊ ߟߎ߬ ߣߌ߫ ߢߐ߲߰ߘߐ ߟߎ߫ ߦߌ߬ߘߊ߬ @@ -385,7 +382,7 @@ ߞߟߏߘߋ߲߫ ߠߊߘߌ߬ߢߍ߬ߣߍ߲ ߠߎ߬ ߞߐߕߐ߯ ߕߐ߮ ߘߐ߫ ߞߟߏߘߋ߲߫ ߠߊߘߌ߬ߢߍ߬ߓߊߟߌ ߟߎ߫ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ߕߐ߫ ߡߐ߬ߟߐ߲ ߣߌ߬ ߠߋ߬ ߟߊ߫ ߣߘߐ߬ߓߌ߬ߟߊ߬ߟߌ߬ ߞߟߏߘߋ߲ - ߊ߬ ߓߘߊ߫ ߓߊ߲߫ + ߊ߬ ߓߘߊ߫ ߓߊ߲߫ ߟߊ߬ߖߌ߰ߟߌ ߟߊ߬ߘߌߢߍ ߟߎ߬ ߊ߬ ߡߊߝߍߣߍ߲߫ GitHub ߞߊ߲߬ @@ -520,7 +517,7 @@ ߊ߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߞߐߝߍ߫-ߦߙߍߞߍߟߌ ߓߘߊ߫ ߗߌߙߏ߲߫ ߣߌߎߔߌߔ ߘߊߕߎ߲߯ ߘߊ߫ ߟߋ߬ ߞߵߊ߬ ߕߘߍ߬ ߊ߬ ߦߋ߫ ߓߊ߯ߙߊ߫ ߟߊ߫ ߞߐߕߐ߮ ߞߊ߲߬ - ߜߍߞߣߍ߫ ߛߌ߫ ߕߍ߫ ߕߙߏߞߏ ߞߊ߲߬ + ߜߍߞߣߍ߫ ߛߌ߫ ߕߍ߫ ߕߙߏߞߏ ߞߊ߲߬ ߢߍߕߊ߮ ߓߘߊ߫ ߝߏ߫߸ ߓߊߏ߬ ߞߐߕߐ߮ ߓߘߊ߫ ߖߏ߬ߛߌ߫ ߟߊ߬ߖߌ߰ߟߌ ߣߌ߲߬ ߕߍ߫ ߛߋ߫ ߟߊߛߊ߬ߦߌ߬ ߟߊ߫ ߞߊ߬ ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߠߎ߬ ߖߏ߬ߛߌ߫ @@ -646,7 +643,6 @@ ߞߊ߲ ߞߐߞߘߐߓߌ߲ߓߌ߲ ߖߊ߬ߕߌ߮ - ߞߏ߬ߋߞߏ߬ߋ߫ ߛߘߌ߬ߜߋ߲ ߝߘߏ߬ߓߊ ߊ߬ ߛߙߍߘߍߦߊߣߍ߲߫ ߕߍ߫ ߘߎ߲߬ߘߎ߬ߡߊ diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index d440d8a89..6341e6700 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -58,7 +58,6 @@ Utilzar la recèrca rapida inexacta La recèrca inexacta permet a l\'utilizaire de recercar mai rapidament una posicion amb mens de precision Durada d\'avançada/reculada rapida - Cargar las miniaturas Afichar los comentaris Desactivar per afichar pas mai los comentaris Apondre la vidèo seguenta dins la coa de lectura diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 084f21ca2..331c3248c 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -18,7 +18,7 @@ ମୋଟ %d ମିନିଟ୍ ଆପ୍ ଭାଷା - ସ୍ୱୟଂଚାଳିତ (ଡିଭାଇସ୍ ଥିମ୍) + ସ୍ୱଚାଳିତ (ଡିଵାଇସ୍ ଥିମ୍) ଗୋପନୀୟତା ନାମ ବିବରଣୀ @@ -44,7 +44,7 @@ ଏଥିରେ ଖୋଲନ୍ତୁ ବାତିଲ୍ କରନ୍ତୁ ଦେଖାଯାଇଥିବା ପରି ଚିହ୍ନିତ କର - ସଞ୍ଚୟ କରନ୍ତୁ + ଡାଉନଲୋଡ୍ କରନ୍ତୁ ସେଟିଂ ତୁମେ ଏହା ଚାଂହ କି \"%1$s\"\? ଫାଇଲ୍ ଡାଉନଲୋଡ କରନ୍ତୁ @@ -83,7 +83,7 @@ ଡିଫଲ୍ଟ ରେଜୋଲୁସନ କୋଡି ସହିତ ଖୋଲନ୍ତୁ ଦ୍ୱିତୀୟ କୃତ୍ୟ ବଟନ୍ - ପୁନରାବୃତ୍ତି କରନ୍ତୁ + ପୁନର୍ବାର କରନ୍ତୁ ବିଜ୍ଞପ୍ତିକୁ ରଙ୍ଗ କରନ୍ତୁ ପପ୍ଅପ୍ ର ଶେଷ ଆକାର ଏବଂ ସ୍ଥିତି ମନେରଖ ଦ୍ରୁତ ନିଷ୍କ୍ରିୟ ସନ୍ଧାନ ବ୍ୟବହାର କରନ୍ତୁ @@ -101,7 +101,6 @@ ଏକ ଧାଡି ସଫା କରିବା ପୂର୍ବରୁ ନିଶ୍ଚିତକରଣ ମାଗନ୍ତୁ ଗୋଟିଏ ଖେଳାଳୀରୁ ଅନ୍ୟ ଖେଳାଳୀକୁ ପରିବର୍ତ୍ତନ କରିବା ଆପଣଙ୍କ ଧାଡି ବଦଳାଇପାରେ ସକ୍ରିୟ ପ୍ଲେୟାର କ୍ୟୁ ବଦଳାଯିବ - ଥମ୍ୱନେଲ୍ ଲୋଡ୍ କରନ୍ତୁ \'ପରବର୍ତ୍ତୀ\' ଏବଂ \'ସମାନ\' ଭିଡିଓଗୁଡିକ ଦେଖାନ୍ତୁ ବର୍ଣ୍ଣନା ଦେଖାନ୍ତୁ ପ୍ରତିଛବି କ୍ୟାଚ୍ ପୋଛି ଦିଆଗଲା @@ -148,8 +147,7 @@ ବ୍ୟବହାର ଵିଡ଼ିଓ ଓ ଅଡ଼ିଓ ମିନି ପ୍ଲେୟାରରେ ଭିଡିଓ ଆରମ୍ଭ କରନ୍ତୁ ନାହିଁ, କିନ୍ତୁ ଅଟୋ ଘୂର୍ଣ୍ଣନ ବନ୍ଦ ହୋଇଗଲେ ସିଧାସଳଖ ଫୁଲ୍ ସ୍କ୍ରିନ୍ ମୋଡ୍ କୁ ଯାଆନ୍ତୁ। ଫୁଲ୍ ସ୍କ୍ରିନ୍ ଛାଡି ଆପଣ ଏପର୍ଯ୍ୟନ୍ତ ମିନି ପ୍ଲେୟାରକୁ ପ୍ରବେଶ କରିପାରିବେ - ଏହା ଉପରେ ଟ୍ୟାପ୍ କରି ନିମ୍ନରେ ପ୍ରତ୍ୟେକ ବିଜ୍ଞପ୍ତି କାର୍ଯ୍ୟ ସଂପାଦନ କରନ୍ତୁ। ଡାହାଣରେ ଥିବା ଚେକ୍ ବକ୍ସ ବ୍ୟବହାର କରି କମ୍ପାକ୍ଟ ବିଜ୍ଞପ୍ତିରେ ଦେଖାଯିବାକୁ ସେମାନଙ୍କ ମଧ୍ୟରୁ ତିନୋଟି ପର୍ଯ୍ୟନ୍ତ ଚୟନ କରନ୍ତୁ - ଥମ୍ବନେଲ ଲୋଡିଂ, ଡାଟା ଏବଂ ମେମୋରୀ ବ୍ୟବହାରକୁ ରୋକିବା ପାଇଁ ବନ୍ଦ କରନ୍ତୁ । ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ଉଭୟ ଇନ-ମେମୋରୀ ଏବଂ ଅନ୍-ଡିସ୍କ ଇମେଜ୍ କ୍ୟାଚ୍ ସଫା କରେ + ଏହା ଉପରେ ଟ୍ୟାପ କରି ନିମ୍ନରେ ଦିଆଯାଇଥିବା ପ୍ରତ୍ୟେକ ବିଜ୍ଞପ୍ତି କାର୍ଯ୍ୟକୁ ସମ୍ପାଦନ କରନ୍ତୁ । ଡାହାଣ ପଟେ ଥିବା ଚେକବକ୍ସଗୁଡ଼ିକୁ ବ୍ୟବହାର କରି କମ୍ପାକ୍ଟ ବିଜ୍ଞପ୍ତିରେ ଦର୍ଶାଇବା ପାଇଁ ସେଗୁଡ଼ିକ ମଧ୍ୟରୁ ତିନିଟି ଚୟନ କରନ୍ତୁ । ଷ୍ଟ୍ରିମ୍ ସୃଷ୍ଟିକର୍ତ୍ତା, ଷ୍ଟ୍ରିମ୍ ବିଷୟବସ୍ତୁ କିମ୍ବା ଏକ ସନ୍ଧାନ ଅନୁରୋଧ ବିଷୟରେ ଅତିରିକ୍ତ ସୂଚନା ସହିତ ମେଟା ସୂଚନା ବାକ୍ସଗୁଡ଼ିକୁ ଲୁଚାଇବାକୁ ବନ୍ଦ କରନ୍ତୁ ପିଲାମାନଙ୍କ ପାଇଁ ସମ୍ଭବତ content ଅନୁପଯୁକ୍ତ ବିଷୟବସ୍ତୁ ଦେଖାନ୍ତୁ କାରଣ ଏହାର ବୟସ ସୀମା ଅଛି (ଯେପରିକି 18+) ଏହି ଭିଡିଓ ବୟସ-ସୀମିତ ଅଟେ । @@ -204,7 +202,7 @@ ସଦସ୍ୟତା ରଦ୍ଦ କରନ୍ତୁ ଚ୍ୟାନେଲ ସଦସ୍ୟତା ରଦ୍ଦ ହେଲା ସଦସ୍ୟତା ପରିବର୍ତ୍ତନ କରିପାରିଲା ନାହିଁ - ସୂଚନା ଦେଖାନ୍ତୁ + ସୂଚନା ଦେଖାଅ ଏଥିରେ ଯୋଡ଼ିବା ଡିଫଲ୍ଟ ପପ୍ଅପ୍ ରେଜୋଲୁସନ କେବଳ କିଛି ଡିଭାଇସ୍ 2K / 4K ଭିଡିଓ ଚଲାଇ ପାରିବେ @@ -216,7 +214,7 @@ ପଞ୍ଚମ କୃତ୍ୟ ବଟନ୍ ଶଫଲ୍ ବଫରିଂ - କିଛି ନୁହେଁ + କିଛି ନାହିଁ ଡିଫଲ୍ଟ ଭିଡିଓ ଫର୍ମାଟ୍ ପପ୍ଅପ୍ ଗୁଣଗୁଡିକ ମନେରଖ ପ୍ରକ୍ରିୟାକରଣ… କିଛି ସମୟ ନେଇପାରେ @@ -306,7 +304,7 @@ କ୍ଲିପବୋର୍ଡରେ କପି କରାଯାଇଛି 1 ଆଇଟମ୍ ଡିଲିଟ୍ ହୋଇଛି । reCAPTCHA ଆହ୍ୱାନ - ସମାପ୍ତ + ସମାପ୍ତ ଡାଉନଲୋଡ୍ କରନ୍ତୁ ଅବୈଧ ବର୍ଣ୍ଣଗୁଡିକ ଏହି ମୂଲ୍ୟ ସହିତ ବଦଳାଯାଏ ପ୍ରତିସ୍ଥାପନ ବର୍ଣ୍ଣ @@ -380,7 +378,7 @@ ପ୍ରଗତି ହଜିଗଲା, କାରଣ ଫାଇଲ୍ ଡିଲିଟ୍ ହେଲା ପରବର୍ତ୍ତୀ ପ୍ରକ୍ରିୟାକରଣ ବିଫଳ ହେଲା ଫାଇଲରେ କାମ କରିବାବେଳେ ନ୍ୟୁ ପାଇପ୍ ବନ୍ଦ ହୋଇଯାଇଥିଲା - ଡିଭାଇସରେ କୌଣସି ସ୍ଥାନ ବାକି ନାହିଁ + ଡିଭାଇସରେ କୌଣସି ସ୍ଥାନ ବାକି ନାହିଁ ଡିସ୍କରୁ ସମସ୍ତ ଡାଉନଲୋଡ୍ ହୋଇଥିବା ଫାଇଲଗୁଡ଼ିକୁ ଲିଭାନ୍ତୁ\? ବନ୍ଦ କର ସର୍ବାଧିକ ପୁନଃଚେଷ୍ଟା @@ -421,7 +419,6 @@ ଟୋଗଲ୍ ସେବା, ବର୍ତ୍ତମାନ ମନୋନୀତ: ଫେରସ୍ତ କର ଓଭର୍ ରାଇଟ୍ କରନ୍ତୁ - ଥମ୍ବନେଲ୍ URL ହୋଷ୍ଟ ସାର୍ଵଜନୀନ ତାଲିକାଭୁକ୍ତ ନୁହେଁ @@ -518,7 +515,6 @@ ସମସ୍ତ ପ୍ଲେକ୍ ପୋଜିସନ୍ ବିଲୋପ କରିବେ କି\? ସନ୍ଧାନ କୀ ଶବ୍ଦର ଇତିହାସ ବିଲୋପ କରେ ତ୍ରୁଟି - ଭିଡିଓ URL ଦସ୍ତଖତକୁ ଡିବଫସ୍କେଟ୍ କରିପାରିଲା ନାହିଁ ପୁନରୁଦ୍ଧାର ନ ହୋଇପାରିଲା ପରି ପ୍ଲେୟାର ତ୍ରୁଟି ଘଟିଲା ବହିଃ-ଚାଳକ ଏଭଳି ଲିଙ୍କ୍ ସମର୍ଥନ କରେନି ଫାଇଲ୍ ଘୁଞ୍ଚିଗଲା କିମ୍ବା ଡିଲିଟ୍ ହେଲା @@ -766,4 +762,55 @@ \nଏହି ବିକଳ୍ପକୁ ସକ୍ରିୟ କରିବା ସାମ୍ପ୍ରତିକ ଭିଡିଓ ପ୍ଲେୟାରକୁ ବଦଳାଇବା କିମ୍ବା ସମ୍ପୂର୍ଣ୍ଣ ପରଦାକୁ ପରିବର୍ତ୍ତନ କରିବା ସମୟରେ ପ୍ଲେବ୍ୟାକ ତ୍ରୁଟିକୁ ପ୍ରତିରୋଧ କରିପାରେ କୌଣସି ସ୍ରୋତ ନାହିଁ କୌଣସି ଲାଇଭ ଷ୍ଟ୍ରିମ୍ ନାହିଁ + ପ୍ରତିଛବି ଗୁଣବତ୍ତା + ଭିଡିଓଗୁଡିକ + \? + ଗ୍ରାହକଗଣ + ଚ୍ୟାନେଲ ପୃଷ୍ଠାଗୁଡ଼ିକରେ କେଉଁ ଟ୍ୟାବଗୁଡ଼ିକ ଦେଖାଯାଏ + ଚ୍ୟାନେଲ ଟ୍ୟାବଗୁଡ଼ିକ + ସର୍ଟସ୍ + ମେଟାଡାଟା ଧାରଣ କରୁଅଛି… + ସ୍କ୍ରିନ୍ ଆରିଏଣ୍ଟେସନ୍ ଟୋଗଲ୍ କରନ୍ତୁ + ନିମ୍ନମାନର + ଫୁଲ୍ ସ୍କ୍ରିନ୍ ଟୋଗଲ୍ କରନ୍ତୁ + ଚ୍ୟାନେଲ ଟ୍ୟାବଗୁଡ଼ିକୁ ଆଣନ୍ତୁ + ଅବତାର + ପରବର୍ତ୍ତୀ ଷ୍ଟ୍ରିମ୍ + ଉପ-ଚାନେଲ ଅବତାରଗୁଡ଼ିକ + ଖେଳ ଧାଡ଼ି ଖୋଲନ୍ତୁ + ପ୍ରତିଛବିଗୁଡ଼ିକୁ ଧାରଣ କରନ୍ତୁ ନାହିଁ + ଉଚ୍ଚ ଗୁଣବତ୍ତା + ବିଷୟରେ + ଆଗକୁ + ଆଲବମ୍ + ପୁନରାବୃତ୍ତି କରନ୍ତୁ + ପୁନର୍ବାର ଚଲାନ୍ତୁ + ଫିଡକୁ ଅଦ୍ୟତନ କରିବା ସମୟରେ ଆଣିବା ପାଇଁ ଟ୍ୟାବଗୁଡ଼ିକ । ଫାଷ୍ଟ ମୋଡ ବ୍ୟବହାର କରି ଚ୍ୟାନେଲକୁ ଅଦ୍ୟତନ କରାଗଲେ ଏହି ବିକଳ୍ପର କୌଣସି ପ୍ରଭାବ ପଡ଼ିବ ନାହିଁ । + ମଧ୍ୟମ ଗୁଣବତ୍ତା + ଅପଲୋଡର ଅବତାରଗୁଡ଼ିକ + ବ୍ୟାନରଗୁଡିକ + ପ୍ଲେଲିଷ୍ଟଗୁଡିକ + ତଥ୍ୟ ଏବଂ ସ୍ମୃତିଶକ୍ତି ବ୍ୟବହାରକୁ ହ୍ରାସ କରିବା ପାଇଁ ପ୍ରତିଛବିଗୁଡ଼ିକର ଗୁଣବତ୍ତା ଏବଂ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ପ୍ରତିଛବିଗୁଡ଼ିକୁ ଧାରଣ କରିବା ଉଚିତ କି ନୁହଁ ବାଛନ୍ତୁ । ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ସ୍ମରଣୀୟ ଏବଂ ଡିସ୍କ ପ୍ରତିଛବି କ୍ୟାଶେ ଉଭୟକୁ ସଫା କରିଥାଏ — %s + ଚଲାନ୍ତୁ + ଅଧିକ ବିକଳ୍ପ + ଥମ୍ବନେଲଗୁଡିକ + ଟ୍ରାକଗୁଡିକ + ଅବଧି + ଚ୍ୟାନେଲଗୁଡିକ + ପୂର୍ବ ଷ୍ଟ୍ରିମ୍ + ଲାଇଭ୍ + URL ତାଲିକା ସହଭାଗ କରନ୍ତୁ + ଶୀର୍ଷକଗୁଡ଼ିକ ସହିତ ଅଂଶୀଦାର କରନ୍ତୁ + %1$s +\n%2$s + ଖେଳ ତାଲିକା ସହଭାଗ କରନ୍ତୁ + ପ୍ଲେ-ଲିଷ୍ଟ ନାମ ଏବଂ ଭିଡିଓ ଶୀର୍ଷକ କିମ୍ବା ଭିଡିଓ URLଗୁଡ଼ିକର ଏକ ସରଳ ତାଲିକା ଭାବରେ ବିବରଣୀ ସହିତ ପ୍ଲେ-ଲିଷ୍ଟ ଅଂଶୀଦାର କରନ୍ତୁ + - %1$s: %2$s + ଅଧିକ ଦର୍ଶାନ୍ତୁ + ଏହା ଉପରେ ଟ୍ୟାପ କରି ନିମ୍ନରେ ଦିଆଯାଇଥିବା ପ୍ରତ୍ୟେକ ବିଜ୍ଞପ୍ତି କାର୍ଯ୍ୟକୁ ସମ୍ପାଦନ କରନ୍ତୁ । ପ୍ରଥମ ତିନୋଟି କାର୍ଯ୍ୟ (ଖେଳ/ବିରତି, ପୂର୍ବବର୍ତ୍ତୀ ଏବଂ ପରବର୍ତ୍ତୀ) ତନ୍ତ୍ର ଦ୍ୱାରା ସେଟ କରାଯାଇଥାଏ ଏବଂ ଏହାକୁ ଇଚ୍ଛାରୂପଣ କରାଯାଇପାରିବ ନାହିଁ । + + %s ଉତ୍ତର + %s ଉତ୍ତରଗୁଡ଼ିକ + + କମ୍ ଦର୍ଶାନ୍ତୁ \ No newline at end of file diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index 534ac790f..0233bbc8b 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -38,7 +38,6 @@ گوڑی اگے لنگھاؤݨ یا پچھے کرن دی سماں معد سرگرم پکیئر کتار جاوےگا - تھمنیل لوڈ کرو کتار نوں خالی کرن توں پہلاں تصویر کرن لئی پچھو ٹپݨیاں وکھاؤݨا روکݨ لئی ایسنوں بند کرو ٹپݨیاں دِکھاؤ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index a10ddd125..e34469eb1 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -11,7 +11,7 @@ ਸਾਂਝਾ ਕਰੋ ਡਾਊਨਲੋਡ ਕਰੋ ਸਟ੍ਰੀਮ ਫ਼ਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ - ਲੱਭੋ + ਖੋਜ ਕਰੋ ਸੈਟਿੰਗਾਂ ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਸੀ \"%1$s\"\? ਇਸ ਨਾਲ਼ ਸਾਂਝਾ ਕਰੋ @@ -23,7 +23,7 @@ ਚੈਨਲ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਹੋ ਗਿਆ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਬਦਲਣ ਵਿੱਚ ਨਾਕਾਮੀ ਜਾਣਕਾਰੀ ਵਿਖਾਓ - ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਅਪਡੇਟ ਕਰਨ ਵਿੱਚ ਨਾਕਾਮੀ + ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਅੱਪਡੇਟ ਕਰਨ ਵਿੱਚ ਨਾਕਾਮੀ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਬੁੱਕਮਾਰਕ ਕੀਤੀਆਂ ਪਲੇ-ਸੂਚੀਆਂ ਨਵਾਂ ਕੀ ਹੈ @@ -48,15 +48,13 @@ ਡੀਫ਼ਾਲਟ ਆਡੀਓ ਫ਼ਾਰਮੈਟ ਡੀਫ਼ਾਲਟ ਵੀਡੀਓ ਫ਼ਾਰਮੈਟ ਥੀਮ - ਸਫੈਦ - ਗੂੜਾ - ਕਾਲ੍ਹਾ + ਸਫ਼ੈਦ + ਗੂੜ੍ਹਾ + ਕਾਲ਼ਾ ਪੌਪ-ਅਪ ਦਾ ਆਕਾਰ ਅਤੇ ਸਥਿਤੀ ਯਾਦ ਰੱਖੋ ਪੌਪ-ਅਪ ਦਾ ਆਖਰੀ ਅਕਾਰ ਅਤੇ ਸਥਿਤੀ ਯਾਦ ਰੱਖੋ ਤੇਜ਼ ਪਰ ਅਸਪੱਸ਼ਟ ਸੀਕ ਵਰਤੋ ਅਸਪੱਸ਼ਟ ਸੀਕ ਵੀਡੀਓ ਨੂੰ ਤੇਜ਼ ਪਰ ਅਣ-ਸਟੀਕ ਢੰਗ ਨਾਲ ਅੱਗੇ-ਪਿੱਛੇ ਲਿਜਾਂਦਾ ਹੈ । ਇਸ ਨਾਲ ਅੱਗੇ-ਪਿੱਛੇ 5,15 ਜਾਂ 25 ਸਕਿੰਟ ਜਾਣਾ ਕੰਮ ਨਹੀਂ ਕਰੇਗਾ - ਥੰਮਨੇਲ ਲੋਡ ਕਰੋ - ਡਾਟਾ ਤੇ ਮੈਮੋਰੀ ਖਪਤ ਦੀ ਬੱਚਤ ਅਤੇ ਥੰਮਨੇਲ ਲੋਡ ਹੋਣ ਤੋਂ ਰੋਕਣ ਲਈ ਬੰਦ ਕਰੋ। ਇਸ ਵਿਚ ਤਬਦੀਲੀ ਕਰਨ ਨਾਲ ਇਨ-ਮੈਮੋਰੀ ਅਤੇ ਆਨ-ਡਿਸਕ ਚਿੱਤਰ ਕੈਸ਼ੇ ਦੋਵੇਂ ਮਿਟ ਜਾਣਗੇ ਚਿੱਤਰ cache ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ ਕੈਸ਼ ਕੀਤਾ ਮੈਟਾ-ਡਾਟਾ ਮਿਟਾਓ ਸਾਰੇ ਕੈਸ਼ ਕੀਤੇ ਵੈੱਬ-ਪੇਜਾਂ ਦਾ ਡਾਟਾ ਮਿਟਾਓ @@ -65,7 +63,7 @@ ਇੱਕ ਮੁੱਕਣ ਵਾਲੀ ਪਰ ਨਾ-ਦੁਹਰਾਉਣ ਵਾਲੀ ਕਤਾਰ ਨੂੰ, ਸੰਬੰਧਤ ਸਟ੍ਰੀਮ ਜੋੜਦਿਆਂ, ਚਲਾਉਂਦੇ ਜਾਓ ਖੋਜ ਸੁਝਾਅ ਖੋਜ ਕਰਨ ਵੇਲੇ ਵਿਖਾਏ ਜਾਂਦੇ ਸੁਝਾਵਾਂ ਦੀ ਚੋਣ ਕਰੋ - ਖੋਜ ਇਤਿਹਾਸ ਨੂੰ ਵੇਖੋ + ਖੋਜ ਇਤਿਹਾਸ ਖੋਜ ਇਤਲਾਹਾਂ ਨੂੰ ਸਥਾਨਕ ਤੌਰ ਤੇ ਸਟੋਰ ਕਰੋ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦੀ ਸੂਚੀ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦੀ ਸੂਚੀ ਰੱਖੋ @@ -76,7 +74,7 @@ \"ਜੋੜਨ ਲਈ ਬਟਨ ਦਬਾ ਕੇ ਰੱਖੋ\" ਵਿਖਾਓ ਵੀਡੀਓ ਦੇ ਵੇਰਵੇ ਪੰਨੇ \'ਤੇ ਬੈਕਗ੍ਰਾਉਂਡ ਜਾਂ ਪੌਪ-ਅਪ ਬਟਨ ਨੱਪਣ \'ਤੇ ਸੁਝਾਅ ਵਿਖਾਓ ਅਣ-ਸਹਾਇਕ URL - ਮੂਲ ਦੇਸ਼ + ਸਮੱਗਰੀ ਦਾ ਮੂਲ ਦੇਸ਼ ਪਲੇਅਰ ਵਿਵਹਾਰ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ @@ -115,12 +113,11 @@ ਕੀ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇ\? ਖੋਜ ਸੂਚੀ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾਓ ਖੋਜ ਸ਼ਬਦਾਂ ਦੀ ਸੂਚੀ ਮਿਟਾਉਂਦਾ ਹੈ - ਕੀ ਸਾਰੀ ਖੋਜ ਸੂਚੀ ਮਿਟਾ ਦਿਤੀ ਜਾਵੇ \? - ਖੋਜ ਸੂਚੀ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾ ਦਿਤਾ ਗਿਆ + ਕੀ ਸਾਰੀ ਖੋਜ ਸੂਚੀ ਮਿਟਾ ਦਿੱਤੀ ਜਾਵੇ \? + ਖੋਜ ਸੂਚੀ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਤਰੁੱਟੀ ਨੈੱਟਵਰਕ ਤਰੁੱਟੀ ਸਾਰੇ ਥੰਮਨੇਲ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੇ - ਵੀਡੀਓ URL ਦਸਤਖਤ ਦੀ ਅਸਪੱਸ਼ਟਤਾ ਦੂਰ ਨਹੀਂ ਹੋ ਸਕੀ ਵੈਬਸਾਈਟ parse ਨਹੀਂ ਹੋ ਸਕੀ ਸਮੱਗਰੀ ਉਪਲਬਧ ਨਹੀਂ ਹੈ ਡਾਊਨਲੋਡ ਮੀਨੂੰ ਸੈਟ-ਅਪ ਨਹੀਂ ਹੋ ਸਕਿਆ @@ -158,13 +155,13 @@ ਦੋਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਹਜ਼ਾਰ ਮਿਲੀਅਨ - ਬਿਲੀਅਨ + ਅਰਬ ਕੋਈ ਸਬਸਕ੍ਰਾਈਬਰ ਨਹੀਂ %s ਸਬਸਕ੍ਰਾਈਬਰ %s ਸਬਸਕ੍ਰਾਈਬਰ - ਕੋਈ ਵਿਊਜ਼ ਨਹੀਂ + ਕੋਈ ਵਿਊ ਨਹੀਂ %s ਵਿਊ %s ਵਿਊਜ਼ @@ -179,14 +176,14 @@ ਬਣਾਓ ਮਿਟਾਓ ਚੈੱਕ-ਸਮ - ਬਰਖਾਸਤ ਕਰੋ + ਖਾਰਿਜ ਕਰੋ ਨਾਮ ਬਦਲੋ ਠੀਕ ਹੈ ਫਾਈਲ ਦਾ ਨਾਮ ਥਰੈੱਡ ਤਰੁੱਟੀ ਨਿਊਪਾਈਪ ਡਾਊਨਲੋਡ ਕਰ ਰਹੀ ਹੈ - ਵੇਰਵਿਆਂ ਲਈ ਖੋਲੋ + ਵੇਰਵਿਆਂ ਲਈ ਟੈਪ ਕਰੋ ਕ੍ਰਿਪਾ ਕਰਕੇ ਉਡੀਕ ਕਰੋ… ਕਲਿਪ-ਬੋਰਡ ਵਿੱਚ ਕਾਪੀ ਹੋ ਗਿਆ ਹੈ ਬਾਅਦ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਵਿਚੋਂ ਇੱਕ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਨੂੰ ਚੁਣੋ @@ -201,12 +198,12 @@ ਵਟਾਂਦਰਾ ਚਿੰਨ ਅੱਖਰ ਅਤੇ ਅੰਕ ਬਹੁਤੇ ਖ਼ਾਸ ਅੱਖਰ - ਨਿਊਪਾਈਪ ਬਾਰੇ + ਨਿਊਪਾਈਪ ਬਾਰੇ ਵਿੱਚ ਜਾਣੋ ਤੀਜੀ ਧਿਰ ਦੇ ਲਾਈਸੈਂਸ - © %1$s ਵਲੋਂ %2$s, %3$s ਅਧੀਨ + %2$s ਵੱਲੋਂ © %1$s , %3$s ਅਧੀਨ ਐਪ ਬਾਰੇ ਤੇ ਆਮ ਸਵਾਲ ਲਾਈਸੈਂਸ - ਐਂਡਰਾਇਡ ਤੇ ਮੁਫ਼ਤ ਹਲਕੀ-ਫੁਲਕੀ ਸਟ੍ਰੀਮਿੰਗ। + ਐਂਡਰਾਇਡ ਦੇ ਲਈ ਹਲਕੀ ਅਤੇ ਮੁਫ਼ਤ ਸਟ੍ਰੀਮਿੰਗ ਐਪਲੀਕੇਸ਼ਨ। ਯੋਗਦਾਨ ਪਾਓ ਭਾਵੇਂ ਤੁਹਾਡੇ ਕੋਲ ਵਿਚਾਰ ਹਨ; ਅਨੁਵਾਦ, ਡਿਜ਼ਾਈਨ ਬਦਲਾਵ, ਕੋਡ ਦੀ ਸਫਾਈ, ਜਾਂ ਅਸਲ ਭਾਰੀ ਕੋਡ ਬਦਲਾਵ — ਹਰ ਮਦਦ ਦਾ ਸਦਾ ਸਵਾਗਤ ਹੈ। ਜਿੰਨਾ ਇਸ ਨੂੰ ਜ਼ਿਆਦਾ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਉੱਨਾ ਹੀ ਇਹ ਬਿਹਤਰ ਹੁੰਦਾ ਹੈ! ਗਿਟਹੱਬ ਤੇ ਵੇਖੋ @@ -220,7 +217,7 @@ ਲਾਈਸੈਂਸ ਪੜ੍ਹੋ ਇਤਿਹਾਸ ਇਤਿਹਾਸ - ਕੀ ਤੁਸੀਂ ਇਸ ਚੀਜ਼ ਨੂੰ ਖੋਜ-ਸੂਚੀ ਦੇ ਇਤਿਹਾਸ ਵਿੱਚੋਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਖੋਜ ਇਤਿਹਾਸ ਵਿੱਚੋਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? ਆਖਰੀ ਚਲਾਈ ਗਈ ਸਭ ਤੋਂ ਜਿਆਦਾ ਚਲਾਈ ਗਈ ਮੁੱਖ ਪੰਨੇ ਦੀ ਸਮੱਗਰੀ @@ -235,7 +232,7 @@ ਕੋਈ ਵੈਧ ZIP ਫਾਈਲ ਨਹੀਂ ਹੈ ਚੇਤਾਵਨੀ: ਸਾਰੀਆਂ ਫਾਈਲਾਂ ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ। ਇਹ ਤੁਹਾਡੇ ਮੌਜੂਦਾ ਸੈਟ-ਅਪ ਨੂੰ ਓਵਰ-ਰਾਈਡ ਕਰ ਦੇਵੇਗਾ। - ਰੁਝਾਨ ਵਿੱਚ + ਫਿਲਹਾਲ ਰੁਝਾਨ ਵਿੱਚ ਹੈ ਸਿਖਰਲੇ 50 ਨਵੇਂ ਅਤੇ ਤਾਜ਼ਾ-ਤਰੀਨ ਹਟਾਓ @@ -246,7 +243,7 @@ ਪੌਪ-ਅਪ ਵਿੱਚ ਚਲਾਉਣਾ ਸ਼ੁਰੂ ਕਰੋ ਡਰਾਅਰ ਖੋਲੋ ਡਰਾਅਰ ਬੰਦ ਕਰੋ - ਤਰਜੀਹੀ \'ਖੋਲ੍ਹੋ\' ਐਕਸ਼ਨ + \'ਖੋਲ੍ਹਣ\' ਤੇ ਤਰਜੀਹੀ ਐਕਸ਼ਨ ਸਮੱਗਰੀ ਖੋਲ੍ਹਣ ਸਮੇਂ ਡਿਫ਼ਾਲਟ ਕਾਰਵਾਈ — %s ਵੀਡੀਓ ਪਲੇਅਰ ਬੈਕਗ੍ਰਾਊਂਡ ਪਲੇਅਰ @@ -257,9 +254,9 @@ ਨਵੀਂ ਪਲੇ-ਲਿਸਟ ਨਾਮ ਬਦਲੋ ਨਾਮ - ਪਲੇ-ਸੂਚੀ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ + ਪਲੇ-ਸੂਚੀ ਵਿੱਚ ਜੋੜ੍ਹੋ ਬਤੌਰ ਪਲੇ-ਸੂਚੀ ਥੰਮਨੇਲ ਸੈੱਟ ਕਰੋ - ਬੁੱਕਮਾਰਕ ਪਲੇ-ਲਿਸਟ + ਪਲੇ-ਲਿਸਟ ਬੁੱਕਮਾਰਕ ਕਰੋ ਬੁੱਕਮਾਰਕ ਹਟਾਓ ਇਸ ਪਲੇ-ਲਿਸਟ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ\? ਪਲੇ-ਲਿਸਟ ਬਣਾਈ ਗਈ @@ -274,10 +271,10 @@ ਪਲੇਅਰ ਕੈਪਸ਼ਨ, ਟੈਕਸਟ ਸਕੇਲ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਸਟਾਈਲ ਨੂੰ ਬਦਲੋ। ਪ੍ਰਭਾਵੀ ਕਰਨ ਲਈ ਐਪ ਨੂੰ ਮੁੜ ਚਾਲੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ ਮੈਮੋਰੀ ਲੀਕ ਨਿਗਰਾਨੀ, ਐਪ ਨੂੰ ਆਕ੍ਰਿਆਸ਼ੀਲ ਬਣਾ ਸਕਦੀ ਹੈ ਜਦੋਂ ਹੀਪ ਡੰਪਿੰਗ ਹੁੰਦੀ ਹੈ ਚੱਕਰ ਤੋਂ ਬਾਹਰ ਤਰੁੱਟੀਆਂ ਰਿਪੋਰਟ ਕਰੋ - ਨਿਪਟਾਰੇ ਦੇ ਬਾਅਦ ਫਰੈਗਮੈਂਟ ਜਾਂ ਐਕਟੀਵਿਟੀ ਦੇ ਚੱਕਰ ਤੋਂ ਬਾਹਰ ਨਾ ਪਹੁੰਚਾਉਣ ਯੋਗ ਆਰ-ਐਕਸ ਅਪਵਾਦਾਂ ਬਾਰੇ ਜ਼ਬਰੀ ਰਿਪੋਰਟ ਕਰਨਾ + ਨਿਪਟਾਰੇ ਦੇ ਬਾਅਦ ਫਰੈਗਮੈਂਟ ਜਾਂ ਐਕਟੀਵਿਟੀ ਦੇ ਚੱਕਰ ਤੋਂ ਬਾਹਰ ਨਾ ਪਹੁੰਚਾਉਣ ਯੋਗ ਆਰ-ਐਕਸ ਅਪਵਾਦਾਂ ਬਾਰੇ ਜ਼ਬਰੀ ਰਿਪੋਰਟ ਕਰੋ ਇੰਪੋਰਟ - ਇੰਪੋਰਟ ਕਰੋ - ਐਕਸਪੋਰਟ ਕਰੋ + ਤੋਂ ਇੰਪੋਰਟ ਕਰੋ + ਤੇ ਐਕਸਪੋਰਟ ਕਰੋ ਇੰਪੋਰਟ ਹੋ ਰਿਹਾ ਹੈ… ਐਕਸਪੋਰਟ ਹੋ ਰਿਹਾ ਹੈ… ਇੰਪੋਰਟ ਫਾਈਲ @@ -321,8 +318,8 @@ ਐਪ ਸਵਿੱਚ ਕਰਨ ਤੇ ਮਿਨੀਮਾਈਜ਼ ਕਰੋ ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਤੋਂ ਦੂਜੇ ਐਪ \'ਤੇ ਜਾਣ ਵੇਲ਼ੇ ਕਾਰਵਾਈ — %s ਕੋਈ ਨਹੀਂ - ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਮਿਨੀਮਾਈਜ਼ ਕਰੋ - ਪੌਪ-ਅਪ ਪਲੇਅਰ ਵਿੱਚ ਮਿਨੀਮਾਈਜ਼ ਕਰੋ + ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਵਿੱਚ ਬਦਲੋ + ਪੌਪ-ਅਪ ਪਲੇਅਰ ਵਿੱਚ ਬਦਲੋ ਚੁੱਪ ਦੌਰਾਨ ਤੇਜ਼ੀ ਨਾਲ ਅੱਗੇ ਕਰੋ ਕਦਮ ਰੀਸੈੱਟ @@ -332,35 +329,35 @@ ਯੂਜ਼ਰਸ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ ਟੈਬ ਚੁਣੋ - ਮੂਲ ਭਾਸ਼ਾ ਸਮੱਗਰੀ - ਅਪਡੇਟਾਂ + ਸਮੱਗਰੀ ਦੀ ਮੂਲ ਭਾਸ਼ਾ + ਅੱਪਡੇਟਾਂ ਫਾਈਲ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ ਐਪ ਅੱਪਡੇਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਵੇਂ ਨਿਊਪਾਈਪ ਸੰਸਕਰਣਾਂ ਲਈ ਪ੍ਰਾਪਤ ਸੂਚਨਾਵਾਂ ਬਾਹਰੀ ਸਟੋਰੇਜ ਉਪਲਬਧ ਨਹੀਂ ਹੈ - ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਡਾਊਨਲੋਡ ਕਰਨਾ ਸੰਭਵ ਨਹੀਂ ਹੈ। ਕੀ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਦੀ ਸਥਿਤੀ ਨੂੰ ਰੀਸੈਟ ਕੀਤਾ ਜਾਵੇ \? + ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਡਾਊਨਲੋਡ ਕਰਨਾ ਸੰਭਵ ਨਹੀਂ ਹੈ। ਕੀ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਦੀ ਸਥਿਤੀ ਨੂੰ ਰੀਸੈਟ ਕੀਤਾ ਜਾਵੇ \? ਸਾਂਭੀਆਂ ਟੈਬਾਂ ਨਹੀਂ ਪੜ੍ਹ ਹੋਈਆਂ, ਇਸ ਲਈ ਡਿਫਾਲਟ ਟੈਬਾਂ ਦੀ ਵਰਤੋਂ ਹੋ ਰਹੀ ਹੈ ਡੀਫ਼ਾਲਟ ਮੁੜ-ਸਥਾਪਿਤ ਕਰੋ ਕੀ ਤੁਸੀਂ ਡਿਫਾਲਟ ਮੁੜ-ਸਥਾਪਿਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ\? ਸਬਸਕ੍ਰਾਈਬਰਾਂ ਦੀ ਗਿਣਤੀ ਅਣ-ਉਪਲਬਧ ਮੁੱਖ ਪੰਨੇ ਤੇ ਕਿਹੜੇ ਟੈਬ ਵਿਖਾਏ ਜਾਣਗੇ - ਅਪਡੇਟਾਂ - ਜਦੋਂ ਨਵਾਂ ਸੰਸਕਰਣ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ ਤਾਂ ਐਪ ਅੱਪਡੇਟ ਕਰਨ ਨੂੰ ਪੁੱਛਣ ਲਈ ਇੱਕ ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿਖਾਓ - ਲਿਸਟ ਵਿਊ ਮੋਡ - ਲਿਸਟ + ਅੱਪਡੇਟਾਂ + ਜਦੋਂ ਐਪ ਦੀ ਨਵੀਂ ਅੱਪਡੇਟ ਉਪਲੱਬਧ ਹੋਵੇ ਤਾਂ ਅੱਪਡੇਟ ਕਰਨ ਵਾਸਤੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿਖਾਓ + ਸੂਚੀ ਵੇਖਣ ਦਾ ਢੰਗ + ਸੂਚੀ ਗਰਿੱਡ ਆਟੋ - ਨਿਊ-ਪਾਈਪ ਦੀ ਅਪਡੇਟ ਉਪਲਬੱਧ ਹੈ! + ਨਿਊ-ਪਾਈਪ ਦੀ ਅੱਪਡੇਟ ਉਪਲਬੱਧ ਹੈ! ਮੁਕੰਮਲ ਹੋਇਆ ਬਕਾਇਆ - ਰੁਕਿਆ - ਕਤਾਰਬੱਧ - Post-processing - ਕਤਾਰ ਕਰੋ + ਰੋਕਿਆ ਹੋਇਆ + ਕਤਾਰ ਵਿੱਚ + ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ + ਕਤਾਰਬੱਧ ਕਰੋ ਸਿਸਟਮ ਦੁਆਰਾ ਕਾਰਵਾਈ ਤੋਂ ਇਨਕਾਰ ਕੀਤਾ ਗਿਆ ਡਾਊਨਲੋਡ ਫੇਲ੍ਹ ਵਿਲੱਖਣ ਨਾਮ ਬਣਾਓ - overwrite + ਓਵਰਰਾਈਟ ਕਰੋ ਇਸ ਨਾਮ ਦੇ ਨਾਲ ਇੱਕ ਡਾਊਨਲੋਡ ਪਹਿਲਾਂ ਤੋਂ ਜਾਰੀ ਹੈ ਤਰੁੱਟੀ ਵਿਖਾਓ ਮੰਜ਼ਿਲ ਫੋਲਡਰ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ @@ -369,20 +366,20 @@ ਸਰਵਰ ਨਹੀਂ ਲੱਭ ਸਕਿਆ ਸਰਵਰ ਨਾਲ ਜੁੜ ਨਹੀਂ ਸਕਿਆ ਸਰਵਰ ਨੇ ਡਾਟਾ ਨਹੀਂ ਭੇਜਿਆ - ਸਰਵਰ ਮਲਟੀ-Threaded ਡਾਊਨਲੋਡਸ ਨੂੰ ਸਵੀਕਾਰ ਨਹੀਂ ਕਰਦਾ, ਇਸ ਨਾਲ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ @string/msg_threads = 1 + ਸਰਵਰ ਮਲਟੀ-ਥਰਿੱਡ ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਸਵੀਕਾਰ ਨਹੀਂ ਕਰਦਾ ਹੈ, @string/msg_threads = 1 ਨਾਲ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਨਹੀਂ ਲਭਿਆ - Post-processing ਫੇਲ੍ਹ - ਰੁਕੋ + ਪੋਸਟ ਪ੍ਰੋਸੈਸਿੰਗ ਫੇਲ੍ਹ ਹੋਈ + ਰੋਕੋ ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ ਡਾਉਨਲੋਡ ਰੱਦ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ - ਮੀਟਰ ਕੀਤੇ ਨੈਟਵਰਕਸ ਤੇ ਰੁਕਾਵਟ - ਮੋਬਾਈਲ ਡਾਟਾ ਤੇ ਸਵਿੱਚ ਕਰਨ ਵੇਲੇ ਲਾਭਦਾਇਕ ਹੈ, ਹਾਲਾਂਕਿ ਕੁਝ ਡਾਉਨਲੋਡਾਂ ਨੂੰ ਮੁਅੱਤਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ + ਮੀਟਰ ਕੀਤੇ ਨੈੱਟਵਰਕ ਤੇ ਰੋਕੋ + ਮੋਬਾਈਲ ਡਾਟਾ ਦੇ ਇਸਤੇਮਾਲ ਵੇਲੇ ਫਾਇਦੇਮੰਦ ਹੈ, ਹਾਲਾਂਕਿ ਕੁਝ ਡਾਉਨਲੋਡਾਂ ਨੂੰ ਮੁਅੱਤਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਇਵੇੰਟਸ ਕਾਨਫਰੰਸਾਂ ਟਿੱਪਣੀਆਂ ਵਿਖਾਓ ਟਿੱਪਣੀਆਂ ਲੁਕਾਉਣ ਲਈ ਇਸਨੂੰ ਬੰਦ ਕਰੋ ਆਟੋ-ਪਲੇਅ - ਕੋਈ ਟਿੱਪਣੀ ਨਹੀਂ ਕੀਤੀ ਗਈ + ਕੋਈ ਟਿੱਪਣੀ ਨਹੀਂ ਟਿੱਪਣੀਆਂ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੀਆਂ ਬੰਦ ਕਰੋ ਪਲੇਅਬੈਕ ਫਿਰ ਚਾਲੂ ਕਰੋ @@ -391,31 +388,31 @@ ਸੂਚੀਆਂ ਵਿੱਚ ਪਲੇਅਬੈਕ ਸਥਿਤੀ ਸੂਚਕ ਵਿਖਾਓ ਡਾਟਾ ਮਿਟਾਓ ਵੇਖੀਆਂ ਸਟ੍ਰੀਮਾਂ ਦੀ ਇਤਿਹਾਸ ਸੂਚੀ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ - ਪਲੇਬੈਕ ਸਥਿਤੀਆਂ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ + ਪਲੇਬੈਕ ਸਥਿਤੀਆਂ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਫਾਈਲ ਤਬਦੀਲ ਕੀਤੀ ਜਾਂ ਮਿਟਾਈ ਗਈ ਇਸ ਨਾਮ ਵਾਲੀ ਇੱਕ ਫਾਈਲ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ ਇਸ ਨਾਮ ਨਾਲ ਡਾਉਨਲੋਡ ਕੀਤੀ ਫਾਈਲ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ - ਫਾਈਲ Overwrite ਨਹੀਂ ਹੋ ਸਕਦੀ - ਇਸ ਨਾਮ ਦੇ ਨਾਲ ਇੱਥੇ ਇੱਕ ਬਕਾਇਆ ਡਾਊਨਲੋਡ ਹੈ - ਫਾਈਲ ਤੇ ਕੰਮ ਕਰਦੇ ਸਮੇਂ NewPipe ਬੰਦ ਕੀਤੀ ਗਈ ਸੀ - ਡਿਵਾਈਸ ਤੇ ਕੋਈ ਜਗ੍ਹਾ ਨਹੀਂ ਬਚੀ ਹੈ - Progress lost, ਕਿਉਂਕਿ ਫਾਈਲ ਮਿਟ ਗਈ ਸੀ - ਕੁਨੈਕਸ਼ਨ timeout - ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਸਾਫ਼ ਕਰਨਾ ਜਾਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? - ਡਾਊਨਲੋਡ ਸੀਮਾ ਕਤਾਰ ਵਿੱਚ - ਇੱਕ ਸਮੇਂ ਤੇ ਇੱਕੋ ਡਾਊਨਲੋਡ ਚੱਲੇਗਾ + ਫਾਈਲ ਓਵਰਰਾਈਟ ਨਹੀਂ ਹੋ ਸਕਦੀ + ਇਸ ਨਾਮ ਦਾ ਇੱਕ ਡਾਊਨਲੋਡ ਬਕਾਇਆ ਹੈ + ਫਾਈਲ ਤੇ ਕੰਮ ਕਰਦੇ ਸਮੇਂ ਨਿਊਪਾਈਪ ਬੰਦ ਕੀਤੀ ਗਈ + ਡਿਵਾਈਸ ਤੇ ਕੋਈ ਜਗ੍ਹਾ ਨਹੀਂ ਬਚੀ ਹੈ + ਪ੍ਰਗਤੀ ਖਤਮ ਹੋ ਗਈ, ਕਿਉਂਕਿ ਫਾਈਲ ਮਿਟਾਈ ਗਈ + ਕੁਨੈਕਸ਼ਨ ਦਾ ਸਮਾਂ ਸਮਾਪਤ + ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ ਜਾਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਡਾਊਨਲੋਡ ਕਤਾਰ ਸੀਮਤ ਕਰੋ + ਇੱਕ ਹੀ ਸਮੇਂ ਤੇ ਇੱਕੋ ਡਾਊਨਲੋਡ ਚੱਲੇਗਾ ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰੋ - ਡਾਊਨਲੋਡਸ ਰੋਕੋ - ਪੁੱਛੋ ਕਿੱਥੇ ਡਾਊਨਲੋਡ ਕਰਨਾ ਹੈ + ਡਾਊਨਲੋਡ ਰੋਕੋ + ਡਾਊਨਲੋਡ ਕਿੱਥੇ ਕਰਨਾ ਹੈ, ਦੇ ਲਈ ਪੁੱਛੋ ਤੁਹਾਨੂੰ ਹਰ ਵਾਰ ਪੁੱਛਿਆ ਜਾਵੇਗਾ ਕਿ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿੱਥੇ ਸਾਂਭਣਾ ਹੈ। \nਜੇ ਤੁਸੀਂ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿਸੇ ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਸਾਂਭਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਸਿਸਟਮ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੋਣਕਾਰ (SAF) ਚਾਲੂ ਕਰੋ ਸਿਸਟਮ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੋਣਕਾਰ (SAF) ਦੀ ਵਰਤੋਂ ਕਰੋ - \'ਸਟੋਰੇਜ ਐਕਸੈਸ ਫ਼ਰੇਮਵਰਕ\' ਬਾਹਰੀ SD ਕਾਰਡ ਵਿੱਚ ਡਾਊਨਲੋਡ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ + \'ਸਟੋਰੇਜ ਐਕਸੈਸ ਫ਼ਰੇਮਵਰਕ\' ਬਾਹਰੀ SD ਕਾਰਡ ਵਿੱਚ ਡਾਊਨਲੋਡ ਕਰਨ ਦਿੰਦਾ ਹੈ ਥੰਮਨੇਲ ਨੂੰ 1:1 ਮਾਪ ਦਾ ਕਰੋ %s ਲਈ ਨਤੀਜੇ ਵਿਖਾਏ ਜਾ ਰਹੇ ਹਨ ਜਦੋਂ ਉਪਲਬਧ ਹੋਵੇ ਤਾਂ ਖ਼ਾਸ ਫ਼ੀਡ ਤੋਂ ਮੰਗਵਾਓ ਤੇਜ਼ ਫ਼ੀਡ ਮੋਡ ਇਸ ਬਾਰੇ ਕੋਈ ਹੋਰ ਜਾਣਕਾਰੀ ਮੁੱਹਈਆ ਨਹੀਂ ਕਰਾਉਂਦਾ। - ਐਕਸੋਪਲੇਅਰ ਦੀਆਂ ਬੰਦਿਸ਼ਾਂ ਕਰਕੇ ਲੱਭਣ ਮਿਆਦ %d ਸਕਿੰਟ ਸੈੱਟ ਕੀਤੀ ਗਈ ਸੀ + ਐਕਸੋਪਲੇਅਰ ਦੀ ਬੰਦਿਸ਼ ਕਰਕੇ ਸੀਕ ਕਰਨ ਦੀ ਮਿਆਦ %d ਸਕਿੰਟ ਸੈੱਟ ਕੀਤੀ ਗਈ ਇਹ ਡਾਊਨਲੋਡ ਮੁੜ-ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਮੁੜ-ਪ੍ਰਾਪਤੀ ਜੇ ਤੁਹਾਨੂੰ ਕਾਲ਼ੀ ਸਕਰੀਨ ਮਿਲੇ ਜਾਂ ਵੀਡਿਓ ਰੁਕ-ਰੁਕ ਕੇ ਚੱਲੇ ਤਾਂ ਮੀਡੀਆ ਟਨਲਿੰਗ ਬੰਦ ਕਰ ਦਿਓ। @@ -427,7 +424,7 @@ ਹਾਲੇ ਕੋਈ ਵੀ ਪਲੇ-ਸੂਚੀ ਬੁੱਕਮਾਰਕ ਨਹੀਂ ਕੀਤੀ ਹੋਈ ਡਿਫ਼ਾਲਟ ਕਿਓਸਕ ਹੈਸ਼ ਦਾ ਲੇਖਾ-ਜੋਖਾ ਹੋ ਰਿਹਾ ਹੈ - ਸੇਵਾ ਟੌਗਲ ਕਰੋ, ਮੌਜੂਦਾ ਚੋਣ: + ਸੇਵਾ ਚੁਣੋ, ਮੌਜੂਦਾ ਚੋਣ: ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਜਾਂਚ ਲਓ ਕਿ ਤੁਹਾਡੇ ਵਾਲ੍ਹੇ ਕ੍ਰੈਸ਼ ਦੀ ਗੱਲ ਕਰਦਾ ਕੋਈ ਮਸਲਾ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਤਾਂ ਨਹੀਂ। ਇੱਕੋ ਮਸਲੇ ਦੀਆਂ ਦੋ ਜਾਂ ਵੱਧ ਨਕਲਾਂ ਬਣਾ ਕੇ ਤੁਸੀਂ ਸਾਡੇ ਤੋਂ ਉਹ ਵਕਤ ਖੋਹ ਲੈਂਦੇ ਹੋ ਜੋ ਅਸੀਂ ਅਸਲੀ ਮਸਲੇ ਦੇ ਹੱਲ ਲਈ ਲਾਉਣਾ ਸੀ। ਫ਼ਾਰਮੈਟਡ ਰਿਪੋਰਟ ਨਕਲ ਕਰੋ reCAPTCHA ਹੱਲ ਕਰਦੇ ਵੇਲ਼ੇ ਨਿਊਪਾਈਪ ਵਿੱਚ ਜਮ੍ਹਾਂ ਹੋਣ ਵਾਲ਼ੀਆਂ ਕੁਕੀਜ਼ ਸਾਫ਼ ਕਰੋ @@ -443,15 +440,14 @@ ਨਿੱਜੀ (ਪ੍ਰਾਈਵੇਟ) ਗੈਰ-ਸੂਚੀਬੱਧ ਜਨਤਕ - ਥੰਮਨੇਲ URL ਮੇਜ਼ਬਾਨ ਸਹਾਇਤਾ - ਭਾਸ਼ਾ/ਬੋਲੀ + ਭਾਸ਼ਾ ਉਮਰ ਹੱਦ ਪਰਦੇਦਾਰੀ ਲਾਈਸੈਂਸ ਟੈਗ - ਵਰਗ + ਸ਼੍ਰੇਣੀ ਵੇਰਵੇ \'ਚੋਂ ਲਿਖਤ ਚੁਣਨਾ ਬੰਦ ਕਰੋ ਵੇਰਵੇ \'ਚੋਂ ਲਿਖਤ ਚੁਣਨਾ ਚਾਲੂ ਕਰੋ ਤੁਸੀਂ ਹੁਣ ਵੇਰਵੇ \'ਚੋਂ ਲਿਖਤ ਨੂੰ ਚੁਣ ਸਕਦੇ ਹੋ। ਨੋਟ ਕਰੋ ਕਿ ਪੰਨਾ ਜਗ-ਬੁੱਝ ਸਕਦਾ ਹੈ ਅਤੇ ਚੋਣ ਮੋਡ ਵਿੱਚ ਹੋਣ ਵੇਲੇ ਲਿੰਕ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਨਹੀਂ ਹੋ ਸਕਦੇ ਹਨ। @@ -460,13 +456,13 @@ ਆਪਣੀ ਪਸੰਦੀਦਾ ਰਾਤ ਦੀ ਥੀਮ ਚੁਣੋ — %s ਆਟੋਮੈਟਿਕ (ਡਿਵਾਈਸ ਥੀਮ) ਰੇਡੀਓ - ਉਚੇਚੀ ਪੇਸ਼ਕਸ਼ + ਫੀਚਰਡ ਇਹ ਸਮੱਗਰੀ ਸਿਰਫ਼ ਉਹਨਾਂ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਉਪਲਬਧ ਹੈ ਜਿੰਨ੍ਹਾਂ ਨੇ ਇਸਦੇ ਲਈ ਕੀਮਤ ਦਿੱਤੀ ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। - %s ਨੇ ਇਹ ਕਰਨ ਦੱਸਿਆ ਹੈ: + %s ਇਸਦਾ ਕਾਰਨ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ: ਖਾਤਾ ਬੰਦ ਕੀਤਾ ਗਿਆ ਇਹ ਵੀਡੀਓ ਸਿਰਫ਼ ਯੂਟਿਊਬ ਮਿਊਜ਼ਿਕ ਦੇ ਪ੍ਰੀਮੀਅਮ ਮੈਂਬਰਾਂ ਲਈ ਉਪਲਬਧ ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਇਹ ਸਮੱਗਰੀ ਨਿੱਜੀ (ਪ੍ਰਾਈਵੇਟ) ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। - ਇਹ ਸਮੱਗਰੀ ਤੁਹਾਡੇ ਮੁਲਕ ਵਿੱਚ ਉਪਲਬਧ ਨਹੀਂ। + ਇਹ ਸਮੱਗਰੀ ਤੁਹਾਡੇ ਮੁਲਕ ਵਿੱਚ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਦੀ ਕੋਈ ਵੀ ਐਪ ਇਸ ਨੂੰ ਖੋਲ੍ਹ ਨਹੀਂ ਸਕਦੀ ਚੈਪਟਰ ਹਾਲੀਆ @@ -485,13 +481,13 @@ \nਕੀ ਤੁਸੀਂ ਇਸ ਚੈਨਲ ਨੂੰ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰਨਾ ਚਾਹੋਗੇ\? \'%s\' ਵਾਸਤੇ ਫ਼ੀਡ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੀ। ਫ਼ੀਡ ਲੋਡ ਕਰਨ ਵਿੱਚ ਤਰੁੱਟੀ ਰਹੀ - ਹਮੇਸ਼ਾ ਅਪਡੇਟ ਕਰੋ - ਫ਼ੀਡ ਅਪਡੇਟ ਦੀ ਹੱਦ + ਹਮੇਸ਼ਾਂ ਅੱਪਡੇਟ ਕਰੋ + ਫ਼ੀਡ ਅੱਪਡੇਟ ਦੀ ਹੱਦ ਫ਼ੀਡ ਸਿਰਫ਼ ਉਹ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਵਿਖਾਓ ਜੋ ਕਿਸੇ ਗਰੁੱਪ ਵਿੱਚ ਨਹੀਂ ਪਾਈਆਂ ਹੋਈਆਂ ਨਵਾਂ ਕੀ ਤੁਸੀਂ ਇਸ ਗਰੁੱਪ ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? - ਖ਼ਾਲੀ ਗਰੁੱਪ ਨਾਮ + ਗਰੁੱਪ ਦਾ ਨਾਮ ਨਹੀਂ %d ਚੁਣੀ %d ਚੁਣੀਆਂ @@ -500,8 +496,8 @@ ਸੁਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਚੁਣੋ ਫ਼ੀਡ \'ਤੇ ਅਮਲ ਹੋ ਰਿਹੈ… ਫ਼ੀਡ ਲੋਡ ਹੋ ਰਹੀ ਹੈ… - ਲੋਡ ਨਹੀਂ ਹੋਇਆ: %d - ਫ਼ੀਡ ਆਖ਼ਰੀ ਵਾਰ %s ਨੂੰ ਅਪਡੇਟ ਹੋਈ ਸੀ + ਲੋਡ ਨਹੀਂ ਹੋਏ: %d + ਫ਼ੀਡ ਆਖ਼ਰੀ ਵਾਰ %s ਨੂੰ ਅੱਪਡੇਟ ਹੋਈ ਚੈਨਲ ਗਰੁੱਪ %d ਦਿਨ @@ -520,18 +516,18 @@ %d ਸਕਿੰਟ ਹਾਂ, ਅਤੇ ਅੱਧ-ਪਚੱਧੀਆਂ ਵੇਖੀਆਂ ਹੋਈਆਂ ਵੀ - ਵੀਡੀਓਜ਼ ਜੋ ਪਲੇ-ਸੂਚੀ ਵਿੱਚ ਜੋੜੇ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਅਤੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੀਆਂ ਜਾ ਚੁੱਕੀਆਂ ਹਨ, ਉਹ ਹਟਾ ਦਿੱਤੀਆਂ ਜਾਣਗੀਆਂ. + ਪਲੇ-ਸੂਚੀ ਵਿੱਚ ਸ਼ਾਮਿਲ, ਪਹਿਲਾਂ ਚਾਹੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੇ ਜਾ ਚੁੱਕੇ ਵੀਡੀਓ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ। \nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਮੋੜਿਆ ਜਾ ਸਕਣਾ! - ਵੇਖੀਆਂ ਹੋਈਆਂ ਵੀਡੀਓਜ਼ ਹਟਾਉਣੀਆਂ ਹਨ\? - ਵੇਖੀਆਂ ਹੋਈਆਂ ਹਟਾਓ + ਵੇਖੇ ਹੋਏ ਵੀਡੀਓ ਹਟਾ ਦੇਈਏ\? + ਵੇਖੇ ਹੋਏ ਨੂੰ ਹਟਾਓ ਸਿਸਟਮ ਡਿਫ਼ਾਲਟ - ਐਪ ਭਾਸ਼ਾ - ਕੋਈ ਸਥਿਤੀ ਚੁਣੋ - \'ਸਟੋਰੇਜ ਐਕਸੈੱਸ ਫ਼ਰੇਮਵਰਕ\' ਐਂਡਰਾਇਡ 10 ਤੋਂ ਕੰਮ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ - ਤੁਹਾਨੂੰ ਹਰ ਵਾਰ ਪੁੱਛਿਆ ਜਾਵੇਗਾ ਕਿ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿੱਥੇ ਸਾਂਭਣਾ ਹੈ + ਐਪ ਦੀ ਭਾਸ਼ਾ + ਕੋਈ ਇੰਸਟੈਂਸ ਚੁਣੋ + ਐਂਡਰਾਇਡ 10 ਤੋਂ ਸ਼ੁਰੂ ਹੋ ਕੇ ਕੇਵਲ \'ਸਟੋਰੇਜ ਐਕਸੈੱਸ ਫ਼ਰੇਮਵਰਕ\' ਸਮਰਥਿਤ ਹੈ + ਤੁਹਾਨੂੰ ਪੁੱਛਿਆ ਜਾਵੇਗਾ ਕਿ ਹਰ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿੱਥੇ ਸਾਂਭਣਾ ਹੈ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ - ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਸਾਫ਼ ਕਰੋ - ਕਦੇ ਵੀ ਨਹੀਂ + ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਹਟਾਓ + ਕਦੇ ਨਹੀਂ ਸਿਰਫ਼ ਵਾਈ-ਫ਼ਾਈ \'ਤੇ ਪਲੇਬੈਕ ਆਪਣੇ-ਆਪ ਸ਼ੁਰੂ ਕਰੋ — %s ਐਪ ਕ੍ਰੈਸ਼ ਕਰੋ @@ -540,13 +536,13 @@ ਕਤਾਰਬੱਧ ਹੋ ਗਿਆ ਕਤਾਰਬੱਧ ਕਰੋ ਚੈਨਲ ਵੇਰਵੇ ਵਿਖਾਓ - ਕਤਾਰ ਚਲਾਓ - ਸਭ ਤੋਂ ਵੱਧ ਪਸੰਦ + ਪਲੇਅ ਕਤਾਰ + ਵਧੇਰੇ ਪਸੰਦ ਕੀਤੇ ਗਏ ਹਾਲ ਹੀ ਵਿੱਚ ਸ਼ਾਮਿਲ ਸਥਾਨਕ ਭਾਸ਼ਾ ਐਪ ਨੂੰ ਦੋਬਾਰਾ ਚਲਾਉਣ \'ਤੇ ਬਦਲੇਗੀ ਪਲੇ-ਸੂਚੀ ਚੁਣੋ - ਹੋ ਗਿਆ + ਹੋ ਗਿਆ ਹੱਲ ਕਰੋ ਹੱਲ ਹੋਣ \'ਤੇ \"ਹੋ ਗਿਆ\" ਨੱਪੋ ਹਾਲੇ ਕੋਈ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ, ਹੁਣੇ ਡਿਫ਼ਾਲਟ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਚੁਣੋ @@ -567,7 +563,7 @@ ਟਿੱਪਣੀਆਂ ਗਿਟਹੱਬ \'ਤੇ ਜਾ ਕੇ ਇਤਲਾਹ ਦਿਓ ਦੂਜੀਆਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਵਿਖਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ - ਸਾਰੀਆਂ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਉਣੀਆਂ ਹਨ\? + ਕੀ ਸਾਰੀਆਂ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਉਣੀਆਂ ਹਨ\? ਸਾਰੀਆਂ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਉਂਦਾ ਹੈ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਓ ਵੀਡੀਓ ਹੈਸ਼ ਇਤਲਾਹ @@ -581,14 +577,14 @@ ਯੂਟਿਊਬ \"ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੋਡ\" ਉਪਲਬਧ ਕਰਾਉਂਦਾ ਹੈ ਜੋ ਬਾਲਗਾਂ ਵਾਲ਼ੀ ਸਮੱਗਰੀ ਲੁਕਾਉਂਦਾ ਹੈ ਯੂਟਿਊਬ ਦਾ ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੋਡ ਚਾਲੂ ਕਰੋ ਉਹ ਸਮੱਗਰੀ ਵੀ ਵਿਖਾਓ ਜੋ ਉਮਰ-ਸੀਮਾ ਕਰਕੇ ਬੱਚਿਆਂ ਲਈ ਸ਼ਾਇਦ ਸਹੀ ਨਾ ਹੋਵੇ (ਜਿਵੇਂ 18+) - ਸਥਿਤੀ ਪਹਿਲਾਂ ਨੂੰ ਮੌਜੂਦ ਹੈ + ਇੰਸਟੈਂਸ ਪਹਿਲਾਂ ਤੋਂ ਮੌਜੂਦ ਹੈ ਸਿਰਫ਼ HTTP URLs ਹੀ ਮੰਨਣਯੋਗ ਹਨ - ਸਥਿਤੀ ਦੀ ਜਾਇਜ਼ਗੀ ਤਸਦੀਕ ਨਹੀਂ ਹੋ ਸਕੀ - ਸਥਿਤੀ URL ਦਾਖ਼ਲ ਕਰੋ - ਸਥਿਤੀਆਂ ਜੋੜੋ - ਤੁਹਾਡੀਆਂ ਪਸੰਦੀਦਾ ਸਥਿਤੀਆਂ %s \'ਤੇ ਲੱਭੋ - ਆਪਣੀ ਪਸੰਦੀਦਾ ਪੀਅਰਟਿਊਬ ਸਥਿਤੀਆਂ ਚੁਣੋ - ਪੀਅਰਟਿਊਬ ਸਥਿਤੀਆਂ + ਇੰਸਟੈਂਸ ਦੀ ਜਾਇਜ਼ਗੀ ਤਸਦੀਕ ਨਹੀਂ ਹੋ ਸਕੀ + ਇੰਸਟੈਂਸ URL ਦਾਖ਼ਲ ਕਰੋ + ਇੰਸਟੈਂਸ ਜੋੜੋ + ਤੁਹਾਡੇ ਪਸੰਦੀਦਾ ਇੰਸਟੈਂਸ %s \'ਤੇ ਲੱਭੋ + ਆਪਣੇ ਪਸੰਦੀਦਾ ਪੀਅਰਟਿਊਬ ਇੰਸਟੈਂਸ ਚੁਣੋ + ਪੀਅਰਟਿਊਬ ਇੰਸਟੈਂਸ URL ਪਛਾਣ ਨਹੀਂ ਹੋਇਆ। ਕਿਸੇ ਹੋਰ ਐਪ ਨਾਲ਼ ਖੋਲ੍ਹਣਾ ਹੈ\? ਆਟੋ ਕਤਾਰਬੱਧ ਕਰੋ ਸਟ੍ਰੀਮ ਦੇ ਕਰਤਾ, ਸਮੱਗਰੀ ਜਾਂ ਖੋਜ ਬੇਨਤੀ ਵਾਲੇ ਵਾਧੂ ਜਾਣਕਾਰੀ ਬਕਸਿਆਂ ਵਾਲ਼ੀ ਮੈਟਾ ਜਾਣਕਾਰੀ ਲੁਕਾਉਣ ਲਈ ਇਸਨੂੰ ਬੰਦ ਕਰ ਦਿਓ @@ -606,7 +602,7 @@ ਬਫ਼ਰਿੰਗ ਸ਼ਫਲ ਦੁਹਰਾਓ - ਹੇਠਾਂ ਹਰੇਕ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕਾਰਵਾਈ ਤੇ ਨੱਪਦਿਆਂ ਇਹਨਾਂ ਨੂੰ ਬਦਲੋ। ਇਹਨਾਂ ਦੇ ਸੱਜੇ ਪਾਸੇ ਬਣੇ ਚੈੱਕਬਾਕਸ ਵਰਤਦਿਆਂ ਇਹਨਾਂ ਵਿਚੋਂ ਵੱਧ-ਤੋਂ-ਵੱਧ ਤਿੰਨ ਕਾਰਵਾਈਆਂ ਨੂੰ ਤੁਸੀਂ ਕੰਪੈਕਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਵਿਖਾਉਣ ਲਈ ਚੁਣ ਸਕਦੇ ਹੋ + ਹੇਠਾਂ ਹਰੇਕ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕਾਰਵਾਈ ਤੇ ਨੱਪਦਿਆਂ ਇਹਨਾਂ ਨੂੰ ਬਦਲੋ। ਇਹਨਾਂ ਦੇ ਸੱਜੇ ਪਾਸੇ ਬਣੇ ਚੈੱਕਬਾਕਸ ਵਰਤਦਿਆਂ ਇਹਨਾਂ ਵਿਚੋਂ ਵੱਧ-ਤੋਂ-ਵੱਧ ਤਿੰਨ ਕਾਰਵਾਈਆਂ ਨੂੰ ਤੁਸੀਂ ਕੰਪੈਕਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਵਿਖਾਉਣ ਲਈ ਚੁਣ ਸਕਦੇ ਹੋ। ਤੁਸੀਂ ਵੱਧ-ਤੋਂ-ਵੱਧ ਤਿੰਨ ਕਾਰਵਾਈਆਂ ਨੂੰ ਕੰਪੈਕਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਵਿਖਾਉਣ ਲਈ ਚੁਣ ਸਕਦੇ ਹੋ! ਪੰਜਵਾਂ ਕਾਰਵਾਈ ਬਟਨ ਚੌਥਾ ਕਾਰਵਾਈ ਬਟਨ @@ -614,7 +610,7 @@ ਦੂਜਾ ਕਾਰਵਾਈ ਬਟਨ ਪਹਿਲਾ ਕਾਰਵਾਈ ਬਟਨ ਨਾਂ ਵਿਖਾਓ - ਚਾਲੂ ਕਰੋ + ਆਨ , ਡਾਉਨਲੋਡ ਮੁਕੰਮਲ @@ -626,7 +622,7 @@ ਮੋਜੂਦਾ ਚੱਲ ਰਹੀ ਸਟ੍ਰੀਮ ਦੀ ਨੋਟੀਫਿਕੇਸ਼ਨ ਸੰਰਚਨਾ ਕਰੋ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਵੀਂਆਂ ਸਟ੍ਰੀਮਾਂ - ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਦੁਆਰਾ ਨਵੀਂ ਸਟ੍ਰੀਮ ਦੇ ਨੋਟੀਫਿਕੇਸ਼ਨ + ਸਬਸਕ੍ਰਿਪਸ਼ਨਜ਼ ਦੇ ਨਵੀਂ ਸਟ੍ਰੀਮ ਦੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਿਊਪਾਈਪ ਖਾਮੀ ਤੋਂ ਪ੍ਰਭਾਵਤ ਹੋਈ ਹੈ, ਇੱਥੇ ਨੱਪ ਕੇ ਰਿਪੋਰਟ ਕਰੋ ਇੱਕ ਖਾਮੀ ਪ੍ਰਭਾਵੀ ਹੋਈ ਹੈ, ਨੋਟੀਫੀਕੇਸ਼ਨ ਵੇਖੋ ਆਈਟਮਾਂ ਨੂੰ ਇੱਕ ਪਾਸੇ ਖਿੱਚ ਕੇ ਹਟਾਓ @@ -648,8 +644,8 @@ %s ਨਵੀਂ ਸਟ੍ਰੀਮ %s ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ - ਨਵੀਂਆ ਫੀਡ ਇਕਾਈਆਂ - ਸੂਚਨਾ ਪ੍ਰਾਪਤ ਕਰੋ + ਨਵੀਆਂ ਫੀਡ ਆਈਟਮਾਂ + ਸੂਚਨਾ ਪਾਓ ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਕੁਆਲਿਟੀ ਚੁਣੋ ਤਰੁੱਟੀ ਰਿਪੋਰਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਖ਼ਾਮੀਆਂ ਰਿਪੋਰਟ ਕਰਨ ਲਈ ਨੋਟੀਫਿਕੇਸ਼ਨ @@ -657,12 +653,12 @@ ਲੀਕ-ਕੈਨਰੀ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ ਤਰੁੱਟੀ ਤੇ ਸਨੈਕਬਾਰ ਵਿਖਾਓ ਕੁਝ ਸੇਵਾਵਾਂ ਵਿੱਚ ਹੀ ਉਪਲੱਬਧ ਇਹ ਤਰੀਕਾ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫੀਡ ਵਿੱਚ ਤੇਜ ਜਾਣਕਾਰੀ ਮੁਹੱਈਆ ਕਰਵਾਉਂਦਾ ਹੈ, ਪਰ ਕੁਝ ਗਿਣਤੀ ਦੀਆਂ ਹੀ ਆਈਟਮ ਪ੍ਰਦਾਨ ਕਰ ਸਕਦਾ ਹੈ ਉਹ ਵੀ ਅਕਸਰ ਬਿਨਾਂ ਪੂਰੀ ਜਾਣਕਾਰੀ( ਜਿਵੇਂ ਅਵਧੀ, ਸਟ੍ਰੀਮ ਦੀ ਕਿਸਮ, ਕੋਈ ਸਟ੍ਰੀਮ ਲਾਈਵ ਹੈ, ਨਹੀਂ ਦੱਸਦਾ) - ਇਹ ਸਾਊਂਡਕਲਾਊਡ ਗੋ-ਪਲੱਸ ਟਰੈਕ ਹੈ, ਤੁਹਾਡੇ ਦੇਸ਼ ਵਿੱਚ ਇਹ ਸਟ੍ਰੀਮ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। + ਇਹ ਸਾਊਂਡਕਲਾਊਡ ਗੋ-ਪਲੱਸ ਟਰੈਕ ਹੈ, ਘੱਟੋ-ਘੱਟ ਤੁਹਾਡੇ ਦੇਸ਼ ਵਿੱਚ, ਇਸ ਲਈ ਇਹ ਸਟ੍ਰੀਮ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਅਗਿਆਤ ਫਾਰਮੈਟ ਅਗਿਆਤ ਕੁਆਲਿਟੀ - ਆਮ ਸਵਾਲ + ਅਕਸਰ ਪੁੱਛੇ ਜਾਂਦੇ ਸਵਾਲ ਵੈੱਬਸਾਈਟ \'ਤੇ ਵੇਖੋ - ਸਟ੍ਰੀਮ ਲੋਡ ਹੋ ਰਹੀ ਹੈ… + ਸਟ੍ਰੀਮ ਦੇ ਵਿਵਰਣ ਲੋਡ ਹੋ ਰਹੇ ਹਨ… ਕਾਰਵਾਈ ਵਿੱਚ... ਕੁਝ ਸਮਾਂ ਲੱਗ ਰਿਹਾ ਹੈ \"ਪਲੇਅਰ ਕਰੈਸ਼ ਕਰੋ\" ਵਿਖਾਉ ਵਰਤਦੇ ਸਮੇਂ ਪਲੇਅਰ ਕਰੈਸ਼ ਦਾ ਵਿਕਲਪ ਵਿਖਾਉਂਦਾ ਹੈ @@ -677,8 +673,8 @@ ਘੱਟ ਗੁਣਵੱਤਾ (ਛੋਟਾ ਆਕਾਰ) ਡਿਸਕ ਤੋਂ ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਹਟਾਓ\? - %1$s ਡਾਊਨਲੋਡ ਡਿਲੀਟ ਕੀਤਾ - %1$s ਡਾਊਨਲੋਡ ਡਿਲੀਟ ਕੀਤੇ + %1$s ਡਾਊਨਲੋਡ ਹਟਾਇਆ + %1$s ਡਾਊਨਲੋਡ ਹਟਾਏ ਚੈਨਲ ਦਾ ਅਵਤਾਰ ਥੰਮਨੇਲ ਇਸ ਕਾਰਜ ਲਈ ਕੋਈ ਢੁਕਵਾਂ ਫਾਈਲ ਮੈਨੇਜਰ ਨਹੀਂ ਮਿਲਿਆ। @@ -693,7 +689,7 @@ ਪਲੇਅਰ ਕਰੈਸ਼ ਕਰੋ ਵੀਡੀਓ ਮਿੰਨੀ ਪਲੇਅਰ ਚਲਾਉਣ ਦੀ ਵਜਾਏ ਪੂਰੇ ਸਕਰੀਨ ਵਿੱਚ ਚਲਾਉਂਦਾ ਹੈ। ਜੇ ਆਟੋ-ਰੋਟੇਸ਼ਨ ਲਾਕ ਹੈ ਮੇਨ-ਪਲੇਅਰ ਤੋਂ ਬਾਹਰ ਆਕੇ ਤੇ ਮਿੰਨੀ-ਪਲੇਅਰ ਤੱਕ ਰਸਾਈ ਹਾਸਿਲ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਅਗਰ ਤੁਸੀਂ ਐਪ ਦੀ ਵਰਤੋਂ ਸਬੰਧੀ ਮੁਸ਼ਕਿਲਾਂ ਦਾ ਸਾਹਮਣਾ ਕਰ ਰਹੇ ਹੋ, ਤਾਂ ਇਹਨਾਂ ਆਮ ਸਵਾਲਾਂ ਦੇ ਜਵਾਬ ਜਾਣਨਾ ਨਾ ਭੁੱਲੋ! - ਕਤਾਰ ਵਿੱਚ ਅੱਗੇ ਲਗਾਓ + ਕਤਾਰ ਵਿੱਚ ਅੱਗੇ ਲਗਾਇਆ ਗਿਆ ਨੈੱਟਵਰਕ ਦੀ ਕਿਸਮ ਨਵੇਂ ਸੰਸਕਰਣਾਂ ਲਈ ਹੱਥੀਂ ਜਾਂਚ ਕਰੋ ਵਧੀਆ ਗੁਣਵੱਤਾ (ਵੱਡਾ ਆਕਾਰ) @@ -702,33 +698,33 @@ ਤੁਸੀਂ ਇਸ ਚੈਨਲ ਨੂੰ ਸਬਸਕ੍ਰਾਈਬ ਕਰ ਲਿਆ ਹੈ ਕੋਈ ਵੀਡੀਓ ਸਟ੍ਰੀਮ ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ ਐਕਸੋਪਲੇਅਰ ਡਿਫਾਲਟ - ਕੀ ਤੁਹਾਨੂੰ ਲੱਗਦਾ ਹੈ ਫੀਡ ਹੌਲੀ ਲੋਡ ਹੋ ਰਹੀ ਹੈ\? ਅਜਿਹਾ ਹੈ ਤਾਂ ਤੇਜ਼ ਫੀਡ ਕ੍ਰਿਆਸ਼ੀਲ ਕਰਕੇ ਵੇਖੋ (ਤੁਸੀਂ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਜਾਂ ਹੇਠਲਾ ਬਟਨ ਦੱਬ ਕੇ ਕਰ ਸਕਦੇ ਹੋ ) -\n -\nਨਿਊਪਾਈਪ ਫੀਡ ਲੋਡ ਕਰਨ ਲਈ ਦੋ ਤਰਾਂ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰਦੀ ਹੈ: -\n• ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਚੈਨਲ ਤੋਂ ਪੂਰੀ ਜਾਣਕਾਰੀ ਲੈਂਦੀ ਹੈ ਜੋ ਹੌਲ੍ਹੀ ਮਿਲਦੀ ਹੈ। -\n• ਸਮਰਪਿਤ ਸੇਵਾ ਅੰਤਮ ਬਿੰਦੂ ਤੋਂ, ਜੋ ਕਿ ਤੇਜ਼ ਮਿਲਦੀ ਹੈ ਪਰ ਆਮਤੌਰ ਤੇ ਅਧੂਰੀ/ਅਣਸਟੀਕ ਹੁੰਦੀ ਹੈ। -\n -\nਇਨਾਂ ਦੋਹਾਂ ਵਿੱਚ ਫਰਕ ਇਹ ਹੁੰਦਾ ਹੈ ਕਿ ਤੇਜ਼ ਤਰੀਕਾ ਆਮਤੌਰ ਤੇ ਕੁਝ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦੇ ਪਾਉਂਦਾ ਜਿਵੇਂ ਕਿ ਨਗਾਂ ਦੀ ਅਵਧੀ ਜਾਂ ਕਿਸਮ(ਕਿ ਵੀਡੀਓ ਲਾਈਵ ਹਨ ਜਾਂ ਆਮ) ਤੇ ਘੱਟ ਨਗ ਦਿਖ ਸਕਦੇ ਹਨ। -\n + ਕੀ ਤੁਹਾਨੂੰ ਲੱਗਦਾ ਹੈ ਫੀਡ ਹੌਲੀ ਲੋਡ ਹੋ ਰਹੀ ਹੈ\? ਅਜਿਹਾ ਹੈ ਤਾਂ ਤੇਜ਼ ਫੀਡ ਕ੍ਰਿਆਸ਼ੀਲ ਕਰਕੇ ਵੇਖੋ (ਤੁਸੀਂ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਜਾਂ ਹੇਠਲਾ ਬਟਨ ਦੱਬ ਕੇ ਕਰ ਸਕਦੇ ਹੋ ) +\n +\nਨਿਊਪਾਈਪ ਫੀਡ ਲੋਡ ਕਰਨ ਲਈ ਦੋ ਤਰਾਂ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰਦੀ ਹੈ: +\n• ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਚੈਨਲ ਤੋਂ ਪੂਰੀ ਜਾਣਕਾਰੀ ਲੈਂਦੀ ਹੈ ਜੋ ਹੌਲ੍ਹੀ ਮਿਲਦੀ ਹੈ। +\n• ਸਮਰਪਿਤ ਸੇਵਾ ਅੰਤਮ ਬਿੰਦੂ ਤੋਂ, ਜੋ ਕਿ ਤੇਜ਼ ਮਿਲਦੀ ਹੈ ਪਰ ਆਮਤੌਰ ਤੇ ਅਧੂਰੀ/ਅਣਸਟੀਕ ਹੁੰਦੀ ਹੈ। +\n +\nਇਨਾਂ ਦੋਹਾਂ ਵਿੱਚ ਫਰਕ ਇਹ ਹੁੰਦਾ ਹੈ ਕਿ ਤੇਜ਼ ਤਰੀਕਾ ਆਮ ਤੌਰ ਤੇ ਕੁਝ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦੇ ਪਾਉਂਦਾ ਜਿਵੇਂ ਕਿ ਨਗਾਂ ਦੀ ਅਵਧੀ ਜਾਂ ਕਿਸਮ(ਕਿ ਵੀਡੀਓ ਲਾਈਵ ਹਨ ਜਾਂ ਆਮ) ਤੇ ਘੱਟ ਨਗ ਦਿਖ ਸਕਦੇ ਹਨ। +\n \nਯੂਟਿਊਬ ਇੱਕ ਅਜਿਹੀ ਸੇਵਾ ਹੈ ਜਿਹੜੀ RSS ਫੀਡ ਜ਼ਰੀਏ ਇਹ ਤੇਜ਼ ਤਰੀਕਾ ਪ੍ਰਦਾਨ ਕਰਦੀ ਹੈ। -\n +\n \nਤੁਹਾਡੀ ਚੋਣ ਇਸ ਗੱਲ ਤੇ ਮੁਨੱਸਰ ਕਰਦੀ ਹੈ ਕਿ ਤੁਸੀਂ ਗਤੀ ਤੇ ਸਟੀਕਤਾ ਵਿੱਚੋਂ ਕਿਸ ਨੂੰ ਪ੍ਰਾਥਮਿਕਤਾ ਦਿੰਦੇ ਹੋ। ਤੇਜ ਮੋਡ 3-ਡੌਟ ਮੀਨੂ ਤੋਂ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਨੂੰ ਆਯਾਤ ਜਾਂ ਨਿਰਯਾਤ ਕਰੋ ਤੁਸੀਂ ਨਿਊਪਾਈਪ ਦਾ ਨਵੀਨਤਮ ਸੰਸਕਰਣ ਚਲਾ ਰਹੇ ਹੋ %s ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ - ਇਹ ਵਿਕਲਪ ਤਾਂ ਹੀ ਉਪਲਬਧ ਹੈ ਜੇਕਰ %s ਨੂੰ ਥੀਮ ਲਈ ਚੁਣਿਆ ਗਿਆ ਹੈ + ਇਹ ਵਿਕਲਪ ਤਾਂ ਹੀ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ ਜੇਕਰ %s ਨੂੰ ਥੀਮ ਲਈ ਚੁਣਿਆ ਜਾਂਦਾ ਹੈ ਸਥਾਈ ਥੰਮਨੇਲ ਨੂੰ ਅਨਸੈੱਟ ਕਰੋ ਕਲਿੱਪਬੋਰਡ \'ਤੇ ਕਾਪੀ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਕਾਰਡ - ਪਲੇਲਿਸਟਾਂ ਜੋ ਧੁੰਦਲੀਆਂ ਹੋ ਗਈਆਂ ਹਨ ਉਹਨਾਂ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਇਹ ਆਈਟਮ ਹੈ। + ਧੁੰਦਲੀਆਂ ਕੀਤੀਆਂ ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਇਹ ਆਈਟਮ ਹੈ। ਡੁਪਲੀਕੇਟ ਜੋੜਿਆ ਗਿਆ %d ਵਾਰ ਉਪਯੋਗੀ ਹੈ, ਉਦਾਹਰਨ ਲਈ, ਜੇਕਰ ਤੁਸੀਂ ਟੁੱਟੇ ਭੌਤਿਕ ਬਟਨਾਂ ਵਾਲਾ ਹੈੱਡਸੈੱਟ ਵਰਤ ਰਹੇ ਹੋ ਡੁਪਲੀਕੇਟ ਹਟਾਓ - ਕੀ ਡੁਪਲੀਕੇਟ ਹਟਾਉਣੇ ਹਨ\? + ਡੁਪਲੀਕੇਟ ਹਟਾਉਣੇ ਹਨ\? ਕੀ ਤੁਸੀਂ ਇਸ ਪਲੇਲਿਸਟ ਵਿੱਚ ਸਾਰੀਆਂ ਡੁਪਲੀਕੇਟ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? - ਅੱਗੇ ਦਿੱਤੀਆਂ ਸਟ੍ਰੀਮਾਂ ਵਿਖਾਓ - ਪੂਰੀ ਤਰ੍ਹਾਂ ਵੇਖਿਆ ਗਿਆ + ਨਿਮਨਲਿਖਤ ਸਟ੍ਰੀਮਾਂ ਵਿਖਾਓ + ਪੂਰੀ ਵੇਖਿਆ ਅੰਸ਼ਕ ਤੌਰ \'ਤੇ ਵੇਖਿਆ ਗਿਆ ਆਗਾਮੀ ਹਾਰਡਵੇਅਰ ਮੀਡੀਆ ਬਟਨ ਇਵੈਂਟਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰੋ @@ -766,4 +762,55 @@ ਮੀਡੀਆ ਟਨਲਿੰਗ ਤੁਹਾਡੀ ਡਿਵਾਈਸ \'ਤੇ ਡਿਫ਼ਾਲਟ ਤੌਰ \'ਤੇ ਅਸਮਰੱਥ ਕੀਤੀ ਗਈ ਸੀ ਕਿਉਂਕਿ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਮਾਡਲ ਇਸਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਨ ਲਈ ਜਾਣਿਆ ਜਾਂਦਾ ਹੈ। ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਕੋਈ ਲਾਈਵ ਸਟ੍ਰੀਮ ਨਹੀਂ + ਵੀਡੀਓਜ਼ + ਸਬਸਕ੍ਰਾਈਬਰਜ਼ + ਚੈਨਲ ਪੰਨਿਆਂ \'ਤੇ ਕਿਹੜੀਆਂ ਟੈਬਾਂ ਵਿਖਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ + ਚੈਨਲ ਟੈਬਾਂ + ਸ਼ੌਰਟਸ + ਮੈਟਾਡੇਟਾ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ… + ਚੈਨਲ ਟੈਬਾਂ ਪ੍ਰਾਪਤ ਕਰੋ + ਦੇ ਬਾਰੇ + ਐਲਬਮਜ਼ + ਫ਼ੀਡ ਅੱਪਡੇਟ ਕਰਨ ਵੇਲੇ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਟੈਬਾਂ। ਇਸ ਵਿਕਲਪ ਦਾ ਕੋਈ ਅਸਰ ਨਹੀਂ ਹੁੰਦਾ ਜੇਕਰ ਚੈਨਲ ਨੂੰ ਫਾਸਟ ਮੋਡ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। + ਪਲੇਲਿਸਟਾਂ + ਟ੍ਰੈਕਸ + ਚੈਨਲਜ਼ + ਲਾਈਵ + ਸਕ੍ਰੀਨ ਸਥਿਤੀ ਨੂੰ ਟੌਗਲ ਕਰੋ + ਫੁੱਲ ਸਕ੍ਰੀਨ ਨੂੰ ਟੌਗਲ ਕਰੋ + ਅਗਲੀ ਸਟ੍ਰੀਮ + ਪਲੇ ਕਤਾਰ ਖੋਲ੍ਹੋ + ਅੱਗੇ ਕਰੋ + ਰੀਵਾਈਂਡ ਕਰੋ + ਰੀਪਲੇਅ + ਚਲਾਓ + ਹੋਰ ਵਿਕਲਪ + ਮਿਆਦ + ਪਿਛਲੀ ਸਟ੍ਰੀਮ + ਚਿੱਤਰ ਕੁਆਲਿਟੀ + \? + ਘੱਟ ਕੁਆਲਿਟੀ + ਅਵਤਾਰ + ਉਪ-ਚੈਨਲ ਅਵਤਾਰ + ਚਿੱਤਰ ਲੋਡ ਨਾ ਕਰੋ + ਉੱਚ ਕੁਆਲਿਟੀ + ਦਰਮਿਆਨੀ ਕੁਆਲਿਟੀ + ਅਪਲੋਡਰ ਅਵਤਾਰ + ਬੈਨਰ + ਡਾਟਾ ਅਤੇ ਮੈਮੋਰੀ ਵਰਤੋਂ ਨੂੰ ਘਟਾਉਣ ਲਈ ਚਿੱਤਰਾਂ ਦੀ ਗੁਣਵੱਤਾ ਅਤੇ ਚਿੱਤਰਾਂ ਨੂੰ ਬਿਲਕੁਲ ਲੋਡ ਕਰਨਾ ਹੈ ਜਾਂ ਨਹੀਂ, ਚੁਣੋ। ਤਬਦੀਲੀਆਂ ਇਨ-ਮੈਮੋਰੀ ਅਤੇ ਆਨ-ਡਿਸਕ ਚਿੱਤਰ ਕੈਸ਼ ਨੂੰ ਸਾਫ਼ ਕਰਦੀਆਂ ਹਨ — %s + ਥੰਮਨੇਲ + URL ਸੂਚੀ ਸਾਂਝੀ ਕਰੋ + ਸਿਰਲੇਖਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ + %1$s +\n%2$s + ਪਲੇਲਿਸਟ ਸਾਂਝੀ ਕਰੋ + ਪਲੇਲਿਸਟ ਦੇ ਨਾਮ ਅਤੇ ਵੀਡੀਓ ਸਿਰਲੇਖਾਂ ਜਾਂ ਵੀਡੀਓ URL ਦੀ ਇੱਕ ਸਧਾਰਨ ਸੂਚੀ ਦੇ ਰੂਪ ਵਿੱਚ ਵੇਰਵਿਆਂ ਨਾਲ ਪਲੇਲਿਸਟ ਨੂੰ ਸਾਂਝਾ ਕਰੋ + - %1$s: %2$s + + %s ਜਵਾਬ + %s ਜਵਾਬ + + ਹੋਰ ਵਿਖਾਓ + ਇਸ \'ਤੇ ਟੈਪ ਕਰਕੇ ਹੇਠਾਂ ਹਰੇਕ ਸੂਚਨਾ ਕਾਰਵਾਈ ਨੂੰ ਸੰਪਾਦਿਤ ਕਰੋ। ਪਹਿਲੀਆਂ ਤਿੰਨ ਕਾਰਵਾਈਆਂ (ਪਲੇ/ਪੌਜ਼, ਪਿਛਲਾ ਅਤੇ ਅਗਲਾ) ਸਿਸਟਮ ਦੁਆਰਾ ਸੈੱਟ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਅਨੁਕੂਲਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। + ਘੱਟ ਦਿਖਾਓ \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 613433f5e..0212da91f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -46,7 +46,6 @@ Błąd Błąd sieci Nie udało się załadować wszystkich miniatur - Nie udało się odszyfrować sygnatury URL wideo Nie udało się przetworzyć strony internetowej Treść niedostępna Nie udało się utworzyć menu pobierania @@ -254,9 +253,7 @@ Wymuś raportowanie niedostarczonych wyjątków Rx poza cyklem życia fragmentu lub aktywności po usunięciu Używaj szybkiego, niedokładnego przewijania Niedokładne przewijanie umożliwia szybsze przewijanie ze zmniejszoną dokładnością. Przewijanie o 5, 15 lub 25 sekund nie działa w tym przypadku - Wczytuj miniatury - Wyłącz, aby nie wczytywać miniatur, oszczędzając dane i zużycie pamięci. Zmiana tej opcji czyści pamięć podręczną obrazów - Wyczyszczono pamięć podręczną miniatur + Wyczyszczono pamięć podręczną obrazów Wyczyść pamięć podręczną metadanych Usuwa całą pamięć podręczną stron Wyczyszczono pamięć podręczną metadanych @@ -404,7 +401,7 @@ Nie udało się nadpisać pliku Plik o tej samej nazwie oczekuje na pobranie NewPipe został zamknięty podczas pracy nad plikiem - Brak miejsca na urządzeniu + Brak miejsca na urządzeniu Utracono postęp, ponieważ plik został usunięty Czy chcesz wyczyścić historię pobierania, czy usunąć wszystkie pobrane pliki\? Ogranicz kolejkę pobierania @@ -458,7 +455,7 @@ Język aplikacji Domyślny systemowy Po rozwiązaniu naciśnij „Gotowe” - Gotowe + Gotowe Wideo %d sekunda @@ -621,7 +618,6 @@ Wewnętrzny Prywatny Publiczny - Adres URL miniatury Host Wsparcie Język @@ -787,4 +783,57 @@ Tunelowanie multimediów zostało domyślnie wyłączone na Twoim urządzeniu, ponieważ wiadomo, że model Twojego urządzenia go nie obsługuje Brak strumieni Brak transmisji na żywo + Wideo + Subskrybujący + Karty wyświetlane na stronach kanałów + Karty kanałów + Shorts + Ładowanie metadanych… + Pobieranie kart kanału + Informacje + Albumy + Karty do pobrania podczas aktualizacji kanału. Ta opcja nie działa, jeśli kanał jest aktualizowany w trybie szybkim + Playlisty + Utwory + Kanały + Na żywo + Przełącz orientację ekranu + Włącz/Wyłącz pełny ekran + Następny strumień + Otwórz kolejkę odtwarzania + Przewiń do przodu + Przewiń do tyłu + Odtwórz ponownie + Odtwórz + Więcej opcji + Czas trwania + Poprzedni strumień + Jakość obrazów + \? + Niska jakość + Awatary + Awatary podkanału + Nie ładuj + Wysoka jakość + Średnia jakość + Awatary przesyłającego + Banery + Wybierz jakość obrazów albo czy w ogóle je ładować, aby zmniejszyć zużycie danych i pamięci. Zmiana czyści pamięć podręczną obrazów zarówno w pamięci, jak i na dysku — %s + Miniatury + Udostępnij listę URL-i + Udostępnij z tytułami + %1$s +\n%2$s + Udostępnij playlistę + Udostępnij playlistę ze szczegółami, takimi jak nazwa playlisty i tytuły wideo, lub jako prostą listę adresów URL wideo. + – %1$s: %2$s + + %s odpowiedź + %s odpowiedzi + %s odpowiedzi + %s odpowiedzi + + Pokaż więcej + Pokaż mniej + Edytuj każdą poniższą akcję powiadomienia, naciskając ją. Pierwsze trzy akcje (odtwórz/wstrzymaj, poprzedni i następny) są ustawione przez system i nie można ich dostosować \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 831adfe9e..c0c20636b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1,7 +1,6 @@ Áudio - Não foi possível decodificar assinatura da URL do vídeo Seu comentário (em inglês): O que aconteceu: Informação: @@ -53,12 +52,12 @@ Iniciar Tema Publicado em %1$s - Link não suportado + URL não suportado Ao vivo Downloads Downloads Você quis dizer \"%1$s\"\? - App/IU parou + Aplicativo/IU parou Reproduzindo em segundo plano O menu de download não pôde ser configurado Reproduzir vídeo, duração: @@ -73,7 +72,7 @@ Toque na lupa para começar. Threads Por favor, defina uma pasta de download depois nas configurações - Sem reprodutor de vídeo. Instalar VLC\? + Sem reprodutor de transmissão. Instalar VLC? O site não pôde ser analisado Áudio Reproduzir com Kodi @@ -82,25 +81,25 @@ Usar reprodutor de áudio externo Usar reprodutor de vídeo externo Mostrar opção \"Reproduzir com Kodi\" - O que aconteceu:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo:\\nIdioma do app:\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do Sistema Operacional: - Abrir no modo popup - Resolução padrão do popup + O que aconteceu:\\nPedido:\\nIdioma do conteúdo:\\nPaís do conteúdo:\\nIdioma do aplicativo:\\nServiço:\\nHora GMT:\\nPacote:\\nVersão:\\nVersão do SO: + Abrir no modo Popup + Resolução padrão do Popup Mostrar resoluções mais altas Apenas alguns dispositivos suportam vídeos em 2K/4K Formato de vídeo padrão - Reproduzindo em modo popup + Reproduzindo em modo Popup Tudo Desativado k M Bi Essa permissão é necessária -\npara abrir em modo popup +\npara abrir em modo Popup Limpar Popup Segundo plano - Lembrar propriedades do popup - Lembrar último tamanho e posição do popup + Lembrar propriedades do Popup + Lembrar último tamanho e posição do Popup Remove o som em algumas resoluções Sugestões de pesquisa Escolha as sugestões a serem exibidas enquanto estiver buscando @@ -108,7 +107,7 @@ Licenças de Terceiros Sobre & FAQ Licenças - Stream leve e livre no Android. + Transmissão leve e livre no Android. Ver no GitHub Licença do NewPipe Se você tem ideias de: tradução, mudança no design, limpeza de código ou grandes mudanças de código — ajuda é sempre bem-vinda. Quanto mais se faz, melhor fica! @@ -138,7 +137,7 @@ Histórico Histórico Notificação do NewPipe - Notificações para o player do NewPipe + Notificações para o reprodutor do NewPipe Comportamento Histórico e cache Desfazer @@ -161,7 +160,7 @@ %s vídeos %s vídeos - Player + Reprodutor Nada aqui além de grilos Deseja excluir este item do histórico de busca\? Conteúdo da página inicial @@ -175,50 +174,50 @@ Top 50 Novos e tendências Mostrar dica \"Segure para pôr na fila\" - Mostra dica ao tocar no botão segundo plano ou popup em \"Detalhes:\" do vídeo + Mostra dica ao tocar no botão segundo plano ou Popup em \"Detalhes:\" do vídeo Reproduzir tudo - Este stream não pôde ser reproduzido - Ocorreu um erro irrecuperável no player - Recuperando do erro do player + Não é possível reproduzir esta transmissão + Ocorreu um erro irrecuperável no reprodutor + Se recuperando do erro do reprodutor Remover Detalhes Configurações de áudio Segure para pôr na fila [Desconhecido] Reproduzir em segundo plano - Reproduzir em um popup + Reproduzir em um Popup Doar O NewPipe é desenvolvido por voluntários que usam seu tempo livre para trazer a você a melhor experiência de usuário. Retribua e ajude os desenvolvedores a tornarem o NewPipe ainda melhor enquanto eles desfrutam de uma xícara de café. Retribuir Site oficial Visite o site do NewPipe para mais informações e novidades. - Sem reprodutor de vídeo (você pode instalar o VLC). + Reprodutor de transmissão não encontrado (pode instalar o VLC para assistir). País padrão do conteúdo Sempre Uma vez Mudar para segundo plano - Mudar para popup + Mudar para Popup Mudar para principal - Players externos não suportam estes tipos de links - Nenhum stream de vídeo encontrado - Nenhum stream de áudio encontrado - Player de vídeo - Player em segundo plano - Player popup + Reprodutores externos não suportam estes tipos de URL + Nenhuma transmissão de vídeo encontrada + Nenhuma transmissão de áudio encontrada + Reprodutor de vídeo + Reprodutor em segundo plano + Reprodutor Popup Obtendo informação… Carregando conteúdo solicitado Importar base de dados Exportar base de dados - Substitui seu histórico atual, inscrições, playlists e (opcionalmente) configurações - Exporta histórico, inscrições, playlists e configurações + Substitui seu histórico atual, inscrições, listas de reprodução e (opcionalmente) configurações + Exporta histórico, inscrições, listas de reprodução e configurações Exportado Importado Nenhum arquivo ZIP válido Aviso: Não foi possível importar todos os arquivos. Isso irá sobrescrever suas configurações atuais. - Baixar arquivo + Baixar arquivo de transmissão Mostrar informação - Playlists favoritas + Listas de reprodução favoritas Adicionar a Arraste para ordenar Criar @@ -227,29 +226,29 @@ Último reproduzido Mais reproduzido Sempre perguntar - Nova Playlist + Nova lista de reprodução Renomear Nome - Adicionar à playlist - Definir como miniatura da playlist - Favoritar playlist + Adicionar à lista de reprodução + Definir como miniatura da lista de reprodução + Favoritar lista de reprodução Remover dos favoritos - Excluir esta playlist\? - Playlist criada - Adicionado à playlist - Miniatura da playlist alterada. + Excluir esta lista de reprodução? + lista de reprodução criada + Adicionado à lista de reprodução + Miniatura da lista de reprodução alterada. Sem legendas Ajustar Preencher Zoom Gerado automaticamente - O monitoramento de vazamento de memória pode tornar o app instável durante o heap dumping + O monitoramento de vazamento de memória pode tornar o aplicativo instável durante o despejo de pilha Reportar erros de out-of-lifecycle Forçar entrega de relatórios de erros Rx fora de um fragmento ou atividade de lifecycle após o descarte Usar busca de posição rápida (inexata) A busca inexata permite que o reprodutor de vídeo ache posições mais rápido com a precisão reduzida. Não funciona para voltar ou avançar 5, 15 ou 25 segundos - Pôr próximo vídeo na fila automaticamente - Continua a reprodução da fila (sem repetição) adicionando mais vídeos similares + Enfileirar a próxima transmissão automaticamente + Continua a reprodução da fila (sem repetição) adicionando mais transmissões similares Arquivo Pasta não existe Arquivo/fonte do conteúdo não existe @@ -267,7 +266,7 @@ Não foi possível exportar inscrições Importe inscrições do YouTube pelo Google takeout: \n -\n1. Acesse este link: %1$s +\n1. Acesse este URL: %1$s \n2. Faça login quando solicitado \n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", em seguida, selecione apenas \"assinaturas\" e clique em \"OK\" \n4. Clique em \"Próximo passo\" e em seguida, em \"Criar exportação\" @@ -284,36 +283,34 @@ Tenha em mente que esta operação poderá consumir muitos dados. \n \nVocê deseja continuar\? - Carregar miniaturas Cache de imagens limpo Limpar cache de metadados Remove todos os dados de páginas em cache Cache de metadados limpo Controles de velocidade de reprodução Velocidade - Desative para não carregar miniaturas e economizar no uso de dados e memória. A alteração limpa todo o cache de imagens em memória e em disco Afinação Desvincular (pode causar distorção) Ação de \'abrir\' preferida Ação padrão ao abrir conteúdo — %s - Nenhum stream disponível para baixar + Nenhuma transmissão disponível para baixar Abrir gaveta Fechar gaveta Legendas - Mudar tamanho da legenda e estilos de plano de fundo. Requer reiniciar o app para ter efeito + Mudar tamanho da legenda e estilos de plano de fundo. Requer reiniciar o aplicativo para ter efeito Excluir histórico de vídeo - Exclui o histórico de vídeos e as posições de reprodução + Exclui o histórico de transmissões exibidas e as posições de reprodução Excluir todo o histórico de vídeo\? Histórico de vídeos excluído Excluir histórico de pesquisa - Exclui o histórico de pesquisas feitas + Exclui o histórico de palavras-chave de pesquisa Excluir todo o histórico de pesquisa\? Histórico de busca limpo 1 item excluído. NewPipe é um copyleft de software livre: Você pode usar, estudar, compartilhar e melhorar a seu gosto. Especificamente você pode redistribuir e/ou modificá-lo sob os termos da GNU General Public License como publicado pela Fundação de Software Livre, na versão 3 da Licença, ou (a seu critério) qualquer versão posterior. Você também quer importar as configurações? Política de privacidade do NewPipe - O projeto NewPipe leva sua privacidade muito a sério. Por isso, o app não coleta nenhum dado sem seu consentimento. + O projeto NewPipe leva sua privacidade muito a sério. Por isso, o aplicativo não coleta nenhum dado sem seu consentimento. \nA política de privacidade do NewPipe explica em detalhes quais dados são envidados e salvos quando você manda um relatório de erro. Ler a política de privacidade A fim de cumprir com o Regulamento Geral sobre a Proteção de Dados da UE (RGPD), chamamos sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção. @@ -322,11 +319,11 @@ Recusar Ilimitado Limitar a resolução quando estiver usando dados móveis - Minimizar ao trocar entre apps - Ação ao mudar para outro app a partir do player de vídeo principal — %s + Minimizar ao trocar entre aplicativos + Ação ao mudar para outro aplicativo a partir do reprodutor de vídeo principal — %s Nenhum Minimizar para segundo plano - Minimizar para player popup + Minimizar para reprodutor Popup Avançar durante o silêncio Passo Redefinir @@ -351,7 +348,7 @@ Que abas são visíveis na página inicial Conferências Atualizações - Notificar quando uma nova versão do app estiver disponível + Notificar quando uma nova versão do aplicativo estiver disponível Modo de exibição em lista Lista Grade @@ -401,7 +398,7 @@ O arquivo não pode ser sobrescrito Já existe um download pendente com este nome O NewPipe foi fechado enquanto manipulava o arquivo - Sem espaço disponível + Sem espaço disponível O progresso foi perdido pois o arquivo foi excluído Tempo limite de conexão Excluir todo o histórico de downloads ou excluir todos os arquivos baixados\? @@ -431,30 +428,30 @@ %s ouvintes %s ouvintes - O idioma será alterado após reiniciar o app + O idioma será alterado após reiniciar o aplicativo Duração do salto para avançar/retroceder Instâncias do PeerTube Escolha suas instâncias do PeerTube favoritas Encontre as instâncias que gosta em %s Adicionar instância - Insira o link da instância + Insira o URL da instância Erro ao validar a instância - Apenas links HTTPS são suportados + Apenas os URL HTTPS são suportados A instância já existe Local Adicionado recentemente Mais curtidos - Gerado automaticamente (nenhum uploader encontrado) + Gerado automaticamente (nenhum carregador encontrado) recuperando O download não pôde ser recuperado Escolha uma instância Limpar histórico de downloads Excluir arquivos baixados - Dar permissão para mostrar por cima de outros apps - Idioma do app + Dar permissão para mostrar por cima de outros aplicativos + Idioma do aplicativo Padrão do sistema Toque em \"Pronto\" ao resolver - Pronto + Pronto Vídeos %d segundo @@ -525,8 +522,8 @@ \n \nAtive \"%1$s\" nas configurações se quiser vê-lo. Sim, e vídeos parcialmente vistos - Os vídeos que foram vistos antes e depois de terem sidos adicionados à playlist serão removidos. -\nTem certeza\? Esta ação não pode ser desfeita! + Os vídeos que foram vistos antes e depois de terem sidos adicionados à lista de reprodução serão removidos. +\nTem certeza? Esta ação não pode ser desfeita! Remover vídeos vistos\? Remover vistos Textos originais dos serviços serão visíveis nos itens de transmissão @@ -537,9 +534,9 @@ Miniatura do avatar do canal Mostrar apenas inscrições não agrupadas Mostrando resultados para: %s - Ainda não há playlists favoritas - Página de playlist - Selecione uma playlist + Ainda não há listas de reprodução favoritas + Página da lista de reprodução + Selecione uma lista de reprodução Por favor verifique se uma issue discutindo este problema já existe. Ao criar tickets duplicados, você tira de nós um tempo no qual poderíamos estar usando para corrigir um bug real. Reporte no GitHub Copiar relatório formatado @@ -549,7 +546,7 @@ Reproduzir fila Não foi possível reconhecer a URL. Abrir com outro aplicativo\? Pôr na fila automaticamente - A fila do player ativo será substituída + A fila do reprodutor ativo será substituída Mudar de um reprodutor de vídeo para outro pode substituir sua fila Pedir confirmação antes de limpar uma fila Aleatório @@ -557,7 +554,7 @@ Nada Repetir Você pode selecionar até no máximo três botões para mostrar na notificação compacta! - Edite os botões de ação de notificação abaixo tocando em cada um. Selecione até três deles para serem mostrados na notificação compacta usando as caixas de seleção à direita + Edite os botões de ação de notificação abaixo tocando em cada um. Selecione até três deles para serem mostrados na notificação compacta usando as caixas de seleção à direita. Quinto botão de ação Quarto botão de ação Terceiro botão de ação @@ -580,7 +577,7 @@ Calculando hash Notificações para o progresso do hash do vídeo Notificação de hash do vídeo - Desative para ocultar as caixas de informações de metadados com informações adicionais sobre o criador, conteúdo do stream ou uma solicitação de pesquisa + Desative para ocultar as caixas de informações de metadados com informações adicionais sobre o criador, conteúdo da transmissão ou uma solicitação de pesquisa Mostrar informação de metadados Recente Capítulos @@ -598,7 +595,7 @@ Esta é uma faixa do SoundCloud Go+, pelo menos no seu país, portanto não pode ser transmitida ou baixada pelo NewPipe. Este conteúdo não está disponível em seu país. Este vídeo tem restrição de idade. -\nDevido às novas políticas do YouTube sobre vídeos com restrição de idade, o NewPipe não pode acessar nenhum de seus streams de vídeo e assim ele não pode ser exibido. +\nDevido às novas políticas do YouTube sobre vídeos com restrição de idade, o NewPipe não pode acessar qualquer de suas transmissões de vídeo e assim ela não pode ser exibida. Rádio Destaque Resolvido @@ -615,7 +612,6 @@ Não Listado Público Limite de Idade - URL da Miniatura Hospedado em Suporte Idioma @@ -625,7 +621,7 @@ Categoria Desativar seleção de texto na descrição Ativar seleção de texto na descrição - Agora você pode selecionar o texto dentro da descrição. Note que a página pode piscar e os links podem não ser clicáveis no modo de seleção. + Agora você pode selecionar o texto dentro da descrição. Note que a página pode piscar e os URL podem não ser clicáveis no modo de seleção. Abrir site %s fornece este motivo: Conta encerrada @@ -661,10 +657,10 @@ Exibir indicadores com imagem Adicionado na próxima posição da fila - Adicionar a próxima posição da fila + Enfileira a próxima Deslize items para remove-los - Não inicia os vídeos no player reduzido, mas muda direto para o modo de tela cheia, se a rotação automática estiver travada. Você ainda consegue acessar o player reduzido saindo da tela cheia - Iniciar o player principal em tela cheia + Não inicia os vídeos no reprodutor reduzido, mas muda direto para o modo de tela cheia, se a rotação automática estiver travada. Você ainda consegue acessar o reprodutor reduzido saindo da tela cheia + Iniciar o reprodutor principal em tela cheia Sugestões de busca remotas Sugestões de busca locais Processando… Pode demorar um pouco @@ -672,8 +668,8 @@ Procurar manualmente por novas versões Procurando por atualizações… Travar o reprodutor de vídeo - Mostrar \"Travar o player\" - Mostra uma opção de travamento ao usar o player + Mostrar \"Fechar o reprodutor\" + Mostra uma opção de travamento ao usar o reprodutor Novos itens do feed Notificação de relatório de erro Notificações para reportar erros @@ -689,9 +685,9 @@ O LeakCanary não está disponível ExoPlayer padrão Notificação do reprodutor - Configurar a notificação do fluxo da reprodução atual + Configurar a notificação da reprodução da transmissão atual Notificações - Novos streams + Novas transmissões Notificações sobre novas transmissões para inscrições Notificações de novas transmissões Notificar sobre novas transmissões de inscrições @@ -707,17 +703,17 @@ %s novas transmissões %s novas transmissões - Executar verificação de novas transmissões + Verifica por novas transmissões Conexão de rede necessária As notificações estão desativadas Seja notificado Por cento Semitom - A transmissão selecionada não é compatível com players externos - Nenhum transmissão de áudio está disponível para players externos - Transmissões que ainda não são suportadas pelo downloader não são exibidos - Nenhum vídeo de transmissão está disponível para players externos - Selecione a qualidade para players externos + A transmissão selecionada não é compatível com reprodutores externos + Nenhum transmissão de áudio está disponível para reprodutores externos + Transmissões que ainda não são suportadas pelo baixador não são exibidos + Nenhum vídeo de transmissão está disponível para reprodutores externos + Selecione a qualidade para reprodutores externos Formato desconhecido Qualidade desconhecida Tamanho do intervalo de carregamento da reprodução @@ -734,20 +730,20 @@ Cartão Falha ao copiar para a área de transferência Duplicata adicionada %d vez(es) - As playlists em cinza já contêm este item. + As listas de reprodução em cinza já contêm este item. Ignorar eventos de botão de mídia de hardware Útil, por exemplo, se você estiver usando um fone de ouvido com botões físicos quebrados Remover duplicados Remover duplicados\? - Deseja remover todos os streams duplicados nesta playlist\? - Mostrar os seguintes streams - Mostrar/ocultar streams + Deseja remover todos as transmissões duplicadas nesta lista de reprodução? + Mostrar as transmissões seguintes + Mostrar/ocultar transmissões Parcialmente assistido Em breve Totalmente assistido - Escolha o gesto da mão esquerda da tela do jogador + Escolha o gesto da mão esquerda da tela do reprodutor Ação do gesto esquerdo - Escolha o gesto da mão direita da tela do jogador + Escolha o gesto da mão direita da tela do reprodutor Brilho Volume Nenhum @@ -759,19 +755,19 @@ Selecionar um áudio com descrição para pessoas com dificuldades de visão, se disponível Áudio: %s Faixa de áudio - Seleciona faixa de áudio para players externo + Seleciona faixa de áudio para reprodutor externo Desconhecido Configurações de ExoPlayer - Gerenciar algumas configurações de ExoPlayer. É necessário reiniciar o player para aplicar as mudanças + Gerenciar algumas configurações de ExoPlayer. É necessário reiniciar o reprodutor para aplicar as mudanças %1$s %2$s original dublado descritivo - Esta solução alternativa libera os codificadores de vídeo quando ocorre uma alteração de superfície, em vez de definir a superfície para o codec diretamente. Já usado pelo ExoPlayer em alguns dispositivos com esse problema, essa configuração só tem efeito no Android 6 e superior + Esta solução alternativa libera os codificadores de vídeo quando ocorre uma alteração de superfície, no lugar de definir a superfície para o Codec diretamente. Já usado pelo ExoPlayer em alguns dispositivos com esse problema, essa configuração só tem efeito no Android 6 e superior \n \nAtivar esta opção pode evitar erros de reprodução ao alternar o reprodutor de vídeo atual ou alternar para tela cheia - Uma faixa de áudio já deve estar presente neste stream - Utilizar a função de fallback do decodificador do ExoPlayer + Uma faixa de áudio já deve estar presente nesta transmissão + Utilizar a contingência do decodificador do ExoPlayer Sempre utilizar o configuração de saída de vídeo alternativa do ExoPlayer Habilite essa opção se você tiver problemas de inicialização do decodificador, que retorna codificadores de baixa prioridade se o decodificador primário falhar. Isso pode resultar em pior desempenho de reprodução Mova o seletor da aba principal para a parte inferior @@ -779,4 +775,56 @@ Nenhuma transmissão Nenhuma transmissão ao vivo O tunelamento de mídia foi desabilitado por padrão em seu dispositivo porque seu modelo é conhecido por não suportá-lo. + Vídeos + Inscritos + Quais guias são mostradas nas páginas do canal + Guias de canal + Shorts + Carregando metadados… + Buscar guias de canal + Sobre + Álbuns + Guias a serem buscadas ao atualizar o feed. Esta opção não tem efeito se um canal for atualizado usando o modo rápido. + Listas de reprodução + Faixas + Canais + Ao vivo + Qualidade da imagem + \? + Compartilhar lista URL + Compartilhar com Títulos + %1$s +\n%2$s + Alterna a orientação da tela + Baixa qualidade + Alternar tela cheia + Avatares + Próxima transmissão + Avatares do subcanal + Abrir a fila de reprodução + Não carregar imagens + Alta qualidade + Compartilhar Lista de Reprodução + Avançar + Retroceder + Repete + Compartilhar lista de reprodução com detalhes como nome da lista de reprodução e títulos de vídeo ou como uma lista simples dos URL de vídeos + Qualidade média + Avatares do carregador + - %1$s: %2$s + Escolha a qualidade das imagens ou se deve carregá-las como estão, para reduzir o uso de dados e memória. Alterações limpam a memória e o cache de imagem no disco — %s + Reproduzir + Mais opções + Miniaturas + Duração + Transmissão anterior + Banners + Mostrar mais + Edite cada ação de notificação abaixo tocando nela. As três primeiras ações (reproduzir/pausar, anterior e seguinte) são definidas pelo sistema e não podem ser personalizadas. + + %s resposta + %s respostas + %s respostas + + Mostrar menos \ No newline at end of file diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 24a8185db..3a6fece0a 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -44,8 +44,8 @@ Histórico de visualizações %s visualização - %s subscritores - %s subscritores + %s visualizações + %s visualizações Deseja limpar o histórico de descargas ou remover todos os ficheiros descarregados\? Histórico e cache @@ -137,7 +137,6 @@ Mostrar resoluções mais altas Sem subscritores Utilizar reprodutor de áudio externo - Desative para parar o carregamento de miniaturas, poupar dados e utilização da memória. As alterações limpam a cache de imagens do disco e da memória Será que queria dizer \"%1$s\"\? Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão Enfileirar @@ -218,12 +217,11 @@ Novos e tendências Remove o histórico de pesquisas Notificação de nova versão - Não foi possível decifrar a assinatura do URL Selecione uma lista de reprodução Última atualização: %s Importar base de dados Relatório de erro - Não há espaço livre no dispositivo + Não há espaço livre no dispositivo Número máximo de tentativas antes de cancelar a descarga A recuperar de um erro do reprodutor Em direto @@ -442,7 +440,6 @@ Formato padrão de áudio O ficheiro não existe ou não tem permissões para ler e/ou escrever O nome do grupo está vazio - Carregar miniaturas Partilhar com Tempo após a última atualização antes de a subscrição ser considerada desatualizada - %s Pesquisar @@ -540,7 +537,7 @@ Toque para detalhes em pausa Mostrar comentários - Aceitar + Concluído Desativar modo rápido Nunca Apenas em Wi-Fi @@ -557,7 +554,7 @@ Baralhar Repetir Pode selecionar, no máximo, três ações para mostrar na notificação compacta! - Edite cada ação de notificação abaixo tocando nela. Selecione até três delas para serem mostrados na notificação compacta a usar as caixas de seleção à direita + Edite cada ação de notificação abaixo, a tocar nela. Selecione até três delas para serem mostradas na notificação compacta, através das caixas de verificação à direita. Quinto botão de ação Quarto botão de ação Terceiro botão de ação @@ -619,7 +616,6 @@ Privado Não listado Público - URL da miniatura Servidor Apoio Idioma @@ -777,4 +773,58 @@ Mova o seletor da guia principal para a parte inferior Posição das guias principais O túnel multimédia foi desativado por predefinição no seu dispositivo porque se sabe que o modelo do dispositivo não o suporta. + Nenhum vídeo em direto + Nenhum vídeo + Qualidade da imagem + Vídeos + \? + Subscritores + Os separadores a mostrar na página Canal + Partilhar lista de URLs + Partilhar com títulos + %1$s +\n%2$s + Separadores do canal + Curtos + A carregar metadados… + Alternar orientação do ecrã + Baixa qualidade + Alternar ecrã completo + Obter separadores de canais + Avatars + Fluxo seguinte + Avatar de subcanais + Abrir fila de reprodução + Não carregar imagens + Alta qualidade + Acerca + Partilhar lista de reprodução + Avançar + Álbuns + Recuar + Repetição + Separadores a obter ao atualizar o feed. Esta opção não tem efeito se um canal for atualizado utilizando o modo rápido. + Partilhe a lista de reprodução com detalhes como o nome da lista de reprodução e os títulos dos vídeos ou como uma simples lista de URLs de vídeos + Média qualidade + Avatar dos publicadores + Bandeiras + Listas de reprodução + - %1$s: %2$s + Escolha a qualidade das imagens e se pretende carregar imagens, para reduzir a utilização de dados e de memória. As alterações limpam a cache de imagens na memória e no disco - %s + Reproduzir + Mais opções + Miniaturas + Faixas + Duração + Canais + Fluxo anterior + Direto + Mostrar mais + Edite cada ação de notificação abaixo a tocar nela. As três primeiras ações (reproduzir/pausa, anterior e seguinte) são definidas pelo sistema e não podem ser personalizadas. + + %s resposta + %s respostas + %s respostas + + Mostrar menos \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 87b475a8b..554082a10 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -13,14 +13,14 @@ Partilhar com Utilizar reprodutor de vídeo externo Utilizar reprodutor de áudio externo - Pasta para ficheiros de vídeo + Pasta para os ficheiros de vídeo Os ficheiros de vídeo descarregados serão guardados aqui - Escolha a pasta para colocar os ficheiros de vídeo + Escolha a pasta para guardar os ficheiros de vídeo Resolução padrão Reproduzir no Kodi Instalar Kore\? Mostrar opção \"Reproduzir no Kodi\" - Mostrar uma opção para reproduzir o vídeo no Kodi + Mostrar opção para reproduzir o vídeo no Kodi Áudio Formato padrão de áudio Descarregar @@ -38,12 +38,11 @@ Aparência Reprodução em segundo plano Erro de rede - Pasta para ficheiros de áudio + Pasta para os ficheiros de áudio Os ficheiros de áudio descarregados serão guardados aqui - Escolha a pasta para colocar os ficheiros de áudio + Escolha a pasta para guardar os ficheiros de áudio Erro Não foi possível carregar todas as miniaturas - Não foi possível decifrar a assinatura do URL Não foi possível processar o site Conteúdo indisponível Conteúdo @@ -62,8 +61,8 @@ Tentar novamente Toque na lupa para começar. Em direto - Transferências - Transferências + Descargas + Descargas Relatório de erro Iniciar Pausa @@ -74,7 +73,7 @@ Toque para detalhes Por favor aguarde… Copiado para a área de transferência - Tem que definir, nas definições, uma pasta para as descargas + Pode definir, mais tarde, uma pasta para as descargas OK Processos Descarga NewPipe @@ -83,7 +82,7 @@ Abrir no modo popup Preto Tudo - k + K M MM Esta permissão é necessária @@ -108,9 +107,9 @@ Acerca de NewPipe Licenças de terceiros © %1$s de %2$s nos termos da %3$s - Sobre e FAQ + Acerca e FAQ Licenças - Aplicação livre de reprodução de transmissões para Android. + Aplicação de reprodução para Android. Ver no GitHub Licença do NewPipe Se tem ideias para: tradução, alterações de desenho, limpeza de código, ou alterações significativas no código fonte - todas as ajudas são bem-vindas. Quanto mais se faz, melhor ficará! @@ -123,7 +122,7 @@ Não foi possível atualizar a subscrição Subscrições Novidades - Histórico de pesquisa + Pesquisar histórico Guardar termos de pesquisa localmente Histórico de visualizações Manter histórico dos vídeos visualizados @@ -132,9 +131,9 @@ Reprodutor Comportamento Histórico e cache - Anular + Desfazer Notificação NewPipe - Notificações para o reprodutor do NewPipe + Notificações para o reprodutor NewPipe Sem resultados Aqui não há nada para ver Sem subscritores @@ -155,7 +154,7 @@ %s vídeos %s vídeos - Transferências + Descargas Carateres permitidos no nome dos ficheiros Os carateres inválidos são substituídos por este valor Carácter de substituição @@ -181,7 +180,7 @@ Detalhes Definições de áudio Iniciar reprodução em segundo plano - Iniciar reprodução num popup + Iniciar reprodução em popup Mostrar informação Listas de reprodução favoritas Sempre @@ -194,18 +193,16 @@ Mudar para popup Mudar para principal Não foi possível reproduzir este vídeo - Os reprodutores externos não suportam este tipo de hiperligações + Os reprodutores externos não possuem suporte a este tipo de ligações Arraste para reordenar Criar Mudar nome Doar Reprodutor de vídeo não encontrado (pode instalar VLC para o efeito). - Descarregar ficheiro de vídeo + Descarregar ficheiro Adicionar a Utilizar pesquisa rápida - Este tipo de pesquisa e mais rápida mas reduz a precisão. Procurar por 5, 15 ou 25 segundos não funciona corretamente - Carregar miniaturas - Desative para parar o carregamento de miniaturas, poupar dados e utilização da memória. As alterações limpam a cache de imagens do disco e da memória + Este tipo de pesquisa é mais rápida mas reduz a precisão. Procurar por 5, 15 ou 25 segundos não funciona corretamente Cache de imagens limpa País padrão para conteúdo Depuração @@ -240,7 +237,7 @@ Reprodutor \'popup\' Perguntar sempre A obter informação… - A carregar o conteúdo solicitado + A carregar conteúdo solicitado Nova lista de reprodução Mudar nome Adicionar à lista de reprodução @@ -265,13 +262,13 @@ Não foi possível exportar as subscrições Importar subscrições do YouTube do Google Takeout: \n -\n1. Vá para este URL: %1$s -\n2. Faça o login quando solicitado -\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", depois selecione apenas \"subscrições\" e clique em \"OK\". -\n4. Clique em \"Próximo passo\" e depois em \"Criar exportação\". +\n1. Aceda ao URL: %1$s +\n2. Inicie sessão +\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", selecione \"Subscrições\" e clique em \"OK\". +\n4. Clique em \"Próximo passo\" e, depois, em \"Criar exportação\". \n5. Clique no botão \"Descarregar\" após aparecer \n6. Clique em IMPORT FILE abaixo e selecione o ficheiro .zip descarregado -\n7. [Se a importação do .zip falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído +\n7. [Se a importação falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído Importe o seu perfil SoundCloud digitando o URL ou a ID.: \n \n1. Ative o modo desktop do seu navegador web (o site não está disponível para dispositivos móveis) @@ -283,16 +280,16 @@ Ritmo Limpar histórico de visualizações Continuar (sem repetição) a fila de reprodução anexando um vídeo relacionado - Mostrar dica \"Toque longo para enfileirar\" - Mostrar dica ao premir em segundo plano ou no botão \"Detalhes:\" da janela popup + Mostrar dica \"Toque longo para colocar na fila\" + Mostrar dica ao premir em segundo plano ou no botão \"Detalhes\" da janela popup Canais Listas de reprodução Faixas Utilizadores Remove o histórico dos vídeos reproduzidos e as posições de reprodução Remover todo o histórico de visualizações\? - Histórico de vídeos apagado - Limpar histórico de pesquisas + Histórico de vídeos eliminado + Remover histórico de pesquisas Remove o histórico de pesquisas Remover todo o histórico de pesquisas\? Histórico de pesquisa removido @@ -300,7 +297,7 @@ NewPipe é desenvolvido por voluntários que utilizam o seu tempo livre para nos proporcionar a melhor experiência. Retribua para ajudar os programadores a tornarem NewPipe ainda melhor. Contribuir Política de privacidade do NewPipe - O projeto NewPipe leva a sua privacidade muito a sério. Por isso, não recolhe nenhum dado sem o seu consentimento. + O projeto NewPipe leva a sua privacidade muito a sério. Por isso, não recolhe dados sem o seu consentimento. \nA polícia de privacidade do NewPipe explica, em detalhe, os tipos de dados enviados sempre que submete um relatório de erro. Ver política de privacidade Adicionar o próximo vídeo à fila automaticamente @@ -312,7 +309,7 @@ Definir como miniatura da lista de reprodução Ajustar Preencher - Modificar escala de legendas e estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações + Alterar escala das legendas e do estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações A monitorização de memória pode tornar a aplicação instável Reportar erros \'out-of-lifecycle\' Forçar reporte de exceções Rx não entregáveis ocorrendo fora do fragmento ou ciclo de vida da atividade após eliminação @@ -343,10 +340,10 @@ Notificações para novas versões do NewPipe Armazenamento externo indisponível Não é possível guardar no cartão SD. Repor pasta de descargas\? - Não foi possível ler as guias gravadas, portanto usando as guias predefinidas + Não foi possível ler os separadores guardados e vamos usar os separadores padrão Repor predefinições Deseja repor as predefinições\? - Contagem de subscrições indisponível + Número de subscrições indisponível Separadores mostrados na página principal Atualizações Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão @@ -359,7 +356,7 @@ em pausa na fila pós-processamento - Enfileirar + Colocar na fila Ação recusada pelo sistema Falha ao descarregar Gerar nome único @@ -373,14 +370,14 @@ Não foi possível encontrar o servidor Não foi possível ligar ao servidor O servidor não envia dados - O servidor não aceita transferências multi-processo, tente novamente com @string/msg_threads = 1 + O servidor não aceita descargas multi-processo, tente novamente com @string/msg_threads = 1 Não encontrado Falha pós-processamento Parar Tentativas máximas Número máximo de tentativas antes de cancelar a descarga Interromper em redes limitadas - Útil ao trocar para dados móveis, mas algumas transferências não podem ser suspensas + Útil ao trocar para dados móveis, mas algumas descargas não podem ser suspensas Eventos Conferências Pendente @@ -398,23 +395,23 @@ Posições de reprodução removidas Ficheiro movido ou eliminado Já existe um ficheiro com este nome - não é possível sobrescrever o ficheiro + Não foi possível substituir o ficheiro Existe uma descarga pendente com este nome NewPipe foi fechado enquanto trabalhava no ficheiro - Não há espaço livre no dispositivo + Não há espaço livre no dispositivo Progresso perdido, o ficheiro foi eliminado Ligação expirada Deseja limpar o histórico de descargas ou remover todos os ficheiros descarregados\? Limitar fila de descargas Permitir apenas uma descarga de cada vez - Iniciar transferências - Pausa nas transferências - Perguntar para onde transferir - Ser-lhe-á perguntado onde guardar cada transferência. -\nAtive o seletor de pastas do sistema (SAF) se quiser transferir para um cartão SD externo + Iniciar descargas + Pausa nas descargas + Perguntar onde guardar + Ser-lhe-á perguntado onde guardar cada descarga. +\nAtive o seletor de pastas do sistema (SAF) se quiser descarregar para um cartão SD externo Utilizar seletor de pastas do sistema (SAF) - \'Storage Access Framework\' permite transferências para um cartão SD externo - Limpar posições de reprodução + \'Storage Access Framework\' permite descargas para um cartão SD externo + Remover posições de reprodução Remove todas as posições de reprodução Remover todas as posições de reprodução\? Alternar serviço atualmente selecionado: @@ -431,20 +428,20 @@ %s ouvintes %s ouvintes - O idioma será alterado assim que reiniciar a app - Duração da pesquisa de avanço/recuo rápido + O idioma será alterado assim que reiniciar a aplicação + Duração de avanço/recuo rápido Instâncias PeerTube - Defina as suas instâncias favoritas PeerTube + Defina as suas instâncias PeerTube preferidas Encontre as instâncias que gosta em %s Adicionar instância Digite o URL da instância Falha ao validar a instância - Apenas os URL HTTPS são suportados + Apenas são suportados os URL HTTPS Instância já existe Local Recentes Mais apreciados - Geração automática (não foi encontrado nenhum enviador) + Geração automática (não foi encontrado nenhum carregador) a recuperar Não é possível recuperar esta descarga Escolha uma instância @@ -454,11 +451,11 @@ Idioma da aplicação Predefinição do sistema Prima \"Feito\" ao resolver - Aceitar - Acha que a fonte demora muito tempo a carregar\? Se sim, tente ativar o carregamento rápido (pode alterar a opção nas definições ou no botão abaixo). + Feito + Acha que a fonte demora muito tempo a carregar? Se sim, tente ativar o carregamento rápido (pode alterar a opção nas definições ou no botão abaixo). \n \nNewPipe oferece duas estratégias de carregamento: -\n- Obter todo o canal de subscrição - lento, mas completo. +\n- Obter todo o canal - lento, mas completo. \n- Usar um \'endpoint\' dedicado - mais rápido, mas não completo. \n \nA diferença entre os dois é que o rápido geralmente carece de alguma informação, como a duração ou tipo do item (não consegue distinguir entre vídeos em direto e vídeos normais) e pode mostrar menos itens. @@ -471,11 +468,11 @@ Disponível em alguns serviços, é geralmente muito mais rápido, mas pode devolver uma quantidade limitada de itens e muitas vezes informações incompletas (por exemplo, sem duração, tipo de item, sem estado ativo) Se possível, obter de uma fonte dedicada Atualizar sempre - Tempo após a última atualização antes de a subscrição ser considerada desatualizada - %s + Tempo após a última atualização antes da subscrição ser considerada desatualizada - %s Limite de atualização da fonte Fonte Novo - Deseja apagar este grupo\? + Deseja remover este grupo? O nome do grupo está vazio %d selecionado @@ -521,7 +518,7 @@ Artistas Álbuns Músicas - Este vídeo está restringido a idades. + Este vídeo está restringido a adultos. \n \nPara o poder ver, tem que ativar \"%1$s\" nas definições. Os vídeos que tenham sido vistos antes e depois de serem adicionados à lista de reprodução serão removidos. @@ -550,18 +547,18 @@ Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1 Cortar miniatura na proporção 1:1 Iniciar reprodução automaticamente — %s - Reproduzir fila + Fila de reprodução Nunca A carregar - A fila do reprodutor ativo será substituída + A fila de reprodução atual será substituída URL não reconhecido. Abrir com outra aplicação\? - Enfileiramento automático + Colocar na fila automaticamente Baralhar Apenas em Wi-Fi Nada Mudar de um reprodutor para outro pode substituir a sua fila - Pedir confirmação antes de limpar uma fila - Edite cada ação de notificação abaixo com um toque. Selecione até três para serem mostradas na notificação compacta utilizando as caixas de seleção à direita + Pedir confirmação antes de limpar a fila + Edite cada ação de notificação abaixo, tocando na mesma. Seleccione até três delas para serem mostradas na notificação compacta, utilizando as caixas de verificação à direita. Pode selecionar, no máximo, três ações para mostrar na notificação compacta! Repetir Quinto botão de ação @@ -571,14 +568,14 @@ Limpar cookies que NewPipe armazena quando resolve um reCAPTCHA Os cookies reCAPTCHA foram limpos Limpar cookies reCAPTCHA - O YouTube fornece um \"Modo restrito\" que oculta o conteúdo destinado a adultos + O YouTube fornece um \"Modo restrito\" que oculta conteúdo, potencialmente, destinado a adultos Mostrar conteúdo possivelmente impróprio para crianças porque tem um limite de idade (como 18+) - Personalizar a cor da notificação conforme a cor principal na miniatura (esta opção não está disponível em todos os dispositivos) - Colorir notificação - Usar miniaturas no fundo do ecrã de bloqueio e em notificações + Personalizar cor da notificação com a cor principal da miniatura (esta opção não está disponível em todos os dispositivos) + Notificação colorida + Usar miniatura como fundo do ecrã de bloqueio e nas notificações Mostrar miniatura A calcular \'hash\' - Notificar sobre o progresso das \'hash\' de vídeos + Notificar sobre o progresso das \'hash\' dos vídeos Notificação \'hash\' do vídeo Recentes Desative para ocultar as caixas com informações adicionais acerca do criador, do conteúdo ou de um pedido de pesquisa @@ -586,18 +583,18 @@ Não possui qualquer aplicação para abrir este ficheiro Capítulos Descrição - Emissões relacionadas + Itens relacionados Comentários Desative para ocultar a descrição do vídeo e informações adicionais Mostrar descrição Abrir com - A app travou + Terminar aplicação Este vídeo tem uma restrição de idade. -\nDevido às novas políticas do YouTube quanto a vídeos com restrição de idade, o NewPipe não pode aceder as estes vídeos, por isso não consegue reproduzi-lo. - Este conteúdo só está disponível para utilizadores que pagaram, portanto não pode ser transmitido ou descarregado pelo NewPipe. - Este vídeo está disponível apenas para os membros do YouTube Music Premium, portanto não pode ser transmitido ou descarregado pelo NewPipe. - Este conteúdo é privado, portanto não pode ser transmitido ou descarregado pelo NewPipe. - Esta é uma faixa de SoundCloud Go+, pelo menos no seu país, pelo que não pode ser transmitida ou descarregada por NewPipe. +\nDevido às novas políticas do YouTube quanto a restrição de alguns vídeos, o NewPipe não pode aceder a estes vídeos e, por isso, não os consegue reproduzir. + Este conteúdo só está disponível para utilizadores pagantes e não pode ser reproduzido ou descarregado pelo NewPipe. + Este vídeo só está disponível para os membros do YouTube Music Premium e não pode ser reproduzido ou descarregado pelo NewPipe. + Este conteúdo é privado e não pode ser reproduzido ou descarregado pelo NewPipe. + Esta é uma faixa SoundCloud Go+ e, pelo menos no seu país, não pode ser reproduzida ou descarregada por NewPipe. Este conteúdo não está disponível no seu país. Rádio Destaques @@ -608,38 +605,37 @@ Automático (Tema do dispositivo) Tema escuro Mostrar detalhes do canal - Desative o túnel multimédia se tiver um ecrã preto ou gaguejo na reprodução de vídeo. + Desative o túnel multimédia se tiver um ecrã preto ou paragens na reprodução de vídeos. Desativar túnel multimédia Sempre que descarregar um ficheiro, terá que indicar o local para o guardar - Ainda não foi definida uma pasta de descarregamento, escolha agora a pasta de descarregamento padrão + Ainda não definiu uma pasta para as descargas. Escolha agora a pasta a utilizar %s fornece este motivo: Conta encerrada - O modo de feed rápido não fornece mais informações sobre isto. + O modo de fonte rápida não fornece mais informações sobre isto. A conta do autor foi encerrada. -\nNewPipe não será capaz de carregar este feed no futuro. -\nQuer cancelar a inscrição deste canal\? - Não foi possível carregar o feed para \'%s\'. - Erro ao carregar o feed - A partir do Android 10, apenas o \'Storage Access Framework\' é compatível - Pré-visualização da miniatura da barra de pesquisa +\nNewPipe não será capaz de carregar esta fonte. +\nDeseja cancelar a subscrição deste canal? + Não foi possível carregar a fonte para \'%s\'. + Erro ao carregar a fonte + A partir de Android 10, apenas \'Storage Access Framework\' é compatível + Pré-visualização da miniatura na barra de pesquisa Marcar como visto Desligado Ligado Modo tablet - Abrir site de web - Entusiasmado pelo criador + Abrir site + Adorado pelo criador Interno Privado Não listado Público - URL da miniatura Servidor - Apoio + Suporte Idioma Limite de idade Privacidade Licença - Marcadores + Etiquetas Categoria Desativar seleção de texto na descrição Ativar seleção de texto na descrição @@ -647,7 +643,7 @@ Não mostrar Baixa qualidade (menor) Alta qualidade (maior) - Comentários estão desativados + Os comentários estão desativados Mostrar fitas coloridas de Picasso em cima das imagens que indicam a sua fonte: vermelho para rede, azul para disco e verde para memória Mostrar indicadores de imagem Sugestões de pesquisa remotas @@ -662,121 +658,173 @@ %s descargas concluídas %s descargas concluídas - Deslizar itens para removê-los - Não iniciar vídeos no reprodutor mini, mas ir diretamente ao ecrã completo se a rotação automática estiver bloqueada. Ainda pode aceder o reprodutor mini se sair do modo de ecrã completo + Deslize nos itens para os remover + Não iniciar vídeos em mini-reprodutor e ativar ecrã completo, se a rotação automática estiver bloqueada. Pode aceder ao mini-reprodutor se sair do modo de ecrã completo. Iniciar reprodutor principal em ecrã completo - Enfileirado o próximo - Pôr na fila o próximo - A processar… Pode demorar um momento + Seguinte colocado na fila + Colocar seguinte na fila + A processar… Pode levar algum tempo Procurar atualizações Verificar manualmente se existe uma nova versão A procurar atualizações… Novos itens - Travar o reprodutor + Terminou o reprodutor Mostrar \"Travar o reprodutor\" - Mostra uma opção de travamento ao usar o reprodutor - Notificação de relatório de erros + Mostra uma opção para terminar o reprodutor + Notificação para relatórios de erro Notificações para reportar erros - NewPipe encontrou um erro, toque para relatar + NewPipe encontrou um erro, toque para reportar Ocorreu um erro, veja a notificação - Mostrar um snackbar de erro + Mostrar uma barra de erros Criar uma notificação de erro - Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. -\nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas configurações de descarregar + Não foi encontrado um gestor de ficheiros apropriado para esta ação. +\nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas definições das descargas Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. -\nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework - Comentário fixado - LeakCanary não está disponível - Predefinido do ExoPlayer +\nPor favor, instale um gestor de ficheiros compatível com SAF (Storage Access Framework) + Comentário afixado + LeakCanary não disponível + Predefinição ExoPlayer Notificação do reprodutor - Configurar a notificação da reprodução do vídeo atual + Configurar notificação da reprodução do vídeo atual Notificações A carregar detalhes do vídeo… - Verificar se há novos vídeos + Procurar novos vídeos Notificações sobre novos vídeos - Notificar sobre novos vídeos nas assinaturas + Notificar sobre novos vídeos nas subscrições Frequência da verificação - Conexão de rede necessária + Requer uma ligação de rede Qualquer rede - Agora assinou este canal + É agora um subscritor deste canal Alternar tudo - Apagar todos os ficheiros descarregados do disco\? + Remover todos os ficheiros descarregados? Novos vídeos - Notificações sobre novos vídeos para assinaturas + Notificações sobre novos vídeos nas subscrições - %s vídeo novo - %s vídeos novos - %s vídeos novos + %s novo vídeo + %s novos vídeos + %s novos vídeos - Seja notificado - Notificações são desativadas + Obter notificação + As notificações estão desativadas , - Por cento - Semitom - As transmissões que ainda não são suportadas para descarregamento não são mostradas - Não estão disponíveis transmissões de áudio a reprodutores externos - Não estão disponíveis transmissões de vídeo a reprodutores externos + Percentual + Semi-tom + Os vídeos não suportadas para descarga não são mostradas + Não estão disponíveis reproduções de áudio para reprodutores externos + Não estão disponíveis reproduções de vídeo para reprodutores externos Selecione a qualidade para reprodutores externos Formato desconhecido Qualidade desconhecida - A transmissão selecionada não é suportada por reprodutores externos + O vídeo selecionado não é suportado por reprodutores externos Tamanho do intervalo de carregamento da reprodução Perguntas frequentes Ver no site - Se está a ter problemas a usar a aplicação, veja estas respostas para perguntas mais comuns! - Ordenação + Se está a ter problemas a usar a aplicação, veja estas respostas para as perguntas mais comuns! + Ordem Modo rápido - Importar ou exportar subscrições do menu de 3 pontos + Importe ou exporte subscrições no menu 3 pontos Já está a executar a versão mais recente do NewPipe Toque para descarregar %s Esta opção só está disponível se estiver selecionado %s para o tema - Desativar miniatura permanente + Desativar miniatura permanentemente Não foi possível copiar para a área de transferência Cartão As listas de reprodução acinzentadas já contêm este item. - Duplicar adicionado %d vez(es) - Ignorar eventos com botões físicos - Útil por exemplo se estiver a utilizar auscultadores com botões físicos danificados + Duplicado adicionado %d vez(es) + Ignorar botões físicos + Útil, por exemplo, se estiver a utilizar auscultadores com botões físicos danificados Remover duplicados Remover duplicados\? Mostrar/ocultar vídeos - Proximamente - Quer remover todos os vídeos duplicados nesta lista de reprodução\? + Brevemente + Deseja remover todos os vídeos duplicados desta lista de reprodução? Completamente visto - Mostrar os seguintes vídeos + Mostrar vídeos seguintes Parcialmente visto - Ação do gesto para a esquerda - Ação do gesto para a direita + Ação para o gesto à esquerda + Ação para o gesto à direita Brilho Volume - Nenhum - Escolha o gesto para a metade esquerda do ecrã do reprodutor - Escolha o gesto para a metade direita do ecrã do reprodutor + Nada + Escolha o gesto para a parte esquerda do ecrã + Escolha o gesto para a parte direita do ecrã Seleciona o áudio com descrição para pessoas com dificuldades de visão, se disponível - Esta solução alternativa liberta e re-instancia os codificadores de vídeo quando ocorre uma alteração da superfície, em vez de definir diretamente a superfície para o codificador. Já utilizada pelo ExoPlayer em alguns dispositivos com este problema, esta configuração só tem efeito no Android 6 e superior + Esta solução alternativa liberta os codificadores de vídeo quando ocorre uma alteração da superfície, em vez de definir diretamente a superfície para o codificador. Já utilizada pelo ExoPlayer em alguns dispositivos com este problema, esta definição só tem efeito no Android 6 e superior \n -\nA activação desta opção pode evitar erros de reprodução ao mudar o leitor de vídeo atual ou ao mudar para ecrã inteiro - Altera o tamanho do intervalo de carregamento progressivo (o atual é %s). Um valor menor pode acelerar o carregamento inicial do vídeo +\nA ativação desta opção pode evitar erros de reprodução ao mudar o leitor de vídeo atual ou ao mudar para ecrã inteiro + Altera o tamanho do intervalo de carregamento progressivo (atualmente %s). Um valor menor pode acelerar o carregamento inicial do conteúdo Dar preferência ao áudio original - Selecionar o áudio original independentemente do idioma + Seleciona o áudio original, independentemente do idioma Dar preferência ao áudio descritivo Áudio: %s Faixa de áudio - Já deve existir uma faixa de áudio nesta transmissão - Selecionar faixa de áudio para reprodutores externos + Já deve existir uma faixa de áudio neste vídeo + Selecione a faixa de áudio para reprodutores externos Desconhecida - Configurações ExoPlayer - Gere algumas configurações de ExoPlayer. É necessário reiniciar o reprodutor para aplicar as alterações - Utilizar a função de fallback do descodificador do ExoPlayer + Definições ExoPlayer + Gere algumas definições ExoPlayer. Tem que reiniciar o reprodutor para aplicar as alterações + Utilizar descodificador se recurso do ExoPlayer Ative esta opção se tiver problemas de inicialização do descodificador, que retorna codificadores de baixa prioridade se o descodificador primário falhar. Isto pode resultar num desempenho inferior de reprodução Usar sempre a configuração de saída alternativa de vídeo do ExoPlayer %1$s %2$s original dobrado descritivo - Mova o seletor da guia principal para a parte inferior - Posição das guias principais - O túnel multimédia foi desativado por predefinição no seu dispositivo porque se sabe que o modelo do dispositivo não o suporta. + Mova o seletor do separador principal para a parte inferior + Posição dos separadores principais + O túnel multimédia foi desativado no seu dispositivo porque o seu dispositivo não tem suporte à opção. Nenhum vídeo em direto Nenhum vídeo + A carregar metadados… + Obter separadores de canais + Separadores a obter ao atualizar a fonte. Esta opção não tem efeito se um canal for atualizado utilizando o modo rápido. + Qualidade da imagem + Vídeos + \? + Subscritores + Os separadores a mostrar na página Canal + Partilhar URL + Partilhar com título + %1$s +\n%2$s + Separadores do canal + Curtos + Alternar orientação do ecrã + Baixa qualidade + Alternar ecrã completo + Avatars + Vídeo seguinte + Avatar de subcanais + Abrir fila de reprodução + Não carregar imagens + Alta qualidade + Acerca + Partilhar lista de reprodução + Avançar + Álbuns + Recuar + Repetição + Média qualidade + Avatar dos publicadores + Banners + Listas de reprodução + - %1$s: %2$s + Reproduzir + Mais opções + Miniaturas + Faixas + Duração + Canais + Vídeo anterior + Direto + Partilhe a lista de reprodução com detalhes como o nome da lista de reprodução e os títulos dos vídeos ou como uma simples lista de URLs de vídeos + Escolha a qualidade das imagens e se pretende carregar imagens, para reduzir a utilização de dados e de memória. As alterações limpam a cache de imagens na memória e no disco - %s + Mostrar mais + + %s resposta + %s respostas + %s respostas + + Mostrar menos + Edite cada ação de notificação abaixo a tocar nela. As três primeiras ações (reproduzir/pausa, anterior e seguinte) são definidas pelo sistema e não podem ser personalizadas. \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index ad379c5ca..49a6b592b 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -41,7 +41,6 @@ Eroare Eroare de rețea Nu s-au putut încărca toate miniaturile - Nu s-a putut deobfusca semnătura URL-ului video Nu s-a putut analiza site-ul web Conținut indisponibil Nu s-a putut configura meniul de descărcare @@ -177,12 +176,10 @@ Niciun player pentru streaming găsit. (Totuși, puteți instala VLC). Descărcați fișierul de flux Afișare informații - Playlist-uri salvate + Playlisturi salvate Salvare în Folosește parcurgerea rapidă inexactă Derularea inexactă permite player-ului să deruleze mai rapid, cu o precizie redusă. Derularea timp de 5, 15 sau 25 de secunde nu funcționează cu aceasta - Încarcă miniaturi - Dezactivați pentru a preveni încărcarea miniaturilor, economisirea datelor și utilizarea memoriei. Modificările șterg atât memoria cache a imaginilor în memorie, cât și pe disc Datele cache de imagini au fost șterse Șterge cache-ul pentru metadata Șterge cache-ul pentru datele de pagini web @@ -340,7 +337,7 @@ Selectați instanțele PeerTube preferate Instanțe PeerTube Durată derulare rapidă înainte/înapoi - Gata + Gata Apăsați \"Gata\" după ce ați rezolvat problema Raportați pe GitHub Ștergeți cookie-urile pe care NewPipe le stochează atunci când rezolvați un reCAPTCHA @@ -366,7 +363,7 @@ Redare aleatorie Repetare Puteți selecta cel mult trei acțiuni pentru afișare în notificarea compactă! - Modificați fiecare acțiune de notificare de mai jos, atingând-o. Selectați până la trei dintre ele pentru a fi afișate în notificarea compactă, utilizând casetele de selectare din dreapta + Modifică fiecare acțiune de notificare de mai jos, atingând-o. Selectează până la trei dintre ele pentru a fi afișate în notificarea compactă, utilizând casetele de selectare din dreapta. Al cincilea buton de acțiune Al patrulea buton de acțiune Al treilea buton de acțiune @@ -478,14 +475,14 @@ Nu se poate recupera această descărcare Conexiunea a expirat Progres pierdut, deoarece fișierul a fost șters - Nu a mai rămas spațiu pe dispozitiv + Nu a mai rămas spațiu pe dispozitiv NewPipe a fost închis în timp ce lucra la fișier Post-procesarea a eșuat Nu a fost găsit Serverul nu acceptă descărcări cu mai multe fire, încercați din nou cu @string/msg_threads = 1 Serverul nu trimite date Nu se poate conecta la server - Nu s-a putut găsi server-ul + Nu s-a putut găsi serverul Nu s-a putut stabili o conexiune sigură Folderul de destinație nu poate fi creat Fișierul nu poate fi creat @@ -604,10 +601,10 @@ Acest conținut este disponibil doar pentru utilizatorii care au plătit, ca atare nu poate fi difuzat sau descărcat de NewPipe. Acest videoclip este disponibil doar pentru membrii YouTube Music Premium, ca atare nu poate fi difuzat sau descărcat de NewPipe. Acest conținut este privat, ca atare nu poate fi difuzat sau descărcat de NewPipe. - Aceasta este o piesă SoundCloud Go+, cel puțin în țara ta, deci nu poate fi difuzată sau descărcată de NewPipe. + Aceasta este o piesă SoundCloud Go+, cel puțin în țara dvs., deci nu poate fi difuzată sau descărcată de NewPipe. Acest conținut nu este disponibil în țara dumneavoastră. Afișați detaliile canalului - Temă Nocturnă + Tema de noapte Următorul pus în coadă Adăugați în coadă pe următorul Marcare ca vizionat @@ -620,7 +617,6 @@ Privat Nelistat Public - URL miniatură Gazdă Sprijin Limbă @@ -631,7 +627,7 @@ Categorie Dezactivați selectarea textului în descriere Activați selectarea textului în descriere - Acum puteți selecta text în interiorul descrierii. Rețineți că este posibil ca pagina să pâlpâie, iar link-urile să nu poată fi accesate în modul de selecție. + Acum puteți selecta text în interiorul descrierii. Rețineți că este posibil ca pagina să pâlpâie, iar linkurile să nu poată fi accesate în modul de selecție. %s oferă acest motiv: Contul a fost închis Modul rapid nu furnizează mai multe informații în acest sens. @@ -666,7 +662,7 @@ Miniatură de previzualizare în bara de derulare Afișați panglici colorate de Picasso deasupra imaginilor, indicând sursa acestora: roșu pentru rețea, albastru pentru disc și verde pentru memorie Afișați indicatorii de imagine - Dezactivați tunelarea media dacă întâmpinați un ecran negru sau blocaje la redarea video + Dezactivați tunelarea media dacă întâmpinați un ecran negru sau blocaje la redarea video. Procesarea.. Poate dura un moment Verifică dacă există actualizări Verifică manual dacă există versiuni noi @@ -745,4 +741,91 @@ Vizionat complet Vizionat parțial Urmează + Calitatea imaginii + original + Videouri + \? + Abonați + Necunoscut + Ce file sunt afișate pe paginile canalelor + descriptiv + Distribuiți lista URL + Distribuiți cu titluri + %1$s +\n%2$s + Filele canalului + Volum + Utilizați funcționalitatea de rezervă a decodorului din ExoPlayer + Niciunul + Se încarcă metadata… + Schimbați orientarea ecranului + Gestionați unele setări pentru ExoPlayer. Aceste schimbări necesită un restart la player ca să aibă efect + Calitate scăzută + Poziția filelor principale + Schimbați pe ecran complet + Preluați filele canalului + Avatare + Activați această opțiune dacă aveți probleme cu inițializarea decodorului care trece înapoi la decodoare cu prioritate mai scăzută dacă inițializarea decodoarelor principale eșuează. Asta poate duce la performanță de redare mai slabă decât atunci când se utilizează decodoarele principale. + Acțiunea gestului din dreapta + %1$s %2$s + Utilizați întotdeauna configurarația suprafeței de ieșire video din ExoPlayer ca soluție alternativă + Transmisia viitoare + Tunelizarea media a fost dezactivată în mod implicit pe dispozitivul dumneavoastră deoarece se cunoaște despre acest model de dispozitiv că nu o suportă. + Avatarele subcanalelor + Această soluție alternativă eliberează și reinstanțează codecurile video când se întamplă o schimbare a suprafeței, în loc de a seta suprafața pentru codec direct. Deja +\n folosită de ExoPlayer pe unele dispozitive cu această problemă, această setare are efect doar pe Android 6 sau mai mare +\n +\nActivarea acestei opțiuni poate preveni erorile de redare când se schimbă playerul video curent sau se trece pe ecran complet + O coloană sonoră ar trebui să fie deja prezentă în această transmisie + Deschideți coada de redare + Selectați coloana sonoră originală indiferent de limbă + Nu încărcați imagini + Calitate înaltă + Despre + Distribuiți playlistul + Avansați + Selectați coloana sonoră pentru playeri externi + Albume + Derulați + Reluați + dublat + File ce vor fi preluate când se actualizează fluxul. Această opțiune nu are niciun efect dacă un canal este actualizat folosind modul rapid. + Selectați o coloană sonoră cu descrieri pentru persoane cu deficiențe vizuale, dacă este disponibilă + Acțiunea gestului din stânga + Distribuiți playlistul cu detalii precum numele playlistului și titlurile videourilor sau ca o simplă listă de URL-uri a videourilor + Calitate medie + Preferați audioul descriptiv + Modificați dimensiunea intervalului de încărcare pentru conținuturi progresive (în prezent %s). O valoare mai mică poate accelera încărcarea lor inițială + Preferați audioul original + Audio: %s + Bannere + Playlisturi + Alegeți un gest pentru jumătatea dreaptă din ecranul playerului + - %1$s: %2$s + Mutați fila principală în partea de jos + Coloană sonoră + Fără transmisii în direct + Alegeți calitatea imaginilor și dacă să se încarce sau nu imaginile, pentru a reduce utilizarea datelor și memoriei. Schimbările șterg cache-ul atât din memoria internă cât și din disc --%s + Redați + Mai multe opțiuni + Miniaturi + Setări pentru ExoPlayer + Luminozitate + Durată + Fără transmisii + Canale + Transmisia anterioară + Alegeți un gest pentru jumătatea stângă din ecranul playerului + În direct + Shorturi + Avatarele autorului + Editează fiecare acțiune de notificare de mai jos atingând-o. Primele trei acțiuni (redare/pauză, anterioară și următoare) sunt setate de sistem și nu pot fi personalizate. + + %s răspuns + %s răspunsuri + %s răspunsuri + + Arată mai multe + Arată mai puține + Piste \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f033b6cf6..bd7e5ce20 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -78,8 +78,7 @@ Аудио Повтор Не удалось загрузить все миниатюры - Не удалось расшифровать подпись URL у видео - В фоне + Фон В окне Только некоторые устройства поддерживают видео в 2K/4K Формат видео по умолчанию @@ -298,8 +297,6 @@ Это действие может вызвать большой расход трафика. \n \nПродолжить? - Загружать миниатюры - Отключите, чтобы не загружать миниатюры и сэкономить трафик и память. Изменение настройки очистит кэш изображений Кэш изображений очищен Очистить кэш метаданных Кэш метаданных очищен @@ -408,7 +405,7 @@ не удаётся перезаписать файл В очереди уже есть загрузка с таким именем NewPipe была закрыта во время работы над файлом - Закончилось свободное место на устройстве + Закончилось свободное место на устройстве Прогресс потерян, так как файл был удалён Действительно удалить историю загрузок и загруженные файлы\? Ограничить очередь загрузки @@ -460,7 +457,7 @@ Язык интерфейса Как в системе По завершении нажмите Готово - Готово + Готово Видео %d секунда @@ -565,7 +562,7 @@ Перемешать Повтор В компактном уведомлении доступно не более трёх действий! - Действия можно изменить, нажав на них. Отметьте не более трёх для отображения в компактном уведомлении + Отредактируйте каждое действие уведомления ниже, нажав на него. Выберите до трёх из них, которые будут отображаться в компактном уведомлении, используя флажки справа. Пятое действие Четвёртое действие Третье действие @@ -631,7 +628,6 @@ Приватная Не в списке Публичная - URL миниатюры Сервер Доступность В быстром режиме обновления подробности об этом не предоставляются. @@ -783,4 +779,57 @@ Нет стримов Нет прямых трансляций Медиа-туннелирование на вашем устройстве отключено по умолчанию, поскольку известно, что ваша модель устройства его не поддерживает. + Качество изображения + Видео + \? + Подписчики + Какие вкладки отображаются на страницах каналов + Поделиться списком URL-адресов + Поделиться названиями + %1$s +\n%2$s + Вкладки канала + Шорты + Загрузка метаданных… + Изменить ориентацию экрана + Низкое качество + Переключить полноэкранный режим + Получение вкладок канала + Аватары + Следующий стрим + Аватары подканалов + Открыть очередь воспроизведения + Не загружать изображения + Высокое качество + О канале + Поделиться подборкой + Перемотать вперёд + Альбомы + Перемотать назад + Повторить + Получаемые вкладки при обновлении ленты. Эта функция не применяется, если канал обновляется с помощью быстрого режима. + Поделиться подборкой с подробностями, такими как название подборки и названия видео, или просто списком URL видео + Среднее качество + Загрузчик аватаров + Баннеры + Подборки + - %1$s: %2$s + Выберите качество изображений и загружать ли изображения вообще, чтобы снизить использование данных и памяти. Изменения очищают кэш изображений как в памяти, так и на диске – %s + Воспроизвести + Другие опции + Миниатюры + Дорожки + Продолжительность + Каналы + Предыдущий стрим + Живая трансляция + Показать больше + Показать меньше + + %s ответ + %s ответа + %s ответов + %s ответов + + Отредактируйте каждое действие уведомления ниже, нажав на него. Первые три действия (воспроизведение/пауза, предыдущее и следующее) задаются системой и не подлежат настройке. \ No newline at end of file diff --git a/app/src/main/res/values-ryu/strings.xml b/app/src/main/res/values-ryu/strings.xml index 930a9585f..a531d14bc 100644 --- a/app/src/main/res/values-ryu/strings.xml +++ b/app/src/main/res/values-ryu/strings.xml @@ -43,7 +43,6 @@ うんがくファイルダウンロードするフォルダーさんたくちくぃみそーれー エラー まじりぬサムネイルゆみくみやびらんたん - ちゃーしがぬURLふくごうなやびらんたん ウェブサイトこーいしちなやびらんたん コンテンツがいようなやびらん ふずんメニューしっていなやびらんたん @@ -196,7 +195,6 @@ ちゃーしがダウンロード じょうほうひょうじ ブックマークさるプレイリスト - サムネイルゆみくむん やしがぞうキャッシュしーょうきょさびたん キャッシュしーょうきょ アプリねーんぬキャッシュデータまじりさくじょさます @@ -254,7 +252,6 @@ プライバシーポリシーかくにん おおまかやるシーク おおまかやるシークしようするくとぅっしさいどぅがさがいるかわりんかいこうすくんかいシークぬなやびーん。5びょう、15びょうあらんでぃ25びょうかんかくぬシークーなやびらん - サムネイルぬゆみくみとぅふずんんーかなやーさびーん。(くぬオプションきりけーいねーメモリとぅディスクじょうぬがぞうキャッシュぬしーょうきょさりやびーん) キューんかいかんりんちゃーがちいからちさいせいちづきーん(くいけーしさんーあい) まじりぬさいせいりりきさちゅるじょさびーが? まじりどぅきらんさくりりきさちゅるじょさびーが? @@ -321,7 +318,7 @@ うんじゅがID, soundcloud.com/うんじゅがid くぬあしっさにゆりちうしんりょうきんがかじゅーいるくとぅがあいびーん。ぐちゅういください。 \n -\nずっこうさびーが\? +\nずっこうさびーが? とうるくさゃすう すくどぅとぅうんていりんちゃーさじんかいへいるかん(ゆがむんかむしりやびらん) むうんぬあいだにはやうくり @@ -333,7 +330,7 @@ みーさるNewPipeバージョンぬちうち がいぶちうちゅるすうちはりようなやびらん っちいちんかいむどぅすん - きていぬしっていふちゅるぎんさびーが\? + きていぬしっていふちゅるぎんさびーが? とうるくさゃすうはりようでぃきましん がいぎ ヨーロッパぬいちぱんデータふぐきせい(GDPR)にじゅんきょしーんたみに、NewPipeぬくじんじょうほうふぐほうしんにぐちゅういください。ゆーゆでぃくぃみそーれー。 @@ -372,7 +369,7 @@ ダウンロードちゅうしするまでぃぬさちゃるいさいしこうかいすん ファイルさちゅるじょさびたん アプリぬこうしんちうち - やしがいぶSDカードんかいダウンロードなやびらん。ダウンロードフォルダーぬばしょリセットさびーが\? + やしがいぶSDカードんかいダウンロードなやびらん。ダウンロードフォルダーぬばしょリセットさびーが? ふずんさったるタブゆみくみらんたみ、デフォルトぬタブしーようさびーん メインページんかいひょうじさりーるタブ みーさるバージョンがいようかのうなとぅちにアプリぬこうしんかくにんすんちうちひょうじさびーん @@ -395,9 +392,9 @@ ファイルうわがきなやびらん いぬファイルめいぬダウンロードぬしでぃにしんこうちゅうやいびーん ファイルぬさぎょうちゅうにNewPipeぬくーららりやびたん - デバイスんかいにりらりょうぬあいびらん + デバイスんかいにりらりょうぬあいびらん ファイルぬさちゅるじょさったるたみ、しんこうじょうちゅーがうしならりやびたん - ダウンロードりりき、あらんでぃダウンロードさるファイルしーょうきょさびーが\? + ダウンロードりりき、あらんでぃダウンロードさるファイルしーょうきょさびーが? ダウンロードキューぬせいぎん どうじーがてぃーちぬダウンロードぬじっこうさりやびーん ダウンロードぬかいし @@ -409,7 +406,7 @@ ストレージアクセスフレームワークー、がいぶSDカードんかいぬダウンロードぬかのうやいびーん さいせいいちのさくじょ まじりぬさいせいいちさちゅるじょさびーん - まじりぬさいせいいちさちゅるじょさびーが\? + まじりぬさいせいいちさちゅるじょさびーが? サービスぬきりけーい、ぎんじぇーぬしんたく: %sふんぬちゃーしが @@ -449,7 +446,7 @@ アプリぬぎんぐ システムぬっちうぅい とぅきーねー「かんりょう」うちくぃみそーれー - かんりょう + かんりょう ちゃーしが %dびょう @@ -544,7 +541,7 @@ URLにいるしちなやびらんたん。ふかぬアプリっしふぃらちゃびーが? ちまーにひょうじさりーるサムネイル16:9からせいほうけいなさびーん サムネイルせいほうけいなすん - いかタップしちうちぬアクションへんしゅうさびーん。みぎぬわんかいあんチェックボックスしーようしコンパクトやるちまーにひょうじすし3ちまっししんたくさびーん + いかタップしちうちぬアクションへんしゅうさびーん。みぎぬわんかいあんチェックボックスしーようしコンパクトやるちまーにひょうじすし3ちまっししんたくさびーん。 コンパクトやるちまーにひょうじさりーるアクションー3ちまっしいらぶるくとぅがなやびーん! 5ばんみぬアクションボタン 4ばんみぬアクションボタン @@ -612,7 +609,6 @@ ぎんぐ サポート ホスト - サムネイルぬURL ウェブサイトふぃらちゅん ダウンロードぬかーじにふずんすーしょたんにやびーん ダウンロードフォルダーぬなーらしっていさりやびらん。なまちゃーきデフォルトぬフォルダーさんたくちくぃみそーれー @@ -722,9 +718,9 @@ はいーらでぃひょうじさっとーるプレイリストんかえー、しでぃにくぬアイテムぬくくまっとーいびーん。 %dかいじゅうふくちいかさりやびたん くていサムネイルぬしっていこーいじょ - じゅうふくさくじょさびーが\? + じゅうふくさくじょさびーが? たとぅいねー、ぶちりボタンぬやんでぃたるヘッドセットしーようそーーあいにびんりやいびーん - くぬさいせいリストねーんぬじゅうふくさるストリームまじりさくじょさびーが\? + くぬさいせいリストねーんぬじゅうふくさるストリームまじりさくじょさびーが? ハードウェアメディアボタンイベントむしすん じゅうふくさちゅるじょ ちぎぬストリームひょうじ @@ -766,4 +762,55 @@ オリジナル ストリームーあいびらん ライブーいしのーあいびらん + ちゃーしが + とうるくさゃ + チャンネルページんかいひょうじさりーんタブ + チャンネルタブ + ショート + メタじょうほうゆみくどーいびーん… + チャンネルタブしーゅとぅくしーん + しょうさい + アルバム + フィードこうしんすんとぅちなしゅとぅくしーんタブ。 こうすくモードさしてぃチャンネルこうしんすーあえー、かんがぬあいびらん。 + プレイリスト + トラック + チャンネル + ライブ + やしがみんぬむききりかいーん + フルスクリーンんかいきりかいーん + ちぎぬストリーム + さいせいキューふぃらちゅん + フォワード + まきんどぅし + リプレイ + さいせい + うぬふかぬオプション + ちかん + めーぬストリーム + ふぃんしち + + ていふぃんしち + アバター + サブチャンネルぬアバター + やしがぞうゆみくまん + かんふぃんしち + ちゅうふぃんしち + アップローダーぬアバター + バナー + やしがぞうぬふぃんしちとぅぬぞうゆみくむがちゃーがさんたくち、データとぅメモリぬしようりょうさくぎんさびーん。 へんかんにゆり、メモリねーんとぅディスクじょうぬがぞうキャッシュぬりょうほうがクリアさりやびーん — %s + サムネイル + URLリストっしちゅーゆーいん + タイトルちきっしちゅーゆーいん + %1$s +\n%2$s + プレイリストちゅーゆーいん + プレイリストめいてぃがろービデオタイトルんでーぬしょうさいくくむるプレイリスト、あらんでぃビデオURLぬみぬシンプルやるリストとぅしてぃプレイリストちゅーゆーいんさびーん + - %1$s: %2$s + + %sぬへんしん + %sぬへんしん + + なーふぃんんーじゅん + ひょうじいきらくすん + いかぬちうちアクションタップしへんしゅうさびーん。さいしょぬみーちぬアクション (さいせい/いちじていし、めーんかい、ちぎんかい)ーシステムにゆってぃしっていさりてぃうぅい、カスタマイズすしぇーなやびらん。 \ No newline at end of file diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index 836ab01c3..a5959086e 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -59,7 +59,7 @@ ᱛᱮᱥᱟᱨ ᱠᱟᱹᱢᱤ ᱵᱩᱛᱟᱹᱢ ᱫᱚᱥᱟᱨ ᱠᱟᱹᱢᱤ ᱵᱩᱛᱟᱹᱢ ᱢᱟᱲᱟᱝ ᱠᱟᱹᱢᱤ ᱵᱩᱛᱟᱹᱢ - ᱛᱷᱟᱹᱢᱵᱽᱱᱮᱞ ᱫᱚ ᱑:᱑ ᱮᱥᱯᱮᱠᱼᱴ ᱨᱮᱥᱤᱭᱚ ᱨᱮ ᱢᱟᱯ ᱢᱮ + ᱛᱷᱟᱹᱢᱵᱽᱱᱮᱞ ᱫᱚ ᱑:᱑ ᱮᱥᱯᱮᱠᱼᱴ ᱨᱮᱥᱤᱭᱚ ᱨᱮ ᱜᱮᱫ ᱟᱠᱟᱱᱟ ᱴᱷᱤᱠ ᱥᱟᱰᱮ ᱧᱮᱞ ᱠᱟᱱ ᱞᱮᱠᱷᱟ ᱪᱤᱱᱦᱟᱹ ᱠᱟᱜ ᱢᱮ @@ -69,4 +69,689 @@ ᱧᱩᱛ ᱧᱩᱛ ᱛᱷᱤᱢ ᱦᱮᱱᱫᱮ + ᱪᱮᱛᱟᱱ ᱥᱤᱠᱷᱱᱟᱹᱛ (ᱢᱟᱨᱟᱝ) + %1$s %2$s + ᱵᱚᱫᱚᱞ ᱢᱮ + ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱱᱟᱯᱟᱭ ᱨᱩᱣᱟᱹ + ᱦᱟᱹᱴᱤᱧ ᱪᱷᱟᱯᱟ ᱟᱠᱟᱱᱟ + ᱢᱤᱰᱤᱭᱟ ᱴᱚᱱᱮᱞᱤᱝ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱥᱟᱱᱟᱢ ᱚᱵᱚᱫᱷᱤ + ᱰᱤᱯᱷᱚᱞᱴ ᱥᱟᱰᱮ ᱯᱷᱚᱨᱢᱮᱴ + ᱧᱮᱞ ᱱᱟᱜᱟᱢ + ᱠᱷᱤᱞᱚᱱᱰ ᱮᱦᱚᱵ ᱢᱮ + ᱴᱨᱮᱠ + ᱤᱢᱯᱳᱨᱴ ᱰᱮᱴᱟᱵᱮᱥ + ᱪᱷᱟᱸᱪ + ᱟᱢᱟᱜ ᱟᱭᱳ ᱟᱲᱟᱝ, ᱰᱤᱡᱟᱭᱤᱱ ᱵᱮᱵᱚᱥᱛᱟ, ᱠᱳᱰ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ, ᱟᱨᱵᱟᱝ ᱟᱹᱰᱤ ᱢᱟᱨᱟᱝ ᱠᱳᱰ ᱵᱮᱵᱚᱥᱛᱟ ᱨᱮᱱᱟᱜ ᱟᱭᱳ ᱟᱲᱟᱝ ᱢᱮᱱᱟᱜᱼᱟ ⁇ ᱜᱚᱲᱚ ᱫᱚ ᱡᱚᱛᱚ ᱚᱠᱛᱚ ᱨᱮᱜᱮ ᱥᱟᱨᱦᱟᱣ ᱢᱮᱱᱟᱜᱼᱟ ᱾ ᱰᱤᱜᱟᱱ ᱠᱟᱹᱢᱤ ᱦᱩᱭ ᱞᱮᱱ ᱠᱷᱟᱱ ᱚᱱᱟ ᱜᱮ ᱱᱟᱯᱟᱭᱚᱜ-ᱟ ᱾ + GitHub ᱨᱮ ᱧᱮᱞ ᱢᱮ + ᱡᱟᱹᱥᱛᱤ ᱞᱟᱭᱠᱟᱨ + ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ ᱯᱷᱤᱞᱤᱯ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱰᱤᱥᱠ ᱠᱷᱚᱱ ᱡᱚᱛᱚ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ ᱯᱷᱤᱞ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ? + ᱨᱮᱰᱤᱭᱳ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ + ᱜᱽᱨᱤᱰ + ᱥᱴᱚᱯ + ᱰᱟᱩᱱᱞᱚᱰ ᱞᱤᱢᱤᱴᱮᱰ ᱠᱩᱣᱮ + ᱢᱩᱬᱩᱛ ᱴᱮᱵᱽ ᱵᱟᱪᱷᱟᱣᱤᱭᱟᱹ ᱫᱚ ᱞᱟᱛᱟᱨ ᱨᱮ ᱞᱟᱜᱟᱜ ᱢᱮ + ᱵᱞᱮᱠ ᱥᱟᱦᱴᱟ + ᱠᱟᱨᱰ + ᱵᱟᱦᱨᱮ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱵᱷᱤᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱵᱟᱭ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ + ᱵᱟᱦᱨᱮ ᱮᱱᱮᱡᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱟᱠᱟᱱ ᱯᱷᱚᱨᱢᱮᱴ + ᱵᱟᱹᱱᱩᱜᱼᱟ ᱫᱟᱜ + ᱱᱚᱶᱟ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ_x000D_ +\nᱯᱚᱯ-ᱟᱯ ᱢᱚᱰ ᱨᱮ ᱮᱛᱦᱚᱵ ᱢᱮ + ᱡᱚᱠᱷᱚᱱ ᱥᱟᱦᱟᱣ ᱟᱠᱟᱱᱟ \"Done\" ᱚᱞ ᱢᱮ + ᱨᱩᱣᱟ. + ᱠᱤᱭᱳᱥᱠ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱱᱟᱣᱟ ᱟᱨ ᱦᱮᱴ + ᱱᱟᱦᱟᱜ ᱥᱮᱞᱮᱫ ᱟᱠᱟᱱᱟ + ᱪᱟᱱᱮᱞ ᱵᱟᱰᱟᱭ ᱧᱮᱞ ᱢᱮ + ᱤᱱᱠᱭᱩᱤᱝ + ᱮᱱᱠᱭᱩᱣᱮᱰ + ᱚᱛᱱᱚ ᱨᱮ ᱥᱮᱞᱮᱫ ᱮᱛᱚᱦᱚᱵ ᱢᱮ + ᱡᱚᱛᱚ ᱚᱠᱛᱚ ᱯᱮᱨᱮᱡ ᱢᱮ + ᱤᱱᱯᱷᱳ ᱧᱟᱢ… + ᱞᱟᱹᱠᱛᱤ ᱟᱠᱟᱱ ᱥᱟᱦᱴᱟ ᱞᱚᱰ ᱮᱱᱟ + ᱧᱩᱛᱩᱢ + ᱥᱮᱨᱮᱧ ᱞᱤᱥᱴᱤ ᱨᱮ ᱥᱮᱞᱮᱫᱽ ᱢᱮ + ᱠᱟᱹᱢᱤᱦᱚᱨᱟ... ᱚᱠᱛᱚ ᱫᱷᱟᱹᱵᱤᱡ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ + ᱠᱨᱟᱥ ᱴᱷᱮᱱ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ + ᱟᱢᱟᱜ ᱚᱱᱚᱞ ᱨᱮ ᱢᱤᱰᱤᱭᱟ ᱴᱩᱱᱮᱞᱤᱝ ᱫᱚ ᱰᱤᱯᱚᱞᱴ ᱞᱮᱠᱟᱛᱮ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ ᱪᱮᱫᱟᱜ ᱥᱮ ᱟᱢᱟᱜ ᱚᱱᱚᱞ ᱢᱚᱰᱮᱞ ᱱᱚᱶᱟ ᱵᱟᱭ ᱥᱚᱦᱚᱫᱟ ᱾ + ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱢᱤᱫ error ᱥᱱᱮᱠᱵᱟᱨ ᱧᱮᱞ ᱢᱮ + URL ᱥᱮ ᱟᱢᱟᱜ ID ᱚᱞ ᱠᱟᱛᱮᱜ ᱢᱤᱫ SoundCloud ᱯᱨᱚᱯᱷᱟᱭᱤᱞ ᱮᱢ ᱢᱮ:_x000D_ +\n_x000D_ +\n1. ᱢᱤᱫ ᱣᱮᱵᱽ-ᱵᱽᱨᱟᱣᱡᱚᱨ ᱨᱮ \"ᱰᱮᱥᱠᱴᱚᱯ ᱢᱳᱰ\" ᱮᱱᱮᱡ ᱢᱮ (ᱡᱚᱵᱮᱛᱟᱨᱮ ᱢᱚᱵᱟᱭᱤᱞ ᱰᱤᱵᱟᱤᱥ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱧᱟᱢᱚᱜᱼᱟ)_x000D_ +\n2. ᱱᱚᱶᱟ URL ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ: %1$s_x000D_ +\n3. ᱞᱚᱜᱤᱱ ᱢᱮ ᱡᱚᱠᱷᱚᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ_x000D_ +\n4. ᱟᱢ ᱚᱠᱟ ᱨᱮ ᱥᱮᱞᱮᱫ ᱞᱮᱱᱟᱢ ᱚᱱᱟ ᱯᱨᱚᱯᱷᱟᱭᱤᱞ URL ᱠᱚᱯᱤ ᱢᱮ. + ᱯᱞᱮᱵᱮᱠ ᱥᱯᱤᱰ ᱠᱚᱱᱴᱨᱚᱞ + ᱴᱮᱢᱯᱳ + ᱵᱚᱫᱚᱞ ᱢᱮ (ᱵᱚᱫᱚᱞ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ) + ᱥᱤᱛᱩᱝ ᱚᱠᱛᱚ ᱨᱮ ᱯᱷᱮᱥᱯᱷᱚᱨᱰ ᱢᱮ + ᱯᱨᱚ᱐ᱤᱥᱚᱫ + ᱮᱠᱥᱮᱯᱴ + ᱱᱟᱣᱟ ᱥᱴᱨᱚᱢ ᱨᱮᱭᱟᱜ ᱠᱷᱚᱵᱚᱨ + ᱪᱟᱪᱞᱟᱣ ᱚᱵᱚᱥᱛᱟ + ᱱᱟᱣᱟ ᱥᱟᱦᱴᱟ ᱧᱮᱞ ᱢᱮ + ᱛᱷᱟᱯᱚᱱ + ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱟᱱᱟᱜ ᱢᱤᱫ ᱯᱷᱤᱞ ᱢᱮᱱᱟᱜᱼᱟ + ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱟᱱ ᱢᱤᱫ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ ᱯᱷᱤᱞ ᱢᱮᱱᱟᱜᱼᱟ + ᱥᱤᱠᱷᱱᱟᱹᱛ ᱡᱚᱱᱚᱲᱟᱣ ᱵᱟᱭ ᱛᱮᱭᱟᱨ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ + ᱡᱟᱦᱟᱸ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮ + ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱞᱟᱹᱠᱛᱤᱭᱟᱜ ᱞᱟᱹᱠᱛᱤᱭᱟᱜ ᱞᱟᱹᱠᱛᱤᱭᱟᱜ ᱚᱠᱛᱚ %d ᱥᱮᱠᱮᱱᱰ ᱨᱮ ᱞᱟᱜᱟᱣ ᱟᱠᱟᱱᱟ + ᱪᱮᱫ ᱱᱟᱣᱟ + ᱵᱟᱦᱨᱮ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹᱠᱚ ᱵᱟᱠᱚ ᱥᱚᱦᱚᱫ ᱟᱠᱟᱫ ᱪᱷᱟᱸᱪ + ᱵᱟᱦᱨᱮ ᱯᱞᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱚᱰᱤᱭᱚ ᱥᱴᱨᱤᱢ ᱵᱟᱭ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ + ᱚᱥᱚᱞ + ᱥᱮᱨᱮᱧ + ᱱᱟᱣᱟ + ᱱᱚᱶᱟ ᱨᱮ ᱴᱟᱯ ᱠᱟᱛᱮ ᱞᱟᱛᱟᱨ ᱨᱮ ᱮᱢ ᱟᱠᱟᱱ ᱡᱚᱛᱚ ᱱᱤᱯᱷᱩᱴ ᱮᱠᱥᱚᱱ ᱥᱟᱯᱲᱟᱣ ᱢᱮ ᱾ ᱯᱩᱭᱞᱩ ᱯᱮᱭᱟ ᱠᱟᱹᱢᱤ (ᱯᱞᱮ/ᱯᱷᱟᱣᱩᱥ, ᱯᱩᱭᱞᱩ ᱟᱨ ᱛᱟᱭᱚᱢ) ᱫᱚ ᱥᱤᱥᱴᱚᱢ ᱦᱚᱛᱮᱛᱮ ᱥᱮᱴᱮᱨ ᱟᱠᱟᱱᱟ ᱟᱨ ᱱᱚᱣᱟ ᱠᱚ ᱟᱹᱨᱤᱪᱟᱹᱞᱤ ᱛᱮ ᱵᱟᱭ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ + ᱟᱱᱰᱨᱚᱭᱮᱰ ᱴᱷᱟᱹᱣᱠᱟᱹ ᱟᱠᱟᱱ ᱪᱤᱛᱟᱹᱨ ᱨᱮ ᱢᱩᱬ ᱪᱤᱛᱟᱹᱨ ᱞᱮᱠᱟᱛᱮ ᱱᱤᱯᱷᱩᱴ ᱪᱤᱛᱟᱹᱨ ᱨᱮᱱᱟᱜ ᱨᱚᱝ ᱵᱮᱱᱟᱣ ᱢᱮ (ᱱᱚᱶᱟ ᱡᱚᱛᱚ ᱰᱤᱵᱟᱤᱥ ᱨᱮ ᱵᱟᱝ ᱧᱟᱢᱚᱜᱼᱟ) + ᱴᱟᱴᱠᱟ ᱜᱩᱱᱠᱚ ᱢᱚᱱᱮ ᱠᱟᱜ ᱢᱮ + ᱯᱷᱮᱥᱯᱷᱚᱨᱰ/ᱨᱟᱭᱣᱤᱞᱰ ᱥᱮᱪᱮᱛ ᱚᱠᱛᱚ + ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ, ᱡᱩᱫᱤ ᱟᱢ ᱡᱟᱦᱟᱸᱭ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱫᱚᱞ ᱛᱮ ᱦᱮᱰᱥᱮᱴ ᱠᱚ ᱵᱮᱵᱷᱟᱨ ᱮᱫᱟ + ᱴᱤᱯᱚᱬᱤ ᱠᱚ ᱧᱮᱞ ᱢᱮ + ᱵᱷᱤᱰᱤᱭᱳ ᱵᱟᱵᱚᱫᱽ ᱟᱨ ᱮᱴᱟᱜ ᱵᱟᱰᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱱᱚᱶᱟ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱪᱤᱛᱟᱹᱨ ᱠᱮᱪ ᱵᱚᱫᱚᱞ + ᱠᱟᱪᱷ ᱢᱮᱴᱟᱰᱮᱴᱟ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱥᱟᱱᱟᱢ ᱠᱮᱪ ᱟᱠᱟᱱ ᱣᱮᱵᱽ ᱯᱮᱡ ᱨᱮᱱᱟᱜ ᱰᱮᱴᱟ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱥᱠᱨᱤᱱ ᱨᱮᱱᱟᱜ ᱪᱮᱛᱟᱱ ᱨᱮ ᱪᱤᱱᱦᱟᱹ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱵᱷᱚᱞᱚᱢ + ᱡᱟᱦᱟᱱ ᱵᱟᱝ + ᱛᱚᱨᱡᱚᱢᱟ ᱱᱟᱜᱟᱢ + ᱞᱚᱠᱟᱞ ᱞᱮᱠᱟᱛᱮ ᱥᱩᱪᱚᱱᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱞᱤᱥᱴᱤ ᱨᱮ ᱯᱳᱡᱤᱥᱚᱱ + ᱞᱤᱥᱴᱤ ᱨᱮ ᱯᱞᱮᱼᱯᱷᱚᱞ ᱯᱳᱡᱤᱥᱚᱱ ᱤᱱᱰᱮᱠᱴᱚᱨ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱥᱟᱱᱛᱟᱲᱤ ᱚᱱᱚᱞ + enqueue ᱴᱤᱯ ᱞᱟᱹᱜᱤᱫ ᱫᱚᱦᱚᱭ ᱢᱮ + Details: ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱨᱮ ᱯᱷᱚᱱ ᱥᱮ ᱯᱚᱯᱯᱟᱯ ᱵᱩᱛᱟᱹᱢ ᱞᱟᱜᱟᱣ ᱞᱮᱠᱷᱟᱱ ᱴᱤᱯ ᱮᱢ ᱢᱮ + %s ᱨᱮ ᱟᱢᱟᱜ ᱞᱟᱹᱠᱛᱤ ᱠᱚ ᱧᱮᱞ ᱢᱮ + ᱱᱟᱜᱟᱢ ᱟᱨ ᱠᱷᱟᱪ + ᱧᱮᱧᱮᱞ + ᱰᱤᱵᱩᱜ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱵᱟᱰᱟᱭ + ᱛᱷᱚᱠ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ + ᱱᱚᱶᱟ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱩᱢᱮᱨ ᱦᱟᱹᱴᱤᱧ ᱠᱟᱱᱟ._x000D_ +\n_x000D_ +\nᱡᱩᱫᱤ ᱟᱢ ᱱᱚᱶᱟ ᱧᱮᱞᱢᱮ ᱠᱷᱟᱱ ᱟᱢᱟᱜ ᱥᱤᱴᱤᱝ ᱨᱮ %1$s\" ᱚᱞ ᱢᱮ ᱾\" + ᱰᱟᱩᱱᱞᱚᱰ + ᱰᱟᱩᱱᱞᱚᱰ + ᱟᱞᱵᱚᱢ + ᱟᱨᱴᱤᱥᱴ ᱠᱚ + ᱵᱷᱮᱜᱟᱨ ᱦᱚᱲ + ᱠᱞᱟᱨ + ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱨᱮᱱᱟᱜ ᱯᱞᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱱᱳᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ + ᱵᱷᱤᱰᱤᱭᱳ ᱦᱟᱥᱤᱝ ᱯᱨᱚᱜᱨᱮᱥ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱚᱵᱚᱨ + ᱱᱟᱣᱟ ᱫᱟᱨᱮ ᱠᱚ + ᱥᱮᱞᱮᱫ ᱞᱟᱹᱜᱤᱫ ᱱᱟᱣᱟ ᱥᱴᱨᱚᱢ ᱠᱚ ᱵᱟᱰᱟᱭ ᱦᱚᱪᱚ + ᱵᱟᱹᱲᱤᱡ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱚᱵᱚᱨ ᱠᱚ + [ᱱᱚᱣᱟ ᱵᱟᱰᱟᱭᱚᱜ ᱠᱟᱱᱟ] + reCAPTCHA ᱠᱩᱠᱤ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + reCAPTCHA ᱠᱩᱠᱤ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱮᱠᱥᱯᱳᱨᱴ ᱦᱤᱥᱛᱟ, ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ, ᱯᱞᱮ ᱞᱤᱥᱴ ᱟᱨ ᱥᱮᱴᱤᱝ + ᱧᱮᱞ ᱛᱟᱵᱩᱱ ᱯᱮ ᱱᱟᱜᱟᱢ + ᱠᱷᱮᱞ ᱟᱠᱟᱱ ᱥᱴᱨᱤᱢ ᱨᱮᱱᱟᱜ ᱱᱟᱜᱟᱢ ᱟᱨ ᱠᱷᱮᱞ ᱟᱠᱟᱱ ᱯᱳᱡᱤᱥᱚᱱ ᱠᱚ ᱵᱚᱫᱚᱞᱟ + ᱥᱟᱱᱟᱢ ᱧᱮᱞ ᱱᱟᱜᱟᱢ ᱵᱚᱫᱚᱞ ᱢᱮ? + ᱧᱮᱞ ᱛᱟᱵᱩᱱ ᱯᱮ + ᱵᱟᱦᱨᱮ ᱥᱴᱳᱨᱮᱡ ᱵᱟᱭ ᱧᱟᱢᱚᱜ + ᱧᱮᱞ ᱛᱟᱵᱩᱱ ᱯᱮ ᱺ + ᱦᱟᱛᱟᱝ ᱢᱚᱰ + ᱢᱩᱬᱩᱛ ᱴᱮᱵᱽ ᱨᱮᱱᱟᱜ ᱴᱷᱟᱶ + ᱵᱟᱦᱨᱮ SD ᱠᱟᱨᱰ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱦᱚᱪᱚ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱟ. ᱰᱟᱩᱱᱞᱚᱰ ᱯᱷᱳᱞᱰᱟᱨ ᱞᱚᱠᱮᱥᱚᱱ ᱨᱤᱥᱮᱴ ᱢᱮ ? + ᱡᱚᱛᱚ ᱪᱤᱛᱟᱹᱨ ᱠᱚ ᱞᱚᱰ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱠᱟᱱᱟ + ᱣᱮᱵᱽᱥᱟᱭᱤᱴ ᱵᱟᱭ ᱯᱟᱨᱥ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ + ᱥᱟᱦᱴᱟ ᱵᱟᱹᱱᱩᱜ-ᱟ + ᱵᱟᱦᱨᱮ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚ ᱱᱚᱝᱠᱟᱱ ᱡᱚᱱᱚᱲ ᱠᱚ ᱵᱟᱠᱚ ᱥᱚᱦᱚᱫᱟ + ᱡᱟᱦᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱵᱟᱝ ᱧᱟᱢ ᱟᱠᱟᱱᱟ + ᱚᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱵᱟᱝ ᱧᱟᱢ ᱟᱠᱟᱱᱟ + ᱢᱤᱫ ᱵᱷᱩᱞ ᱦᱩᱭ ᱞᱮᱱᱟ, ᱱᱤᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱧᱮᱞ ᱢᱮ + GitHub ᱨᱮ ᱚᱱᱚᱞ + ᱨᱤᱯᱚᱨᱴ + What:\\nRequest:\\nContent Language:\\nContent ᱫᱤᱥᱚᱢ:\\nApp Language:\\nService:\\nGMT ᱚᱠᱛᱚ:\\nPackage:\\nVersion:\\nOS version: + ᱟᱢᱟᱜ ᱯᱟᱹᱛᱭᱟᱹᱣ (ᱤᱝᱞᱤᱥ ᱛᱮ): + ᱚᱯᱞᱚᱰᱟᱨᱟᱜ ᱟᱵᱟᱛᱟᱨ ᱛᱷᱩᱱᱤᱠᱟ + ᱞᱟᱭᱠ + ᱡᱟᱦᱟᱱ ᱡᱤᱱᱤᱥ + ᱱᱚᱣᱟ ᱨᱮᱫᱚ ᱡᱟᱹᱥᱛᱤ ᱡᱟᱹᱥᱛᱤ ᱠᱨᱤᱠᱮᱴ ᱢᱮᱱᱟᱜᱼᱟ ᱾ + ᱵᱷᱤᱰᱤᱭᱳ + k + M + ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚᱣᱟᱜ ᱞᱮᱠᱷᱟ ᱵᱟᱭ ᱦᱟᱹᱴᱤᱧ ᱟᱠᱟᱱᱟ + ᱵᱟᱱᱩᱜ ᱧᱮᱞ + ᱵᱷᱤᱰᱤᱭᱳ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱑᱐᱐+ ᱵᱷᱤᱰᱤᱭᱳ + ᱡᱤᱣᱤ ᱥᱴᱨᱤᱢ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱪᱮᱠᱥᱢ + ᱵᱚᱫᱚᱞ ᱢᱮ + ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱮᱛᱦᱚᱵ ᱢᱮ ᱾ + ᱠᱞᱤᱯᱵᱳᱨᱰ ᱨᱮ ᱠᱚᱯᱤ ᱟᱠᱟᱱᱟ + reCAPTCHA ᱪᱟᱞᱟᱣ + ᱵᱮᱱᱟᱣ ᱪᱤᱠᱤ + ᱵᱟᱹᱞᱤ ᱪᱤᱠᱤ ᱠᱚ ᱱᱚᱶᱟ ᱢᱟᱹᱱ ᱥᱟᱞᱟᱜ ᱛᱮ ᱵᱚᱫᱚᱞᱚᱜᱼᱟ + ᱚᱞ ᱟᱨ ᱮᱞ + ᱡᱟᱹᱥᱛᱤ ᱵᱤᱥᱮᱥ ᱪᱤᱠᱤ + ᱪᱟᱹᱞᱩ ZIP ᱯᱷᱤᱞ ᱫᱚ ᱵᱟᱝ + ᱞᱟᱹᱱᱟᱹᱤ: ᱡᱚᱛᱚ ᱪᱤᱱᱦᱟᱹ ᱠᱚ ᱤᱱᱯᱷᱚᱨᱢ ᱵᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ. + ᱱᱚᱶᱟ ᱫᱚ ᱟᱢᱟᱜ ᱱᱮᱛᱟᱨᱟᱜ ᱥᱮᱴᱯᱟᱴ ᱩᱫᱩᱜ ᱮᱫᱟ ᱾ + ᱟᱢ ᱥᱤᱴᱤᱝ ᱦᱚᱸ ᱟᱢᱯᱷᱮᱨᱟᱣ ᱦᱩᱭᱩᱜ ᱛᱟᱢᱟ? + ᱠᱚᱢᱮᱱᱴ ᱞᱚᱰ ᱫᱚ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱠᱟᱱᱟ + ᱢᱩᱬ ᱕᱐ + ᱠᱚᱱᱯᱷᱮᱨᱮᱱᱥ + ᱠᱷᱮᱞ ᱞᱟᱦᱟ + ᱥᱟᱦᱟᱣ ᱢᱮ + ᱡᱚᱠᱷᱟ + ᱚᱰᱤᱭᱳ ᱴᱨᱟᱠ + ᱥᱮᱞᱮᱫᱚᱜ ᱞᱟᱹᱜᱤᱫ ᱫᱚᱦᱚᱭ ᱢᱮ + ᱛᱟᱭᱚᱢ ᱛᱮ Enqueue + ᱛᱟᱭᱚᱢ ᱛᱮ ᱥᱮᱞᱮᱫ ᱢᱮ + ᱚᱯᱮᱱ ᱰᱨᱟᱵᱷᱤᱴ + ᱵᱟᱹᱲᱛᱤ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ \"ᱚᱯᱮᱱ\" ᱠᱟᱹᱢᱤ + ⁇ %s ᱡᱚᱠᱷᱚᱱ ᱥᱟᱦᱴᱟ ᱵᱚᱫᱚᱞᱚᱜ-ᱟ + ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱟᱨ + ᱯᱟᱛᱷᱟᱢ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ + ᱯᱚᱯᱯᱟᱯ ᱯᱞᱮᱭᱟᱨ + ᱥᱟᱨᱮᱡ ᱟᱠᱟᱱ ᱯᱞᱮ ᱞᱤᱥᱴᱤ ᱨᱮ ᱱᱤᱛᱚᱜ ᱱᱚᱣᱟ ᱡᱤᱱᱤᱥ ᱢᱮᱱᱟᱜᱼᱟ ᱾ + ᱧᱩᱛᱩᱢ ᱵᱚᱫᱚᱞ ᱢᱮ + Unmute + ᱵᱟᱝ ᱥᱮᱴᱮᱨ ᱟᱠᱟᱱ ᱟᱹᱪᱩᱨ ᱦᱟᱹᱴᱤᱧ + ᱯᱮᱭᱞᱤᱥᱴ + %d ᱚᱠᱛᱚ ᱵᱟᱨᱟᱵᱟᱨᱤ ᱥᱮᱞᱮᱫᱚᱜᱼᱟ + ᱪᱤᱛᱟᱹᱨ ᱵᱮᱱᱟᱣ ᱟᱠᱟᱱᱟ + ᱥᱮᱨᱮᱧ ᱞᱤᱥᱴᱤ ᱨᱮᱱᱟᱜ ᱛᱷᱤᱢᱵᱽᱱᱟᱭᱟᱨ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ. + ᱚᱴᱚ-ᱡᱮᱱᱮᱨᱮᱴ (ᱯᱷᱮᱰᱟᱛ ᱵᱟᱭ ᱧᱟᱢ ᱞᱮᱱᱟ) + ᱚᱞ ᱪᱤᱠᱤ ᱵᱟᱹᱱᱩᱜ + ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ + ᱯᱷᱤᱞᱰ + ᱡᱩᱢ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱜ ᱪᱷᱟᱸᱪ ᱚᱞ ᱨᱮᱱᱟᱜ ᱟᱥᱚᱞ ᱟᱨ ᱯᱟᱛᱷᱟᱢ ᱥᱴᱟᱭᱤᱞᱥ ᱵᱚᱫᱚᱞ ᱢᱮ. ᱪᱟᱹᱞᱩᱜ ᱞᱟᱹᱜᱤᱫ ᱮᱯ ᱮᱥᱴᱟᱨᱴ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ + ᱢᱮᱢᱚᱨᱤ ᱞᱤᱠᱟᱞ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + LeakCanary ᱵᱟᱭ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ + ᱢᱮᱢᱚᱨᱤ ᱞᱤᱠᱟᱞ ᱢᱚᱱᱤᱴᱚᱨᱤᱝ ᱦᱤᱯ ᱰᱟᱢᱯᱤᱝ ᱚᱠᱛᱚ ᱨᱮ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱨᱟᱥᱴᱨᱤᱭ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ + ᱡᱤᱭᱚᱱ ᱪᱤᱠᱤ ᱠᱷᱚᱱ ᱵᱟᱦᱨᱮ ᱨᱮ ᱵᱷᱮᱜᱟᱨ ᱠᱚ ᱚᱱᱚᱞ ᱢᱮ + ᱱᱮᱴᱣᱟᱨᱠ ᱞᱟᱹᱜᱤᱫ red, ᱰᱤᱥᱠ ᱞᱟᱹᱜᱤᱫ blue ᱟᱨ ᱢᱮᱢᱚᱨᱤ ᱞᱟᱹᱜᱤᱫ green + ᱯᱞᱮᱭᱟᱨ ᱵᱮᱵᱷᱟᱨ ᱚᱠᱛᱮ ᱨᱮ ᱠᱨᱟᱥ ᱚᱯᱥᱚᱱ ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ + ᱤᱢᱯᱳᱨᱴ + ᱤᱢᱯᱚᱨᱴ + ᱮᱥᱯᱳᱨᱴ ᱢᱮ + ᱤᱢᱯᱳᱨᱴ… + ᱮᱠᱥᱯᱳᱨᱴ… + ᱤᱢᱯᱳᱨᱴ ᱯᱷᱤᱞ + ᱢᱟᱲᱟᱝ ᱮᱠᱥᱯᱚᱨᱴ + ᱥᱚᱵᱥᱠᱨᱤᱯᱥᱚᱱ ᱮᱢ ᱫᱟᱲᱮᱭᱟᱜ ᱵᱟᱝ ᱠᱟᱱᱟ + \"ᱱᱚᱶᱟ ᱚᱯᱨᱮᱥᱚᱱ ᱨᱮ ᱱᱮᱴᱣᱟᱨᱠ ᱰᱷᱮᱨ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱢᱮᱱᱛᱮ ᱢᱟᱱᱟᱣ ᱢᱮ ᱾\" +\n +\nᱟᱢ ᱫᱚ ᱪᱮᱫ ᱮᱢ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ?\" + ᱨᱤᱥᱮᱴ + ᱥᱮᱢᱤᱴᱚᱱ + ᱰᱷᱮᱨᱚᱜ + ᱞᱤᱢᱤᱴ ᱵᱟᱹᱱᱩᱜ + ᱢᱚᱵᱟᱤᱞ ᱰᱟᱴᱟ ᱵᱮᱵᱷᱟᱨ ᱚᱠᱛᱚ ᱨᱮ ᱞᱤᱢᱤᱴ ᱫᱟᱲᱮ + ᱱᱟᱣᱟ ᱵᱷᱮᱨᱥᱚᱱ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱢᱟᱱᱩᱣᱟᱞ ᱪᱮᱠ + ᱟᱯᱞᱤᱠᱮᱥᱚᱱ ᱥᱤᱴᱤᱪ ᱨᱮ ᱞᱟᱹᱴᱩ ᱦᱚᱪᱚ + ᱢᱩᱬᱩᱛ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱟᱨ ᱠᱷᱚᱱ ᱮᱴᱟᱜ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱚᱠᱛᱚ ᱨᱮᱱᱟᱜ ᱠᱟᱹᱢᱤ ⁇ %s + ᱡᱟᱦᱟᱱ ᱵᱟᱝ + ᱚᱛᱱᱚ ᱯᱞᱮᱭᱟᱨ ᱨᱮ ᱞᱟᱹᱴᱩ ᱦᱚᱪᱚ + Wi-Fi ᱨᱮᱜᱮ + Seekbar thumbnail preview ᱧᱮᱞᱢᱮ + ᱠᱚᱢ ᱠᱣᱟᱞᱤᱴᱤ (ᱢᱤᱫ ᱠᱷᱚᱱ ᱠᱚᱢ) + ᱵᱟᱝ ᱧᱮᱞᱚᱜ + ᱟᱢ NewPipe ᱨᱮᱭᱟᱜ ᱱᱟᱣᱟ ᱵᱟᱨᱥᱚᱱ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ + ᱯᱮᱱᱰᱤᱝ + ᱠᱩᱠᱞᱤ + ᱯᱟᱥᱴᱟ ᱯᱨᱚᱥᱟᱥᱚᱱ + ᱤᱱᱠᱭᱩᱤᱝ + ᱥᱤᱥᱴᱮᱢ ᱦᱚᱛᱮᱛᱮ ᱵᱟᱝ ᱧᱟᱢ ᱟᱠᱟᱱ ᱠᱟᱹᱢᱤ + ᱯᱷᱟᱹᱞ ᱪᱮᱛᱟᱱ ᱵᱟᱝ ᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ + ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱛᱮ ᱢᱤᱫ ᱰᱟᱩᱱᱞᱚᱰ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ + ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱛᱮ ᱢᱤᱫ ᱚᱞᱚᱜ ᱠᱟᱱ ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮᱱᱟᱜᱼᱟ + ᱴᱷᱟᱶ ᱯᱷᱳᱞᱰᱚᱨ ᱛᱮᱭᱟᱨ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ + ᱱᱚᱶᱟ ᱰᱟᱩᱱᱞᱚᱰ ᱫᱚ ᱵᱟᱭ ᱨᱤᱠᱳᱨᱰ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ + ᱰᱟᱩᱱᱞᱚᱰ ᱦᱤᱥᱛᱟ ᱪᱷᱟᱯᱟ ᱢᱮ + ᱟᱹᱰᱤ ᱡᱟᱹᱥᱛᱤ ᱫᱟᱲᱮ + ᱢᱤᱴᱟᱨ ᱛᱮᱭᱟᱨ ᱟᱠᱟᱱ ᱱᱮᱴᱣᱟᱨᱠ ᱨᱮ ᱵᱚᱫᱚᱞ + ᱰᱟᱩᱱᱞᱚᱰ ᱮᱦᱚᱵ ᱢᱮ + ᱧᱮᱞᱚᱜ ᱟᱠᱟᱱ ᱥᱟᱯᱲᱟᱣ ᱢᱮ + ᱧᱮᱞ ᱟᱠᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱪᱷᱩᱴᱟᱹᱣ? + ᱫᱩᱯᱞᱟᱹᱲ ᱠᱚ ᱦᱮᱡ ᱢᱮ + ᱭ, ᱟᱨ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱡᱟᱦᱟᱸ ᱞᱮᱠᱟ ᱧᱮᱞᱚᱜᱼᱟ + ᱪᱟᱱᱮᱞ ᱜᱨᱩᱯ + ᱯᱷᱤᱰ ᱢᱩᱪᱟᱹᱫ ᱵᱚᱫᱚᱞᱟᱠᱟᱱ: %s + ᱵᱟᱝ ᱞᱚᱰ ᱟᱠᱟᱱᱟ: %d + ᱯᱷᱤᱰ ᱞᱚᱰᱚᱜ ᱠᱟᱱᱟ… + ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱡᱚᱢᱟᱜ… + ᱜᱩᱴ ᱧᱩᱛᱩᱢ ᱵᱟᱱᱩᱜᱼᱟ + ᱟᱢ ᱱᱚᱶᱟ ᱜᱽᱨᱩᱯ ᱵᱚᱫᱚᱞ ᱢᱮᱢᱮ? + ᱱᱟᱣᱟ + ᱦᱟᱹᱴᱤᱧ ᱢᱚᱰ ᱨᱮ ᱥᱮᱞᱮᱫ ᱢᱮ + ᱞᱟᱛᱟᱨ ᱨᱮ ᱚᱞ ᱟᱠᱟᱱ ᱥᱴᱨᱤᱢ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱪᱟᱱᱮᱞ ᱛᱟᱵᱽ ᱠᱚ ᱦᱟᱛᱟᱣ + %s ᱛᱮᱭᱟᱨ ᱟᱠᱟᱱᱟ + %s ᱦᱚᱛᱮᱛᱮ + ᱛᱟᱢᱤᱞ ᱪᱤᱛᱟᱹᱨ ᱧᱮᱞ ᱢᱮ + ᱪᱮᱯᱴᱟᱨᱥ + ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ ᱟᱢ ᱢᱤᱫ ᱯᱷᱤᱞ ᱢᱟᱱᱮᱡᱚᱨ ᱤᱱᱥᱴᱚᱞ ᱢᱮ ᱟᱨᱵᱟᱝ ᱰᱟᱩᱱᱞᱚᱰ ᱥᱤᱴᱤᱝ ᱨᱮ ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱯᱨᱚᱵᱷᱟᱣ ᱢᱮ\" + ᱱᱚᱶᱟ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱣᱡᱤᱠ ᱯᱨᱤᱢᱤᱭᱟᱢ ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱜᱮ ᱧᱟᱢᱚᱜᱼᱟ, ᱚᱱᱟᱛᱮ ᱱᱚᱶᱟ ᱫᱚ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱦᱚᱛᱮᱛᱮ ᱵᱟᱝ ᱥᱴᱨᱤᱢ ᱟᱨ ᱵᱟᱝ ᱰᱟᱩᱱᱞᱳᱰ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ + %s ᱫᱚ ᱱᱚᱶᱟ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ: + ᱚᱴᱚᱢᱟᱴᱤᱠ (ᱰᱤᱵᱟᱤᱥ ᱛᱷᱮᱢ) + ᱟᱢᱟᱜ ᱯᱩᱭᱞᱩ ᱧᱤᱫᱟᱹ ᱛᱷᱤᱢ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ⁇ %s + ᱟᱢ ᱞᱟᱛᱟᱨ ᱨᱮ ᱟᱢᱟᱜ ᱧᱤᱫᱟᱹ ᱪᱮᱛᱟᱱ ᱵᱟᱪᱷᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱟ + ᱪᱤᱛᱟᱹᱨ ᱨᱮ ᱚᱞ ᱪᱤᱠᱤ ᱵᱟᱪᱷᱟᱣ ᱫᱚᱦᱚᱭ ᱢᱮ + ᱛᱷᱚᱠ + ᱞᱟᱭᱥᱮᱱᱥ + ᱟᱵᱟᱛᱟᱨ + ᱵᱮᱱᱚᱨ + ᱵᱟᱝ ᱞᱤᱥᱴᱤ ᱟᱠᱟᱱᱟ + ᱱᱤᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱟᱢ ᱱᱤᱛᱚᱜ ᱱᱚᱣᱟ ᱪᱮᱱᱮᱞ ᱨᱮ ᱥᱮᱞᱮᱫ ᱟᱠᱟᱱᱟᱢ + , + ᱵᱟᱦᱨᱮ ᱯᱞᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱚᱰᱤᱭᱚ ᱴᱨᱟᱠ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱧᱟᱢ ᱟᱠᱟᱱ ᱥᱤᱠᱷᱱᱟᱹᱛ + ᱵᱟᱝ ᱵᱟᱰᱟᱭ + ᱡᱚᱛᱚ ᱛᱮ ᱧᱮᱞᱚᱜᱼᱟ + ExoPlayer ᱨᱮᱭᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ ᱟᱯᱩᱴ ᱥᱩᱨᱥᱩᱯᱩᱨ ᱥᱤᱴᱤᱝ ᱣᱟᱨᱠᱟᱨᱚᱸᱜ ᱵᱮᱵᱷᱟᱨ ᱢᱮ + ᱵᱷᱤᱰᱤᱭᱳ + ᱴᱨᱮᱠ + ᱥᱟᱨᱴᱥ + ᱡᱤᱣᱤ + ᱪᱟᱱᱮᱞ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚ + ᱟᱞᱵᱚᱢ + ᱤᱫᱤ ᱠᱟᱛᱮ + ᱪᱟᱱᱮᱞ ᱛᱟᱵᱽ + ᱥᱠᱨᱤᱱ ᱴᱳᱜᱞ ᱳᱭᱨᱮᱱᱟᱥᱚᱱ + ᱢᱟᱲᱟᱝ ᱥᱴᱨᱤᱢ + ᱯᱷᱚᱨᱣᱟᱨᱰ + ᱪᱤᱛᱟᱹᱨ ᱥᱤᱠᱷᱱᱟᱹᱛ + ᱪᱤᱛᱟᱹᱨ ᱵᱟᱝ ᱞᱚᱰ ᱢᱮ + \? + ᱥᱮᱨᱮᱧ ᱛᱟᱹᱞᱠᱟᱹ ᱮᱢ + ᱧᱩᱛᱩᱢ ᱥᱟᱶ ᱮᱱᱮᱢ ᱢᱮ + %1$s +\n%2$s + ᱟᱨᱦᱚᱸ ᱧᱮᱞ ᱢᱮ + ᱠᱚᱢ ᱧᱮᱞ ᱢᱮ + ᱛᱟᱹᱞᱠᱟᱹ ᱪᱟᱪᱞᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱯᱟᱹᱛᱭᱟᱹᱣ ᱮᱢ ᱢᱮ + ᱢᱤᱫ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟ. ᱠᱷᱚᱱ ᱮᱴᱟᱜ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟ. ᱛᱮ ᱵᱚᱫᱚᱞ ᱠᱟᱛᱮᱜ ᱟᱢᱟᱜ ᱠᱩᱠᱞᱤ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ + ᱮᱠᱴᱤᱵᱽ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱩᱠᱞᱤ ᱫᱚ ᱵᱚᱫᱚᱞᱚᱜ-ᱟ + ᱞᱟᱹᱱᱟᱹᱤ ᱠᱚ ᱧᱮᱞ ᱢᱮ + ᱰᱤᱯᱷᱚᱞᱴ ᱠᱚ ᱨᱤᱯᱚᱴ ᱢᱮ + ᱯᱞᱮᱵᱮᱠ ᱞᱚᱰ ᱤᱱᱴᱟᱨᱵᱷᱮᱞ ᱨᱮᱱᱟᱜ ᱢᱟᱨᱟᱝ + ᱞᱚᱠᱟᱞ + ᱮᱠᱟᱩᱱᱴ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱵᱟᱰᱟᱭ ᱢᱮ + ᱦᱟᱨᱰᱣᱮᱭᱟᱨ ᱢᱤᱰᱤᱭᱟ ᱵᱩᱴᱚᱱ ᱦᱮᱯᱨᱟᱣ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + System folder picker (SAF) ᱵᱮᱵᱷᱟᱨ ᱢᱮ + ᱰᱤᱯᱷᱚᱞᱴ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱷᱚᱨᱢᱮᱴ + ᱯᱚᱯ-ᱟᱯ ᱨᱮᱱᱟᱜ ᱢᱩᱪᱟᱹᱫ ᱢᱟᱨᱟᱝ ᱟᱨ ᱴᱷᱟᱶ ᱫᱚᱦᱚᱭ ᱢᱮ + ᱦᱩᱰᱤᱧ ᱵᱟᱹᱱᱩᱜ-ᱟ ᱞᱟᱦᱟᱱᱛᱤ ᱵᱮᱵᱷᱟᱨ + ᱵᱟᱝ ᱥᱟᱹᱨᱤ ᱧᱮᱞ ᱠᱷᱟᱱ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱫᱚ ᱵᱟᱹᱲᱛᱤ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ ᱥᱟᱶ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ ᱠᱚ ᱵᱟᱰᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ ᱕, ᱑᱕ ᱟᱨ ᱒᱕ ᱥᱮᱠᱮᱱᱰ ᱞᱟᱹᱜᱤᱫ ᱧᱮᱞᱚᱜᱼᱟ ᱱᱚᱶᱟ ᱥᱟᱶ ᱵᱟᱝ ᱠᱟᱹᱢᱤᱭᱟ + ᱮᱱᱮᱢ ᱠᱚ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱫ ᱱᱚᱶᱟ ᱵᱚᱫᱚᱞ ᱢᱮ + \'Next\' ᱟᱨ \'Similar\' ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱢᱮᱴᱟ ᱴᱷᱟᱶ ᱧᱮᱞ ᱢᱮ + ᱥᱴᱨᱤᱢ ᱵᱮᱱᱟᱣᱤᱭᱟᱹ, ᱥᱴᱨᱤᱢ ᱟᱹᱛᱩ ᱟᱨᱵᱟᱝ ᱥᱟᱨᱪ ᱞᱟᱹᱠᱛᱤ ᱵᱟᱵᱚᱛ ᱟᱨᱦᱚᱸ ᱵᱟᱰᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱢᱮᱴᱟ ᱤᱱᱯᱷᱳ ᱵᱚᱠᱥ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱱᱮᱛᱟᱨᱟᱜ ᱥᱴᱨᱤᱢ ᱨᱮ ᱚᱴᱚᱼᱠᱤᱣ + ᱡᱚᱲᱟᱣ ᱟᱠᱟᱱ ᱥᱴᱨᱤᱢ ᱥᱮᱞᱮᱫ ᱠᱟᱛᱮ ᱪᱟᱪᱞᱟᱣ ᱪᱮᱛᱟᱱ (ᱱᱚᱱ-ᱨᱩᱯᱨᱤᱭᱩᱴᱤᱝ) ᱯᱞᱮᱼᱵᱷᱤᱠ ᱪᱮᱛᱟᱱ ᱪᱟᱪᱞᱟᱣ ᱢᱮ + ᱯᱟᱹᱨᱥᱤ ᱵᱟᱝ ᱧᱮᱞ ᱠᱟᱛᱮᱜ ᱚᱨᱡᱤᱱᱤᱭᱟᱞ ᱚᱰᱤᱭᱚ ᱴᱨᱟᱠ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱰᱤᱥᱠᱨᱤᱯᱴᱤᱵᱷ ᱚᱰᱤᱭᱚ ᱵᱟᱹᱲᱛᱤ + ᱚᱴᱚ-ᱮᱱᱠᱭᱩᱤᱝ + ᱡᱩᱫᱤ ᱢᱮᱱᱟᱜ ᱟ ᱡᱩᱫᱤ ᱧᱮᱞ ᱵᱟᱹᱲᱤᱡ ᱦᱚᱲ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫ ᱚᱰᱤᱭᱚ ᱴᱨᱟᱠ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱢᱮᱴᱟᱰᱮᱴᱟ ᱠᱮᱪ ᱵᱚᱫᱚᱞ + ᱞᱤᱣᱮᱴ ᱡᱮᱥᱴ ᱮᱠᱥᱚᱱ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱥᱠᱨᱤᱱ ᱨᱮᱱᱟᱜ ᱪᱮᱛᱟᱱ ᱨᱮ ᱪᱤᱱᱦᱟᱹ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱞᱟᱹᱭ ᱪᱤᱠᱤ ᱠᱟᱹᱢᱤ + ᱢᱤᱱᱤ ᱯᱞᱮᱭᱟᱨ ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱮᱛᱚᱦᱚᱵ ᱵᱟᱝ ᱢᱮ, ᱡᱩᱫᱤ ᱚᱴᱚᱯᱷᱤ ᱨᱚᱴᱮᱴ ᱞᱚᱠ ᱟᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ ᱥᱟᱹᱛ ᱥᱠᱨᱤᱱ ᱨᱮ ᱵᱚᱫᱚᱞ ᱢᱮ ᱾ ᱟᱢ ᱢᱤᱱᱤ ᱯᱞᱮᱭᱟᱨ ᱪᱷᱟᱰᱟ ᱠᱟᱛᱮᱜ ᱦᱚᱸ ᱥᱮᱞᱮᱫ ᱫᱟᱲᱮᱭᱟᱜ ᱟ + ᱚᱴᱚᱯᱷᱟᱭ + ᱵᱟᱝ ᱥᱚᱦᱚᱫ ᱟᱠᱟᱱ URL + URL ᱵᱟᱭ ᱧᱟᱢ ᱫᱟᱲᱮᱭᱟᱫᱼᱟ. ᱮᱴᱟᱜ ᱟᱯᱞᱤᱠᱮᱥᱚᱱ ᱛᱮ ᱮᱛᱚᱦᱚᱵ ᱢᱮ? + ᱡᱤᱞᱤᱧ + ᱛᱚᱨᱡᱚᱢᱟ ᱥᱟᱯᱲᱟᱣ + ᱧᱮᱞ ᱛᱟᱵᱩᱱ ᱯᱮ ᱺ + ᱨᱮᱢᱳᱴ ᱥᱟᱨᱪ ᱥᱩᱯᱨᱮᱥ + ᱧᱮᱞ ᱟᱠᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱪᱮᱛᱟᱱ ᱨᱮ ᱫᱚᱦᱚᱭ ᱢᱮ + ᱡᱟᱦᱟᱱᱟᱜ ᱵᱚᱫᱚᱞ ᱛᱟᱭᱚᱢ ᱠᱷᱮᱞ ᱫᱚᱦᱚᱭ ᱢᱮ (ᱡᱮᱞᱮᱠᱟ: ᱯᱷᱚᱱ ᱠᱚᱞ) + ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮ + ᱢᱩᱬᱩᱛ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱡᱚᱛᱚ ᱪᱤᱛᱟᱹᱨ ᱨᱮ ᱮᱛᱚᱦᱚᱵ ᱢᱮ + ᱰᱤᱯᱷᱚᱞᱴ ᱠᱚᱱᱴᱮᱱᱴ ᱯᱟᱹᱨᱥᱤ + PeerTube ᱚᱞ ᱠᱚ + ᱟᱢᱟᱜ ᱧᱩᱛᱩᱢᱟᱱ PeerTube ᱵᱷᱤᱛᱨᱤ ᱠᱚ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱞᱟᱹᱱᱟᱹᱤ ᱫᱚᱦᱚ ᱫᱟᱲᱮᱭᱟᱜ ᱵᱟᱝ + ᱵᱷᱤᱰᱤᱭᱳ ᱟᱨ ᱚᱰᱤᱭᱳ + HTTPS URL ᱠᱚ ᱜᱮ ᱥᱚᱯᱷᱴᱣᱮᱨ ᱟᱠᱟᱱᱟ + ᱤᱱᱥᱴᱮᱱᱥ ᱫᱚ ᱟᱞᱮ ᱢᱮᱱᱟᱜᱼᱟ + ᱟᱹᱱᱟᱹᱨᱤ + ᱚᱛᱱᱚᱜ ᱪᱤᱛᱟᱹᱨ ᱠᱷᱚᱸᱫᱽᱨᱚᱸᱫᱽ ᱥᱟᱯᱲᱟᱣ + ᱜᱤᱫᱨᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱠᱟᱛᱷᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ ᱪᱮᱫᱟᱜ ᱥᱮ ᱱᱚᱣᱟ ᱨᱮ ᱢᱤᱫ ᱩᱢᱮᱨ ᱞᱤᱢᱤᱴ ᱢᱮᱱᱟᱜᱼᱟ (ᱡᱮᱞᱮᱠᱟ ᱑᱘+) + ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱫ \"Restricted Mode\" ᱮᱢᱚᱜᱼᱟ ᱡᱟᱦᱟᱸ ᱫᱚ ᱯᱚᱴᱮᱱᱥᱤᱭᱟᱞ ᱢᱚᱰᱩᱞ ᱠᱚᱱᱴᱮᱱᱴ (mature content) ᱫᱚᱦᱚᱭᱟ + ᱱᱤᱭᱟᱹ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱩᱢᱚᱨ ᱞᱟᱹᱜᱤᱫ ᱜᱮ᱾_x000D_ +\nᱭᱩᱴᱭᱩᱵᱽ ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱨᱮᱱᱟᱜ ᱩᱢᱮᱨ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱫ ᱱᱟᱣᱟ ᱯᱳᱞᱤᱥᱤ ᱠᱷᱟᱹᱛᱤᱨ, ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯᱷ ᱫᱚ ᱟᱡᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱨᱮᱱᱟᱜ ᱡᱟᱦᱟᱸᱭ ᱦᱚᱸ ᱥᱮᱴᱮᱨ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱵᱟᱝ ᱟᱨ ᱚᱱᱟᱛᱮ ᱱᱚᱶᱟ ᱯᱞᱮᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ + ᱡᱤᱣᱤ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚ + ᱵᱷᱤᱰᱤᱭᱳ + ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ + ᱜᱷᱚᱴᱚᱱ ᱠᱚ + ᱮᱯ ᱟᱯᱰᱮᱴ ᱱᱳᱴᱤᱯᱮᱥᱚᱱ + ᱱᱟᱣᱟ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱵᱟᱨᱥᱚᱱ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱚᱵᱚᱨ + ᱪᱷᱟᱸᱪ ᱠᱚ + ᱵᱷᱤᱰᱤᱭᱳ ᱦᱟᱥ ᱱᱮᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ + ᱪᱟᱹᱠᱨᱤ ᱠᱷᱚᱵᱚᱨ ᱠᱷᱚᱵᱚᱨ + ᱯᱷᱚᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱽ ᱢᱮ + ᱯᱚᱯ-ᱟᱯ ᱨᱮ ᱥᱮᱞᱮᱫ ᱢᱮ + ᱢᱩᱬᱩᱛ ᱨᱮ ᱞᱤᱱ ᱢᱮ + ᱮᱠᱥᱯᱳᱨᱴ ᱰᱮᱴᱟᱵᱮᱥ + ᱟᱢᱟᱜ ᱱᱮᱛᱟᱨᱟᱜ ᱱᱟᱜᱟᱢ, ᱥᱟᱵᱽᱥᱠᱨᱟᱭᱵᱽᱥ, ᱯᱷᱟᱭᱞᱤᱥᱴ ᱟᱨ (ᱵᱟᱪᱷᱱᱟᱣ ᱞᱮᱠᱟᱛᱮ) ᱥᱤᱴᱤᱝ ᱠᱚ ᱩᱪᱟᱹᱲᱟ + ᱟᱢ ᱢᱤᱫ reCAPTCHA ᱥᱟᱯᱲᱟᱣ ᱞᱮᱠᱷᱟᱱ NewPipe ᱥᱟᱦᱴᱟᱨᱮ ᱥᱚᱫᱚᱨ ᱟᱠᱟᱱ ᱠᱩᱠᱤ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱯᱷᱟᱭᱞᱟᱣ ᱴᱷᱟᱶ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱡᱚᱛᱚ ᱯᱞᱮᱤᱯᱷᱟᱭᱤᱰ ᱯᱚᱡᱤᱥᱚᱱ ᱠᱚ ᱵᱚᱫᱚᱞᱟ + ᱡᱚᱛᱚ ᱯᱞᱮᱵᱟᱠ ᱯᱳᱡᱤᱥᱚᱱ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ? + ᱠᱷᱮᱞᱚᱸᱰ ᱨᱮᱱᱟᱜ ᱴᱷᱟᱶ ᱠᱚ ᱪᱷᱩᱴᱟᱹᱣ ᱟᱠᱟᱱᱟ + ᱥᱩᱪᱚᱱᱟ ᱨᱮᱭᱟᱜ ᱱᱟᱜᱟᱢ ᱪᱷᱟᱯᱟ ᱢᱮ + ᱪᱷᱟᱸᱪ:Search keywords ᱨᱮᱱᱟᱜ ᱱᱟᱜᱟᱢ ᱪᱷᱟᱸᱪᱟᱣᱟ + ᱥᱟᱱᱟᱢ ᱥᱩᱪᱚᱱᱟ ᱱᱟᱜᱟᱢ ᱵᱚᱫᱚᱞ ᱢᱮ? + ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮᱱᱩ ᱵᱟᱭ ᱥᱮᱯᱴᱮᱭᱟ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ + ᱮᱯᱞᱤᱠᱮᱥᱚᱱ/UI ᱠᱨᱟᱥ ᱞᱮᱱᱟ + ᱱᱚᱣᱟ ᱥᱴᱨᱤᱢ ᱯᱞᱮ ᱵᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱵᱟᱭ ᱵᱩᱡᱷᱟᱹᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ + ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱦᱩᱫᱤᱥ ᱠᱷᱚᱱ ᱨᱤᱠᱳᱨᱰ + ᱱᱚᱶᱟ ᱯᱷᱤᱞ ᱵᱟᱹᱱᱩᱜᱼᱟ ᱥᱮ ᱱᱚᱶᱟ ᱨᱮ ᱚᱞ ᱟᱨ ᱯᱟᱲᱦᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱫᱟᱣ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱯᱷᱤᱞᱤᱢ ᱧᱩᱛᱩᱢ ᱵᱚᱸᱫᱚ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱵᱟᱝ + %1$s ᱢᱤᱫ ᱵᱷᱩᱞ ᱦᱩᱭ ᱞᱮᱱᱟ: + ᱰᱟᱩᱱᱞᱚᱰ ᱞᱟᱹᱜᱤᱫ ᱡᱟᱦᱟᱱ ᱥᱴᱨᱤᱢ ᱵᱟᱭ + ᱥᱚᱞᱦᱮ ᱟᱠᱟᱱ ᱴᱮᱵᱽ ᱠᱚ ᱵᱟᱝ ᱯᱟᱲᱦᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ, ᱚᱱᱟᱛᱮ ᱵᱮᱵᱷᱟᱨᱤᱡᱽ ᱠᱚ + ᱟᱢ ᱥᱩᱯᱚᱨᱴ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮᱢᱮ? + ᱮᱴᱟᱜ ᱮᱯ ᱨᱮ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱫ ᱫᱟᱣ ᱮᱢ ᱢᱮ + NewPipe ᱨᱮ ᱢᱤᱫᱴᱟᱹᱝ ᱵᱷᱩᱞ ᱧᱟᱢ ᱞᱮᱱᱟ, ᱠᱷᱚᱵᱚᱨ ᱞᱟᱹᱜᱤᱫ ᱴᱟᱯ ᱢᱮ + ᱤᱧᱤᱧ ᱵᱟᱹᱧ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ, ᱱᱚᱶᱟ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭᱩᱜ ᱞᱟᱹᱠᱛᱤ ᱛᱟᱦᱮᱸᱫ ᱾ + ᱤ-ᱢᱮᱞ ᱤᱫᱤ ᱠᱟᱛᱮ ᱨᱤᱯᱚᱨᱴ ᱢᱮ + ᱯᱷᱚᱨᱢᱮᱴ ᱟᱠᱟᱱ ᱨᱤᱯᱳᱨᱴ ᱠᱚᱯᱤ ᱢᱮ + ᱟᱢᱟᱜ ᱠᱨᱮᱥᱴ ᱵᱟᱵᱚᱫᱽ ᱛᱮ ᱢᱤᱫ ᱚᱱᱚᱞ ᱢᱮᱱᱟᱜ ᱟ ᱥᱮ ᱵᱟᱝ ᱚᱱᱟ ᱧᱮᱞ ᱢᱮ ᱾ ᱰᱩᱯᱞᱤᱠᱮᱴ ᱴᱤᱠᱮᱴ ᱵᱮᱱᱟᱣ ᱞᱮᱠᱷᱟᱱ, ᱟᱢ ᱫᱚ ᱚᱠᱛᱚ ᱟᱢᱮᱢ ᱦᱟᱛᱟᱣᱮᱫᱟ ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱥᱚᱞ ᱵᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱨᱮ ᱟᱢᱮᱢ ᱦᱟᱛᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ + ᱤᱱᱯᱷᱳ: + ᱪᱮᱫ ᱦᱩᱭ ᱞᱮᱱᱟ: + ᱞᱟᱹᱱᱟᱹᱤ: + ᱵᱷᱤᱰᱤᱭᱚ ᱯᱞᱮ, ᱚᱠᱛᱚ: + ᱵᱟᱹᱲᱤᱡ + ᱠᱚᱢᱮᱱᱴ + ᱥᱟᱶᱦᱮᱫ ᱮᱞᱠᱷᱟ + ᱞᱟᱹᱱᱟᱹᱤ + ᱓ ᱰᱳᱴ ᱢᱮᱱᱩ ᱠᱷᱚᱱ ᱤᱢᱯᱳᱨᱴ ᱟᱨ ᱮᱠᱥᱯᱳᱨᱴ ᱥᱟᱵᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ + ᱱᱟᱣᱟ ᱟᱹᱨᱡᱤ ᱞᱟᱹᱜᱤᱫ ᱟᱹᱪᱩᱨ ᱢᱮ + ᱚᱰᱤᱭᱳ + ᱟᱨᱦᱚᱸ ᱯᱟᱲᱦᱟᱣ ᱢᱮ + ᱵᱤ + ᱱᱤᱛᱚᱜ ᱵᱟᱪᱷᱟᱣ ᱟᱠᱟᱱ ᱴᱳᱜᱞ ᱥᱮᱵᱟ: + ᱚᱵᱷᱤᱱᱮᱛᱟᱨ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱚᱠᱚᱭ ᱦᱚᱸ ᱵᱟᱝ ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ + ᱜᱚᱴᱟ ᱟᱠᱟᱱᱟ + ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱵᱟᱵᱚᱛ + ᱯᱮᱨᱟᱜ ᱞᱟᱭᱥᱮᱱᱥ + ᱰᱳᱱᱮᱴ ᱢᱮ + ᱡᱟᱦᱟᱸᱭ ᱜᱮᱭ ᱟᱸᱡᱚᱢᱟ + ∞ ᱵᱷᱤᱰᱤᱭᱳ + ᱵᱟᱦᱟ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱠᱚᱢᱮᱱᱴ ᱫᱚ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱮᱛᱚᱦᱚᱵ + ᱯᱷᱟᱭᱩᱥ + ᱵᱮᱱᱟᱣ ᱢᱮ + ᱛᱷᱚᱠ ᱨᱮ ᱛᱟᱭᱚᱢ ᱛᱮ ᱢᱤᱫ ᱰᱟᱩᱱᱞᱚᱰ ᱯᱷᱳᱞᱰᱟᱨ ᱮᱢ ᱢᱮ + ᱢᱤᱫᱴᱟᱹᱝ ᱡᱤᱱᱤᱥ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + reCAPTCHA challenge ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ + ᱥᱚᱞᱦᱮ + ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱫᱚ ᱱᱤᱡᱮᱨᱟᱜ ᱚᱠᱛᱚ ᱟᱢᱟᱜ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱵᱷᱟᱹᱜᱤ ᱵᱷᱟᱹᱜᱤ ᱥᱟᱹᱜᱟᱹᱭ ᱮᱢ ᱠᱟᱛᱮ ᱵᱮᱱᱟᱣ ᱟᱠᱟᱱᱟ ᱾ ᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱵᱮᱨᱮᱫ ᱞᱟᱹᱜᱤᱫ ᱮᱱᱮᱢᱤᱭᱟᱹ ᱠᱚ ᱜᱚᱲᱚ ᱥᱚᱦᱚᱫ ᱮᱢ ᱢᱮ ᱾ + ᱣᱮᱵᱽᱥᱟᱭᱤᱴ + ᱱᱤᱣ ᱯᱟᱭᱯ ᱨᱮᱭᱟᱜ ᱞᱟᱭᱥᱮᱱᱥ + ᱱᱤᱭᱩ ᱯᱟᱭᱯ ᱫᱚ ᱠᱚᱯᱤᱞᱮᱠᱴ ᱞᱤᱵᱨᱮ ᱥᱚᱯᱷᱴᱣᱮᱭᱟᱨ ᱠᱟᱱᱟ ᱾ ᱟᱢ ᱱᱚᱶᱟ ᱵᱮᱵᱷᱟᱨ, ᱯᱟᱲᱦᱟᱣ, ᱮᱴᱟᱜ ᱦᱚᱲ ᱥᱟᱶ ᱮᱢ ᱟᱨ ᱵᱮᱵᱚᱥᱛᱟ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ ᱟᱢ ᱱᱚᱶᱟ GNU General Public License ᱞᱮᱠᱟᱛᱮ ᱯᱟᱨᱥᱟᱞ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱟᱨ/ᱟᱨᱵᱟᱝ Free Software Foundation ᱦᱚᱛᱮᱛᱮ ᱵᱮᱵᱦᱟᱨ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ, ᱡᱟᱦᱟᱸ ᱫᱚ ᱞᱟᱭᱥᱮᱱᱥ ᱨᱮᱱᱟᱜ ᱵᱟᱨᱥᱚᱱ ᱓ ᱥᱮ (ᱛᱟᱢᱟᱜ ᱵᱟᱪᱷᱟᱣ ᱞᱮᱠᱟᱛᱮ) ᱡᱟᱦᱟᱸᱱᱟᱜ ᱛᱟᱭᱚᱢ ᱵᱟᱨᱥᱚᱱ ᱠᱟᱱᱟ ᱾ + ᱟᱨᱦᱚᱸ ᱵᱟᱰᱟᱭ ᱟᱨ ᱠᱷᱚᱵᱚᱨ ᱞᱟᱹᱜᱤᱫ NewPipe ᱣᱮᱵᱽᱥᱟᱭᱤᱴ ᱧᱮᱞ ᱢᱮ ᱾ + ᱡᱩᱫᱤ ᱟᱢ ᱱᱚᱶᱟ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱵᱮᱵᱚᱦᱟᱨ ᱨᱮ ᱠᱷᱟᱡᱽᱱᱟ ᱮ ᱧᱟᱢᱟ, ᱮᱱᱠᱷᱟᱱ ᱱᱚᱶᱟ ᱥᱟᱸᱣ ᱡᱩᱲᱟᱹᱣ ᱟᱠᱟᱱ ᱯᱩᱥᱴᱟᱹ ᱠᱚ ᱧᱮᱞ ᱢᱮ! + ᱣᱮᱵᱽᱥᱟᱭᱤᱴ ᱨᱮ ᱧᱮᱞ ᱢᱮ + ᱱᱟᱜᱟᱢ + ᱱᱟᱜᱟᱢ + ᱟᱢ ᱱᱚᱶᱟ ᱡᱤᱱᱤᱥ ᱥᱟᱸᱪᱟᱨ ᱱᱟᱜᱟᱢ ᱠᱷᱚᱱ ᱵᱚᱫᱚᱞ ᱢᱮᱢᱮ? + ᱢᱩᱪᱟᱹᱫ ᱠᱷᱮᱞ ᱟᱠᱟᱱᱟ + ᱡᱟᱹᱥᱛᱤ ᱠᱷᱮᱞ ᱟᱠᱟᱱ + ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱥᱟᱦᱴᱟ + ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ ᱨᱮ ᱚᱠᱟ ᱛᱟᱵᱽ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱡᱤᱱᱤᱥ ᱠᱚ ᱵᱟᱧᱪᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱥᱣᱟᱭᱯ ᱢᱮ + ᱰᱤᱯᱷᱚᱞᱴ ᱠᱤᱭᱳᱥᱠ + ᱠᱤᱭᱳᱥᱠ ᱥᱟᱦᱴᱟ + ᱪᱟᱱᱮᱞ ᱥᱟᱦᱴᱟ + ᱪᱟᱱᱮᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱪᱮᱱᱮᱞ ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱽ ᱵᱟᱝ + ᱢᱤᱫ ᱯᱷᱟᱤᱞᱤᱥᱴ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱤᱢᱯᱳᱨᱴ + ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ playlist bookmarks ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱮᱯ ᱮᱦᱚᱵ ᱞᱮᱠᱷᱟᱱ ᱯᱟᱹᱨᱥᱤ ᱵᱚᱫᱚᱞᱚᱜ-ᱟ + ᱮᱥᱯᱟᱨᱴ ᱟᱠᱟᱱᱟ + ᱴᱨᱮᱱᱰᱤᱝ + ᱚᱰᱤᱭᱳ ᱥᱮᱴᱤᱝ + ᱚᱰᱤᱭᱳ: %s + ᱥᱴᱨᱤᱢ ᱨᱮᱱᱟᱜ ᱰᱮᱴᱮᱞ ᱞᱚᱰ ᱠᱟᱱᱟ… + ᱥᱩᱯᱚᱨ ᱰᱨᱟᱵᱷᱤᱴ + ᱱᱟᱶᱟ ᱯᱞᱮᱭᱞᱤᱥᱴ + ᱢᱩᱴ + ᱢᱤᱫ ᱯᱚᱯ-ᱟᱯ ᱨᱮ ᱠᱷᱮᱞᱚᱸᱰ ᱮᱛᱚᱦᱚᱵ ᱢᱮ + ᱯᱷᱟᱤᱞᱤᱯᱷᱟᱤᱞᱤ ᱞᱮᱠᱟᱛᱮ ᱥᱮᱞᱮᱫ ᱢᱮ + ᱵᱩᱠᱢᱟᱨᱠ ᱯᱞᱮᱭᱞᱤᱥᱴ + ᱪᱷᱟᱸᱪ + ᱡᱤᱵᱚᱱ ᱪᱟᱞᱟᱣ ᱛᱟᱭᱚᱢ ᱡᱟᱹᱛᱤ ᱥᱮ ᱠᱟᱹᱢᱤ ᱡᱤᱭᱚᱱ ᱪᱮᱛᱟᱱ ᱵᱟᱦᱨᱮ ᱨᱮ ᱵᱟᱝ ᱦᱟᱹᱴᱤᱧ ᱫᱟᱲᱮᱭᱟᱜ Rx ᱮᱥᱠᱮᱪᱥᱚᱱ ᱨᱮᱱᱟᱜ ᱯᱷᱚᱨᱥ ᱨᱮᱯᱚᱨᱴᱤᱝ + ᱵᱩᱠᱢᱟᱨᱠ ᱚᱪᱚᱭ ᱢᱮ + ᱱᱚᱶᱟ ᱯᱷᱟᱭᱞᱤᱥᱴ ᱵᱚᱫᱚᱞ ᱢᱮ? + ᱚᱴᱚ-ᱡᱮᱱᱮᱨᱮᱴ + ᱡᱤᱱᱤᱥ ᱠᱚᱨᱮᱱᱟᱜ ᱢᱩᱞ ᱚᱠᱛᱚ ᱧᱮᱞ ᱢᱮ + ᱥᱮᱵᱟ ᱠᱷᱚᱱ ᱚᱨᱡᱤᱱᱤᱭᱟᱞ ᱴᱮᱠᱥᱴ ᱠᱚ ᱥᱴᱨᱤᱢ ᱤᱴᱮᱢ ᱨᱮ ᱧᱮᱞᱚᱜᱼᱟ + ᱡᱩᱫᱤ ᱟᱢ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱚᱯ ᱨᱮ ᱵᱞᱮᱠ ᱥᱠᱨᱤᱱ ᱟᱨᱵᱟᱝ ᱠᱷᱟᱹᱞᱤ ᱥᱴᱮᱴᱞᱤᱝ ᱮᱢ ᱧᱟᱢᱟ ᱮᱱᱠᱷᱟᱱ ᱢᱤᱰᱤᱭᱟ ᱴᱩᱱᱮᱞᱤᱝ ᱵᱚᱫᱚᱞ ᱢᱮ ᱾ + ᱪᱤᱛᱟᱹᱨ ᱪᱤᱱᱦᱟᱹ ᱠᱚ ᱧᱮᱞ ᱢᱮ + ᱱᱟᱣᱟ ᱥᱴᱨᱤᱢ ᱞᱟᱹᱜᱤᱫ ᱪᱟᱪᱞᱟᱣ ᱢᱮ + ᱢᱤᱫ error notification ᱛᱮᱭᱟᱨ ᱢᱮ + ᱥᱮᱞᱮᱫ ᱮᱠᱥᱯᱳᱨᱴ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ + \"ᱜᱩᱜᱩᱞ ᱴᱮᱠᱟᱣᱩᱴ ᱠᱷᱚᱱ ᱭᱩᱴᱭᱩᱵᱽ ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱽᱥ ᱤᱱᱯᱳᱨᱴ ᱢᱮ: +\n +\n1. ᱱᱚᱶᱟ URL ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ: %1$s +\n2. ᱞᱚᱜᱤᱱ ᱢᱮ ᱡᱚᱠᱷᱚᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ +\n3. \"\'All data included\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ, ᱛᱟᱭᱚᱢ \"\'Deselect all\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ, ᱛᱟᱭᱚᱢ \"\'subscriptions\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ ᱟᱨ \"\'OK\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ +\n4. \"Next step\" ᱨᱮ ᱟᱨ ᱚᱱᱟ ᱛᱟᱭᱚᱢ \"Create export\" ᱨᱮ ᱞᱤᱱ ᱢᱮ +\n5. ᱱᱚᱶᱟ ᱧᱮᱞ ᱛᱟᱭᱚᱢ \"\"Download\"\" ᱵᱩᱴᱚᱱ ᱨᱮ ᱠᱞᱤᱠ ᱢᱮ +\n6. ᱞᱟᱛᱟᱨ ᱨᱮ IMPORT FILE ᱨᱮ ᱞᱤᱱ ᱢᱮ ᱟᱨ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ . zip ᱯᱷᱤᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ +\n7. ᱡᱩᱫᱤ .zip ᱤᱱᱯᱷᱚᱨᱴ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱵᱟᱝ ᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ .csv ᱯᱷᱤᱞ ᱮᱠᱥᱴᱨᱟᱠᱴ ᱢᱮ (\"ᱭᱩᱴᱭᱩᱵᱽ ᱟᱨ ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱣᱡᱤᱠ/ᱥᱵᱽᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ/ᱥᱵᱽᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ.ᱥᱤᱵᱷ\" ᱨᱮ), ᱞᱟᱛᱟᱨ ᱨᱮ IMPORT FILE ᱨᱮ ᱠᱞᱤᱠ ᱢᱮ ᱟᱨ ᱮᱠᱥᱴᱨᱟᱠᱴ ᱟᱠᱟᱱ csv ᱯᱷᱤᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + yourID, soundcloud.com/yourid + \"ᱤᱭᱩᱨᱚᱯᱤᱭᱚ ᱡᱚᱡᱚᱱᱟ ᱯᱨᱚᱫᱚᱭᱚᱜᱤᱠᱤ (ᱡᱤ.ᱰᱤ.ᱯᱤ.ᱟᱨ.) ᱥᱟᱞᱟᱜ ᱥᱚᱢᱵᱚᱸᱫᱷ ᱞᱟᱹᱜᱤᱫ ᱛᱮ, ᱱᱚᱣᱟ ᱦᱚᱛᱮᱛᱮ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱨᱮᱭᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱯᱚᱞᱤᱥᱤ ᱨᱮ ᱟᱵᱚᱣᱟᱜ ᱟᱫᱷᱤᱱᱤᱭᱚᱢ ᱠᱚ ᱩᱫᱩᱜ ᱦᱚᱪᱚᱭᱟ। ᱱᱚᱶᱟ ᱫᱚ ᱞᱟᱹᱭᱛᱮ ᱯᱟᱲᱦᱟᱣ ᱢᱮ ᱾ +\nᱟᱢ ᱫᱚ ᱱᱚᱶᱟ ᱯᱟᱹᱛᱭᱟᱹᱣ ᱢᱮ ᱡᱮ ᱟᱢ ᱵᱷᱤᱜᱽ ᱨᱮᱯᱳᱨᱴ ᱮᱢ ᱢᱮ ᱾\" + ᱥᱚᱵᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ ᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱥᱴᱨᱤᱢ ᱠᱚ ᱵᱟᱰᱟᱭ ᱢᱮ + ᱚᱯᱰᱮᱴᱥ + ᱡᱚᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱵᱟᱨᱥᱚᱱ ᱢᱮᱱᱟᱜ-ᱟ ᱮᱯ ᱟᱯᱰᱮᱴ ᱞᱟᱹᱜᱤᱫ ᱯᱟᱹᱛᱭᱟᱹᱣ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱯᱚᱯ-ᱟᱯ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱞᱟᱹᱜᱤᱫ ᱞᱟᱹᱴᱩ ᱦᱚᱪᱚ + ᱚᱞᱪᱤᱠᱤ ᱛᱮ ᱨᱩᱭᱟᱹᱲᱚᱜ ᱢᱮ - %s + ᱞᱤᱥᱴᱤ ᱧᱮᱧᱮᱞ ᱢᱚᱰ + ᱞᱤᱥᱴᱤ + ᱚᱴᱚ + ᱱᱟᱣᱟ ᱯᱟᱭᱤᱯ ᱚᱯᱰᱮᱴ ᱢᱮᱱᱟᱜ-ᱟ! + %s ᱠᱚᱰ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱴᱟᱯ ᱢᱮ + ᱢᱩᱪᱟᱹᱫ + ᱱᱤᱛᱚᱜᱟᱜ ᱠᱷᱚᱵᱚᱨ ᱠᱚ ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ… + ᱰᱟᱩᱱᱞᱚᱰ ᱵᱟᱹᱱᱩᱜ-ᱟ + ᱧᱩᱛᱩᱢ ᱛᱮᱭᱟᱨ ᱢᱮ + ᱩᱫᱩᱜ ᱢᱮ + ᱪᱷᱟᱸᱪ:Fact + ᱯᱷᱤᱞ ᱵᱮᱱᱟᱣ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ + ᱥᱮᱵᱟ ᱧᱟᱢ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱠᱟᱱᱟ + ᱥᱮᱵᱟ ᱫᱚ ᱚᱱᱚᱞ ᱵᱟᱝ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ + ᱥᱟᱨᱵᱟᱨ ᱫᱚ ᱢᱚᱞᱴᱤ-ᱛᱷᱨᱮᱰ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱵᱟᱝ ᱮᱢᱚᱜ ᱠᱟᱱᱟ, @string/msg_threads = 1 ᱥᱟᱶᱛᱮ ᱮᱱᱮᱡ ᱢᱮ + ᱛᱟᱭᱚᱢ ᱛᱮᱭᱟᱨ ᱵᱟᱝ ᱪᱟᱞᱟᱣ ᱟᱠᱟᱱᱟ + ᱱᱩᱯᱯᱟᱭᱤᱯᱷ ᱯᱷᱤᱞ ᱨᱮ ᱠᱟᱹᱢᱤ ᱚᱠᱛᱚ ᱨᱮ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱯᱟᱹᱛᱭᱟᱹᱣ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ, ᱪᱮᱫᱟᱜ ᱥᱮ ᱯᱷᱤᱞᱤᱯᱟᱭᱤᱰ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱡᱚᱱᱚᱲ ᱚᱠᱛᱚ + ᱟᱢ ᱟᱢᱟᱜ ᱰᱟᱩᱱᱞᱚᱰ ᱦᱤᱥᱛᱟ ᱵᱚᱫᱚᱞ ᱢᱮ ᱟᱨᱵᱟᱝ ᱥᱟᱱᱟᱢ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ ᱯᱷᱤᱞ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ? + ᱰᱟᱩᱱᱞᱚᱰ ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱵᱟᱲᱛᱤ ᱥᱟᱸᱣᱛᱟ + ᱢᱚᱵᱟᱤᱞ ᱰᱟᱴᱟ ᱨᱮ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱫ ᱵᱮᱵᱚᱦᱟᱨᱚᱜ ᱟ, ᱢᱮᱱᱠᱷᱟᱱ ᱛᱤᱱᱟᱹᱜ ᱜᱟᱱ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ ᱟ + ᱢᱤᱫᱴᱟᱹᱝ ᱰᱟᱩᱱᱞᱚᱰ ᱢᱤᱫ ᱚᱠᱛᱚ ᱨᱮ ᱪᱟᱞᱟᱜᱼᱟ + ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱡᱚᱛᱚ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱡᱟᱦᱟᱸ ᱨᱮ ᱫᱚᱦᱚᱭ ᱢᱮ ᱚᱱᱟ ᱟᱢᱮᱢ ᱩᱫᱩᱜᱟ._x000D_ +\nᱡᱩᱫᱤ ᱟᱢ ᱵᱟᱦᱨᱮ SD ᱠᱟᱨᱰ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱞᱟᱹᱜᱤᱫ ᱮᱠᱴᱤᱵᱷ ᱢᱮ + ᱟᱢ ᱡᱟᱦᱟᱸ ᱨᱮ ᱡᱚᱛᱚ ᱰᱟᱩᱱᱞᱚᱰ ᱥᱟᱦᱴᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚᱭ ᱢᱮ + \'ᱥᱴᱚᱨᱮᱡᱽ ᱮᱠᱥᱮᱥ ᱯᱷᱨᱮᱢᱠᱣᱟᱨᱠ\' ᱢᱤᱫ ᱵᱟᱦᱨᱮ SD ᱠᱟᱨᱰ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱞᱟᱹᱜᱤᱫ ᱮᱢᱚᱜ ᱟ + ᱚᱸᱰᱨᱚᱭᱮᱰ ᱑᱐ ᱠᱷᱚᱱ ᱮᱛᱚᱦᱚᱵ ᱠᱟᱛᱮ \'ᱥᱴᱳᱨᱮᱡ ᱮᱠᱥᱮᱥ ᱯᱷᱨᱮᱢᱚᱠ\' ᱜᱮ ᱥᱚᱯᱷᱚᱨᱴ ᱟᱠᱟᱱᱟ + ᱢᱤᱫ ᱤᱱᱥᱴᱟᱱᱥ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱟᱯᱞᱤᱠᱮᱥᱚᱱ ᱯᱟᱹᱨᱥᱤ + ᱥᱤᱥᱴᱮᱢ ᱰᱤᱯᱚᱞᱴ + ᱰᱩᱯᱞᱤᱠᱮᱴ ᱠᱚ ᱪᱷᱩᱴᱟᱹᱣ? + ᱟᱢ ᱱᱚᱶᱟ ᱯᱷᱟᱭᱞᱤᱥᱴ ᱨᱮ ᱡᱚᱛᱚ ᱫᱩᱯᱞᱤᱠᱮᱴ ᱥᱴᱨᱤᱢ ᱠᱚ ᱦᱮᱡ ᱟᱫᱮᱭᱟᱢ ᱥᱮ? + ᱥᱮᱨᱮᱧ ᱛᱟᱹᱞᱤᱠᱟ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱢᱟᱲᱟᱝ ᱟᱨ ᱛᱟᱭᱚᱢ ᱨᱮ ᱡᱟᱦᱟᱸ ᱵᱷᱤᱰᱤᱣ ᱠᱚ ᱧᱮᱞ ᱟᱠᱟᱱᱟ, ᱚᱱᱟ ᱠᱚ ᱪᱷᱟᱹᱲ ᱮᱢ ᱦᱩᱭᱩᱜᱼᱟ ᱾ ᱟᱢ ᱠᱤ ᱜᱚᱴᱟᱵᱩᱴᱟᱹ ᱠᱟᱱᱟ? ᱱᱚᱶᱟ ᱫᱚ ᱨᱩᱣᱟᱹᱲ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ + ᱱᱟᱣᱟ ᱡᱚᱢᱟᱜ ᱡᱤᱱᱤᱥ ᱠᱚ + ᱥᱮᱞᱮᱫ ᱠᱚ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱱᱟᱣ ᱟᱠᱟᱱᱟ + ᱡᱟᱦᱟᱱᱟᱜ ᱵᱟᱝ ᱜᱩᱴ ᱟᱠᱟᱱ ᱥᱚᱵᱥᱠᱨᱟᱭᱵᱮᱥ ᱠᱚ ᱧᱮᱞ ᱢᱮ + ᱯᱷᱮᱰ + ᱯᱷᱤᱰ ᱟᱯᱰᱮᱴ ᱞᱟᱦᱟᱨᱮ + ᱢᱤᱫ ᱥᱚᱵᱥᱠᱨᱟᱭᱵᱽᱥᱚᱱ ᱵᱟᱥᱠᱮᱴᱮᱰ ᱦᱩᱭᱩᱜ ᱢᱟᱬᱟᱝ ᱨᱮ ᱯᱟᱹᱪᱷᱤᱢ ᱩᱫᱩᱜ ᱠᱷᱚᱱ ᱛᱟᱭᱚᱢ ᱚᱠᱛᱚ ⁇ %s + Error loading feed ᱥᱟᱯᱲᱟᱣ + \'%s\' ᱞᱟᱹᱜᱤᱫ ᱯᱷᱤᱰ ᱞᱚᱰ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ. + ᱮᱠᱴᱚᱨᱟᱜ ᱮᱠᱟᱶᱴ ᱫᱚ ᱛᱷᱟᱯᱚᱱ ᱟᱠᱟᱱᱟ ᱾ +\nNewPipe ᱫᱚ ᱱᱚᱣᱟ ᱯᱷᱤᱰ ᱫᱚ ᱟᱵᱚ ᱦᱟᱵᱤᱡ ᱵᱟᱝ ᱞᱚᱰ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ +\nᱟᱢ ᱱᱚᱣᱟ ᱪᱟᱱᱮᱨ ᱠᱷᱚᱱ ᱟᱹᱪᱩᱨ ᱚᱪᱚᱜ ᱠᱟᱹᱢᱤᱭᱟᱢ ᱥᱮ? + ᱯᱷᱚᱥᱴ ᱯᱷᱤᱰ ᱢᱚᱰ ᱱᱚᱶᱟ ᱨᱮ ᱵᱟᱹᱲᱛᱤ ᱵᱟᱰᱟᱭ ᱮᱢ ᱮᱫᱟ ᱾ + ᱡᱩᱫᱤ ᱢᱮᱱᱟᱜᱼᱟ ᱮᱢ ᱟᱠᱟᱱ ᱡᱚᱢᱟᱜ ᱠᱷᱚᱱ ᱦᱟᱛᱟᱣ + ᱟᱭᱢᱟ ᱥᱮᱵᱟ ᱨᱮ ᱧᱟᱢᱚᱜᱼᱟ, ᱱᱚᱶᱟ ᱫᱚ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱟᱹᱰᱤ ᱦᱩᱰᱤᱧ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱢᱤᱫ ᱞᱮᱠᱟᱱ ᱤᱱᱴᱮᱢᱥ ᱟᱨ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱵᱟᱝ ᱯᱩᱨᱟᱹᱣ ᱟᱠᱟᱱ ᱤᱱᱯᱷᱚᱨᱢᱮᱥᱚᱱ (ᱡᱮᱞᱮᱠᱟ ᱺ ᱚᱠᱛᱚ ᱵᱟᱝ, ᱤᱱᱴᱮᱢᱥ ᱨᱮᱱᱟᱜ ᱞᱮᱠᱷᱟ, ᱚᱞᱤᱵᱽ ᱥᱴᱮᱴᱥ ᱵᱟᱝ) ᱨᱩᱣᱟᱹᱲ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ + ᱯᱷᱮᱥᱵᱩᱠ ᱢᱚᱰ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱟᱢᱟᱜ ᱢᱚᱱᱮ ᱨᱮ ᱡᱚᱢᱟᱜ ᱨᱮᱱᱟᱜ ᱞᱚᱰ ᱟᱹᱰᱤ ᱟᱞᱜᱟ ᱜᱮᱭᱟ? ᱡᱩᱫᱤ ᱱᱚᱶᱟ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ, ᱮᱱᱠᱷᱟᱱ ᱥᱯᱤᱰ ᱞᱚᱰ ᱮᱱᱟᱝ ᱮᱱᱮᱡ (ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱢ ᱥᱤᱴᱤᱝ ᱨᱮ ᱥᱮ ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱵᱩᱛᱟᱹᱢ ᱚᱞ ᱠᱟᱛᱮᱢ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ) +\n +\nᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱫᱚ ᱵᱟᱨᱭᱟ ᱯᱷᱤᱰ ᱞᱚᱰ ᱥᱴᱨᱮᱴᱡᱤ ᱮᱢᱚᱜ ᱠᱟᱱᱟ: +\n• ᱡᱚᱛᱚ ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱽ ᱪᱮᱱᱮᱞ ᱦᱟᱛᱟᱣ, ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱞᱜᱟ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱯᱩᱨᱟᱹᱣᱜᱼᱟ ᱾ +\n• ᱰᱮᱰᱤᱠᱮᱴᱮᱰ ᱥᱮᱵᱟ ᱮᱱᱰ ᱯᱚᱭᱮᱱᱴ ᱵᱮᱵᱷᱟᱨ, ᱡᱟᱦᱟᱸ ᱫᱚ ᱦᱩᱲᱟᱹᱜ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱯᱩᱨᱟᱹᱣ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭᱩᱜᱼᱟ ᱾ +\n +\nᱵᱟᱨᱭᱟ ᱛᱟᱞᱟᱨᱮᱱᱟᱜ ᱵᱷᱮᱜᱟᱨ ᱫᱚ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ ᱡᱮ ᱦᱩᱲᱟᱹᱜ ᱢᱤᱫᱴᱟᱹᱝ ᱜᱮ ᱤᱱᱯᱷᱚᱨᱢᱮᱥᱚᱱ ᱵᱟᱹᱱᱩᱜᱼᱟ, ᱡᱮᱞᱮᱠᱟ ᱤᱢᱮᱠᱥ ᱨᱮᱱᱟᱜ ᱚᱠᱛᱚ ᱥᱮ ᱛᱷᱚᱠ (ᱡᱟᱦᱟᱸ ᱫᱚ ᱞᱟᱭᱤᱵᱷᱤᱰᱤᱭᱳ ᱟᱨ ᱱᱚᱨᱢᱟᱞ ᱨᱮᱱᱟᱜ ᱵᱷᱮᱜᱟᱨ ᱵᱟᱭ ᱵᱟᱰᱟᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ) ᱟᱨ ᱱᱚᱶᱟ ᱠᱚᱢ ᱤᱢᱮᱠᱥ ᱠᱚ ᱨᱩᱣᱟᱹᱲ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ +\n +\nᱭᱩᱴᱭᱩᱵᱽ ᱫᱚ ᱢᱤᱫᱴᱮᱱ ᱥᱮᱵᱟ ᱨᱮᱱᱟᱜ ᱢᱤᱫ ᱞᱟᱹᱱᱟᱹᱤ ᱠᱟᱱᱟ ᱡᱟᱦᱟᱸ ᱫᱚ ᱱᱚᱶᱟ ᱦᱚᱨᱟ ᱟᱡᱟᱜ RSS ᱯᱷᱤᱰ ᱥᱟᱶᱛᱮ ᱮᱢᱚᱜ ᱠᱟᱱᱟ ᱾ +\n +\nᱚᱱᱟᱛᱮ ᱵᱟᱪᱷᱟᱣ ᱫᱚ ᱟᱢ ᱪᱮᱫ ᱜᱮᱢ ᱵᱷᱟᱹᱵᱤᱛᱟ: ᱦᱩᱲᱟᱹᱜ ᱟᱨᱵᱟᱝ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ ᱠᱟᱛᱷᱟ ᱾ + ᱥᱴᱨᱤᱢ ᱠᱚ ᱵᱚᱫᱚᱞ/ᱥᱚᱫᱚᱨ ᱢᱮ + ᱡᱚᱠᱷᱚᱱ ᱯᱷᱤᱰ ᱚᱯᱰᱮᱴ ᱦᱩᱭᱩᱜᱼᱟ, ᱚᱱᱟ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱴᱮᱵᱽ ᱠᱚ ᱦᱟᱛᱟᱣ ᱢᱮ ᱾ ᱡᱩᱫᱤ ᱢᱤᱫ ᱪᱮᱱᱮᱞ ᱫᱚ fast mode ᱵᱮᱵᱷᱟᱨ ᱠᱟᱛᱮ update ᱟᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ ᱱᱚᱶᱟ option ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ ᱾ + ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱥᱚᱯᱷᱴᱣᱮᱭᱟᱨ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾_x000D_ +\n_x000D_ +\nᱱᱚᱶᱟ ᱫᱚ ᱢᱚᱵᱟᱤᱞ ᱣᱟᱨᱥᱚᱱ ᱨᱮ ᱥᱚᱯᱷᱴᱣᱮᱨ ᱦᱩᱭᱩᱜᱼᱟ ᱾ + ᱞᱚᱠ ᱥᱠᱨᱤᱱ ᱛᱷᱚᱠ ᱟᱨ ᱱᱳᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱵᱟᱱᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱛᱚᱢᱱᱤᱞ ᱵᱮᱵᱷᱟᱨ ᱢᱮ + ᱟᱢᱟᱜ ᱰᱤᱵᱟᱤᱥ ᱨᱮ ᱱᱚᱶᱟ ᱮᱯ ᱵᱟᱹᱱᱩᱜ-ᱟ + ᱱᱚᱶᱟ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱫ ᱫᱚ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱯᱷᱤᱞ ᱢᱮᱱᱮᱡᱚᱨ ᱵᱟᱝ ᱧᱟᱢ ᱞᱮᱱᱟ ᱾ %s + ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱟᱢᱟᱜ ᱫᱤᱥᱚᱢ ᱨᱮ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾ + ᱱᱩᱶᱟ ᱫᱚ ᱢᱤᱫ ᱥᱟᱣᱚᱱᱰᱠᱞᱟᱣᱩᱰ ᱜᱳ+ ᱴᱨᱟᱠ ᱠᱟᱱᱟ, ᱟᱢᱟᱜ ᱫᱤᱥᱚᱢ ᱨᱮ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱠᱚᱢ, ᱚᱱᱟᱛᱮ ᱱᱩᱭᱯᱟᱭᱤᱯ ᱫᱚ ᱱᱚᱣᱟ ᱴᱨᱟᱠ ᱥᱴᱨᱤᱢ ᱟᱨ ᱰᱟᱩᱱᱞᱚᱰ ᱵᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ + ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱫᱚ ᱱᱤᱡᱮᱨᱟᱜ ᱠᱟᱱᱟ, ᱚᱱᱟᱛᱮ ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱫᱚ ᱱᱚᱣᱟ ᱵᱟᱭ ᱰᱟᱩᱱᱞᱚᱰ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱟᱨ ᱵᱟᱝ ᱥᱴᱨᱤᱢ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ + ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱨᱮᱱ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱡᱟᱦᱟᱸᱱ ᱯᱮᱨᱮᱡ ᱥᱮᱞᱮᱫ ᱠᱚᱣᱟ, ᱚᱱᱟᱛᱮ ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱨᱮᱱ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱡᱟᱦᱟᱸᱱ ᱯᱮᱨᱮᱡ ᱥᱮᱞᱮᱫ ᱵᱟᱝ ᱠᱚ ᱧᱟᱢ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ + ᱯᱷᱮᱭᱟᱨ ᱟᱠᱟᱱ + ᱱᱚᱶᱟ ᱵᱟᱪᱷᱟᱣ ᱫᱚ ᱚᱱᱠᱟᱱ ᱞᱟᱹᱜᱤᱫ ᱜᱮ ᱵᱮᱵᱦᱟᱨᱚᱜᱼᱟ ᱡᱩᱫᱤ %s ᱴᱷᱤᱠᱟᱹᱱᱟ + ᱰᱟᱩᱱᱞᱚᱰ ᱮᱛᱚᱦᱚᱵ ᱟᱠᱟᱱᱟ + ᱟᱢ ᱱᱤᱛᱚᱜ ᱚᱞ ᱪᱤᱠᱤ ᱨᱮ ᱚᱞ ᱪᱤᱠᱤ ᱵᱟᱪᱷᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱟ. ᱵᱟᱰᱟᱭ ᱢᱮ ᱡᱮ ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱷᱤᱸᱰᱟᱹᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱟᱨ ᱵᱟᱪᱷᱟᱣ ᱢᱚᱰ ᱨᱮ ᱞᱤᱱᱠ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ + ᱪᱤᱠᱤ ᱨᱮ ᱚᱞ ᱵᱟᱪᱷᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱮᱱᱮᱢ ᱢᱮ + ᱯᱨᱟᱭᱵᱷᱮᱴ + ᱩᱢᱚᱨ ᱨᱮᱭᱟᱜ ᱞᱤᱢᱤᱴ + ᱯᱟᱹᱨᱥᱤ + ᱥᱚᱦᱚᱫ + ᱛᱷᱩᱢᱱᱟᱭᱤᱴ + ᱚᱯᱞᱚᱰᱟᱨ ᱟᱵᱟᱛᱟᱨ + ᱥᱟᱵ-ᱪᱟᱱᱮᱞ ᱟᱵᱟᱛᱟᱨ + ᱯᱨᱟᱭᱵᱷᱮᱴ + ᱤᱱᱴᱟᱨᱱᱟᱞ + ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱟᱨ + ᱯᱤᱱ ᱟᱠᱟᱱ ᱟᱹᱱᱤᱡ + ᱵᱮᱱᱟᱣᱤᱡᱟᱜ ᱢᱚᱱᱮ + ᱚᱯᱮᱱ ᱣᱮᱵᱥᱟᱤᱴ + ᱴᱮᱵᱽᱞᱮᱴ ᱢᱚᱰ + ᱨᱮ + ᱚᱯᱷ + ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱰᱤᱯᱚᱞᱴ + ᱥᱟᱱᱟᱢ ᱪᱟᱞᱟᱣ ᱢᱮ + ᱡᱟᱦᱟᱸᱱ ᱥᱴᱨᱤᱢ ᱠᱚ ᱱᱤᱛ ᱫᱷᱟᱹᱵᱤᱡ ᱰᱟᱩᱱᱞᱚᱰᱡᱚᱨ ᱦᱚᱛᱮᱛᱮ ᱥᱚᱯᱷᱴᱣᱮᱰ ᱵᱟᱱᱟᱣ ᱟᱠᱟᱱᱟ ᱚᱱᱟ ᱠᱚ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱱᱚᱶᱟ ᱥᱴᱨᱤᱢ ᱨᱮ ᱢᱤᱫᱴᱟᱹᱝ ᱚᱰᱤᱭᱳ ᱴᱨᱟᱠ ᱢᱮᱱᱟᱜ ᱛᱟᱭᱟ + ᱡᱟᱹᱥᱛᱤ ᱧᱮᱞ ᱟᱠᱟᱱᱟ + ᱢᱟᱲᱟᱝ ᱨᱮ + ᱡᱩᱫᱤ ᱟᱢᱟᱜ ᱰᱤᱠᱳᱰᱟᱨ ᱮᱛᱚᱦᱚᱵ ᱨᱮᱭᱟᱜ ᱞᱟᱹᱞᱤᱥ ᱛᱟᱦᱮᱸᱱᱟ, ᱮᱱᱠᱷᱟᱱ ᱱᱚᱶᱟ ᱵᱟᱪᱷᱱᱟᱣ ᱫᱚ ᱮᱥᱮᱨ ᱢᱮ, ᱡᱟᱦᱟᱫᱚ ᱮᱛᱚᱦᱚᱵ ᱰᱤᱠᱳᱰᱟᱨ ᱮᱛᱚᱦᱚᱵ ᱵᱟᱝ ᱦᱩᱭ ᱞᱮᱱ ᱠᱷᱟᱱ ᱞᱟᱛᱟᱨᱼᱯᱨᱳᱭᱨᱤᱴᱤ ᱰᱤᱠᱳᱰᱟᱨ ᱨᱮ ᱨᱩᱣᱟᱹᱲ ᱦᱮᱡᱚᱜᱼᱟ ᱾ ᱱᱚᱶᱟ ᱨᱮᱭᱟᱜ ᱚᱡᱮ ᱫᱚ ᱮᱛᱚᱦᱚᱵ ᱰᱤᱠᱳᱰᱟᱨ ᱠᱚ ᱵᱮᱣᱦᱟᱨ ᱚᱠᱛᱚ ᱠᱷᱚᱱ ᱵᱮᱼᱲᱤᱪᱟᱹᱲ ᱯᱟᱥᱱᱟᱶ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ + ᱱᱚᱶᱟ ᱠᱟᱹᱢᱤ ᱦᱚᱨᱟ ᱫᱚ ᱥᱩᱨᱥᱩᱯᱩᱨ ᱵᱚᱫᱚᱞ ᱦᱩᱭ ᱞᱮᱱ ᱠᱷᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱳᱰᱮᱠ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱨ ᱨᱤ-ᱤᱱᱥᱴᱟᱱᱥᱟᱭᱤᱴ (re-instantiates) ᱮᱫᱟ, ᱚᱱᱟ ᱫᱚ ᱥᱩᱨᱥᱩᱯᱩᱨ ᱠᱳᱰᱮᱠ ᱨᱮ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱥᱩᱯᱩᱨ ᱥᱩᱯᱩᱨ ᱛᱮ ᱥᱮᱴᱮᱨᱚᱜ ᱨᱮᱱᱟᱜ ᱠᱟᱱᱟ ᱾ ᱱᱚᱶᱟ ᱥᱟᱛᱟᱢ ᱥᱟᱶᱛᱮ ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱟᱭᱢᱟ ᱚᱱᱚᱞ ᱨᱮ ᱵᱮᱵᱷᱟᱨ ᱟᱠᱟᱱᱟ, ᱱᱚᱶᱟ ᱥᱤᱴᱤᱝ ᱫᱚ ᱟᱱᱰᱨᱚᱭᱮᱰ ᱖ ᱟᱨ ᱚᱱᱟ ᱠᱷᱚᱱ ᱪᱮᱛᱟᱱ ᱨᱮᱜᱮ ᱟᱯᱷᱮᱠᱴ ᱟᱠᱟᱱᱟ +\n +\nᱱᱮᱛᱟᱨᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱟᱨ ᱥᱮ ᱯᱷᱩᱞᱥᱠᱨᱤᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱡᱚᱠᱷᱚᱱ ᱱᱚᱶᱟ ᱵᱟᱪᱷᱟᱣ ᱮᱢ ᱫᱚᱦᱚ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ + ᱪᱮᱱᱟᱞ ᱥᱟᱦᱴᱟ ᱠᱚᱨᱮ ᱪᱮᱫ ᱴᱮᱵᱽ ᱠᱚ ᱵᱚᱫᱚᱞᱟ + ᱚᱯᱮᱱ ᱯᱞᱮ ᱠᱭᱩᱤ + ᱡᱚᱛᱚ ᱥᱠᱨᱤᱱ ᱨᱮ ᱵᱷᱮᱡᱟ ᱢᱮ + ᱱᱮᱛᱟᱨᱟᱜ ᱫᱟᱜᱽ + ᱠᱷᱮᱞ + ᱨᱤᱯᱷᱟᱭᱤᱞ + ᱚᱠᱛᱚ + ᱨᱩᱣᱟ. + ᱰᱮᱴᱟ ᱟᱨ ᱢᱮᱢᱚᱨᱤ ᱵᱮᱵᱷᱟᱨ ᱠᱚᱢ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱪᱤᱛᱟᱹᱨ ᱠᱚᱣᱟᱜ ᱥᱤᱠᱷᱱᱟᱹᱛ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ᱟᱨ ᱪᱤᱛᱟᱹᱨ ᱠᱚ ᱚᱞ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱵᱟᱪᱷᱟᱣ ᱢᱮ. ᱢᱤᱢᱮᱨᱤ ᱟᱨ ᱚᱱ-ᱰᱤᱥᱠ ᱪᱤᱛᱟᱹᱨ ᱠᱮᱪ ᱵᱟᱱᱟᱨ ⁇ %s ᱪᱷᱟᱯᱟ ᱟᱠᱟᱱᱟ + ᱞᱟᱯᱷᱟᱝ ᱥᱤᱠᱷᱱᱟ. + ᱛᱟᱞᱢᱟ ᱥᱤᱠᱷᱱᱟᱹᱛ + ᱩᱥᱩᱞ ᱥᱤᱠᱷᱱᱟᱹᱛ + ᱯᱷᱟᱭᱞᱤᱥᱴ ᱧᱩᱛᱩᱢ ᱟᱨ ᱵᱷᱤᱰᱤᱭᱳ ᱧᱩᱛᱩᱢ ᱞᱮᱠᱟᱛᱮ ᱟᱨᱵᱟᱝ ᱵᱷᱤᱰᱤᱭᱳ URL ᱨᱮᱱᱟᱜ ᱢᱤᱫ ᱞᱮᱠᱟᱱ ᱞᱤᱥᱴᱤ ᱞᱮᱠᱟᱛᱮ ᱴᱷᱟᱶ ᱮᱢ ᱢᱮ + URL ᱛᱟᱹᱞᱠᱟᱹ ᱥᱟᱯᱲᱟᱣ + - %1$s: %2$s + ᱱᱚᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱨᱮ ᱑᱖:᱙ ᱠᱷᱚᱱ ᱑:᱑ ᱟᱥᱯᱮᱠᱴ ᱚᱱᱩᱯᱟᱹᱛ ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱛᱷᱚᱢᱵᱱᱮᱞ ᱜᱮᱫᱽ ᱢᱮ + ᱨᱤᱠᱟᱵᱽᱞᱤᱝ + ᱰᱤᱯᱷᱚᱞᱴ ᱠᱚᱱᱴᱮᱱᱴ ᱫᱤᱥᱚᱢ + ᱯᱤᱪ + ᱦᱳᱥᱴ + ExoPlayer ᱨᱮᱭᱟᱜ ᱰᱤᱠᱚᱰᱟᱨ ᱯᱷᱮᱞᱚᱵᱮᱠ ᱯᱷᱤᱪᱚᱨ ᱵᱮᱵᱷᱟᱨ ᱢᱮ + ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱥᱮᱴᱤᱝ + ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱥᱮᱴᱤᱸᱜᱽᱥ ᱠᱚ ᱪᱟᱪᱞᱟᱣ ᱢᱮ ᱾ ᱱᱚᱶᱟ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚᱣᱟᱜ ᱨᱤᱥᱴᱟᱨᱴ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ + ᱰᱟᱵᱞᱤᱝ + ᱰᱮᱥᱠᱨᱤᱯᱴᱤᱵ + ᱯᱨᱚᱜᱨᱮᱥᱤᱵᱽ ᱠᱚᱴᱮᱱᱴ (ᱱᱤᱛᱚᱜ %s) ᱨᱮ ᱞᱚᱰ ᱤᱱᱴᱟᱨᱵᱷᱮᱞ ᱨᱮᱱᱟᱜ ᱢᱟᱨᱟᱝ ᱮᱢ ᱢᱮ ᱢᱤᱫ ᱠᱚᱢ ᱵᱷᱚᱞᱮᱡᱽ ᱟᱡᱟᱜ ᱮᱛᱚᱦᱚᱵ ᱞᱚᱰᱰᱤᱝ ᱨᱮᱱᱟᱜ ᱟᱯᱞᱚᱰ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ + ᱚᱥᱴᱨᱮᱞᱤᱭᱟᱱ ᱚᱰᱤᱭᱳ ᱞᱟᱹᱜᱤᱫ + ᱴᱚᱴᱷᱟᱠᱤᱭᱟ. ᱥᱩᱪᱚᱱᱟ + ᱠᱷᱚᱵᱚᱨ ᱮᱦᱚᱵ ᱢᱮ + ᱢᱩᱪᱟᱹᱫ ᱠᱷᱚᱵᱚᱨ ᱴᱷᱟᱹᱶᱠᱟᱹ + ᱤᱱᱥᱴᱮᱸᱥ ᱥᱮᱞᱮᱫ ᱢᱮ + ᱤᱱᱥᱴᱟᱱᱥ URL ᱮᱢ ᱢᱮ + ᱚᱯᱰᱮᱴᱥ + ᱯᱚᱯ-ᱟᱯ ᱢᱚᱰ ᱨᱮ ᱠᱷᱮᱞᱚᱸᱰ + ᱥᱟᱦᱴᱟ + ᱩᱢᱮᱨ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱠᱟᱛᱷᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱭᱩᱴᱭᱩᱵᱽ ᱨᱮᱱᱟᱜ \"Restricted Mode\" ᱚᱞ ᱢᱮ + ᱡᱚᱛᱚ + ᱱᱮᱴᱣᱟᱨᱠ ᱵᱷᱩᱞ + ᱟᱱᱰᱨᱚᱭᱮᱰ ᱨᱮ ᱞᱤᱵᱨᱮ ᱞᱟᱭᱤᱴᱣᱮᱴ ᱥᱴᱨᱤᱢᱤᱝ + ᱴᱮᱜᱥ + ᱥᱚᱨᱠᱟᱨᱤ + ᱚᱱᱚᱞ ᱨᱮ ᱡᱟᱭᱜᱟ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱪᱮᱱᱮᱞ ᱨᱮᱱᱟᱜ ᱟᱵᱟᱛᱟᱨ ᱛᱷᱩᱱᱤᱠᱟ + ᱥᱮᱨᱮᱧ ᱞᱤᱥᱴᱤ ᱥᱟᱦᱴᱟ + ᱵᱟᱝ + ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮ + ᱯᱷᱤᱞ ᱧᱩᱛᱩᱢ ᱨᱮ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱪᱤᱠᱤ ᱠᱚ + ᱪᱷᱟᱸᱪ:Copy to clipboard ᱨᱮ ᱪᱷᱟᱸᱪ:Copy to clipboard + ᱧᱩᱛᱩᱢ ᱵᱚᱫᱚᱞ ᱢᱮ + ᱯᱷᱤᱞᱤᱢ ᱧᱩᱛᱩᱢ + ᱛᱷᱤᱭᱮᱴᱚᱨ + ᱪᱷᱟᱸᱪ + NewPipe ᱮᱯᱞᱤᱠᱮᱥᱚᱱ + ᱵᱟᱰᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱴᱟᱯ ᱢᱮ + ᱦᱟᱥᱤ ᱠᱚᱞᱠᱟᱛᱟ + ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱰᱟᱩᱱᱞᱚᱰ ᱯᱷᱳᱞᱰᱟᱨ ᱥᱮᱴ ᱵᱟᱝ, ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱰᱟᱩᱱᱞᱚᱰ ᱯᱷᱳᱞᱰᱟᱨ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + © %1$s ᱛᱮ %2$s ᱞᱟᱛᱟᱨ ᱨᱮ %3$s + About & FAQ + ᱞᱟᱭᱥᱮᱱᱥ + ᱥᱮᱞᱮᱫᱚᱜ ᱢᱮ + ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱨᱮᱱᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴᱤ ᱯᱚᱞᱤᱥᱤ + ᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱯᱨᱚᱡᱮᱠᱴ ᱟᱢᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱟᱹᱰᱤ ᱥᱚᱨᱮᱥ ᱜᱮᱭᱟ. ᱚᱱᱟᱛᱮ, ᱟᱢᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱵᱟᱹᱱᱩᱜ ᱠᱷᱟᱱ ᱱᱚᱶᱟ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱡᱟᱦᱟᱱ ᱰᱮᱴᱟ ᱵᱟᱭ ᱥᱟᱢᱟᱝᱟ ᱾_x000D_ +\nᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱨᱮᱱᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱯᱚᱞᱤᱥᱤ ᱨᱮ ᱡᱟᱦᱟᱸᱱ ᱰᱮᱴᱟ ᱠᱚ ᱟᱢ ᱠᱨᱮᱥᱚᱨ ᱨᱮᱯᱳᱨᱴ ᱚᱠᱟᱛᱮ ᱟᱢ ᱚᱠᱟ ᱞᱮᱠᱟᱛᱮ ᱟᱢᱟᱜ ᱰᱮᱴᱟ ᱠᱚ ᱵᱚᱫᱚᱞᱟ ᱟᱨ ᱵᱚᱫᱚᱞᱟ ᱚᱱᱟ ᱵᱟᱵᱚᱫ ᱛᱮ ᱡᱚᱛᱚ ᱵᱟᱰᱟᱭ ᱮᱢᱚᱜ ᱟ᱾ + ᱯᱨᱟᱭᱵᱷᱮᱴᱤ ᱯᱚᱞᱤᱥ ᱯᱟᱲᱦᱟᱣ ᱢᱮ + ᱞᱟᱭᱥᱮᱱᱥ ᱯᱟᱲᱦᱟᱣ ᱢᱮ + ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱚᱞ ᱟᱠᱟᱱ ᱯᱩᱥᱴᱟ + ᱯᱷᱤᱞ ᱥᱮᱴᱮᱨ ᱟᱠᱟᱱᱟ ᱟᱨ ᱵᱟᱝ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ + ᱱᱚᱝᱠᱟᱱ ᱯᱷᱳᱞᱰᱟᱨ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱱᱚᱝᱠᱟᱱ ᱯᱷᱤᱞ/ᱥᱟᱹᱛ ᱨᱮᱱᱟᱜ ᱜᱟᱞᱢᱟᱨᱟᱣ ᱵᱟᱹᱱᱩᱜᱼᱟ + ᱢᱮᱴᱟᱰᱟᱴᱟ ᱞᱚᱰ ᱠᱟᱱᱟ… + ᱪᱟᱱᱮᱞ + ᱵᱚᱫᱚᱞ ᱢᱮ + ᱥᱟᱱᱟᱢ ᱠᱷᱮᱞ ᱢᱮ + ᱡᱚᱦᱚᱜ + ᱢᱤᱫ ᱫᱷᱟᱣ + ᱯᱷᱤᱞᱤ + ᱱᱳᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ + ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱵᱟᱰᱟᱭ ᱦᱚᱪᱚ + ᱥᱴᱮᱯ + ᱥᱮᱵᱟ ᱨᱮ ᱡᱚᱲᱟᱣ ᱵᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ + ᱵᱟᱝ ᱧᱟᱢ ᱟᱠᱟᱱᱟ + ᱥᱮᱞᱮᱫ + ᱤᱧ ᱵᱟᱹᱧ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ, ᱡᱟᱦᱟᱸᱱᱟᱜ ᱠᱷᱟᱹᱛᱤᱨ ᱤᱧ ᱵᱟᱹᱧ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ + ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱱᱮᱴᱣᱟᱨᱠ ᱡᱚᱲᱟᱣ + ᱡᱟᱦᱟᱱ ᱱᱮᱴᱣᱟᱨᱠ + ᱥᱩᱯᱩᱨ + ᱰᱷᱮᱨ ᱵᱟᱪᱷᱟᱣ \ No newline at end of file diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 2f44a8664..b39a041ee 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -115,7 +115,7 @@ Sos caràteres non vàlidos benint remplasados cun custu valore Caràteres permìtidos in sos nùmenes de sos documentos Iscàrriga - Fatu + Fatu B\'at bisòngiu de risòlvere unu reCAPTCHA Incarca \"Fatu\" cando est risoltu Disafiu reCAPTCHA @@ -316,7 +316,7 @@ Impossìbile recuperare custu iscarrigamentu Connessione iscadida Su progressu s\'est pèrdidu, ca su documentu est istadu iscantzelladu - Perunu ispàtziu abarradu in su dispositivu + Perunu ispàtziu abarradu in su dispositivu NewPipe est istadu serradu in su mentres chi fiat traballende a su documentu Post-protzessamentu fallidu No agatadu @@ -374,7 +374,6 @@ Impostatzione de su menù de iscarrigamentu fallida Cuntenutu no a disponimentu Anàlisi de su situ web fallida - Detziframentu de sa firma URL de su vìdeu fallida No est istadu possìbile carrigare totu sas miniaduras Errore de retza Impossìbile iscarrigare in s\'ischeda SD esterna. Cheres resetare sa positzione de sa cartella de iscarrigamentu\? @@ -473,10 +472,8 @@ Boga totu sos datos de sa pàgina web in sa memòria temporànea Iscantzella sos metadatos in sa memòria temporànea Memòria temporànea de sas immàgines isboidada - Istuda pro prevènnere su carrigamentu de sas miniaduras, su sarvamentu de sos datos e s\'impreu de sa memòria. Sas modìficas ant a isbodiare siat sa memòria temporànea de sa memòria siat cussa de su discu Istuda pro cuare sos cummentos Ammustra sos cummentos - Càrriga sas miniaduras Longària de s\'avantzamentu e de sa torrada in segus lestros Su moimentu inesatu permitit a su riproduidore de si mòere cara a una positzione in manera prus lestra ma prus pagu pretzisa. Su de si mòere de 5, 15 o 25 segundos non funtzionat, cun custa optzione Imprea su moimentu inesatu lestru @@ -598,13 +595,12 @@ Automàticu (tema de su dispositivu) Tema pro sa note Ammustra sos detàllios de su canale - Disabìlita sa tunnellizatzione de sos elementos multimediales si durante sa riprodutzione bi sunt ischermadas nieddas o su flussu de su vìdeu no est regulare + Disabìlita sa tunnellizatzione de sos elementos multimediales si durante sa riprodutzione bi sunt ischermadas nieddas o su flussu de su vìdeu no est regulare. Disabìlita sa tunnellizatzione de sos mèdios Internu No elencadu Privadu Pùblicu - URL de sa miniadura Istrangiadore Suportu Limba @@ -761,4 +757,53 @@ Una rasta àudio diat dèpere èssere giai presente in custu flussu Impostatziones pro ExoPlayer Abìlita custa optzione si tenes problemas de initzializatzione de su decodificadore, chi colat a decodificadores a prioridade prus bassa si s\'initzializatzione de sos decodificadores primàrios fallit. Custu diat pòdere causare unu rendimentu de riprodutzione bassu cunfronta a s\'impreu de decodificadores primàrios + Calidade de s\'immàgine + Vìdeos + \? + Iscritos + Ite ischedas benint ammustradas in sas pàginas de su canale + Cumpartzi una lista de URL + Cumpartzi cun sos tìtulos + %1$s +\n%2$s + Ischedas de su canale + Curtzos + Carrighende sos metadatos… + Càmbia s\'orientamentu de s\'ischermu + Calidade bassa + Positzione de sas ischedas printzipales + Allughe/istuda s\'ischermu intreu + Recùpera sas ischedas de su canale + Avatars + Flussu imbeniente + Sa tunnellizatzione multimediale est istada disabilitada comente cunfiguratzione predefinida ca su modellu de dispositivu tuo s\'ischit chi non la suportat. + Avatars de sos suta-canales + Aberi sa lista de riprodutzione + Non càrrighes immàgines + Calidade arta + Informatziones + Cumpartzi s\'iscalita + A dae in antis + Albums + Torra in segus + Torra a reprodùere + Ischedas de recuperare cando agiornas sa fonte. Custa optzione non tenet efetu si unu canale benit agiornadu impreende sa modalidade lestra. + Cumpartzi s\'iscalita cun detàllios che a su nùmene de s\'iscalita e sos tìtulos de sos vìdeos o che a una lista simpre de URL de vìdeos + Calidade mesana + Avatars de su carrigadore + Insignas + Iscalitas + - %1$s: %2$s + Moe su seletzionadore de s\'ischeda printzipale a fundu + Perunu flussu in direta + Issèbera sa calidade de sas immàgines e si las carrigare, pro minimare s\'impreu de datos e memòria. Sas modìficas isbòidant sa memòria temporànea de sas immàgines siat in sa memòria siat in su discu — %s + Riprodue + Prus optziones + Miniaduras + Rastas + Longària + Perunu flussu + Canales + Flussu antepostu + Diretas \ No newline at end of file diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index cbc248b8b..85f248b11 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -23,4 +23,11 @@ ඇතුලත් කරන්න මෙයට චලන රූප භාගත කරන ස්තානය චලන රූප ගබඩා කිරීමට ස්තානයක් තෝරන්න + උත්පතන මාදිලියේ විවෘත කරන්න + සමඟ බෙදාගන්න + බාහිර ශ්‍රව්‍ය වාදකය භාවිතා කරන්න + සමහර විභේදනවලදී හඬ ඉවත් කරයි + ප්‍රවාහ වාදකයක් හමු නොවීය (ඔබට එය වාදනය කිරීමට VLC ස්ථාපනය කළ හැක). + ප්‍රවාහ ගොනුව බාගන්න + ප්‍රවාහ වාදකයක් හමු නොවීය. VLC ස්ථාපනය කරන්නද? \ No newline at end of file diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 6e218e16c..231de5fc4 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -15,15 +15,15 @@ Použiť externý prehrávač zvuku Prevzaté video ukladať do Prevzaté video súbory sú uložené tu - Vyberte priečinok na ukladanie videí - Adresár pre stiahnuté audio - Vyberte adresár pre ukladanie audio súborov + Vyberte priečinok pre stiahnuté video + Priečinok pre stiahnuté audio + Vyberte priečinok pre audio súbory Prevzaté zvukové súbory sú uložené tu Štandardné rozlíšenie Prehrať cez Kodi Nainštalovať chýbajúcu aplikáciu Kore\? Zobraziť možnosť \"Prehrať cez Kodi\" - Zobraziť možnosť \"Prehrať cez Kodi\" + Zobrazí možnosť prehrať video cez mediálne centrum Kodi Zvuk Predvolený zvukový formát Téma @@ -39,7 +39,6 @@ Chyba Chyba siete Nemožno zobraziť všetky náhľady - Nepodarilo sa dekódovať URL videa Nemožno analyzovať webovú stránku Obsah nie je dostupný Prehrať video, dĺžka: @@ -87,7 +86,7 @@ M B Požiadavka reCAPTCHA - Spustiť v okne + Otvoriť vo vyskakovacom okne Tieto práva sú potrebné pre \nprehrávanie v mini okne Preferovaný formát videa @@ -101,11 +100,11 @@ Vyčistiť Odstráni audio pri niektorých rozlíšeniach Zapamätať si parametre mini okna - Zapamätať si posledné nastavenie veľkosti a pozície mini okna + Zapamätá si posledné nastavenie veľkosti a pozície vyskakovacieho okna Hľadať návrhy Vyberte návrhy, ktoré sa majú zobrazovať pri vyhľadávaní Najlepšie rozlíšenie - Odber + Odoberať Odoberané Odber zrušený Nemožno zmeniť odber @@ -113,16 +112,16 @@ Odbery Čo je nové Hľadať v histórií - Hľadané výrazy ukladať lokálne + Hľadané výrazy uloží lokálne História pozretí - Ukladať históriu pozretých videí + Uloží históriu pozretých videí Pokračovať v prehrávaní - Pokračovať po prerušeniach (napr. telefonát) + Pokračouje v prehrávaní po prerušení (napr. po telefonáte) NewPipe oznámenia Notifikácie NewPipe prehrávača Preberanie Povolené znaky v názvoch súborov - Neplatné znaky budú nahradené týmito znakmi + Neplatné znaky budú nahradené znakmi s týmto významom Náhradný znak Písmená a číslice Väčšina špeciálnych znakov @@ -164,12 +163,12 @@ %s videí Nebol nájdený žiadny prehrávač pre stream (môžete si nainštalovať napr. VLC). - Stiahnuť súbor stream + Stiahnuť súbor streamu Zobraziť info Uložené zoznamy Pridať do Zobrazovať tip \"Pridať podržaním\" - Zobraziť tip pre stlačenie tlačidiel \"Pozadie\" alebo \"V okne\" v detailoch videa + Zobrazí tip pri stlačení tlačidiel pozadia alebo vyskakovacieho okna videa \"Podrobnosti:\" Predvolený obsah pre krajinu Prehrať všetko Vždy @@ -180,8 +179,8 @@ Prepnúť na Video Importovať databázu Exportovať databázu - Prepíše aktuálnu históriu, odbery, zoznamy skladieb a (voliteľne aj) nastavenia - Exportovať históriu, odbery, zoznamy skladieb a nastavenia + Prepíše aktuálnu históriu, odbery, zoznamy skladieb a (voliteľne) nastavenia + Exportuje históriu, odbery, zoznamy skladieb a nastavenia Nepodarilo sa prehrať tento stream Pri prehrávaní došlo k chybe a nemožno pokračovať Zotavovanie po chybe v prehrávaní @@ -246,11 +245,9 @@ Zväčšiť Používať rýchly posun Rýchly posun umožňuje prejsť na novú pozíciu rýchlejšie, ale s menšou presnosťou. Posun o 5, 15 alebo 25 sekúnd v tomto prípade nie je možný - Načítanie miniatúr - Vypnutím tejto funkcie sa nebudú vytvárať miniatúry a tým sa ušetrí miesto a pamäť. Zmena nastavení spôsobuje vyčistenie vyrovnávacej pamäte Vyrovnávacia pamäť obrázkov vymazaná Vymazať metadáta uložené vo vyrovnávacej pamäti - Odstrániť všetky údaje webových stránok vo vyrovnávacej pamäti + Odstráni všetky údaje webových stránok vo vyrovnávacej pamäti Vyrovnávacia pamäť metadát bola vymazaná Automaticky zaradiť ďalší stream Končiaci (neopakujúci sa) zoznam prehrávania bude pokračovať súvisiacim streamom @@ -267,9 +264,9 @@ Automaticky vygenerované Titulky Upravte mierku textu titulkov prehrávača a štýly pozadia. Vyžaduje sa reštart aplikácie - Monitorovanie pretečenia pamäte môže spôsobiť, že aplikácia nebude reagovať + Monitorovanie úniku pamäte môže spôsobiť, že aplikácia nebude reagovať Nahlásiť mimo-cyklické chyby - Vynútiť hlásenie výnimiek nedoručiteľných Rx mimo časového cyklu fragmentov alebo aktivity po zneškodnení + Vynúti hlásenie nedoručiteľných výnimiek Rx mimo časového cyklu fragmentov alebo aktivity po zneškodnení Import Importovať z Exportovať do @@ -307,7 +304,7 @@ Vymazať celú históriu pozretí\? História pozretí bola vymazaná Vymazať históriu vyhľadávania - Vymaže históriu vyhľadávania kľúčových slov + Odstráni históriu vyhľadávania kľúčových slov Vymazať celú históriu vyhľadávania\? História vyhľadávaní bola vymazaná 1 položka bola vymazaná. @@ -331,7 +328,7 @@ Krok Vynulovať Minimalizovať pri prepnutí aplikácie - Akcia pri prepnutí na inú aplikáciu z hlavného prehrávača videa — %s + Akcia pri prepnutí do inej aplikácie z hlavného prehrávača videa - %s Nič Prehrávať na pozadí Prehrávať v okne @@ -348,7 +345,7 @@ Obnoviť predvolené nastavenia Chcete obnoviť predvolené hodnoty\? Počet odberateľov nie je k dispozícii - Karty, ktoré sa zobrazujú na hlavnej stránke + Aké karty sa zobrazujú na hlavnej stránke Konferencie Aktualizácie Zobrazí sa výzva na aktualizáciu aplikácie, keď je k dispozícii nová verzia @@ -382,7 +379,7 @@ Post-spracovanie zlyhalo Stop Maximum opakovaní - Maximálny počet pokusov pred zrušením stiahnutia + Maximálny počet pokusov pred zrušením sťahovania Pozastaviť pri prechode na mobilné dáta Je to užitočné pri prechode na mobilné dáta, niektoré sťahovania však nemožno pozastaviť Zobraziť komentáre @@ -392,16 +389,16 @@ Nemožno načítať komentáre Zatvoriť Obnoviť prehrávanie - Obnovenie poslednej pozície prehrávania + Obnoví poslednú pozíciu prehrávania Poradie v zoznamoch - Zobraziť indikátory polohy prehrávania v zoznamoch + Zobrazí indikátory pozície prehrávania v zoznamoch Vymazať údaje Pozície prehrávania boli odstránené Súbor bol presunutý alebo odstránený súbor nemožno prepísať Súbor s rovnakým názvom už čaká na stiahnutie NewPipe bol ukončený počas spracovávania súboru - Máš plnú pamäť + Máš plnú pamäť Nemožno pokračovať, súbor bol vymazaný Spojenie vypršalo Chcete vymazať históriu sťahovania alebo odstrániť všetky stiahnuté súbory\? @@ -454,7 +451,7 @@ Jazyk aplikácie Predvolený Vyrieš a stlač \"Hotovo\" - Hotovo + Hotovo Videá Pre obmedzenie ExoPlayera bolo prehľadávania nastavené na %d sekúnd Stlmiť @@ -480,7 +477,7 @@ %d dní Skupiny kanálov - Aktualizované: %s + Zdroj naposledy aktualizovaný: %s Nenačítané: %d Načítavanie zdroja… Spracovávanie zdroja… @@ -496,7 +493,7 @@ Nová Zdroj Interval obnovy zdroja - Čas po ktorom sa kontrola odberu považuje za zastaralú — %s + Čas od poslednej aktualizácie, kedy sa odber považuje za neaktuálny - %s Vždy aktualizovať Načítať z vyhradeného zdroja, ak je k dispozícii Služba je dostupná len pre určité zdroje, zvyčajne je rýchlejšia ale môže vrátiť obmedzený počet položiek alebo neúplné informácie (napr. dĺžka, typ, status) @@ -542,7 +539,7 @@ Zobraziť iba nezoskupené odbery Nikdy Iba na WiFi - Spustiť automatické prehrávanie — %s + Spustí automatické prehrávanie - %s Prehrať zoznam Zatiaľ bez záložiek zoznamu Vyberte zoznam skladieb @@ -550,38 +547,38 @@ Nemožno rozpoznať URL. Otvoriť pomocou inej aplikácie\? Automatický rad Zoznam aktuálneho prehrávača bude prepísaný - Prepnutie prehrávača môže vymazať zoznam + Prepnutie z jedného prehrávača na druhý môže nahradiť vaše poradie Vyžadovať povolenie pred vyčistením zoznamu Nič Bufferuje Náhodné Opakovať V kompaktnom oznámení môžete vybrať najviac tri akcie, ktoré sa majú zobraziť! - Všetky nasledovné upozornenia môžete upraviť poklepaním. Tri z nich môžete vybrať a tieto sa budú zobrazovať v kompaktnom oznámení + Všetky nasledovné oznámenia môžete upraviť poklepaním. Tri z nich môžete vybrať a tieto sa budú zobrazovať v kompaktnom oznámení. Akčné tlačidlo päť Akčné tlačidlo štyri Akčné tlačidlo tri Akčné tlačidlo dva Akčné tlačidlo jedna - Orezať pomer strán videa zobrazovaného v miniatúre z 16:9 na 1:1 + Oreže miniatúru videa zobrazenej v oznámení z pomeru strán 16:9 na 1:1 Orezať pomer strán miniatúry na 1: 1 Zobraziť memory leaks Zaradené do poradia Zaradiť do poradia - Vymazať cookies, ktoré NewPipe ukladá, keď vyriešite reCAPTCHA + Vymaže cookies, ktoré NewPipe ukladá, keď vyriešite reCAPTCHA reCAPTCHA cookies boli vymazané Vymazať cookies reCAPTCHA YouTube poskytuje \"Obmedzený režim\", ktorý skrýva potenciálny obsah pre dospelých - Zobraziť obsah, ktorý je možno nevhodný pre deti, pretože má vekovú hranicu (napríklad 18+) - Nechajte Android, aby prispôsobil farbu upozornenia podľa hlavnej farby v miniatúre (nemusí to fungovať na všetkých zariadeniach) + Zobrazí obsah, ktorý je pravdepodobne nevhodný pre deti, pretože má vekové obmedzenie (napríklad 18+) + Nechajte Android, aby prispôsobil farbu oznámenia podľa hlavnej farby v miniatúre (nemusí to fungovať na všetkých zariadeniach) Farby upozornení Zobrazovať miniatúru - Používať miniatúru ako pozadie pri uzamknutej obrazovke a v upozorneniach + Použije miniatúru pre pozadie uzamknutej obrazovke a oznámenia Počítanie hash - Upozornenie pri generovaní hash z názu videa + Oznámenia o priebehu hašovania videa Oznámenie o hashovaní videa Nedávne - Vypnite, pokiaľ nechcete zobrazovať meta informácie ako autor streamu, obsah streamu alebo vyhľadávanie + Vypnutím skryjete metainformačné polia s ďalšími informáciami o autorovi streamu, obsahu streamu alebo požiadavke na vyhľadávanie Zobrazovať meta informácie Kapitoly Popis @@ -607,13 +604,12 @@ Najlepšie Zobraziť podrobnosti kanála Vyrieš - Nočná Téma - Ak vám video pri prehrávaní seká alebo sa zobrazuje čierna obrazovka zakážte tunelovanie médií + Nočná téma + Ak sa video pri prehrávaní seká alebo sa objaví čierna obrazovka, vypnite tunelovanie médií. Zakázať tunelovanie médií Interné Súkromné Nezaradené - URL miniatúry Verejné Hostiteľ Podpora @@ -635,8 +631,8 @@ \nChcete sa odhlásiť z odberu tohto kanála\? Nemožno načítať informačný kanál \'%s\'. Chyba pri načítaní kanála - \'Storage Access Framework\' je podporovaný len od Androidu 10 a vyššie - Pri každom sťahovaní sa zobrazí výzva kam uložiť súbor + Od Androidu 10 je podporovaný len \'Storage Access Framework\' + Pri každom sťahovaní sa zobrazí výzva, kam uložiť súbor Nie je nastavený adresár na sťahovanie, nastavte ho teraz Označiť ako videné Vypnuté @@ -657,11 +653,11 @@ Nízka kvalita (menšie) Vysoká kvalita (väčšie) Náhľad miniatúry pri vyhľadávaní - Zobraziť farebné stužky Picassa na obrázkoch podľa ich zdroja: červená pre sieť, modrá pre disk a zelená pre pamäť + Zobrazí farebné pásiky Picasso na obrázkoch podľa ich zdroja: červený pre sieť, modrý pre disk a zelený pre pamäť Zobraziť indikátory obrázka Potiahnutím vymazať Komentáre sú zakázané - Pri zamknutej auto-rotácií nespúšťať videá v mini prehrávači, ale prepnúť sa priamo do režimu celej obrazovky. Prístup k mini prehrávaču bude po ukončení režimu celej obrazovky + Ak je automatické otáčanie zablokované, nespustí videá v miniprehrávači, ale prepne sa do celoobrazovkového režimu. Do miniprehrávača sa dostanete po ukončení režimu celej obrazovky Hlavný prehrávač na celej obrazovke Návrhy vzdialeného vyhľadávania Miestne návrhy vyhľadávania @@ -693,13 +689,13 @@ Vymazať všetky stiahnuté súbory z disku\? Upozornenia sú vypnuté Upozornenie z prehrávača - Nastavte notifikáciu aktuálneho prehrávania + Nastavte oznámenie aktuálneho streamu prehrávania Je vyžadované pripojenie na internet Začali ste odoberať tento kanál , Zapnúť všetko Nové streamy - Upozornenia na nové streamy v odberoch + Oznámenia o nových streamoch v odberoch %s nový stream %s nové streamy @@ -707,7 +703,7 @@ Skontrolovať nové streamy Upozornenia na nové streamy - Upozorniť na nové streamy z odberov + Upozorní na nové streamy z odberov Akákoľvek sieť Dostávať upozornenia Poltón @@ -736,9 +732,9 @@ Rýchly režim Import alebo export odberov z 3-bodkovej ponuky Akcia gesta vľavo - Akcia pre gesto v pravej polovici obrazovky + Vyberte gesto pre pravú polovicu obrazovky prehrávača Akcia gesta vpravo - Akcia pre gesto v ľavej polovici obrazovky + Vyberte gesto pre ľavú polovicu obrazovky prehrávača Jas Hlasitosť Nič @@ -746,11 +742,11 @@ Odstrániť duplikáty\? Rozpozerané Dopozerané - Toto sa môže hodiť v prípade, že máte pokazené tlačidlo na slúchadlách + Toto sa môže hodiť v prípade, že máte pokazené tlačidlá na slúchadlách Ignorovať fyzické tlačidlá - Zmena veľkosti intervalu načítania pri progresívnom obsahu (v súčasnosti %s). Nižšia hodnota môže urýchliť ich počiatočné načítanie + Zmení veľkosť intervalu načítania pri progresívnom obsahu (v súčasnosti %s). Nižšia hodnota môže urýchliť ich počiatočné načítanie Preferovať pôvodné audio - Vyberať pôvodnú zvukový stopu bez ohľadu na nastavený jazyk + Vyberte pôvodnú zvukovú stopu bez ohľadu na jazyk Preferovať prehrávanie popisu Zvuk: %s Zvuková stopa @@ -760,18 +756,75 @@ Výber zvukovej stopy pre externé prehrávače Neznáma Nadchádzajúce - Úprava nastavení prehrávača ExoPlayer. Pre aplikovanie týchto zmien je nutné reštartovať ExoPlayer + Úprava niektorých nastavení prehrávača ExoPlayer. Pre aplikovanie týchto zmien je potrebné reštartovať prehrávač Túto možnosť povoľte, ak máte problémy s inicializáciou dekodéra, ktorý sa v prípade zlyhania inicializácie primárnych dekodérov vráti k dekodérom s nižšou prioritou. To môže mať za následok nižší výkon prehrávania ako pri použití primárnych dekodérov - Používať funkciu záložného dekodéra prehrávača ExoPlayer + Použiť funkciu záložného dekodéra prehrávača ExoPlayer Vždy použiť nastavenia výstupu videa ExoPlayera %1$s %2$s povodná dabovaná - Vyberať zvukovú stopu s popisom pre zrakovo postihnutých ak je k dispozicií + Vyberte zvukovú stopu s popisom pre osoby so zrakovým postihnutím, ak je k dispozícii Zobrazovať/Skrývať streamy Nastavenia ExoPlayer - Toto riešenie spôsobí to, že pri zmene textúry sa aktuálne používaný kodek uvoľní a potom znova použije, miesto toho aby sa textúra rovno použila na kodek. Toto nastavenie, ktoré už ExoPlayer používa na niektorých zariadeniach s týmto problémom, má vplyv len na Android 6 a vyšší + Toto riešenie uvoľní a znovu nastaví videokodeky pri zmene rozhrania namiesto priameho nastavenia rozhrania kodeku. Nastavenie už používa ExoPlayer na niektorých zariadeniach s týmto problémom a týka sa len systému Android 6 a vyššie \n -\nPovolenie tejto možnosti môže zabrániť chybám pri prehrávaní pri prepínaní aktuálneho prehrávača videa alebo prepínaní na celú obrazovku +\nPovolením tejto možnosti môžete zabrániť chybám prehrávania pri zmene aktuálneho prehrávača videa alebo pri prepnutí do režimu celej obrazovky popisná + Videá + Odberatelia + Aké karty sa zobrazujú na stránkach kanála + Karty kanálov + Krátke + Načítavanie metadát… + Prepnúť orientáciu obrazovky + Poloha hlavných kariet + Prepnúť na celú obrazovku + Načítať karty kanála + Ďalší stream + Vaše zariadenie nepodporuje tunelovanie medií a preto bolo tunelovanie medií zakázané. + Otvoriť zoznam prehrávania + O kanále + Dopredu + Albumy + Dozadu + Opäť prehrať + Karty, ktoré sa majú načítať pri aktualizácii informačného kanála. Táto možnosť nemá žiadny účinok, ak je kanál aktualizovaný pomocou rýchleho režimu. + Zoznamy skladieb + Presunie výber hlavnej karty do spodnej časti + Žiadne živé prenosy + Prehrať + Ďalšie možnosti + Stopy + Dĺžka + Žiadne videá + Kanály + Predchádzajúci stream + Naživo + Kvalita obrázkov + \? + Nízka kvalita + Avatary + Nenačítavať obrázky + Vysoká kvalita + Zdieľať playlist + Stredná kvalita + Bannery + Vyberte kvalitu obrázkov a či sa majú obrázky vôbec načítať, aby sa znížila spotreba dát a pamäte. Zmeny vymažú vyrovnávaciu pamäť obrázkov v pamäti a na disku - %s + Zobraziť viac + Zobraziť menej + Každú akciu oznámenia upravte poklepaním. Prvé tri akcie (prehrať/pozastaviť, predchádzajúce, ďalšie) sú nastavené systémom a nie je možné ich prispôsobiť. + Náhľady + Avatary uploadera + Sub-kanálové avatary + Zdieľať s názvami + Zdieľať URL playlistu + + %s odpoveď + %s odpovede + %s odpovedí + + Zdieľajte playlist s podrobnosťami, ako je jeho názov a názvy videí, alebo ako jednoduchý zoznam URL adries videí + - %1$s: %2$s + %1$s +\n%2$s \ No newline at end of file diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 7e89a1ed5..b0fcec406 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -43,7 +43,6 @@ Izberite mapo za prenos avdio datotek Napaka Vseh sličic videov ni mogoče naložiti - Ni mogoče odšifrirati podpisa naslova URL videa Ni mogoče razčleniti spletišča Vsebina ni na voljo Ni mogoče nastaviti menija za prejem datotek @@ -198,7 +197,6 @@ Ustvari Opusti Preimenuj - Naloži sličice Jezik aplikacije Uporabi SAF Vprašaj kam shraniti @@ -213,7 +211,7 @@ Počisti zgodovino prenosa Ni mogoče povrniti prenos Napredek je izgubljen, ker je bila datoteka izbrisana - Ni več prostora v vaši napravi + Ni več prostora v vaši napravi NewPipe se je zaprl medtem ko je delal z datoteko Ni najden Strežnik ne pošilja informacij @@ -266,7 +264,7 @@ Preberi pravilnik zasebnosti NewPipe-ovi pravilnik zasebnosti Obiščite spletno mesto od NewPipe za več informacij in novic. - Končano + Končano Ni komantarjev Nobeden ne posluša Nobeden ne gleda @@ -309,7 +307,6 @@ Predpomnjeni metapodatki so bili odstranjeni Prikaži meta informacije Onemogoči da se ustavi prikazovanje komentarjev - Izklopite, če želite preprečiti nalaganje sličic, s tem bo varčeval na podatkih in uporabi spomina. Spremembe bodo izbrisale predpomnilnik v spominu in na disku Dejavna vrsta bo zamenjana Preklop na drugi predvajanik lahko zamenja vašo čakalno vrsto Vprašaj za potrditev pred čiščenjem vrste diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index b2ec76d77..e37c3a36d 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -189,7 +189,7 @@ Xarfaha aan la taageerin waxaa lagu bdadali midkan Xarafyada magaca shayga loo ogol yahay Dajinta - Dhameeyay + Dhameeyay Tijaabada reCAPTCHA ayaa la codsaday Taabo \"Dhameeyay\" ✅ markaad xaliso Tijaabada reCAPTCHA @@ -289,7 +289,6 @@ Lama soo kicin karo tusmada dajinta shaygan lama heli karo Lama furi karo website-ka - Lama baddali karo sixiixa tixraaca muuqaalka Lama soo wada kicin karo galalkoo dhan khalad xaga khadka ah Ku dajinta kaydka dibadda (mimoriga) suurtogal ma aha. Dib u fadhiisi khaanada wax lagu dajiyo\? @@ -401,10 +400,8 @@ Tirtir waxyaabaha K/G ah ee boga website-ka Tirtir faahfaahinada yaryar kaydkii kumeelgaadhka ahaa ee sawirka waa la tirtiray - Xidh si aad u joojiso soo bandhiga galka muuqaalada, adigoo yaraynaya isticmalka khadka iyo maskaxda aalada. Wax ka baddalkan wuxuu nadiifin doonaa waxa kaydka hore iyo ka caadiga ah kumeelgaadh ahaan ugu jira Xidh si aad uqariso faallooyinka Tus faallooyinka - Soodhig galalka Hormada daareha hadda wax shidaya waa la baddali doonaa Kala baddalka daareha waxay badali kartaa hormada sidaas darteed waydii in la xaqiijiyo intaan hormada la tirtirin Xaqiijinta tirtirka hormada @@ -523,7 +520,7 @@ Dajintan lama hagaajin karo Ku xidhidii ayaa wakhtigii ka dhacay Hawshii socotay way kala kacday, sababtoo ah shayga waa lala saaray - Meel banaan oo wax lagu kaydiyo aalaada kuma hadhin + Meel banaan oo wax lagu kaydiyo aalaada kuma hadhin NewPipe waxaa la xidhay asagoo fayl ka shaqaynaya Habayntii way guuldareystay Lama helin @@ -604,7 +601,6 @@ Gaar ah Aan liistada kujirin Lawada arko - Tixraaca galka Martigaliye Taageero Luuqada diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 41d9f22ad..5196d606a 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -18,7 +18,6 @@ Luaj me Kodi Audio E zezë - Ngarko pamjet miniaturë Sugjerimet e kërkimit Të shikuarat Ruaji videot e shikuara @@ -83,7 +82,7 @@ Nuk mund të rikuperohet ky shkarkim Koha e lidhjes skadoi Progresi humbi, pasi skedari është fshirë - Nuk ka vend bosh në pajisje + Nuk ka vend bosh në pajisje NewPipe u mbyll ndërkohë që po punohej mbi skedarin Procesimi dështoi Nuk u gjet @@ -256,7 +255,7 @@ Karakteret e palejuara zëvendësohen me këtë vlerë Karakteret e lejuara në emrat e skedarëve Shkarko - U bë + U bë sfida reCAPTCHA u kërkua Shtyp \"U bë\" kur ta zgjidhni sfida reCAPTCHA @@ -402,7 +401,6 @@ Nuk u arrit të vendosej menuja e shkarkimeve Përmbajtja e padisponueshme Nuk u arrit të analizohej faqja - Nuk u arrit të dekriptohej firma e URL së videos Nuk u mundën të ngarkoheshin të gjitha pamjet statike Problem rrjeti Shkarkimi në kartën SD të jashtme nuk ishte i mundur. Doni të rivendosni vendndodhjen e dosjes së shkarkimeve\? @@ -487,7 +485,6 @@ Depoja e të dhënave meta u boshatis Boshatis depon e të gjitha të dhënave të faqeve të internetit Boshatis depon e të dhënave meta - Fikeni për të ndaluar shfaqjen e pamjeve statike, duke kursyer internet dhe memorje. Ndryshimet boshatisin depon e imazheve në memorje dhe në disk Depoja e imazheve u boshatis Fikeni për të fshehur komentet Shfaq komentet @@ -589,7 +586,6 @@ Private E palistuar Publike - URL e pamjes statike Mundësuesi Mbështetje Gjuha diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 208b7f6e9..fc68ce5eb 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -1,148 +1,147 @@ Објављено %1$s - Нема плејера токова. Инсталирати ВЛЦ\? + Нема плејера стримова. Инсталирати VLC\? Инсталирај Откажи - Отвори у претраживачу + Отвори у прегледачу Подели Преузми - Тражи + Претрага Подешавања Да ли сте мислили: „%1$s“\? Подели помоћу - Фасцикла за видео - Преузети видео записи се чувају овде - Избор фасцикле за преузимање видеа + Фолдер за преузимање видео снимака + Преузети видео снимци се чувају овде + Изаберите фолдер за преузимање видео снимака Подразумевана резолуција - Пусти помоћу Кодија - Инсталирати даљински за Коди\? - Прикажи „Пусти помоћу Кодија“ - Приказ опције за пуштање видеа у Коди медија центру - Аудио - Подразумевани формат звука + Пусти помоћу Kodi-ја + Инсталирати апликацију Kore која недостаје\? + Прикажи опцију „Пусти помоћу Kodi-ја“ + Прикажите опцију за пуштање видео снимака преко Kodi медија центра + Аудио снимак + Подразумевани формат аудио снимка Преузимање - УРЛ није подржан - Прикажи „следећи“ и „слични“ видео + URL адреса није подржана + Прикажи „следеће“ и „сличне“ видео снимке Подразумевани језик садржаја - Видео и аудио - Пусти видео, трајање: + Видео и аудио снимци + Пусти видео снимак, трајање: Аватар пошиљаоца Несвиђања Свиђања - Користи спољашњи видео плејер - Користи спољашњи аудио плејер - Пуштам у позадини + Користи спољни плејер видео снимака + Користи спољни плејер аудио снимака + Пуштање у позадини Тема - тамна - светла + Тамна + Светла Изглед - Грешка мреже - Фасцикла за аудио - Избор фасцикле за аудио фајлове - Преузети аудио записи се чувају овде + Мрежна грешка + Фолдер за преузимање аудио снимака + Изаберите фолдер за преузимање аудио снимака + Преузети аудио снимци се чувају овде Грешка - Не могу да учитам све сличице - Не могу да дешифрујем потпис видео урл-а - Не могу да рашчланим веб-сајт + Није могуће учитати све сличице + Није могуће рашчланити веб-сајт Садржај је недоступан Садржај - Прикажи старосно-ограничени садржај - Не могу да поставим мени преузимања - Нажалост, ово не би требало да се деси. - Пријавите ову грешку е-поштом + Прикажи старосно ограничени садржај + Није могуће подесити мени преузимања + Извините, ово није требало да се деси. + Пријави путем имејла Извините, нешто није у реду. Пријави - Подаци: + Информације: Шта се десило: Ваш коментар (на енглеском): Детаљи: - Видео - Аудио + Видео снимак + Аудио снимак Покушај поново Уживо - Кликните на лупу да започнете. + Додирните лупу да бисте започели. Почни Паузирај - Обриши + Избриши Контролна сума У реду Назив фајла Нити Грешка - Њупајп преузима - Тапните за детаље + NewPipe преузима + Додирните за детаље Сачекајте… Копирано у привремену меморију - Одредите фасциклу за преузимање касније у поставкама + Одредите фолдер за преузимање касније у подешавањима Преузимања Преузимања Извештај о грешци - Програм се срушио - Шта:\\nЗахтев:\\nЈезик садржаја:\\nЗемља садржаја:\\nЈезик апликације:\\nУслуга:\\nГМТ време:\\nПакет:\\nИздање:\\nИздање ОС-а: + Програм је отказао + Шта:\\nЗахтев:\\nЈезик садржаја:\\nЗемља садржаја:\\nЈезик апликације:\\nУслуга:\\nGMT време:\\nПакет:\\nВерзија:\\nВерзија ОС-а: „reCAPTCHA“ задатак Решите „reCAPTCHA“ задатак - црна + Црна Све - хиљ - мил - млрд + хиљ. + мил. + млрд. Отвори у искачућем режиму Ова дозвола је потребна за \nотварање у искачућем режиму - Пуштање у режиму прозорчета - Искључено - Подразумевани формат видеа - Резолуција искачућег прозора + Пуштање у режиму искачућег прозора + Онемогућено + Подразумевани формат видео снимка + Подразумевана резолуција искачућих прозора Прикажи веће резолуције - Само неки уређаји могу да пуштају 2K/4K видео + Само неки уређаји могу да пуштају 2K/4K видео снимке Очисти Позадина - Прозорче + Искачући прозор Уклања звук на неким резолуцијама Упамти својства искачућег прозора - памти последњу величину и позицију искачућег прозора - Предлози у претрази - Приказује предлоге током претраге + Памти последњу величину и позицију искачућег прозора + Предлози за претрагу + Изаберите предлоге који ће се приказати приликом претраге Пратите - Прати + Запрати Праћења Шта је ново - Историјат претраге - Појмове претраге складишти локално + Историја претраге + Локално чувајте упите за претрагу Историја гледања - Чувај историјат гледања - Настави са репродукцијом + Чувајте листу одгледаних видео снимака + Настави са пуштањем Најбоља резолуција Преузимање - О програму - О програму + О NewPipe + О нама и ЧПП Лиценце - Слободно и лагано стримовање на Андроиду. - Погледај на Гитхабу + Слободно и лагано стримовање на Android-у. + Погледај на GitHub-у Прочитај лиценцу Допринос - Историјат - Историјат - Настави пуштање након прекида (нпр. позива) - Дозвољени знакови у називима - слова и бројке + Историја + Историја + Наставите са пуштањем након прекида (нпр. телефонски позиви) + Дозвољени знакови у називима фајлова + Слова и бројеви © %1$s од %2$s под %3$s - Одјављен са канала - Не могу да променим претплату - Не могу да ажурирам претплату + Прекинуто праћење канала + Није могуће променити праћење + Није могуће ажурирати праћење Плејер Понашање Историја и кеш - Врати - Њупајп обавештење - Обавештења за Њупајп плејере у позадини и искачућем прозору + Поништи + NewPipe обавештење + Обавештења за NewPipe плејер Нема резултата - Нема ничега овде осим цврчака + Овде нема ничега осим цврчака Нема пратилаца %s пратилац - %s пратилаца + %s пратиоца %s пратилаца Нема прегледа @@ -151,25 +150,25 @@ %s прегледа %s прегледа - Нема видеа + Нема видео снимака - %s видео - %s видеа - %s видеа + %s видео снимак + %s видео снимка + %s видео снимака - Неисправни знакови биће замењени овим - Знак за замену - и посебни знакови + Неисправни знакови биће замењени овим вредностима + Заменски знак + Већина посебних знакова Лиценце треће стране - Лиценца Њупајпа - Помоћ је увек добро дошла, било да имате идеју за превод, дизајн, козметичке или озбиљне измене кôда. Што се више уради, боље је! - Покажите савет када притиснете позадину или искачуће дугме у видеу „Детаљи:“ + Лиценца NewPipe-а + Без обзира имате ли идеје; превод, промене дизајна, чишћење кода или праве, озбиљне, промене кода—помоћ је увек добродошла. Што се више уради, то је боље! + Прикажите савет када притиснете позадину или искачуће дугме у видео снимку „Детаљи:“ Пусти све - Не могу да пустим овај ток - Десила се непоправљива грешка плејера - Опорављам се од грешке плејера - Желите да обришете ову ставку из историјата претраге\? - Садржај главне стране + Није могуће пустити овај стрим + Дошло је до непоправљиве грешке плејера + Опорављање од грешке плејера + Желите ли да избришете ову ставку из историје претраге\? + Садржај главне странице Празна страница Киоск страница Страница канала @@ -181,113 +180,111 @@ Ново и популарно Уклони Детаљи - Поставке звука - Нема плејера тока (можете инсталирати ВЛЦ). - Преузимање фајла тока - Прикажи податке - Обележене листе + Подешавања аудио снимка + Није пронађен ниједан плејер стримова (можете инсталирати VLC да бисте га покренули). + Преузимање фајла стрима + Прикажи информације + Обележене плејлисте Додај на Подразумевана држава за садржај Исправљање грешака Увек Само једном - [непознато] - Прикажи поруку „задржи ради заказивања” + [Непознато] + Прикажи савет „Задржи за стављање у ред чекања” Донација - ЊуПајп развијају волонтери у своје слободно време како би вам пружили најбоље искуство. Узвратите им како би наставили са побољшавањем ЊуПајпа док уживају уз шољицу кафе. + NewPipe је развијен од стране волонтера који проводе своје слободно време доносећи вам најбоље корисничко искуство. Узвратите програмерима како би учинили NewPipe још бољим, док уживају у шољици кафе. Узврати - Веб страна - За више информација и новости посетите ЊуПајпов вебсајт. - Задржи за стављање у ред + Веб-сајт + За више информација и новости посетите NewPipe веб-сајт. + Задржи за стављање у ред чекања Користи брзо, непрецизно премотавање Непрецизно премотавање омогућава плејеру да брже долази до позиције уз смањену прецизност. Премотавање за 5, 15 или 25 секунди са овом опцијом не ради - Учитај сличице - Искључите да спречите преузимање сличица, смањујући утрошак преноса података и меморије. Изменом ће се очистити и меморијски и диск кеш Очишћен кеш са сликама Уклони кеширане метаподатке - Уклања све податке кешираних веб-страна - Откажи праћење - Изаберите језичак + Уклања све податке кешираних веб-страница + Прекини праћење + Изаберите картицу Приказ коментара - искључите за сакривање коментара - Због ограничења плејера, премотавање је постављено на %d секунди - Да, и делимично одгледани снимци - Видео записи који су гледани пре и након додавања на листу биће уклоњени. -\nДа ли сте сигурни\? Ово се не може повратити! + Искључите да бисте сакрили коментаре + Због ограничења ExoPlayer-а, премотавање је постављено на %d секунди + Да, и делимично одгледани видео снимци + Видео снимци који су одгледани пре и после додавања на плејлисту биће уклоњени. +\nЈесте ли сигурни\? Ово се не може поништити! Уклонити одгледане видео снимке\? - Уклони гледано - Системски + Уклони одгледано + Системски подразумевано Језик апликације Изаберите инстанцу - „Storage Access Framework“ омогућава преузимање на спољну СД картицу - Користи системски бирач фасцикли (SAF) - Питаће вас где да сачувате свако преузимање. -\nУкључите системски бирач фасцикли „SAF“ ако желите да користите спољну СД картицу + „Storage Access Framework“ омогућава преузимање на спољну, SD (меморијску), картицу + Користи системски бирач фолдера (SAF) + Бићете упитани где желите да сачувате свако преузимање. +\nОмогућите системски бирач фолдера (SAF), ако желите да преузмете на спољну, SD (меморијску), картицу Питај где да се преузме Паузирај преузимања Започни преузимања - По једно преузимање ће бити активно + Једно преузимање ће бити покренуто у исто време Ограничи ред за преузимање Затвори Корисно при преласку на мобилне податке, иако нека преузимања не могу бити обустављена - Прекид на мереним мрежама + Прекид на мрежама с ограничењем Највећи број покушаја пре отказивања преузимања Највише покушаја Заустави Избриши преузете фајлове - Желите да очистите историју преузимања или обришете све преузете фајлове\? - Обриши историју преузимања - Не могу да опоравим ово преузимање + Желите ли да очистите историју преузимања или избришете све преузете фајлове\? + Очисти историју преузимања + Није могуће опоравити ово преузимање Веза је истекла - Напредак је изгубљен јер је фајл обрисан - Нема простора на уређају - ЊуПајп је затворен док је радио на фајлу + Напредак је изгубљен, јер је фајл избрисан + Недовољно меморије на уређају + NewPipe је затворен док је радио на фајлу Накнадна обрада није успела Није пронађено Сервер не прихвата преузимања са више нити. Покушајте са @string/msg_threads = 1 Сервер не шаље податке - Не могу да се повежем са сервером - Не могу да пронађем сервер - Не могу да успоставим безбедну везу - Не могу да направим одредишну фасциклу + Није могуће повезати се са сервером + Није могуће пронаћи сервер + Није могуће успоставити безбедну везу + Одредишни фолдер се не може направити Фајл се не може направити Прикажи грешку Преузимање са овим називом чека на ред У току је преузимање са овим називом - не могу да пребришем фајл + није могуће преписати фајл Преузет фајл са овим називом већ постоји Фајл са овим називом већ постоји - Пребриши + Препиши Генериши јединствен назив - Преузимање неуспешно - Систем одбија радњу + Преузимање није успело + Систем је одбио радњу Ред чекања - опоравља се + опорављање накнадна обрада - у реду + у реду чекања паузирано На чекању Завршено - Доступно је ажурирање за ЊуПајп! - аутоматски - мрежа - листа + Доступно је ажурирање за NewPipe! + Аутоматски + Мрежа + Листа Режим приказа листе - никад - само на бежичној - Покрени аутоматски — %s - умањи на искачући плејер - умањи на позадински плејер - ништа - Радња при преласку на другу апликацију са главног видео плејера — %s + Никад + Само на Wi-Fi-у + Покрени репродукцију аутоматски — %s + Умањи на искачући плејер + Умањи на позадински плејер + Ниједно + Радња при преласку на другу апликацију са главног плејера видео снимака — %s Умањи при мењању апликације Прикажи обавештење када постоји нова верзија апликације Ажурирања - Ограничити резолуцију на мобилној мрежи + Ограничење резолуције када се користе мобилни подаци Одбиј - без ограничења + Без ограничења Прихвати - Да бисмо били у складу са Европском општом уредбом о заштити података („GDPR“), скрећемо вам пажњу на политику приватности апликације ЊуПајпа. Пажљиво је прочитајте. + Да бисмо били у складу са Европском општом уредбом о заштити података (GDPR), скрећемо вам пажњу на политику приватности NewPipe-а. Пажљиво је прочитајте. \nМорате је прихватити да бисте нам послали извештај о грешци. Ресетуј Корак @@ -299,107 +296,108 @@ Имајте на уму да ова операција може потрошити доста података. \n \nЖелите ли да наставите\? - вашИД, soundcloud.com/yourid - Увезите СаундКлауд профил тако што ћете откуцати УРЛ или свој ИД: + ВашID, soundcloud.com/yourid + Увезите SoundCloud профил тако што ћете откуцати URL адресу или свој ID: \n -\n1. Омогућите „режим радне површине“ у веб прегледачу (веб локација није доступна за мобилне уређаје) -\n2. Идите на ову УРЛ адресу: %1$s -\n3. Пријавите се када вас питају -\n4. Копирајте УРЛ профила на који сте преусмерени. - Увезите Јутјуб претплате са Гугл тејкаута: +\n1. Омогућите „верзију сајта за рачунар“ у веб-прегледачу (сајт није доступан за мобилне уређаје) +\n2. Идите на ову URL адресу: %1$s +\n3. Пријавите се када се то од вас затражи +\n4. Копирајте URL адресу профила на који сте преусмерени. + Увезите YouTube праћења из Google Takeout-а: \n -\n1. Идите на ову УРЛ адресу: %1$s -\n2. Пријавите се када вас питају -\n3. Кликните на „Сви подаци су укључени“, затим на „Поништи избор свих“, а затим изаберите само „претплате“ и кликните на „У реду“ +\n1. Идите на ову URL адресу: %1$s +\n2. Пријавите се када се то од вас затражи +\n3. Кликните на „Сви подаци укључени“, затим на „Опозови све“, затим изаберите само „праћења“ и кликните на „ У реду“ \n4. Кликните на „Следећи корак“, а затим на „Направи извоз“ -\n5. Кликните на дугме „Преузми“ након што се појави и -\n6. Из преузете зип датотеке за преузимање извадите .json датотеку (обично под „YouTube и YouTube Music/subscriptions/subscriptions.json“) и увезите је овде. - Не могу да извезем претплате - Не могу да увезем претплате +\n5. Кликните на дугме „Преузми“ након што се појави +\n6. Кликните на УВЕЗИ ФАЈЛ испод и изаберите преузети .zip фајл +\n7. [Ако увоз .zip не успе] Извуците .csv фајл (обично под „YouTube and YouTube Music/subscriptions/subscriptions.csv“), кликните на УВЕЗИ ФАЈЛ испод и изаберите извучени csv фајл + Није могуће извести праћења + Није могуће увести праћења Претходни извоз Увези фајл - Увозим… - Извозим… + Увоз… + Извоз… Извоз у Увоз из Увоз Срушите апликацију - Изворни текстови са услуга биће видљиви у ставкама тока + Изворни текстови са услуга биће видљиви у ставкама стрима Прикажи изворно време ставки - Присили пријављивање неиспоручивих „Rx“ изузетака изван делова или активности након одлагања + Присилно извештавање о „Rx“ изузецима који се не могу испоручити ван фрагмента или животног циклуса активности након одлагања Пријави грешке ван животног циклуса Прикажи цурење меморије - Надгледање цурења меморије може изазвати заглављивање апликација при стварању записника - Мења величину и позадину титлова плејера. Захтева поновно покретање да би ступило на снагу + Праћење цурења меморије може довести до тога да апликација престане да реагује када се прикупљају извештаји + Измените размеру натписа титлова плејера и стилове позадине. Захтева рестартовање апликације да би се применило Титлови - Аутоматски направљено - Увеличај + Аутоматски генерисано + Увеличано Попуњено Уклопљено Без титлова - Аутоматски направљено (нема отпремача) - Сличица листе је промењена. - Листа пуштања - Листа је направљена - Да обришем ову листу\? - Обележи листу + Аутоматски генерисано (нема отпремача) + Сличица плејлисте је промењена. + Додато на плејлисту + Плејлиста је направљена + Избрисати ову плејлисту\? + Обележи плејлисту Уклони обележивач - Постави као сличицу листе - Упали звук - Утишај - Додај на листу + Постави као сличицу плејлисте + Укључи звук + Искључи звук + Додај на плејлисту Назив Преименуј - Нова листа - Учитавам тражени садржај - Добављам податке… + Нова плејлиста + Учитавање траженог садржаја + Прикупљање информација… Увек питај - Плејер у искачућем прозору - Плејер у позадини - Видео плејер + Искачући плејер + Позадински плејер + Плејер видео снимака Подразумевана радња при отварању садржаја — %s - Пожељна радња при отварању + Преферирана радња при отварању Затвори фиоку Отвори фиоку Почни пуштање у искачућем прозору Почни пуштање у позадини - Стави у ред - На листи + Стави у ред чекања + Стављено у ред чекања Ред пуштања Конференције Највише свиђања Недавно додато Локално - Језик ће бити промењен након поновног покретања - Не могу да учитам коментаре - Желите да увезете и поставке\? - Ово ће прегазити тренутна подешавања. - Упозорење: не могу да увезем све фајлове. - Није исправан ЗИП фајл + Језик ће бити промењен након рестартовања апликације + Није могуће учитати коментаре + Желите ли да увезете и подешавања\? + Ово ће заменити ваше тренутно подешавање. + Упозорење: Није могуће увести све фајлове. + Нема важећег ZIP фајла Увезено Извезено Још нема обележивача на листи Изаберите листу пуштања Подразумевани киоск - Које картице се налазе на главној страници + Које картице се приказују на главној страници Највише пуштано Последње пуштано - ЊуПајп је бесплатни слободни софтвер. Можете га користити, проучавати и делити по жељи. Конкретно, можете га дистрибуирати и/или мењати под условима ГНУ Опште јавне лиценце коју је објавила Фондација за слободни софтвер, било верзије 3 лиценце, или (по вашој жељи) било које касније верзије. - Прочитајте политику приватности - Пројекат ЊуПајп врло озбиљно схвата вашу приватност. Стога апликација не прикупља никакве податке без вашег пристанка. -\nПолитика приватности ЊуПајпа детаљно објашњава који се подаци шаљу и чувају када пошаљете извештај о паду апликације. - Политика приватности ЊуПајпа - Готово + NewPipe је слободан софтвер за копирање: Можете га користити, проучавати, делити и побољшавати по жељи. Конкретно, можете га поново дистрибуирати и/или модификовати под условима GNU Опште јавне лиценце коју је објавила Фондација за слободни софтвер, било верзију 3 лиценце или (по вашем избору) било коју каснију верзију. + Прочитај политику приватности + Пројекат NewPipe веома озбиљно схвата вашу приватност. Стога, апликација не прикупља никакве податке без вашег пристанка. +\nПолитика приватности NewPipe-а детаљно објашњава који се подаци шаљу и чувају када пошаљете извештај о отказивању апликације. + Политика приватности NewPipe-а + Готово Реши - Притисните „Готово“ кад решите - Обрисана је 1 ставка. + Притисните „Готово“ када решите + Избрисана је 1 ставка. Израчунавање хеша Преименуј Одбаци Направи Нема коментара - ∞ видеа - 100+ видеа + ∞ видео снимака + 100+ видео снимака %s слушалац %s слушаоца @@ -413,44 +411,44 @@ Нико не гледа Број пратилаца није доступан - Мењај услугу, тренутно изабрана: + Изабери услугу, тренутно изабрана: Превуците за преуређивање Опис Коментари - Проверите да ли већ постоји проблем који говори о вашем паду апликације. Када правите дупликате карата, одузимате нам време које бисмо могли потрошити на исправљање стварне грешке. - Пријави на Гитхабу + Проверите да ли већ постоји проблем који говори о вашем отказивању апликације. Када правите дупликате карата, одузимате нам време које бисмо могли потрошити на исправљање стварне грешке. + Пријави на GitHub-у Копирајте форматирани извештај - Дајте дозволу за приказ преко других апликација - Врати подразумеване - Желите да вратите подразумеване вредности\? - Не могу да очитам сачуване картице. Користим подразумеване - Нема тока доступног за преузимање + Дајте дозволу за приказивање преко других апликација + Врати подразумеване вредности + Желите ли да вратите подразумеване вредности\? + Није могуће прочитати сачуване картице, тако да се користе подразумеване + Нема стримова доступних за преузимање Дошло је до грешке: %1$s Фајл не постоји или нема дозволе за читање или писање Назив фајла не може бити празан Нема таквог фајла/извора садржаја - Нема такве фасцикле + Нема таквог фолдера Фајл је премештен или избрисан - Нема видео тока - Нема аудио тока - Спољни плејери не подржавају ове врсте веза - Преузимање на спољну СД картицу није могуће. Ресетовати локацију фасцикле за преузимање\? - Спољно складиште није доступно - Историја претраге је обрисана - Да обришем целу историју претраге\? + Нису пронађени видео стримови + Нису пронађени аудио стримови + Спољни плејери не подржавају ове врсте линкова + Преузимање на спољну, SD (меморијску), картицу није могуће. Ресетовати локацију фолдера за преузимање\? + Спољна меморија није доступна + Историја претраге је избрисана + Избрисати целу историју претраге\? Брише историју кључних речи за претрагу - Обриши историју претраге - Позиције репродукције су обрисане - Обрисати све позиције репродукције\? + Очисти историју претраге + Позиције репродукције су избрисане + Избрисати све позиције репродукције\? Брише све позиције репродукције - Обриши позиције репродукције + Избриши позиције репродукције Историја гледања је избрисана - Обрисати целу историју гледања\? - Брише историју пуштаних токова и позиције репродукције + Избрисати целу историју гледања\? + Брише историју пуштаних стримова и позиције репродукције Очисти историју гледања - Чисти колачиће које ЊуПајп чува када решите „reCAPTCHA“ - Извоз историје, претплата, листи и поставки - Замениће вашу тренутну историју, претплате, листе и (опционо) поставке + Чисти колачиће које NewPipe чува када решите „reCAPTCHA“ + Извоз историје, праћења, плејлисти и подешавања + Замениће вашу тренутну историју, праћења, плејлисте и (опционално) подешавања „reCAPTCHA“ колачићи су очишћени Очисти „reCAPTCHA“ колачиће Извоз базе података @@ -458,9 +456,9 @@ Пребаци на главно Пребаци на искачући прозор Пребаци у позадину - Обавештења о напретку хеширања видео записа - Обавештење о видео хешу - Обавештења о новој верзији ЊуПајпа + Обавештења о напретку хеширања видео снимка + Обавештење о хешу видео снимка + Обавештења о новим верзијама NewPipe-а Обавештење о ажурирању апликације Фајл Фајл избрисан @@ -469,121 +467,121 @@ Песме Догађаји Корисници - Нумере - Видео - Листе пуштања + Снимци + Видео снимци + Плејлисте Канали - Овај видео је старосно ограничен. -\nЗбог нових Јутјуб смерница за такве видео записе, Њупајп не може да им приступи, па није у могућности да их репродукује. - Овај видео је старосно ограничен. + Овај видео снимак је старосно ограничен. +\nЗбог нових YouTube смерница за старосно ограничене видео снимке, NewPipe не може да им приступи, па није у могућности да их пушта. + Овај видео снимак је старосно ограничен. \n -\nУкључите „%1$s“ у поставкама ако желите да га видите. - Јутјуб омогућава „Ограничени режим“ који скрива потенцијални садржај за одрасле - Укључити Јутјубов „Ограничени режим“ - Приказ садржаја који можда није прикладан за децу јер има старосну границу (попут 18+) +\nУкључите „%1$s“ у подешавањима, ако желите да га видите. + YouTube омогућава „Ограничени режим“ који скрива потенцијални садржај за одрасле + Укључи YouTube-ов „Ограничени режим“ + Приказивање садржаја који можда није прикладан за децу, јер има старосну границу (попут 18+) Ажурирања Инстанца већ постоји - Подржане су само HTTPS УРЛ адресе - Не могу да потврдим инстанцу - Унесите УРЛ инстанце + Подржане су само HTTPS URL адресе + Није могуће потврдити инстанцу + Унесите URL адресу инстанце Додајте инстанцу Пронађите инстанце које вам се свиђају на %s - PeerTube инстанца - Изаберите своје омиљене инстанце PeerTube - УРЛ није препознат. Отворити другом апликацијом\? + PeerTube инстанце + Изаберите своје омиљене PeerTube инстанце + URL адреса није препозната. Отворити помоћу друге апликације\? Аутоматско пуштање Очисти податке Прикажите индикаторе положаја репродукције на листама Позиције на листама Вратите последњу позицију репродукције - Наставак репродукције - Самостално заказивање - Наставите да завршавате (не понављајући) ред репродукције додавањем повезаног стрима - Самостално закажи следећи ток + Настави репродукцију + Аутоматско стављање у ред чекања + Наставите да завршавате (непонављајући) ред репродукције додавањем повезаног стрима + Аутоматски стави у ред чекања следећи стрим Кеш метаподатака обрисан - Искључите за сакривање поља мета-података са додатним информацијама о творцу тока, садржају или захтеву за претрагу - Прикажи мета-податке - Искључите за сакривање описа видеа и додатних информација + Искључите да бисте сакрили поља за метаподатке са додатним информацијама о креатору стрима, садржају стрима или захтеву за претрагу + Прикажи метаподатке + Искључите да бисте сакрили опис видео снимка и додатне информације Прикажи опис - Редослед активног плејера биће замењен - Пребацивање на други плејер може променити ваш редослед - Питај за потврду пре пражњења редоследа + Ред активног плејера биће замењен + Пребацивање на други плејер може променити ваш ред чекања + Питај за потврду пре чишћења реда Период премотавања напред/назад - ноћна тема - Андроид ће прилагодити боју обавештења према главној боји на сличици (није доступно на свим уређајима) - Обоји обавештења + Ноћна тема + Android ће прилагодити боју обавештења према главној боји на сличици (није доступно на свим уређајима) + Обоји обавештење Ништа Учитавање Мешање Понављање Можете да изаберете највише три радње за приказ у компактном обавештењу! - Уредите сваку радњу обавештења додиром на њу. Означите до три радње које ће се приказивати у компактном обавештењу помоћу кућица са десне стране + Измените сваку радњу обавештења додиром на њу. Означите до три радње које ће се приказивати у компактном обавештењу помоћу поља за потврду са десне стране Дугме пете радње Дугме четврте радње Дугме треће радње Дугме друге радње Дугме прве радње - мења размеру сличице видеа у обавештењима са 16:9 на 1:1 (може довести до изобличења) - Умањени приказ размере 1:1 - Приказ резултата за: %s + Исеците сличицу видео снимка приказану у обавештењу с размере 16:9 на размеру 1:1 + Исеци сличицу на размеру 1:1 + Приказивање резултата за: %s Отвори помоћу Преузимање је започело - Испод можете одабрати своју омиљену ноћну тему + Испод можете изабрати своју омиљену ноћну тему Изаберите своју омиљену ноћну тему — %s - аутоматски (тема уређаја) + Аутоматски (тема уређаја) Радио Истакнуто - Овај садржај је доступан само корисницима који су платили, тако да га ЊуПајп не може стримовати или преузимати. - Овај видео је доступан само премијум члановима Јутјуб музике, тако да га ЊуПајп не може стримовати или преузимати. - Овај садржај је приватан, тако да га ЊуПајп не може стримовати или преузимати. - Ово је СаундКлауд Го+ нумера, барем у вашој земљи, тако да је ЊуПајп не може стримовати или преузимати. + Овај садржај је доступан само корисницима који су платили, тако да га NewPipe не може стримовати или преузимати. + Овај видео снимак је доступан само премијум YouTube Music члановима, тако да га NewPipe не може стримовати или преузимати. + Овај садржај је приватан, тако да га NewPipe не може стримовати или преузимати. + Ово је SoundCloud Go+ нумера, барем у вашој земљи, тако да је NewPipe не може стримовати или преузимати. Овај садржај није доступан у вашој земљи. - Нема апликације која отвара ово + Ниједна апликација на вашем уређају не може да отвори ово Поглавља Недавни - користи сличицу и за позадину закључаног екрана и за обавештења - Приказ сличице - Страница листе - од %s - Направи %s + Користите сличицу и за позадину закључаног екрана и за обавештења + Прикажи сличицу + Страница плејлисте + Од %s + Направио %s Сличица аватара канала - ЊуПајп још увек не подржава овај садржај. + NewPipe још увек не подржава овај садржај. \n \nНадамо се да ће бити подржан у будућој верзији. - Да ли је учитавање довода преспоро\? Ако је тако, укључите брзо учитавање (промените у поставкама или притиском на дугме испод). + Мислите ли да је учитавање фида превише споро\? Ако јесте, покушајте да омогућите брзо учитавање (можете га променити у подешавањима или притиском на дугме испод). \n -\nЊуПајп нуди два начина учитавања довода: -\n• Преузимање целог претплаћеног канала, што је споро али потпуно. -\n• Коришћење наменске крајње тачке услуге, што је брже али обично није потпуно. +\nNewPipe нуди две стратегије учитавања фида: +\n• Прикупљање целог претплатничког канала, што је споро, али потпуно. +\n• Коришћење наменске крајње тачке услуге, која је брза, али обично није потпуна. \n -\nРазлика је у томе што брзом обично недостају неке информације, попут трајања или врсте (не могу се разликовати живи видео од уобичајених), а можда ће вратити и мање ставки. +\nРазлика између њих је у томе што брзом начину обично недостају неке информације, као што је трајање или врста ставке (не могу да се разликују видео снимци уживо и нормални) и може да врати мање ставки. \n -\nЈутјуб је пример услуге која нуди овај брзи метод својим РСС доводом. +\nYouTube је пример услуге која нуди ову брзу методу са својим RSS фидом. \n -\nДакле, избор се своди на оно шта желите: брзину или прецизне информације. - Искључи брзи режим - Укључи брзи режим - Доступно у неким услугама. Обично је много брже али може вратити мање ставки и често непотпуне информације (нпр. нема трајања, врсте предмета, нема статуса уживо) - Преузми из наменског довода када је доступан - Увек ажурна - Време након којег се претплата сматра застарелом — %s - Праг освежавања довода - Довод - Прикажи само негруписане претплате +\nДакле, избор се своди на оно што ви преферирате: брзину или прецизне информације. + Онемогући брзи режим + Омогући брзи режим + Доступан у неким услугама, обично је много бржи, али може да врати ограничену количину ставки и често непотпуне информације (нпр. нема трајања, врсте ставке, нема статуса уживо) + Прикупи из наменског фида, када је доступан + Увек ажурирај + Време након последњег ажурирања пре него што се праћење сматра застарелом — %s + Праг освежавања фида + Фид + Прикажи само негруписана праћења Нова - Желите да избришете ову групу\? + Желите ли да избришете ову групу\? Празан назив групе - %d одабран - %d одабрана - %d одабраних + %d изабран + %d изабрана + %d изабраних - Нема изабраних претплата - Изабери претплате - Обрађујем довод… - Учитавам довод… + Нема изабраних праћења + Изабрана праћења + Обрађивање фида… + Учитавање фида… Није учитано: %d - Довод освежен: %s + Фид последњи пут ажуриран: %s Групе канала %d дан @@ -606,49 +604,227 @@ %d секунди Прикажи детаље о каналу - Повезани записи - Искључите тунеловање ако имате црн екран или прекиде у репродукцији - Искључи тунеловање медија - Отвори веб страну - интерно - лично - ненаведено - јавно - УРЛ сличице + Повезани видео снимци + Онемогућите тунеловање медија ако искусите црни екран или застајкивање при репродукцији видео снимка. + Онемогући тунеловање медија + Отвори веб-сајт + Унутрашње + Приватно + По позиву + Јавно Домаћин Подршка Језик Старосно ограничење - Доступност + Приватност Лиценца Ознаке Категорија Омогући бирање текста унутар описа Онемогући бирање текста унутар описа - Сада можете изабрати текст унутар описа. Знајте да страна може треперети а везе неће радити док сте у режиму избора. + Сада можете изабрати текст унутар описа. Имајте на уму да страница може треперети и да се на линкове можда неће моћи кликнути док сте у режиму избора. %s даје овај разлог: Налог укинут - Режим брзог довода не даје више информација о овоме. + Режим брзог фида не пружа више информација о овоме. Налог аутора је укинут. -\nЊуПајп убудуће неће моћи да учита овај довод. -\nЖелите ли да прекинете праћење канала\? - Не могу да учитам довод за „%s“. - Грешка учитавања довода - Од Андроида 10 само „Storage Access Framework“ је подржан - Питаће вас где да сачувате свако преузимање - Фасцикла за преузимање није одређена. Изаберите подразумевану фасциклу - искљ - укљ +\nNewPipe убудуће неће моћи да учита овај фид. +\nЖелите ли да прекинете праћење овог канала\? + Није могуће учитати фид за „%s“. + Грешка при учитавању фида + Од Android-а 10 само „Storage Access Framework“ је подржан + Бићете упитани где желите да сачувате свако преузимање + Фолдер за преузимање није одређен, изаберите подразумевани фолдер + Искључи + Укључи Режим таблета - Закажи следеће - Заказано је следеће - Местни предлози претраге + Стави у ред чекања следећи + Стављен у ред чекања следећи + Локални предлози претраге Удаљени предлози претраге Означи као одгледано - Разговори су онемогућени - Обрађујем… Може потрајати пар тренутака - Приказуј указиваче слике - Не покрећи видео у малом прозору, већ пређи одмах у пун приказ заслона, уколико је обртање приказа закључано. И даље можете приступити малом приказу извођача изласком из пуног приказа - Покрени пуни главни приказ извођача - Прекините плејер + Коментари су онемогућени + Обрађивање… Може потрајати пар тренутака + Прикажи индикаторе слике + Не покрећите видео снимке у мини-плејеру, већ директно пређите на режим целог екрана, ако је аутоматска ротација закључана. И даље можете приступити мини-плејеру тако што ћете изаћи из целог екрана + Покрени главни плејер преко целог екрана + Срушите плејер + + %s преузимање је завршено + %s преузимања су завршена + %s преузимања је завршено + + %1$s %2$s + Обавештења о новим стримовима + Обавештења + Погледај на веб-сајту + Ако имате проблема са коришћењем апликације, обавезно погледајте ове одговоре на честа питања! + Дупликат је додат %d пут(а) + Потребна мрежна веза + Потпуно одгледано + Делимично одгледано + Превуците ставке да бисте их уклонили + Низак квалитет (мањи) + Поништи трајну сличицу + Било која мрежа + Ручно проверите постоје ли нове верзије + Спољни плејери не подржавају изабрани стрим + Померите главни бирач картице на дно + Положај главних картица + Дошло је до грешке, погледајте обавештење + NewPipe је наишао на грешку, додирните да бисте пријавили + Прикажи траку са грешком + Учесталост провере + Картица + Уклонити дупликате\? + Желите ли да уклоните све дупликате стримова на овој плејлисти\? + Предстојеће + Подешавања ExoPlayer-а + Увек користи заобилазно решење ExoPlayer-а за подешавање површине излаза видео снимка + Изабери квалитет за спољне плејере + Нема стримова + Нема стримова уживо + + %s нови стрим + %s нова стрима + %s нових стримова + + Учитавање детаља стрима… + Прикажи „Сруши плејер“ + Покрени проверу нових стримова + Тунеловање медија је подразумевано онемогућено на вашем уређају, јер је познато да ваш уређај то не подржава. + Полутон + Обавештавање о новим стримовима из праћења + Провера ажурирања… + Избрисати све преузете фајлове са диска\? + Уклони дупликате + Прикачен коментар + ExoPlayer подразумевано + Изабери све + Не приказују се стримови које програм за преузимање још увек не подржава + Аудио снимак би већ требало да буде присутан у овом стриму + Нема доступних аудио стримова за спољне плејере + Нема доступних видео стримова за спољне плејере + Непознати формат + Непознати квалитет + Непознато + Висок квалитет (већи) + Величина интервала учитавања репродукције + Обавештење о извештају о грешци + Нове ставке фида + Игнориши догађаје хардверског дугмета за медије + Плејлисте које су затамњене већ садрже ову ставку. + LeakCanary није доступан + Додирните да бисте преузели %s + Провери ажурирања + Преглед сличице траке за претрагу + Прикажи следеће стримове + Прикажи/сакриј стримове + Користи резервну функцију декодера ExoPlayer-а + оригинални + Промените величину интервала учитавања на прогресивним садржајима (тренутно %s). Нижа вредност може убрзати њихово почетно учитавање + Корисно, на пример, ако користите слушалице са поквареним физичким дугмадима + Изаберите покрет за леву половину екрана плејера + Радња покретом улево + Изаберите покрет за десну половину екрана плејера + Обавештење плејера + Обавештења о новим стримовима за праћења + Конфигуришите обавештење о тренутно репродукованом стриму + Изаберите оригинални аудио снимак, без обзира на језик + Изаберите аудио снимак са описима за особе са оштећеним видом, ако је доступан + Преферирај описни аудио снимак + Радња покретом удесно + Осветљеност + Јачина звука + Ниједно + Нови стримови + Обавештења за пријаву грешака + Увезите или извезите праћења из менија са 3 тачке + Аудио снимак + Прикажите Picasso обојене траке на врху слика које указују на њихов извор: црвена за мрежу, плава за диск и зелена за меморију + Направите обавештење о грешци + Проценат + Користите најновију верзију NewPipe-а + Не приказуј + Није пронађен одговарајући менаџер фајлова за ову радњу. +\nИнсталирајте менаџер фајлова или покушајте да онемогућите „%s“ у подешавањима преузимања + Често постављана питања + Приказује опцију рушења, када користите плејер + + Избрисано је %1$s преузимање + Избрисано је %1$s преузимања + Избрисано је %1$s преузимања + + Није пронађен одговарајући менаџер фајлова за ову радњу. +\nИнсталирајте менаџер фајлова компатибилан са Storage Access Framework-ом + Срце од стране креатора + Обавештења су онемогућена + Добијајте обавештења + Омогућите ову опцију ако имате проблема са иницијализацијом декодера, која се враћа на декодере нижег приоритета, ако иницијализација примарних декодера не успе. Ово може резултирати лошијим перформансама репродукције него када користите примарне декодере + Ова опција је доступна само ако је %s изабрано за тему + описни + синхронизовани + Управљајте неким подешавањима ExoPlayer-а. Ове промене захтевају рестартовање плејера да би се примениле + Преферирај оригинални аудио снимак + Ово заобилазно решење ослобађа и поново инстанцира кодеке видео снимка када дође до промене површине, уместо да се површина директно поставља на кодек. ExoPlayer већ користи ово на неким уређајима са овим проблемом, ово подешавање утиче само на Android 6 и новије верзије. +\n +\nОмогућавање ове опције може спречити грешке при репродукцији приликом пребацивања тренутног плејера видео снимака или преласка на цео екран + Аудио снимак: %s + Брзи режим + , + Копирање у привремену меморију није успело + Сортирање + Сада пратите овај канал + Изабери аудио снимак за спољне плејере + Пратиоци + Учитавање метаподатака… + Прикупи картице канала + Картице за прикупљање приликом ажурирања фида. Ова опција нема ефекта ако се канал ажурира у брзом режиму. + Видео снимци + Које картице се приказују на страницама канала + Картице канала + Shorts + Информације + Албуми + Плејлисте + Снимци + Канали + Уживо + Квалитет слике + \? + Укључи оријентацију екрана + Низак квалитет + Укључи цео екран + Аватари + Следећи стрим + Аватари потканала + Отвори ред чекања за пуштање + Не учитавај слике + Висок квалитет + Унапред + Премотавање + Поново пусти + Средњи квалитет + Аватари отпремаоца + Банери + Изаберите квалитет слика и да ли ћете уопште учитавати слике да бисте смањили потрошњу података и меморије. Промене бришу кеш слике у меморији и на диску — %s + Пусти + Више опција + Сличице + Трајање + Претходни стрим + Дели листу URL адреса + Дели са насловима + %1$s +\n%2$s + Дели плејлисту + Делите плејлисту са детаљима, као што су назив плејлисте и наслови видео снимака или као једноставна листа URL адреса видео снимака + -%1$s: %2$s + + %s одговор + %s одговора + %s одговора + + Прикажи више + Прикажи мање + Измените сваку радњу обавештења у наставку тако што ћете је додирнути. Прве три радње (пусти/паузирај, претходни и следећи) поставља систем и не могу се прилагодити. \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 01b503d3f..be8e2894c 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -34,12 +34,12 @@ Visa ett alternativ för att spela upp en video med mediacentret Kodi Ljud Standardformat för ljud - Videoformat som föredras + Standardformat för video Tema Ljust Mörkt Svart - Kom ihåg popup inställningar + Kom ihåg popupinställningar Kom ihåg popup-rutans senaste storlek och position Sökförslag Välj förslag att visa i samband med sökning @@ -100,7 +100,6 @@ NewPipe avisering Aviseringar för NewPipes spelare [Okänd] - Kunde inte dekryptera video URL signatur Misslyckades med att spela denna ström Allvarligt spelarfel inträffade Återhämtar sig från spelarfel @@ -193,8 +192,6 @@ Bokmärkta Spellistor Lägg till i Använd snabb icke-exakt sökning - Läs in miniatyrbilder - Stäng av för att förhindra att miniatyrbilder läses in, vilket sparar data- och minnesanvändning. Ändringarna rensar både bildcacheminnet i minnet och på disken Cacheminnet för bilder rensat Debug Alltid @@ -206,7 +203,7 @@ Inexakt sökning gör det möjligt att söka snabbare med mindre precision. Att hoppa 5, 15 eller 25 sekunder fungerar inte med detta val Ta bort alla cachade webbsidor Metadata cache rensad - Köa nästa ström automatiskt + Köa nästa strömning automatiskt Fortsätt avsluta (icke-upprepande) uppspelningskö genom att lägga till en relaterad ström Standard innehållsland Kanaler @@ -229,14 +226,14 @@ Ta bort hela sökhistoriken\? Sökhistorik borttagen Externa spelare stöder inte dessa typer av länkar - Inga videoströmmar hittades + Inga videoströmningar hittades Inga ljudspår hittades Ingen sådan mapp Ingen sådan fil/innehållskälla Filen finns inte eller behörighet att läsa eller skriva till den saknas Filnamnet får inte vara tomt Ett fel uppstod: %1$s - Inga strömmar tillgängliga för hämtning + Inga strömningar tillgängliga för hämtning Dra för att ändra ordning Skapa Avfärda @@ -437,7 +434,7 @@ Mest gillade Nyligen tillagd Lokala - Klar + Klar Slå på YouTubes \"Begränsat läge\" Språket ändras när appen startas om Det gick inte att läsa in kommentarerna @@ -506,7 +503,7 @@ Kan inte återställa den här hämtningen Anslutnings avbrott Framsteg förlorat, för att filen blev borttagen - Inget utrymme kvar på enhet + Inget utrymme kvar på enhet NewPipe stängdes under arbete med en fil Vänligen kontrollera om en felrapport som tar upp din krasch redan finns. Att skapa ärenden när en felrapport redan finns, tar av den tid som vi annars kunde ha ägnat åt att fixa den faktiska buggen. Rapportera på GitHub @@ -570,7 +567,7 @@ Inaktivera för att dölja videobeskrivning och ytterligare information Visa meta-information Använd miniatyrbild som bakgrund till både låsskärm och aviseringar - Redigera varje aviseringsåtgärd nedan genom att trycka på den. Välj upp till tre av dem som ska visas i den kompakta aviseringen genom att använda kryssrutorna till höger + Redigera varje aviseringsåtgärd nedan genom att trycka på den. Välj upp till tre av dem som ska visas i den kompakta aviseringen genom att använda kryssrutorna till höger. Låt Android färglägga varje avisering individuellt utifrån miniatyrbildens huvudsakliga färg (notera att detta inte är tillgängligt på alla enheter) Färglägg avisering Du kan som mest välja tre åtgärder att visa i den kompakta aviseringen! @@ -617,7 +614,7 @@ Beskrivning Kommentarer Denna video här en åldersgräns. -\nPå grund av nya YouTube-regler med åldersgräns för vissa videor kan NewPipe inte komma åt någon av dess videoströmmar och kan därmed inte spela upp den. +\nPå grund av nya YouTube-regler med åldersgräns för vissa videor kan NewPipe inte komma åt någon av dess videoströmningar och kan därmed inte spela upp den. Visa innehåll som pga sin åldersgräns (ex 18+) kan vara olämpligt för barn Visa beskrivning Öppna med @@ -630,7 +627,6 @@ Aktuellt Natt-tema Aviseringar för videohashningsframsteg - Miniatyrbild-webbadress Inaktivera medietunnel om du upplever en svart skärm eller att videouppspelningen hackar. Inaktivera medietunnel Hjärtmärkt av innehållsskaparen @@ -684,29 +680,29 @@ Aviseringar är avstängda Bli meddelad Du har nu prenumenerat till denna kanalen - Aviseringar om nya strömmar för prenumerationer + Aviseringar om nya strömningar för prenumerationer - %s Ny ström - %s Nya strömmar + %s Ny strömning + strömningar%s Nya strömningar Konfigurera meddelande om aktuell ström som spelas upp - Kör leta efter nya strömmar - Meddela om nya strömmar från prenumerationer + Kör leta efter nya strömningar + Meddela om nya strömningar från prenumerationer Aviseringar - Nya strömmar + Nya strömningar Laddar strömdetaljer… - Aviseringar om nya strömmar + Aviseringar om nya strömningar , Spelaravisering Växla alla Procent Halvton - Inga videoströmmar tillgängliga för externa spelare + Inga videoströmningar tillgängliga för externa spelare Okänd kvalitet - Inga ljudströmmar tillgängliga för externa spelare + Inga ljudströmningar tillgängliga för externa spelare Okänt format - Videoströmmar som ännu inte stöds av nedladdaren visas inte - Inläsningsintervalls storlek + Videoströmningar som ännu inte stöds av nedladdaren visas inte + Inläsningsintervallsstorlek Välj kvalitet för externa spelare Den valda videoströmmen stöds inte av externa spelare Om du har problem med att använda appen, kolla in dessa svar på vanligt ställda frågor! @@ -724,22 +720,22 @@ Dubblett tillagd %d gång(er) Spellistor som är gråmarkerade innehåller redan det här objektet. Användbart om du till exempel använder ett headset med trasiga fysiska knappar - Ignorera hårdvarans media knappar + Ignorera hårdvarans mediaknappar Ta bort dubbletter\? - Visa följande strömmar + Visa följande strömningar Delvis sedd - Vill du ta bort alla duplicerade strömmar i den här spellistan\? + Vill du ta bort alla duplicerade strömningar i den här spellistan\? Ta bort dubbletter - Visa/Dölj strömmar + Visa/Dölj strömningar Fullständigt sedd Kommande Volym Ingen Välj en gest för den vänstra halvan av spelarskärmen Ljusstyrka - Vänster gest åtgärd + Vänstergest åtgärd Välj en gest för den högra halvan av spelarskärmen - Höger gest åtgärd + Högergest åtgärd Ljud: %s Ljudspår Ett ljudspår bör redan finnas i denna ström @@ -763,7 +759,58 @@ dubbad Flytta huvudflik väljaren till botten Huvudflikarnas position - Inga strömmar - Inga live-strömmar + Inga strömningar + Inga live-strömningar Medietunnel har inaktiverats som standard på din enhet eftersom att enhetsmodellen inte stöder funktionen. + Bildkvalité + Videor + Prenumeranter + Vilka filkar visas på kanalsidorna + Dela URL-lista + Kanalflikar + Shorts + Laddar Metadata… + Aktivera skärmorientering + Låg kvalité + Aktivera helskärm + Hämta kanalflikar + Nästa strömning + Öppna spelkö + Ladda inte bilder + Hög kvalité + Om + Dela spellista + Spola frammåt + Album + Spola tillbaka + Återspela + Medelkvalité + Spellistor + Spela + Fler alternativ + Miniatyrbilder + Spår + Längd + Kanaler + Föregående strömning + Live + \? + Dela med Titlar + %1$s +\n%2$s + Visningsbilder + Underkanalens visningsbilder + Flikar att hämta när flödet uppdateras. Det här alternativet har ingen effekt om en kanal uppdateras i snabbt läge. + Uppladdarens visningsbilder + Banderoller + - %1$s: %2$s + Dela spellistan med detaljer så som spellistans namn och video-titlarna eller som en enkel lista med URL till videorna + Välj bildkvalitet och om bilder överhuvudtaget ska laddas för att minska data och minnesanvändningen. Ändringar rensar både i minnet och bildcache på disk – %s + Visa mer + + %s svar + %s svar + + Visa mindre + Redigera varje aviseringsåtgärd nedan genom att trycka på den. De tre första åtgärderna (spela/pausa, föregående och nästa) är satta av systemet och kan inte ändras. \ No newline at end of file diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 0a4f30670..73cc5a3da 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -50,7 +50,6 @@ கருமை திரைமேல் பண்புகளை நினைவுகொள் திரைமேல் நிலையின் கடைசி அளவையும் இடத்தையும் நினைவுகொள் - சிறுபடத்தைக் இறக்கு பட பதுக்ககம் அழிக்கப்பட்டது மேல்நிலைத்தரவின் பதுக்ககம் அழிக்கப்பட்டது பதுக்ககப்படுத்திய வலைப்பக்கத் தரவை நீக்கு @@ -146,8 +145,8 @@ %s பார்வைகள் - காணொளிகள் - காணொளிகள் + %sகாணொளிகள் + %sகாணொளிகள் முதற்பக்கத்துக்கு மாற்று எந்த காணொலியும் இல்லை @@ -264,7 +263,6 @@ ப.ல இயக்கியைச் சிதை - சிறுபடங்களேற்றுவதை தவிர்த்து தரவு மற்றும் நினைவகப் பயன்பாட்டைச் சேமிக்க அணை. மாற்றங்கள் நினைவகத்துள் மற்றும் வட்டின்மீதுள்ள பிடிதரவைத் துடைக்கும் பட்டியல்களில் இயக்கக குறியட நிலைகாட்டிகளைக் காட்டு துணையியக்கியில் காணொளிகளை துவக்காதே, ஆனால் தானாக சுழற்றல் பூட்டப்பட்டிருந்தால் நேரடியாக முழுதிரைக்குத் திரும்பு. முழுதிரையை வெளியேறி நீங்கள் இன்னும் துணையியக்கியை அணுகலாம் உரலியை அங்கீகரக்க முடியவில்லை. மற்றொரு செயலியில் திறக்கவா\? @@ -364,7 +362,6 @@ அறிவிப்புகள் வீடியோ ஹாஷ் அறிவிப்பு புதிய நீரோடைகள் - வீடியோ URL கையொப்பத்தை நீக்க முடியவில்லை வீடியோ ஹேஷிங் முன்னேற்றத்திற்கான அறிவிப்புகள் சந்தாவுக்கான புதிய ஸ்ட்ரீம்கள் பற்றிய அறிவிப்புகள் இந்த வீடியோ வயது வரம்புக்குட்பட்டது. diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 2351be263..b2846823c 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -146,7 +146,7 @@ పూర్తి స్క్రీన్‌లో ప్రధాన ప్లేయర్‌ని ప్రారంభించండి డీబగ్ చేయండి ఏమిలేదు - నోటిఫికేషన్‌లో చూపబడిన వీడియో థంబ్‌నెయిల్‌ను 16:9 నుండి 1:1 కారక నిష్పత్తికి స్కేల్ చేయండి (వక్రీకరణలను ప్రవేశపెట్టవచ్చు) + నోటిఫికేషన్‌లో చూపబడిన వీడియో థంబ్‌నెయిల్‌ను 16:9 నుండి 1:1 కారక నిష్పత్తికి మార్చుము పునరావృతం చేయండి వీడియో \"వివరాలు:\"లో బ్యాక్‌గ్రౌండ్ లేదా పాప్‌అప్ బటన్‌ను నొక్కినప్పుడు చిట్కాను చూపు URLని గుర్తించడం సాధ్యపడలేదు. మరొక యాప్‌తో తెరవాలా\? @@ -165,13 +165,11 @@ అధిక స్పష్టతను చూపుము నలుపు పాప్అప్ లక్షణాలను గుర్తుంచుకో - సూక్ష్మచిత్రాలను లోడ్ చేయండి వ్యాఖ్యలను చూపించు వ్యాఖ్యలను దాచడాన్ని ఆఫ్ చేయండి %sలో మీకు నచ్చిన సందర్భాలను కనుగొనండి పీర్‌ట్యూబ్ ఉదాహరణలు మూడవ చర్య బటన్ - థంబ్‌నెయిల్‌లను లోడ్ చేయడం, డేటాను సేవ్ చేయడం మరియు మెమరీ వినియోగాన్ని నిరోధించడానికి ఆఫ్ చేయండి. మార్పులు ఇన్-మెమరీ మరియు ఆన్-డిస్క్ ఇమేజ్ కాష్ రెండింటినీ క్లియర్ చేస్తాయి ఖచ్చితమైన శోధన తగ్గిన ఖచ్చితత్వంతో వేగంగా స్థానాలను పొందేందుకు ఆటగాడిని అనుమతిస్తుంది. 5, 15 లేదా 25 సెకన్ల పాటు కోరడం దీనితో పని చేయదు వేగవంతమైన ఖచ్చితమైన శోధనను ఉపయోగించండి జోడించండి @@ -179,7 +177,7 @@ ట్యాబ్‌ని ఎంచుకోండి సభ్యత్వాన్ని తొలగించుము సమాచారాన్ని చూపుము - సూక్ష్మచిత్రాన్ని 1:1 కారక నిష్పత్తికి స్కేల్ చేయండి + సూక్ష్మచిత్రాన్ని 1:1 కారక నిష్పత్తికి మార్చుము ఒక ప్లేయర్ నుండి మరొక ప్లేయర్‌కు మారడం వలన మీ క్యూను భర్తీ చేయవచ్చు సంబంధిత స్ట్రీమ్‌ను జోడించడం ద్వారా (పునరావృతం కాని) ప్లేబ్యాక్ క్యూను ముగించడాన్ని కొనసాగించండి దిగువన ఉన్న ప్రతి నోటిఫికేషన్ చర్యను దానిపై నొక్కడం ద్వారా సవరించండి. కుడివైపు ఉన్న చెక్‌బాక్స్‌లను ఉపయోగించడం ద్వారా కాంపాక్ట్ నోటిఫికేషన్‌లో చూపబడే వాటిలో మూడు వరకు ఎంచుకోండి @@ -203,7 +201,7 @@ షఫుల్ చేయండి బఫరింగ్ డిఫాల్ట్ వీడియో ఫార్మాట్ - రాత్రి థీమ్ + చీకటి థీమ్ చీకటి ఫాస్ట్-ఫార్వర్డ్/-రివైండ్ సీక్ వ్యవధి క్యూను క్లియర్ చేయడానికి ముందు నిర్ధారణ కోసం అడగండి @@ -265,7 +263,6 @@ ప్లేబ్యాక్ స్థానాలు తొలగించబడ్డాయి బాహ్య ప్లేయర్‌లు ఈ రకమైన లింక్‌లకు మద్దతు ఇవ్వవు చెక్సమ్ - వీడియో URL సంతకాన్ని డీఓబ్‌ఫస్కేట్ చేయడం సాధ్యపడలేదు GitHubపై నివేదించు ఇక్కడ క్రికెట్‌లు తప్ప మరేమీ లేదు ఎవరూ వినడం లేదు @@ -348,7 +345,7 @@ 1 అంశం తొలగించబడింది. పరిష్కరించబడినప్పుడు \"పూర్తయింది\" నొక్కండి పరిష్కరించండి - పూర్తి + పూర్తి చాలా ప్రత్యేక పాత్రలు ఆండ్రాయిడ్‌లో లిబ్రే తేలికపాటి స్ట్రీమింగ్. వాలంటీర్లు తమ ఖాళీ సమయాన్ని వెచ్చిస్తూ మీకు ఉత్తమ వినియోగదారు అనుభవాన్ని అందించడం ద్వారా NewPipe అభివృద్ధి చేయబడింది. డెవలపర్‌లు ఒక కప్పు కాఫీని ఆస్వాదిస్తున్నప్పుడు న్యూపైప్‌ని మరింత మెరుగ్గా చేయడంలో సహాయపడటానికి తిరిగి ఇవ్వండి. @@ -465,4 +462,11 @@ ఆగిపోయింది క్రమం %sని డౌన్‌లోడ్ చేయడానికి నొక్కండి + దిగువన ఉన్న ప్రతి నోటిఫికేషన్ చర్యను దానిపై నొక్కడం ద్వారా సవరించండి. మొదటి మూడు చర్యలు (ప్లే/పాజ్, మునుపటి మరియు తదుపరి) సిస్టమ్ ద్వారా సెట్ చేయబడ్డాయి మరియు అనుకూలీకరించబడవు. + భాషతో సంబంధం లేకుండా అసలు ఆడియో ట్రాక్‌ని ఎంచుకోండి + వివరణాత్మక ఆడియోకు ప్రాధాన్యత ఇవ్వండి + ఉదాహరణకు, మీరు విరిగిన భౌతిక బటన్‌లతో హెడ్‌సెట్‌ని ఉపయోగిస్తుంటే ఉపయోగకరంగా ఉంటుంది + ప్రగతిశీల విషయాలపై లోడ్ విరామం పరిమాణాన్ని మార్చండి (ప్రస్తుతం %s). తక్కువ విలువ వాటి ప్రారంభ లోడింగ్‌ను వేగవంతం చేయవచ్చు + హార్డ్‌వేర్ మీడియా బటన్ ఈవెంట్‌లను విస్మరించండి + అసలు శ్రావ్యయానికి ప్రాధాన్యత ఇవ్వండి \ No newline at end of file diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 2b31bb988..f54c55eae 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -33,10 +33,10 @@ เพิ่มไปยัง เส้นทางการดาวน์โหลดวิดีโอ เส้นทางในการจัดเก็บวิดีโอที่ดาวน์โหลดมา - ป้อนเส้นทางการดาวน์โหลดสำหรับวิดีโอ + เลือกเส้นทางการดาวน์โหลดสำหรับไฟล์วิดีโอ โฟลเดอร์ที่ดาวน์โหลดเสียง - เสียงที่ดาวน์โหลดจะถูกเก็บไว้ที่นี่ - ป้อนเส้นทางการดาวน์โหลดสำหรับไฟล์เสียง + ไฟล์เสียงที่ดาวน์โหลดไว้จะถูกเก็บไว้ที่นี่ + เลือกเส้นทางการดาวน์โหลดสำหรับไฟล์เสียง ความละเอียดเริ่มต้น ความละเอียดเริ่มต้นในโหมดป๊อปอัพ แสดงความละเอียดที่สูงขึ้น @@ -56,10 +56,8 @@ จำขนาดและตำแหน่งสุดท้ายของป๊อปอัพ ใช้การข้ามที่ไม่แม่นยำ การข้ามช่วงที่ไม่แม่นยำจะทำให้เลื่อนไปยังตำแหน่งเวลาที่ต้องการได้เร็วขึ้น แต่จะลดความแม่นยำในการลากตำแหน่งลง - โหลดภาพขนาดย่อ แสดงความคิดเห็น ปิดใช้งานเพื่อซ่อนความคิดเห็น - ปิดเพื่อป้องกันการโหลดรูปขนาดย่อ ลดการใช้ข้อมูลและหน่วยความจำ การเปลี่ยนแปลงล้างแคชภาพในหน่วยความจำและบนดิสก์ ล้างแคชของรูปภาพแล้ว ลบข้อมูลเว็บเพจที่แคชไว้ทั้งหมด คิววีดีโอถัดไปโดยอัตโนมัติ @@ -133,7 +131,6 @@ การดาวน์โหลดไปยังการ์ดความจำภายนอกยังไม่สามารถทำได้ รีเซ็ตตำแหน่งโฟลเดอร์ดาวน์โหลดหรือไม่\? ข้อผิดพลาดของเครือข่าย ไม่สามารถโหลดรูปขนาดย่อทั้งหมด - ไม่สามารถถอดรหัสลายเซ็น URL ของวิดีโอ ไม่สามารถแยกวิเคราะห์เว็บไซต์ เนื้อหาไม่พร้อมใช้งาน ไม่สามารถตั้งค่าเมนูดาวน์โหลด diff --git a/app/src/main/res/values-ti/strings.xml b/app/src/main/res/values-ti/strings.xml index dcd5df884..7845242c2 100644 --- a/app/src/main/res/values-ti/strings.xml +++ b/app/src/main/res/values-ti/strings.xml @@ -1,19 +1,70 @@ ሰረዝ - ኣብ ብሮውዘር ክፉት - ውጽኢት ምርኣዩ ን፦%s + ኣብ መርበብ-ሓበሬታ ክፉት + ውጽኢት ምርኣዩ ን፦ %s መጀመርታ ምእንቲ ኽትጅምር ነቲ ዜጕልሕ መረጼን ጠውቆ። ኣብ %1$s እተሓትመ - ዋላ ሓደ ወሓይዝ ዚጻወት ሰብ ኣይተረኽበን። VLC + ወሓይዝ ዚጻወት ኣይተረኽበን። VLC፧ ሐራይ - ምድላው + ቅጥዕታት \"%1$s\" ማለቱ ድዩ፧ ዚተሪየ ጋባራ ክፉቴ ምሲ ፋይል ውሕጅ ኣራግፍ ድለ - ኣካፍሎም + ኣካፍሎ ኣራግፍ ኣካፍሎም ምሲ + መስመር ኣይትጽንበሩ + ኣብ ሓፍ፡ሓፍ ቅዲ ክፉት + ሰዓብካ\'ኪ + ክቕይር ኣይከኣለን ምዝገብ + ድምጺታት ኣብ ገለ ርዝነት የወግድ + ወሓይዝ ዚጻወት ኣይተረኽበን። (ንኽትጻወቶ VLC ከተውራድ ትኽእል)። + ክሕደስ ኣይከኣለን ምዝገባ + ሰዓበ + ናይ ደገ ቪድዮ ተጠቐም መጻወቲ + ምውራድ + ኣይትጽንበሩ + ነቲ ኣብ\'ቲ ምልክታ ዝተርኣየ ናይ ቪድዮ ምስሊ ካብ 16:9 ናብ 1:1 ርሕቐት ኣቀራርባ ቅረጽ + ምስ Kodi ተጻወት + ድምር ምስ + ሓበሬታ ኣርእዩ + መፍለጢ ሕብሪ ልኸ + \"Play with Kodi\" ኣማራጺ + ዝያዳ ድንቀት ኣርኢ + ንተንቃሳቀሴ-ምስሌ ፋይላት ዝኸውን ናይ ምውራድ ማህደር ምረጽ + ተጻዋታይ ወደቀ + ድምጺ + ድምጺ ምውራድ ማህደር ፋይላት ኣብዚ ይኽዘኑ + ዋላ-ሓንቲ + ገለ መሳርሒታት ጥራይ እዮም 2K/4K ተንቃሳቀሴ-ምስሌ ክጻወቱ ዝኽእሉ + ናይ ደገ ድምጺ መጻወቲ ተጠቐም + Android ሕብሪ ናይቲ መተሓሳሰቢ ብመሰረት እቲ ኣብቲ ንእሽቶ ስእሊ ዘሎ ቀንዲ ሕብሪ ከም ዝጥዕሞ ግበር (እዚ ኣብ ኩሉ መሳርሒታት ከምዘይርከብ ኣስተውዕል) + ትሑዝ ፖፕኣፕ ድንቀት + ነፍሲ ወከፍ መፍለጢ ተግባር ኣብ ታሕቲ ብምጥዋቕ ኣርትዖ። ኣብቲ ውህሉል መተሓሳሰቢ ንኽርአ ክሳብ ሰለስተ ካብኣቶም ምረጽ፡ ኣብ የማናይ ሸነኽ ዘሎ ሳጹናት ብምጥቃም + ፖፕኣፕ + ትሑዝ ድንቀት + ዝወረዱ ናይ ተንቃሳቀሴ-ምስሌ ፋይላት ኣብዚ ይኽዘኑ + + ናይ እኽሊ ምስሊ ምስ ናይ 1:1 ርክባት + ቀዳማይ ወሰን ተጠዋቃ + ደገመ + ድምጺ ምውራድ ማህደር + ቦኦክማርከድ ዝርዝር-ጸወታ + ናይ ድምጺ ፋይል ኣራግፍ ምረጽ + ዝጎደለ ኮረ ኣፕፕ ኣውራድ፧ + ነባሪ ቅርጺ ድምጺ + ምዝገባ + Kodi ሚድያ ማእኸል ቪድዮ ንምጽዋት ዝሕግዝ ኣማራጺ + ኣብቲ ውሱን መፍለጢ ንምርኣይ እንተበዝሐ ሰለስተ ተግባራት ክትመርጽ ትኽእል ኢኻ! + ተንቃሳቀሴ-ምስሌ ፋይል ኣራግፍ + ታብ ምረጽ + ድሕረ ባይታ + ብርሃን + ጸልማት + ካልኣይ ስጉምቲ መጠወቒ + ሳልሳይ ስጉምቲ መጠወቒ + ሓሙሻይ ስጉምቲ መጠወቒ \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 2400a8bd5..dfac4fb47 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -2,7 +2,7 @@ Başlamak için büyütece dokunun. %1$s tarihinde yayınlandı - Akış oynatıcısı bulunamadı. VLC kurulsun mu\? + Video oynatıcısı bulunamadı. VLC kurulsun mu? Kur İptal Tarayıcıda aç @@ -20,12 +20,12 @@ Ses indirme klasörü İndirilen ses dosyaları burada depolanır Ses dosyaları için indirme klasörünü seç - Öntanımlı çözünürlük + Varsayılan çözünürlük Kodi ile oynat Eksik Kore uygulaması yüklensin mi\? \"Kodi ile oynat\" seçeneğini göster Kodi ortam merkezi üzerinden video oynatmak için bir seçenek göster - Öntanımlı ses biçimi + Varsayılan ses biçimi Tema Koyu Açık @@ -46,7 +46,6 @@ Hata Ağ hatası Küçük resimlerin tamamı yüklenemedi - Video URL imzasının şifresi çözülemedi Web sitesi ayrıştırılamadı İçerik kullanılamıyor Uygulama/kullanıcı arayüzü çöktü @@ -58,7 +57,7 @@ Ne oldu: Ne:\\nİstek:\\nİçerik Dili:\\nİçerik Ülkesi:\\nUygulama Dili:\\nHizmet:\\nGMT Zamanı:\\nPaket:\\nSürüm:\\nİşletim sistemi sürümü: Videoyu oynat, süre: - Yükleyicinin avatar küçük resmi + Yükleyenin avatar küçük resmi Beğeni Beğenmeme Video @@ -78,11 +77,11 @@ Panoya kopyalandı Lütfen daha sonra ayarlardan uygun indirme klasörü belirleyin İndirme menüsü ayarlanamadı - Açılır pencere kipinde aç - Öntanımlı açılır pencere çözünürlüğü + Açılır pencere modunda aç + Varsayılan açılır pencere çözünürlüğü Yüksek çözünürlükleri göster Yalnızca bazı aygıtlar 2K/4K videoları oynatabilir - Öntanımlı video biçimi + Varsayılan video biçimi Siyah Açılır pencere kipinde oynatılıyor Tümü @@ -103,7 +102,7 @@ Açılan pencerenin son boyutunu ve konumunu hatırla Bazı çözünürlüklerde sesi kaldırır Arama önerileri - Ararken gösterilecek önerileri seç + Arama yaparken öneriler gösterilsin mi En iyi çözünürlük NewPipe Hakkında Üçüncü Taraf Lisansları @@ -191,7 +190,7 @@ Ana Görünüme Geç Çekmeceyi Aç Çekmeceyi Kapat - Akış oynatıcı bulunamadı (Oynatmak için VLC kurabilirsiniz). + Video oynatıcı bulunamadı (Oynatmak için VLC kurabilirsiniz). Her Zaman Yalnızca Bir Kez Dış oynatıcılar bu tür bağlantıları desteklemez @@ -213,11 +212,11 @@ Bu, var olan kurulumunuzu geçersiz kılacaktır. Akış dosyasını indir Bilgi göster - İmlenen Oynatma Listeleri + İmlenen Çalma Listeleri Ekle Yeniden düzenlemek için sürükleyin Oluştur - Reddet + Dışla Yeniden adlandır Son Oynatılan En Çok Oynatılan @@ -238,13 +237,13 @@ Doldur Yakınlaştır Hata ayıklama - Otomatik oluşturulan + Kendiliğinden oluşturulan Bellek sızıntısı izleme, yığın boşaltımı sırasında uygulamanın yanıtlamamasına neden olabilir Yaşam döngüsü dışı hatalarını bildir Parçanın dışında veya atımdan sonraki etkinlik yaşam döngüsündeki teslim edilemeyen Rx beklentilerinin bildirimini zorla Hızlı isabetsiz konumlama kullan İsabetsiz konumlama, oynatıcının daha düşük hassasiyetle daha hızlı konumlamasını sağlar. 5, 15 veya 25 saniyeye konumlama bununla birlikte çalışmamaktadır - Sonraki akışı otomatik kuyruğa ekle + Sonraki videoyu kuyruğa otomatik ekle İlgili bir akış ekleyerek sonlanacak (yinelemeyen) oynatma sırasını sürdür Dosya Böylesi klasör yok @@ -280,10 +279,8 @@ Bu sürecin ağa yük olabileceğini unutmayın. \n \nSürdürmek istiyor musunuz\? - Küçük resimleri yükle - Küçük resimlerin yüklenmesini önleyerek veri ve hafıza kullanımından tasarruf etmek için kapatın. Değişiklikler, hem bellek içi hem de diskteki resim önbelleğini temizler - Resim önbelleği silindi - Önbelleğe alınmış üstverileri temizle + Resim önbelleği temizlendi + Önbelleğe alınmış meta verileri silin Önbelleğe alınmış tüm web sayfası verilerini kaldır Üstveri önbelleği temizlendi Oynatım Hızı Denetimleri @@ -346,7 +343,7 @@ Liste görünümü kipi Liste Izgara - Otomatik + Kendiliğinden Tamamlandı durduruldu sırada @@ -378,7 +375,7 @@ Beklemede Yorumları göster Yorumları gizlemek için kapatın - Otomatik oynatma + Kendiliğinden oynat Yorum yok Yorumlar yüklenemedi Kapat @@ -393,7 +390,7 @@ dosyanın üzerine yazılamaz Bu isim ile bekleyen bir indirme var NewPipe bu dosya üzerinde çalışırken kapandı - Aygıt üzerinde yer yok + Aygıt üzerinde yer yok İlerleme kaybedildi, çünkü dosya silinmiş Bağlantı zaman aşımı İndirme geçmişinizi temizlemek veya indirilen tüm dosyaları silmek istiyor musunuz\? @@ -426,7 +423,7 @@ %s dinleyici Uygulama yeniden başlatıldıktan sonra dil değişecektir - Hızlı ileri/geri konumlama süresi + Hızlı ileri/geri atlama süresi PeerTube örnekleri Favori PeerTube örneklerinizi seçin %s adresinde beğendiğiniz örnekleri bulun @@ -438,7 +435,7 @@ Yerel Son eklenen En çok beğenilen - Otomatik oluşturulan (yükleyen bulunamadı) + Kendiliğinden oluşturulan (yükleyen bulunamadı) kurtarılıyor Bu indirme kurtarılamıyor Oluşum seçin @@ -448,7 +445,7 @@ Uygulama dili Sistem öntanımlısı Çözüldüğünde \"Bitti\" düğmesine basın - Bitti + Bitti Videolar %d saniye @@ -478,7 +475,7 @@ Abonelik seçilmedi %d öğe seçildi - "%d öğe seçildi" + %d öğe seçildi Boş grup adı Bu grubu silmek istiyor musunuz\? @@ -534,19 +531,19 @@ Henüz oynatma listesi yer imleri yok Asla Yalnızca Wi-Fi - Oynatmayı otomatik başlat — %s + Oynatmayı kendiliğinden başlat — %s Oynatma kuyruğu URL tanınamadı. Başka bir uygulamayla açılsın mı\? - Otomatik kuyruğa alma + Otomatik kuyruğa alış Etkin oynatıcının kuyruğu değiştirilecek Bir oynatıcıdan diğerine geçmek kuyruğunuzu değiştirebilir - Bir kuyruğu temizlemeden önce onay iste + Bir sırayı temizlemeden önce onay iste Hiçbir şey Ara belleğe alınıyor Karıştır - Tekrarla + Yinele Bildirim sekmesinde gösterilecek en fazla üç eylem seçebilirsiniz! - Aşağıdaki bildirim eyleminlerini üzerine dokunarak düzenleyin. Sağdaki onay kutularını kullanarak sıkışık bildirimde gösterilecek üç eylemi seçin + Aşağıdaki bildirim eyleminlerini üzerine dokunarak düzenleyin. Sağdaki onay kutularını kullanarak üst bildirimde gösterilecek üç eylemi seçin. Beşinci eylem düğmesi Dördüncü eylem düğmesi Üçüncü eylem düğmesi @@ -594,16 +591,15 @@ İndirme başladı Gözde gece temanızı aşağıdan seçebilirsiniz Gözde gece temanızı seçin — %s - Otomatik (cihaz teması) - Gece Teması + Kendiliğinden (aygıt teması) + Gece teması Kanal ayrıntılarını göster - Ortam yürütümünde siyah ekran veya tutukluk yaşıyorsanız ortam tünellemeyi devre dışı bırakın + Ortam yürütümünde siyah ekran veya tutukluk yaşıyorsanız ortam tünellemeyi devre dışı bırakın. Ortam tünellemeyi devre dışı bırak İç Gizli Listelenmemiş Herkese Açık - Küçük Resim URL\'si Konakçı Destek Dil @@ -627,7 +623,7 @@ \'Depolama Erişimi Çerçevesi\' yalnızca Android 10\'dan başlayarak desteklenmektedir Her indirmede nereye kaydedileceği sorulacak İndirme klasörü belirlenmedi, şimdi öntanımlı indirme klasörünü seçin - Kapat + Kapalı Tablet kipi Konum çubuğu küçük resim ön izlemesi @@ -636,7 +632,7 @@ Yüksek nitelik (geniş) Yorumlar devre dışı Yaratıcısınca kalplendi - İzlendi olarak imle + İzlendi olarak işaretle Resimlerin üzerinde kaynaklarını gösteren Picasso renkli şeritler göster: ağ için kırmızı, disk için mavi ve bellek için yeşil Resim göstergelerini göster Uzak arama önerileri @@ -650,7 +646,7 @@ %s indirme tamamlandı Ögeleri kaldırmak için kaydır - Videoları mini oynatıcıda başlatmayın, otomatik döndürme kilitliyse doğrudan tam ekran moduna geçin. Tam ekrandan çıkarak mini oynatıcıya erişmeye devam edebilirsiniz + Videoları küçük oynatıcıda başlatma, kendiliğinden döndürme kilitliyse doğrudan tam ekran kipine geç. Tam ekrandan çıkarak küçük oynatıcıya erişebilirsiniz Ana oynatıcıyı tam ekranda başlat Sonrakini sıraya ekle Sonraki sıraya eklendi @@ -671,7 +667,7 @@ \nLütfen Depolama Erişimi Çerçevesi uyumlu dosya yönetici kurun Hata raporları için bildirimler Oynatıcı kullanırken çöktürme seçeneği gösterir - Oynatıcıyı çöktür + Oynatıcıyı çökert Sabitlenmiş yorum LeakCanary yok ExoPlayer öntanımlısı @@ -736,7 +732,7 @@ Ses düzeyi Hiçbiri Parmağınızı ekranın sol yarısında kaydırırken ne yapılacağını seçin - Varsa, görsel engelli kişiler için betimlemeli ses parçasını seç + Varsa, görsel engelli kişiler için betimli ses parçasını seç Bilinmeyen ExoPlayer ayarları Kimi ExoPlayer ayarlarını yönet. Bu değişiklikler oynatıcının yeniden başlatılmasını gerektirir @@ -745,10 +741,76 @@ betimlemeli %1$s %2$s Dış oynatıcılar için ses parçası seç - Dil ne olursa olsun özgün ses parçasını seç + Dilden bağımsız olarak orijinal ses parçasını seçin Ses: %s - Özgün sesi yeğle - Betimlemeli sesi yeğle + Orijinal sesi tercih edin + Açıklayıcı sesi tercih edin Ses parçası Bu akışta halihazırda bir ses parçası bulunmalıdır + Akış yok + Canlı akış yok + Sağ hareket işlemi + Ana sekme seçiciyi alta taşı + Ana sekme konumu + Ortam tünelleme öntanımlı olarak devre dışı bırakılmıştır çünkü aygıt modelinizin desteği bilinmemektedir. + Çözücü ilklendirme sorunlarınız varsa bu seçeneği etkinleştirin, eğer birincil çözücülerin ilklendirmesi başarısızsa düşük öncelikli çözücülere dönülür. Bu, birincil çözücüler kullanılırkenki başarımdan daha kötü sonuçlanabilir + Her zaman ExoPlayer\'ın video çıktısı yüzey ayar çözümünü kullan + Bu çözüm, bir yüzey değişimi yaşandığında yüzeyi doğrudan kodlayıcıya ayarlamaktansa video kodlayıcısını serbest bırakır ve yeniden örneklendirir. Bu sorunu olan bazı aygıtlarda ExoPlayer tarafından halihazırda kullanılır, bu ayar yalnızca Android 6 ve üstünde etkilidir +\n +\nBu ayarı etkinleştirmek, geçerli video oynatıcısını değiştirirken veya tam ekrana geçerkenki oynatma hatalarını önleyebilir + Progresif içeriklerdeki yükleme aralığı boyutunu değiştir (şu anda %s). Daha düşük değer ilk yüklemeyi hızlandırabilir + Sol hareket işlemi + Parmağınızı ekranın sağ yarısında kaydırırken ne yapılacağını seçin + ExoPlayer\'ın çözücü yedek özelliğini kullan + Resim niteliği + Videolar + \? + Aboneler + Kanal sayfalarında hangi sekmelerin gösterileceği + Adres Listesiyle Paylaş + Başlıklarla Paylaş + %1$s +\n%2$s + Kanal sekmeleri + Shorts + Üst Veri Yükleniyor… + Ekran yönelimini değiştir + Düşük nitelik + Tam ekranı değiştir + Kanal sekmelerini al + Avatarlar + Sonraki akış + Alt kanal avatarları + Oynatma kuyruğunu aç + Resimleri yükleme + Yüksek nitelik + Hakkında + Oynatma Listesini Paylaş + İleri sar + Albümler + Geri sar + Yeniden oynat + Besleme güncellenirken alınacak sekmeler. Hızlı kip kullanılırken kanal güncelleniyorsa bu seçeneğin etkisi yoktur. + Oynatma listesini, oynatma listesi adı ve video başlıkları gibi ayrıntılarla ya da video adreslerinin basit listesi olarak paylaş + Orta nitelik + Yükleyen avatarları + Afişler + Oynatma listeleri + - %1$s: %2$s + Veriyi ve bellek kullanımını düşürmek için resimlerin niteliğini ve tümünün yüklenip yüklenmemesini seçin. Değişiklikler bellek ve diskteki resim önbelleğini temizler — %s + Oynat + Daha çok seçenekler + Küçük resimler + Parçalar + Süre + Kanallar + Önceki akış + Canlı + Daha fazla göster + Daha az göster + Aşağıdaki her bir bildirim eylemini üzerine dokunarak düzenleyin. İlk üç eylem (oynat/duraklat, önceki ve sonraki) sistem tarafından ayarlanır ve özelleştirilemez. + + %s yanıt + %s yanıt + \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 25b3a43d2..9348c448d 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -42,7 +42,6 @@ Помилка Помилка мережі Не вдалося завантажити всі ескізи - Не вдалося розшифрувати URL-підпис відео Не вдалося проаналізувати вебсайт Вміст недоступний Не вдалося налаштувати меню завантаження @@ -292,8 +291,6 @@ Майте на увазі: ця операція може потребувати багато трафіку. \n \nБажаєте продовжити\? - Завантажувати ескізи - Вимкніть для запобігання завантаженню ескізів, що заощадить трафік і внутрішню пам\'ять. Зміни призведуть до очищення кешу зображень Кеш зображень стерто Стерти кеш метаданих Видалити всі кешовані дані вебсторінок @@ -401,7 +398,7 @@ не можу перезаписати файл Завантаження з такою назвою вже додано в чергу NewPipe був закритий під час роботи над файлом - На пристрої не залишилося вільного місця + На пристрої не залишилося вільного місця Прогрес втрачено через видалення файлу Час очікування з\'єднання вичерпано Очистити історію завантажень чи завантажені файли\? @@ -451,7 +448,7 @@ Мова Мова телефону Розв\'язавши натисніть «Готово» - Готово + Готово Нова Бажаєте видалити цю групу\? Підписки не вибрані @@ -608,7 +605,7 @@ Кольорувати повідомлення основним кольором мініатюри. Підтримується не всіма пристроями Кольорове сповіщення У компактному сповіщенні є не більше трьох дій! - Дії можна змінити, натиснувши на них. Позначте не більше трьох для показу в компактному сповіщенні + Відредагуйте кожну дію сповіщення, натиснувши на неї. Виберіть до трьох з них, які будуть показані в компактному сповіщенні, за допомогою прапорців праворуч. Обрізати мініатюру відео показувану в сповіщенні з пропорцій 16: 9 до 1:1 Вимкнення тунелювання медіаданих за наявності чорного екрана або гальмування під час відтворення відео. Вимкнути тунелювання медіа @@ -620,7 +617,6 @@ Публічне Приватне Поза списком - URL мініатюри Власник Підтримка Мова @@ -661,7 +657,7 @@ Видалено %1$s завантажень - Завантаження завершено + %s завантаження завершено %s завантаження завершено %s завантажень завершено %s завантажень завершено @@ -783,4 +779,57 @@ Тунелювання медіа типово було вимкнено на вашому пристрої, оскільки ваша модель його не підтримує. Немає трансляцій Немає трансляцій наживо + Відео + Підписники + Які вкладки показуються на сторінках каналів + Вкладки каналу + Shorts + Завантаження метаданих… + Отримання вкладок каналу + Про канал + Альбоми + Отримувані вкладки під час оновлення стрічки. Ця опція не застосовується, якщо канал оновлюється за допомогою швидкого режиму. + Добірки + Доріжки + Канали + Наживо + Змінити орієнтацію екрана + Перемкнути повноекранний режим + Наступний стрим + Відкрити чергу відтворення + Перемотати вперед + Відмотати назад + Повторити + Відтворити + Інші опції + Тривалість + Попередній стрим + Якість зображення + \? + Низька якість + Аватари + Аватари підканалів + Не завантажувати зображення + Висока якість + Середня якість + Вивантажувач аватарів + Банери + Виберіть якість зображень і чи завантажувати зображення взагалі, щоб знизити використання даних і пам\'яті. Зміни очищують кеш зображень як у пам\'яті, так і на диску — %s + Мініатюри + Поділитися списком URL-адрес + Поділитися з назвами + %1$s +\n%2$s + Поділитися добіркою + Поділитися добіркою з подробицями, такими як назва добірки та назви відео, або просто списком URL-адрес відео + - %1$s: %2$s + Показати більше + Відредагуйте кожну дію сповіщення, натиснувши на неї. Перші три дії (відтворення/пауза, попередній і наступний) встановлюються системою і не можуть бути змінені. + + %s відповідь + %s відповіді + %s відповідей + %s відповідей + + Показати менше \ No newline at end of file diff --git a/app/src/main/res/values-und/strings.xml b/app/src/main/res/values-und/strings.xml index f22a117c5..94e4f9dd6 100644 --- a/app/src/main/res/values-und/strings.xml +++ b/app/src/main/res/values-und/strings.xml @@ -118,7 +118,6 @@ کتار نوں خالی کرن توں پہلاں تصویر کرن لئی پچھو پلیئر بدلݨ نال تہاڈی بدل سکدی اے سرگرم پکیئر کتار جاوےگا - تھمنیل لوڈ کرو وہروا دِکھاؤ کھوج دا اتیت ڈیٹا پٹاؤ diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index c05fc095c..d70927121 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -55,8 +55,6 @@ پچھلی جسامت اور پوپ اپ کا مقام یاد رکھیں بالواسطہ رسائی استعمال کریں بالواسطہ تلاش مشکلات کو کم کر کے پلیئر کو تیز رفتاری سے مقامات تک رسائی کرنے دیتی ہے۔ 5 ، 15 یا 25 سیکنڈ کی تلاش اس کے ساتھ کام نہیں کرتی ہے: - نظرِ انگشتی لوڈ کریں - ڈیٹا کی بچت اور میموری کے استعمال کو روکنے کیلئے تھمب نیل کو بند کریں۔ تبدیلیاں میموری اور آن ڈسک ایمیج کیشے کو صاف کریں گی تصویری کیشے کی صفائی ہوئی کیشے میٹا ڈیٹا کو صاف کریں ویب پیج کے سبھی کیشے ڈیٹا کو ہٹا دیں @@ -113,7 +111,6 @@ خرابی نیٹ ورک کی خرابی تمام نظرِ انگشتی لوڈ نہیں کر سکے - ویڈیو یو آر ایل کے دستخط ڈکرپٹ نہیں ہو سکے ویب سائٹ کو تجزیہ نہیں کیا جاسکا مواد دستیاب نہیں ہے ڈاؤن لوڈ مینو ترتیب نہیں دے سکتے @@ -393,7 +390,7 @@ فائل برتحریر نہیں کر سکتا اس نام کے ساتھ ڈاؤن لوڈ زیر التوا ہے فائل پر کام کرنے کے دوران نیو پائپ بند کردی گئی تھی - آلہ میں کوئی جگہ نہیں بچی + آلہ میں کوئی جگہ نہیں بچی پیشرفت ختم ہوگئی، کیونکہ فائل کو حذف کردیا گیا تھا رابطے کا وقت ختم کیا آپ اپنی ڈاؤن لوڈ کی سرگزشت کو صاف کرنا چاہتے ہیں یا ڈاؤن لوڈ کی گئی تمام فائلوں کو حذف کرنا چاہتے ہیں؟ @@ -516,7 +513,7 @@ %s نئی اسٹریمز ابھی تک کوئی ڈاؤن لوڈ فولڈر سیٹ نہیں ہے، ابھی ڈیفالٹ ڈاؤن لوڈ فولڈر کا انتخاب کریں - Done + Done قطار چلائیں آڈیو: %s آڈیو ٹریک diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 871fb9c12..cdd6f6e31 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -2,53 +2,53 @@ Nhấn vào kính lúp để bắt đầu. Đăng vào %1$s - Không tìm thấy trình phát. Cài đặt VLC\? - Cài vô + Không tìm thấy trình phát trực tuyến. Cài đặt VLC\? + Cài đặt Hủy Mở trong trình duyệt - Mở trong chế độ cửa sổ nổi + Mở trong chế độ bật lên Chia sẻ Tải về Tìm kiếm - Các cài đặt + Thiết đặt Ý bạn là \"%1$s\"\? Chia sẻ với - Sử dụng trình phát video bên ngoài + Sử dụng trình phát băng hình bên ngoài Loại bỏ âm thanh ở một số độ phân giải - Sử dụng trình phát audio bên ngoài + Sử dụng trình phát âm thanh bên ngoài Trình phát nổi - Thư mục video tải về - Video đã tải về được lưu ở đây - Chọn thư mục lưu video tải về - Thư mục tải về audio - Audio đã tải về được lưu ở đây - Chọn vị trí lưu audio tải về + Thư mục băng hình tải về + Băng hình đã tải về được lưu ở đây + Chọn thư mục tải xuống cho các tệp băng hình + Thư mục tải xuống âm thanh + Các tệp âm thanh đã tải xuống được lưu trữ tại đây + Chọn thư mục tải xuống cho các tệp âm thanh Độ phân giải mặc định - Độ phân giải popup mặc định + Độ phân giải cửa sổ bật lên mặc định Hiện độ phân giải cao hơn - Chỉ một số thiết bị hỗ trợ phát video 2K/4K - Phát bằng Kodi - Cài đặt ứng dụng Kore\? - Hiện tùy chọn \"Phát bằng Kodi\" - Hiện tùy chọn phát video qua trung tâm media Kodi + Chỉ một số thiết bị có thể phát băng hình 2K/4K + Phát với Kodi + Cài đặt ứng dụng Kore bị thiếu\? + Hiển thị tùy chọn \"Phát với Kodi\" + Hiển thị tùy chọn phát băng hình qua trung tâm truyền thông Kodi Âm thanh Định dạng âm thanh mặc định - Định dạng video mặc định + Định dạng băng hình mặc định Nền Chủ đề Sáng Tối Đen (Amoled) - Nhớ thuộc tính của popup - Nhớ kích thước và vị trí lần trước của popup + Ghi nhớ thuộc tính cửa sổ bật lên + Ghi nhớ kích thước và vị trí cuối cùng của cửa sổ bật lên Đề xuất tìm kiếm Chọn các đề xuất để hiển thị khi tìm kiếm Tải về - Hiện video \"Tiếp theo\" và \"Tương tự\" + Hiện các cuộn băng \"Tiếp theo\" và \"Tương tự\" URL không hỗ trợ - Hiển thị - Phát ở dưới nền - Phát ở chế độ popup + Vẻ ngoài + Đang phát trong nền + Đang phát trong chế độ bật lên Nội dung Hiển thị nội dung bị giới hạn độ tuổi Trực tiếp @@ -57,26 +57,25 @@ Báo lỗi Tất cả Vô hiệu - Xóa + Dọn dẹp Độ phân giải tốt nhất Lỗi Lỗi kết nối mạng Không thể tải tất cả hình thu nhỏ - Không thể giải mã chữ ký URL video Không thể phân tích cú pháp trang web Nội dung không khả dụng Không thể thiết lập menu tải về Ứng dụng / Giao diện người dùng bị lỗi Có vẻ NewPipe đã xảy ra lỗi, lướt xuống kiểm tra xem. Báo lỗi qua email - Có gì đó không đúng lắm. Thật khó chịu. + Rất tiếc, đã xảy ra lỗi rồi. Báo cáo Thông tin: Chuyện gì đã xảy ra: Loại lỗi:\\nYêu cầu:\\nNgôn ngữ của nội dung:\\nVùng miền (quốc gia) của nội dung:\\nNgôn ngữ của ứng dụng:\\nDịch vụ:\\nThời gian GMT:\\nTên gói:\\nPhiên bản:\\nPhiên bản hệ điều hành: Nhận xét của bạn (bằng tiếng Anh): Chi tiết: - Video xem, thời lượng: + Phát băng hình, thời lượng: Hình thu nhỏ của avatar người tải lên Lượt thích Lượt không thích @@ -98,9 +97,9 @@ Chạm để biết chi tiết Đợi chút xíu nha… Đã sao chép vào khay nhớ tạm - Hãy chọn một thư mục tải xuống trong phần cài đặt - Chế độ popup cần quyền này -\n để hoạt động, hãy bật trong phần cài đặt + Hãy chọn một thư mục tải xuống trong phần thiết đặt + Sự cho phép này là cần thiết để +\nmở trong chế độ bật lên reCAPTCHA Yêu cầu reCAPTCHA Giới thiệu về NewPipe @@ -108,56 +107,54 @@ © %1$s bởi %2$s dưới %3$s Thông tin & FAQ Giấy phép - Trình phát video Yiu tu be nhẹ, mã nguồn mở và không quảng cáo cho Android. + Phát trực tuyến nhẹ tự do trên Android. Xem trên GitHub Giấy phép của NewPipe Sự đóng góp của bạn luôn được hoan nghênh – kể cả khi bạn dịch, thay đổi giao diện, dọn code, thêm tính năng hay thay đổi những thứ khác, sự giúp đỡ của bạn vẫn đáng được trân trọng. Bạn càng làm nhiều, ứng dụng này sẽ càng tốt hơn bao giờ hết ! Đọc giấy phép Đóng góp Ngôn ngữ nội dung ưu tiên - Video và âm thanh + Băng hình và âm thanh Lịch sử xem - Lịch sử và bộ nhớ cache + Lịch sử và bộ nhớ đệm Không tìm thấy Đăng ký Đã đăng ký Đã hủy đăng ký kênh Không thể thay đổi tình trạng đăng ký Không thể cập nhật tình trạng đăng ký - Không tìm thấy trình phát luồng nào (bạn có thể cài đặt VLC để phát). + Không tìm thấy trình phát trực tuyến nào (bạn có thể cài đặt VLC để phát nó). Tải tệp luồng về Hiện thông tin Kênh đăng ký - Danh sách phát được đánh dấu - Video mới + Đã đánh dấu danh sách phát + Có gì mới Thêm vào - Sử dụng tìm kiếm nhanh không chính xác - Tua không chính xác cho phép trình phát tua đến các vị trí nhanh hơn với độ chính xác bị giảm. Tua 5, 15 hay 25 giây không dùng được với chế độ này - Tải hình thu nhỏ - Tắt để ngăn chặn việc tải các hình thu nhỏ, việc này sẽ tiết kiệm lưu lượng mạng và bộ nhớ. Các thay đổi sẽ xóa bộ nhớ đệm hình ảnh cả trong RAM và trong bộ nhớ + Dùng tua nhanh ít chính xác + Tua ít chính xác cho phép trình phát giảm độ chính xác để tua tới vị trí nhanh hơn. Tua khoảng 5, 15 hoặc 25 giây không hoạt động với điều này Đã xóa bộ nhớ cache hình ảnh - Xóa siêu dữ liệu đã lưu vào bộ nhớ cache - Xóa tất cả dữ liệu trang web được lưu trong bộ nhớ cache + Lau sạch siêu dữ liệu đã lưu đệm + Loại bỏ mọi dữ liệu trang web đã lưu đệm Đã xóa bộ nhớ cache siêu dữ liệu - Tự động thêm luồng phát tiếp theo vào hàng đợi + Tự động xếp hàng luồng phát tiếp theo Tiếp tục hàng đợi (không lặp lại) bằng cách thêm một luồng phát liên quan Lịch sử tìm kiếm Lưu trữ truy vấn tìm kiếm cục bộ - Theo dõi các video đã xem - Tiếp tục phát - Tiếp tục phát sau khi bị gián đoạn (ví dụ: cuộc gọi điện thoại) - Hiển thị \"Giữ để thêm vào hàng đợi\" - Hiển thị mẹo khi nhấn nút phát trong nền hoặc phát trên popup trong trang \"Chi tiết\" + Theo dõi các cuộn băng đã xem + Tiếp tục đang phát + Tiếp tục phát lại sau khi bị gián đoạn (ví dụ: cuộc gọi) + Hiển thị mẹo \"Giữ để xếp hàng\" + Hiển thị mẹo khi nhấn vào nút nền hoặc nút bật lên trong \"Chi tiết:\" cuốn băng Quốc gia nội dung mặc định - Phát + Trình phát Hành vi Gỡ lỗi Kênh - Playlist + Danh sách phát Bản nhạc Người dùng Hoàn tác - Chơi tất cả + Phát tất cả Luôn luôn Chỉ một lần Tập tin @@ -165,26 +162,26 @@ Thông báo cho trình phát của NewPipe [Không xác định] Chuyển sang nền - Chuyển sang Popup + Chuyển sang Cửa sổ bật lên Chuyển sang Main Nhập cơ sở dữ liệu Xuất cơ sở dữ liệu - Ghi đè lịch sử, kênh đăng ký, playlist hiện tại (và cài đặt, nếu có) của bạn - Xuất lịch sử, danh sách đăng ký, playlist và cài đặt - Xóa lịch sử xem - Xóa lịch sử những video đã xem và vị trí phát + Ghi đè lịch sử, đăng ký, danh sách phát và các thiết đặt (tùy chọn) hiện tại của bạn + Xuất lịch sử, đăng ký, danh sách phát và các thiết đặt + Dọn dẹp lịch sử xem + Xóa lịch sử các luồng đã phát và các vị trí phát lại Xóa toàn bộ lịch sử xem\? Đã xoá lịch sử xem - Xóa lịch sử tìm kiếm + Dọn dẹp lịch sử tìm kiếm Xóa lịch sử tìm kiếm mà bạn đã ghi Xóa toàn bộ lịch sử tìm kiếm\? Đã xóa lịch sử tìm kiếm - Không thể phát video này + Không thể phát luồng này Đã xảy ra lỗi trình phát không thể khôi phục Phục hồi lại trình phát bị lỗi Trình phát ngoài không hỗ trợ các loại liên kết này - Không tìm thấy luồng video nào - Không tìm thấy luồng audio nào + Không tìm thấy luồng băng hình nào + Không tìm thấy luồng âm thanh nào Thư mục không hợp lệ Tệp / nguồn nội dung không hợp lệ Tệp không tồn tại hoặc không có quyền đọc / ghi @@ -201,16 +198,16 @@ %s lượt xem - Không có video nào + Không có cuộn băng nào - %s video + %s cuộn băng Tạo nên Bỏ qua Đổi tên Đã xóa 1 mục. Tải xuống - Các ký tự được cho phép cho tên tệp + Các ký tự được cho phép trong tên tệp Ký tự không hợp lệ được thay thế bằng giá trị này Ký tự thay thế Chỉ chữ cái và chữ số @@ -224,12 +221,12 @@ NewPipe rất coi trọng quyền riêng tư của bạn. Do đó, ứng dụng không thu thập bất kỳ dữ liệu nào mà không có sự đồng ý của bạn. \nChính sách bảo mật của NewPipe giải thích chi tiết dữ liệu nào được gửi và lưu trữ khi bạn gửi báo cáo sự cố. Đọc chính sách bảo mật - NewPipe là phần mềm miễn phí copyleft: Bạn có thể sử dụng, nghiên cứu, chia sẻ và cải thiện nó theo ý của bạn. Nói cụ thể hơn, bạn có thể phân phối lại và/hoặc sửa đổi nó theo các điều khoản trong Giấy phép Công cộng GNU (GPL) được xuất bản bởi Quỹ Phần mềm Tự do (FSF), theo phiên bản 3 hoặc bất kì phiên bản nào sau này của Giấy phép (tùy ý bạn). + NewPipe là phần mềm tự do bản quyền bên trái: Bạn có thể sử dụng, nghiên cứu, chia sẻ và cải tiến nó theo ý muốn. Cụ thể là bạn có thể phân phối lại và/hoặc sửa đổi nó theo các điều khoản của Giấy phép Công cộng GNU do Tổ chức Phần mềm Tự do xuất bản, phiên bản 3 của Giấy phép hoặc (tùy theo lựa chọn của bạn) bất kỳ phiên bản nào mới hơn. Lịch sử Lịch sử Bạn có muốn xóa mục này khỏi lịch sử tìm kiếm không? Lần phát cuối - Hầu hết phát + Được phát nhiều nhất Nội dung trang chính Trang trống Trang chủ @@ -242,43 +239,43 @@ Không có tệp ZIP hợp lệ Cảnh báo: Không thể nhập tất cả các tệp. Thao tác này sẽ ghi đè cài đặt hiện tại của bạn. - Bạn cũng muốn nhập cài đặt? - Đang thịnh hành + Bạn có muốn cũng nhập các thiết đặt không\? + Thịnh hành Mới và đang hot Loại bỏ Chi tiết - Cài đặt âm thanh - Giữ để nối tiếp + Thiết đặt âm thanh + Giữ để xếp hàng Bắt đầu phát từ đây trong nền - Bắt đầu phát trên trình phát popup + Bắt đầu phát trong cửa sổ bật lên Mở ngăn kéo Đóng ngăn Hành động \'mở\' được ưu tiên Hành động mặc định khi mở nội dung — %s - Trình phát video + Trình phát băng hình Trình phát nền - Trình phát popup + Trình phát bật lên Luôn luôn hỏi Đang nhận thông tin… Đang tải nội dung được yêu cầu - Tạo playlist mới - Đổi tên playlist + Danh sách phát mới + Đổi tên Tên Thêm vào danh sách phát Đặt làm hình thu nhỏ của danh sách phát - Đánh dấu playlist này - Xóa dấu trang - Xóa playlist này\? - Đã tạo playlist - Đã thêm vào playlist - Đã thay đổi danh sách của playlist. + Đánh dấu danh sách phát + Loại bỏ đánh dấu + Xóa danh sách phát này\? + Đã tạo danh sách phát + Đã thêm danh sách phát + Hình thu nhỏ của danh sách phát đã thay đổi. Không có phụ đề Phù hợp Lấp đầy Thu phóng Tự động tạo ra Phụ đề - Sửa cỡ chữ, màu chữ và kiểu màu nền phụ đề. Hãy khởi động lại ứng dụng để áp dụng + Thay đổi tỷ lệ văn bản và kiểu nền phụ đề trình phát. Yêu cầu khởi động lại ứng dụng để có hiệu lực Theo dõi rò rỉ bộ nhớ có thể khiến ứng dụng trở nên không phản hồi khi đổ xô đống Báo các lỗi out-of-lifecycle Buộc báo cáo ngoại lệ Rx không thể gửi được bên ngoài vòng đời của mảnh hoặc hoạt động sau khi xử lý @@ -314,7 +311,7 @@ Độ cao Bỏ gắn (có thể gây méo nhưng vui) Tua nhanh trong im lặng - Tiếp theo + Bước Đặt lại Để tuân thủ Quy định bảo vệ dữ liệu chung của châu Âu (GDPR), chúng tôi sẽ thu hút sự chú ý của bạn đến chính sách bảo mật của NewPipe. Vui lòng đọc kỹ. \nBạn phải chấp nhận nó để gửi cho chúng tôi báo cáo lỗi. @@ -323,10 +320,10 @@ Không giới hạn Giới hạn độ phân giải khi sử dụng 3G, 4G Thu nhỏ khi chuyển qua ứng dụng khác - Hành động khi chuyển sang ứng dụng khác từ trình phát chính — %s + Hành động khi chuyển sang ứng dụng khác từ trình phát băng hình chính — %s Không Thu nhỏ xuống trình phát nền - Thu nhỏ vào trình phát popup + Thu nhỏ xuống trình phát bật lên Hủy đăng ký Chọn tab Cập nhật @@ -344,7 +341,7 @@ Top 50 phổ biến Nhập ID SoundCloud hoặc link soundcloud.com/<ID của bạn> Cập nhật - Hiện thông báo khi có bản cập nhật ứng dụng + Hiển thị thông báo để nhắc cập nhật ứng dụng khi có phiên bản mới Chế độ hiển thị danh sách Danh sách Lưới @@ -354,7 +351,7 @@ đã tạm dừng trong hàng đợi đang xử lý - Hàng chờ + Xếp hàng Thao tác bị từ chối bởi hệ thống Tải về không thành công Tạo tên riêng biệt @@ -384,33 +381,33 @@ Không có bình luận nào Không thể tải bình luận Đóng - Tiếp tục phát - Phục hồi vị trí phát lại + Tiếp tục phát lại + Khôi phục vị trí phát lại cuối cùng Vị trí phát trong danh sách - Hiện vị trí phát lại trong danh sách - Xoá dữ liệu + Hiển chỉ báo vị trí phát lại trong danh sách + Dọn dẹp dữ liệu Đã xoá vị trí phát Tệp đã di chuyển hoặc đã xoá Tên file này đã tồn tại Không thể ghi đè lên tệp Có một bản tải xuống đang chờ xử lí với tên này Newpipe đã bị đóng khi đang xử lí tệp - Không đủ dung lượng trên máy + Không đủ dung lượng trên máy Quá trình tải bị hủy, vì tập tin đã bị xoá Kết nối hết thời gian Bạn muốn xóa lịch sử tải về hay xóa tất cả những file đã tải về\? Giới hạn hàng chờ tải xuống - Chỉ một tải xuống sẽ chạy + Chỉ một lần tải mỗi lượt Bắt đầu tải xuống Tạm dừng tải xuống Hỏi nơi thư mục để tải xuống Bạn sẽ được hỏi nơi lưu vào mỗi lần tải xuống. \nHãy bật trình chọn thư mục của hệ thống (SAF) nếu bạn muốn tải xuống vào một cái thẻ nhớ Xóa vị trí phát - Xóa toàn bộ vị trí phát - Xác nhận xóa toàn bộ vị trí phát\? + Xóa tất cả vị trí phát + Xóa tất cả vị trí phát\? Nhóm kênh - Chọn thực thể + Chọn một thực thể Thực thể đã tồn tại Không thể xác nhận thực thể Nhập URL thực thể @@ -428,27 +425,27 @@ %d giây - Có, và video đã xem một phần - Video đã xem trước và sau khi được thêm vào playlist sẽ bị xóa. -\nBạn có chắc không\? Video sẽ không thể hồi phục được! - Xóa video đã xem\? - Xóa video đã xem + Có, và cuốn băng đã xem một phần + Những cuốn băng đã xem trước và sau khi thêm vào danh sách phát sẽ bị loại bỏ. +\nBạn có chắc không\? Điều này không thể được hoàn tác! + Loại bỏ các cuốn băng đã xem\? + Xóa đã xem Mặc định hệ thống Ngôn ngữ ứng dụng - \'Khung truy cập bộ nhớ\' cho phép tải xuống thẻ SD bên ngoài + \'Khung truy cập lưu trữ\' cho phép tải xuống một thẻ SD bên ngoài Sử dụng trình chọn thư mục của hệ thống (SAF) Xóa file đã tải về Xóa lịch sử tải về Không thể khôi phục bản tải xuống này Bật tiếng Tắt tiếng - Yêu thích nhất + Được yêu thích nhất Thêm vào gần đây Ngôn ngữ sẽ thay đổi khi ứng dụng khởi động lại Bấm \"Xong\" khi hoàn thành - Đã hoàn thành - ∞ video - 100+ video + Đã hoàn thành + ∞ cuộn băng + 100+ cuốn băng %s người nghe @@ -461,15 +458,15 @@ Nghệ sĩ Album Bài hát - Các video - Video này bị giới hạn độ tuổi. + Các cuốn băng + Cuốn băng này bị giới hạn độ tuổi. \n -\nBật \"%1$s\" trong cài đặt nếu bạn muốn xem video này. +\nBật \"%1$s\" trong thiết đặt nếu bạn muốn xem cuốn băng này. Bật chế độ hạn chế Youtube Chỉ URL HTTPS được hỗ trợ Chọn thực thể PeerTube ưa thích Thực thể PeerTube - Thời lượng tua video + Thời lượng tua-nhanh tới/-lùi Dòng chữ mô tả thời gian gốc từ các dịch vụ sẽ được hiển thị thay thế Hiện thời gian gốc trên các item Chọn dịch vụ; dịch vụ hiện tại: @@ -479,82 +476,82 @@ NewPipe chưa hỗ trợ loại nội dung này. \n \nCó thể nó sẽ được hỗ trợ bởi một phiên bản mới hơn trong tương lai. - Bạn có thấy feed của mình cập nhật chậm không\? Nếu có thì bạn có thể thử chế độ tăng tốc (bạn có thể bật/tắt chế độ này trong cài đặt hoặc bằng cách nhấn nút bên dưới). + Bạn có nghĩ rằng tải nguồn cấp dữ liệu quá chậm\? Nếu vậy, hãy thử bật tải nhanh (bạn có thể thay đổi nó này trong thiết đặt hoặc bằng cách nhấn nút bên dưới). \n -\nNewPipe hỗ trợ 2 cách cập nhật feed: -\n• Tải thông tin cả kênh cho từng kênh một; chậm nhưng chắc. -\n• Tải từ các nguồn chuyên dụng; nhanh nhưng thường không đầy đủ. +\nNewPipe cung cấp hai chiến lược tải nguồn cấp dữ liệu: +\n• Tìm nạp toàn bộ kênh đăng ký, tuy chậm nhưng đầy đủ. +\n• Sử dụng điểm cuối dịch vụ chuyên dụng, nhanh nhưng thường không hoàn thiện. \n -\nĐiểm khác biệt giữa 2 cách trên là cách nhanh hơn (chế độ tăng tốc) thường có thể thiếu thông tin - như thời lượng hay loại (VD: không thể phân biệt được giữa video thường và livestream) - và thiếu nội dung hơn. +\nSự khác biệt giữa hai loại này là cái nào nhanh thường thiếu một số thông tin, chẳng hạn như thời lượng hoặc loại mục (không thể phân biệt giữa các cuốn băng trực tiếp và bình thường) và nó có thể trả về ít mục hơn. \n -\nYouTube là một trong số các dịch vụ có hỗ trợ cập nhật nhanh, sử dụng RSS. +\nYouTube là một ví dụ về dịch vụ cung cấp phương pháp nhanh này với nguồn cấp RSS. \n -\nTuy nhiên, việc lựa chọn chế độ tùy thuộc vào mong muốn của bạn: tốc độ hay thông tin. - Tải thông tin từ các nguồn chuyên dụng nếu có thể - Bật chế độ tăng tốc - Tắt chế độ tăng tốc - Có thể được với một số dịch vụ, thường sẽ nhanh hơn nhưng có thể bị giới hạn nội dung nhận được hoặc nội dung nhận được không đầy đủ (v.d. thời lượng, trạng thái,..) +\nVì vậy, sự lựa chọn tập trung vào những gì bạn thích: tốc độ hoặc thông tin chính xác. + Tìm nạp từ nguồn cấp dữ liệu chuyên dụng khi có sẵn + Bật chế độ nhanh + Tắt chế độ nhanh + Có sẵn trong một số dịch vụ, nó thường nhanh hơn nhiều nhưng có thể trả về một số lượng mục hạn chế và thông tin thường không đầy đủ (ví dụ: không có thời lượng, loại mục, trạng thái không trực tiếp) Luôn cập nhật - Khoảng thời gian kể từ lần cuối cập nhật thông tin kênh trước khi nó được coi là hết hạn — %s - Ngưỡng thời gian cập nhật thông báo - Thông báo (feed) + Thời gian sau lần cập nhật cuối cùng trước khi đăng ký được coi là lỗi thời — %s + Ngưỡng cập nhật nguồn cấp dữ liệu + Nguồn cấp dữ liệu Tạo mới - Bạn muốn xóa nhóm kênh này\? - Tên nhóm kênh trống + Bạn có muốn xóa nhóm này\? + Tên nhóm trống Đã chọn %d - Chưa chọn kênh nào + Chưa chọn kênh đăng ký nào Chọn kênh đăng ký - Đang xử lý thông báo… - Số kênh không tải được: %d - Đang tải thông báo… - Thông báo cập nhật lần cuối vào: %s - Do giới hạn của ExoPlayer, khoảng thời gian tua đã được đặt lại thành %d giây + Đang xử lý nguồn cấp dữ liệu… + Chưa tải được: %d + Đang tải nguồn cấp dữ liệu… + Nguồn cấp được cập nhật lần cuối: %s + Do các hạn chế của ExoPlayer, đã đặt lại thời lượng tua thành %d giây đang khôi phục - Tự tạo (không tìm thấy người upload) + Được tạo tự động (không tìm thấy người tải lên) Cục bộ Trang chính mặc định Trang danh sách phát - Chỉ hiện các kênh chưa được nhóm + Chỉ hiển thị các đăng ký chưa được nhóm Không bao giờ Chỉ trên Wi-Fi - Tự động phát — %s - Phát hàng đợi (Video) - Không có danh sách nào ở đây - Chọn danh sách + Bắt đầu phát lại tự động — %s + Phát hàng đợi + Chưa đánh dấu danh sách phát nào + Chọn danh sách phát Vui lòng kiểm tra xem vấn đề mà bạn đang gặp đã báo cáo trước đó hay chưa. Nếu bạn tạo quá nhiều báo cáo trùng lặp, bạn sẽ khiến cho chúng tôi tốn thời gian để đọc chúng thay vì sửa lỗi bạn gặp. Báo cáo trên GitHub Sao chép bản báo cáo đã được định dạng Không thể đọc URL này. Mở với app khác\? - Tự động thêm vào hàng đợi + Tự động xếp hàng Hàng đợi của trình phát hiện tại sẽ bị thay thế Việc chuyển từ trình phát này sang trình phát khác có thể sẽ thay thế hàng đợi - Hỏi xác nhận trước khi xóa hàng đợi + Yêu cầu xác nhận trước khi xóa hàng đợi Để trống Đang tải Ngẫu nhiên Lặp lại Bạn có thể chọn tối đa ba hành động để hiện trong thông báo thu gọn! - Chỉnh sửa mỗi hành động trong thông báo ở dưới bằng cách nhấn vào nó. Chọn tối đa ba hành động để hiện trong thông báo thu gọn bằng cách sử dụng các ô đánh dấu bên phải + Chỉnh sửa từng hành động thông báo bên dưới bằng cách nhấn vào nó. Chọn tối đa ba trong số chúng để hiển thị trong thông báo thu gọn bằng cách sử dụng các hộp kiểm ở bên phải. Nút hành động thứ năm Nút hành động thứ tư Nút hành động thứ ba Nút hành động thứ hai Nút hành động đầu tiên - Chỉnh ảnh thu nhỏ của video trên thanh thông báo từ tỉ lệ 16:9 thành 1:1 (có thể gây méo ảnh) + Cắt bớt hình thu nhỏ cuộn băng hiển thị trong thông báo từ tỷ lệ khung hình 16:9 xuống 1:1 Chỉnh ảnh thu nhỏ thành tỉ lệ 1:1 Đang hiện kết quả cho: %s - Thêm vào danh sách đang phát + Xếp hàng Hiển thị nội dung không phù hợp vì có giới hạn độ tuổi (18+) Hiện ảnh thu nhỏ (thumbnail) trên nền màn hình khóa và trong thông báo Xem hình thu nhỏ Kiểm tra bộ nhớ - Đã thêm vào danh sách đang phát + Đã xếp hàng Xoá Cookie mà NewPipe lưu trữ sau khi bạn hoàn thành nó Cookie reCAPTCHA đã được xóa - Xóa bỏ Cookie của reCAPCHA - YouTube cung cấp \"Chế độ hạn chế\" để ẩn nội dung không phụ hợp + Dọn dẹp Cookie của reCAPCHA + YouTube cung cấp \"Chế độ hạn chế\" để ẩn nội dung có khả năng dành cho người trưởng thành Yêu cầu Android tùy chỉnh màu của thông báo theo màu chính của ảnh thu nhỏ (lưu ý rằng việc này không khả dụng trên tất cả thiết bị) Tô màu thông báo Thiết bị của bạn không có ứng dụng để mở tệp này @@ -562,13 +559,13 @@ Gần đây Đang tính hash Mô tả - Video liên quan + Các mục liên quan Bình luận - Thông báo cho quá trình hash video - Thông báo hash video - Tắt để ẩn các hộp thông tin meta chứa thông tin bổ sung về tác giả/nội dung của stream, hoặc yêu cầu tìm kiếm - Hiện thông tin meta - Tắt để ẩn mô tả video và các thông tin bổ sung + Thông báo cho quá trình băm cuốn băng + Thông báo băm cuộn băng + Tắt để ẩn các hộp siêu thông tin có thông tin bổ sung về người tạo luồng, nội dung luồng hoặc yêu cầu tìm kiếm + Hiển thị siêu thông tin + Tắt để ẩn mô tả cuộn băng và các thông tin bổ sung Hiện mô tả Mở bằng Tệp đang được tải xuống @@ -577,18 +574,18 @@ Tự động (giao diện hệ thống) Radio Nội dung này chỉ dành cho người dùng trả phí, nên NewPipe không thể phát hay tải xuống. - Video này chỉ được dành cho thành viên YouTube Music Premium, nên NewPipe không thể phát hay tải xuống. + Cuốn băng này chỉ được dành cho thành viên YouTube Music Premium, nên NewPipe không thể phát hay tải xuống. Nội dung này được để ở chế độ riêng tư, nên NewPipe không thể phát hay tải xuống. Đây là một track SoundCloud Go+, nên NewPipe không thể phát hay tải xuống được, ít nhất là tại quốc gia của bạn. Nội dung này không có sẵn ở quốc gia của bạn. Làm văng ứng dụng - Video này đã bị giới hạn độ tuổi. -\nVì những quy định mới của YouTube, NewPipe không thể phát được video này, vì không thể tìm thấy nguồn phát video. - Chủ đề ban đêm + Cuốn băng này bị giới hạn độ tuổi. +\nDo chính sách mới của YouTube với các cuốn băng bị giới hạn độ tuổi, NewPipe không thể truy cập bất kỳ luồng băng hình nào của nó và do đó không thể phát nó. + Chủ đề đêm Nổi bật Hiện chi tiết kênh Hoàn thành - Tắt truyền phương tiện qua đường hầm nếu bạn gặp màn hình đen hoặc khựng khi phát video + Tắt tính năng truyền tải phương tiện nếu bạn gặp phải tình trạng màn hình đen hoặc giật hình khi phát lại cuốn băng. Tắt truyền phương tiện qua đường hầm Tắt Bật @@ -598,7 +595,6 @@ Riêng tư Chưa được liệt kê Công khai - URL hình thu nhỏ Nơi chứa Hỗ trợ Ngôn ngữ @@ -612,12 +608,12 @@ Bây giờ bạn có thể chọn văn bản trong mô tả. Lưu ý rằng trang có thể nhấp nháy và các liên kết có thể không nhấn vào được trong khi ở chế độ chọn. %s cung cấp lý do này: Tài khoản đã bị chấm dứt - Chế độ nguồn dữ liệu nhanh không cung cấp thêm thông tin về cái này. - Tài khoản của người này đã bị chấm dứt. -\nNewPipe sẽ không thể tải nguồn dữ liệu này trong tương lai. -\nBạn có muốn huỷ đăng ký kênh này không\? - Không thể tải thông báo cho \'%s\'. - Lỗi khi tải nguồn thông báo + Chế độ nạp nhanh không cung cấp thêm thông tin về điều này. + Tài khoản của tác giả đã bị chấm dứt. +\nNewPipe sẽ không thể tải nguồn cấp dữ liệu này trong tương lai. +\nBạn có muốn hủy đăng ký khỏi kênh này không\? + Không thể tải nguồn cấp dữ liệu cho \'%s\'. + Lỗi tải nguồn cấp dữ liệu \'Storage Access Framework\' chỉ được hỗ trợ từ Android 10 trở đi Bạn sẽ được hỏi nơi bạn muốn lưu mỗi mục tải xuống Chưa có thư mục tải xuống nào được đặt, hãy chọn thư mục tải xuống mặc định ngay @@ -639,11 +635,11 @@ %s lượt tải xuống đã hoàn tất Vuốt các mục để xóa chúng - Không bắt đầu video ở trình phát mini, mà chuyển trực tiếp thành chế độ toàn màn hình, nếu tự động xoay bị khóa. Bạn vẫn có thể truy cập trình phát mini bằng cách thoát khỏi toàn màn hình + Không bắt đầu các cuốn băng ở trình phát mini, mà chuyển trực tiếp thành chế độ toàn màn hình, nếu tự động xoay bị khóa. Bạn vẫn có thể truy cập trình phát mini bằng cách thoát khỏi toàn màn hình Khởi động trình phát chính ở toàn màn hình - Đã cho mục tiếp vào hàng đợi - Cho video kế tiếp vào hàng đợi - Đang thực hiện...Có thể mất một lúc + Đã xếp kế tiếp vào hàng + Xếp kế tiếp vào hàng + Đang xử lý... Có thể hơi lâu Thông báo lỗi Thông báo để báo cáo lỗi NewPipe đã gặp sự cố, nhấn để xem và báo cáo @@ -655,27 +651,27 @@ Kiểm tra cập nhật Kiểm tra phiên bản mới theo cách thủ công Đang kiểm tra cập nhật… - Mục thông báo mới - Làm trình phát dừng + Mục nguồn cấp dữ liệu mới + Làm sập trình phát Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. \nVui lòng cài đặt ứng dụng quản lý tệp tương thích với Storage Access Framework - Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. -\nVui lòng cài đặt ứng dụng quản lý tệp hoặc tắt \'%s\' trong cài đặt tải xuống + Không tìm thấy trình quản lý tệp nào thích hợp cho hành động này. +\nVui lòng cài đặt một trình quản lý tệp hoặc thử tắt \'%s\' trong thiết đặt tải xuống LeakCanary không khả dụng - ExoPlayer mặc định + Mặc định ExoPlayer Bình luận được ghim Thông báo trình phát - Thiết lập thông báo hiện đang phát + Cấu hình thông báo hiện đang phát trực tuyến Thông báo Luồng truyền mới - Thông báo về video mới đối với mục đăng ký + Thông báo về luồng mới của kênh đăng ký %s luồng truyền mới Đang tải chi tiết luồng truyền… Chạy kiểm tra luồng truyền mới - Thông báo video mới - Thông báo về video mới từ kênh bạn đã đăng ký + Thông báo về luồng mới + Thông báo về các luồng mới từ các kênh đăng ký Thời gian kiểm tra Yêu cầu kết nối mạng Bất kỳ loại mạng nào (có thể tính phí) @@ -687,64 +683,120 @@ Phần trăm , Nửa cung - Luồng video mà không được trình tải xuống hỗ trợ sẽ không hiện - Không có video khả dụng cho trình chạy ngoài - Video bạn chọn không hỗ trợ trình chạy bên ngoài - Video này không có âm thanh khả dụng cho trình chạy ngoài + Luồng băng hình mà không được trình tải xuống hỗ trợ sẽ không hiển thị + Không có luồng băng hình nào khả dụng cho trình phát bên ngoài + Luồng phát đã chọn không được trình phát ngoài hỗ trợ + Không có luồng âm thanh nào khả dụng cho máy phát bên ngoài Chọn chất lượng cho trình chạy ngoài Định dạng không xác định (:P) Độ phân giải không xác định - Kích thước khoảng thời gian tải + Kích thước tải thời lượng phát lại Thể loại Câu hỏi thường gặp Xem trên website Nếu bạn gặp vấn đề khi sử dụng ứng dụng , hãy chắc chắn rằng bạn đã tìm kiếm các câu hỏi thường thấy ! Nhập hoặc xuất các kênh bạn đăng ký bằng cách nhấn nút 3 chấm ở góc trên màn hình Không thể sao chép vào khay nhớ tạm - Đã thêm khoảng thời gian %d trùng lặp (s) + Đã thêm trùng lặp %d lần Dạng thẻ Bạn đang dùng phiên bản mới nhất Tùy chọn này chỉ được bật khi chủ đề %s được dùng Nhấn để tải %s Chế độ tăng tốc - Danh sách này bị trùng lặp. + Danh sách phát màu xám thì đã chứa mục này. Hữu ích trong trường hợp phím bấm âm lượng trên tai nghe hoặc thiết bị của bạn bị hỏng Không nhận phím điều khiển âm lượng vật lý Loại bỏ mục trùng lặp Loại bỏ mục trùng lặp\? - Bạn có muốn loại bỏ tất cả các nguồn trùng nhau trong danh sách phát này\? - Hiện/Ẩn nguồn phát - Hiện các nguồn phát sau - Đã xem - Đã xem 1 phần - Bỏ đặt hình thumbnail - Thay đổi kích thước khoảng thời gian tải (tầm khoảng %s). Để ở giá trị thấp hơn có thể sẽ tăng tốc độ tải video hơn ban đầu. Khởi động lại trình phát để áp dụng thay đổi - Bản âm thanh đã có sẳn trong stream này - Sử dụng tính năng giải mã ExoPlayer dự phòng - Giải pháp thay thế này phát hành và khởi tạo lại codec video khi xảy ra thay đổi bề mặt, thay vì đặt trực tiếp bề mặt vào codec. Đã được ExoPlayer sử dụng trên một số thiết bị gặp sự cố, cài đặt này chỉ ảnh hưởng cho thiết bị chạy Android 6 trở lên + Bạn có muốn loại bỏ mọi luồng trùng lặp trong danh sách phát này\? + Hiện/Ẩn luồng phát + Hiển thị các luồng phát sau + Đã xem đầy đủ + Đã xem một phần + Bỏ đặt vĩnh viễn hình thu nhỏ + Thay đổi kích thước khoảng thời gian tải trên nội dung lũy tiến (hiện tại là %s). Giá trị thấp hơn có thể tăng tốc độ tải ban đầu của chúng + Một bản âm thanh đã có sẵn trong luồng này + Sử dụng tính năng bộ giải mã dự phòng của ExoPlayer + Giải pháp thay thế này giải phóng và khởi tạo lại codec băng hình khi xảy ra thay đổi bề mặt, thay vì thiết đặt trực tiếp bề mặt vào codec. Đã được ExoPlayer sử dụng trên một số thiết bị gặp sự cố này, thiết đặt này chỉ ảnh hưởng đến Android 6 trở lên \n -\nBật tùy chọn này có thể ngăn lỗi phát lại khi chuyển đổi trình phát video hiện tại hoặc chuyển sang chế độ toàn màn hình +\nBật tùy chọn này có thể ngăn lỗi phát lại khi chuyển đổi trình phát băng hình hiện tại hoặc chuyển sang chế độ toàn màn hình Bật tùy chọn này nếu bạn gặp sự cố khởi tạo bộ giải mã, vấn đề này sẽ quay trở lại bộ giải mã có mức độ ưu tiên thấp hơn nếu quá trình khởi tạo bộ giải mã chính thất bại. Điều này có thể dẫn đến hiệu suất phát lại kém hơn so với khi sử dụng bộ giải mã chính Luôn dùng biện pháp thay thế cho bề mặt đầu ra video cho ExoPlayer - Nguyên gốc - Phần mô tả - Lồng tiếng - Chọn âm thanh gốc bạn thích + nguyên gốc + mô tả + lồng tiếng + Ưu tiên âm thanh gốc Chọn bản âm thanh gốc kể cả nhiều ngôn ngữ - Âm thanh mô tả bạn thích - Chọn bản âm thanh có phần mô tả cho người kiếm thị nếu có - Chọn cử chỉ vuốt cho phía bên trái nửa màn hình của trình chơi + Ưu tiên âm thanh mô tả + Chọn một bản âm thanh có mô tả cho người khiếm thị nếu có + Chọn cử chỉ vuốt cho nửa bên trái màn hình của trình phát Hành động cho cử chỉ trái - Chọn cử chỉ vuốt cho phía bên phải nửa màn hình của trình chơi + Chọn cử chỉ vuốt cho nửa bên phải màn hình của trình phát Hành động cho cử chỉ phải Độ sáng Âm lượng Không Âm thanh: %s Bản âm thanh - Sắp đến + Sắp tới Không rõ - Chọn bản âm thanh cho trình phát ngoài - Cài đặt Exoplayer - Quản lý một số cài đặt trong Exoplayer. Hãy khởi động lại trình phát để áp dụng thay đổi + Chọn bản âm thanh cho máy phát bên ngoài + Thiết đặt ExoPlayer + Quản lý một số thiết đặt ExoPlayer. Những thay đổi này yêu cầu khởi động lại trình phát để có hiệu lực + Đang tải siêu dữ liệu… + Vị trí tab chính + Tìm nạp các tab kênh + Đường hầm phương tiện đã bị tắt theo mặc định trên thiết bị của bạn vì kiểu thiết bị của bạn được biết là không hỗ trợ tính năng này. + Các tab cần tìm nạp khi cập nhật nguồn cấp dữ liệu. Tùy chọn này không có hiệu lực nếu kênh được cập nhật bằng chế độ nhanh. + Hình đại diện của người tải lên + Di chuyển bộ chọn tab chính xuống dưới cùng + Không có luồng trực tiếp + Ảnh xem trước + Không có luồng + Các cuộn băng + Người đăng ký + Những thẻ nào được hiển thị trên các trang kênh + Thẻ kênh + Chuyển đổi hướng màn hình + Chuyển đổi toàn màn hình + Hình đại diện + %1$s %2$s + Luồng tiếp theo + Hình đại diện kênh phụ + Mở hàng chờ phát + Giới thiệu + Phát lại + Băng rôn + Danh sách phát + Phát + Lựa chọn khác + Thời lượng + Kênh + Luồng trước đó + Chất lượng ảnh + \? + Chia sẻ danh sách URL + Chia sẻ với Tiêu đề + %1$s +\n%2$s + Video ngắn + Chất lượng thấp + Không tải ảnh + Chất lượng cao + Chia sẻ danh sách phát + Tua đi + Album + Tua lại + Chia sẻ danh sách phát với các thông tin chi tiết như tên danh sách phát và tiêu đề video hoặc dưới dạng danh sách URL cuốn băng đơn giản + Chất lượng trung bình + - %1$s: %2$s + Chọn chất lượng hình ảnh và chọn có tải chất lượng ảnh hay không, để giảm mức sử dụng dữ liệu và bộ nhớ. Thay đổi xoá cache ảnh cho cả trong bộ nhớ lẫn ổ cứng - %s + Track + Trực tiếp + Chỉnh sửa từng hành động thông báo bên dưới bằng cách nhấn vào nó. Ba hành động đầu tiên (phát/tạm dừng, trước đó và tiếp theo) do hệ thống thiết lập và không thể tùy chỉnh. + Hiện ít hơn + Hiện nhiều hơn + + %s hồi đáp + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9a888c74d..89c215943 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -46,7 +46,6 @@ 仅一次 添加至 文件 - 加载封面 清空播放历史 最小化至后台播放 @@ -139,7 +138,6 @@ 反馈错误 错误 无法加载所有缩略图 - 无法解密视频的 URL 签名 无法解析网址 内容不可用 无法设置下载菜单 @@ -310,7 +308,6 @@ 该操作消耗大量流量, \n \n你想继续吗? - 关闭可禁止加载封面,节省流量和内存使用。切换该选项将立即清除内存与存储中的图片缓存 清空图像缓存成功 清空已缓存的元数据 清空已缓存的网页数据 @@ -396,7 +393,7 @@ 无法覆盖文件 已暂停下载包含此名称的任务 NewPipe 在处理文件时被关闭 - 设备上没有剩余储存空间 + 设备上没有剩余储存空间 进度丢失,文件已被删除 连接超时 是否清空下载记录或删除所有下载的文件? @@ -444,7 +441,7 @@ 应用语言 系统默认 完成后请点击“完成” - 完成 + 完成 视频 %d 秒 @@ -537,7 +534,7 @@ 随机播放 单曲循环 最多可以选择三个操作显示在紧凑通知中! - 点击编辑下面的每一个通知操作。使用右方的复选框选择在紧凑通知中显示的动作,最多可以选择三个 + 轻按下面的每一个通知操作进行编辑。使用右方的复选框选择在紧凑通知中显示的操作,最多可以选择三个。 第五操作按钮 第四操作按钮 第三操作按钮 @@ -595,7 +592,6 @@ 私享 未分类 公开 - 缩略图 URL 所在服务器 支持 语言 @@ -753,4 +749,54 @@ 媒体隧道功能在你的设备上默认停用,因为已知你的设备型号不支持它。 无直播 无音视频流 + 视频 + 订阅者 + 展示在频道页面上的标签页 + 频道标签页 + 短视频 + 正在加载元数据… + 获取频道标签页 + 关于 + 专辑 + 更新数据源时要获取的标签页。如果使用快速模式更新频道,则该选项无效果。 + 播放列表 + 歌曲 + 频道 + 直播 + 切换全屏方向 + 切换全屏 + 下一条串流 + 打开播放队列 + 前进 + 后退 + 重放 + 播放 + 更多选项 + 持续时间 + 上一条串流 + 图片质量 + + 低质量 + 头像 + 子频道头像 + 不加载图片 + 高质量 + 中等质量 + 上传者头像 + 横幅 + 选择图片质量以及是否根本不加载图片来降低数据和内存使用。更改选项会清除内存中和磁盘上的图片缓存 - %s + 缩略图 + 只包含视频网址 + 分享时带视频标题 + %1$s +\n%2$s + 分享播放列表 + 分享详细的播放列表(带名称和视频标题等信息)或只分享视频网址列表 + - %1$s: %2$s + + %s 条回复 + + 显示较多 + 显示较少 + 轻按下方的每个通知操作进行编辑。头三个动作(播放/暂停、上一个和下一个)是系统设置的,不能自定义。 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index b465d887d..c91731314 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -20,9 +20,9 @@ 顯示以 Kodi 媒體中心播放影片嘅選項 聲音 預設聲音檔案格式 - 主題 - 黑暗 - 明亮 + 主題色系 + 黑眼睛 + 白頭浪 下載 顯示「接續落」同「咁上下」嘅影片 唔支援呢個網址 @@ -44,10 +44,9 @@ 撳放大鏡開始。 內容 顯示年齡設限嘅內容 - 實況 + 直播 問題 載入唔晒全部縮圖 - 影片 URL 簽章解唔到碼 解析唔到網站 設定唔到下載功能表 啫係嗱,世事講唔埋嘅,真係唔好意思。 @@ -83,7 +82,7 @@ 顯示更高解像度 得某啲機先播到 2K/4K 影片 預設嘅影片檔案格式 - 純黑 + 紅日降 浮面播緊 全部嘢 App/界面閃退 @@ -149,17 +148,16 @@ 顯示喺通知嘅影片縮圖由 16:9 剪成 1:1 長寬比 通知色彩化 等 Android 根據縮圖嘅主色自訂通知嘅顏色 (注意:唔係部部機都用得) - 夜間 + 晚風色系 跳前/跳後嘅快轉長短 閂埋佢去隱藏影片描述同附加資訊 剔低睇過 開啟方式係 搜尋到嘅嘢係:%s 第五粒動作掣 - 撳下面嘅掣去更改對應嘅通知動作。用右手邊嘅格仔剔選最多三個,擺喺精簡通知度 + 撳下面嘅掣去更改對應嘅通知動作。用右手邊嘅格仔剔選最多三個,擺落去精簡通知度。 精簡通知最多淨係擺到三個動作! 循環播放 - 載入縮圖 顯示留言 關閉去隱藏留言 搜尋紀錄 @@ -168,7 +166,6 @@ 顯示描述 抹除咗影像快取 移除所有網頁嘅快取資料 - 關閉佢去避免載入條片嘅縮圖,慳返啲數據同埋用少啲 RAM。更改會抹走記憶體以及磁碟機上面嘅影像快取 粗略嘅快轉允許播放器比較籠統咁快轉去其他位置。快轉 5、15 或 25 秒就太仔細,做唔到 播放器 預設嘅國家內容 @@ -320,7 +317,7 @@ 未設定下載資料夾,請立即揀選預設嘅下載資料夾 刪除咗 1 個項目。 執執佢 - 搞掂 + 搞掂 NewPipe 專案非常著重你嘅私隱。因此,呢個 app 未得你同意係唔會收集任何資料。 \nNewPipe 嘅私隱政策會詳述,當你傳送彈 app 報告嗰陣,有咩資料會傳送同保存。 最近播放 @@ -457,7 +454,7 @@ 建立唔到呢個目的地資料夾 建立唔到安全連線 喺幕後開始播放 - 部機冇晒位 + 部機冇晒位 頂櫳重試幾多次 若然有機會用到流動數據嘅時候,可能會用得著,雖則有啲下載冇得暫停 輪住嚟下載 @@ -501,7 +498,7 @@ 呢部內容限區,喺你所在國家未有提供。 呢首 (至少喺你所在國家而言) 係 SoundCloud Go+ 單曲,因此 NewPipe 未能串流或下載。 呢部內容係私人嘢,因此 NewPipe 未能串流或下載。 - 自動 (跟返部機嘅主題色系) + 明或暗 (跟返部機嘅主題色系) 精選 廣播 你而家可以揀選喺描述入面嘅文字喇。不過要單聲先,喺揀選模式嘅時候,版面可能會有啲眨,同埋啲連結可能會撳唔到。 @@ -510,7 +507,6 @@ 分類 標籤 公開設定 - 縮圖 URL 公開 憑網址瀏覽 置頂留言 @@ -520,7 +516,7 @@ 主機 喺影片詳情撳一下「幕後播」或「浮面播」個掣嘅時候顯示提示 紀錄 - 歷史紀錄 + 紀錄 攝咗做下個播 記憶體洩露監測喺傾卸堆疊嘢嘅時候,或者會導致個 app 冇反應 閂埋選單 @@ -675,7 +671,7 @@ 啲圖都要騷 Picasso 三色碼顯示源頭:紅碼係網絡上高落嚟,藍碼係儲存喺磁碟本地,綠碼係潛伏喺記憶體中 服務原本嘅字會騷返喺串流項目上面 影像要推三色碼 - 若果播片嘅時候窒下窒下或者黑畫面,就停用多媒體隧道啦 + 若果播片嘅時候窒下窒下或者黑畫面,就停用多媒體隧道啦。 點樣用 Google 匯出嚟匯入 YouTube 訂閱: \n \n一、去呢個網址:%1$s @@ -705,7 +701,7 @@ 你已經用緊最新版本嘅 NewPipe 撳一下去下載 %s 唔再揀定封面縮圖 - 色系揀做%s 嘅時候至有得揀 + 主題色系揀做%s 嘅時候至有得揀 複製唔到去剪貼簿 一張張 灰咗嘅播放清單,即係已經有呢個項目。 @@ -724,13 +720,13 @@ 左手邊手勢動作 揀選右手邊播放器螢幕嘅手勢 右手邊手勢動作 - 亮度 - 聲音 - - 首選嘅原始聲音 - 首選嘅敘述性聲音 - 如果可以用嘅話,會為視障人士揀敘述性音軌 - 無論語言係咩,都揀選原始音軌 + 調整光暗度 + 音量 + 乜都唔使做 + 優先揀原聲 + 優先揀旁述 + 揀選為視障人士而設嘅旁述音軌 (如有提供) + 揀選原始音軌,唔理佢講咩話 聲音: %s 音軌 未知 @@ -740,11 +736,67 @@ 用 ExoPlayer 嘅解碼器汰退功能 如果遇到解碼器初始化問題,請啟用呢個選項,如果主解碼器初始化失敗,就會用優先順序較低的解碼器。咁樣可能會導致播放性能比使用主解碼器嗰陣差 幾時都用 Exoplayer嘅浮面影片輸出設定解決方法 - 原始嘅 - 配音嘅 - 敘述性 + 原聲 + 配音 + 旁述 為外面嘅播放器揀選音軌 呢個解決方法係喺發生表面變動嗰陣釋放同埋重新確認視訊編解碼器,而非直接將表面設定做編解碼器。ExoPlayer 已經喺部份有問題嘅裝置上使用了呢個設定,呢個設定僅係對 Android 6 或以上嘅更新版本有效。 \n \n啟用呢個選項可以避免喺切換現有視訊播放程式或切換到全螢幕時出現播放錯誤 + 啲圖嘅畫質 + 影片 + + 訂閱者 + 頻道頁要騷邊啲分頁出嚟 + 齋分享 URL 清單 + 分享埋片名 + %1$s +\n%2$s + 頻道分頁 + 短片 + 載入緊元資料… + 橫豎轉換 + 低畫質 + 主畫面分頁擺位 + 切換全螢幕 + 攞邊啲頻道分頁 + 頭像 + %1$s %2$s + 下一個串流 + 已知您部機個型號唔支援多媒體隧道,因此預設已經停用咗先。 + 子頻道嘅頭像 + 跳去排隊播 + 唔要載入啲圖 + 高畫質 + 簡介 + 分享播放清單 + 跳前 + 專輯 + 跳後 + 重播 + 更新摘要嘅時候要攞邊啲分頁返嚟。若果頻道用快速模式更新,就橫豎都無相干嘞。 + 分享播放清單要詳細包含播放清單個名同埋入面啲片名,定簡單得啲影片嘅 URL + 一般畫質 + 上載者嘅頭像 + 橫額 + 播放清單 + - %1$s:%2$s + 主畫面嘅分頁揀選搬落最底 + 無直播串流 + 揀選啲圖嘅畫質,定索性唔載入啲圖,去慳啲用數據同記憶體。更改會抹走記憶體同磁碟入面嘅影像快取 — %s + 播放 + 其他選項 + 縮圖 + 曲目 + 片長 + 無串流 + 頻道 + 上一個串流 + 直播 + + %s 個回覆 + + 摺埋 + 拉開 + 撳下面嘅掣去更改對應嘅通知動作。頭三個動作 (播放/暫停、上一個、下一個) 系統預設咗,冇得揀。 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 8eb964406..f2eb503ab 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1,6 +1,6 @@ - %1$s 發布 + 發布於%1$s 找不到串流播放器。要安裝 VLC 嗎? 安裝 取消 @@ -24,18 +24,18 @@ 顯示「用 Kodi 播放」的選項 預設音訊格式 主題 - 灰暗 - 明亮 + 深色 + 淺色 下載 顯示「下一部」與「相關」的影片 - 不支援此 URL + 不支援此網址 預設內容語言 影片與音訊 外觀 - 背景播放中 + 正在背景播放 網路錯誤 播放影片,持續時間: - 發佈者的個人頭像縮圖 + 發布者的頭像縮圖 喜歡 不喜歡 音訊下載資料夾 @@ -49,43 +49,42 @@ 顯示更高的解析度 僅部份裝置可播放 2K/4K 影片 預設影片格式 - 純黑 + 黑色 記住懸浮視窗屬性 記住上次使用時懸浮視窗的大小和位置 搜尋建議 選擇在搜尋時顯示建議 - 以懸浮視窗播放中 + 正在以懸浮視窗播放 內容 顯示年齡限制內容 下載 下載 - 錯誤回報 + 回報錯誤 全部 已停用 清除 最佳解析度 錯誤 無法載入所有縮圖 - 無法解析影片 URL 簽章 無法解析網站 內容無法使用 無法設定下載選單 - 應用程式或界面已停止運作 + 應用程式或介面已崩潰 抱歉,這是不該發生的。 透過電子郵件回報 - 抱歉,發生了一些問題。 + 抱歉,發生問題。 回報 資訊: 發生了什麼事: 發生了什麼:\\n請求:\\n內容語言:\\n內容國家:\\n應用程式語言:\\n服務:\\nGMT 時間:\\n套件:\\n版本:\\n系統版本: - 您的留言(請用英文): + 您的留言(請用英語): 詳細資訊: 影片 音訊 重試 - k + 百萬 - B + 十億 開始 暫停 刪除 @@ -97,7 +96,7 @@ NewPipe 下載中 輕觸以顯示詳細資訊 請稍候… - 已複製至剪貼簿 + 已複製到剪貼簿 稍後請在設定中選擇下載資料夾 使用懸浮視窗模式 \n需要此權限 @@ -112,9 +111,9 @@ 無法更新訂閱 訂閱清單 新鮮事 - 搜尋紀錄 - 在本機儲存搜尋紀錄 - 觀看紀錄 + 搜尋記錄 + 在本機儲存搜尋記錄 + 觀看記錄 記錄觀看過的影片 恢復播放 在干擾結束後繼續播放(例如有來電) @@ -143,18 +142,18 @@ 大部分的特殊字元 關於 NewPipe 第三方授權 - © %1$s 由 %2$s 使用 %3$s 授權條款發佈 + © %1$s 由 %2$s 使用 %3$s 授權條款發布 關於與常見問題 授權條款 Android 上自由且輕巧的串流播放器。 在 GitHub 上檢視 NewPipe 使用的授權條款 - 不管你有什麼點子——翻譯、設計、程式碼整理,或者程式碼撰寫——我們永遠歡迎你來幫忙。完成的越多,NewPipe 也會更好! + 不管你有什麼點子──翻譯、設計、程式碼整理,或者程式碼撰寫──我們永遠歡迎你來幫忙。完成的越多,NewPipe 也會更好! 閱讀授權條款 貢獻 - 歷史紀錄 - 歷史紀錄 - 確定要刪除此項搜尋紀錄嗎? + 歷史記錄 + 歷史記錄 + 確定要刪除此項搜尋記錄嗎? 找不到串流播放器(您可以安裝 VLC 來播放)。 顯示「長按以新增」提示 預設內容國家 @@ -176,7 +175,7 @@ 網站 匯入資料庫 匯出資料庫 - 覆蓋您目前的歷史記錄、訂閱與(可選的)設定 + 覆蓋您目前的歷史記錄、訂閱與設定(選用) 匯出歷史記錄、訂閱內容、播放清單、設定 回饋 如欲了解更多有關 NewPipe 的資訊和新聞,請造訪我們的網站。 @@ -189,7 +188,7 @@ 選擇互動導覽 已匯出 已匯入 - 無有效的 ZIP 檔案 + 無效的 ZIP 檔案 警告:無法匯入所有檔案。 這將覆蓋您目前的設定。 熱門 @@ -241,12 +240,12 @@ 報告週期不足錯誤 強制報告在處理完片段或活動週期外發生的無法傳遞的 Rx 異常 使用粗略但快速的尋找 - 粗略的尋找能讓播放器以降低的精確度更快找到影片的進度位置。尋找 5、15或25秒無法與其一同使用 + 粗略的尋找能讓播放器以降低的精確度更快找到影片的進度位置。尋找 5、15 或 25 秒無法與其一同使用 自動將下一部影片新增至佇列 透過加入相關的串流來繼續結束的(未重複)播放佇列 檔案 無效的資料夾 - 無效的檔案/內容來源 + 無效的檔案或內容來源 檔案名稱不能留空 發生錯誤: %1$s 匯入 @@ -263,11 +262,11 @@ \n \n1. 移至此網址:%1$s \n2. 當被提示時登入帳號 -\n3. 點擊「包含所有資料」,然後「取消選取全部」,然後僅選取「訂閱」並點擊「確定」 -\n4. 點擊「下一步」然後「建立匯出」 -\n5. 在「下載」按鈕出現後點擊它 +\n3. 按一下「包含所有資料」,接著「取消選取全部」,然後僅勾選「訂閱」並按一下「確定」 +\n4. 按一下「下一步」然後「建立匯出」 +\n5. 在「下載」按鈕出現後按一下它 \n6. 點擊下方的「匯入檔案」並選取已下載的 zip 檔案 -\n7. [若 zip 匯入失敗] 擷取 .csv 檔案(通常位於「YouTube 與 YouTube Music/訂閱/訂閱.csv」),點擊下方的「匯入檔案」並選取擷取的 csv 檔案 +\n7. [若 zip 匯入失敗] 擷取 .csv 檔案(通常位於「YouTube 與 YouTube Music/訂閱/訂閱.csv」),按一下下方的「匯入檔案」並選取擷取的 csv 檔案 yourID, soundcloud.com/yourid 請記住,此操作可造成昂貴網路花費。 \n @@ -278,18 +277,16 @@ \n2. 移至此網址: %1$s \n3. 當被提示時登入帳號 \n4. 複製您被重新導向到的個人設定檔網址。 - 載入縮圖 - 關閉以防止載入縮圖,減少數據和儲存空間的用量。改變時將清除記憶體和磁碟上的縮圖快取 - 已抹除圖片快取 - 抹除已快取的中介資料 + 已清除圖片快取 + 清除已快取的後設資料 移除所有已快取的網頁資料 - 已抹除中介資料快取 + 已清除後設資料快取 播放速度控制 節奏 音高 解除掛鉤(可能導致失真) 偏好的「開啟」動作 - 開啟內容時的預設動作 — %s + 開啟內容時的預設動作 ─ %s 沒有可供下載的串流 字幕 調整播放器字幕文字大小與背景樣式。必須重新啟動應用程式才會生效 @@ -298,10 +295,10 @@ 刪除所有觀看歷史記錄? 觀看歷史已刪除 清除搜尋歷史 - 刪除搜尋關鍵字的歷史 + 刪除搜尋關鍵字的記錄 刪除所有搜尋歷史記錄? - 搜尋歷史已刪除 - 已刪除 1 個項目。 + 搜尋記錄已刪除 + 已刪除一個項目。 NewPipe 是一個 Copyleft 的自由軟體:您可以隨意使用、研究、分享並改進它。在遵守由自由軟體基金會所發佈的 GNU 通用公共授權條款的狀況下,您可以自由地再散佈及/或修改它;授權條款預設使用第三版,但您也可以選擇更新的版本。 您是否要同時匯入設定? NewPipe 的隱私政策 @@ -315,7 +312,7 @@ 沒有限制 使用行動網路時限制解析度 切換 app 時最小化 - 從主影片播放器切換到其他 app 時要執行的動作 — %s + 從主影片播放器切換到其他 app 時要執行的動作 ─ %s 最小化為背景播放器 最小化為彈出式播放器 @@ -393,9 +390,9 @@ 無法覆寫檔案 已有擱置中的下載與此同名 NewPipe 在處理檔案時被關閉 - 裝置上沒有剩餘的空間 + 裝置上沒有剩餘的空間 進度遺失,因為檔案已被刪除 - 您想要清除您的下載歷史紀錄,還是刪除所有已下載的檔案? + 您想要清除您的下載歷史記錄,還是刪除所有已下載的檔案? 限制下載佇列 一次執行一個下載 開始下載 @@ -427,9 +424,9 @@ 選取您最愛的 PeerTube 站臺 在 %s 上找到您喜愛的站臺 新增站臺 - 輸入站臺 URL + 輸入站臺網址 無法驗證站臺 - 僅支援 HTTPS URL + 僅支援 HTTPS 網址 站臺已存在 本機 最近新增 @@ -438,13 +435,13 @@ 正在恢復 無法恢復此下載 選擇一個站臺 - 清除下載歷史紀錄 + 清除下載歷史記錄 刪除已下載的檔案 給予顯示在其他應用程式上層的權限 應用程式語言 系統預設值 解決後請按「完成」 - 完成 + 完成 影片 %d 秒 @@ -476,7 +473,7 @@ Feed Feed 更新閾值 - 上次更新後,訂閱被視為過時的時間 — %s + 上次更新後,訂閱被視為過時的時間 ─ %s 總是更新 在可用時從專用 feed 擷取 其在某些服務中可用,且通常較快速,但可能只會回傳有限的項目,而且資訊通常不完整(例如:沒有持續時間、項目類型、沒有即時狀態) @@ -519,17 +516,17 @@ 尚無播放清單書籤 播放清單頁面 選取播放清單 - 請檢查是否已有與您的應用程式當機相關的討論議題。當建立重複的工單時,您就是在耗費我們本來可以用來修復臭蟲的時間。 + 請檢查是否已有與您的應用程式崩潰相關的討論議題。當建立重複的客服單時,您就是在耗費我們本來可以用來修復錯誤的時間。 在 GitHub 上回報 複製格式化過的報告 目前顯示 %s 的結果 從不 僅在 Wi-Fi 上 - 自動開始播放 — %s + 自動開始播放 ─ %s 播放佇列 - 無法識別 URL。要用其他應用程式開啟嗎? + 無法識別此網址。要用其他應用程式開啟嗎? 自動佇列 - 作用中播放器的佇列可能會被取代 + 啟動中播放器的佇列可能會被取代 從一個播放器切換到另一個可能會取代您的佇列 清除佇列前要求確認 @@ -537,7 +534,7 @@ 隨機播放 循環播放 您可以選取最多三個動作來顯示在簡潔通知中! - 透過點擊下方的每一個通知來編輯它。使用右側的勾選框,最多可以選取三個在簡潔通知中顯示 + 透過輕觸下方的通知來編輯它。使用右側的勾選框,最多可以選取三個在簡潔通知中顯示。 第五動作按鈕 第四動作按鈕 第三動作按鈕 @@ -552,7 +549,7 @@ reCAPTCHA cookies 已被清除 清除 reCAPTCHA cookies YouTube 有提供「嚴格篩選模式」,可以隱藏潛在的成人內容 - 顯示可能不適於兒童的內容(因為其有年齡限制,如18歲以上等) + 顯示可能不適於兒童的內容,因為其有年齡限制(如 18 歲以上等) 讓 Android 根據縮圖中的主要色彩來自訂通知的顏色(請注意,此功能不是在所有裝置上都能正常運作) 彩色通知 於鎖定畫面背景與通知使用縮圖 @@ -584,9 +581,9 @@ 解決 下載已經開始 您可以在下方選取您最愛的夜間佈景主題 - 選取您最愛的夜間佈景主題 — %s + 選取您最愛的夜間佈景主題 ─ %s 自動(裝置佈景主題) - 夜間佈景主題 + 夜間布景主題 顯示頻道詳細資訊 如果您遇到黑畫面或影片播放停頓的現象,請停用媒體隧道。 停用媒體隧道 @@ -594,7 +591,6 @@ 私人 未列出 公開 - 縮圖 URL 主機 支援 語言 @@ -627,7 +623,7 @@ 高品質(較大) 拖動列縮圖預覽 被創作者加心號 - 標記為已看過 + 標記為已觀看 在圖片頂部顯示畢卡索彩色絲帶,指示其來源:紅色代表網路、藍色代表磁碟、綠色代表記憶體 顯示圖片指示器 遠端搜尋建議 @@ -660,7 +656,7 @@ 找不到適合此動作的檔案管理程式。 \n請安裝檔案管理程式或在下載設定嘗試停用「%s」 NewPipe 遇到錯誤,點擊以回報 - 發生錯誤,請檢視通知 + 發生錯誤,請查看通知 釘選的留言 LeakCanary 無法使用 ExoPlayer 預設值 @@ -673,7 +669,7 @@ 新串流通知 設定目前播放串流通知 需要網路連線 - 從磁碟抹除所有已下載的檔案? + 從磁碟清除所有已下載的檔案? 取得通知 新串流 關於訂閱的新串流通知 @@ -753,4 +749,54 @@ 因為您的裝置型號已知不支援媒體隧道,因此已預設停用。 無串流 無直播串流 + 影片 + 訂閱者 + 頻道頁面上顯示哪些分頁 + 頻道分頁 + 短片 + 正在載入後設資料…… + 擷取頻道分頁 + 關於 + 專輯 + 更新 feed 時要擷取的分頁。若使用快速模式更新頻道,則此選項無效。 + 播放清單 + 軌道 + 頻道 + 直播 + 切換螢幕方向 + 切換全螢幕 + 下一個串流 + 開啟播放佇列 + 快轉 + 倒帶 + 重播 + 播放 + 更多選項 + 持續時間 + 上一個串流 + 畫質 + 不要載入圖片 + 影片縮圖 + + 低品質 + 大頭照 + 子頻道大頭照 + 高品質 + 中等品質 + 上傳者大頭照 + 橫幅 + 選擇影像品質以及是否載入影像,以減少資料與記憶體使用。變更會清除記憶體中與磁碟上的影像快取 — %s + 分享 URL 清單 + 分享標題 + %1$s +\n%2$s + 分享播放清單 + 分享包含播放清單名稱與影片標題等詳細資訊的播放清單,或是僅作為簡單的影片 URL 清單 + - %1$s:%2$s + + %s 個回覆 + + 顯示更多 + 顯示較少 + 透過點擊下面的每個通知操作來編輯它。前三個動作(播放/暫停、上一個與下一個)由系統設定,無法自訂。 \ No newline at end of file diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 30efca080..3087d1fc2 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -124,6 +124,16 @@ 480p best_resolution + + 2160p + 1440p + + + + 2160p + 1440p + + @string/best_resolution_key 1080p60 @@ -398,8 +408,6 @@ clear_cookie - download_thumbnail_key - cache_wipe_key clear_play_history clear_playback_states @@ -1350,6 +1358,11 @@ 144p + + 2160p + 1440p + + list_view_mode @string/list_view_mode_auto_key @@ -1435,4 +1448,24 @@ media_tunneling_device_blacklist_version use_exoplayer_decoder_fallback_key always_use_exoplayer_set_output_surface_workaround_key + + + image_quality_key + image_quality_none + image_quality_low + image_quality_medium + image_quality_high + @string/image_quality_medium_key + + @string/image_quality_none + @string/image_quality_low + @string/image_quality_medium + @string/image_quality_high + + + @string/image_quality_none_key + @string/image_quality_low_key + @string/image_quality_medium_key + @string/image_quality_high_key + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1dbffa4ae..b9880282f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,7 +57,8 @@ Third action button Fourth action button Fifth action button - Edit each notification action below by tapping on it. Select up to three of them to be shown in the compact notification by using the checkboxes on the right + Edit each notification action below by tapping on it. Select up to three of them to be shown in the compact notification by using the checkboxes on the right. + Edit each notification action below by tapping on it. The first three actions (play/pause, previous and next) are set by the system and cannot be customized. You can select at most three actions to show in the compact notification! Repeat Shuffle @@ -85,8 +86,6 @@ The active player queue will be replaced Ignore hardware media button events Useful, for instance, if you are using a headset with broken physical buttons - Load thumbnails - Turn off to prevent loading thumbnails, saving data and memory usage. Changes clear both in-memory and on-disk image cache Show comments Turn off to hide comments Show \'Next\' and \'Similar\' videos @@ -232,7 +231,6 @@ Downloading to external SD card not possible. Reset download folder location? Network error Could not load all thumbnails - Could not deobfuscate video URL signature Could not parse website Content unavailable Could not set up download menu @@ -352,7 +350,7 @@ Press \"Done\" when solved reCAPTCHA challenge requested Solve - Done + Done Download Allowed characters in filenames @@ -545,6 +543,10 @@ 240p 144p + + 2160p + 1440p + New streams notifications Notify about new streams from subscriptions @@ -619,7 +621,8 @@ Not found Post-processing failed NewPipe was closed while working on the file - No space left on device + Not enough free space on device + No space left on device Progress lost, because the file was deleted Connection timeout Cannot recover this download @@ -760,9 +763,11 @@ Language Support Host - Thumbnail URL - Avatar URL - Banner URL + Thumbnails + Uploader avatars + Sub-channel avatars + Avatars + Banners Public Unlisted Private @@ -827,4 +832,23 @@ Duration Rewind Forward - \ No newline at end of file + Image quality + Choose the quality of images and whether to load images at all, to reduce data and memory usage. Changes clear both in-memory and on-disk image cache — %s + Do not load images + Low quality + Medium quality + High quality + \? + Share Playlist + Share playlist with details such as playlist name and video titles or as a simple list of video URLs + Share with Titles + Share URL list + - %1$s: %2$s + %1$s\n%2$s + + %s reply + %s replies + + Show more + Show less + diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml index dac5dccc1..2cdc6c545 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -85,11 +85,13 @@ app:singleLineTitle="false" app:iconSpaceReserved="false" /> - diff --git a/app/src/test/java/org/schabi/newpipe/local/subscription/FeedGroupIconTest.kt b/app/src/test/java/org/schabi/newpipe/local/subscription/FeedGroupIconTest.kt index 1479c3d1e..2fc44d9b7 100644 --- a/app/src/test/java/org/schabi/newpipe/local/subscription/FeedGroupIconTest.kt +++ b/app/src/test/java/org/schabi/newpipe/local/subscription/FeedGroupIconTest.kt @@ -9,7 +9,7 @@ class FeedGroupIconTest { fun `No gaps and repeated ids`() { val usedIds = HashSet() - for ((shouldBeId, currentIcon) in FeedGroupIcon.values().withIndex()) { + for ((shouldBeId, currentIcon) in FeedGroupIcon.entries.withIndex()) { val added = usedIds.add(currentIcon.id) assertTrue("Repeated ids (current item: ${currentIcon.name} - ${currentIcon.id})", added) @@ -24,7 +24,7 @@ class FeedGroupIconTest { fun `No icons pointing to the same attr`() { val usedIcons = HashSet() - for (groupIcon in FeedGroupIcon.values()) { + for (groupIcon in FeedGroupIcon.entries) { val added = usedIcons.add(groupIcon.drawableResource) assertTrue("Repeated icon (current item: ${groupIcon.name} - ${groupIcon.id})", added) } diff --git a/app/src/test/java/org/schabi/newpipe/util/image/ImageStrategyTest.java b/app/src/test/java/org/schabi/newpipe/util/image/ImageStrategyTest.java new file mode 100644 index 000000000..8c8bf6937 --- /dev/null +++ b/app/src/test/java/org/schabi/newpipe/util/image/ImageStrategyTest.java @@ -0,0 +1,195 @@ +package org.schabi.newpipe.util.image; + +import static org.junit.Assert.assertEquals; +import static org.schabi.newpipe.extractor.Image.HEIGHT_UNKNOWN; +import static org.schabi.newpipe.extractor.Image.WIDTH_UNKNOWN; +import static org.schabi.newpipe.util.image.ImageStrategy.choosePreferredImage; +import static org.schabi.newpipe.util.image.ImageStrategy.estimatePixelCount; + +import org.junit.Test; +import org.schabi.newpipe.extractor.Image; +import org.schabi.newpipe.extractor.Image.ResolutionLevel; + +import java.util.List; + +public class ImageStrategyTest { + + private static final List RESOLUTION_LEVELS = List.of( + ResolutionLevel.LOW, ResolutionLevel.MEDIUM, ResolutionLevel.HIGH); + + private Image img(final int height, final int width) { + return new Image("", height, width, ResolutionLevel.UNKNOWN); + } + + private Image img(final String url, final ResolutionLevel resolutionLevel) { + return new Image(url, HEIGHT_UNKNOWN, WIDTH_UNKNOWN, resolutionLevel); + } + + private Image img(final String url, + final int height, + final int width, + final ResolutionLevel resolutionLevel) { + return new Image(url, height, width, resolutionLevel); + } + + private void assertChoosePreferredImage(final String low, + final String medium, + final String high, + final List images) { + assertEquals(low, choosePreferredImage(images, PreferredImageQuality.LOW)); + assertEquals(medium, choosePreferredImage(images, PreferredImageQuality.MEDIUM)); + assertEquals(high, choosePreferredImage(images, PreferredImageQuality.HIGH)); + } + + + // CHECKSTYLE:OFF + @Test + public void testEstimatePixelCountAllKnown() { + assertEquals(20000.0, estimatePixelCount(img(100, 200), 1.0), 0.0); + assertEquals(20000.0, estimatePixelCount(img(100, 200), 12.0), 0.0); + assertEquals( 100.0, estimatePixelCount(img(100, 1), 12.0), 0.0); + assertEquals( 100.0, estimatePixelCount(img( 1, 100), 0.5), 0.0); + } + + @Test + public void testEstimatePixelCountHeightUnknown() { + assertEquals( 10000.0, estimatePixelCount(img(HEIGHT_UNKNOWN, 100), 1.0 ), 0.0); + assertEquals( 20000.0, estimatePixelCount(img(HEIGHT_UNKNOWN, 200), 2.0 ), 0.0); + assertEquals( 10.0, estimatePixelCount(img(HEIGHT_UNKNOWN, 1), 0.1 ), 0.0); + assertEquals(230400.0, estimatePixelCount(img(HEIGHT_UNKNOWN, 640), 16.0/9.0), 0.0); + } + + @Test + public void testEstimatePixelCountWidthUnknown() { + assertEquals( 10000.0, estimatePixelCount(img(100, WIDTH_UNKNOWN), 1.0 ), 0.0); + assertEquals( 20000.0, estimatePixelCount(img(200, WIDTH_UNKNOWN), 0.5 ), 0.0); + assertEquals( 12.0, estimatePixelCount(img( 1, WIDTH_UNKNOWN), 12.0 ), 0.0); + assertEquals(230400.0, estimatePixelCount(img(360, WIDTH_UNKNOWN), 16.0/9.0), 0.0); + } + + @Test + public void testEstimatePixelCountAllUnknown() { + assertEquals(0.0, estimatePixelCount(img(HEIGHT_UNKNOWN, WIDTH_UNKNOWN), 1.0 ), 0.0); + assertEquals(0.0, estimatePixelCount(img(HEIGHT_UNKNOWN, WIDTH_UNKNOWN), 12.0 ), 0.0); + assertEquals(0.0, estimatePixelCount(img(HEIGHT_UNKNOWN, WIDTH_UNKNOWN), 0.1 ), 0.0); + assertEquals(0.0, estimatePixelCount(img(HEIGHT_UNKNOWN, WIDTH_UNKNOWN), 16.0/9.0), 0.0); + } + // CHECKSTYLE:ON + + + @Test + public void testChoosePreferredImageAllKnown() { + // the resolution level of the images is more important than the actual resolution + assertChoosePreferredImage("a", "b", "c", List.of( + img("a", 1, 1, ResolutionLevel.LOW), + img("b", 200, 200, ResolutionLevel.MEDIUM), + img("c", 10000, 10000, ResolutionLevel.HIGH) + )); + assertChoosePreferredImage("a", "b", "c", List.of( + img("a", 10000, 10000, ResolutionLevel.LOW), + img("b", 200, 200, ResolutionLevel.MEDIUM), + img("c", 1, 1, ResolutionLevel.HIGH) + )); + + assertChoosePreferredImage("b", "c", "d", List.of( + img("a", 2, 1, ResolutionLevel.LOW), + img("b", 50, 25, ResolutionLevel.LOW), + img("c", 200, 100, ResolutionLevel.LOW), + img("d", 300, 150, ResolutionLevel.LOW) + )); + + assertChoosePreferredImage("c", "d", "d", List.of( + img("a", 2, 1, ResolutionLevel.MEDIUM), + img("b", 50, 25, ResolutionLevel.MEDIUM), + img("c", 60, 30, ResolutionLevel.MEDIUM), + img("d", 300, 150, ResolutionLevel.MEDIUM) + )); + } + + @Test + public void testChoosePreferredImageSomeKnown() { + // the resolution level of the images is more important than the actual resolution + assertChoosePreferredImage("a", "b", "c", List.of( + img("a", 1, WIDTH_UNKNOWN, ResolutionLevel.LOW), + img("b", HEIGHT_UNKNOWN, 200, ResolutionLevel.MEDIUM), + img("c", 10000, WIDTH_UNKNOWN, ResolutionLevel.HIGH) + )); + assertChoosePreferredImage("a", "b", "c", List.of( + img("a", HEIGHT_UNKNOWN, 10000, ResolutionLevel.LOW), + img("b", 200, WIDTH_UNKNOWN, ResolutionLevel.MEDIUM), + img("c", HEIGHT_UNKNOWN, 1, ResolutionLevel.HIGH) + )); + + assertChoosePreferredImage("b", "c", "d", List.of( + img("a", HEIGHT_UNKNOWN, 1, ResolutionLevel.HIGH), + img("b", 50, WIDTH_UNKNOWN, ResolutionLevel.HIGH), + img("c", HEIGHT_UNKNOWN, 120, ResolutionLevel.HIGH), + img("d", 340, WIDTH_UNKNOWN, ResolutionLevel.HIGH) + )); + + assertChoosePreferredImage("c", "d", "d", List.of( + img("a", 2, WIDTH_UNKNOWN, ResolutionLevel.MEDIUM), + img("b", HEIGHT_UNKNOWN, 50, ResolutionLevel.MEDIUM), + img("c", 60, WIDTH_UNKNOWN, ResolutionLevel.MEDIUM), + img("d", HEIGHT_UNKNOWN, 340, ResolutionLevel.MEDIUM) + )); + } + + @Test + public void testChoosePreferredImageMixed() { + for (final ResolutionLevel resolutionLevel : RESOLUTION_LEVELS) { + assertChoosePreferredImage("d", "b", "c", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("b", 200, 100, resolutionLevel), + img("c", 400, WIDTH_UNKNOWN, resolutionLevel), + img("d", HEIGHT_UNKNOWN, 50, resolutionLevel), + img("e", resolutionLevel) + )); + } + for (final ResolutionLevel resolutionLevel : RESOLUTION_LEVELS) { + assertChoosePreferredImage("b", "b", "b", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("b", 200, 100, resolutionLevel), + img("e", resolutionLevel) + )); + } + assertChoosePreferredImage("b", "b", "e", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("b", 200, 100, ResolutionLevel.LOW), + img("e", ResolutionLevel.HIGH) + )); + } + + @Test + public void testChoosePreferredImageAllUnknown() { + assertChoosePreferredImage("b", "c", "d", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("b", ResolutionLevel.LOW), + img("c", ResolutionLevel.MEDIUM), + img("d", ResolutionLevel.HIGH) + )); + assertChoosePreferredImage("c", "c", "d", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("c", ResolutionLevel.MEDIUM), + img("d", ResolutionLevel.HIGH) + )); + assertChoosePreferredImage("b", "c", "c", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("b", ResolutionLevel.LOW), + img("c", ResolutionLevel.MEDIUM) + )); + + // UNKNOWN is avoided as much as possible + assertChoosePreferredImage("d", "d", "d", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("d", ResolutionLevel.HIGH) + )); + assertChoosePreferredImage("b", "b", "b", List.of( + img("a", ResolutionLevel.UNKNOWN), + img("b", ResolutionLevel.LOW) + )); + assertChoosePreferredImage("a", "a", "a", List.of( + img("a", ResolutionLevel.UNKNOWN) + )); + } +} diff --git a/build.gradle b/build.gradle index f1c861c9f..6d19a6f8a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.8.22' + ext.kotlin_version = '1.9.10' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.1.1' + classpath 'com.android.tools.build:gradle:8.2.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/checkstyle/checkstyle.xml b/checkstyle/checkstyle.xml index e8c9d94ca..3377e3b84 100644 --- a/checkstyle/checkstyle.xml +++ b/checkstyle/checkstyle.xml @@ -69,6 +69,8 @@ + + diff --git a/doc/README.asm.md b/doc/README.asm.md index 8b2373514..2a7c10f51 100644 --- a/doc/README.asm.md +++ b/doc/README.asm.md @@ -7,7 +7,6 @@

    -


    স্ক্ৰীণশ্বট • @@ -19,16 +18,27 @@ FAQPress


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](/README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](/README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -সতৰ্কবাণী: এই এপটো নিৰ্মিয়মান অৱস্থাত আছে, গতিকে আপুনি ব্যৱহাৰ কৰোঁতে কোনো অসুবিধাৰ সন্মুখীন হ'ব পাৰে। যদি আপুনি অসুবিধাৰ সন্মুখীন হয়, ইছ্যু টেমপ্লেট পূৰণ কৰি আমাৰ GITHUB ৰিপ'জিটৰিত এটা ইছ্যু খোলক। - -NEWPIPE, GOOGLE PLAY ষ্ট'ৰত ৰাখিলে তেওঁলোকৰ চৰ্ত আৰু নিয়ম উলংঘা হয় +> [!warning] +> এই এপটো নিৰ্মিয়মান অৱস্থাত আছে, গতিকে আপুনি ব্যৱহাৰ কৰোঁতে কোনো অসুবিধাৰ সন্মুখীন হ'ব পাৰে। যদি আপুনি অসুবিধাৰ সন্মুখীন হয়, ইছ্যু টেমপ্লেট পূৰণ কৰি আমাৰ GITHUB ৰিপ'জিটৰিত এটা ইছ্যু খোলক। +> +> NEWPIPE, GOOGLE PLAY ষ্ট'ৰত ৰাখিলে তেওঁলোকৰ চৰ্ত আৰু নিয়ম উলংঘা হয় ## স্ত্ৰীনশ্বট -[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png)[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png)[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_03.png)[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_04.png)[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_05.png)[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_06.png)[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_07.png)[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_08.png)[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_09.png)[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_10.png)[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_11.png)[](fastlane/metadata/android/en-US/images/tenInchScreenshots/shot_12.png) - +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +

    +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ### সমৰ্থিত সেৱাসমূহ NewPipe এ বৰ্তমান এই সেৱাসমূহ সমৰ্থন কৰে: @@ -100,7 +110,7 @@ NewPipe এ আপুনি ব্যৱহাৰ কৰা সেৱাৰ অ ## অনুদান -যদি আপুনি NewPipe ভাল পায় তেন্তে অনুদান প্ৰেৰণ কৰিব পাৰে। আমি Liberapay পছন্দ কৰো, কাৰণ ই মুক্ত উৎস(Open Source) আৰু অলাভজনক(Non-profit) দুয়োটা। NewPipe লৈ দান দিয়াৰ বিষয়ে অধিক তথ্যৰ বাবে অনুগ্ৰহ কৰি আমাৰ [ৱেবচাইট](https://newpipe.net/donate) চাওক.
    Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
    Bitcoin Bitcoin QR code 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
    Bountysource Visit NewPipe at bountysource.com Check out how many bounties you can earn.
    +যদি আপুনি NewPipe ভাল পায় তেন্তে অনুদান প্ৰেৰণ কৰিব পাৰে। আমি Liberapay পছন্দ কৰো, কাৰণ ই মুক্ত উৎস(Open Source) আৰু অলাভজনক(Non-profit) দুয়োটা। NewPipe লৈ দান দিয়াৰ বিষয়ে অধিক তথ্যৰ বাবে অনুগ্ৰহ কৰি আমাৰ [ৱেবচাইট](https://newpipe.net/donate) চাওক.
    Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
    ## গোপনীয়তা নীতি diff --git a/doc/README.de.md b/doc/README.de.md index e5aecca13..e269da05c 100644 --- a/doc/README.de.md +++ b/doc/README.de.md @@ -13,33 +13,33 @@ -


    ScreenshotsUnterstützte DiensteBeschreibungFeaturesInstallation und UpdatesBeitragSpendenLizenz

    WebsiteBlogFAQÜber NewPipe


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -WARNUNG: DIESE APP BEFINDET SICH IN EINER BETA-PHASE, DAHER KÖNNTEST DU BUGS BEGEGNEN. FALLS DIES PASSIERT, ERSTELLE EIN ISSUE (AUF ENGLISCH) IN UNSEREM GITHUB REPOSITORY, INDEM DU DIE VORLAGE DORT AUSFÜLLST. - -NEWPIPE, ODER JEGLICHEN FORK DAVON, IM GOOGLE PLAYSTORE ANZUBIETEN, VERLETZT DESSEN GESCHÄFTSBEDINGUNGEN. +> [!warning] +> DIESE APP BEFINDET SICH IN EINER BETA-PHASE, DAHER KÖNNTEST DU BUGS BEGEGNEN. FALLS DIES PASSIERT, ERSTELLE EIN ISSUE (AUF ENGLISCH) IN UNSEREM GITHUB REPOSITORY, INDEM DU DIE VORLAGE DORT AUSFÜLLST. +> +> NEWPIPE, ODER JEGLICHEN FORK DAVON, IM GOOGLE PLAYSTORE ANZUBIETEN, VERLETZT DESSEN GESCHÄFTSBEDINGUNGEN. ## Screenshots -[](fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## Unterstützte Dienste @@ -143,16 +143,6 @@ Für weitere Informationen über Spenden an NewPipe, besuche unsere [Website](ht Gehe zu NewPipe auf liberapay.com Spenden mit Liberapay - - Bitcoin - Bitcoin QR Code - 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh - - - Bountysource - Gehe zu NewPipe auf bountysource.com - Sieh nach, wie viel Bounties du bekommen kannst. - ## Privacy Policy diff --git a/doc/README.es.md b/doc/README.es.md index 29356cdcd..b6a00e9d3 100644 --- a/doc/README.es.md +++ b/doc/README.es.md @@ -10,7 +10,6 @@ -


    @@ -18,11 +17,12 @@

    Sitio WebBlogPreguntas FrecuentesPrensa


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -AVISO: ESTA ES UNA VERSIÓN BETA, POR LO TANTO, PUEDES ENCONTRAR BUGS. SI ENCUENTRAS UNO ABRA UN ISSUE A TRAVÉS DE NUESTRO REPOSITORIO DE GITHUB. - -COLOCAR NEWPIPE O CUALQUIER FORK DE NEWPIPE EN LA GOOGLE PLAY STORE VIOLARÁ SUS TÉRMINOS Y CONDICIONES. +> [!warning] +> ESTA ES UNA VERSIÓN BETA, POR LO TANTO, PUEDES ENCONTRAR BUGS. SI ENCUENTRAS UNO ABRA UN ISSUE A TRAVÉS DE NUESTRO REPOSITORIO DE GITHUB. +> +> COLOCAR NEWPIPE O CUALQUIER FORK DE NEWPIPE EN LA GOOGLE PLAY STORE VIOLARÁ SUS TÉRMINOS Y CONDICIONES. ## Capturas de Pantalla @@ -115,21 +115,11 @@ Si quiere involucrarse, fíjese en nuestras [notas de contribución](../.github/ Si te gusta NewPipe, estaremos felices con una donación. Puede enviar bitcoin o donar a través de Bountysource o Liberapay. Visita nuestro [sitio web](https://newpipe.net/donate) para más información. - - - - - - - - - -
    BitcoinCódigo QR del Bitcoin16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
    Liberapay Visita NewPipe en liberapay.com Dona vía Liberapay
    BountysourceVisita NewPipe en bountysource.comRevisa cuántas recompensas puedes obtener.
    ## Política de Privacidad diff --git a/doc/README.fr.md b/doc/README.fr.md index dd752b051..7d4673b69 100644 --- a/doc/README.fr.md +++ b/doc/README.fr.md @@ -10,18 +10,18 @@ -


    Captures d'écranServices SupportésDescriptionFonctionnalitésInstallation et mises à jourContribuerDonsLicence

    SiteBlogFAQPresse


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -ATTENTION: CETTE APP EST EN BETA, VOUS POUVEZ DONC RENCONTRER DES BUGS. SI C'EST LE CAS, OUVREZ UNE ISSUE DANS NOTRE DÉPÔT GITHUB EN REMPLISSANT LE MODÈLE D'ISSUE. - -METTRE NEWPIPE, OU N'IMPORTE QUEL FORK DE NEWPIPE, SUR LE GOOGLE PLAY STORE ENFREINT LEURS CONDITIONS D'UTILISATION +> [!warning] +> CETTE APP EST EN BETA, VOUS POUVEZ DONC RENCONTRER DES BUGS. SI C'EST LE CAS, OUVREZ UNE ISSUE DANS NOTRE DÉPÔT GITHUB EN REMPLISSANT LE MODÈLE D'ISSUE. +> +> METTRE NEWPIPE, OU N'IMPORTE QUEL FORK DE NEWPIPE, SUR LE GOOGLE PLAY STORE ENFREINT LEURS CONDITIONS D'UTILISATION ## Captures d'écran @@ -123,16 +123,6 @@ Si vous aimez NewPipe, vous êtes invités à envoyer un don. Nous préferons Li Visitez NewPipe sur liberapay.com Donnez via Liberapay - - Bitcoin - QR code Bitcoin - 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh - - - Bountysource - Visitez NewPipe sur bountysource.com - Regardez combien de primes vous pouvez gagner. - ## Politique de confidentialité diff --git a/doc/README.hi.md b/doc/README.hi.md index 7ce4605ea..282e75420 100644 --- a/doc/README.hi.md +++ b/doc/README.hi.md @@ -10,18 +10,18 @@ -


    ऐप कैसी दिखती हैविवरणसुविधाएँस्थापित करना और अपडेट करनायोगदान करेंआर्थिक योगदान करेंलाइसेंस

    वेबसाइटब्लॉगसाधारण सवाल-जवाबप्रेस


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -चेतावनी: यह एक बीटा संस्करण है, तो अगर आपको इसमें बग्स नज़र आते हैं, कृपया हमारे GitHub रिपॉज़िटरी के ज़रिए एक समस्या खोल दें। - -NewPipe या इसके किसी फोर्क को Google Play Store पर डालने पर Store के नियमों और शर्तों का उल्लंघन होता है। +> [!warning] +> यह एक बीटा संस्करण है, तो अगर आपको इसमें बग्स नज़र आते हैं, कृपया हमारे GitHub रिपॉज़िटरी के ज़रिए एक समस्या खोल दें। +> +> NewPipe या इसके किसी फोर्क को Google Play Store पर डालने पर Store के नियमों और शर्तों का उल्लंघन होता है। ## ऐप कैसी दिखती है @@ -115,21 +115,11 @@ NewPipe पर कई सेवाएँ उपलब्ध हैं। हम अगर आपको NewPipe पसंद है, एक छोटे-से दान से हम खुश होंगे। आप या तो बिटकॉइन भेज सकते हैं या फिर Bountysource या Liberapay से दान कर सकते हैं। NewPipe को दान करने के बारे में अधिक जानकारी के लिए कृपया हमारी [वेबसाइट](https://newpipe.net/donate) देखें। - - - - - - - - - -
    Bitcoinबिटकॉइन पर दान करने के लिए QR कोड16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
    Liberapay liberapay.com पर NewPipe को देखें Liberapay के ज़रिए दान करें
    Bountysourcebountysource.com पर NewPipe को देखेंदेखें कि आप कितने बाउंटी कमा सकते हैं।
    ## गोपनीयता और शर्तें diff --git a/doc/README.it.md b/doc/README.it.md index 76b90318e..55ae12380 100644 --- a/doc/README.it.md +++ b/doc/README.it.md @@ -10,18 +10,18 @@ -


    ScreenshotServizi SupportatiDescrizioneFunzionalitàInstallazione e aggiornamentiContribuireDonareLicenza

    SitoBlogFAQStampa


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -ATTENZIONE: QUEST'APP È IN BETA, QUINDI POTRESTI IMBATTERTI IN BUG. SE COSÌ FOSSE, APRI UN'ISSUE SUL NOSTRO REPOSITORIO GITHUB COMPILANDO IL TEMPLATE ISSUE. - -METTERE NEWPIPE, O QUALSIASI SUA FORK, NEL GOOGLE PLAY STORE, VIOLA I LORO TERMINI E CONDIZIONI. +> [!warning] +> QUEST'APP È IN BETA, QUINDI POTRESTI IMBATTERTI IN BUG. SE COSÌ FOSSE, APRI UN'ISSUE SUL NOSTRO REPOSITORIO GITHUB COMPILANDO IL TEMPLATE ISSUE. +> +> METTERE NEWPIPE, O QUALSIASI SUA FORK, NEL GOOGLE PLAY STORE, VIOLA I LORO TERMINI E CONDIZIONI. ## Screenshot @@ -123,16 +123,6 @@ Se ti piace NewPipe, le donazioni sono benvenute. Preferiamo Liberapay, siccome Visita NewPipe su liberapay.com Dona via Liberapay - - Bitcoin - Codice QR Bitcoin - 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh - - - Bountysource - Visita NewPipe su bountysource.com - Scopri quanti <i>bounty</i> puoi guadagnare. - ## Privacy Policy diff --git a/doc/README.ja.md b/doc/README.ja.md index 81be7e0d1..4d0f348f6 100644 --- a/doc/README.ja.md +++ b/doc/README.ja.md @@ -10,18 +10,18 @@ -


    スクリーンショット説明機能インストールと更新貢献寄付ライセンス

    ウェブサイトブログFAQニュース


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -注意: これはベータ版のため、バグが発生する可能性があります。もしバグが発生した場合、GitHub のリポジトリで Issue を開いてください。 - -NewPipe 及びいずれのフォークを Google Play ストアに公開すると、Google の取引条件の違反になります。 +> [!warning] +> これはベータ版のため、バグが発生する可能性があります。もしバグが発生した場合、GitHub のリポジトリで Issue を開いてください。 +> +> NewPipe 及びいずれのフォークを Google Play ストアに公開すると、Google の取引条件の違反になります。 ## スクリーンショット @@ -120,21 +120,11 @@ NewPipe は複数のサービスに対応しています。[ドキュメント]( もし、NewPipe を気に入っていただけたら、寄付をしていただけると嬉しいです。Bitcoin または Bountysource, Liberapay から寄付をすることができます。NewPipe への寄付については、[ウェブサイト](https://newpipe.net/donate)からお願いします。 - - - - - - - - - -
    BitcoinBitcoin QR コード16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
    Liberapay liberapay.com で NewPipe を訪れる Liberapay で寄付
    Bountysourcebountysource.com で NewPipe を訪れるあなたがどれほどの寄付を得られるのか確認しましょう。
    ## プライバシーポリシー diff --git a/doc/README.ko.md b/doc/README.ko.md index 03b6fdfbb..dd9eb7705 100644 --- a/doc/README.ko.md +++ b/doc/README.ko.md @@ -10,18 +10,18 @@ -


    ScreenshotsDescriptionFeaturesUpdatesContributionDonateLicense

    WebsiteBlogFAQPress


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -경고: 이 버전은 베타 버전이므로, 버그가 발생할 수도 있습니다. 만약 버그가 발생하였다면, 우리의 GitHub 저장소에서 Issue를 열람하여 주십시오. - -NewPipe 또는 NewPipe 포크를 구글 플레이스토어에 올리는 것은 그들의 이용약관을 위반합니다. +> [!warning] +> 이 버전은 베타 버전이므로, 버그가 발생할 수도 있습니다. 만약 버그가 발생하였다면, 우리의 GitHub 저장소에서 Issue를 열람하여 주십시오. +> +> NewPipe 또는 NewPipe 포크를 구글 플레이스토어에 올리는 것은 그들의 이용약관을 위반합니다. ## 스크린샷 @@ -115,21 +115,11 @@ NewPipe는 서비스의 공식 API를 이용하여 정보를 받아오는 방식 만약 NewPipe가 마음에 들었다면, 우리는 기부에 대해 기꺼이 환영합니다. bitcoin을 보내거나, Bountysource 또는 Liberapay를 통해 기부할 수 있습니다. NewPipe에 기부하는 것에 대한 자세한 정보를 원한다면, 우리의 [웹사이트](https://newpipe.net/donate)를 방문하여 주십시오. - - - - - - - - - -
    BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
    Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
    BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.
    ## 개인정보 보호 정책 diff --git a/doc/README.pa.md b/doc/README.pa.md index 65e817b4e..321e6b7d0 100644 --- a/doc/README.pa.md +++ b/doc/README.pa.md @@ -10,18 +10,18 @@ -


    ਸਕਰੀਨਸ਼ਾਟਸੇਵਾਵਾਂਵਰਣਨਵਿਸ਼ੇਸ਼ਤਾਵਾਂਇੰਸਟਾਲੇਸ਼ਨ ਅਤੇ ਅੱਪਡੇਟਯੋਗਦਾਨਦਾਨਲਾਈਸੈਂਸ

    ਵੈੱਬਸਾਈਟਬਲੌਗਆਮ ਸਵਾਲ ਜਵਾਬਪ੍ਰੈਸ


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -ਚੇਤਾਵਨੀ: ਇਹ ਐਪ ਬੀਟਾ ਵਿੱਚ ਹੈ, ਇਸ ਲਈ ਤੁਸੀਂ ਬੱਗ ਦਾ ਸਾਹਮਣਾ ਕਰ ਸਕਦੇ ਹੋ। ਜੇਕਰ ਤੁਸੀਂ ਅਜਿਹਾ ਕਰਦੇ ਹੋ, ਤਾਂ ਟੈਮਪਲੇਟ ਨੂੰ ਭਰ ਕੇ ਸਾਡੀ ਗਿਟਹੱਬ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਇੱਕ ਮੁੱਦਾ ਖੋਲ੍ਹੋ - -ਗੂਗਲ ਪਲੇ ਸਟੋਰ ਵਿੱਚ ਨਿਊਪਾਈਪ ਜਾਂ ਇਸ ਦਾ ਕੋਈ ਵੀ ਫੋਰਕ ਲਗਾਉਣਾ ਉਹਨਾਂ ਦੇ ਨਿਯਮਾਂ ਅਤੇ ਸ਼ਰਤਾਂ ਦੀ ਉਲੰਘਣਾ ਕਰਦਾ ਹੈ। +> [!warning] +> ਇਹ ਐਪ ਬੀਟਾ ਵਿੱਚ ਹੈ, ਇਸ ਲਈ ਤੁਸੀਂ ਬੱਗ ਦਾ ਸਾਹਮਣਾ ਕਰ ਸਕਦੇ ਹੋ। ਜੇਕਰ ਤੁਸੀਂ ਅਜਿਹਾ ਕਰਦੇ ਹੋ, ਤਾਂ ਟੈਮਪਲੇਟ ਨੂੰ ਭਰ ਕੇ ਸਾਡੀ ਗਿਟਹੱਬ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਇੱਕ ਮੁੱਦਾ ਖੋਲ੍ਹੋ +> +> ਗੂਗਲ ਪਲੇ ਸਟੋਰ ਵਿੱਚ ਨਿਊਪਾਈਪ ਜਾਂ ਇਸ ਦਾ ਕੋਈ ਵੀ ਫੋਰਕ ਲਗਾਉਣਾ ਉਹਨਾਂ ਦੇ ਨਿਯਮਾਂ ਅਤੇ ਸ਼ਰਤਾਂ ਦੀ ਉਲੰਘਣਾ ਕਰਦਾ ਹੈ। ## ਸਕਰੀਨਸ਼ਾਟ @@ -120,16 +120,6 @@ NewPipe ਤੁਹਾਡੇ ਦੁਆਰਾ ਵਰਤੀ ਜਾ ਰਹੀ ਸੇ liberapay.com 'ਤੇ NewPipe ਨੂੰ ਵੇਖੋ Donate via Liberapay - - Bitcoin - ਬਿਟਕੋਇਨ 'ਤੇ ਦਾਨ ਕਰਨ ਲਈ QR ਕੋਡ - 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh - - - Bountysource - bountysource.com 'ਤੇ NewPipe ਨੂੰ ਵੇਖੋ - ਦੇਖੋ ਕਿ ਤੁਸੀਂ ਕਿੰਨੇ ਇਨਾਮ ਕਮਾ ਸਕਦੇ ਹੋ। - ## ਗੋਪਨੀਅਤਾ ਨੀਤੀ diff --git a/doc/README.pl.md b/doc/README.pl.md index 16577cb4d..64f75eaea 100644 --- a/doc/README.pl.md +++ b/doc/README.pl.md @@ -10,18 +10,18 @@ -


    ScreenshotyOpisFunkcjeInstalacja i aktualizacjeWkładWesprzyjLicencja

    StronaBlogFAQPress


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -UWAGA: TO JEST WERSJA BETA, WIĘC MOŻESZ NAPOTKAĆ BŁĘDY. JEŚLI TAK SIĘ STANIE, OTWÓRZ NOWY "ISSUE" NA GITHUBIE. - -PUBLIKOWANIE NEWPIPE LUB JAKIEGOKOLWIEK JEGO FORKU W SKLEPIE PLAY NARUSZA ICH WARUNKI UŻYTKOWANIA. +> [!warning] +> TO JEST WERSJA BETA, WIĘC MOŻESZ NAPOTKAĆ BŁĘDY. JEŚLI TAK SIĘ STANIE, OTWÓRZ NOWY "ISSUE" NA GITHUBIE. +> +> PUBLIKOWANIE NEWPIPE LUB JAKIEGOKOLWIEK JEGO FORKU W SKLEPIE PLAY NARUSZA ICH WARUNKI UŻYTKOWANIA. ## Screenshoty @@ -112,21 +112,11 @@ Jeśli chcesz pomóc, przeczytaj [Notkę o wkładzie](../.github/CONTRIBUTING.md Jeśli podoba Ci się NewPipe, bardzo ucieszylibyśmy się z dotacji. Możesz wysłać bitcoin lub przekazać darowiznę przez Bountysource lub Liberapay. Po więcej informacji o darowiznach dla NewPipe, proszę zobacz naszą [stronę](https://newpipe.net/donate). - - - - - - - - - -
    BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
    Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
    BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.
    ## Polityka prywatności diff --git a/doc/README.pt_BR.md b/doc/README.pt_BR.md index 7e1605dcd..01fa718ad 100644 --- a/doc/README.pt_BR.md +++ b/doc/README.pt_BR.md @@ -11,18 +11,18 @@ -


    ScreenshotsDescriçãoCaracterísticasAtualizaçõesContribuiçãoDoarLicença

    SiteBlogFAQPress


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -AVISO: ESTA É UMA VERSÃO BETA, PORTANTO, VOCÊ PODE ENCONTRAR BUGS. ENCONTROU ALGUM, ABRA UM ISSUE ATRAVÉS DO NOSSO REPOSITÓRIO GITHUB. - -COLOCAR NEWPIPE OU QUALQUER FORK DELE NA GOOGLE PLAY STORE VIOLA SEUS TERMOS E CONDIÇÕES. +> [!warning] +> ESTA É UMA VERSÃO BETA, PORTANTO, VOCÊ PODE ENCONTRAR BUGS. ENCONTROU ALGUM, ABRA UM ISSUE ATRAVÉS DO NOSSO REPOSITÓRIO GITHUB. +> +> COLOCAR NEWPIPE OU QUALQUER FORK DELE NA GOOGLE PLAY STORE VIOLA SEUS TERMOS E CONDIÇÕES. ## Screenshots @@ -112,21 +112,11 @@ Se você quiser se envolver, verifique nossa [notas de contribuição](../.githu Se você gosta de NewPipe, ficaríamos felizes com uma doação. Você pode enviar bitcoin ou doar via Bountysource ou Liberapay. Para obter mais informações sobre como doar para a NewPipe, visite nosso [site](https://newpipe.net/donate). - - - - - - - - - -
    BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
    Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
    BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.
    ## Política de Privacidade diff --git a/doc/README.ro.md b/doc/README.ro.md index f7d5db9d5..40e61e015 100644 --- a/doc/README.ro.md +++ b/doc/README.ro.md @@ -10,18 +10,18 @@ -


    Capturi de ecranDescriereFuncţiiInstalare şi actualizăriContribuţieDonaţiLicenţă

    WebsiteBlogFAQPresă


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -Atenţionare: ACEASTA ESTE O VERSIUNE BETA, AŞA CĂ S-AR PUTE SĂ ÎNTÂLNIŢI ERORI. DACĂ SE ÎNTÂMPLĂ ACEST LUCRU, DESCHIDEŢI UN ISSUE PRIN REPSITORY-UL NOSTRU GITHUB. - -PUNERA NEWPIPE SAU ORICĂRUI FORK AL ACESTUIA ÎN MAGAZINUL GOOGLE PLAY LE ÎNCALCĂ TERMENII ŞI CONDIŢIILE. +> [!warning] +> ACEASTA ESTE O VERSIUNE BETA, AŞA CĂ S-AR PUTE SĂ ÎNTÂLNIŢI ERORI. DACĂ SE ÎNTÂMPLĂ ACEST LUCRU, DESCHIDEŢI UN ISSUE PRIN REPSITORY-UL NOSTRU GITHUB. +> +> PUNERA NEWPIPE SAU ORICĂRUI FORK AL ACESTUIA ÎN MAGAZINUL GOOGLE PLAY LE ÎNCALCĂ TERMENII ŞI CONDIŢIILE. ## Capturi de ecran @@ -115,21 +115,11 @@ Dacă doriţi să vă implicaţi, accesaţi [notele noastre de contribuţie](../ Dacă vă place NewPipe, am fi bucuroşi să primim o donaţie. Puteţi să ne trimiteţi bitcoin sau să ne donaţi cu Bountysource sau Liberapay. Pentru mai multe informaţii în legătură cu donaţiile către NewPipe, vă rugăm vizitaţi [website-ul nostru](https://newpipe.net/donate). - - - - - - - - - -
    BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
    Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
    BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.
    ## Politica de Confidenţialitate diff --git a/doc/README.ru.md b/doc/README.ru.md index d13a04776..35058c981 100644 --- a/doc/README.ru.md +++ b/doc/README.ru.md @@ -10,18 +10,18 @@ -


    СкриншотыПоддерживаемые сервисыОписаниеВозможностиУстановка и обновленияУчастиеПожертвованиеЛицензия

    СайтБлогЧЗВПресса


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -ВНИМАНИЕ: ЭТО ПРИЛОЖЕНИЕ НАХОДИТСЯ В СТАДИИ БЕТА, ПОЭТОМУ ВЫ МОЖЕТЕ ОБНАРУЖИТЬ ОШИБКИ. ЕСЛИ ЭТО СЛУЧИТСЯ, ОТКРОЙТЕ ВОПРОС В НАШЕМ РЕПОЗИТОРИИ GITHUB, ЗАПОЛНЯ ЕГО ПО ШАБЛОНУ. - -РАЗМЕЩЕНИЕ NEWPIPE ИЛИ ЕГО ОТВЕТВЛЕНИЙ В МАГАЗИНЕ GOOGLE PLAY НАРУШАЕТ ИХ УСЛОВИЯ И ПОЛОЖЕНИЯ. +> [!warning] +> ЭТО ПРИЛОЖЕНИЕ НАХОДИТСЯ В СТАДИИ БЕТА, ПОЭТОМУ ВЫ МОЖЕТЕ ОБНАРУЖИТЬ ОШИБКИ. ЕСЛИ ЭТО СЛУЧИТСЯ, ОТКРОЙТЕ ВОПРОС В НАШЕМ РЕПОЗИТОРИИ GITHUB, ЗАПОЛНЯ ЕГО ПО ШАБЛОНУ. +> +> РАЗМЕЩЕНИЕ NEWPIPE ИЛИ ЕГО ОТВЕТВЛЕНИЙ В МАГАЗИНЕ GOOGLE PLAY НАРУШАЕТ ИХ УСЛОВИЯ И ПОЛОЖЕНИЯ. ## Скриншоты @@ -121,16 +121,6 @@ NewPipe работает, извлекая необходимые данные Посетите NewPipe на liberapay.com Пожертвование через Liberapay - - Bitcoin - QR-код Bitcoin - 16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh - - - Bountysource - Посетите NewPipe на bountysource.com - Проверьте, сколько наград вы можете заработать. - ## Политика конфиденциальности diff --git a/doc/README.ryu.md b/doc/README.ryu.md index f68645b07..22ac6343d 100644 --- a/doc/README.ryu.md +++ b/doc/README.ryu.md @@ -10,18 +10,18 @@ -


    スクリーンショットしちめいちぬーインストールとぅこうしんこうきんちーふライセンス

    ウェブサイトブログFAQニュース


    -*ふかぬぎんぐっしゆむん: [English](../README.md), [Español](README.es.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [うちなーぐち](README.ryu.md)。* +*ふかぬぎんぐっしゆむん: [English](../README.md), [Español](README.es.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -ちゅうい:くれーベータばんぬたみ、バグぬはっせいすがのうゆいがあいびーん。むしバグぬはっせいさーあい、GitHubぬリポジトリっしIssueふぃらちくぃみそーれー。 - -NewPipeうゆびいじりぬフォークGoogle Playストアんかいかんかいしーねー、Googleぬとぅいふぃちじょうきんぬいはんになります。 +> [!warning] +> くれーベータばんぬたみ、バグぬはっせいすがのうゆいがあいびーん。むしバグぬはっせいさーあい、GitHubぬリポジトリっしIssueふぃらちくぃみそーれー。 +> +> NewPipeうゆびいじりぬフォークGoogle Playストアんかいかんかいしーねー、Googleぬとぅいふぃちじょうきんぬいはんになります。 ## スクリーンショット @@ -120,21 +120,11 @@ NewPipeーふくすんぬサービスんかいたいおうそーいびーん。[ むし、NewPipeちーがんじいただけいねー、ちーふしいただけいねーうっさいびーん。BitcoinあらんでぃBountysource,Liberapayからちーふするくとぅがなやびーん。NewPipeんかいどぅちふにちいてー、[ウェブサイト](https://newpipe.net/donate)からうにげーさびら。 - - - - - - - - - -
    BitcoinBitcoin QR コード16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
    Liberapay liberapay.comっしNewPipeちゅーん Liberapayなちーふ
    Bountysourcebountysource.comっしNewPipeちゅーんうんじゅがじるふどぅどぅちふいらりーるぬがかくにんさびら。
    ## プライバシーポリシー diff --git a/doc/README.so.md b/doc/README.so.md index 5407b1ab4..1d3351256 100644 --- a/doc/README.so.md +++ b/doc/README.so.md @@ -10,18 +10,18 @@ -


    Sawir-shaashadeedFaahfaahinWaxqabadkaKushubida iyo cusboonaysiintaKusoo KordhinUgu DeeqLaysinka

    Website-kaMaqaaladaSu'aalaha Aalaa La-iswaydiiyoWarbaahinta


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](doc/README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -DIGNIIN: MIDKAN, NOOCA APP-KA EE HADDA WALI TIJAABO AYUU KU JIRAA, SIDAA DARTEED CILLADO AYAAD LA KULMI KARTAA. HADAAD LA KULANTO, KA FUR ARIN SHARAXAYA QAYBTANADA ARRIMAHA EE GITHUB-KA. - -NEWPIPE AMA KUWA KU SALAYSAN IN PLAYSTORE-KA LA GALIYO WAXAY KA HOR IMANAYSAA SHARCIGA IYO SHURUUDAHA AY LEEYIHIIN. +> [!warning] +> MIDKAN, NOOCA APP-KA EE HADDA WALI TIJAABO AYUU KU JIRAA, SIDAA DARTEED CILLADO AYAAD LA KULMI KARTAA. HADAAD LA KULANTO, KA FUR ARIN SHARAXAYA QAYBTANADA ARRIMAHA EE GITHUB-KA. +> +> NEWPIPE AMA KUWA KU SALAYSAN IN PLAYSTORE-KA LA GALIYO WAXAY KA HOR IMANAYSAA SHARCIGA IYO SHURUUDAHA AY LEEYIHIIN. ## Sawir-shaashadeed @@ -110,21 +110,11 @@ Hadaad jeceshahay inaad qayb ka noqoto, fiiri [ogaysiisyada kusoo kordhinta](../ Hadaad jeceshahay NewPipe waan ku faraxsanaan lahayn deeq. Waxaad soo diri kartaa bitcoin ama sidoo kale waxaad deeqda kusoo diri kartaa xaga Bountysource ama Liberapay. Faahfaahin dheeraad ah oo kusaabsan ugu deeqida NewPipe, fadlan booqo [website-kanaga](https://newpipe.net/donate). - - - - - - - - - -
    BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
    Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
    BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.
    ## Siyaasada Sirdhawrka diff --git a/doc/README.sr.md b/doc/README.sr.md new file mode 100644 index 000000000..7f0ee65b7 --- /dev/null +++ b/doc/README.sr.md @@ -0,0 +1,131 @@ +

    Планирамо да препишемо велике делове кода, како бисмо створили нови, модеран и стабилан NewPipe!

    +

    Немојте сада слати захтеве за нове функције, прихватаће се само захтеви за исправљање грешака.

    + +

    +

    NewPipe

    +

    Бесплатна и лагана апликација за стримовање за Android.

    + +

    Набавите на F-Droid

    + +

    + + + + + +

    +
    +

    Снимци екранаПодржане услугеОписКарактеристикеИнсталација и ажурирањаДоприносДонацијаЛиценца

    +

    Веб-сајтБлогЧППШтампа

    +
    + +*Прочитајте овај документ на другим језицима: [Deutsch](README.de.md), [English](README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [Српски](README.sr.md)* + +> [!warning] +> ОВА АПЛИКАЦИЈА ЈЕ У БЕТА ВЕРЗИЈИ, ТАКО ДА МОЖЕТЕ НАИЋИ НА ГРЕШКЕ. АКО НАИЂЕТЕ, НАПИШИТЕ ИЗВЕШТАЈ У НАШЕМ GITHUB РЕПОЗИТОРИЈУМУ ПОПУЊАВАЊЕМ ШАБЛОНА ИЗВЕШТАЈА. +> +> ПОСТАВЉАЊЕ АПЛИКАЦИЈЕ NEWPIPE ИЛИ БИЛО КОГ ЊЕНОГ ФОРКА, У GOOGLE PLAY ПРОДАВНИЦУ КРШИ ЊИХОВЕ УСЛОВЕ И ОДРЕДБЕ. + +## Снимци екрана + +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +

    +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) + +### Подржане услуге + +NewPipe тренутно подржава ове услуге: + + +* YouTube ([веб-сајт](https://www.youtube.com/)) и YouTube Music ([веб-сајт](https://music.youtube.com/)) ([вики](https://en.wikipedia.org/wiki/YouTube)) +* PeerTube ([веб-сајт](https://joinpeertube.org/)) и све његове инстанце (отворите веб-сајт да бисте сазнали шта то значи!) ([вики](https://en.wikipedia.org/wiki/PeerTube)) +* Bandcamp ([веб-сајт](https://bandcamp.com/)) ([вики](https://en.wikipedia.org/wiki/Bandcamp)) +* SoundCloud ([веб-сајт](https://soundcloud.com/)) ([вики](https://en.wikipedia.org/wiki/SoundCloud)) +* media.ccc.de ([веб-сајт](https://media.ccc.de/)) ([вики](https://en.wikipedia.org/wiki/Chaos_Computer_Club)) + +Као што видите, NewPipe подржава више видео и аудио услуга. Иако је почело са YouTube-ом, други људи су додали више услуга током година, чинећи NewPipe све разноврснијим! + +Делимично због околности, а делимично због своје популарности, YouTube је најбоље подржан од ових услуга. Ако користите или сте упознати са било којом од ових других услуга, помозите нам да побољшамо подршку за њих! Тражимо одржаваоце за SoundCloud и PeerTube. + +Ако намеравате да додате нову услугу, прво нас контактирајте! Наши [документи](https://teamnewpipe.github.io/documentation/) пружају више информација о томе како се нова услуга може додати у апликацију и у [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor). + +## Опис + +NewPipe ради тако што преузима потребне податке из званичног API-ја (нпр. PeerTube) услуге коју користите. Ако је званични API ограничен (нпр. YouTube) за наше сврхе или је власнички, апликација анализира веб-сајт или уместо тога користи унутрашњи API. То значи да вам није потребан налог ни на једној услузи да бисте користили NewPipe. + +Такође, пошто су бесплатни и отвореног кода, ни апликација, ни Extractor не користе никакве власничке библиотеке или радне оквире, као што су Google Play услуге. То значи да можете да користите NewPipe на уређајима или прилагођеним ROM-овима који немају инсталиране Google апликације. + +### Карактеристике + + * Гледајте видео снимке у резолуцијама до 4К + * Слушајте аудио снимке у позадини, само учитавајући аудио стрим да бисте сачували податке + * Искачући режим (плутајући плејер, познат као „Слика у слици”) + * Гледајте стримове уживо + * Прикажите/сакријте титлове/скривене титлове + * Претражујте видео и аудио снимке (на YouTube-у можете одредити и језик садржаја) + * Ставите видео снимке у ред чекања (и опционо их сачувајте као локалне плејлисте) + * Прикажите/сакријте опште информације о видео снимцима (као што су опис и ознаке) + * Прикажите/сакријте следеће/сродне видео снимке + * Прикажите/сакријте коментаре + * Претражујте видео снимке, аудио снимке, канале, плејлисте и албуме + * Прегледајте видео и аудио снимке унутар канала + * Претплатите се на канале (да, без пријављивања на било који налог!) + * Добијајте обавештења о новим видео снимцима са канала на које сте претплаћени + * Креирајте и уређујте групе канала (за лакше прегледање и управљање) + * Прегледајте фидове видео снимака генерисане из ваших група канала + * Прегледајте и претражујте историју гледања + * Претражујте и гледајте плејлисте (ово су даљинске плејлисте, што значи да се преузимају са услуге коју прегледате) + * Направите и уређујте локалне плејлисте (оне се креирају и чувају у апликацији и немају никакве везе са било којом услугом) + * Преузмите видео снимке/аудио снимке/титлове (скривене титлове) + * Отварајте у Kodi-ју + * Гледајте/блокирајте старосно ограничени материјал + +## Инсталација и ажурирања +Можете да инсталирате NewPipe користећи један од следећих начина: + 1. Додајте наш прилагођени репозиторијум на F-Droid и инсталирајте га одатле. Упутства су овде: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ + 2. Преузмите APK са [GitHub издања](https://github.com/TeamNewPipe/NewPipe/releases) и инсталирајте га. + 3. Ажурирајте преко F-Droid-а. Ово је најспорији начин добијања ажурирања, јер F-Droid мора да препозна промене, да направи сам APK, да га потпише, а затим да ажурирање пошаље корисницима. + 4. Сами направите APK за отклањање грешака. Ово је најбржи начин да добијете нове функције на свом уређају, али је много компликованији, па препоручујемо да користите неки од других начина. + 5. Ако сте заинтересовани за одређену функцију или исправку грешке која се налази у захтеву за повлачење у овом репозиторијуму, такође можете преузети његов APK из захтева за повлачење. Прочитајте опис захтева за повлачење за упутства. Одлична ствар у вези са APK-овима специфичним за захтев за повлачење је то што су инсталирани упоредо са званичном апликацијом, тако да не морате да бринете да ћете изгубити своје податке или нешто забрљати. + +Препоручујемо 1. начин за већину корисника. APK-ови инсталирани коришћењем 1. или 2. начина су компатибилни један са другим (што значи да ако сте инсталирали NewPipe користећи било који 1. или 2. начин, можете, такође, да ажурирате NewPipe користећи други начин), али не и са онима инсталираним коришћењем 3. начина. То је због истог кључа за потписивање (нашег) који се користи за 1. и 2. начин, али се други кључ за потписивање (F-Droid-ови) користи за 3. начин. Израда APK-а за отклањање грешака коришћењем 4. начина искључује кључ у потпуности. Кључеви за потписивање помажу да се осигура да корисник не буде преварен да инсталира злонамерно ажурирање за апликацију. Када користите 5. начин, сваки APK је потписан различитим, насумичним кључем који обезбеђује GitHub Actions, тако да не можете ни да га ажурирате. Мораћете да направите резервну копију и вратите податке апликације сваки пут када желите да користите нови APK. + +У међувремену, ако желите да промените изворе из неког разлога (нпр. основна функционалност NewPipe-а се прекида, а F-Droid још увек нема најновије ажурирање), препоручујемо вам да следите ову процедуру: 1. Направите резервну копију података преко Подешавања > Садржај > Извези базу података, да бисте задржали своју историју, претплате и листе песама 2. Деинсталирајте NewPipe 3. Преузмите APK са новог извора и инсталирајте га 4. Увезите податке из 1. корака преко Подешавања > Садржај > Увези базу података + +Напомена: када увозите базу података у званичну апликацију, увек се уверите да је то она коју сте извезли _из_ званичне апликације. Ако увезете базу података извезену из APK-а, који није званична апликација, то може покварити ствари. Таква радња није подржана и требало би да то урадите само када сте потпуно сигурни да знате шта радите. + +## Допринос +Без обзира да ли имате идеје, преводе, промене дизајна, чишћење кода или чак велике промене кода, помоћ је увек добродошла. Апликација постаје све боља и боља са сваким доприносом, без обзира колико је он велики или мали! Ако желите да се укључите, погледајте наше [напомене о доприносима](.github/CONTRIBUTING.md). + + +Статус превода + + +## Донација +Ако вам се свиђа NewPipe, можете послати донацију. Више волимо Liberapay, јер је отвореног кода и непрофитан. За више информација о донирању апликацији NewPipe, посетите наш [веб-сајт](https://newpipe.net/donate). + + + + + + + +
    LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
    + +## Политика приватности + +Пројекат NewPipe има за циљ да обезбеди приватно, анонимно искуство за коришћење медијских услуга заснованих на вебу. Стога, апликација не прикупља никакве податке без вашег пристанка. Политика приватности апликације NewPipe детаљно објашњава који се подаци шаљу и чувају када пошаљете извештај о отказивању или оставите коментар на нашем блогу. Документ можете пронаћи [овде](https://newpipe.net/legal/privacy/). + +## Лиценца +[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) + +NewPipe је бесплатан софтвер: можете га користити, проучавати, делити и побољшавати по жељи. Конкретно, можете га редистрибуирати и/или модификовати под условима [GNU General Public License](https://www.gnu.org/licenses/gpl.html), коју је објавила Фондација за слободни софтвер, било верзију 3 лиценце или (по вашем избору) било коју каснију верзију. diff --git a/doc/README.tr.md b/doc/README.tr.md index d51144e56..d8accd5a7 100644 --- a/doc/README.tr.md +++ b/doc/README.tr.md @@ -10,18 +10,18 @@ -


    Ekran fotoğraflarıAçıklamaÖzelliklerKurulum ve güncellemelerKatkıda bulunmaBağışLisans

    Web sitesiBlogSSSBasın


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](doc/README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -UYARI: BU SÜRÜM BETA SÜRÜMÜDÜR, BU NEDENLE HATALARLA KARŞILAŞABİLİRSİNİZ. HATA BULURSANIZ BU GITHUB DEPOSUNDA BUNU BİLDİRİN. - -GOOGLE PLAY STORE'A NEWPIPE VEYA BAŞKA BİR KOPYASINI KOYMAK, PLAY STORE ŞARTLARINI VE KOŞULLARINI İHLAL EDER. +> [!warning] +> BU SÜRÜM BETA SÜRÜMÜDÜR, BU NEDENLE HATALARLA KARŞILAŞABİLİRSİNİZ. HATA BULURSANIZ BU GITHUB DEPOSUNDA BUNU BİLDİRİN. +> +> GOOGLE PLAY STORE'A NEWPIPE VEYA BAŞKA BİR KOPYASINI KOYMAK, PLAY STORE ŞARTLARINI VE KOŞULLARINI İHLAL EDER. ## Ekran görüntüleri @@ -114,21 +114,11 @@ Eğer yer almak istiyorsanız, [katkı sağlayanlar için hazırladığımız no NewPipe'ı beğendiyseniz, yapacağınız bağışlar bizi motive eder. Bitcoin gönderebilir veya Bountysource veya Liberapay aracılığıyla bağış yapabilirsiniz. NewPipe'a bağış yapma hakkında daha fazla bilgi için lütfen [web sitemizi](https://newpipe.net/donate) ziyaret edin. - - - - - - - - - -
    BitcoinBitcoin QR kodu16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
    Liberapay liberapay.com üzerinde NewPipe'ı ziyaret edin Liberapay aracılığıyla bağış yapın
    Bountysourcebountysource.com üzerinde NewPipe'ı ziyaret edinNe kadar ödül kazanabileceğinizi kontrol edin.
    ## Gizlilik politikası diff --git a/doc/README.zh_TW.md b/doc/README.zh_TW.md index 476bd9eb8..445618b1c 100644 --- a/doc/README.zh_TW.md +++ b/doc/README.zh_TW.md @@ -10,18 +10,18 @@ -


    截圖說明功能安裝與更新貢獻捐款授權憑證

    網站部落格FAQ媒體


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](doc/README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md)* +*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md)* -警告:這是測試版本,可能會發生錯誤。如果遇到錯誤,請在我們的 GITHUB REPO 開 ISSUE 回報。 - -將 NEWPIPE 或其任何分支上傳至 GOOGLE PLAY 商店違反了他們的使用者合約。 +> [!warning] +> 這是測試版本,可能會發生錯誤。如果遇到錯誤,請在我們的 GITHUB REPO 開 ISSUE 回報。 +> +> 將 NEWPIPE 或其任何分支上傳至 GOOGLE PLAY 商店違反了他們的使用者合約。 ## 截圖 @@ -120,21 +120,11 @@ NewPipe 支援多種服務。我們的[使用文件](https://teamnewpipe.github. 若你喜歡 NewPipe 我們歡迎捐款。你可以使用 bitcoin ,也能在 Bountysource 或 Liberapay 上捐款。 更多關於捐款資訊,請見我們的[網站](https://newpipe.net/donate)。 - - - - - - - - - -
    BitcoinBitcoin QR code16A9J59ahMRqkLSZjhYj33n9j3fMztFxnh
    Liberapay Visit NewPipe at liberapay.com Donate via Liberapay
    BountysourceVisit NewPipe at bountysource.comCheck out how many bounties you can earn.
    ## 隱私權政策 diff --git a/fastlane/metadata/android/ar/changelogs/995.txt b/fastlane/metadata/android/ar/changelogs/995.txt new file mode 100644 index 000000000..3995ca6eb --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/995.txt @@ -0,0 +1,16 @@ +جديد +• دعم علامات التبويب القناة +• تحديد جودة الصورة +• الحصول على العناوين لجميع الصور + +تحسين +• إمكانية الوصول إلى واجهات المشغل +• اختيار أفضل للصوت لتنزيلات الفيديو فقط +• خيار لتضمين قائمة التشغيل وأسماء الفيديو لمحتوى قائمة التشغيل المشتركة + +مُثَبَّت +• [يوتيوب] إصلاح جلب عدد الإعجابات +• إصلاح عدم استجابة المشغل للنوافذ المنبثقة والأعطال +• اختيار لغات خاطئة في منتقي اللغة +• تركيز صوت المشغل لم يكن يحترم كتم الصوت +• إضافة عنصر قائمة التشغيل لا يعمل في بعض الأحيان diff --git a/fastlane/metadata/android/ar/changelogs/996.txt b/fastlane/metadata/android/ar/changelogs/996.txt new file mode 100644 index 000000000..1dd4e3de5 --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/996.txt @@ -0,0 +1,2 @@ +تم إصلاح NullPointerException عند فتح قناة / مؤتمر في media.ccc.de. +حاول احدهم كسر الهدية التي قدمناها لك، لكننا تخطينا الأمر. diff --git a/fastlane/metadata/android/bg/changelogs/64.txt b/fastlane/metadata/android/bg/changelogs/64.txt new file mode 100644 index 000000000..f5ece1568 --- /dev/null +++ b/fastlane/metadata/android/bg/changelogs/64.txt @@ -0,0 +1,6 @@ +### Подобрения +-Добавена е възможността да се ограничи качеството на видеото ако се използва мобилен интернет. #1339 +- Запаметява яркостта за сесията #1442 +- Оптимизиране при изтегляне с по-слаби процесори #1431 +### Поправени +- Поправен срив при отваряне на изтегления #1441 diff --git a/fastlane/metadata/android/bn/changelogs/64.txt b/fastlane/metadata/android/bn/changelogs/64.txt index d5e5901e5..e76c3130e 100644 --- a/fastlane/metadata/android/bn/changelogs/64.txt +++ b/fastlane/metadata/android/bn/changelogs/64.txt @@ -1,5 +1,5 @@ ### অগ্রগতিসমূহ -- মোবাইল ডাটা ব্যবহার করার সময় ভিডিও মানের সীমা নির্ধারণ করা যাবে। #1339। +- মোবাইল ডাটা ব্যবহার করার সময় ভিডিও মানের সীমা নির্ধারণ করা যাবে। #1339। - প্লেয়ারের উজ্জ্বলতা মনে রাখুন #1442। - দুর্বল সিপিইউর ডিভাইসে পারফরম্যান্স উন্নত করা হয়েছে #1431। - মিডিয়া সেশন এখন সঠিকভাবে কাজ করে #1433। diff --git a/fastlane/metadata/android/cs/changelogs/995.txt b/fastlane/metadata/android/cs/changelogs/995.txt new file mode 100644 index 000000000..222437b3a --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/995.txt @@ -0,0 +1,16 @@ +Nové +• Podpora karet kanálů +• Výběr kvality obrázků +• Získání URL všech obrázků + +Vylepšeno +• Přístupnost rozhraní přehrávače +• Lepší výběr zvuku pro stahování videa +• Možnost přidat název playlistů a videí do obsahu sdíleného playlistu + +Opraveno +• [YouTube] Opraveno získání počtů líbí se +• Opraveny popupy neodpovídání přehrávače a pády +• Výběr nesprávných jazyků ve výběru jazyka +• Zaměření zvuku přehrávače nerespektovalo ztlumení +• Přidávání položek do playlistů někdy nefungovalo diff --git a/fastlane/metadata/android/cs/changelogs/996.txt b/fastlane/metadata/android/cs/changelogs/996.txt new file mode 100644 index 000000000..a220330bc --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/996.txt @@ -0,0 +1,2 @@ +Opravena chyba NullPointerException při otevírání kanálu / konference na media.ccc.de. +Ježíšek nám málem doručil rozbitý dárek pro vás, ale opravili jsme to. diff --git a/fastlane/metadata/android/de/changelogs/63.txt b/fastlane/metadata/android/de/changelogs/63.txt index 1fdd53b55..3ccc56bc0 100644 --- a/fastlane/metadata/android/de/changelogs/63.txt +++ b/fastlane/metadata/android/de/changelogs/63.txt @@ -5,4 +5,4 @@ - Alles über DSGVO hinzugefügt #1420 ### Repariert -- Downloader: Absturz beim Laden unvollendeter Downloads aus .giga-Dateien behoben #1407 +- Downloader: Absturz beim Laden unvollendeter Downloads von .giga-Dateien behoben #1407 diff --git a/fastlane/metadata/android/de/changelogs/65.txt b/fastlane/metadata/android/de/changelogs/65.txt index 8190e9ae9..6815d432a 100644 --- a/fastlane/metadata/android/de/changelogs/65.txt +++ b/fastlane/metadata/android/de/changelogs/65.txt @@ -1,10 +1,10 @@ Verbesserungen --Menü Animation deaktiviert #1486 + +-Menüanimation deaktiviert #1486 -Löschen von Downloads rückgängig machen #1472 --Option zum Downloaden im Austausch Menu #1498 --hinzufügen der Teilen Funktion im Menü #1454 --Minimieren der Wiedergabe beim beenden #1354 +-Option zum Downloaden im Teilen-Menü #1498 +-hinzufügen der Teilen-Funktion im Menü #1454 +-Minimieren der Wiedergabe beim Beenden #1354 -Datenbank Versions Aktualisierung und Datenbestand Wiederherstellung #1510 -ExoPlayer 2.8.2 aktualisiert #1392 --Überarbeitung der Wiedergabegeschwindigkeitskolntrolle um Änderungen besser zu unterstützen --hinzufügen der Möglichkeit Stille zu überspringen(Hilfreich bei Audiobücher und einigen Musik Arten) unterstützt dadurch eine nahtlose Wiedergabe (nicht so toll bei Liedern in denen es auch Stille Passagen gibt) +-Überarbeitung der Wiedergabegeschwindigkeitskontrolle um Änderungen besser zu unterstützen. diff --git a/fastlane/metadata/android/de/changelogs/66.txt b/fastlane/metadata/android/de/changelogs/66.txt new file mode 100644 index 000000000..937bfd642 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/66.txt @@ -0,0 +1,18 @@ +# Versionsänderung von v0.13.7 + +### Behebungen +- Probleme der Filterung von v.0.13.6 behoben + +# Versionsänderung von v0.13.6 + +### Verbesserungen + +- Animation der Burgermenü-Icon entfernt #1486 +- Löschen von Downloads rückgängig machen #1472 +- Im "Teilen"-Tab die Download option hinzugefügt #1498 +- Option "Teilen" zum Long-Tap-Menü hinzugefügt #1454 + +### Behebungen + +- Probleme mit dem kaputten Video Info layout behoben. #1440 / #1491 +- Probleme mit dem Verlauf wurden behoben. #1497. diff --git a/fastlane/metadata/android/de/changelogs/68.txt b/fastlane/metadata/android/de/changelogs/68.txt new file mode 100644 index 000000000..6cdbd55a0 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/68.txt @@ -0,0 +1,19 @@ +# Änderungen von v0.14.1 + +### Fixed +- nicht entschlüsselt Video url #1659 +- Beschreibungs Link nicht extrahierbar #1657 + +# Änderungen von v0.14.0 + +### New +- Neues Schubladendesign #1461 +- Neue anpassbare Titelseite #1461 + +### Verbesserungen +- Reworked Gesture Controls #1604 +- Neue Möglichkeit, den Popup-Player #1597 zu schließen + +### Fixed +- Fehler beheben, wenn die Anzahl der Abonnements nicht verfügbar ist. Schließt #1649. +- Zeigen Sie "Abonnentenzählung nicht verfügbar" in diesen Fällen. diff --git a/fastlane/metadata/android/de/changelogs/69.txt b/fastlane/metadata/android/de/changelogs/69.txt new file mode 100644 index 000000000..8802508a3 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/69.txt @@ -0,0 +1,14 @@ +### New +- Long-tap Löschen & Teilen in Abonnements #1516 +- Tablet UI & Rasterlistenlayout #1617 + +### Verbesserungen +- Speichern und Nachladen des zuletzt verwendeten Seitenverhältnisses #1748 +- Separate Einstellungen für Lautstärke & Helligkeitsgesten #1644 + +### Fixes +- Anzahl der Abonnements +- Foreground Service Erlaubnis für API 28+ Geräte #1830 hinzugefügt + +### Known Bugs +- Wiedergabe kann nicht auf Android P gespeichert werden diff --git a/fastlane/metadata/android/de/changelogs/70.txt b/fastlane/metadata/android/de/changelogs/70.txt new file mode 100644 index 000000000..59a09b210 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/70.txt @@ -0,0 +1,10 @@ +ACHTUNG: Diese Version ist wahrscheinlich ein Bugfest. + +### Verbesserungen +* heruntergeladene Dateien können mit einem Klick #1879 geöffnet werden +* Drop-Unterstützung für Android 4.1 - 4.3 #1884 +* Streams aus der aktuellen Warteschlange entfernt, indem sie nach rechts swipen #1915 + +### Fixed +* Crash mit Standard-Auflösung eingestellt auf beste und begrenzte mobile Datenauflösung #1835 +* Pop-up-Spieler-Absturz behoben #1874 diff --git a/fastlane/metadata/android/de/changelogs/71.txt b/fastlane/metadata/android/de/changelogs/71.txt new file mode 100644 index 000000000..0132de3c3 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/71.txt @@ -0,0 +1,8 @@ +### Verbesserungen +* App-Update-Benachrichtigung für GitHub build hinzufügen (#1608 von @krtkush) +* Verschiedene Verbesserungen des Downloaders (#1944 von @kapodamy): +* Fügen Sie fehlende weiße Icons hinzu und verwenden Sie hardcored Weg, um die Icon Farben zu ändern +* neue MPEG-4 muxer fixieren nicht-synchrone Video- und Audiostreams (#2039) + +### Fixed +* YouTube Live-Streams spielen nach kurzer Zeit (#1996 von @yausername) diff --git a/fastlane/metadata/android/de/changelogs/740.txt b/fastlane/metadata/android/de/changelogs/740.txt new file mode 100644 index 000000000..0d28a157a --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/740.txt @@ -0,0 +1,12 @@ +

    Verbesserungen

    +
      +
    • Make Links in Kommentare klickbar, erhöhen Textgröße
    • +
    • seek zum Klicken von Zeitstempel-Links in Kommentare
    • +
    • Beliebte Registerkarte basierend auf kürzlich ausgewähltem Zustand anzeigen
    • +
    • Add-Unterstützung für Invidious links
    • +
    +

    Fixed

    +
      +
    • fixed scroll w/kommentare und verwandten Streams deaktiviert
    • +
    • fixiert CheckForNewAppVersionTask wird ausgeführt, wenn es sollten't
    • +
    diff --git a/fastlane/metadata/android/de/changelogs/750.txt b/fastlane/metadata/android/de/changelogs/750.txt new file mode 100644 index 000000000..78a25282a --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/750.txt @@ -0,0 +1,15 @@ +Neu +Playback Lebenslauf #2288 +• Resume Streams, wo Sie letztes Mal aufgehört haben +Downloader Verbesserungen #2149 + + +Verbessert +• Gemaketten entfernen #2295 +• Handle (auto)Rotationsänderungen während des Aktivitätszyklus #2444 + +Behoben +• Fixed Downloads bei 99,9% #2440 +• Aktualisieren der Spielwarteschlange Metadaten #2453 +• [SoundCloud] Fester Absturz beim Laden von Wiedergabelisten TeamNewPipe/NewPipeExtractor#170 +• [YouTube] Feste Dauer kann nicht paresd TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/de/changelogs/760.txt b/fastlane/metadata/android/de/changelogs/760.txt new file mode 100644 index 000000000..f0eac002f --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/760.txt @@ -0,0 +1,24 @@ +Veränderung in 0,17.1 + +Neu +• thailändische Lokalisierung + + +Verbessert +• Schalter für SAF / Legacy Datei Picker #2521 hinzufügen + +Behoben +• Löschen Sie Löschtasten in Downloads Ansicht beim Umschalten von Apps #2487 + +Veränderungen in 0,17,0 + +Neu +Playback Lebenslauf #2288 +• Resume Streams, wo Sie letztes Mal aufgehört haben +Downloader Verbesserungen #2149 + +Verbessert +• Gemaketten entfernen #2295 + +Behoben +• Behoben ausgewählter Subtitle Track Name nicht angezeigt #2394 diff --git a/fastlane/metadata/android/de/changelogs/780.txt b/fastlane/metadata/android/de/changelogs/780.txt new file mode 100644 index 000000000..4deac3709 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/780.txt @@ -0,0 +1,11 @@ +Veränderungen in 0,17,3 + +Verbessert +• Hinzugefügte Option, um die Wiedergabezustände #2550 zu löschen +• Versteckte Verzeichnisse in der Datei Picker #2591 anzeigen +• Unterstützung von URLs von `invidio.us` Instanzen, die mit NewPipe #2488 geöffnet werden sollen +• Unterstützung für `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194 + +Behoben +• [YouTube] Behoben 'java.lang.IllegalArgumentException #192 +• [YouTube] Feste Live-Streams nicht arbeiten TeamNewPipe/NewPipeExtractor#195 diff --git a/fastlane/metadata/android/de/changelogs/790.txt b/fastlane/metadata/android/de/changelogs/790.txt new file mode 100644 index 000000000..345cb37aa --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/790.txt @@ -0,0 +1,13 @@ +Verbessert +• Weitere Titel hinzufügen, um die Zugänglichkeit für Blinde zu verbessern #2655 +• Sprache des Download-Ordners konsistenter und weniger eindeutig #2637 + +Behoben +• Fixed Scrolling in Video Detail Fragment #2672 +• Entfernen Sie doppelte Suche klare Box-Animationen zu einem #2695 +• [SoundCloud] Client_id Extraktion fix #2745 + +Entwicklung +• Hinzufügen fehlender Abhängigkeiten von NewPipeExtractor in NewPipe #2535 +• Migration auf AndroidX #2685 +• Update auf ExoPlayer 2.10.6 #2697, #2736 diff --git a/fastlane/metadata/android/de/changelogs/800.txt b/fastlane/metadata/android/de/changelogs/800.txt new file mode 100644 index 000000000..792b15461 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/800.txt @@ -0,0 +1,11 @@ +Neu +• PeerTube Unterstützung ohne P2P (#2201) (Beta) + Es könnte Probleme mit SSL Handshakes auf Android 4.4 & 7.1 geben, wenn auf bestimmte Instanzen zugegriffen wird. + +Verbessert +• Neue Localization and Downloader von Extractor #2713 +• Schwarze Navigationsleiste für schwarzes Theme #2569 + +Behoben +• Fehler wurde behoben, der den Popup-Player nicht verschieben konnte, wenn ein anderer Finger beim Verschieben des Popup-Players #2772 platziert wurde +• [SoundCloud] Audio-Stream-Extraktion diff --git a/fastlane/metadata/android/de/changelogs/810.txt b/fastlane/metadata/android/de/changelogs/810.txt new file mode 100644 index 000000000..9b57ce03c --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/810.txt @@ -0,0 +1,11 @@ +Neu +• Video Vorschau auf den Sperrbildschirm beim Spielen im Hintergrund anzeigen + +Verbessert +• Fügen Sie lokale Wiedergabeliste hinzu, um zu löschen, wenn lange Drücken auf Hintergrund / Popup-Taste + +Behoben +• Mehrere Probleme behoben, wenn ein Video zu NewPipe geteilt und seine Streams direkt herunterladen +• [YouTube] Festes Einschalten Null verursacht NPE +• [YouTube] Behobene Betrachtungskommentare beim Öffnen eines invidio.us url +• [SoundCloud] Update von client_id diff --git a/fastlane/metadata/android/de/changelogs/840.txt b/fastlane/metadata/android/de/changelogs/840.txt new file mode 100644 index 000000000..73e9904ec --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/840.txt @@ -0,0 +1,10 @@ +Neu +• Sprachauswahl hinzugefügt, um die App-Sprache zu ändern +• Hinzugefügt senden zu Kodi Taste zu Spieler zusammenklappbare Menü + +Verbessert +• Entfernen von dot-menu für Schublade und verstecken Geschichte Taste, wenn die Uhr Geschichte nicht in den Einstellungen aktiviert ist + +Behoben +• Fix initialer Helligkeitswert für die Geste +• [YouTube] Timestamps in der Beschreibung sind wieder anklickbar diff --git a/fastlane/metadata/android/de/changelogs/930.txt b/fastlane/metadata/android/de/changelogs/930.txt new file mode 100644 index 000000000..e2ddba83f --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/930.txt @@ -0,0 +1,12 @@ +Neu +• Suche auf YouTube Musik +• Basic Android TV-Unterstützung + +Verbessert +• Hinzugefügt die Fähigkeit, alle beobachteten Videos von einer lokalen Wiedergabeliste zu entfernen +• Nachricht anzeigen, wenn der Inhalt noch nicht unterstützt wird, anstatt zu stürzen + +Behoben +• Feste altersbeschränkte Inhaltseinstellung nicht funktionieren +• Behoben bestimmte Arten von reCAPTCHAs +• Feste Sichtbarkeit der Gruppen-Sort-Taste im Abonnement-Bereich diff --git a/fastlane/metadata/android/de/changelogs/940.txt b/fastlane/metadata/android/de/changelogs/940.txt index 3cbf73516..e96340b16 100644 --- a/fastlane/metadata/android/de/changelogs/940.txt +++ b/fastlane/metadata/android/de/changelogs/940.txt @@ -10,4 +10,3 @@ Verbessert Behoben - Einfrieren des Download-Dialogs behoben -... diff --git a/fastlane/metadata/android/de/changelogs/951.txt b/fastlane/metadata/android/de/changelogs/951.txt index 7c6d93982..790d6329d 100644 --- a/fastlane/metadata/android/de/changelogs/951.txt +++ b/fastlane/metadata/android/de/changelogs/951.txt @@ -8,4 +8,3 @@ Neu Verbessert - Anwendungsmetadaten nicht mehr in gemuxte Dateien schreiben - Fehlerhafte Streams nicht aus der Warteschlange entfernen -... diff --git a/fastlane/metadata/android/de/changelogs/968.txt b/fastlane/metadata/android/de/changelogs/968.txt index a619dc5c2..eaaf0637c 100644 --- a/fastlane/metadata/android/de/changelogs/968.txt +++ b/fastlane/metadata/android/de/changelogs/968.txt @@ -1,7 +1,7 @@ -Option "Kanaldetails" wurde zum Langdruckmenü hinzugefügt. -Funktion zum Umbenennen des Playlist-Namens von der Playlist-Oberfläche zugefügt. +Option „Kanaldetails“ dem Langdruck-Menü hinzugefügt. +Funktion zum Umbenennen des Namens der Wiedergabeliste der Oberfläche hinzugefügt. Benutzer kann nun pausieren, während ein Video gepuffert wird. -Weiße Thema wurde aufpoliert. +Weißes Design wurde aufpoliert. Überlappende Schriftarten bei Verwendung einer größeren Schriftgröße behoben. -Kein Video auf Formuler- und Zephier-Geräten behoben. +Videoanzeige auf Formuler- und Zephier-Geräten behoben. Verschiedene Abstürze behoben. diff --git a/fastlane/metadata/android/de/changelogs/970.txt b/fastlane/metadata/android/de/changelogs/970.txt index 53f80fed1..cf0ae0e0b 100644 --- a/fastlane/metadata/android/de/changelogs/970.txt +++ b/fastlane/metadata/android/de/changelogs/970.txt @@ -5,7 +5,7 @@ Neu: Behoben: • Rotationsabsturz auf der Videodetailseite -• „Mit Kodi spielen“-Button im Player fordert immer auf, Kore zu installieren +• „Mit Kodi spielen“-Schaltfläche im Player fordert immer auf, Kore zu installieren • Setzen von Import- und Exportpfaden wurde behoben und verbessert • [YouTube] Anzahl Kommentar-Likes korrigiert Und vieles mehr diff --git a/fastlane/metadata/android/de/changelogs/977.txt b/fastlane/metadata/android/de/changelogs/977.txt index fffd6c9ad..20ab730a4 100644 --- a/fastlane/metadata/android/de/changelogs/977.txt +++ b/fastlane/metadata/android/de/changelogs/977.txt @@ -1,7 +1,7 @@ -• Die Schaltfläche „Weiter abspielen“ wurde dem Langdruckmenü hinzugefügt -• YouTube Shorts Pfadpräfix zum Absichtsfilter hinzugefügt +• Die Schaltfläche „Weiter abspielen“ dem Langdruckmenü hinzugefügt +• YouTube-Shorts-Pfadpräfix zum Absichtsfilter hinzugefügt • Import von Einstellungen behoben -• Position der Suchleiste mit Player-Schaltflächen im Warteschlangen-Bildschirm vertauscht +• Position der Suchleiste mit Player-Schaltflächen im Warteschlangen-Bildschirm getauscht • Verschiedene Korrekturen im Zusammenhang mit MediasessionManager • Die Suchleiste wurde nach dem Ende des Videos nicht abgeschlossen … diff --git a/fastlane/metadata/android/de/changelogs/990.txt b/fastlane/metadata/android/de/changelogs/990.txt index a629c8654..6e56a8e70 100644 --- a/fastlane/metadata/android/de/changelogs/990.txt +++ b/fastlane/metadata/android/de/changelogs/990.txt @@ -8,8 +8,6 @@ Neu: Verbessert: • Player-Code in kleine Komponenten refaktorisiert: weniger RAM-Verbrauch, weniger Bugs • Skalierungsmodus für Miniaturansicht -… Behoben: • Verschiedene Probleme mit Player-Benachrichtigung: veraltete/fehlende Medieninfos, verzerrte Miniaturansicht -… diff --git a/fastlane/metadata/android/de/changelogs/993.txt b/fastlane/metadata/android/de/changelogs/993.txt index 54b04faa7..23f4db0b0 100644 --- a/fastlane/metadata/android/de/changelogs/993.txt +++ b/fastlane/metadata/android/de/changelogs/993.txt @@ -1,12 +1,12 @@ Neu -• Warnung bei Erstellung von Duplikaten in Wiedergabelisten und neue Schaltfläche um Duplikate zu entfernen -• Möglichkeit, Hardware Tasten zu ignorieren +• Warnung beim Erstellen von Duplikaten in Wiedergabelisten und neue Schaltfläche um diese zu entfernen +• Möglichkeit, Hardwaretasten zu ignorieren • Möglichkeit, teilweise gesehene Videos im Feed auszublenden Verbessert -• Mehr Rasterspalten auf großen Displays +• Mehr Gitterspalten auf großen Displays • Fortschrittsbalken sind jetzt konsistent mit Einstellungen Behoben -• Das Öffnen von Browser-URLs, Downloads und externen Videoplayern auf Android 11+ -• Fullscreen-Bedingung benötigte zweimaliges Drücken auf MIUI +• Das Öffnen von Browser-URLs, Downloads und externen Videoplayern unter Android 11+ +• Vollbildmodus-Bedienung benötigte zweimaliges Tippen unter MIUI diff --git a/fastlane/metadata/android/de/changelogs/994.txt b/fastlane/metadata/android/de/changelogs/994.txt new file mode 100644 index 000000000..9ff45d8d3 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/994.txt @@ -0,0 +1,15 @@ +Neu +• Unterstützung mehrerer Audiospuren/Sprachen +• Lautstärke- und Helligkeitsgesten auf jeder Bildschirmseite ermöglicht +• Unterstützung für die Anzeige von Haupttabs am unteren Bildschirmrand + +Verbessert +• [Bandcamp] Handhabung von Titeln hinter der Bezahlschranke + +Behoben +• [YouTube] 403-HTTP-Fehler bei Streams +• Schwarzer Player beim Wechsel von der Wiedergabeliste zum Hauptplayer +• Speicherleck im Playerdienst +• [PeerTube] Benutzer- und Unterkanal-Profilbilder getauscht + +und mehr diff --git a/fastlane/metadata/android/de/changelogs/995.txt b/fastlane/metadata/android/de/changelogs/995.txt new file mode 100644 index 000000000..0c026e50f --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/995.txt @@ -0,0 +1,14 @@ +Neu +• Unterstützung von Kanaltabs +• Bildqualität auswählbar +• URLs zu allen Bildern erhalten + +Verbessert +• Zugänglichkeit der Player-Oberflächen +• Bessere Audioauswahl bei reinen Video-Downloads +• Option zur Aufnahme von Wiedergabelisten-/Videonamen in geteilten Wiedergabelisteninhalten + +Behoben +• [YouTube] Erhalten der Like-Anzahl +• Nicht reagierende Popups und Abstürze des Players +• Hinzufügen von Wiedergabelistenelementen funktionierte gelegentlich nicht diff --git a/fastlane/metadata/android/de/changelogs/996.txt b/fastlane/metadata/android/de/changelogs/996.txt new file mode 100644 index 000000000..bcdea8f4f --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/996.txt @@ -0,0 +1,2 @@ +Eine NullPointerException beim Öffnen eines Kanals / einer Konferenz in media.ccc.de behoben. +Der Grinch hat versucht, unser Weihnachtsgeschenk für Sie zu zerstören, aber wir haben es behoben. diff --git a/fastlane/metadata/android/de/full_description.txt b/fastlane/metadata/android/de/full_description.txt index a476e427e..ef2ac9577 100644 --- a/fastlane/metadata/android/de/full_description.txt +++ b/fastlane/metadata/android/de/full_description.txt @@ -1 +1 @@ -NewPipe verwendet keine Bibliotheken des Google-Frameworks oder der YouTube-API. Es analysiert die Website, um die benötigten Informationen zu erlangen. Aus diesem Grund kann die App ohne die Google Services verwendet werden. Ebenso wird kein YouTube-Konto für NewPipe benötigt und es ist FLOSS (Freie Software / Open-Source-Software). +NewPipe verwendet keine Bibliotheken des Google-Frameworks oder der YouTube-API. Es analysiert die Website, um die benötigten Informationen zu erlangen. Aus diesem Grund kann die App ohne die Google Services verwendet werden. Ebenso wird kein YouTube-Konto für NewPipe benötigt und es ist FOSS (Freie Software / Open-Source-Software). diff --git a/fastlane/metadata/android/de/short_description.txt b/fastlane/metadata/android/de/short_description.txt index 138e55523..ec47872eb 100644 --- a/fastlane/metadata/android/de/short_description.txt +++ b/fastlane/metadata/android/de/short_description.txt @@ -1 +1 @@ -Eine freie, leichtgewichtige YouTube-App für Android. +Eine freie, leichte YouTube-App für Android. diff --git a/fastlane/metadata/android/el/changelogs/65.txt b/fastlane/metadata/android/el/changelogs/65.txt new file mode 100644 index 000000000..0417512c7 --- /dev/null +++ b/fastlane/metadata/android/el/changelogs/65.txt @@ -0,0 +1,26 @@ +### Βελτιώσεις + +- Απενεργοποίηση της κίνησης του εικονιδίου του burgermenu #1486 +- Αναίρεση διαγραφής λήψεων #1472 +- Επιλογή λήψης στο μενού κοινής χρήσης #1498 +- Προστέθηκε επιλογή κοινής χρήσης στο μενού παρατεταμένου πατήματος #1454 +- Ελαχιστοποίηση του κύριου προγράμματος αναπαραγωγής κατά την έξοδο #1354 +- Ενημέρωση της έκδοσης της βιβλιοθήκης και διόρθωση αντιγράφων ασφαλείας της βάσης δεδομένων #1510 +- Ενημέρωση ExoPlayer 2.8.2 #1392 + - Ανασχεδιάστηκε ο διάλογος ελέγχου της ταχύτητας αναπαραγωγής ώστε να υποστηρίζει διαφορετικά μεγέθη βημάτων για ταχύτερη αλλαγή ταχύτητας. + - Προστέθηκε μια εναλλαγή για γρήγορη μετακίνηση προς τα εμπρός κατά τη διάρκεια σιωπής στον έλεγχο ταχύτητας αναπαραγωγής. Αυτό θα πρέπει να είναι χρήσιμο για τα ακουστικά βιβλία και ορισμένα είδη μουσικής και μπορεί να φέρει μια πραγματικά απρόσκοπτη εμπειρία (και μπορεί να σπάσει ένα τραγούδι με πολλές σιωπές =\\). + - Αναδιαμόρφωση της ανάλυσης πηγής πολυμέσων ώστε να επιτρέπεται η μετάδοση μεταδεδομένων μαζί με τα πολυμέσα εσωτερικά στον αναπαραγωγέα, αντί να γίνεται χειροκίνητα. Τώρα έχουμε μια ενιαία πηγή μεταδεδομένων και είναι άμεσα διαθέσιμα κατά την έναρξη της αναπαραγωγής. + - Διορθώθηκε η μη ενημέρωση των απομακρυσμένων μεταδεδομένων της λίστας αναπαραγωγής όταν είναι διαθέσιμα νέα μεταδεδομένα κατά το άνοιγμα του τμήματος της λίστας αναπαραγωγής. + - Διάφορες διορθώσεις στο UI: #1383, τα στοιχεία ελέγχου ειδοποίησης αναπαραγωγής στο παρασκήνιο είναι τώρα πάντα λευκά, είναι ευκολότερο να κλείσετε το αναδυόμενο πρόγραμμα αναπαραγωγής μέσω εκτίναξης +- Χρήση νέου εξαηωγέα με ανασχεδιασμένη αρχιτεκτονική για πολλαπλές υπηρεσίες + +### Διορθώσεις + +- Διόρθωση #1440 Προβληματική διάταξη πληροφοριών βίντεο #1491 +- Διόρθωση ιστορικού προβολής #1497 + - #1495, ενημέρωση των μεταδεδομένων (μικρογραφία, τίτλος και αριθμός βίντεο) μόλις ο χρήστης αποκτήσει πρόσβαση στη λίστα αναπαραγωγής. + - #1475, με την καταχώριση μιας προβολής στη βάση δεδομένων όταν ο χρήστης ξεκινάει ένα βίντεο σε εξωτερική συσκευή αναπαραγωγής σε λεπτομερές θραύσμα. +- Διόρθωση του χρονικού ορίου creen σε περίπτωση λειτουργίας αναδυόμενου παραθύρου. #1463 (Διορθώθηκε το #640) +- Διόρθωση του κύριου προγράμματος αναπαραγωγής βίντεο #1509 + - #1412] Διορθώθηκε η λειτουργία επανάληψης που προκαλεί NPE του αναπαραγωγέα όταν λαμβάνεται νέα εντολή ενώ εργάζεται στο παρασκήνιο. + - Διορθώθηκε κατά την ελαχιστοποίηση του αναπαραγωγέα σε αναδυόμενο παράθυρο, να μην τον καταστρέφει όταν δεν έχει χορηγηθεί άδεια αναδυόμενου παραθύρου. diff --git a/fastlane/metadata/android/el/changelogs/963.txt b/fastlane/metadata/android/el/changelogs/963.txt new file mode 100644 index 000000000..b6c30aa9d --- /dev/null +++ b/fastlane/metadata/android/el/changelogs/963.txt @@ -0,0 +1 @@ +• [YouTube] Διόρθωση της συνέχισης ενός καναλιού diff --git a/fastlane/metadata/android/el/changelogs/996.txt b/fastlane/metadata/android/el/changelogs/996.txt new file mode 100644 index 000000000..58223cb1a --- /dev/null +++ b/fastlane/metadata/android/el/changelogs/996.txt @@ -0,0 +1,2 @@ +Διορθώθηκε μια NullPointerException κατά το άνοιγμα ενός καναλιού/συνεδρίου στο media.ccc.de. +Ο Grinch προσπάθησε να σπάσει το χριστουγεννιάτικο δώρο μας προς εσάς, αλλά το διορθώσαμε. diff --git a/fastlane/metadata/android/en-US/changelogs/995.txt b/fastlane/metadata/android/en-US/changelogs/995.txt new file mode 100644 index 000000000..78e0770f7 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/995.txt @@ -0,0 +1,16 @@ +New +• Support channel tabs +• Select image quality +• Get URLs to all images + +Improved +• Accessibility of player interfaces +• Better audio selection for video-only downloads +• Option to include playlist and video names to shared playlist content + +Fixed +• [YouTube] Fix getting like count +• Fix player not responding popups and crashes +• Selection of wrong languages in language picker +• Player audio focus was not respecting mute +• Playlist item addition occasionally not working \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/996.txt b/fastlane/metadata/android/en-US/changelogs/996.txt new file mode 100644 index 000000000..8e5af53a4 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/996.txt @@ -0,0 +1,2 @@ +Fixed a NullPointerException when opening a channel / conference in media.ccc.de. +The Grinch tried to break our Christmas gift to you, but we fixed it. diff --git a/fastlane/metadata/android/eo/changelogs/63.txt b/fastlane/metadata/android/eo/changelogs/63.txt new file mode 100644 index 000000000..c6e1e9ad5 --- /dev/null +++ b/fastlane/metadata/android/eo/changelogs/63.txt @@ -0,0 +1,8 @@ +### Plibonigojn +- Importi/eksporti konfiguraĵojn #1333 +- Malpliigi superdesegnaĵon (rendimentan plibonigon) #1371 +- Malgrandajn kodajn plibonigojn #1375 +- Aldoni ĉion pri GDPR #1420 + +### Fiksitaj +- Elŝutilo: Fiksi kraŝon kiam ŝarĝi malfinitajn elŝutaĵojn el .giga-j dosieroj #1407 diff --git a/fastlane/metadata/android/eo/full_description.txt b/fastlane/metadata/android/eo/full_description.txt new file mode 100644 index 000000000..74418f2ab --- /dev/null +++ b/fastlane/metadata/android/eo/full_description.txt @@ -0,0 +1 @@ +NewPipe uzas nek frambildotekojn de *Google*, nek la aplikprograman interfacon de YouTube. Ĝi nur sintakse analizas la retejon por akiri la necesaj datumoj. Tial ĉi tio aplikaĵo estas uzebla per disponaĵoj sen instalita *Google Services*. Oni ne bezonas konton de YouTube por uzi NewPipe, kaj ĝi estas libera programaro. diff --git a/fastlane/metadata/android/es/changelogs/995.txt b/fastlane/metadata/android/es/changelogs/995.txt new file mode 100644 index 000000000..93aab836e --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/995.txt @@ -0,0 +1,16 @@ +Nuevo +• Pestañas de canal +• Calidad de imagen +• URLs de las imágenes + +Mejora de +• Accesibilidad de las interfaces de los reproductores +• Mejor selección de audio para descargas de vídeo +• Incluir nombres de listas de reproducción y vídeos en listas compartidas + +Corregido +• [YouTube] Corrección del recuento "Me gusta" +• Ventanas emergentes y bloqueos +• Idiomas incorrectos en selector de idiomas +• Audio del reproductor no respetaba silencio +• La lista de reproducción no funcionaba ocasionalmente diff --git a/fastlane/metadata/android/es/changelogs/996.txt b/fastlane/metadata/android/es/changelogs/996.txt new file mode 100644 index 000000000..e620b525f --- /dev/null +++ b/fastlane/metadata/android/es/changelogs/996.txt @@ -0,0 +1,2 @@ +Corregida una NullPointerException al abrir un canal / conferencia en media.ccc.de. +El Grinch trató de romper nuestro regalo de Navidad para usted, pero lo arreglamos. diff --git a/fastlane/metadata/android/fr/changelogs/750.txt b/fastlane/metadata/android/fr/changelogs/750.txt index 1276a514d..422529abf 100644 --- a/fastlane/metadata/android/fr/changelogs/750.txt +++ b/fastlane/metadata/android/fr/changelogs/750.txt @@ -2,7 +2,7 @@ Nouveau Reprise de lecture #2288 • Reprise des flux où ils s'étaient arrêtés Améliorations du téléchargeur #2149 -• Utilisation du Storage Access Framework pour stocker sur cartes SD +• Utilisation du Storage Access Framework pour stocker sur cartes SD • Nouveau multiplexeur mp4 • Peut changer le dossier de téléchargement • Respect des réseaux tarifés @@ -10,12 +10,12 @@ Améliorations du téléchargeur #2149 Améliorations • Suppression des chaînes gema #2295 -• Gestion des changements de rotation #2444 +• Gestion des changements de rotation #2444 • Uniformisation des menus longue-pression #2368 Corrections • Nom de la piste de sous-titres sélectionnée qui ne s'affiche pas #2394 -• Ne plante pas quand la vérification de la mise à jour de l'application échoue #2423 +• Ne plante pas quand la vérification de la mise à jour de l'application échoue #2423 • Téléchargements bloqués à 99,9 % #2440 • Mise à jour des métadonnées de la file de lecture #2453 • [SoundCloud] Ne plante pas lors du chargement des playlists TeamNewPipe/NewPipeExtractor#170 diff --git a/fastlane/metadata/android/he/changelogs/995.txt b/fastlane/metadata/android/he/changelogs/995.txt new file mode 100644 index 000000000..c0fab1e52 --- /dev/null +++ b/fastlane/metadata/android/he/changelogs/995.txt @@ -0,0 +1,14 @@ +חדש +• תמיכה בלשוניות ערוצים +• בחירת איכות תמונה +• קבלת כתובות לכל התמונות + +משופר +• גישה למנשקי הנגן +• אפשרות להוספת שם רשימת נגינה ושם סרטון לתוכן שמשותף ברשימת נגינה +• שיפורים פנימיים ועדכוני תלויות + +תוקן +• בחירה בשפה הלא נכונה בבורר השפות +• מיקוד השמע של הנגן לא כיבד השתקה +• הוספת פריטים לרשימות נגינה לא עבדה במקרים מסוימים diff --git a/fastlane/metadata/android/hi/changelogs/995.txt b/fastlane/metadata/android/hi/changelogs/995.txt new file mode 100644 index 000000000..63ed335a4 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/995.txt @@ -0,0 +1,16 @@ +नया +• चैनल टैब्स का समर्थन करें +• छवि गुणवत्ता का चयन करें +• सभी छवियों के यूआरएल प्राप्त करें + +सुधार किए +• प्लेयर इंटरफ़ेस की पहुंच +• केवल-वीडियो डाउनलोड के लिए बेहतर ऑडियो चयन +• साझा प्लेलिस्ट सामग्री में प्लेलिस्ट और वीडियो नाम शामिल करने का विकल्प + +ठीक किए +• [यूट्यूब] लाइक पाने की संख्या ठीक करें +• पॉपअप और क्रैश पर प्रतिक्रिया नहीं देने वाले प्लेयर को ठीक करें +• भाषा चयनकर्ता में गलत भाषाओं का चयन ठीक करें +• प्लेयर ऑडियो फोकस म्यूट का सम्मान नहीं कर रहा था +• प्लेलिस्ट में आइटम जोड़ना कभी-कभी काम नहीं कर रहा था diff --git a/fastlane/metadata/android/hi/changelogs/996.txt b/fastlane/metadata/android/hi/changelogs/996.txt new file mode 100644 index 000000000..0a9369d87 --- /dev/null +++ b/fastlane/metadata/android/hi/changelogs/996.txt @@ -0,0 +1,2 @@ +Media.ccc.de में चैनल/कॉन्फ़्रेंस खोलते समय NullPointerException को ठीक किया गया। +ग्रिंच ने आपको हमारा क्रिसमस उपहार तोड़ने की कोशिश की, लेकिन हमने इसे ठीक कर दिया। diff --git a/fastlane/metadata/android/hr/full_description.txt b/fastlane/metadata/android/hr/full_description.txt index 14826925e..1e3977d33 100644 --- a/fastlane/metadata/android/hr/full_description.txt +++ b/fastlane/metadata/android/hr/full_description.txt @@ -1 +1 @@ -NewPipe ne koristi nijednu Googleovu biblioteku niti YouTube API, već samo analizira web-stranicu kako bi pribavio potrebne podatke. Stoga se ovaj program može koristiti na uređajima bez da su Googleove usluge instalirane. Također, za korištenje programa NewPipe nije potreban YouTube račun. NewPipe je slobodan program otvorenog koda. +NewPipe ne koristi nijednu Googleovu biblioteku niti YouTube API, već samo analizira web-stranicu kako bi pribavio potrebne podatke. Stoga se ova aplikacija može koristiti na uređajima bez instaliranih Google usluga. Također, NewPipe se može koristiti bez YouTube računa. NewPipe je slobodna aplikacija otvorenog koda. diff --git a/fastlane/metadata/android/id/changelogs/65.txt b/fastlane/metadata/android/id/changelogs/65.txt index 34cf20dec..4fad1200f 100644 --- a/fastlane/metadata/android/id/changelogs/65.txt +++ b/fastlane/metadata/android/id/changelogs/65.txt @@ -1,4 +1,4 @@ -###Peningkatan +### peningkatan - Nonaktifkan Animasi Ikon burgermenu #1486 - Kembali (undo) hapus unduhan #1472 diff --git a/fastlane/metadata/android/id/changelogs/66.txt b/fastlane/metadata/android/id/changelogs/66.txt new file mode 100644 index 000000000..adbbff49c --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/66.txt @@ -0,0 +1,33 @@ +# Catatan perubahan v0.13.7 + +### Diperbaiki +- Perbaiki masalah filter pengurutan v0.13.6 + +# Changelog v0.13.6 + +### Perbaikan + +- Nonaktifkan animasi ikon menu burger #1486 +- batalkan penghapusan unduhan #1472 +- Opsi unduh di menu berbagi #1498 +- Menambahkan opsi berbagi ke menu ketuk panjang #1454 +- Minimalkan pemutar utama saat keluar #1354 +- Pembaruan versi library dan perbaikan cadangan basis data #1510 +- Pembaruan ExoPlayer 2.8.2 #1392 + - Mengolah ulang dialog kontrol kecepatan pemutaran untuk mendukung ukuran langkah yang berbeda untuk perubahan kecepatan yang lebih cepat. + - Menambahkan tombol untuk maju cepat selama hening di kontrol kecepatan pemutaran. Ini akan berguna untuk buku audio dan genre musik tertentu, dan dapat menghadirkan pengalaman yang benar-benar mulus (dan dapat memecah lagu dengan banyak keheningan =\\). + - Refaktor ulang resolusi sumber media untuk memungkinkan penyampaian metadata bersama media secara internal di pemutar, daripada melakukannya secara manual. Sekarang kami memiliki satu sumber metadata dan langsung tersedia saat pemutaran dimulai. + - Memperbaiki metadata daftar putar jarak jauh yang tidak diperbarui ketika metadata baru tersedia ketika fragmen daftar putar dibuka. + - Berbagai perbaikan UI: #1383, kontrol notifikasi pemutar latar belakang kini selalu berwarna putih, lebih mudah untuk mematikan pemutar popup melalui lemparan +- Gunakan ekstraktor baru dengan arsitektur yang difaktorkan ulang untuk multilayanan + +### Perbaikan + +- Perbaiki #1440 Tata Letak Info Video Rusak #1491 +- Lihat perbaikan riwayat #1497 + - #1495, dengan memperbarui metadata (thumbnail, judul, dan jumlah video) segera setelah pengguna mengakses daftar putar. + - #1475, dengan mendaftarkan tampilan di database saat pengguna memulai video di pemutar eksternal pada fragmen detail. +- Perbaiki batas waktu layar jika ada mode popup. #1463 (Diperbaiki #640) +- Perbaikan pemutar video utama #1509 + - [#1412] Memperbaiki mode pengulangan yang menyebabkan pemutar NPE ketika intent baru diterima saat aktivitas pemutar berada di latar belakang. + - Perbaiki meminimalkan pemutar ke popup tidak menghancurkan pemutar ketika izin popup tidak diberikan. diff --git a/fastlane/metadata/android/id/changelogs/972.txt b/fastlane/metadata/android/id/changelogs/972.txt index e6b705eeb..99990cc90 100644 --- a/fastlane/metadata/android/id/changelogs/972.txt +++ b/fastlane/metadata/android/id/changelogs/972.txt @@ -11,4 +11,4 @@ Memperbarui instance Invidious dan mendukung tautan Piped. Diperbaiki [YouTube] Konten yang dibatasi usia -Cegah jendela bocor Pengecualian saat membuka dialog pilihan +Cegah Pengecualian jendela bocor saat membuka dialog pilihan diff --git a/fastlane/metadata/android/id/changelogs/974.txt b/fastlane/metadata/android/id/changelogs/974.txt new file mode 100644 index 000000000..4cdc5ab55 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/974.txt @@ -0,0 +1,5 @@ +Perbaikan terbaru +• Memperbaiki masalah buffering yang disebabkan oleh pembatasan YouTube +• Memperbaiki ekstraksi komentar YouTube dan kerusakan pada komentar yang dinonaktifkan +• Perbaiki pencarian musik YouTube +• Perbaiki streaming langsung PeerTube diff --git a/fastlane/metadata/android/id/changelogs/975.txt b/fastlane/metadata/android/id/changelogs/975.txt new file mode 100644 index 000000000..b8f4aca1f --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/975.txt @@ -0,0 +1,17 @@ +Baru +• Menampilkan Thumbnail ketika Mempercepat +• Deteksi komentar yang dimatikan +• Penandaan item feed sebagai ditonton +• Menampilkan Komentar disukai + +Peningkatan +• Pembaruan Layout metadata dan tag +• Penerapan warna layanan pada komponen UI + +Perbaikan +• Perbaiki thumbnail pada mini player +• Perbaiki buffering tanpa akhir pada item antrian duplikat +• Perbaikan Beberapa player rotasi layar dan penutupan yang lebih cepat +• Perbaiki ReCaptcha tetap termuat di latar belakang +• Matikan klik saat memuat feed +• Perbaiki beberapa kerusakan pengunduh diff --git a/fastlane/metadata/android/id/changelogs/976.txt b/fastlane/metadata/android/id/changelogs/976.txt new file mode 100644 index 000000000..d3c7e505b --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/976.txt @@ -0,0 +1,10 @@ +• Tambahkan opsi untuk langsung membuka pemutar dalam layar penuh +• Izinkan memilih jenis saran pencarian yang akan ditampilkan +• Tema gelap kini lebih gelap + layar splash gelap ditambahkan +• Peningkatan pemilih file untuk menyembunyikan file yang tidak diinginkan +• Memperbaiki impor langganan YouTube +• Memutar ulang stream memerlukan ketukan pada tombol putar ulang lagi +• Memperbaiki sesi audio penutup +• [Android TV] Memperbaiki lompatan seekbar yang panjang saat menggunakan DPad + +Untuk melihat perubahan lebih lanjut, lihat log perubahan (dan postingan blog) dari tab Tautan di bawah. diff --git a/fastlane/metadata/android/id/changelogs/977.txt b/fastlane/metadata/android/id/changelogs/977.txt new file mode 100644 index 000000000..11df38bd9 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/977.txt @@ -0,0 +1,10 @@ +• Menambahkan tombol "mainkan berikutnya" ke menu tekan lama +• Menambahkan awalan jalur pendek YouTube ke filter maksud +• Impor Pengaturan Tetap +• Tukar posisi seekbar dengan tombol pemutar di layar Antrian +• Berbagai perbaikan terkait MediasessionManager +• Memperbaiki bilah pencari yang tidak selesai setelah video berakhir +• Menonaktifkan terowongan media di RealtekATV +• Memperluas area yang dapat diklik tombol pemutar yang diperkecil + +Untuk melihat perubahan lebih lanjut, lihat log perubahan (dan postingan blog) dari tab Tautan di bawah. diff --git a/fastlane/metadata/android/id/changelogs/978.txt b/fastlane/metadata/android/id/changelogs/978.txt new file mode 100644 index 000000000..6b452521a --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/978.txt @@ -0,0 +1 @@ +Memperbaiki pelaksanaan pemeriksaan untuk versi NewPipe baru. Pemeriksaan ini terkadang dilakukan terlalu dini sehingga menyebabkan aplikasi mogok. Itu harus diperbaiki sekarang. diff --git a/fastlane/metadata/android/id/changelogs/979.txt b/fastlane/metadata/android/id/changelogs/979.txt new file mode 100644 index 000000000..abc741c86 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/979.txt @@ -0,0 +1,2 @@ +- Memperbaiki melanjutkan pemutaran +- Perbaikan untuk memastikan bahwa layanan yang menentukan apakah NewPipe harus memeriksa pemeriksaan versi baru tidak dimulai di latar belakang diff --git a/fastlane/metadata/android/id/changelogs/980.txt b/fastlane/metadata/android/id/changelogs/980.txt new file mode 100644 index 000000000..13a173f5d --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/980.txt @@ -0,0 +1,13 @@ +Baru +• Menambahkan opsi "Tambahkan ke playlist" untuk berbagi menu +• Menambahkan dukungan untuk tautan pendek y2u.be dan PeerTube + +Ditingkatkan +• Membuat Kontrol Kecepatan Pemutaran menjadi lebih ringkas +• Feed menyoroti item baru sekarang +• Opsi "Tampilkan item yang ditonton" di feed kini disimpan + +Tetap +• Memperbaiki ekstraksi suka dan tidak suka YouTube +• Memperbaiki pemutaran ulang otomatis setelah kembali dari latar belakang +Dan banyak lagi diff --git a/fastlane/metadata/android/id/changelogs/981.txt b/fastlane/metadata/android/id/changelogs/981.txt new file mode 100644 index 000000000..f3b556443 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/981.txt @@ -0,0 +1,2 @@ +Menghapus dukungan MediaParser untuk memperbaiki pemutaran yang gagal dilanjutkan setelah buffering di Android 11+. +Menonaktifkan terowongan media pada Philips QM16XE untuk memperbaiki masalah pemutaran. diff --git a/fastlane/metadata/android/id/changelogs/982.txt b/fastlane/metadata/android/id/changelogs/982.txt new file mode 100644 index 000000000..871132855 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/982.txt @@ -0,0 +1 @@ +Memperbaiki YouTube yang tidak memutar streaming apa pun. diff --git a/fastlane/metadata/android/id/changelogs/983.txt b/fastlane/metadata/android/id/changelogs/983.txt new file mode 100644 index 000000000..3ee5449c2 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/983.txt @@ -0,0 +1,9 @@ +Tambahkan UI dan perilaku ketuk dua kali untuk mencari +Jadikan pengaturan dapat dicari +Sorot komentar yang disematkan seperti itu +Tambahkan dukungan terbuka dengan aplikasi untuk instance PeerTube FSFE +Tambahkan pemberitahuan kesalahan +Perbaiki pemutaran ulang item antrian pertama saat pergantian pemain +Tunggu lebih lama saat melakukan buffering selama streaming langsung sebelum gagal +Perbaiki urutan hasil pencarian lokal +Perbaiki bidang item kosong di antrian putar diff --git a/fastlane/metadata/android/id/changelogs/984.txt b/fastlane/metadata/android/id/changelogs/984.txt new file mode 100644 index 000000000..f0e1b2970 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/984.txt @@ -0,0 +1,7 @@ +Muat item awal secukupnya dalam daftar untuk memenuhi seluruh layar dan untuk memperbaiki pengguliran di tablet dan TV +Perbaiki kerusakan acak saat menelusuri daftar +Minta pemain untuk mencari overlay dengan cepat di bawah UI sistem +Mengembalikan perubahan pada potongan saat memutar di multi jendela, menyebabkan regresi pemutar salah tempat di beberapa ponsel +Tingkatkan kompilasiSdk dari 30 menjadi 31 +Perbarui pustaka pelaporan kesalahan +Refactor beberapa kode di pemutar diff --git a/fastlane/metadata/android/id/changelogs/985.txt b/fastlane/metadata/android/id/changelogs/985.txt new file mode 100644 index 000000000..d3fea84ab --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/985.txt @@ -0,0 +1 @@ +Memperbaiki YouTube yang tidak memutar streaming apa pun diff --git a/fastlane/metadata/android/id/changelogs/987.txt b/fastlane/metadata/android/id/changelogs/987.txt new file mode 100644 index 000000000..b31a40dc0 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/987.txt @@ -0,0 +1,12 @@ +Baru +• Mendukung metode pengiriman selain HTTP progresif: waktu pemuatan pemutaran lebih cepat, perbaikan untuk PeerTube dan SoundCloud, pemutaran streaming langsung YouTube yang baru saja berakhir +• Tombol Tambah untuk menambahkan playlist jarak jauh ke playlist lokal +• Pratinjau gambar di lembar berbagi Android 10+ + +Ditingkatkan +• Meningkatkan dialog parameter pemutaran +• Pindahkan tombol ekspor-impor langganan ke menu tiga titik + +Tetap +• Perbaiki penghapusan video yang ditonton sepenuhnya dari daftar putar +• Perbaiki tema menu berbagi dan entri "tambahkan ke daftar putar". diff --git a/fastlane/metadata/android/id/changelogs/988.txt b/fastlane/metadata/android/id/changelogs/988.txt new file mode 100644 index 000000000..6433bfa54 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Perbaiki kesalahan "Tidak dapat memperoleh streaming apa pun" saat mencoba memutar video apa pun +[YouTube] Perbaiki "Konten berikut tidak tersedia di aplikasi ini." pesan ditampilkan alih-alih video yang diminta diff --git a/fastlane/metadata/android/id/changelogs/989.txt b/fastlane/metadata/android/id/changelogs/989.txt new file mode 100644 index 000000000..d388366dd --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Perbaiki pemuatan tanpa batas saat mencoba memutar video apa pun +• [YouTube] Memperbaiki pembatasan pada beberapa video +• Tingkatkan perpustakaan jsoup ke 1.15.3, yang mencakup perbaikan keamanan diff --git a/fastlane/metadata/android/id/changelogs/990.txt b/fastlane/metadata/android/id/changelogs/990.txt new file mode 100644 index 000000000..ac117f405 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/990.txt @@ -0,0 +1,15 @@ +Rilis ini menghilangkan dukungan untuk Android 4.4 KitKat, sekarang versi minimumnya adalah Android 5 Lollipop! + +Baru +• Download dari menu tekan lama +• Sembunyikan video mendatang di feed +• Bagikan playlist lokal + +Ditingkatkan +• Memfaktorkan ulang kode pemutar menjadi komponen-komponen kecil: lebih sedikit RAM yang digunakan, lebih sedikit bug +• Meningkatkan mode skala thumbnail +• Placeholder gambar berukuran vektor + +Tetap +• Memperbaiki berbagai masalah dengan notifikasi pemutar: info media yang ketinggalan jaman, gambar mini yang terdistorsi +• Perbaiki layar penuh menggunakan 1/4 layar diff --git a/fastlane/metadata/android/id/changelogs/991.txt b/fastlane/metadata/android/id/changelogs/991.txt new file mode 100644 index 000000000..a803d5a14 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/991.txt @@ -0,0 +1,13 @@ +Baru +• Tambahkan tombol "Buka di browser" di panel kesalahan +• Tambahkan opsi untuk menampilkan grup saluran sebagai daftar +• [YouTube] Klik-lama pada segmen streaming untuk membagikan URL stempel waktu +• Tambahkan tombol antrian putar ke pemutar mini + +Disempurnakan +• Tambahkan lokalisasi Islandia dan perbarui banyak terjemahan lainnya +• Banyak perbaikan internal + +Diperbaiki +• Memperbaiki beberapa kerusakan +• [YouTube] Memperbaiki pemuatan saluran, feed non-khusus, dan mengatasi masalah pemutaran di beberapa negara diff --git a/fastlane/metadata/android/id/changelogs/993.txt b/fastlane/metadata/android/id/changelogs/993.txt new file mode 100644 index 000000000..2a4c8f2d6 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/993.txt @@ -0,0 +1,12 @@ +Baru +• Tambahkan peringatan saat menambahkan duplikat daftar putar dan tombol tambahkan untuk menghapusnya +• Izinkan pengabaian tombol perangkat keras +• Izinkan menyembunyikan video yang ditonton sebagian di feed + +Ditingkatkan +• Gunakan lebih banyak kolom grid di layar besar +• Membuat indikator kemajuan konsisten dengan pengaturan + +Tetap +• Memperbaiki URL pembuka browser, unduhan, dan pemutar eksternal di Android 11+ +• Memperbaiki interaksi dengan layar penuh yang memerlukan dua ketukan pada MIUI diff --git a/fastlane/metadata/android/id/changelogs/994.txt b/fastlane/metadata/android/id/changelogs/994.txt new file mode 100644 index 000000000..fc75016b1 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/994.txt @@ -0,0 +1,15 @@ +Baru +• Mendukung beberapa track audio/bahasa +• Izinkan mengatur gestur volume dan kecerahan di sisi mana pun pada layar +• Dukungan untuk menampilkan tab utama di bagian bawah layar + +Disempurnakan +• [Bandcamp] Menangani track berbayar + +Diperbaiki +• [YouTube] Kesalahan HTTP 403 untuk streaming +• Pemutar berwarna hitam saat beralih ke pemutar utama dari tampilan daftar putar +• Kebocoran memori layanan pemutar +• [PeerTube] Avatar pengunggah dan subsaluran ditukar + +dan banyak lagi diff --git a/fastlane/metadata/android/id/changelogs/995.txt b/fastlane/metadata/android/id/changelogs/995.txt new file mode 100644 index 000000000..b3db15bf1 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/995.txt @@ -0,0 +1,16 @@ +Baru +• Mendukung tab saluran +• Pilih kualitas gambar +• Dapatkan URL ke semua gambar + +Ditingkatkan +• Aksesibilitas antarmuka pemutar +• Pilihan audio yang lebih baik untuk unduhan video saja +• Pilihan untuk memasukkan nama playlist dan video ke konten daftar putar bersama + +Diperbaiki +• [YouTube] Perbaiki penghitungan jumlah suka +• Perbaiki pemutar yang tidak merespons popup dan crash +• Pemilihan bahasa yang salah di pemilih bahasa +• Fokus audio pemutar tidak menerapkan mode senyap +• Penambahan item daftar putar terkadang tidak berfungsi diff --git a/fastlane/metadata/android/id/changelogs/996.txt b/fastlane/metadata/android/id/changelogs/996.txt new file mode 100644 index 000000000..d1fd9d5b7 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/996.txt @@ -0,0 +1,2 @@ +Perbaiki NullPointerException saat membuka saluran / konferensi di media.ccc.de. +The Grinch mencoba untuk merusak hadiah Natal kami ke anda, tapi kami memperbaikinya. diff --git a/fastlane/metadata/android/it/changelogs/995.txt b/fastlane/metadata/android/it/changelogs/995.txt new file mode 100644 index 000000000..efed82f4e --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/995.txt @@ -0,0 +1,16 @@ +Novità +• Supporto a schede dei canali +• Selezione qualità dell'immagine +• Ottieni URL per tutte le immagini + +Migliorato +• Accessibilità delle interfacce del player +• Miglior scelta dell'audio per i download video-only +• Condivisione playlist con più opzioni + +Corretto +• [YouTube] Sistemati i mi piace +• Talvolta il player non rispondeva o crashava +• Selezione di lingue errate nel selettore +• Il focus audio del player non rispettava il muto +• Talvolta aggiungere elementi a playlist non funzionava diff --git a/fastlane/metadata/android/it/changelogs/996.txt b/fastlane/metadata/android/it/changelogs/996.txt new file mode 100644 index 000000000..0d69a3264 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/996.txt @@ -0,0 +1,2 @@ +Corretto un NullPointerException quando si apre un canale / conferenza in media.ccc.de. +Il Grinch ha cercato di rompere il nostro regalo di Natale per te, ma l'abbiamo risolto. diff --git a/fastlane/metadata/android/ja/changelogs/954.txt b/fastlane/metadata/android/ja/changelogs/954.txt index e927e8e51..6b0da1598 100644 --- a/fastlane/metadata/android/ja/changelogs/954.txt +++ b/fastlane/metadata/android/ja/changelogs/954.txt @@ -1,6 +1,6 @@ ・新しいアプリケーションの利用体系: 詳細ページで動画を再生し、下にスワイプしてプレイヤーを最小化する ・MediaStyle 通知: 通知のカスタマイズ可能なアクション、パフォーマンスの向上 -・デスクトップアプリのような NewPipe 使用中のリサイズ +・デスクトップアプリのような NewPipe 使用中のリサイズ ・サポートしていない URL のとき他のアプリで開くオプションを表示する ・取得できなかった場合の検索サジェストのユーザー体験の向上 diff --git a/fastlane/metadata/android/ka/changelogs/64.txt b/fastlane/metadata/android/ka/changelogs/64.txt index 5d32b7c0d..de50608ab 100644 --- a/fastlane/metadata/android/ka/changelogs/64.txt +++ b/fastlane/metadata/android/ka/changelogs/64.txt @@ -1,5 +1,5 @@ ### გაუმჯობესებები - - დაემატა ვიდეოს ხარისხის შეზღუდვის შესაძლებლობა მობილური ინტერნეტის გამოყენებისას. #1339 + - დაემატა ვიდეოს ხარისხის შეზღუდვის შესაძლებლობა მობილური ინტერნეტის გამოყენებისას. #1339 - დაიმახსოვრე სიკაშკაშე #1442 სესიისთვის - გააუმჯობესეთ ჩამოტვირთვის შესრულება სუსტი CPU-ებისთვის #1431 - დაამატეთ (სამუშაო) მხარდაჭერა მედია სესიისთვის #1433 diff --git a/fastlane/metadata/android/ka/changelogs/69.txt b/fastlane/metadata/android/ka/changelogs/69.txt index b5d54c565..4bc9f3c03 100644 --- a/fastlane/metadata/android/ka/changelogs/69.txt +++ b/fastlane/metadata/android/ka/changelogs/69.txt @@ -11,7 +11,7 @@ - დაამატეთ მხარდაჭერა ლოკალიზაციის #1792-ისთვის ### ასწორებს - - დააფიქსირეთ დროის ანალიზი . ფორმატში, ამიტომ NewPipe შეიძლება გამოყენებულ იქნას ფინეთში + - დააფიქსირეთ დროის ანალიზი . ფორმატში, ამიტომ NewPipe შეიძლება გამოყენებულ იქნას ფინეთში - შეასწორეთ გამოწერების რაოდენობა - დაამატეთ წინა პლანზე სერვისის ნებართვა API 28+ მოწყობილობებისთვის #1830 diff --git a/fastlane/metadata/android/ka/changelogs/740.txt b/fastlane/metadata/android/ka/changelogs/740.txt index 3589197f9..b6f13456b 100644 --- a/fastlane/metadata/android/ka/changelogs/740.txt +++ b/fastlane/metadata/android/ka/changelogs/740.txt @@ -3,11 +3,11 @@
  • გახადეთ კომენტარებში ბმულები დაწკაპუნებით, გაზარდეთ ტექსტის ზომა
  • მოძებნეთ კომენტარებში დროის ანაბეჭდის ბმულებზე დაწკაპუნებით
  • სასურველი ჩანართის ჩვენება ახლახან არჩეული მდგომარეობის მიხედვით
  • -
  • დაამატე დასაკრავი სია რიგში, როდესაც დიდხანს დააწკაპუნებთ 'ფონზე' დასაკრავი სიის ფანჯარაში
  • +
  • დაამატე დასაკრავი სია რიგში, როდესაც დიდხანს დააწკაპუნებთ 'ფონზე' დასაკრავი სიის ფანჯარაში
  • მოძებნეთ გაზიარებული ტექსტი, როდესაც ის არ არის URL
  • -
  • დაამატეთ "გაზიარება მიმდინარე დროს" ღილაკი მთავარ ვიდეო დამკვრელზე
  • +
  • დაამატეთ "გაზიარება მიმდინარე დროს" ღილაკი მთავარ ვიდეო დამკვრელზე
  • დახურვის ღილაკის დამატება მთავარ დამკვრელზე, როდესაც ვიდეო რიგი დასრულდება
  • -
  • დაამატეთ "დაკვრა პირდაპირ ფონზე" ვიდეო სიის ელემენტების მენიუს ხანგრძლივი დაჭერისთვის
  • +
  • დაამატეთ "დაკვრა პირდაპირ ფონზე" ვიდეო სიის ელემენტების მენიუს ხანგრძლივი დაჭერისთვის
  • გააუმჯობესეთ ინგლისური თარგმანი Play/Enqueue ბრძანებებისთვის
  • შესრულების მცირე გაუმჯობესება
  • გამოუყენებელი ფაილების წაშლა
  • diff --git a/fastlane/metadata/android/ka/changelogs/850.txt b/fastlane/metadata/android/ka/changelogs/850.txt index c78859a4e..7f6cc55e2 100644 --- a/fastlane/metadata/android/ka/changelogs/850.txt +++ b/fastlane/metadata/android/ka/changelogs/850.txt @@ -1 +1 @@ -ამ გამოშვებაში განახლდა YouTube ვებსაიტის ვერსია. ვებსაიტის ძველი ვერსია შეწყდება მარტში და, შესაბამისად, თქვენ უნდა განაახლოთ NewPipe. +ამ გამოშვებაში განახლდა YouTube ვებსაიტის ვერსია. ვებსაიტის ძველი ვერსია შეწყდება მარტში და, შესაბამისად, თქვენ უნდა განაახლოთ NewPipe. diff --git a/fastlane/metadata/android/ka/changelogs/967.txt b/fastlane/metadata/android/ka/changelogs/967.txt index 5d1835b2e..232586a73 100644 --- a/fastlane/metadata/android/ka/changelogs/967.txt +++ b/fastlane/metadata/android/ka/changelogs/967.txt @@ -1 +1 @@ -გაასწორა YouTube, რომელიც ევროკავშირში არ მუშაობს გამართულად. ეს გამოწვეული იყო ახალი ქუქი-ჩანაწერით და კონფიდენციალურობის თანხმობის სისტემით, რომელიც მოითხოვს NewPipe-ს დააყენოს თანხმობის ქუქი-ფაილები. +გაასწორა YouTube, რომელიც ევროკავშირში არ მუშაობს გამართულად. ეს გამოწვეული იყო ახალი ქუქი-ჩანაწერით და კონფიდენციალურობის თანხმობის სისტემით, რომელიც მოითხოვს NewPipe-ს დააყენოს თანხმობის ქუქი-ფაილები. diff --git a/fastlane/metadata/android/ka/changelogs/978.txt b/fastlane/metadata/android/ka/changelogs/978.txt index 600962d14..787d5d12e 100644 --- a/fastlane/metadata/android/ka/changelogs/978.txt +++ b/fastlane/metadata/android/ka/changelogs/978.txt @@ -1 +1 @@ -დაფიქსირდა შემოწმების შესრულება NewPipe-ის ახალი ვერსიისთვის. ეს შემოწმება ხანდახან ძალიან ადრე სრულდებოდა და, შესაბამისად, იწვევს აპის ავარიას. ეს ახლა უნდა გამოსწორდეს. +დაფიქსირდა შემოწმების შესრულება NewPipe-ის ახალი ვერსიისთვის. ეს შემოწმება ხანდახან ძალიან ადრე სრულდებოდა და, შესაბამისად, იწვევს აპის ავარიას. ეს ახლა უნდა გამოსწორდეს. diff --git a/fastlane/metadata/android/ka/changelogs/988.txt b/fastlane/metadata/android/ka/changelogs/988.txt index e42877c9c..3c74e29f5 100644 --- a/fastlane/metadata/android/ka/changelogs/988.txt +++ b/fastlane/metadata/android/ka/changelogs/988.txt @@ -1,2 +1,2 @@ [YouTube] გაასწორდა შეცდომა „ვერ მივიღე ნაკადი“ რომელიმე ვიდეოს დაკვრის მცდელობისას - [YouTube] შეასწორდა „შემდეგი კონტენტი მიუწვდომელია ამ აპში“. მოთხოვნილი ვიდეოს ნაცვლად ნაჩვენები შეტყობინება + [YouTube] შეასწორდა „შემდეგი კონტენტი მიუწვდომელია ამ აპში“. მოთხოვნილი ვიდეოს ნაცვლად ნაჩვენები შეტყობინება diff --git a/fastlane/metadata/android/ka/full_description.txt b/fastlane/metadata/android/ka/full_description.txt index eff57aabe..e65267b46 100644 --- a/fastlane/metadata/android/ka/full_description.txt +++ b/fastlane/metadata/android/ka/full_description.txt @@ -1 +1 @@ -NewPipe არ იყენებს Google Framework ბიბლიოთეკას ან YouTube API-ს. ის მხოლოდ აანალიზებს ვებსაიტს, რათა მოიპოვოს მისთვის საჭირო ინფორმაცია. ამიტომ ამ აპლიკაციის გამოყენება შესაძლებელია მოწყობილობებზე Google სერვისების დაყენების გარეშე. გარდა ამისა, თქვენ არ გჭირდებათ YouTube ანგარიში NewPipe-ის გამოსაყენებლად და ეს არის FLOSS. +NewPipe არ იყენებს Google Framework ბიბლიოთეკას ან YouTube API-ს. ის მხოლოდ აანალიზებს ვებსაიტს, რათა მოიპოვოს მისთვის საჭირო ინფორმაცია. ამიტომ ამ აპლიკაციის გამოყენება შესაძლებელია მოწყობილობებზე Google სერვისების დაყენების გარეშე. გარდა ამისა, თქვენ არ გჭირდებათ YouTube ანგარიში NewPipe-ის გამოსაყენებლად და ეს არის FLOSS. diff --git a/fastlane/metadata/android/kk/changelogs/63.txt b/fastlane/metadata/android/kk/changelogs/63.txt new file mode 100644 index 000000000..9442b136f --- /dev/null +++ b/fastlane/metadata/android/kk/changelogs/63.txt @@ -0,0 +1,8 @@ +### Жақсартулар +- Импорттау/экспорттау параметрлері #1333 +- Артық шығындарды азайту (өнімділікті арттыру) #1371 +- №1375 кодты сәл жақсарту +- GDPR #1420 туралы бәрін қосыңыз + +### Түзетілді +- Жүктеуші: файлдардан аяқталмаған жүктеулерді жүктеу кезінде ақаулық жойылды .giga #1407 diff --git a/fastlane/metadata/android/kk/changelogs/64.txt b/fastlane/metadata/android/kk/changelogs/64.txt new file mode 100644 index 000000000..7dda13e3a --- /dev/null +++ b/fastlane/metadata/android/kk/changelogs/64.txt @@ -0,0 +1,8 @@ +### Жақсартулар +- Мобильді деректерді пайдалану кезінде бейне сапасын шектеу мүмкіндігі қосылды. #1339 +- #1442 сессиясының жарықтығын есте сақтаңыз +- Әлсіз #1431 процессорлары үшін жүктеу өнімділігі жақсарды +- #1433 медиа сессиясына (жұмыс) қолдау қосылды + +### Түзету +- Жүктеулерді ашқан кезде ақаулық жойылды (түзету енді шығарылым құрылымдары үшін қол жетімді) #1441 diff --git a/fastlane/metadata/android/kk/changelogs/65.txt b/fastlane/metadata/android/kk/changelogs/65.txt new file mode 100644 index 000000000..ae8d58657 --- /dev/null +++ b/fastlane/metadata/android/kk/changelogs/65.txt @@ -0,0 +1,24 @@ +### Жақсартулар +- Burgermenu белгішесінің анимациясын өшіріңіз #1486 +- #1472 жүктеулерді жоюды болдырмау +- Бөлісу мәзіріндегі жүктеу опциясы #1498 +- #1454 ұзақ басу мәзіріне" бөлісу " опциясы қосылды +- #1354 шыққан кезде негізгі ойыншыны айналдырыңыз +- Кітапхана нұсқасын жаңарту және № 1510 дерекқордың сақтық көшірмесін түзету +- Exoplayer 2.8.2 # 1392 Жаңартуы + - Жылдамдықты тезірек өзгерту үшін әр түрлі қадам өлшемдерін сақтау үшін ойнату жылдамдығын басқару диалогы қайта жасалды. + - Ойнату жылдамдығын басқаруда кідірту кезінде жылдам алға жылжу үшін қосқыш қосылды. Бұл аудиокітаптар мен белгілі бір музыкалық жанрлар үшін пайдалы болуы керек және шынымен тегіс ойнатуды қамтамасыз етуі мүмкін (және әнді көптеген қателіктермен бұзуы мүмкін =\\). + - Мультимедиа көзінің ажыратымдылығы метадеректерді қолмен емес, ойнатқыштың ішіндегі медиамен бірге жіберуге мүмкіндік беру үшін өзгертілді. Енді бізде метадеректердің жалғыз көзі бар, ол ойнатуды бастаған кезде тікелей қол жетімді. + - Ойнату тізімінің үзіндісін ашқан кезде жаңа метадеректер қол жетімді болған кезде қашықтағы ойнату тізімінің метадеректері жаңартылмағаны түзетілді. + - Пайдаланушы интерфейсінің әртүрлі түзетулері: # 1383, ойнатқыштың фондық хабарландыру басқару элементтері қазір әрқашан ақ түсті, қалқымалы ойнатқышты өшіру оңай +- Мультисервистік жұмыс үшін қайта өңделген архитектурасы бар жаңа экстракторды қолданыңыз + +### Түзетулер +- Түзетілді # 1440 жұмыс істемейтін бейне ақпарат макеті #1491 +- #1497 тарихты қарауды түзету + - #1495, пайдаланушы ойнату тізіміне кіргеннен кейін метадеректерді (нобай, Бейне атауы және Саны) жаңарту. + - #1475, пайдаланушы егжей-тегжейлі фрагментте сыртқы ойнатқышта бейнені іске қосқан кезде дерекқорда көріністі тіркеу арқылы. +- Қалқымалы режимде іске қосылған кезде Күту уақыты түзетілді. #1463 (түзетілген #640) +- Негізгі бейне ойнатқышты түзету #1509 + - [#1412] ойыншының белсенділігі фонда болған кезде жаңа ниет алған кезде ойыншының NPE шақыратын қайталау режимі түзетілді. + - Егер қалқымалы терезеге рұқсат берілмесе, ойнатқышты қалқымалы терезеге кішірейту ойнатқыштың жойылуына әкелмейтіні түзетілді. diff --git a/fastlane/metadata/android/pa/changelogs/995.txt b/fastlane/metadata/android/pa/changelogs/995.txt new file mode 100644 index 000000000..0da0a4261 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/995.txt @@ -0,0 +1,16 @@ +ਨਵਾਂ +• ਚੈਨਲ ਟੈਬਾਂ ਦਾ ਸਮਰਥਨ ਕਰੋ +• ਚਿੱਤਰ ਗੁਣਵੱਤਾ ਚੁਣੋ +• ਸਾਰੀਆਂ ਤਸਵੀਰਾਂ ਲਈ URL ਪ੍ਰਾਪਤ ਕਰੋ + +ਸੁਧਾਰ +• ਪਲੇਅਰ ਇੰਟਰਫੇਸ ਦੀ ਪਹੁੰਚਯੋਗਤਾ +• ਸਿਰਫ਼-ਵੀਡੀਓ ਡਾਊਨਲੋਡਾਂ ਲਈ ਬਿਹਤਰ ਆਡੀਓ ਚੋਣ +• ਸਾਂਝੀ ਕੀਤੀ ਪਲੇਲਿਸਟ ਸਮੱਗਰੀ ਵਿੱਚ ਪਲੇਲਿਸਟ ਅਤੇ ਵੀਡੀਓ ਨਾਮ ਸ਼ਾਮਲ ਕਰਨ ਦਾ ਵਿਕਲਪ + +ਠੀਕ ਕੀਤੇ +• [ਯੂਟਿਊਬ] ਲਾਈਕ ਗਿਣਤੀ ਨੂੰ ਠੀਕ ਕਰੋ +• ਪਲੇਅਰ ਰਿਸਪੌੰਡ ਨਹੀਂ ਕਰ ਰਿਹਾ ਦੇ ਸੁਨੇਹੇ ਦੇਣ ਵਾਲੇ ਪੌਪਅੱਪ ਅਤੇ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ +• ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਵਿੱਚ ਗਲਤ ਭਾਸ਼ਾਵਾਂ ਦੀ ਚੋਣ +• ਪਲੇਅਰ ਆਡੀਓ ਫੋਕਸ ਮਿਊਟ ਦਾ ਆਦਰ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ +• ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ ਆਈਟਮਾਂ ਨੂੰ ਜੋੜਨਾ ਕਦੇ-ਕਦਾਈਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ diff --git a/fastlane/metadata/android/pa/changelogs/996.txt b/fastlane/metadata/android/pa/changelogs/996.txt new file mode 100644 index 000000000..ac5940bc3 --- /dev/null +++ b/fastlane/metadata/android/pa/changelogs/996.txt @@ -0,0 +1,2 @@ +media.ccc.de ਵਿੱਚ ਇੱਕ ਚੈਨਲ / ਕਾਨਫਰੰਸ ਖੋਲ੍ਹਣ ਵੇਲੇ ਇੱਕ NullPointerException ਫਿਕਸ ਕੀਤਾ ਗਿਆ। +ਗ੍ਰਿੰਚ ਨੇ ਤੁਹਾਡੇ ਲਈ ਸਾਡੇ ਕ੍ਰਿਸਮਸ ਤੋਹਫ਼ੇ ਨੂੰ ਤੋੜਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ, ਪਰ ਅਸੀਂ ਇਸਨੂੰ ਠੀਕ ਕਰ ਦਿੱਤਾ। diff --git a/fastlane/metadata/android/pl/changelogs/995.txt b/fastlane/metadata/android/pl/changelogs/995.txt new file mode 100644 index 000000000..3a227a3ea --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/995.txt @@ -0,0 +1,16 @@ +Nowe +• Obsługa kart kanałów +• Wybór jakości obrazów +• Uzyskiwanie adresów URL do wszystkich obrazów + +Ulepszone +• Dostępność UI odtwarzacza +• Lepszy wybór dźwięku dla pobierania tylko wideo +• Opcja uwzględ. nazw playlist i wideo do udostęp. zawartości playlisty + +Naprawione +• [YouTube] Liczba polubień +• Zawieszone wysk. okienka i awarie odtwarzacza +• Błędne wybory w selektorze języków +• Skupienie na dźwięku odtwarzacza nie uwzględ. wyciszenia +• Czasami niedziałające dodawanie pozycji do playlisty diff --git a/fastlane/metadata/android/pt-BR/changelogs/64.txt b/fastlane/metadata/android/pt-BR/changelogs/64.txt index 74205f9ba..4497e3965 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/64.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/64.txt @@ -1,8 +1,8 @@ ### Melhorias -- Adicionada a capacidade de limitar a qualidade do vídeo ao usar dados móveis. # 1339 -- Lembra-se do brilho da sessão # 1442 -- Melhora o desempenho de download em CPUs mais fracas # 1431 -- Adiciona suporte (funcionando) à sessão de mídia # 1433 +- Adiciona o recurso de limitar a qualidade do vídeo ao usar dados móveis. #1339 +- Mantém o brilho da sessão #1442 +- Melhora o desempenho para baixar em CPU mais fracas #1431 +- Adiciona suporte (funcionando) à sessão de mídia #1433 ### Correção -- Corrige falha ao iniciar downloads (correção agora disponível em versões de lançamento) # 1441 +- Corrige falha ao iniciar Downloads (correção agora disponível em versões de lançamento) # 1441 diff --git a/fastlane/metadata/android/pt-BR/changelogs/954.txt b/fastlane/metadata/android/pt-BR/changelogs/954.txt index 449fde5dc..cd131c162 100644 --- a/fastlane/metadata/android/pt-BR/changelogs/954.txt +++ b/fastlane/metadata/android/pt-BR/changelogs/954.txt @@ -1,7 +1,7 @@ -fluxo de trabalho do novo aplicativo: reproduza vídeos na página de detalhes, deslize para baixo para minimizar o player -• Notificações MediaStyle: ações personalizáveis em notificações, melhorias de desempenho -• redimensionamento básico ao usar NewPipe como app de desktop -• mostrar diálogo com opções abertas em caso de URL não suportado -• Melhorada a experiência de sugestão de pesquisa -• Qualidade de vídeo padrão aumentada para 720p60 (player do app) e 480p (pop-up) -• correções de bugs +• Novo recurso: veja vídeos na página de detalhes, deslize para baixo para minimizar o vídeo +• Notificações MediaStyle: ações personalizáveis em notificações, melhorias de desempenho +• redimensionamento básico ao usar NewPipe como aplicativo de computador +• diálogo com opções abertas se URL não for suportado +• Melhor experiência de sugestão de pesquisa quando não pode ser buscada +• Maior qualidade do vídeo padrão para 720p60 no reprodutor interno e 480p no Pop-up +• correções de falhas e mais (?) diff --git a/fastlane/metadata/android/pt-BR/changelogs/994.txt b/fastlane/metadata/android/pt-BR/changelogs/994.txt new file mode 100644 index 000000000..d8e986051 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/994.txt @@ -0,0 +1,15 @@ +Novo +• Suporte a múltiplas faixas de áudio e idiomas +• Definição de gestos para volume e brilho em qualquer lado da tela +• Suporte para exibir abas principais na parte inferior da tela + +Melhorias +• [Bandcamp] Lida com faixas sob acesso pago + +Corrigido +• [YouTube] erros HTTP 403 para transmissões +• Tela preta ao alternar ao reprodutor a partir da visualização da lista de reprodução +• Vazamento de memória no reprodutor +• [PeerTube] Avatares do carregador e do subcanal foram trocados + +e mais diff --git a/fastlane/metadata/android/pt-BR/changelogs/995.txt b/fastlane/metadata/android/pt-BR/changelogs/995.txt new file mode 100644 index 000000000..943b842b0 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/995.txt @@ -0,0 +1,14 @@ +Novidades +• Suporta abas de canal +• Seleção da qualidade da imagem +• Obtém os URL para todas as imagens + +Melhorias +• Acessibilidade das interfaces do reprodutor +• Pode adicionar nome da lista de reprodução e de vídeo para compartilhamento do conteúdo +• Melhorias internas (?) e atualizações de dependências + +Corrigido +• Seleção de idiomas errados ao selecionar +• O foco do áudio do reprodutor não respeitava o mudo +• Adicionar itens para listas de reprodução não funcionava em casos específicos diff --git a/fastlane/metadata/android/pt-PT/changelogs/995.txt b/fastlane/metadata/android/pt-PT/changelogs/995.txt new file mode 100644 index 000000000..b22d3122a --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/995.txt @@ -0,0 +1,16 @@ +Novo +- Separadores de canais de suporte +- Selecionar a qualidade da imagem +- Obter URLs para todas as imagens + +Melhorado +- Acessibilidade das interfaces do leitor +- Melhor seleção de áudio para transferências apenas de vídeo +- Opção para incluir nomes de listas de reprodução e de vídeos no conteúdo de listas de reprodução partilhadas + +Corrigido +- YouTube] Correção da contagem de gostos +- Correção de popups e falhas do leitor que não responde +- Seleção de idiomas errados no seletor de idiomas +- A focagem do áudio do leitor não respeitava o silêncio +- A adição de itens à lista de reprodução não funcionava ocasionalmente. diff --git a/fastlane/metadata/android/pt/changelogs/995.txt b/fastlane/metadata/android/pt/changelogs/995.txt new file mode 100644 index 000000000..db7a18347 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/995.txt @@ -0,0 +1,16 @@ +Novo +- Separadores de canais de suporte +- Selecionar a qualidade da imagem +- Obter URLs para todas as imagens + +Melhorado +- Acessibilidade das interfaces do leitor +- Melhor seleção de áudio para transferências apenas de vídeo +- Opção para incluir nomes de listas de reprodução e de vídeos no conteúdo de listas de reprodução partilhadas + +Corrigido +- YouTube] Correção da contagem de gostos +- Correção de popups e falhas do leitor que não responde +- Seleção de idiomas errados no seletor de idiomas +- A focagem do áudio do leitor não estava a respeitar o silêncio +- A adição de itens à lista de reprodução não funcionava ocasionalmente. diff --git a/fastlane/metadata/android/pt/changelogs/996.txt b/fastlane/metadata/android/pt/changelogs/996.txt new file mode 100644 index 000000000..4f1c8f229 --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/996.txt @@ -0,0 +1,2 @@ +Foi corrigida uma NullPointerException ao abrir um canal/conferência em media.ccc.de. +O Grinch tentou estragar a nossa prenda de Natal, mas nós resolvemos o problema. diff --git a/fastlane/metadata/android/ru/changelogs/994.txt b/fastlane/metadata/android/ru/changelogs/994.txt new file mode 100644 index 000000000..bf11a4f4b --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/994.txt @@ -0,0 +1,13 @@ +Нововведения +• Поддержка нескольких аудиодорожек/языков +• Использование жестов настройки громкости и яркости на любой части экрана +• Поддержка отображения основных вкладок в нижней части экрана + +Улучшения +• [Bandcamp] Управление платными композициями + +Исправления +• [YouTube] Ошибки 403 HTTP при просмотре живых трансляций +• Чёрный плеер при переключении на основной плеер из режима просмотра плэйлистов +• Утечка памяти в службе плеера +• [PeerTube] Загрузчик и изображения профиля дополнительных каналов изменены местами diff --git a/fastlane/metadata/android/ru/changelogs/995.txt b/fastlane/metadata/android/ru/changelogs/995.txt new file mode 100644 index 000000000..11b54b662 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/995.txt @@ -0,0 +1,16 @@ +Новое +• Поддержка вкладок каналов +• Выбор качества изображения +• Получение URL всех изображений + +Улучшено +• Доступность интерфейсов плееров +• Выбор аудио для скачивания только видео +• Возможность включения названий плейлистов и видео в общий плейлист + +Исправлено +• Получение кол-ва лайков +• Плеер не видит всплывающие окона и вылетает +• Выбор неправильных языков в переключателе языков +• Фокусировка звука проигрывателя не учитывала выключение звука +• Добавление элемента плейлиста иногда не работает diff --git a/fastlane/metadata/android/ru/changelogs/996.txt b/fastlane/metadata/android/ru/changelogs/996.txt new file mode 100644 index 000000000..d516b0bc2 --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/996.txt @@ -0,0 +1,2 @@ +Исправлена ошибка NullPointerException при открытии канала/конференции в media.ccc.de. +Гринч пытался сломать наш рождественский подарок вам, но мы починили его. diff --git a/fastlane/metadata/android/si/full_description.txt b/fastlane/metadata/android/si/full_description.txt new file mode 100644 index 000000000..c5300a7e9 --- /dev/null +++ b/fastlane/metadata/android/si/full_description.txt @@ -0,0 +1 @@ +NewPipe කිසිදු Google රාමු පුස්තකාලයක් හෝ YouTube API භාවිතා නොකරයි. එය අවශ්‍ය තොරතුරු ලබා ගැනීම සඳහා වෙබ් අඩවිය විග්‍රහ කරයි. එබැවින් මෙම යෙදුම Google සේවා ස්ථාපනය කර නොමැති උපාංග මත භාවිතා කළ හැක. එසේම, ඔබට NewPipe භාවිතා කිරීමට YouTube ගිණුමක් අවශ්‍ය නොවන අතර එය FLOSS වේ. diff --git a/fastlane/metadata/android/si/short_description.txt b/fastlane/metadata/android/si/short_description.txt new file mode 100644 index 000000000..6f79e214d --- /dev/null +++ b/fastlane/metadata/android/si/short_description.txt @@ -0,0 +1 @@ +Android සඳහා නොමිලේ සැහැල්ලු YouTube ඉදිරි අන්තය. diff --git a/fastlane/metadata/android/sk/changelogs/994.txt b/fastlane/metadata/android/sk/changelogs/994.txt new file mode 100644 index 000000000..4095fafb2 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/994.txt @@ -0,0 +1,15 @@ +Nové +• Podpora viacerých zvukových skladieb / jazykov +• Umožňuje nastaviť objem a jasové gestá na každej strane obrazovky +• Podpora pre zobrazenie hlavných bodov v dolnej časti obrazovky + +Zlepšené +• [Bandcamp] podpora skladieb dostupná pre predplatiteľov + +Opravené +• [YouTube] 403 HTTP chýb pre streamy +• Čierná obrazovka pri prepínaní do hlavného prehrávača zo zobraznia z playlistu +• Pretečenie pamäte prehrávača +• [PeerTube] Avatary uploadera a subkanála boli vymenené + +a viac diff --git a/fastlane/metadata/android/sk/changelogs/995.txt b/fastlane/metadata/android/sk/changelogs/995.txt new file mode 100644 index 000000000..9729b3f70 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/995.txt @@ -0,0 +1,16 @@ +Nové +- Podpora kariet kanálov +- Výber kvality obrázka +- Získate adresy URL všetkých obrázkov + +Vylepšené +- Prístupnosť rozhrania prehrávača +- Lepší výber zvuku pri sťahovaní videa +- Možnosť zahrnúť názvy playlistov a videí do zdieľaného obsahu playlistov + +Opravené +- [YouTube] Oprava získavania počtu lajkov +- Oprava vyskakovacích okien a pádov prehrávača +- Výber nesprávnych jazykov vo výbere jazyka +- Zameranie zvuku prehrávača nerešpektovalo stlmenie +- Občas nefungovalo pridávanie položiek do playlistu diff --git a/fastlane/metadata/android/sk/changelogs/996.txt b/fastlane/metadata/android/sk/changelogs/996.txt new file mode 100644 index 000000000..25fa111b5 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/996.txt @@ -0,0 +1,2 @@ +Opravená výnimka NullPointerException pri otvorení kanála/konferencie v media.ccc.de. +Grinch sa pokúsil prekaziť náš vianočný darček pre vás, ale opravili sme to. diff --git a/fastlane/metadata/android/sr/changelogs/994.txt b/fastlane/metadata/android/sr/changelogs/994.txt new file mode 100644 index 000000000..3ed14410d --- /dev/null +++ b/fastlane/metadata/android/sr/changelogs/994.txt @@ -0,0 +1,15 @@ +Ново +• Подржава више аудио снимака/језика +• Дозвољава подешавање јачине звука и покрета за осветљење на било којој страни екрана +• Подршка за приказивање главних картица на дну екрана + +Побољшано +• [Bandcamp] Управљање нумерама иза платног зида + +Поправљено +• [YouTube] 403 HTTP грешке за стримове +• Црни плејер при преласку на главни плејер са приказа плејлисте +• Цурење сервисне меморије плејера +• [PeerTube] Аватари отпремаоца и подканала су замењени + +и још много тога diff --git a/fastlane/metadata/android/sr/changelogs/995.txt b/fastlane/metadata/android/sr/changelogs/995.txt new file mode 100644 index 000000000..0604eb088 --- /dev/null +++ b/fastlane/metadata/android/sr/changelogs/995.txt @@ -0,0 +1,16 @@ +Ново +• Подршка за картице канала +• Могућност бирања квалитета слике +• Набавите URL адресе за све слике + +Побољшано +• Прист. интерф. плејера +• Бољи избор звука за преузимања само видео снимака +• Опција за укљ. назива плејлисте и видео сним. у дељ. сад. плејл. + +Поправљено +• [YouTube] Попр. доб. лајкова +• Попр. проб. када плејер не реаг. на иск. проз. и отказује +• Изб. погр. јез. у бир. јез. +• Аудио фокус плејера није пошт. утиш. звук +• Додавање пред. на плејлисте повр. не функционише diff --git a/fastlane/metadata/android/sr/changelogs/996.txt b/fastlane/metadata/android/sr/changelogs/996.txt new file mode 100644 index 000000000..749b74624 --- /dev/null +++ b/fastlane/metadata/android/sr/changelogs/996.txt @@ -0,0 +1,2 @@ +Поправљен NullPointerException приликом отварања канала/конференције у media.ccc.de. +Гринч је покушао да вам поквари наш божићни поклон, али смо то поправили. diff --git a/fastlane/metadata/android/sr/full_description.txt b/fastlane/metadata/android/sr/full_description.txt index df0c3c3f9..e488a0ea4 100644 --- a/fastlane/metadata/android/sr/full_description.txt +++ b/fastlane/metadata/android/sr/full_description.txt @@ -1 +1 @@ -ЊуПајп не користи ниједну библиотеку Гугл оквира нити Јутјуб АПИ. Само скида са Јутјуба оно што му је потребно. Стога се ова апликација може користити на уређајима без инсталираних Гугл услуга. Такође, није вам потребан Јутјуб налог да бисте користили ЊуПајп, и још је слободан, бесплатан и отвореног кода. +NewPipe не користи никакве библиотеке Google оквира, нити YouTube API. Само анализира веб-сајт како би добио потребне информације. Из тог разлога, ова апликација се може користити на уређајима без инсталираних Google услуга. Такође, није Вам потребан YouTube налог да бисте користили NewPipe, a чак је и слободног, отвореног кода. diff --git a/fastlane/metadata/android/sr/short_description.txt b/fastlane/metadata/android/sr/short_description.txt index 34168631b..82608e9db 100644 --- a/fastlane/metadata/android/sr/short_description.txt +++ b/fastlane/metadata/android/sr/short_description.txt @@ -1 +1 @@ -Бесплатна и лагана Јутјуб замена за Андроид. +Бесплатна и лагана замена за YouTube за Android. diff --git a/fastlane/metadata/android/sv/changelogs/63.txt b/fastlane/metadata/android/sv/changelogs/63.txt index dcf52354b..51c6551c1 100644 --- a/fastlane/metadata/android/sv/changelogs/63.txt +++ b/fastlane/metadata/android/sv/changelogs/63.txt @@ -1,7 +1,7 @@ ### Förbättringar -- Import/export inställningar #1333 +- Import/exportinställningar #1333 - Minskade överdragningen (prestandaförbättring) #1371 -- Små kod förbättringar #1375 +- Små kodförbättringar #1375 - La till allt om GDPR #1420 ### Fixade diff --git a/fastlane/metadata/android/sv/changelogs/64.txt b/fastlane/metadata/android/sv/changelogs/64.txt index f874eebff..182fc0156 100644 --- a/fastlane/metadata/android/sv/changelogs/64.txt +++ b/fastlane/metadata/android/sv/changelogs/64.txt @@ -1,8 +1,8 @@ ### Förbättringar -- La till möjligheten all begränsa video kvaliteten vid användning av mobildata. #1339 +- La till möjligheten all begränsa videokvaliteten vid användning av mobildata. #1339 - Kom ihåg ljusstyrka för sessionen #1442 -- Förbättra nedladdnings prestandan på svagare CPUs #1431 -- La till (fungerande) support för media sessioner #1433 +- Förbättra nedladdningsprestandan på svagare CPUs #1431 +- La till (fungerande) support för mediasessioner #1433 ### Fixade - Fixade krasch vid öppning av nedladdningar (fixen är nu tillgänglig för release builds) #1441 diff --git a/fastlane/metadata/android/sv/changelogs/954.txt b/fastlane/metadata/android/sv/changelogs/954.txt new file mode 100644 index 000000000..4ba3dc350 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/954.txt @@ -0,0 +1,9 @@ +• nytt arbetsflöde för applikationen: spela upp videor på detalj-sidan, dra nedåt för att minimera spelaren +• MediaStyle-aviseringar: anpassningsbara åtgärder i aviseringar, prestanda-förbättringar +• grundläggande storleksändring när NewPipe används som en skrivbordsapp + +• visa ett dialogfönster med öppna alternativ i händelse av en URL-toast som inte stöds +• Förbättra sökförslagsupplevelsen när avlägsna sökningar inte kan hämtas +• Ökad standardvideokvalitet till 720p60 (spelare i appen) och 480p (popup-spelare) + +• tonvis med buggfixar och mer diff --git a/fastlane/metadata/android/sv/changelogs/957.txt b/fastlane/metadata/android/sv/changelogs/957.txt new file mode 100644 index 000000000..a8be4f09b --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/957.txt @@ -0,0 +1,10 @@ +• Förenade specifika kö åtgärder +• Två finger gest att stänga spelare +• Tillåt rensning av reCAPTCHA-cookies +• Inställning för att inte färglägga meddelande +• Förbättra hur videoinformation öppnas för att fixa oändlig buffring, buggigt beteende när du delar till NewPipe och andra inkonsekvenser +• Snabba upp YouTube-videor och fixa åldersbegränsning +• Fixa krasch vid snabb fram/bak spolning +• Ordna inte listor genom att dra miniatyrer +• Kom alltid ihåg popup egenskaper +• Lägga till Santali språk diff --git a/fastlane/metadata/android/sv/changelogs/958.txt b/fastlane/metadata/android/sv/changelogs/958.txt new file mode 100644 index 000000000..268362f87 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/958.txt @@ -0,0 +1,10 @@ +Nytt och förbättrat: +• La till inställning för att dölja miniatyr på låsskärmen +• Dra för att uppdatera flöde +• Förbättrad prestanda vid hämtning av lokala listor + +Fixat: +• Fixade krasch när du startar NewPipe efter att den togs bort från RAM +• Fixade krasch vid start när det inte finns någon internetanslutning +• Fixade respekt för ljusstyrka- och volymgestinställningar +• [YouTube] Fixade långa spellistor diff --git a/fastlane/metadata/android/sv/changelogs/961.txt b/fastlane/metadata/android/sv/changelogs/961.txt new file mode 100644 index 000000000..6e1abc229 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/961.txt @@ -0,0 +1,12 @@ +• [YouTube] Mix stöd +• [YouTube] Visa information om offentliga programföretag och Covid-19 +• [media.ccc.de] La till nya videor +• La till somalisk översättning + +• Många interna förbättringar + +• Fixade delning av videor ifrån spelaren +• Fixade blank ReCaptcha webview +• Fixade krasch som inträffade när du tar bort en ström från en lista +• [PeerTube] Fixade relaterade strömmar +• [YouTube] Fixade YouTube Musiksökning diff --git a/fastlane/metadata/android/sv/changelogs/964.txt b/fastlane/metadata/android/sv/changelogs/964.txt new file mode 100644 index 000000000..cbdc9f4ff --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/964.txt @@ -0,0 +1,7 @@ +• La till stöd för kapitel i spelarkontroller +• [PeerTube] La till Sepia-sökning +• La till dela knappen i videodetaljvy och flyttad strömbeskrivning till flik layouten +• Inaktivera återställande av ljusstyrka om ljusstyrks gest är inaktiverad +• Lägg till listobjekt för att spela video på kodi +• Fixade krasch när ingen standardwebbläsare är inställd på vissa enheter och förbättrade dela dialog +• Växla spela/pausa med hårdvaru mellanslags knapp i fullskärm diff --git a/fastlane/metadata/android/sv/changelogs/965.txt b/fastlane/metadata/android/sv/changelogs/965.txt new file mode 100644 index 000000000..9b298947a --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/965.txt @@ -0,0 +1,6 @@ +Fixade krasch som inträffade vid förflyttning av kanalgrupper. +Fixade hämtning av fler YouTube videor från kanaler och spellistor. +Fixade hämtning av YouTube kommentarer. +La till stöd för /watch /, /v / och /w / subpaths i YouTube adresser. +Fixade extraktion av SoundCloud klient id och geobegränsat innehåll. +La till nordkurdisk lokalisering. diff --git a/fastlane/metadata/android/sv/changelogs/966.txt b/fastlane/metadata/android/sv/changelogs/966.txt new file mode 100644 index 000000000..b8e183604 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/966.txt @@ -0,0 +1,14 @@ +Nytt: +• La till en ny tjänst: Bandcamp + +Förbättrat: +• Lägg till en inställning för att appen ska följa enhetstemat +• Förhindra vissa kraschar genom att visa en förbättrad felpanel +• Visa mer information om varför innehåll är otillgängligt +• Hårdvaru mellanslagsknapp ändrar spela/pausa +• Visa "Nedladdning startad" toast + +Fixat: +• Fixade liten miniatyr i videodetaljer medan du spelar i bakgrunden +• Fixade tom titel i minimerad spelare +• Fixade senaste storleksläge som inte återställdes korrekt diff --git a/fastlane/metadata/android/sv/changelogs/968.txt b/fastlane/metadata/android/sv/changelogs/968.txt new file mode 100644 index 000000000..4582309f4 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/968.txt @@ -0,0 +1,7 @@ +La till kanalinformationsalternativ i långtrycksmenyn. +La till funktionalitet för att byta namn från spellistans gränssnitt. +Låt användaren pausa medan en video buffrar. +Polerade det ljusa temat. +Fixade överlappande teckensnitt när du använder en större teckenstorlek. +Fixade ingen video på Formuler och Zephier enheter. +Fixade olika kraschar. diff --git a/fastlane/metadata/android/sv/changelogs/970.txt b/fastlane/metadata/android/sv/changelogs/970.txt new file mode 100644 index 000000000..020ee2c1b --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/970.txt @@ -0,0 +1,11 @@ +Nytt +• Visa innehåll metadata (taggar, kategorier, licens, ...) under beskrivningen +• Lägg till alternativet "Visa kanalinformation" i distans (icke-lokala) spellistor +• Lägg till "Öppna i webbläsare" -alternativ för långtrycksmeny + +Fixat +• Fixade rotations krasch på video detalj sida +• Fixade "Spela med Kodi" knappen i spelaren som alltid uppmanade till att installera Kore +• Fixade och förbättrad inställning av import och exportvägar +• [YouTube] Fixade kommentarers gilla antal +Och mycket mer diff --git a/fastlane/metadata/android/sv/changelogs/975.txt b/fastlane/metadata/android/sv/changelogs/975.txt new file mode 100644 index 000000000..f280c3830 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/975.txt @@ -0,0 +1,15 @@ +Nytt +• Visa en miniatyr förhandsvisning medan du söker +• Upptäck avstängda kommentarer +• Tillåt markering av ett flödesobjekt som visat +• Visa kommentar hjärtan + +Förbättrat +• Förbättrade metadata och tagg layout +• Applicera service färg till UI komponenter + +Fixat +• Fixade miniatyrbild i minispelare +• Fixade oändlig buffring på dubbla köartiklar +• Vissa spelare fixar som rotation och snabbare stängning +• Fixade ReCAPTCHA som var kvar i bakgrunden diff --git a/fastlane/metadata/android/sv/changelogs/976.txt b/fastlane/metadata/android/sv/changelogs/976.txt new file mode 100644 index 000000000..96b005170 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/976.txt @@ -0,0 +1,9 @@ +• La till alternativ för att direkt öppna spelare i fullskärm +• Tillåt användaren att välja vilka typer av sökförslag som ska visas +• Mörkt tema är nu mörkare + mörk startskärm tillagd +• Förbättrade fil väljare att gråa ut oönskade filer +• Fixade import av YouTube prenumerationer +• Att spela en ström kräver tryck på spela knappen igen +• [Android TV] Fixa långa sökbar hopp vid användning av en DPad + +För att se ytterligare ändringar, se ändringsloggen (och blogginlägg) från Länkfliken nedan. diff --git a/fastlane/metadata/android/sv/changelogs/983.txt b/fastlane/metadata/android/sv/changelogs/983.txt new file mode 100644 index 000000000..edc397a29 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/983.txt @@ -0,0 +1,9 @@ +La till nytt dubbel tryck för att söka UI och beteende +Gör inställningar sökbara +Markera fäst kommentarer som sådana +Lägg till öppna med app stöd för FSFE PeerTube instans +Lägg till felmeddelanden +Fixade repris av första kö objekt vid spelar förändring +Vänta längre vid buffring under livestreams innan misslyckande +Fixade ordning av lokala sökresultat +Fixade tomma objektfält i spelkö diff --git a/fastlane/metadata/android/sv/changelogs/986.txt b/fastlane/metadata/android/sv/changelogs/986.txt new file mode 100644 index 000000000..2ebaacaa8 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/986.txt @@ -0,0 +1,15 @@ +Nytt +• Avisering för nya strömningar +• Sömlös övergång mellan bakgrund och videospelare +• Ändra pitch av semitoner +• Lägg till huvudspelarens kö i en spellista + +Förbättrat +• Kom ihåg hastighet/pitch steg storlek +• Mildra initial lång buffring i videospelaren +• Förbättra spelarens UI för Android TV +• Bekräfta innan borttagning av alla nedladdade filer + +Fixat +• Fixade media knapp som inte gömde spelarkontroller +• Fixade uppspelningsåterställning vid spelar förändring diff --git a/fastlane/metadata/android/sv/changelogs/987.txt b/fastlane/metadata/android/sv/changelogs/987.txt new file mode 100644 index 000000000..59416e59e --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/987.txt @@ -0,0 +1,12 @@ +Nytt +• Stöd andra leveransmetoder än progressiv HTTP: snabbare uppspelningstid, fixar för PeerTube och SoundCloud, uppspelning av nyligen avslutade YouTube strömmar +• La till knapp för att lägga till en fjärrspellista till en lokal +• Bildförhandsvisning i Android 10+ dela blad + +Förbättrat +• Förbättrade uppspelningsparametrar dialog +• Flytta abonnemang import/exportknappar till trepunktsmenyn + +Fixat +• Fixade ta bort tittade videor från spellista +• Fixade dela meny tema och "lägg till i spellista" diff --git a/fastlane/metadata/android/sv/changelogs/988.txt b/fastlane/metadata/android/sv/changelogs/988.txt new file mode 100644 index 000000000..09335ecbc --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Fixade "Kan inte få någon ström" fel vid spelning av någon video +[YouTube] Fixade "Det följande innehållet är inte tillgängligt på den här appen." meddelandet visas istället för videon som begärs diff --git a/fastlane/metadata/android/sv/changelogs/989.txt b/fastlane/metadata/android/sv/changelogs/989.txt new file mode 100644 index 000000000..28dcdf245 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Fixade oändlig laddning vid försök att spela någon video +• [YouTube] Fixade throttling på vissa videor +• Uppgraderade jsoup-biblioteket till 1.15.3, vilket inkluderar en säkerhetsfix diff --git a/fastlane/metadata/android/sv/changelogs/990.txt b/fastlane/metadata/android/sv/changelogs/990.txt new file mode 100644 index 000000000..1f1069acc --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/990.txt @@ -0,0 +1,15 @@ +Denna version avslutar stödet för Android 4.4 KitKat, nu är den minsta versionen Android 5 Lollipop! + +Nytt +• Ladda ner från lång-tryck menyn +• Dölj framtida videor i flödet +• Dela lokala spellistor + +Förbättrat +• Refaktorera spelarkoden i små komponenter: mindre RAM används, mindre buggar +• Förbättra miniatyrernas skalläge +• Vectorisera bildplatshållare + +Fixat +• Fixade problem med spelarens meddelande: föråldrad/saknad media info, förvrängd miniatyr +• Fixade fullskärm som använde 1/4 av skärmen diff --git a/fastlane/metadata/android/sv/changelogs/991.txt b/fastlane/metadata/android/sv/changelogs/991.txt new file mode 100644 index 000000000..7f79c5ee7 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/991.txt @@ -0,0 +1,13 @@ +Nytt +• Lägg till "Öppna i webbläsare" knappen i felpanel +• Lägg till inställning för att visa kanalgrupper som lista +• [YouTube] Långtryck på strömsegment för att dela tidsstämpel URL +• Lägg till play kö knapp till minispelare + +Förbättrat +• Lägg till isländsk lokalisering och uppdatera många andra översättningar +• Många interna förbättringar + +Fixat +• Fixade flera kraschar +• [YouTube] Fixade laddning av kanaler, icke-dedikerade flöden och uppspelningsproblem i vissa länder diff --git a/fastlane/metadata/android/sv/changelogs/992.txt b/fastlane/metadata/android/sv/changelogs/992.txt new file mode 100644 index 000000000..253f1e531 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/992.txt @@ -0,0 +1,17 @@ +Nytt +• Prenumerant antal i videodetaljer +• Ladda ner från kön +• Ställ in en permanent miniatyr fr spellista +• Långtryckt hashtags och länkar +• Kortvys läge + +Förbättrat +• Större minispelar stäng knapp +• Mjukare miniatyrs nedskalning +• Sikta på Android 13 (API 33) +• Sökning pausar inte längre spelaren + +Fixat +• Fixade overlay på DeX/Mouse +• Tillåt bakgrundsspelare utan separata ljudströmmar +• Olika YouTube-fixar och mer… diff --git a/fastlane/metadata/android/sv/changelogs/993.txt b/fastlane/metadata/android/sv/changelogs/993.txt new file mode 100644 index 000000000..a06eafcd7 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/993.txt @@ -0,0 +1,12 @@ +Nytt +• La till varning vid tilläggning av dubbletter i spellista och la till knapp för att ta bort dem +• Tillåt ignorering av hårdvaruknappar +• Tillåt att dölja delvis tittade videor från flödet + +Förbättrat +• Använd fler rutnät kolumner på stora skärmar +• Gör framstegsindikatorer konsekventa med inställningar + +Fixat +• Fixade öppning av webbläsar URLs, nedladdningar och externa spelare på Android 11+ +• Fixade interaktion med helskärm som kräver två tryck på MIUI diff --git a/fastlane/metadata/android/sv/changelogs/994.txt b/fastlane/metadata/android/sv/changelogs/994.txt new file mode 100644 index 000000000..a07e83500 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/994.txt @@ -0,0 +1,15 @@ +Nytt +• Stöd flera ljudspår/språk +• Tillåt inställning av volym och ljusstyrks gester på valfri sida av skärmen +• Stöd för att visa huvudflikar längst ner på skärmen + +Förbättrat +• [Bandcamp] Hantera spår bakom betalvägg + +Fixat +• [YouTube] 403 HTTP-fel för strömmar +• Svart spelare vid byte till huvudspelare från spellistans vy +• Spela service minnesläckor +• [PeerTube] Uppladdare och sub kanal avatarer var utbytta + +och mer diff --git a/fastlane/metadata/android/sv/changelogs/995.txt b/fastlane/metadata/android/sv/changelogs/995.txt new file mode 100644 index 000000000..be1460739 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/995.txt @@ -0,0 +1,16 @@ +Nytt +• Stöd kanalflikar +• Välj bildkvalitet +• Få webbadresser till alla bilder + +Förbättrat +• Tillgänglighet för spelargränssnitt +• Bättre ljudval för endast video nedladdningar +• Alternativ att inkludera spellista och videonamn till delat spellistinnehåll + +Fixat +• [YouTube] Fixade hämtning av gillaantal +• Fixade spelare som inte svarar popup och kraschar +• Val av fel språk i språkväljare +• Spelarens ljudfokus respekterade inte mute +• Spellist-objekt addition som ibland inte fungerade diff --git a/fastlane/metadata/android/sv/changelogs/996.txt b/fastlane/metadata/android/sv/changelogs/996.txt new file mode 100644 index 000000000..8ee87d8c8 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/996.txt @@ -0,0 +1,2 @@ +Fixade en NullPointerException när du öppnar en kanal / konferens i media.ccc.de. +Grinchen försökte förstöra vår julklapp till er, men vi fixade den. diff --git a/fastlane/metadata/android/sv/short_description.txt b/fastlane/metadata/android/sv/short_description.txt index 6b29f892c..d0e04f585 100644 --- a/fastlane/metadata/android/sv/short_description.txt +++ b/fastlane/metadata/android/sv/short_description.txt @@ -1 +1 @@ -En gratis lättviktsklient för YouTube på Android. +En gratis lättviktsklient för YouTube för Android. diff --git a/fastlane/metadata/android/tr/changelogs/68.txt b/fastlane/metadata/android/tr/changelogs/68.txt index b2507d484..069a0a22e 100644 --- a/fastlane/metadata/android/tr/changelogs/68.txt +++ b/fastlane/metadata/android/tr/changelogs/68.txt @@ -1,31 +1,31 @@ # v0.14.1 değişiklikleri -### Sabit -- Sabit video url # 1659 şifresini çözmek için başarısız oldu -- Sabit açıklama bağlantısı iyi ayıklanmıyor # 1657 +### Düzeltmeler +- Video url'sinin şifresinin çözülememesi düzeltildi #1659 +- Sabit açıklama bağlantısı iyi açılamıyor #1657 # v0.14.0 değişiklikleri -### Yeni -- Yeni Çekmece tasarımı # 1461 -- Yeni özelleştirilebilir ön sayfa # 1461 +### Yenilikler +- Yeni Çekmece tasarımı #1461 +- Yeni özelleştirilebilir ön sayfa #1461 -### Geliştirmeler -- Yeniden işlenmiş Hareket kontrolleri # 1604 -- Pop-up oynatıcıyı kapatmanın yeni yolu # 1597 +### İyileştirmeler +- Yenilenmiş Hareket kontrolleri #1604 +- Açılır oynatıcıyı kapatmanın yeni yolu #1597 -### Sabit -- Abonelik sayısı mevcut olmadığında bir hata düzeltildi. # 1649'u kapatır. -- Bu durumlarda "Abone sayısı mevcut değil" i göster -- Bir YouTube çalma listesi boş olduğunda npe'yi düzeltin -- Soundcloud'daki kiosklar için hızlı düzeltme -- Refactor ve hata düzeltme # 1623 -- Döngüsel arama sonucunu düzelt # 1562 -- Statik olarak yerleştirilmemiş Arama çubuğunu düzeltin -- Fix YT Premium video doğru engellenmiyor -- Bazen yüklenmeyen videoları düzeltin (ÇİZGİ ayrıştırma nedeniyle) -- Video açıklamasındaki bağlantıları düzeltin -- Birisi harici sd karta indirmeye çalıştığında uyarıyı göster -- gösterilen hiçbir şey düzeltilmedi istisna tetikleyicileri raporu -- android 8.1 için arka plan oynatıcısında gösterilmeyen küçük resim [buraya bakın] (https://github.com/TeamNewPipe/NewPipe/issues/943 ) -- Yayın alıcısının kaydını düzeltin. # 1641'i kapatır. +### Düzeltmeler +- Abonelik sayısı mevcut olmadığında hatayı düzeldi. Kapatılır #1649. + - Bu durumlarda "Abone sayısı mevcut değil" ifadesini göster +- Bir YouTube oynatma listesi boş olduğunda NPE düzeltme +- SoundCloud'daki kiosklar için hızlı düzeltme +- Yeniden düzenleme ve hata düzeltme #1623 + - Döngüsel arama sonucunu düzeltildi#1562 + - Arama çubuğu statik olarak düzenlenmemiş düzeltildi + -YT Premium videoları doğru şekilde engellenmiyor düzeltildi + - Videoların bazen yüklenmemesi düzeltildi (DASH ayrıştırma nedeniyle) + - Video açıklamasındaki bağlantıları düzeltildi + - Birisi harici sd karta indirmeye çalıştığında uyarı göster + - Gösterilen hiçbir istisna tetikleyici bildirmesi düzeltildi + - android 8.1 için arka plan oynatıcıda küçük resim gösterilmiyor [buradan ulaşabilirsiniz](https://github.com/TeamNewPipe/NewPipe/issues/943) +- Yayın alıcısının kaydı düzeltildi. Kapatılır #1641. diff --git a/fastlane/metadata/android/tr/changelogs/69.txt b/fastlane/metadata/android/tr/changelogs/69.txt new file mode 100644 index 000000000..d927ed9c4 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/69.txt @@ -0,0 +1,19 @@ +### Yenilikler +- Aboneliklerde uzun dokunarak silme ve paylaşma işlemleri eklendi #1516 +- Tablet kullanıcı arayüzü ve kılavuz liste düzeni eklendi #1617 + +### İyileştirmeler +- En son kullanılan en-boy oranını kaydetme ve tekrar yükleme eklendi #1748 +- İndirmeler etkinliğinde tam video isimleriyle lineer düzen etkinleştirildi #1771 +- Abonelikleri doğrudan abonelikler sekmesi içinden silme ve paylaşma eklendi #1516 +- Kuyrukta oynatma zaten sona ermişse video oynatmayı tetikleyen sıra eklendi #1783 +- Ses ve parlaklık jestleri için ayrı ayarlar eklendi #1644 +- Yerelleştirme desteği eklendi #1792 + +### Düzeltmeler +- Finlandiya'da kullanılabilmesi için nokta biçemi için zaman ayrıştırma düzeltildi +- Abonelik sayısı düzeltildi +- API 28+ cihazlar için öncelikli hizmet izni eklendi #1830 + +### Bilinen Hatalar +- Oynatma durumu Android P üzerinde kaydedilemiyor diff --git a/fastlane/metadata/android/tr/changelogs/70.txt b/fastlane/metadata/android/tr/changelogs/70.txt new file mode 100644 index 000000000..930b73eeb --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/70.txt @@ -0,0 +1,25 @@ +DİKKAT: Bu sürüm muhtemelen bir öncekinde olduğu gibi bir hata festivalidir. Ancak 17. sürümden bu yana tam kapanma nedeniyle bozuk bir sürüm, hiç sürüm olmamasından daha iyidir. Değil mi? ¯\_(ツ)_/¯ + +### İyileştirmeler +* indirilen dosyalar artık tek bir tıklama ile açılabilir #1879 +* Android 4.1 - 4.3 için desteği bırakın #1884 +* eski oynatıcıyı kaldır #1884 +* akışları sağa kaydırarak mevcut oynatma kuyruğundan kaldırın #1915 +* Yeni bir akış manuel olarak sıralandığında otomatik sıralanan akışı kaldır #1878 +* İndirmeler için postprocessing ve eksik özellikleri uygulama #1759 by @kapodamy +* İşlem sonrası altyapı +* Uygun hata işleme "altyapısı" (indirici için) +* Çoklu indirme yerine kuyruk +* Serileştirilmiş bekleyen indirmeleri (`.giga` dosyaları) uygulama verilerine taşı +* Maksimum indirme yeniden denemesini uygulayın +* Uygun çok iş parçacıklı indirme duraklatması +* Mobil ağa geçildiğinde indirmeleri durdur (asla çalışmaz, bkz. 2. nokta) +* İplik sayısını sonraki indirmeler için saklayın +* Bir çok tutarsızlık düzeltildi + +### Sabit +* Varsayılan çözünürlük en iyi ve sınırlı mobil veri çözünürlüğü olarak ayarlandığında oluşan çökme düzeltildi #1835 +* pop-up oynatıcı çökmesi düzeltildi #1874 +* Arka plan oynatıcısını açmaya çalışırken NPE #1901 +* Otomatik kuyruklama etkinleştirildiğinde yeni akışların eklenmesi için düzeltme #1878 +* deşifre sorunu düzeltildi diff --git a/fastlane/metadata/android/tr/changelogs/71.txt b/fastlane/metadata/android/tr/changelogs/71.txt new file mode 100644 index 000000000..8786821a6 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/71.txt @@ -0,0 +1,10 @@ +### İyileştirmeler +* GitHub derlemesi için uygulama güncelleme bildirimi ekleyin (#1608 yazan @krtkush) +* İndiricide çeşitli iyileştirmeler (@kapodamy tarafından #1944): +* eksik beyaz simgeleri ekleyin ve simge renklerini değiştirmek için sert çizgili yol kullanın +* yineleyicinin başlatılıp başlatılmadığını kontrol edin (#2031'i düzeltir) +* Yeni muxer'da " işlem-sonrası başarısız" hatası ile yeniden indirme denemelerine izin verin +* Senkronize olmayan video ve ses akışlarını düzelten yeni MPEG-4 muxer (#2039) + +### Sabit +* YouTube canlı yayınları kısa bir süre sonra oynatılmayı durduruyor (#1996 by @yausername) diff --git a/fastlane/metadata/android/tr/changelogs/730.txt b/fastlane/metadata/android/tr/changelogs/730.txt new file mode 100644 index 000000000..cb6e64592 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/730.txt @@ -0,0 +1,2 @@ +# Sabit +- Şifre çözme işlevi hatasını tekrar düzeltin. diff --git a/fastlane/metadata/android/tr/changelogs/740.txt b/fastlane/metadata/android/tr/changelogs/740.txt new file mode 100644 index 000000000..14f47d14d --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/740.txt @@ -0,0 +1,22 @@ +Sure, I can provide a Turkish translation for your list: + +**Geliştirmeler** +- Yorumlardaki bağlantıları tıklanabilir yap, metin boyutunu artır +- Zaman damgası bağlantılarına tıklanınca konumu ayarla +- Son seçilen duruma göre tercih edilen sekme göster +- Çalma listesi penceresinde 'Arka Plan' üzerine uzun tıklayarak sıraya ekle +- URL olmayan paylaşılan metni ara +- Ana video oynatıcısına 'şu anki zamanda paylaş' düğmesi ekle +- Video sırası bittiğinde ana oynatıcıya kapat düğmesi ekle +- Video listesi öğeleri için uzun tıklama menüsüne 'Arka Planda Doğrudan Oynat' ekle +- Play/Enqueue komutları için İngilizce çevirileri iyileştir +- Küçük performans iyileştirmeleri +- Kullanılmayan dosyaları kaldır +- ExoPlayer'ı 2.9.6 sürümüne güncelle +- Invidious bağlantılarına destek ekle + +**Düzeltmeler** +- Yorumlar ve ilgili akışlar devre dışı bırakıldığında kaydırma sorununu düzelt +- CheckForNewAppVersionTask'in gereksiz yürütülmesini düzelt +- Geçersiz URL'leri olan abonelikleri yok say ve başlığı boş olanları sakla +- Geçersiz YouTube URL'lerini düzelt: İmza etiket adı her zaman "signature" olmadığından akışların yüklenmesini engelle diff --git a/fastlane/metadata/android/tr/changelogs/750.txt b/fastlane/metadata/android/tr/changelogs/750.txt new file mode 100644 index 000000000..8e3a2f37f --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/750.txt @@ -0,0 +1,21 @@ +Yeni +Oynatma devam ediyor #2288 +- Akışlara en son kaldığınız yerden devam edin +İndirici Geliştirmeleri #2149 +- İndirmeleri harici SD kartlarda depolamak için Depolama Erişim Çerçevesini kullanın +- Yeni mp4 muxer +- İsteğe bağlı olarak indirme işlemine başlamadan önce indirme dizinini değiştirme +- Ölçülü ağlara saygı gösterin + +Geliştirilmiş +- Gema dizeleri kaldırıldı #2295 +- Etkinlik yaşam döngüsü sırasında (otomatik) rotasyon değişikliklerini işleme #2444 +- Uzun basma menülerini tutarlı hale getirin #2368 + +Sabit +- Seçili altyazı parça adının gösterilmemesi düzeltildi #2394 +- Uygulama güncellemesi kontrolü başarısız olduğunda çökme (GitHub sürümü) #2423 +- İndirmelerin %99,9'da takılması düzeltildi #2440 +- Oynatma kuyruğu meta verilerini güncelleme #2453 +- [SoundCloud] Çalma listeleri yüklenirken oluşan çökme düzeltildi TeamNewPipe/NewPipeExtractor#170 +- [YouTube] Sabit süre ayrıştırılamıyor TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/tr/changelogs/760.txt b/fastlane/metadata/android/tr/changelogs/760.txt new file mode 100644 index 000000000..f6ca13ce6 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/760.txt @@ -0,0 +1,40 @@ +0.17.1'deki Değişiklikler + +Yeni +- Tayca yerelleştirme + +Geliştirilmiş +- Çalma listeleri için uzun basma menülerine burada oynatmaya başla eylemini tekrar ekleyin #2518 +- SAF / eski dosya seçici için anahtar ekleyin #2521 + +Sabit +- Uygulama değiştirirken indirilenler görünümünde kaybolan düğmeleri düzeltme #2487 +- İzleme geçmişi devre dışı olmasına rağmen sabit oynatma konumu kaydedilir +- Liste görünümlerinde oynatma konumunun neden olduğu düşük performansı düzeltme #2517 +- [Extractor] ReCaptchaActivity #2527'yi düzeltin, TeamNewPipe/NewPipeExtractor#186 +- [Extractor] [YouTube] Çalma listeleri sonuçlarda olduğunda sıradan arama hatasını düzeltin TeamNewPipe/NewPipeExtractor#185 + +0.17.0'daki Değişiklikler + +Yeni +Oynatma devam ediyor #2288 +- Akışlara en son kaldığınız yerden devam edin +İndirici Geliştirmeleri #2149 +- İndirmeleri harici SD kartlarda depolamak için Depolama Erişim Çerçevesini kullanın +- Yeni mp4 muxer +- İsteğe bağlı olarak indirme işlemine başlamadan önce indirme dizinini değiştirme +- Ölçülü ağlara saygı gösterin + + +Geliştirilmiş +- Gema dizeleri kaldırıldı #2295 +- Etkinlik yaşam döngüsü sırasında (otomatik) rotasyon değişikliklerini işleme #2444 +- Uzun basma menülerini tutarlı hale getirin #2368 + +Sabit +- Seçili altyazı parça adının gösterilmemesi düzeltildi #2394 +- Uygulama güncellemesi kontrolü başarısız olduğunda çökme (GitHub sürümü) #2423 +- İndirmelerin %99,9'da takılması düzeltildi #2440 +- Oynatma kuyruğu meta verilerini güncelleme #2453 +- [SoundCloud] Çalma listeleri yüklenirken oluşan çökme düzeltildi TeamNewPipe/NewPipeExtractor#170 +- [YouTube] Sabit süre ayrıştırılamıyor TeamNewPipe/NewPipeExtractor#177 diff --git a/fastlane/metadata/android/tr/changelogs/770.txt b/fastlane/metadata/android/tr/changelogs/770.txt new file mode 100644 index 000000000..0fbf281de --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/770.txt @@ -0,0 +1,3 @@ +0.17.2'deki Değişiklikler +Düzeltme +- Düzeltme video mevcut değildi diff --git a/fastlane/metadata/android/tr/changelogs/780.txt b/fastlane/metadata/android/tr/changelogs/780.txt new file mode 100644 index 000000000..68b98d7b4 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/780.txt @@ -0,0 +1,12 @@ +0.17.3'teki Değişiklikler + +Geliştirilmiş +- Oynatma durumlarını temizleme seçeneği eklendi #2550 +- Dosya seçicide gizli dizinleri gösterme #2591 +- NewPipe ile açılacak `invidio.us` örneklerinden URL'leri destekleyin #2488 +- music.youtube.com` URL`leri için destek ekleyin TeamNewPipe/NewPipeExtractor#194 + +Sabit +- [YouTube] 'java.lang.IllegalArgumentException #192 düzeltildi +- [YouTube] Canlı yayınların çalışmaması düzeltildi TeamNewPipe/NewPipeExtractor#195 +- Android pie'da akış indirirken yaşanan performans sorunu düzeltildi #2592 diff --git a/fastlane/metadata/android/tr/changelogs/790.txt b/fastlane/metadata/android/tr/changelogs/790.txt new file mode 100644 index 000000000..5ff443779 --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/790.txt @@ -0,0 +1,14 @@ +Geliştirilmiş +- Görme engelli kişilerin erişilebilirliğini iyileştirmek için daha fazla başlık ekleyin #2655 +- İndirme klasörü ayarının dilini daha tutarlı ve daha az belirsiz hale getirin #2637 + +Sabit +- Bloktaki son baytın indirilip indirilmediğini kontrol edin #2646 +- Video ayrıntı parçasındaki kaydırma düzeltildi #2672 +- Çift arama temizleme kutusu animasyonlarını teke indir #2695 +- [SoundCloud] Client_id çıkarma işlemini düzeltin #2745 + +Geliştirme +- NewPipeExtractor'dan miras alınan eksik bağımlılıkları NewPipe'a ekleyin #2535 +- AndroidX'e geçiş #2685 +- ExoPlayer 2.10.6 #2697, #2736 için güncelleme diff --git a/fastlane/metadata/android/tr/full_description.txt b/fastlane/metadata/android/tr/full_description.txt index 11daef85b..2b31f8dfd 100644 --- a/fastlane/metadata/android/tr/full_description.txt +++ b/fastlane/metadata/android/tr/full_description.txt @@ -1,2 +1,2 @@ -NewPipe herhangi bir Google çerçeve kütüphanesi veya YouTube API'ı kullanmaz. Sadece, ihtiyaç duyduğu bilgiyi edinmek için web sitesini ayrıştırır. -Bu nedenle Google hizmetlerinin kurulmadığı aygıtlarda kullanılabilir. Ayrıca, NewPipe'ı kullanırken YouTube hesabına ihtiyacınız yok, ve bu özgür ve açık kaynaklı bir yazılımdır. +NewPipe herhangi bir Google framework’ü ya da YouTube API’ı kullanmaz. Yalnızca, kendisine gereken bilgiyi edinmek için web sitesini ayrıştırır. +Bu nedenle Google hizmetlerinin kurulmadığı aygıtlarda kullanılabilir. Ayrıca NewPipe'ı kullanırken bir YouTube hesabına gerek yoktur ve NewPipe özgür ve açık kaynaklı bir yazılımdır. diff --git a/fastlane/metadata/android/uk/changelogs/995.txt b/fastlane/metadata/android/uk/changelogs/995.txt new file mode 100644 index 000000000..3e40c900a --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/995.txt @@ -0,0 +1,16 @@ +Нове +• Підтримка вкладок каналів +• Вибір якості зображень +• Отримання URL всіх зображень + +Поліпшено +• Доступність інтерфейсу +• Кращий вибір аудіо для завантаження відео +• Опція додавати назву добірки й відео поширюваного вмісту добірки + +Виправлено +• [YouTube] лічильник вподобайок +• Нереагування спливних вікон і збої в роботі програвача +• Вибір неправильних мов у перемикачі мов +• Фокусування звуку програвача не враховувало вимкнення звуку +• Додавання елементів добірок інколи не працювало diff --git a/fastlane/metadata/android/uk/changelogs/996.txt b/fastlane/metadata/android/uk/changelogs/996.txt new file mode 100644 index 000000000..e9fd2c523 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/996.txt @@ -0,0 +1,2 @@ +Виправлено NullPointerException під час відкриття каналу / конференції у media.ccc.de. +Грінч намагався зламати наш різдвяний подарунок, але ми його полагодили. diff --git a/fastlane/metadata/android/vi/changelogs/65.txt b/fastlane/metadata/android/vi/changelogs/65.txt new file mode 100644 index 000000000..3bffa51b0 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/65.txt @@ -0,0 +1,9 @@ +##Cải thiện: + +- Tắt hoạt ảnh icon burgermenu #1486 +- Cho phép hoàn tắc nội dung đã tải xuống #1472 +- Tùy chọn tải xuống ở menu chia sẻ #1498 +- Đã thêm tùy chọn chia sẻ vào menu nhẫn giữ #1454 +- Thu nhỏ bộ phát phương tiện chính khi thoát #1354 +- Sửa lỗi Cập nhật thư viện và cơ sở dữ liệu dự phòng #1510 +- Cập nhật trình phát ExoPlayer 2.8.2 #1392 diff --git a/fastlane/metadata/android/vi/changelogs/987.txt b/fastlane/metadata/android/vi/changelogs/987.txt new file mode 100644 index 000000000..776bf53f7 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/987.txt @@ -0,0 +1,12 @@ +Mới +• Hỗ trợ các phương thức phân phối khác ngoài HTTP lũy tiến: thời gian tải nhanh hơn, sửa lỗi cho PeerTube và SoundCloud, phát lại các luồng trực tiếp YouTube đã kết thúc gần đây +• Thêm nút để thêm danh sách phát từ xa vào danh sách phát cục bộ +• Xem trước hình ảnh trong bảng chia sẻ Android 10+ + +Cải thiện +• Cải thiện hộp thoại thông số phát lại +• Di chuyển các nút nhập / xuất đăng ký sang menu ba chấm + +Cố định +• Khắc phục sự cố xóa video đã xem đầy đủ khỏi danh sách phát +• Sửa chủ đề thực đơn chia sẻ và mục "thêm vào danh sách phát" diff --git a/fastlane/metadata/android/vi/changelogs/988.txt b/fastlane/metadata/android/vi/changelogs/988.txt new file mode 100644 index 000000000..545f3c7b4 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/988.txt @@ -0,0 +1,2 @@ +[YouTube] Sửa lỗi “Không thể nhận bất kỳ luồng nào” khi cố gắng phát bất kỳ video nào +[YouTube] Khắc phục thông báo hiển thị “Nội dung sau không có sẵn trên ứng dụng này.” thay vì video được yêu cầu diff --git a/fastlane/metadata/android/vi/changelogs/989.txt b/fastlane/metadata/android/vi/changelogs/989.txt new file mode 100644 index 000000000..542db61c7 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/989.txt @@ -0,0 +1,3 @@ +• [YouTube] Sửa lỗi tải vô hạn khi cố gắng phát bất kỳ video nào +• [YouTube] Sửa lỗi điều tiết trên một số video +• Nâng cấp thư viện jsoup lên 1.15.3, bao gồm bản sửa lỗi bảo mật diff --git a/fastlane/metadata/android/vi/changelogs/990.txt b/fastlane/metadata/android/vi/changelogs/990.txt new file mode 100644 index 000000000..c867f31dd --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/990.txt @@ -0,0 +1,15 @@ +Hiện tại hỗ trợ phiên bản tối thiểu là Android 5 Lollipop! + +Mới +• Tải xuống từ menu nhấn và giữ +• Ẩn các video trong tương lai trong nguồn cấp dữ liệu +• Chia sẻ danh sách phát địa phương + +Cải thiện +• Tái cấu trúc mã trình phát.. +• Cải thiện chế độ chia tỷ lệ của hình thu nhỏ +• Trình giữ chỗ hình ảnh theo kiểu vector hóa + +Khắc phục +• Khắc phục nhiều vấn đề khác nhau với thông báo trình phát: thông tin phương tiện lỗi thời/bị thiếu, hình thu nhỏ bị méo +• Sửa toàn màn hình bằng 1/4 màn hình diff --git a/fastlane/metadata/android/vi/changelogs/991.txt b/fastlane/metadata/android/vi/changelogs/991.txt new file mode 100644 index 000000000..8ffaf1551 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/991.txt @@ -0,0 +1,13 @@ +Mới +• Thêm nút "Mở trong trình duyệt" trong bảng lỗi +• Thêm tùy chọn hiển thị nhóm kênh dạng danh sách +• [YouTube] Nhấp và giữ vào các phân đoạn phát trực tuyến để chia sẻ URL dấu thời gian +• Thêm nút xếp hàng phát vào trình phát mini + +Cải thiện +• Thêm bản địa hóa tiếng Iceland và cập nhật nhiều bản dịch khác +• Nhiều cải tiến nội bộ + +Sửa chữa +• Khắc phục nhiều sự cố +• [YouTube] Khắc phục sự cố tải kênh, nguồn cấp dữ liệu không chuyên dụng và giải pháp khắc phục sự cố phát lại ở một số quốc gia diff --git a/fastlane/metadata/android/vi/changelogs/994.txt b/fastlane/metadata/android/vi/changelogs/994.txt new file mode 100644 index 000000000..e73fcb20a --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/994.txt @@ -0,0 +1,15 @@ +Mới +• Hỗ trợ nhiều bản âm thanh/ngôn ngữ +• Cho phép cài đặt cử chỉ âm lượng và độ sáng ở bất kỳ phía nào của màn hình +• Hỗ trợ hiển thị các tab chính ở cuối màn hình + +Cải thiện +• [Bandcamp] Xử lý các dấu vết đằng sau bức tường phí + +Đã sửa +• [YouTube] Lỗi HTTP 403 cho luồng +• Trình phát màu đen khi chuyển sang trình phát chính từ chế độ xem danh sách phát +• Rò rỉ bộ nhớ dịch vụ trình phát +• [PeerTube] Hình đại diện của người tải lên và kênh con đã bị hoán đổi + +và hơn thế nữa diff --git a/fastlane/metadata/android/vi/changelogs/995.txt b/fastlane/metadata/android/vi/changelogs/995.txt new file mode 100644 index 000000000..69b616883 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/995.txt @@ -0,0 +1,14 @@ +Mới +• Hỗ trợ tab kênh +• Chọn chất lượng hình ảnh +• Nhận URL cho tất cả hình ảnh + +Cải thiện +• Khả năng truy cập của giao diện trình phát +• Tùy chọn thêm tên danh sách phát và tên video vào nội dung chia sẻ danh sách phát +• Cải tiến nội bộ và cập nhật phụ thuộc + +Đã sửa +• Lựa chọn ngôn ngữ sai trong bộ chọn ngôn ngữ +• Tiêu điểm âm thanh của trình phát không bị tắt tiếng +• Thêm mục vào danh sách phát không hoạt động trong các trường hợp cụ thể diff --git a/fastlane/metadata/android/vi/changelogs/996.txt b/fastlane/metadata/android/vi/changelogs/996.txt new file mode 100644 index 000000000..2f92c6dc2 --- /dev/null +++ b/fastlane/metadata/android/vi/changelogs/996.txt @@ -0,0 +1,2 @@ +Đã sửa lỗi NullPointerException khi mở kênh/hội nghị trong media.ccc.de. +Grinch đã cố làm vỡ món quà Giáng sinh của chúng tôi dành cho bạn, nhưng chúng tôi đã sửa nó. diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/994.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/994.txt new file mode 100644 index 000000000..dcc635e90 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/994.txt @@ -0,0 +1,15 @@ +新嘢 +• 支援多重音軌/語言 +• 螢幕嘅音量同光暗手勢設定有得分左右 +• 主畫面嘅分頁揀選有得搬落最低 + +進步 +• [Bandcamp] 處理收費閘之下嘅曲目 + +修正 +• [YouTube] 串流出現 403 HTTP 錯誤 +• 播放清單版面轉去主版面播放器時播放器冇嘢睇 +• 播放器服務記憶體洩漏 +• [PeerTube] 上載者同子頻道頭像調轉咗 + +其餘不贅 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/995.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/995.txt new file mode 100644 index 000000000..87050f4a5 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/995.txt @@ -0,0 +1,16 @@ +新嘢 +• 支援頻道分頁 +• 啲圖有得揀畫質 +• 啲圖全部都有得攞返條拎 + +進步 +• 播放器介面暢易達 +• 揀返條靚啲嘅聲黐返落去齋晝面嘅影片下載 +• 分享播放清單時有得加埋播放清單個名同入面啲片名 + +修正 +• [YouTube] 執返掂個 like 數 +• 執返好播放器話冇回應個框框同埋閃退 +• 揀選版面語言揀錯文 +• 播放器聲音焦點無視噤聲 +• 加入項目去播放清單有時唔得 diff --git a/fastlane/metadata/android/zh_Hant_HK/changelogs/996.txt b/fastlane/metadata/android/zh_Hant_HK/changelogs/996.txt new file mode 100644 index 000000000..8b136fc42 --- /dev/null +++ b/fastlane/metadata/android/zh_Hant_HK/changelogs/996.txt @@ -0,0 +1,2 @@ +修正開啟 media.ccc.de 嘅頻道/會議時發生 NullPointerException 失卻指標錯誤。 +柳煙輕愜夜,俊緒留江影。謝謝您陪我哋跑完悲歡離合嘅一年。 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2c3425d49..d022615ff 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionSha256Sum=38f66cd6eef217b4c35855bb11ea4e9fbc53594ccccb5fb82dfd317ef8c2c5a3 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists