Compare commits

...

25 Commits

Author SHA1 Message Date
semantic-release-bot
a38f635514 chore: Release v5.31.0-dev.17 [skip ci]
# [5.31.0-dev.17](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.16...v5.31.0-dev.17) (2025-07-11)

### Bug Fixes

* **Spotify - Unlock Premium:** Remove wrongfully hidden non ad browse sections ([#5403](https://github.com/ReVanced/revanced-patches/issues/5403)) ([b3e6c21](b3e6c215cc))

### Features

* **Spotify:** Remove support for old versions ([#5404](https://github.com/ReVanced/revanced-patches/issues/5404)) ([c9cc3d5](c9cc3d5c41))
2025-07-11 15:41:53 +00:00
Nuckyz
b3e6c215cc fix(Spotify - Unlock Premium): Remove wrongfully hidden non ad browse sections (#5403) 2025-07-11 17:38:33 +02:00
Nuckyz
c9cc3d5c41 feat(Spotify): Remove support for old versions (#5404) 2025-07-11 17:37:59 +02:00
semantic-release-bot
536e64565c chore: Release v5.31.0-dev.16 [skip ci]
# [5.31.0-dev.16](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.15...v5.31.0-dev.16) (2025-07-11)

### Features

* **Spotify - Spoof client:** Fix issues like songs skipping by spoofing to iOS ([#5388](https://github.com/ReVanced/revanced-patches/issues/5388)) ([65cbf3c](65cbf3c1eb))
* **YouTube:** Disable two-finger tap gesture for skipping chapters ([#5374](https://github.com/ReVanced/revanced-patches/issues/5374)) ([61c1a7a](61c1a7a75a))
2025-07-11 15:37:29 +00:00
Dawid Krajcarz
65cbf3c1eb feat(Spotify - Spoof client): Fix issues like songs skipping by spoofing to iOS (#5388)
Co-authored-by: Nuckyz <61953774+Nuckyz@users.noreply.github.com>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2025-07-11 17:34:02 +02:00
abel1502
61c1a7a75a feat(YouTube): Disable two-finger tap gesture for skipping chapters (#5374)
Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2025-07-11 17:32:59 +02:00
Pun Butrach
1e39db06b8 ci: Remove fetch-depth from checkout (#5311) 2025-07-11 17:31:12 +02:00
Pun Butrach
e019f83232 ci: Group all Dependabot update into one PR (#5336) 2025-07-11 17:31:03 +02:00
semantic-release-bot
3b57a5f8c0 chore: Release v5.31.0-dev.15 [skip ci]
# [5.31.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.14...v5.31.0-dev.15) (2025-07-11)

### Bug Fixes

* Handle empty list of announcements ([eafe3df](eafe3dfc45))
2025-07-11 09:31:21 +00:00
oSumAtrIX
eafe3dfc45 fix: Handle empty list of announcements 2025-07-11 11:28:13 +02:00
semantic-release-bot
d56d8d990c chore: Release v5.31.0-dev.14 [skip ci]
# [5.31.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.13...v5.31.0-dev.14) (2025-07-10)

### Bug Fixes

* **Bacon Reader - Spoof client:** Use www instead of ssl API to fix auth related issues  ([#5402](https://github.com/ReVanced/revanced-patches/issues/5402)) ([37a8682](37a8682901))
2025-07-10 18:51:55 +00:00
Chirag Gada
37a8682901 fix(Bacon Reader - Spoof client): Use www instead of ssl API to fix auth related issues (#5402) 2025-07-10 20:49:04 +02:00
semantic-release-bot
11ba7d4e3e chore: Release v5.31.0-dev.13 [skip ci]
# [5.31.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.12...v5.31.0-dev.13) (2025-07-10)

### Bug Fixes

* **YouTube - Slide to seek:** Show tap and hold 2x speed overlay when active ([#5398](https://github.com/ReVanced/revanced-patches/issues/5398)) ([6833d37](6833d37c26))
2025-07-10 13:38:38 +00:00
LisoUseInAIKyrios
6833d37c26 fix(YouTube - Slide to seek): Show tap and hold 2x speed overlay when active (#5398) 2025-07-10 17:35:08 +04:00
github-actions[bot]
e6f72bcb7d chore: Sync translations (#5399) 2025-07-10 17:34:47 +04:00
LisoUseInAIKyrios
e8a227c082 chore: Fix api dump 2025-07-10 15:15:34 +04:00
semantic-release-bot
0472ec2830 chore: Release v5.31.0-dev.12 [skip ci]
# [5.31.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.11...v5.31.0-dev.12) (2025-07-09)

### Bug Fixes

* **Sync for Reddit - Spoof client:** Use www instead of ssl API to fix auth related issues ([#5392](https://github.com/ReVanced/revanced-patches/issues/5392)) ([6412a5c](6412a5cb1a))
2025-07-09 18:28:47 +00:00
oSumAtrIX
6412a5cb1a fix(Sync for Reddit - Spoof client): Use www instead of ssl API to fix auth related issues (#5392) 2025-07-09 20:25:48 +02:00
semantic-release-bot
cc548689ac chore: Release v5.31.0-dev.11 [skip ci]
# [5.31.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.10...v5.31.0-dev.11) (2025-07-09)

### Features

* **Cricbuzz - Hide ads:** Hide Cricbuzz11 UI elements ([#5381](https://github.com/ReVanced/revanced-patches/issues/5381)) ([a3d47e7](a3d47e72e3))
2025-07-09 17:50:37 +00:00
hoodles
a3d47e72e3 feat(Cricbuzz - Hide ads): Hide Cricbuzz11 UI elements (#5381) 2025-07-09 21:47:10 +04:00
semantic-release-bot
f37482443a chore: Release v5.31.0-dev.10 [skip ci]
# [5.31.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.9...v5.31.0-dev.10) (2025-07-09)

### Bug Fixes

* **YouTube - Hide layout components:** Do not hide playlist sort button if 'Hide AI comments summary' is on ([cc4aef8](cc4aef89d3))
2025-07-09 14:37:19 +00:00
LisoUseInAIKyrios
cc4aef89d3 fix(YouTube - Hide layout components): Do not hide playlist sort button if 'Hide AI comments summary' is on 2025-07-09 18:33:24 +04:00
github-actions[bot]
1c0a0eb4b5 chore: Sync translations (#5389) 2025-07-09 18:33:07 +04:00
semantic-release-bot
b1d6c46763 chore: Release v5.31.0-dev.9 [skip ci]
# [5.31.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.8...v5.31.0-dev.9) (2025-07-07)

### Bug Fixes

* Fix accidental changes ([42195b9](42195b9f63))
2025-07-07 10:32:07 +00:00
oSumAtrIX
42195b9f63 fix: Fix accidental changes 2025-07-07 12:29:21 +02:00
85 changed files with 1432 additions and 1574 deletions

View File

@@ -1,22 +1,26 @@
version: 2
multi-ecosystem-groups:
dependency:
schedule:
interval: "weekly"
target-branch: dev
labels: [ ]
updates:
- package-ecosystem: github-actions
labels: []
multi-ecosystem-group: "dependency"
directory: /
target-branch: dev
schedule:
interval: monthly
patterns:
- "*"
- package-ecosystem: npm
labels: []
multi-ecosystem-group: "dependency"
directory: /
target-branch: dev
schedule:
interval: monthly
patterns:
- "*"
- package-ecosystem: gradle
labels: []
multi-ecosystem-group: "dependency"
directory: /
target-branch: dev
schedule:
interval: monthly
patterns:
- "*"

View File

@@ -13,8 +13,6 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Java
uses: actions/setup-java@v4

View File

@@ -17,7 +17,6 @@ jobs:
uses: actions/checkout@v4
with:
ref: dev
fetch-depth: 0
clean: true
- name: Pull strings

View File

@@ -15,8 +15,6 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Preprocess strings
env:

View File

@@ -19,8 +19,6 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Java
uses: actions/setup-java@v4

View File

@@ -1,3 +1,72 @@
# [5.31.0-dev.17](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.16...v5.31.0-dev.17) (2025-07-11)
### Bug Fixes
* **Spotify - Unlock Premium:** Remove wrongfully hidden non ad browse sections ([#5403](https://github.com/ReVanced/revanced-patches/issues/5403)) ([8633544](https://github.com/ReVanced/revanced-patches/commit/8633544decc0814d7a548fbc5576b4bdd1d7eee0))
### Features
* **Spotify:** Remove support for old versions ([#5404](https://github.com/ReVanced/revanced-patches/issues/5404)) ([9d31238](https://github.com/ReVanced/revanced-patches/commit/9d31238803a45e957472760fc40c3862da2cf3f0))
# [5.31.0-dev.16](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.15...v5.31.0-dev.16) (2025-07-11)
### Features
* **Spotify - Spoof client:** Fix issues like songs skipping by spoofing to iOS ([#5388](https://github.com/ReVanced/revanced-patches/issues/5388)) ([e36d4c1](https://github.com/ReVanced/revanced-patches/commit/e36d4c1986b58815c7659e6ef44011166873f9c8))
* **YouTube:** Disable two-finger tap gesture for skipping chapters ([#5374](https://github.com/ReVanced/revanced-patches/issues/5374)) ([71db0a2](https://github.com/ReVanced/revanced-patches/commit/71db0a2661b5f76eb5048cdeed83f26fbfdf4fee))
# [5.31.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.14...v5.31.0-dev.15) (2025-07-11)
### Bug Fixes
* Handle empty list of announcements ([de9d720](https://github.com/ReVanced/revanced-patches/commit/de9d7209f4e818a618a7fd9000013ae8ebd728f2))
# [5.31.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.13...v5.31.0-dev.14) (2025-07-10)
### Bug Fixes
* **Bacon Reader - Spoof client:** Use www instead of ssl API to fix auth related issues ([#5402](https://github.com/ReVanced/revanced-patches/issues/5402)) ([72459bb](https://github.com/ReVanced/revanced-patches/commit/72459bb2eaf4691e32822dfdd1db3240e2fe98dd))
# [5.31.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.12...v5.31.0-dev.13) (2025-07-10)
### Bug Fixes
* **YouTube - Slide to seek:** Show tap and hold 2x speed overlay when active ([#5398](https://github.com/ReVanced/revanced-patches/issues/5398)) ([dbc9c5f](https://github.com/ReVanced/revanced-patches/commit/dbc9c5f00c1f5bbb95f8822667cc1ac3c613fa00))
# [5.31.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.11...v5.31.0-dev.12) (2025-07-09)
### Bug Fixes
* **Sync for Reddit - Spoof client:** Use www instead of ssl API to fix auth related issues ([#5392](https://github.com/ReVanced/revanced-patches/issues/5392)) ([47e6b62](https://github.com/ReVanced/revanced-patches/commit/47e6b62f3d8b07960cfb2963f441222d3e67df92))
# [5.31.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.10...v5.31.0-dev.11) (2025-07-09)
### Features
* **Cricbuzz - Hide ads:** Hide Cricbuzz11 UI elements ([#5381](https://github.com/ReVanced/revanced-patches/issues/5381)) ([a42c98f](https://github.com/ReVanced/revanced-patches/commit/a42c98f8b51fd37d815fd38b75a2b7ccc4fb049b))
# [5.31.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.9...v5.31.0-dev.10) (2025-07-09)
### Bug Fixes
* **YouTube - Hide layout components:** Do not hide playlist sort button if 'Hide AI comments summary' is on ([5f3e48e](https://github.com/ReVanced/revanced-patches/commit/5f3e48ec5853f6439800ef58239291c34bcab5f6))
# [5.31.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.8...v5.31.0-dev.9) (2025-07-07)
### Bug Fixes
* Fix accidental changes ([e2ac841](https://github.com/ReVanced/revanced-patches/commit/e2ac8419756e3c7d62e2c0430a2918a3c1c63666))
# [5.31.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.31.0-dev.7...v5.31.0-dev.8) (2025-07-07)

View File

@@ -0,0 +1,4 @@
dependencies {
compileOnly(project(":extensions:shared:library"))
compileOnly(project(":extensions:cricbuzz:stub"))
}

View File

@@ -0,0 +1 @@
<manifest/>

View File

@@ -0,0 +1,28 @@
package app.revanced.extension.cricbuzz.ads;
import com.cricbuzz.android.data.rest.model.BottomBar;
import java.util.List;
import java.util.Iterator;
import app.revanced.extension.shared.Logger;
@SuppressWarnings("unused")
public class HideAdsPatch {
/**
* Injection point.
*/
public static void filterCb11(List<BottomBar> list) {
try {
Iterator<BottomBar> iterator = list.iterator();
while (iterator.hasNext()) {
BottomBar bar = iterator.next();
if (bar.getName().equals("Cricbuzz11")) {
Logger.printInfo(() -> "Removing Cricbuzz11 bar: " + bar);
iterator.remove();
}
}
} catch (Exception ex) {
Logger.printException(() -> "filterCb11 failure", ex);
}
}
}

View File

@@ -0,0 +1,17 @@
plugins {
alias(libs.plugins.android.library)
}
android {
namespace = "app.revanced.extension"
compileSdk = 34
defaultConfig {
minSdk = 21
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}

View File

@@ -0,0 +1 @@
<manifest/>

View File

@@ -0,0 +1,5 @@
package com.cricbuzz.android.data.rest.model;
public final class BottomBar {
public final String getName() { throw new UnsupportedOperationException(); }
}

View File

@@ -7,7 +7,6 @@ dependencies {
compileOnly(project(":extensions:spotify:stub"))
compileOnly(libs.annotation)
implementation(project(":extensions:spotify:utils"))
implementation(libs.nanohttpd)
implementation(libs.protobuf.javalite)
}

View File

@@ -1,9 +1,11 @@
package app.revanced.extension.spotify.layout.hide.createbutton;
import java.util.List;
import app.revanced.extension.shared.Logger;
import app.revanced.extension.spotify.shared.ComponentFilters.*;
import app.revanced.extension.spotify.shared.ComponentFilters.ComponentFilter;
import app.revanced.extension.spotify.shared.ComponentFilters.ResourceIdComponentFilter;
import app.revanced.extension.spotify.shared.ComponentFilters.StringComponentFilter;
import java.util.List;
@SuppressWarnings("unused")
public final class HideCreateButtonPatch {
@@ -53,7 +55,9 @@ public final class HideCreateButtonPatch {
return null;
}
}
} catch (Exception ex) {
} catch (Throwable ex) {
// Catch Throwable as calling toString can cause crashes with wrongfully generated code that throws
// NoSuchMethod errors.
Logger.printException(() -> "returnNullIfIsCreateButton failure", ex);
}

View File

@@ -0,0 +1,115 @@
package app.revanced.extension.spotify.misc.fix;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import app.revanced.extension.shared.Logger;
import app.revanced.extension.spotify.misc.fix.clienttoken.data.v0.ClienttokenHttp.*;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import static app.revanced.extension.spotify.misc.fix.Constants.*;
class ClientTokenService {
private static final String IOS_CLIENT_ID = "58bd3c95768941ea9eb4350aaa033eb3";
private static final String IOS_USER_AGENT;
static {
String clientVersion = getClientVersion();
int commitHashIndex = clientVersion.lastIndexOf(".");
String version = clientVersion.substring(
clientVersion.indexOf("-") + 1,
clientVersion.lastIndexOf(".", commitHashIndex - 1)
);
IOS_USER_AGENT = "Spotify/" + version + " iOS/" + getSystemVersion() + " (" + getHardwareMachine() + ")";
}
private static final ConnectivitySdkData.Builder IOS_CONNECTIVITY_SDK_DATA =
ConnectivitySdkData.newBuilder()
.setPlatformSpecificData(PlatformSpecificData.newBuilder()
.setIos(NativeIOSData.newBuilder()
.setHwMachine(getHardwareMachine())
.setSystemVersion(getSystemVersion())
)
);
private static final ClientDataRequest.Builder IOS_CLIENT_DATA_REQUEST =
ClientDataRequest.newBuilder()
.setClientVersion(getClientVersion())
.setClientId(IOS_CLIENT_ID);
private static final ClientTokenRequest.Builder IOS_CLIENT_TOKEN_REQUEST =
ClientTokenRequest.newBuilder()
.setRequestType(ClientTokenRequestType.REQUEST_CLIENT_DATA_REQUEST);
@NonNull
static ClientTokenRequest newIOSClientTokenRequest(String deviceId) {
Logger.printInfo(() -> "Creating new iOS client token request with device ID: " + deviceId);
return IOS_CLIENT_TOKEN_REQUEST
.setClientData(IOS_CLIENT_DATA_REQUEST
.setConnectivitySdkData(IOS_CONNECTIVITY_SDK_DATA
.setDeviceId(deviceId)
)
)
.build();
}
@Nullable
static ClientTokenResponse getClientTokenResponse(@NonNull ClientTokenRequest request) {
if (request.getRequestType() == ClientTokenRequestType.REQUEST_CLIENT_DATA_REQUEST) {
Logger.printInfo(() -> "Requesting iOS client token");
String deviceId = request.getClientData().getConnectivitySdkData().getDeviceId();
request = newIOSClientTokenRequest(deviceId);
}
ClientTokenResponse response;
try {
response = requestClientToken(request);
} catch (IOException ex) {
Logger.printException(() -> "Failed to handle request", ex);
return null;
}
return response;
}
@NonNull
private static ClientTokenResponse requestClientToken(@NonNull ClientTokenRequest request) throws IOException {
HttpURLConnection urlConnection = (HttpURLConnection) new URL(CLIENT_TOKEN_API_URL).openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setDoOutput(true);
urlConnection.setRequestProperty("Content-Type", "application/x-protobuf");
urlConnection.setRequestProperty("Accept", "application/x-protobuf");
urlConnection.setRequestProperty("User-Agent", IOS_USER_AGENT);
byte[] requestArray = request.toByteArray();
urlConnection.setFixedLengthStreamingMode(requestArray.length);
urlConnection.getOutputStream().write(requestArray);
try (InputStream inputStream = urlConnection.getInputStream()) {
return ClientTokenResponse.parseFrom(inputStream);
}
}
@Nullable
static ClientTokenResponse serveClientTokenRequest(@NonNull InputStream inputStream) {
ClientTokenRequest request;
try {
request = ClientTokenRequest.parseFrom(inputStream);
} catch (IOException ex) {
Logger.printException(() -> "Failed to parse request from input stream", ex);
return null;
}
Logger.printInfo(() -> "Request of type: " + request.getRequestType());
ClientTokenResponse response = getClientTokenResponse(request);
if (response != null) Logger.printInfo(() -> "Response of type: " + response.getResponseType());
return response;
}
}

View File

@@ -0,0 +1,26 @@
package app.revanced.extension.spotify.misc.fix;
import androidx.annotation.NonNull;
class Constants {
static final String CLIENT_TOKEN_API_PATH = "/v1/clienttoken";
static final String CLIENT_TOKEN_API_URL = "https://clienttoken.spotify.com" + CLIENT_TOKEN_API_PATH;
// Modified by a patch. Do not touch.
@NonNull
static String getClientVersion() {
return "";
}
// Modified by a patch. Do not touch.
@NonNull
static String getSystemVersion() {
return "";
}
// Modified by a patch. Do not touch.
@NonNull
static String getHardwareMachine() {
return "";
}
}

View File

@@ -1,158 +0,0 @@
package app.revanced.extension.spotify.misc.fix;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import app.revanced.extension.shared.Logger;
import app.revanced.extension.spotify.login5.v4.proto.Login5.*;
import com.google.protobuf.ByteString;
import com.google.protobuf.MessageLite;
import fi.iki.elonen.NanoHTTPD;
import java.io.ByteArrayInputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;
import static app.revanced.extension.spotify.misc.fix.Session.FAILED_TO_RENEW_SESSION;
import static fi.iki.elonen.NanoHTTPD.Response.Status.INTERNAL_ERROR;
class LoginRequestListener extends NanoHTTPD {
LoginRequestListener(int port) {
super(port);
try {
start();
} catch (IOException ex) {
Logger.printException(() -> "Failed to start login request listener on port " + port, ex);
throw new RuntimeException(ex);
}
}
@NonNull
@Override
public Response serve(IHTTPSession request) {
Logger.printInfo(() -> "Serving request for URI: " + request.getUri());
InputStream requestBodyInputStream = getRequestBodyInputStream(request);
LoginRequest loginRequest;
try {
loginRequest = LoginRequest.parseFrom(requestBodyInputStream);
} catch (IOException ex) {
Logger.printException(() -> "Failed to parse LoginRequest", ex);
return newResponse(INTERNAL_ERROR);
}
MessageLite loginResponse;
// A request may be made concurrently by Spotify,
// however a webview can only handle one request at a time due to singleton cookie manager.
// Therefore, synchronize to ensure that only one webview handles the request at a time.
synchronized (this) {
try {
loginResponse = getLoginResponse(loginRequest);
} catch (Exception ex) {
Logger.printException(() -> "Failed to get login response", ex);
return newResponse(INTERNAL_ERROR);
}
}
return newResponse(Response.Status.OK, loginResponse);
}
private static LoginResponse getLoginResponse(@NonNull LoginRequest loginRequest) {
Session session;
if (!loginRequest.hasStoredCredential()) {
Logger.printInfo(() -> "Received request for initial login");
session = WebApp.currentSession; // Session obtained from WebApp.launchLogin, can be null if still in progress.
} else {
Logger.printInfo(() -> "Received request to restore saved session");
session = Session.read(loginRequest.getStoredCredential().getUsername());
}
return toLoginResponse(session);
}
private static LoginResponse toLoginResponse(@Nullable Session session) {
LoginResponse.Builder builder = LoginResponse.newBuilder();
if (session == null) {
Logger.printException(() -> "Session is null. An initial login may still be in progress, returning try again later error");
builder.setError(LoginError.TRY_AGAIN_LATER);
} else if (session.accessTokenExpired()) {
Logger.printInfo(() -> "Access token expired, renewing session");
WebApp.renewSessionBlocking(session.cookies);
return toLoginResponse(WebApp.currentSession);
} else if (session.username == null) {
Logger.printException(() -> "Session username is null, likely caused by invalid cookies, returning invalid credentials error");
session.delete();
builder.setError(LoginError.INVALID_CREDENTIALS);
} else if (session == FAILED_TO_RENEW_SESSION) {
Logger.printException(() -> "Failed to renew session, likely caused by a timeout, returning try again later error");
builder.setError(LoginError.TRY_AGAIN_LATER);
} else {
session.save();
Logger.printInfo(() -> "Returning session for username: " + session.username);
builder.setOk(LoginOk.newBuilder()
.setUsername(session.username)
.setAccessToken(session.accessToken)
.setStoredCredential(ByteString.fromHex("00")) // Placeholder, as it cannot be null or empty.
.setAccessTokenExpiresIn(session.accessTokenExpiresInSeconds())
.build());
}
return builder.build();
}
@NonNull
private static InputStream limitedInputStream(InputStream inputStream, long contentLength) {
return new FilterInputStream(inputStream) {
private long remaining = contentLength;
@Override
public int read() throws IOException {
if (remaining <= 0) return -1;
int result = super.read();
if (result != -1) remaining--;
return result;
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
if (remaining <= 0) return -1;
len = (int) Math.min(len, remaining);
int result = super.read(b, off, len);
if (result != -1) remaining -= result;
return result;
}
};
}
@NonNull
private static InputStream getRequestBodyInputStream(@NonNull IHTTPSession request) {
long requestContentLength =
Long.parseLong(Objects.requireNonNull(request.getHeaders().get("content-length")));
return limitedInputStream(request.getInputStream(), requestContentLength);
}
@SuppressWarnings("SameParameterValue")
@NonNull
private static Response newResponse(Response.Status status) {
return newResponse(status, null);
}
@NonNull
private static Response newResponse(Response.IStatus status, MessageLite messageLite) {
if (messageLite == null) {
return newFixedLengthResponse(status, "application/x-protobuf", null);
}
byte[] messageBytes = messageLite.toByteArray();
InputStream stream = new ByteArrayInputStream(messageBytes);
return newFixedLengthResponse(status, "application/x-protobuf", stream, messageBytes.length);
}
}

View File

@@ -0,0 +1,94 @@
package app.revanced.extension.spotify.misc.fix;
import androidx.annotation.NonNull;
import app.revanced.extension.shared.Logger;
import app.revanced.extension.spotify.misc.fix.clienttoken.data.v0.ClienttokenHttp.ClientTokenResponse;
import com.google.protobuf.MessageLite;
import fi.iki.elonen.NanoHTTPD;
import java.io.ByteArrayInputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;
import static app.revanced.extension.spotify.misc.fix.ClientTokenService.serveClientTokenRequest;
import static app.revanced.extension.spotify.misc.fix.Constants.CLIENT_TOKEN_API_PATH;
import static fi.iki.elonen.NanoHTTPD.Response.Status.INTERNAL_ERROR;
class RequestListener extends NanoHTTPD {
RequestListener(int port) {
super(port);
try {
start();
} catch (IOException ex) {
Logger.printException(() -> "Failed to start request listener on port " + port, ex);
throw new RuntimeException(ex);
}
}
@NonNull
@Override
public Response serve(@NonNull IHTTPSession session) {
String uri = session.getUri();
if (!uri.equals(CLIENT_TOKEN_API_PATH)) return INTERNAL_ERROR_RESPONSE;
Logger.printInfo(() -> "Serving request for URI: " + uri);
ClientTokenResponse response = serveClientTokenRequest(getInputStream(session));
if (response != null) return newResponse(Response.Status.OK, response);
Logger.printException(() -> "Failed to serve client token request");
return INTERNAL_ERROR_RESPONSE;
}
@NonNull
private static InputStream newLimitedInputStream(InputStream inputStream, long contentLength) {
return new FilterInputStream(inputStream) {
private long remaining = contentLength;
@Override
public int read() throws IOException {
if (remaining <= 0) return -1;
int result = super.read();
if (result != -1) remaining--;
return result;
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
if (remaining <= 0) return -1;
len = (int) Math.min(len, remaining);
int result = super.read(b, off, len);
if (result != -1) remaining -= result;
return result;
}
};
}
@NonNull
private static InputStream getInputStream(@NonNull IHTTPSession session) {
long requestContentLength = Long.parseLong(Objects.requireNonNull(session.getHeaders().get("content-length")));
return newLimitedInputStream(session.getInputStream(), requestContentLength);
}
private static final Response INTERNAL_ERROR_RESPONSE = newResponse(INTERNAL_ERROR);
@SuppressWarnings("SameParameterValue")
@NonNull
private static Response newResponse(Response.Status status) {
return newResponse(status, null);
}
@NonNull
private static Response newResponse(Response.IStatus status, MessageLite messageLite) {
if (messageLite == null) {
return newFixedLengthResponse(status, "application/x-protobuf", null);
}
byte[] messageBytes = messageLite.toByteArray();
InputStream stream = new ByteArrayInputStream(messageBytes);
return newFixedLengthResponse(status, "application/x-protobuf", stream, messageBytes.length);
}
}

View File

@@ -1,136 +0,0 @@
package app.revanced.extension.spotify.misc.fix;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import app.revanced.extension.shared.Logger;
import app.revanced.extension.shared.Utils;
import org.json.JSONException;
import org.json.JSONObject;
import static android.content.Context.MODE_PRIVATE;
class Session {
/**
* Username of the account. Null if this session does not have an authenticated user.
*/
@Nullable
final String username;
/**
* Access token for this session.
*/
final String accessToken;
/**
* Session expiration timestamp in milliseconds.
*/
final Long expirationTime;
/**
* Authentication cookies for this session.
*/
final String cookies;
/**
* Session that represents a failed attempt to renew the session.
*/
static final Session FAILED_TO_RENEW_SESSION = new Session("", "", "");
/**
* @param username Username of the account. Empty if this session does not have an authenticated user.
* @param accessToken Access token for this session.
* @param cookies Authentication cookies for this session.
*/
Session(@Nullable String username, String accessToken, String cookies) {
this(username, accessToken, System.currentTimeMillis() + 60 * 60 * 1000, cookies);
}
private Session(@Nullable String username, String accessToken, long expirationTime, String cookies) {
this.username = username;
this.accessToken = accessToken;
this.expirationTime = expirationTime;
this.cookies = cookies;
}
/**
* @return The number of milliseconds until the access token expires.
*/
long accessTokenExpiresInMillis() {
long currentTime = System.currentTimeMillis();
return expirationTime - currentTime;
}
/**
* @return The number of seconds until the access token expires.
*/
int accessTokenExpiresInSeconds() {
return (int) accessTokenExpiresInMillis() / 1000;
}
/**
* @return True if the access token has expired, false otherwise.
*/
boolean accessTokenExpired() {
return accessTokenExpiresInMillis() <= 0;
}
void save() {
Logger.printInfo(() -> "Saving session: " + this);
SharedPreferences.Editor editor = Utils.getContext().getSharedPreferences("revanced", MODE_PRIVATE).edit();
String json;
try {
json = new JSONObject()
.put("accessToken", accessToken)
.put("expirationTime", expirationTime)
.put("cookies", cookies).toString();
} catch (JSONException ex) {
Logger.printException(() -> "Failed to convert session to stored credential", ex);
return;
}
editor.putString("session_" + username, json);
editor.apply();
}
void delete() {
Logger.printInfo(() -> "Deleting saved session for username: " + username);
SharedPreferences.Editor editor = Utils.getContext().getSharedPreferences("revanced", MODE_PRIVATE).edit();
editor.remove("session_" + username);
editor.apply();
}
@Nullable
static Session read(String username) {
Logger.printInfo(() -> "Reading saved session for username: " + username);
SharedPreferences sharedPreferences = Utils.getContext().getSharedPreferences("revanced", MODE_PRIVATE);
String savedJson = sharedPreferences.getString("session_" + username, null);
if (savedJson == null) {
Logger.printInfo(() -> "No session found in shared preferences");
return null;
}
try {
JSONObject json = new JSONObject(savedJson);
String accessToken = json.getString("accessToken");
long expirationTime = json.getLong("expirationTime");
String cookies = json.getString("cookies");
return new Session(username, accessToken, expirationTime, cookies);
} catch (JSONException ex) {
Logger.printException(() -> "Failed to read session from shared preferences", ex);
return null;
}
}
@NonNull
@Override
public String toString() {
return "Session(" +
"username=" + username +
", accessToken=" + accessToken +
", expirationTime=" + expirationTime +
", cookies=" + cookies +
')';
}
}

View File

@@ -1,19 +1,15 @@
package app.revanced.extension.spotify.misc.fix;
import android.view.LayoutInflater;
import android.view.View;
import app.revanced.extension.shared.Logger;
@SuppressWarnings("unused")
public class SpoofClientPatch {
private static LoginRequestListener listener;
private static RequestListener listener;
/**
* Injection point.
* <br>
* Launch login server.
* Injection point. Launch requests listener server.
*/
public static void launchListener(int port) {
public synchronized static void launchListener(int port) {
if (listener != null) {
Logger.printInfo(() -> "Listener already running on port " + port);
return;
@@ -21,34 +17,9 @@ public class SpoofClientPatch {
try {
Logger.printInfo(() -> "Launching listener on port " + port);
listener = new LoginRequestListener(port);
listener = new RequestListener(port);
} catch (Exception ex) {
Logger.printException(() -> "launchListener failure", ex);
}
}
/**
* Injection point.
* <br>
* Launch login web view.
*/
public static void launchLogin(LayoutInflater inflater) {
try {
WebApp.launchLogin(inflater.getContext());
} catch (Exception ex) {
Logger.printException(() -> "launchLogin failure", ex);
}
}
/**
* Injection point.
* <br>
* Set handler to call the native login after the webview login.
*/
public static void setNativeLoginHandler(View startLoginButton) {
WebApp.nativeLoginHandler = (() -> {
startLoginButton.setSoundEffectsEnabled(false);
startLoginButton.performClick();
});
}
}

View File

@@ -1,297 +0,0 @@
package app.revanced.extension.spotify.misc.fix;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.view.Window;
import android.view.WindowInsets;
import android.webkit.*;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import app.revanced.extension.shared.Logger;
import app.revanced.extension.shared.Utils;
import app.revanced.extension.spotify.UserAgent;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static app.revanced.extension.spotify.misc.fix.Session.FAILED_TO_RENEW_SESSION;
class WebApp {
private static final String OPEN_SPOTIFY_COM = "open.spotify.com";
private static final String OPEN_SPOTIFY_COM_URL = "https://" + OPEN_SPOTIFY_COM;
private static final String OPEN_SPOTIFY_COM_PREFERENCES_URL = OPEN_SPOTIFY_COM_URL + "/preferences";
private static final String ACCOUNTS_SPOTIFY_COM_LOGIN_URL = "https://accounts.spotify.com/login?allow_password=1"
+ "&continue=https%3A%2F%2Fopen.spotify.com%2Fpreferences";
private static final int GET_SESSION_TIMEOUT_SECONDS = 10;
private static final String JAVASCRIPT_INTERFACE_NAME = "androidInterface";
private static final String USER_AGENT = getWebUserAgent();
/**
* A session obtained from the webview after logging in.
*/
@Nullable
static volatile Session currentSession = null;
/**
* Current webview in use. Any use of the object must be done on the main thread.
*/
@SuppressLint("StaticFieldLeak")
private static volatile WebView currentWebView;
interface NativeLoginHandler {
void login();
}
static NativeLoginHandler nativeLoginHandler;
static void launchLogin(Context context) {
final Dialog dialog = newDialog(context);
Utils.runOnBackgroundThread(() -> {
Logger.printInfo(() -> "Launching login");
// A session must be obtained from a login. Repeat until a session is acquired.
boolean isAcquired = false;
do {
CountDownLatch onLoggedInLatch = new CountDownLatch(1);
CountDownLatch getSessionLatch = new CountDownLatch(1);
// Can't use Utils.getContext() here, because autofill won't work.
// See https://stackoverflow.com/a/79182053/11213244.
launchWebView(context, ACCOUNTS_SPOTIFY_COM_LOGIN_URL, new WebViewCallback() {
@Override
void onInitialized(WebView webView) {
super.onInitialized(webView);
dialog.setContentView(webView);
dialog.show();
}
@Override
void onLoggedIn(String cookies) {
onLoggedInLatch.countDown();
}
@Override
void onReceivedSession(Session session) {
super.onReceivedSession(session);
getSessionLatch.countDown();
dialog.dismiss();
try {
nativeLoginHandler.login();
} catch (Exception ex) {
Logger.printException(() -> "nativeLoginHandler failure", ex);
}
}
});
try {
// Wait indefinitely until the user logs in.
onLoggedInLatch.await();
// Wait until the session is received, or timeout.
isAcquired = getSessionLatch.await(GET_SESSION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
Logger.printException(() -> "Login interrupted", ex);
Thread.currentThread().interrupt();
}
} while (!isAcquired);
});
}
static void renewSessionBlocking(String cookies) {
Logger.printInfo(() -> "Renewing session with cookies: " + cookies);
CountDownLatch getSessionLatch = new CountDownLatch(1);
launchWebView(Utils.getContext(), OPEN_SPOTIFY_COM_PREFERENCES_URL, new WebViewCallback() {
@Override
public void onInitialized(WebView webView) {
setCookies(cookies);
super.onInitialized(webView);
}
public void onReceivedSession(Session session) {
super.onReceivedSession(session);
getSessionLatch.countDown();
}
});
boolean isAcquired = false;
try {
isAcquired = getSessionLatch.await(GET_SESSION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
Logger.printException(() -> "Session renewal interrupted", ex);
Thread.currentThread().interrupt();
}
if (!isAcquired) {
Logger.printException(() -> "Failed to retrieve session within " + GET_SESSION_TIMEOUT_SECONDS + " seconds");
currentSession = FAILED_TO_RENEW_SESSION;
destructWebView();
}
}
/**
* All methods are called on the main thread.
*/
abstract static class WebViewCallback {
void onInitialized(WebView webView) {
currentWebView = webView;
currentSession = null; // Reset current session.
}
void onLoggedIn(String cookies) {
}
void onReceivedSession(Session session) {
Logger.printInfo(() -> "Received session: " + session);
currentSession = session;
destructWebView();
}
}
@SuppressLint("SetJavaScriptEnabled")
private static void launchWebView(
Context context,
String initialUrl,
WebViewCallback webViewCallback
) {
Utils.runOnMainThreadNowOrLater(() -> {
WebView webView = new WebView(context);
WebSettings settings = webView.getSettings();
settings.setDomStorageEnabled(true);
settings.setJavaScriptEnabled(true);
settings.setUserAgentString(USER_AGENT);
// WebViewClient is always called off the main thread,
// but callback interface methods are called on the main thread.
webView.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
if (OPEN_SPOTIFY_COM.equals(request.getUrl().getHost())) {
Utils.runOnMainThread(() -> webViewCallback.onLoggedIn(getCurrentCookies()));
}
return super.shouldInterceptRequest(view, request);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Logger.printInfo(() -> "Page started loading: " + url);
if (!url.startsWith(OPEN_SPOTIFY_COM_URL)) {
return;
}
Logger.printInfo(() -> "Evaluating script to get session on url: " + url);
String getSessionScript = "Object.defineProperty(Object.prototype, \"_username\", {" +
" configurable: true," +
" set(username) {" +
" accessToken = this._builder?.accessToken;" +
" if (accessToken) {" +
" " + JAVASCRIPT_INTERFACE_NAME + ".getSession(username, accessToken);" +
" delete Object.prototype._username;" +
" }" +
" " +
" Object.defineProperty(this, \"_username\", {" +
" configurable: true," +
" enumerable: true," +
" writable: true," +
" value: username" +
" })" +
" " +
" }" +
"});" +
"if (new URLSearchParams(window.location.search).get('_authfailed') != null) {" +
" " + JAVASCRIPT_INTERFACE_NAME + ".getSession(null, null);" +
"}";
view.evaluateJavascript(getSessionScript, null);
}
});
webView.addJavascriptInterface(new Object() {
@SuppressWarnings("unused")
@JavascriptInterface
public void getSession(String username, String accessToken) {
Session session = new Session(username, accessToken, getCurrentCookies());
Utils.runOnMainThread(() -> webViewCallback.onReceivedSession(session));
}
}, JAVASCRIPT_INTERFACE_NAME);
CookieManager.getInstance().removeAllCookies((anyRemoved) -> {
Logger.printInfo(() -> "Loading URL: " + initialUrl);
webView.loadUrl(initialUrl);
Logger.printInfo(() -> "WebView initialized with user agent: " + USER_AGENT);
webViewCallback.onInitialized(webView);
});
});
}
private static void destructWebView() {
Utils.runOnMainThreadNowOrLater(() -> {
currentWebView.stopLoading();
currentWebView.destroy();
currentWebView = null;
});
}
private static String getWebUserAgent() {
String userAgentString = WebSettings.getDefaultUserAgent(Utils.getContext());
try {
return new UserAgent(userAgentString)
.withCommentReplaced("Android", "Windows NT 10.0; Win64; x64")
.withoutProduct("Mobile")
.toString();
} catch (IllegalArgumentException ex) {
userAgentString = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edge/137.0.0.0";
String fallback = userAgentString;
Logger.printException(() -> "Failed to get user agent, falling back to " + fallback, ex);
}
return userAgentString;
}
@NonNull
private static Dialog newDialog(Context context) {
Dialog dialog = new Dialog(context, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
dialog.setCancelable(false);
// Ensure that the keyboard does not cover the webview content.
Window window = dialog.getWindow();
//noinspection StatementWithEmptyBody
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
window.getDecorView().setOnApplyWindowInsetsListener((v, insets) -> {
v.setPadding(0, 0, 0, insets.getInsets(WindowInsets.Type.ime()).bottom);
return WindowInsets.CONSUMED;
});
} else {
// TODO: Implement for lower Android versions.
}
return dialog;
}
private static String getCurrentCookies() {
CookieManager cookieManager = CookieManager.getInstance();
return cookieManager.getCookie(OPEN_SPOTIFY_COM_URL);
}
private static void setCookies(@NonNull String cookies) {
CookieManager cookieManager = CookieManager.getInstance();
String[] cookiesList = cookies.split(";");
for (String cookie : cookiesList) {
cookieManager.setCookie(OPEN_SPOTIFY_COM_URL, cookie);
}
}
}

View File

@@ -0,0 +1,73 @@
syntax = "proto3";
package spotify.clienttoken.data.v0;
option optimize_for = LITE_RUNTIME;
option java_package = "app.revanced.extension.spotify.misc.fix.clienttoken.data.v0";
message ClientTokenRequest {
ClientTokenRequestType request_type = 1;
oneof request {
ClientDataRequest client_data = 2;
}
}
enum ClientTokenRequestType {
REQUEST_UNKNOWN = 0;
REQUEST_CLIENT_DATA_REQUEST = 1;
REQUEST_CHALLENGE_ANSWERS_REQUEST = 2;
}
message ClientDataRequest {
string client_version = 1;
string client_id = 2;
oneof data {
ConnectivitySdkData connectivity_sdk_data = 3;
}
}
message ConnectivitySdkData {
PlatformSpecificData platform_specific_data = 1;
string device_id = 2;
}
message PlatformSpecificData {
oneof data {
NativeIOSData ios = 2;
}
}
message NativeIOSData {
int32 user_interface_idiom = 1;
bool target_iphone_simulator = 2;
string hw_machine = 3;
string system_version = 4;
string simulator_model_identifier = 5;
}
message ClientTokenResponse {
ClientTokenResponseType response_type = 1;
oneof response {
GrantedTokenResponse granted_token = 2;
}
}
enum ClientTokenResponseType {
RESPONSE_UNKNOWN = 0;
RESPONSE_GRANTED_TOKEN_RESPONSE = 1;
RESPONSE_CHALLENGES_RESPONSE = 2;
}
message GrantedTokenResponse {
string token = 1;
int32 expires_after_seconds = 2;
int32 refresh_after_seconds = 3;
repeated TokenDomain domains = 4;
}
message TokenDomain {
string domain = 1;
}

View File

@@ -1,43 +0,0 @@
syntax = "proto3";
package spotify.login5.v4;
option optimize_for = LITE_RUNTIME;
option java_package = "app.revanced.extension.spotify.login5.v4.proto";
message StoredCredential {
string username = 1;
bytes data = 2;
}
message LoginRequest {
oneof login_method {
StoredCredential stored_credential = 100;
}
}
message LoginOk {
string username = 1;
string access_token = 2;
bytes stored_credential = 3;
int32 access_token_expires_in = 4;
}
message LoginResponse {
oneof response {
LoginOk ok = 1;
LoginError error = 2;
}
}
enum LoginError {
UNKNOWN_ERROR = 0;
INVALID_CREDENTIALS = 1;
BAD_REQUEST = 2;
UNSUPPORTED_LOGIN_PROTOCOL = 3;
TIMEOUT = 4;
UNKNOWN_IDENTIFIER = 5;
TOO_MANY_ATTEMPTS = 6;
INVALID_PHONENUMBER = 7;
TRY_AGAIN_LATER = 8;
}

View File

@@ -2,7 +2,5 @@ package com.spotify.browsita.v1.resolved;
public final class Section {
public static final int BRAND_ADS_FIELD_NUMBER = 6;
public static final int PROMOTION_V1_FIELD_NUMBER = 3;
public static final int PROMOTION_V3_FIELD_NUMBER = 5;
public int sectionTypeCase_;
}

View File

@@ -1,8 +0,0 @@
package com.spotify.useraccount.v1;
/**
* Used for target 8.6.98.900. Class is still present in newer app targets.
*/
public class AccountAttribute {
public Object value_;
}

View File

@@ -1,19 +0,0 @@
plugins {
java
antlr
}
dependencies {
antlr(libs.antlr4)
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks {
generateGrammarSource {
arguments = listOf("-visitor")
}
}

View File

@@ -1,35 +0,0 @@
grammar UserAgent;
@header { package app.revanced.extension.spotify; }
userAgent
: product (WS product)* EOF
;
product
: name ('/' version)? (WS comment)?
;
name
: STRING
;
version
: STRING ('.' STRING)*
;
comment
: COMMENT
;
COMMENT
: '(' ~ ')'* ')'
;
STRING
: [a-zA-Z0-9]+
;
WS
: [ \r\n]+
;

View File

@@ -1,60 +0,0 @@
package app.revanced.extension.spotify;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.TokenStreamRewriter;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
public class UserAgent {
private final UserAgentParser.UserAgentContext tree;
private final TokenStreamRewriter rewriter;
private final ParseTreeWalker walker;
public UserAgent(String userAgentString) {
CharStream input = CharStreams.fromString(userAgentString);
UserAgentLexer lexer = new UserAgentLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
tree = new UserAgentParser(tokens).userAgent();
walker = new ParseTreeWalker();
rewriter = new TokenStreamRewriter(tokens);
}
public UserAgent withoutProduct(String name) {
walker.walk(new UserAgentBaseListener() {
@Override
public void exitProduct(UserAgentParser.ProductContext ctx) {
if (!ctx.name().getText().contains(name)) return;
int startIndex = ctx.getStart().getTokenIndex();
if (startIndex != 0) startIndex -= 1; // Also remove the preceding whitespace.
int stopIndex = ctx.getStop().getTokenIndex();
rewriter.delete(startIndex, stopIndex);
}
}, tree);
return new UserAgent(rewriter.getText().trim());
}
public UserAgent withCommentReplaced(String containing, String replacement) {
walker.walk(new UserAgentBaseListener() {
@Override
public void exitComment(UserAgentParser.CommentContext ctx) {
if (ctx.getText().contains(containing)) {
rewriter.replace(ctx.getStart(), ctx.getStop(), "(" + replacement + ")");
}
}
}, tree);
return new UserAgent(rewriter.getText());
}
@Override
public String toString() {
return rewriter.getText();
}
}

View File

@@ -0,0 +1,16 @@
package app.revanced.extension.youtube.patches;
import app.revanced.extension.youtube.settings.Settings;
@SuppressWarnings("unused")
public final class DisableChapterSkipDoubleTapPatch {
/**
* Injection point.
*
* @return If "should skip to chapter start" flag is set.
*/
public static boolean disableDoubleTapChapters(boolean original) {
return original && !Settings.DISABLE_CHAPTER_SKIP_DOUBLE_TAP.get();
}
}

View File

@@ -59,10 +59,11 @@ public final class AnnouncementsPatch {
int id = Settings.ANNOUNCEMENT_LAST_ID.defaultValue;
try {
final var announcementIds = new JSONArray(jsonString);
if (announcementIds.length() == 0) return true;
id = announcementIds.getJSONObject(0).getInt("id");
} catch (Throwable ex) {
Logger.printException(() -> "Failed to parse announcement IDs", ex);
Logger.printException(() -> "Failed to parse announcement ID", ex);
}
// Do not show the announcement, if the last announcement id is the same as the current one.

View File

@@ -10,8 +10,8 @@ import static app.revanced.extension.shared.requests.Route.Method.GET;
public class AnnouncementsRoutes {
private static final String ANNOUNCEMENTS_PROVIDER = "https://api.revanced.app/v4";
public static final Route GET_LATEST_ANNOUNCEMENT_IDS = new Route(GET, "/announcements/latest/id?tag=youtube");
public static final Route GET_LATEST_ANNOUNCEMENTS = new Route(GET, "/announcements/latest?tag=youtube");
public static final Route GET_LATEST_ANNOUNCEMENT_IDS = new Route(GET, "/announcements/latest/id?tag=\uD83C\uDF9E\uFE0F YouTube");
public static final Route GET_LATEST_ANNOUNCEMENTS = new Route(GET, "/announcements/latest?tag=\uD83C\uDF9E\uFE0F YouTube");
private AnnouncementsRoutes() {
}

View File

@@ -3,6 +3,7 @@ package app.revanced.extension.youtube.patches.components;
import androidx.annotation.Nullable;
import app.revanced.extension.youtube.settings.Settings;
import app.revanced.extension.youtube.shared.PlayerType;
@SuppressWarnings("unused")
final class CommentsFilter extends Filter {
@@ -89,7 +90,9 @@ final class CommentsFilter extends Filter {
boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray,
StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) {
if (matchedGroup == chipBar) {
return aiCommentsSummary.check(protobufBufferArray).isFiltered();
// Playlist sort button uses same components and must only filter if the player is opened.
return PlayerType.getCurrent().isMaximizedOrFullscreen()
&& aiCommentsSummary.check(protobufBufferArray).isFiltered();
}
return true;

View File

@@ -146,6 +146,7 @@ public class Settings extends BaseSettings {
public static final BooleanSetting COPY_VIDEO_URL = new BooleanSetting("revanced_copy_video_url", FALSE);
public static final BooleanSetting COPY_VIDEO_URL_TIMESTAMP = new BooleanSetting("revanced_copy_video_url_timestamp", TRUE);
public static final BooleanSetting DISABLE_AUTO_CAPTIONS = new BooleanSetting("revanced_disable_auto_captions", FALSE, true);
public static final BooleanSetting DISABLE_CHAPTER_SKIP_DOUBLE_TAP = new BooleanSetting("revanced_disable_chapter_skip_double_tap", FALSE);
public static final BooleanSetting DISABLE_FULLSCREEN_AMBIENT_MODE = new BooleanSetting("revanced_disable_fullscreen_ambient_mode", TRUE, true);
public static final BooleanSetting DISABLE_ROLLING_NUMBER_ANIMATIONS = new BooleanSetting("revanced_disable_rolling_number_animations", FALSE);
public static final EnumSetting<FullscreenMode> EXIT_FULLSCREEN = new EnumSetting<>("revanced_exit_fullscreen", FullscreenMode.DISABLED);

View File

@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
org.gradle.parallel = true
android.useAndroidX = true
kotlin.code.style = official
version = 5.31.0-dev.8
version = 5.31.0-dev.17

View File

@@ -168,6 +168,10 @@ public final class app/revanced/patches/cricbuzz/ads/DisableAdsPatchKt {
public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/cricbuzz/misc/extension/ExtensionPatchKt {
public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/crunchyroll/ads/HideAdsPatchKt {
public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
@@ -900,6 +904,10 @@ public final class app/revanced/patches/shared/misc/spoof/UserAgentClientSpoofPa
public static final fun userAgentClientSpoofPatch (Ljava/lang/String;)Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/shared/misc/string/ReplaceStringPatchKt {
public static final fun replaceStringPatch (Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatchKt {
public static final fun getRemoveFileSizeLimitPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
@@ -1228,6 +1236,10 @@ public final class app/revanced/patches/youtube/interaction/dialog/RemoveViewerD
public static final fun getRemoveViewerDiscretionDialogPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatchKt {
public static final fun getDisableChapterSkipDoubleTapPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/youtube/interaction/downloads/DownloadsPatchKt {
public static final fun getDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}

View File

@@ -0,0 +1,92 @@
package app.revanced.patches.all.misc.spoof
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.patch.stringOption
import app.revanced.util.getNode
import com.android.apksig.ApkVerifier
import com.android.apksig.apk.ApkFormatException
import org.w3c.dom.Element
import java.io.File
import java.io.IOException
import java.nio.file.InvalidPathException
import java.security.NoSuchAlgorithmException
import java.security.cert.CertificateException
import java.security.cert.CertificateFactory
import java.util.*
@Suppress("unused")
val enableRomSignatureSpoofing = resourcePatch(
name = "Enable ROM signature spoofing",
description = "Spoofs the signature via the manifest meta-data \"fake-signature\". " +
"This patch only works with ROMs that support signature spoofing.",
use = false,
) {
val signatureOrPath by stringOption(
key = "signatureOrApkFilePath",
title = "Signature or APK file path",
validator = validator@{ signature ->
signature ?: return@validator false
parseSignature(signature) != null
},
description = "The hex-encoded signature or path to an APK file with the desired signature.",
required = true,
)
execute {
document("AndroidManifest.xml").use { document ->
val permission = document.createElement("uses-permission").apply {
setAttribute("android:name", "android.permission.FAKE_PACKAGE_SIGNATURE")
}
val manifest = document.getNode("manifest").appendChild(permission)
val fakeSignatureMetadata = document.createElement("meta-data").apply {
setAttribute("android:name", "fake-signature")
setAttribute("android:value", parseSignature(signatureOrPath!!))
}
document.getNode("application").appendChild(fakeSignatureMetadata)
}
}
}
private fun parseSignature(optionValue: String): String? {
// Parse as a hex-encoded signature.
try {
// TODO: Replace with signature.hexToByteArray when stable in kotlin
val signatureBytes = HexFormat.of().parseHex(optionValue)
CertificateFactory.getInstance("X.509").generateCertificate(signatureBytes.inputStream())
return optionValue
} catch (_: IllegalArgumentException) {
} catch (_: CertificateException) {
}
// Parse as a path to an APK file.
try {
val apkFile = File(optionValue)
if (!apkFile.isFile) return null
val result = ApkVerifier.Builder(apkFile).build().verify()
val hexFormat = HexFormat.of()
val signature = (if (result.isVerifiedUsingV3Scheme) {
result.v3SchemeSigners[0].certificate
} else if (result.isVerifiedUsingV2Scheme) {
result.v2SchemeSigners[0].certificate
} else if (result.isVerifiedUsingV1Scheme) {
result.v1SchemeSigners[0].certificate
} else {
return null
}).encoded
return hexFormat.formatHex(signature)
} catch (_: IOException) {
} catch (_: InvalidPathException) {
} catch (_: ApkFormatException) {
} catch (_: NoSuchAlgorithmException) {
} catch (_: IllegalArgumentException) {
}
return null
}

View File

@@ -1,95 +0,0 @@
package app.revanced.patches.all.misc.spoof
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.patch.stringOption
import app.revanced.util.getNode
import com.android.apksig.ApkVerifier
import com.android.apksig.apk.ApkFormatException
import org.w3c.dom.Element
import java.io.ByteArrayInputStream
import java.io.IOException
import java.nio.file.Files
import java.nio.file.InvalidPathException
import java.nio.file.attribute.BasicFileAttributes
import java.security.NoSuchAlgorithmException
import java.security.cert.CertificateException
import java.security.cert.CertificateFactory
import java.util.*
import kotlin.io.path.Path
val signatureSpoofPatch = resourcePatch(
name = "Spoof app signature",
description = "Spoofs the app signature via the \"fake-signature\" meta key. " +
"This patch only works with patched device roms.",
use = false,
) {
val signature by stringOption(
key = "spoofedAppSignature",
title = "Signature",
validator = { signature ->
optionToSignature(signature) != null
},
description = "The hex-encoded signature or path to an apk file with the desired signature",
required = true,
)
execute {
document("AndroidManifest.xml").use { document ->
val manifest = document.getNode("manifest") as Element
val fakeSignaturePermission = document.createElement("uses-permission")
fakeSignaturePermission.setAttribute("android:name", "android.permission.FAKE_PACKAGE_SIGNATURE")
manifest.appendChild(fakeSignaturePermission)
val application = document.getNode("application") ?: {
val child = document.createElement("application")
manifest.appendChild(child)
child
} as Element;
val fakeSignatureMetadata = document.createElement("meta-data")
fakeSignatureMetadata.setAttribute("android:name", "fake-signature")
fakeSignatureMetadata.setAttribute("android:value", optionToSignature(signature))
application.appendChild(fakeSignatureMetadata)
}
}
}
internal fun optionToSignature(signature: String?): String? {
if (signature == null) {
return null;
}
try {
// TODO: Replace with signature.hexToByteArray when stable in kotlin
val signatureBytes = HexFormat.of()
.parseHex(signature)
val factory = CertificateFactory.getInstance("X.509")
factory.generateCertificate(ByteArrayInputStream(signatureBytes))
return signature;
} catch (_: IllegalArgumentException) {
} catch (_: CertificateException) {
}
try {
val signaturePath = Path(signature)
if (!Files.readAttributes(signaturePath, BasicFileAttributes::class.java).isRegularFile) {
return null;
}
val verifier = ApkVerifier.Builder(signaturePath.toFile())
.build()
val result = verifier.verify()
if (result.isVerifiedUsingV3Scheme) {
return HexFormat.of().formatHex(result.v3SchemeSigners[0].certificate.encoded)
} else if (result.isVerifiedUsingV2Scheme) {
return HexFormat.of().formatHex(result.v2SchemeSigners[0].certificate.encoded)
} else if (result.isVerifiedUsingV1Scheme) {
return HexFormat.of().formatHex(result.v1SchemeSigners[0].certificate.encoded)
}
return null;
} catch (_: IOException) {
} catch (_: InvalidPathException) {
} catch (_: ApkFormatException) {
} catch (_: NoSuchAlgorithmException) {
} catch (_: IllegalArgumentException) {}
return null;
}

View File

@@ -3,24 +3,38 @@ package app.revanced.patches.cricbuzz.ads
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.cricbuzz.misc.extension.sharedExtensionPatch
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.returnEarly
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
private const val EXTENSION_CLASS_DESCRIPTOR =
"Lapp/revanced/extension/cricbuzz/ads/HideAdsPatch;"
@Suppress("unused")
val disableAdsPatch = bytecodePatch (
name = "Hide ads",
) {
compatibleWith("com.cricbuzz.android"("6.23.02"))
compatibleWith("com.cricbuzz.android"("6.24.01"))
dependsOn(sharedExtensionPatch)
execute {
userStateSwitchFingerprint.method.apply {
val opcodeIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_OBJECT)
val register = getInstruction<OneRegisterInstruction>(opcodeIndex).registerA
userStateSwitchFingerprint.method.returnEarly(true)
addInstruction(
opcodeIndex + 1,
"const-string v$register, \"ACTIVE\""
// Remove region-specific Cricbuzz11 elements.
cb11ConstructorFingerprint.method.addInstruction(0, "const/4 p7, 0x0")
getBottomBarFingerprint.method.apply {
val getIndex = indexOfFirstInstructionOrThrow() {
opcode == Opcode.IGET_OBJECT && getReference<FieldReference>()?.name == "bottomBar"
}
val getRegister = getInstruction<TwoRegisterInstruction>(getIndex).registerA
addInstruction(getIndex + 1,
"invoke-static { v$getRegister }, $EXTENSION_CLASS_DESCRIPTOR->filterCb11(Ljava/util/List;)V"
)
}
}

View File

@@ -4,6 +4,30 @@ import app.revanced.patcher.fingerprint
import com.android.tools.smali.dexlib2.Opcode
internal val userStateSwitchFingerprint = fingerprint {
strings("key.user.state", "NA")
opcodes(Opcode.SPARSE_SWITCH)
strings("key.user.state", "NA")
}
internal val cb11ConstructorFingerprint = fingerprint {
parameters(
"Ljava/lang/String;",
"Ljava/lang/String;",
"Ljava/lang/String;",
"I",
"Ljava/lang/String;",
"Ljava/lang/String;",
"Z",
"Ljava/lang/String;",
"Ljava/lang/String;",
"L"
)
custom { _, classDef ->
classDef.endsWith("CB11Details;")
}
}
internal val getBottomBarFingerprint = fingerprint {
custom { method, classDef ->
method.name == "getBottomBar" && classDef.endsWith("HomeMenu;")
}
}

View File

@@ -0,0 +1,5 @@
package app.revanced.patches.cricbuzz.misc.extension
import app.revanced.patches.shared.misc.extension.sharedExtensionPatch
val sharedExtensionPatch = sharedExtensionPatch("cricbuzz", applicationInitHook)

View File

@@ -0,0 +1,9 @@
package app.revanced.patches.cricbuzz.misc.extension
import app.revanced.patches.shared.misc.extension.extensionHook
internal val applicationInitHook = extensionHook {
custom { method, classDef ->
method.name == "onCreate" && classDef.endsWith("/NyitoActivity;")
}
}

View File

@@ -4,9 +4,16 @@ import app.revanced.patcher.Fingerprint
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patches.reddit.customclients.spoofClientPatch
import app.revanced.patches.shared.misc.string.replaceStringPatch
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
val spoofClientPatch = spoofClientPatch(redirectUri = "http://baconreader.com/auth") { clientIdOption ->
dependsOn(
// Redirects from SSL to WWW domain are bugged causing auth problems.
// Manually rewrite the URLs to fix this.
replaceStringPatch("ssl.reddit.com", "www.reddit.com")
)
compatibleWith(
"com.onelouder.baconreader",
"com.onelouder.baconreader.premium",

View File

@@ -61,7 +61,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "redditisfun://auth") { cl
// region Patch miscellaneous.
// Reddit messed up and does not append a redirect uri to the authorization url to old.reddit.com/login.
// Replace old.reddit.com with ssl.reddit.com to fix this.
// Replace old.reddit.com with www.reddit.com to fix this.
buildAuthorizationStringFingerprint.method.apply {
val index = indexOfFirstInstructionOrThrow {
getReference<StringReference>()?.contains("old.reddit.com") == true
@@ -70,7 +70,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "redditisfun://auth") { cl
val targetRegister = getInstruction<OneRegisterInstruction>(index).registerA
replaceInstruction(
index,
"const-string v$targetRegister, \"https://ssl.reddit.com/api/v1/authorize.compact\"",
"const-string v$targetRegister, \"https://www.reddit.com/api/v1/authorize.compact\"",
)
}

View File

@@ -4,6 +4,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patches.reddit.customclients.spoofClientPatch
import app.revanced.patches.reddit.customclients.sync.detection.piracy.disablePiracyDetectionPatch
import app.revanced.patches.shared.misc.string.replaceStringPatch
import app.revanced.util.returnEarly
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
@@ -13,7 +14,12 @@ import java.util.Base64
val spoofClientPatch = spoofClientPatch(
redirectUri = "http://redditsync/auth",
) { clientIdOption ->
dependsOn(disablePiracyDetectionPatch)
dependsOn(
disablePiracyDetectionPatch,
// Redirects from SSL to WWW domain are bugged causing auth problems.
// Manually rewrite the URLs to fix this.
replaceStringPatch("ssl.reddit.com", "www.reddit.com")
)
compatibleWith(
"com.laurencedawson.reddit_sync",

View File

@@ -0,0 +1,39 @@
package app.revanced.patches.shared.misc.string
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.all.misc.transformation.transformInstructionsPatch
import app.revanced.util.getReference
import com.android.tools.smali.dexlib2.ReferenceType
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.StringReference
import kotlin.text.contains
fun replaceStringPatch(
from: String,
to: String
) = bytecodePatch(
description = "Replaces occurrences of '$from' with '$to' in string references.",
) {
dependsOn(
transformInstructionsPatch(
filterMap = filterMap@{ _, _, instruction, instructionIndex ->
if (instruction.opcode.referenceType != ReferenceType.STRING) return@filterMap null
val stringReference = instruction.getReference<StringReference>()!!.string
if (from !in stringReference) return@filterMap null
Triple(instructionIndex, instruction as OneRegisterInstruction, stringReference)
},
transform = transform@{ mutableMethod, entry ->
val (instructionIndex, instruction, stringReference) = entry
val newString = stringReference.replace(from, to)
mutableMethod.replaceInstruction(
instructionIndex,
"${instruction.opcode.name} v${instruction.registerA}, \"$newString\"",
)
},
)
)
}

View File

@@ -6,12 +6,10 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch
import app.revanced.patches.spotify.shared.IS_SPOTIFY_LEGACY_APP_TARGET
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
import java.util.logging.Logger
private const val EXTENSION_CLASS_DESCRIPTOR =
"Lapp/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch;"
@@ -26,13 +24,6 @@ val hideCreateButtonPatch = bytecodePatch(
dependsOn(sharedExtensionPatch)
execute {
if (IS_SPOTIFY_LEGACY_APP_TARGET) {
Logger.getLogger(this::class.java.name).warning(
"Create button does not exist in legacy app target. No changes applied."
)
return@execute
}
val oldNavigationBarAddItemMethod = oldNavigationBarAddItemFingerprint.originalMethodOrNull
// Only throw the fingerprint error when oldNavigationBarAddItemMethod does not exist.
val navigationBarItemSetClassDef = if (oldNavigationBarAddItemMethod == null) {

View File

@@ -7,8 +7,8 @@ import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.patch.stringOption
import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch
import app.revanced.patches.spotify.shared.IS_SPOTIFY_LEGACY_APP_TARGET
import app.revanced.util.*
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
import org.w3c.dom.Element
@@ -19,12 +19,6 @@ private val customThemeBytecodePatch = bytecodePatch {
dependsOn(sharedExtensionPatch)
execute {
if (IS_SPOTIFY_LEGACY_APP_TARGET) {
// Bytecode changes are not needed for legacy app target.
// Player background color is changed with existing resource patch.
return@execute
}
val colorSpaceUtilsClassDef = colorSpaceUtilsClassFingerprint.originalClassDef
// Hook a util method that converts ARGB to RGBA in the sRGB color space to replace hardcoded accent colors.

View File

@@ -1,23 +0,0 @@
package app.revanced.patches.spotify.lite.ondemand
import com.android.tools.smali.dexlib2.Opcode
import app.revanced.patcher.fingerprint
internal val onDemandFingerprint = fingerprint(fuzzyPatternScanThreshold = 2) {
returns("L")
parameters()
opcodes(
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.IF_EQZ,
Opcode.SGET_OBJECT,
Opcode.GOTO,
Opcode.SGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.IPUT,
Opcode.RETURN_OBJECT,
)
}

View File

@@ -1,21 +1,9 @@
package app.revanced.patches.spotify.lite.ondemand
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.patch.bytecodePatch
@Deprecated("Patch no longer works and will be deleted soon")
@Suppress("unused")
val onDemandPatch = bytecodePatch(
description = "Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.",
) {
compatibleWith("com.spotify.lite")
execute {
// Spoof a premium account
onDemandFingerprint.method.addInstruction(
onDemandFingerprint.patternMatch!!.endIndex - 1,
"const/4 v0, 0x2",
)
}
}
)

View File

@@ -2,7 +2,6 @@ package app.revanced.patches.spotify.misc
import app.revanced.patcher.fingerprint
import app.revanced.patcher.patch.BytecodePatchContext
import app.revanced.patches.spotify.shared.IS_SPOTIFY_LEGACY_APP_TARGET
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import com.android.tools.smali.dexlib2.AccessFlags
@@ -13,25 +12,13 @@ import com.android.tools.smali.dexlib2.iface.reference.TypeReference
context(BytecodePatchContext)
internal val accountAttributeFingerprint get() = fingerprint {
custom { _, classDef ->
classDef.type == if (IS_SPOTIFY_LEGACY_APP_TARGET) {
"Lcom/spotify/useraccount/v1/AccountAttribute;"
} else {
"Lcom/spotify/remoteconfig/internal/AccountAttribute;"
}
}
custom { _, classDef -> classDef.type == "Lcom/spotify/remoteconfig/internal/AccountAttribute;" }
}
context(BytecodePatchContext)
internal val productStateProtoGetMapFingerprint get() = fingerprint {
returns("Ljava/util/Map;")
custom { _, classDef ->
classDef.type == if (IS_SPOTIFY_LEGACY_APP_TARGET) {
"Lcom/spotify/ucs/proto/v0/UcsResponseWrapper${'$'}AccountAttributesResponse;"
} else {
"Lcom/spotify/remoteconfig/internal/ProductStateProto;"
}
}
custom { _, classDef -> classDef.type == "Lcom/spotify/remoteconfig/internal/ProductStateProto;" }
}
internal val buildQueryParametersFingerprint = fingerprint {
@@ -90,14 +77,14 @@ internal val contextFromJsonFingerprint = fingerprint {
)
custom { method, classDef ->
method.name == "fromJson" &&
classDef.endsWith("voiceassistants/playermodels/ContextJsonAdapter;")
classDef.type.endsWith("voiceassistants/playermodels/ContextJsonAdapter;")
}
}
internal val readPlayerOptionOverridesFingerprint = fingerprint {
custom { method, classDef ->
method.name == "readPlayerOptionOverrides" &&
classDef.endsWith("voiceassistants/playermodels/PreparePlayOptionsJsonAdapter;")
classDef.type.endsWith("voiceassistants/playermodels/PreparePlayOptionsJsonAdapter;")
}
}
@@ -119,21 +106,21 @@ internal val abstractProtobufListEnsureIsMutableFingerprint = fingerprint {
internal fun structureGetSectionsFingerprint(className: String) = fingerprint {
custom { method, classDef ->
classDef.endsWith(className) && method.indexOfFirstInstruction {
classDef.type.endsWith(className) && method.indexOfFirstInstruction {
opcode == Opcode.IGET_OBJECT && getReference<FieldReference>()?.name == "sections_"
} >= 0
}
}
internal val homeSectionFingerprint = fingerprint {
custom { _, classDef -> classDef.endsWith("homeapi/proto/Section;") }
custom { _, classDef -> classDef.type.endsWith("homeapi/proto/Section;") }
}
internal val homeStructureGetSectionsFingerprint =
structureGetSectionsFingerprint("homeapi/proto/HomeStructure;")
internal val browseSectionFingerprint = fingerprint {
custom { _, classDef-> classDef.endsWith("browsita/v1/resolved/Section;") }
custom { _, classDef-> classDef.type.endsWith("browsita/v1/resolved/Section;") }
}
internal val browseStructureGetSectionsFingerprint =

View File

@@ -7,37 +7,12 @@ import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
internal val getPackageInfoFingerprint = fingerprint {
strings(
"Failed to get the application signatures"
)
}
internal val loadOrbitLibraryFingerprint = fingerprint {
strings("/liborbit-jni-spotify.so")
}
internal val startupPageLayoutInflateFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Landroid/view/View;")
parameters("Landroid/view/LayoutInflater;", "Landroid/view/ViewGroup;", "Landroid/os/Bundle;")
strings("blueprintContainer", "gradient", "valuePropositionTextView")
}
internal val renderStartLoginScreenFingerprint = fingerprint {
strings("authenticationButtonFactory", "MORE_OPTIONS")
}
internal val renderSecondLoginScreenFingerprint = fingerprint {
strings("authenticationButtonFactory", "intent_login")
}
internal val renderThirdLoginScreenFingerprint = fingerprint {
strings("EMAIL_OR_USERNAME", "listener")
}
internal val thirdLoginScreenLoginOnClickFingerprint = fingerprint {
strings("login", "listener", "none")
internal val extensionFixConstantsFingerprint = fingerprint {
custom { _, classDef -> classDef.type == "Lapp/revanced/extension/spotify/misc/fix/Constants;" }
}
internal val runIntegrityVerificationFingerprint = fingerprint {

View File

@@ -1,19 +1,13 @@
package app.revanced.patches.spotify.misc.fix
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.intOption
import app.revanced.patcher.patch.stringOption
import app.revanced.patches.shared.misc.hex.HexPatchBuilder
import app.revanced.patches.shared.misc.hex.hexPatch
import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch
import app.revanced.util.*
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
import app.revanced.util.returnEarly
internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/spotify/misc/fix/SpoofClientPatch;"
@@ -25,70 +19,77 @@ val spoofClientPatch = bytecodePatch(
val requestListenerPort by intOption(
key = "requestListenerPort",
default = 4345,
title = " Login request listener port",
description = "The port to use for the listener that intercepts and handles login requests. " +
"Port must be between 0 and 65535.",
required = true,
title = "Request listener port",
description = "The port to use for the listener that intercepts and handles spoofed requests. " +
"Port must be between 0 and 65535. " +
"Do not change this option, if you do not know what you are doing.",
validator = {
it!!
!(it < 0 || it > 65535)
}
)
val clientVersion by stringOption(
key = "clientVersion",
default = "iphone-9.0.58.558.g200011c",
title = "Client version",
description = "The client version used for spoofing the client token. " +
"Do not change this option, if you do not know what you are doing."
)
val hardwareMachine by stringOption(
key = "hardwareMachine",
default = "iPhone16,1",
title = "Hardware machine",
description = "The hardware machine used for spoofing the client token. " +
"Do not change this option, if you do not know what you are doing."
)
val systemVersion by stringOption(
key = "systemVersion",
default = "17.7.2",
title = "System version",
description = "The system version used for spoofing the client token. " +
"Do not change this option, if you do not know what you are doing."
)
dependsOn(
sharedExtensionPatch,
hexPatch(ignoreMissingTargetFiles = true, block = fun HexPatchBuilder.() {
listOf(
"arm64-v8a",
"armeabi-v7a",
"x86",
"x86_64"
).forEach { architecture ->
"https://clienttoken.spotify.com/v1/clienttoken" to
"http://127.0.0.1:$requestListenerPort/v1/clienttoken" inFile
"lib/$architecture/liborbit-jni-spotify.so"
}
})
)
compatibleWith("com.spotify.music")
execute {
// region Spoof package info.
getPackageInfoFingerprint.method.apply {
// region Spoof signature.
val failedToGetSignaturesStringIndex =
getPackageInfoFingerprint.stringMatches!!.first().index
val concatSignaturesIndex = indexOfFirstInstructionReversedOrThrow(
failedToGetSignaturesStringIndex,
Opcode.MOVE_RESULT_OBJECT,
)
val signatureRegister = getInstruction<OneRegisterInstruction>(concatSignaturesIndex).registerA
val expectedSignature = "d6a6dced4a85f24204bf9505ccc1fce114cadb32"
replaceInstruction(concatSignaturesIndex, "const-string v$signatureRegister, \"$expectedSignature\"")
// endregion
// region Spoof installer name.
val expectedInstallerName = "com.android.vending"
findInstructionIndicesReversedOrThrow {
val reference = getReference<MethodReference>()
reference?.name == "getInstallerPackageName" || reference?.name == "getInstallingPackageName"
}.forEach { index ->
val returnObjectIndex = index + 1
val installerPackageNameRegister = getInstruction<OneRegisterInstruction>(
returnObjectIndex
).registerA
addInstruction(
returnObjectIndex + 1,
"const-string v$installerPackageNameRegister, \"$expectedInstallerName\""
)
}
// endregion
}
// endregion
// region Spoof client.
loadOrbitLibraryFingerprint.method.addInstructions(
0,
"""
const/16 v0, $requestListenerPort
invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->launchListener(I)V
"""
)
mapOf(
"getClientVersion" to clientVersion!!,
"getSystemVersion" to systemVersion!!,
"getHardwareMachine" to hardwareMachine!!
).forEach { (methodName, value) ->
extensionFixConstantsFingerprint.classDef.methods.single { it.name == methodName }.returnEarly(value)
}
// endregion
// region Disable verdicts.

View File

@@ -6,7 +6,6 @@ import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.stringOption
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.spotify.shared.IS_SPOTIFY_LEGACY_APP_TARGET
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
@@ -57,16 +56,10 @@ val changeLyricsProviderPatch = bytecodePatch(
}
execute {
if (IS_SPOTIFY_LEGACY_APP_TARGET) {
Logger.getLogger(this::class.java.name).severe(
"Change lyrics provider patch is not supported for this target version."
)
return@execute
}
val httpClientBuilderMethod = httpClientBuilderFingerprint.originalMethod
// region Create a modified copy of the HTTP client builder method with the custom lyrics provider host.
val patchedHttpClientBuilderMethod = with(httpClientBuilderMethod) {
val invokeBuildUrlIndex = indexOfFirstInstructionOrThrow {
getReference<MethodReference>()?.returnType == "Lokhttp3/HttpUrl;"
@@ -89,9 +82,11 @@ val changeLyricsProviderPatch = bytecodePatch(
httpClientBuilderFingerprint.classDef.methods.add(this)
}
}
//endregion
// region Replace the call to the HTTP client builder method used exclusively for lyrics by the modified one.
getLyricsHttpClientFingerprint(httpClientBuilderMethod).method.apply {
val getLyricsHttpClientIndex = indexOfFirstInstructionOrThrow {
getReference<MethodReference>() == httpClientBuilderMethod
@@ -118,6 +113,7 @@ val changeLyricsProviderPatch = bytecodePatch(
)
)
}
//endregion
}
}

View File

@@ -14,7 +14,7 @@ internal val shareCopyUrlFingerprint = fingerprint {
}
}
internal val shareCopyUrlLegacyFingerprint = fingerprint {
internal val oldShareCopyUrlFingerprint = fingerprint {
returns("Ljava/lang/Object;")
parameters("Ljava/lang/Object;")
strings("clipboard", "createNewSession failed")
@@ -38,7 +38,7 @@ internal val formatAndroidShareSheetUrlFingerprint = fingerprint {
}
}
internal val formatAndroidShareSheetUrlLegacyFingerprint = fingerprint {
internal val oldFormatAndroidShareSheetUrlFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC)
returns("Ljava/lang/String;")
parameters("Lcom/spotify/share/social/sharedata/ShareData;", "Ljava/lang/String;")

View File

@@ -1,11 +1,9 @@
package app.revanced.patches.spotify.misc.privacy
import app.revanced.patcher.Fingerprint
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch
import app.revanced.patches.spotify.shared.IS_SPOTIFY_LEGACY_APP_TARGET
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.AccessFlags
@@ -28,10 +26,10 @@ val sanitizeSharingLinksPatch = bytecodePatch(
val extensionMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->" +
"sanitizeUrl(Ljava/lang/String;)Ljava/lang/String;"
val copyFingerprint = if (IS_SPOTIFY_LEGACY_APP_TARGET) {
shareCopyUrlLegacyFingerprint
} else {
val copyFingerprint = if (shareCopyUrlFingerprint.originalMethodOrNull != null) {
shareCopyUrlFingerprint
} else {
oldShareCopyUrlFingerprint
}
copyFingerprint.method.apply {
@@ -50,15 +48,10 @@ val sanitizeSharingLinksPatch = bytecodePatch(
}
// Android native share sheet is used for all other quick share types (X, WhatsApp, etc).
val shareUrlParameter : String
val shareSheetFingerprint : Fingerprint
if (IS_SPOTIFY_LEGACY_APP_TARGET) {
shareSheetFingerprint = formatAndroidShareSheetUrlLegacyFingerprint
shareUrlParameter = "p2"
} else {
shareSheetFingerprint = formatAndroidShareSheetUrlFingerprint
val methodAccessFlags = formatAndroidShareSheetUrlFingerprint.originalMethod.accessFlags
shareUrlParameter = if (AccessFlags.STATIC.isSet(methodAccessFlags)) {
val shareUrlParameter: String
val shareSheetFingerprint = if (formatAndroidShareSheetUrlFingerprint.originalMethodOrNull != null) {
val methodAccessFlags = formatAndroidShareSheetUrlFingerprint.originalMethod
shareUrlParameter = if (AccessFlags.STATIC.isSet(methodAccessFlags.accessFlags)) {
// In newer implementations the method is static, so p0 is not `this`.
"p1"
} else {
@@ -66,6 +59,11 @@ val sanitizeSharingLinksPatch = bytecodePatch(
// For that reason, add one to the parameter register.
"p2"
}
formatAndroidShareSheetUrlFingerprint
} else {
shareUrlParameter = "p2"
oldFormatAndroidShareSheetUrlFingerprint
}
shareSheetFingerprint.method.addInstructions(

View File

@@ -1,9 +1,7 @@
package app.revanced.patches.spotify.misc.widgets
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.spotify.shared.IS_SPOTIFY_LEGACY_APP_TARGET
import app.revanced.util.returnEarly
import java.util.logging.Logger
@Suppress("unused")
val fixThirdPartyLaunchersWidgets = bytecodePatch(
@@ -13,14 +11,6 @@ val fixThirdPartyLaunchersWidgets = bytecodePatch(
compatibleWith("com.spotify.music")
execute {
if (IS_SPOTIFY_LEGACY_APP_TARGET) {
// The permission check does not exist in legacy versions.
Logger.getLogger(this::class.java.name).warning(
"Legacy app target does not have any third party launcher restrictions. No changes applied."
)
return@execute
}
// Only system app launchers are granted the BIND_APPWIDGET permission.
// Override the method that checks for it to always return true, as this permission is not actually required
// for the widgets to work.

View File

@@ -1,38 +1,15 @@
package app.revanced.patches.spotify.shared
import app.revanced.patcher.fingerprint
import app.revanced.patcher.patch.BytecodePatchContext
import com.android.tools.smali.dexlib2.AccessFlags
private const val SPOTIFY_MAIN_ACTIVITY = "Lcom/spotify/music/SpotifyMainActivity;"
/**
* Main activity of target 8.6.98.900.
*/
internal const val SPOTIFY_MAIN_ACTIVITY_LEGACY = "Lcom/spotify/music/MainActivity;"
internal val mainActivityOnCreateFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("V")
parameters("Landroid/os/Bundle;")
custom { method, classDef ->
method.name == "onCreate" && (classDef.type == SPOTIFY_MAIN_ACTIVITY
|| classDef.type == SPOTIFY_MAIN_ACTIVITY_LEGACY)
method.name == "onCreate" && classDef.type == SPOTIFY_MAIN_ACTIVITY
}
}
private var isLegacyAppTarget: Boolean? = null
/**
* If patching a legacy 8.x target. This may also be set if patching slightly older/newer app targets,
* but the only legacy target of interest is 8.6.98.900 as it's the last version that
* supports Spotify integration on Kenwood/Pioneer car stereos.
*/
context(BytecodePatchContext)
internal val IS_SPOTIFY_LEGACY_APP_TARGET
get(): Boolean {
if (isLegacyAppTarget == null) {
isLegacyAppTarget = mainActivityOnCreateFingerprint.originalClassDef.type == SPOTIFY_MAIN_ACTIVITY_LEGACY
}
return isLegacyAppTarget!!
}

View File

@@ -0,0 +1,63 @@
package app.revanced.patches.youtube.interaction.doubletap
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch
private const val EXTENSION_CLASS_DESCRIPTOR =
"Lapp/revanced/extension/youtube/patches/DisableChapterSkipDoubleTapPatch;"
@Suppress("unused")
val disableChapterSkipDoubleTapPatch = bytecodePatch(
name = "Disable double tap actions",
description = "Adds an option to disable player double tap gestures.",
) {
dependsOn(
sharedExtensionPatch,
settingsPatch,
addResourcesPatch,
)
compatibleWith(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
)
)
execute {
addResources("youtube", "interaction.doubletap.disableChapterSkipDoubleTapPatch")
PreferenceScreen.PLAYER.addPreferences(
SwitchPreference("revanced_disable_chapter_skip_double_tap"),
)
// Force isChapterSeek flag to false.
doubleTapInfoGetSeekSourceFingerprint.method.addInstructions(
0,
"""
invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->disableDoubleTapChapters(Z)Z
move-result p1
"""
)
doubleTapInfoCtorFingerprint.match(
doubleTapInfoGetSeekSourceFingerprint.classDef
).method.addInstructions(
0,
"""
invoke-static { p3 }, $EXTENSION_CLASS_DESCRIPTOR->disableDoubleTapChapters(Z)Z
move-result p3
"""
)
}
}

View File

@@ -0,0 +1,31 @@
package app.revanced.patches.youtube.interaction.doubletap
import app.revanced.patcher.fingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal val doubleTapInfoGetSeekSourceFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
parameters("Z")
returns("L") // Enum SeekSource, but name obfuscated.
opcodes(
Opcode.IF_EQZ,
Opcode.SGET_OBJECT,
Opcode.RETURN_OBJECT,
Opcode.SGET_OBJECT,
Opcode.RETURN_OBJECT,
)
custom { _, classDef ->
classDef.fields.count() == 4
}
}
internal val doubleTapInfoCtorFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
parameters(
"Landroid/view/MotionEvent;",
"I",
"Z",
"Lj\$/time/Duration;"
)
}

View File

@@ -73,12 +73,9 @@ val enableSlideToSeekPatch = bytecodePatch(
// Disable the double speed seek gesture.
if (is_19_17_or_greater) {
arrayOf(
disableFastForwardGestureFingerprint,
disableFastForwardNoticeFingerprint,
).forEach { fingerprint ->
fingerprint.method.apply {
val targetIndex = fingerprint.patternMatch!!.endIndex
disableFastForwardGestureFingerprint.let {
it.method.apply {
val targetIndex = it.patternMatch!!.endIndex
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
addInstructions(

View File

@@ -3,14 +3,12 @@ package app.revanced.patches.youtube.interaction.seekbar
import app.revanced.patcher.fingerprint
import app.revanced.util.containsLiteralInstruction
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import app.revanced.util.indexOfFirstInstructionReversed
import app.revanced.util.literal
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
import com.android.tools.smali.dexlib2.iface.reference.StringReference
internal val swipingUpGestureParentFingerprint = fingerprint {
returns("Z")
@@ -59,25 +57,6 @@ internal val disableFastForwardGestureFingerprint = fingerprint {
}
}
internal val disableFastForwardNoticeFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("V")
parameters()
opcodes(
Opcode.CHECK_CAST,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
)
custom { method, _ ->
method.name == "run" && method.indexOfFirstInstruction {
// In later targets the code is found in different methods with different strings.
val string = getReference<StringReference>()?.string
string == "Failed to easy seek haptics vibrate." || string == "search_landing_cache_key"
} >= 0
}
}
internal val onTouchEventHandlerFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.PUBLIC)
returns("Z")

View File

@@ -9,7 +9,6 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.InputType
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.shared.misc.settings.preference.TextPreference
import app.revanced.patches.youtube.interaction.seekbar.disableFastForwardNoticeFingerprint
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter
import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch

View File

@@ -1,8 +1,11 @@
package app.revanced.patches.youtube.video.speed.custom
import app.revanced.patcher.fingerprint
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.reference.StringReference
internal val speedLimiterFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
@@ -19,3 +22,16 @@ internal val speedLimiterFingerprint = fingerprint {
Opcode.INVOKE_STATIC,
)
}
internal val disableFastForwardNoticeFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("V")
parameters()
custom { method, _ ->
method.name == "run" && method.indexOfFirstInstruction {
// In later targets the code is found in different methods with different strings.
val string = getReference<StringReference>()?.string
string == "Failed to easy seek haptics vibrate." || string == "search_landing_cache_key"
} >= 0
}
}

View File

@@ -168,7 +168,17 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
<string name="revanced_hide_feed_survey_summary_on">Axın sorğuları gizlidir</string>
<string name="revanced_hide_feed_survey_summary_off">Axın sorğuları göstərilir</string>
<string name="revanced_hide_floating_microphone_button_title">Üzən mikrofon düyməsini gizlət</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Axtarışda üzən mikrofon düyməsi gizlidir</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Üzən mikrofon düyməsi axtarışda göstərilir</string>
<string name="revanced_hide_horizontal_shelves_title">Üfüqi hissələri gizlət</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Üfüqi cərgələr gizlidir, məsələn:
• Son xəbərlər
• İzləməyə davam et
• Daha çox kanal kəşf et
• Ən uyğun
• Alış-veriş
• Yenidən izləyin"</string>
<string name="revanced_hide_horizontal_shelves_summary_off">Üfüqi cərgələr görünür</string>
<string name="revanced_hide_image_shelf_title">Şəkil cərgəsin gizlət</string>
<string name="revanced_hide_image_shelf_summary_on">Şəkil cərgəsi axtarış nəticələrində gizlidir</string>
<string name="revanced_hide_image_shelf_summary_off">Şəkil cərgəsi axtarış nəticələrində görünür</string>
@@ -184,18 +194,27 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
This item appear in the subscription feed for future livestreams or unreleased videos. -->
<string name="revanced_hide_notify_me_button_title">\"Mənə bildir\" düyməsini gizlət</string>
<string name="revanced_hide_notify_me_button_summary_on">Mənə bildir düyməsi gizlidir</string>
<string name="revanced_hide_notify_me_button_summary_off">Mənə bildir düyməsi görünür</string>
<string name="revanced_hide_playables_title">Oynadılan elementləri gizlət</string>
<string name="revanced_hide_playables_summary_on">Oynadılanlar gizlidir</string>
<string name="revanced_hide_playables_summary_off">Oynadılanlar göstərilir</string>
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
This button usually appears when searching for a YT creator. -->
<string name="revanced_hide_show_more_button_title">\'Daha çox göstər\' düyməsini gizlət</string>
<string name="revanced_hide_show_more_button_summary_on">Daha çox göstər düyməsi axtarış nəticələrində gizlidir</string>
<string name="revanced_hide_show_more_button_summary_off">Daha çox göstər düyməsi axtarış nəticələrində görünür</string>
<string name="revanced_hide_ticket_shelf_title">Bilet bölməsin gizlət</string>
<string name="revanced_hide_ticket_shelf_summary_on">Bilet bölməsi gizlidir</string>
<string name="revanced_hide_ticket_shelf_summary_off">Bilet bölməsi görünür</string>
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
<string name="revanced_hide_video_recommendation_labels_title">Video tövsiyə etiketlərini gizlət</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">\'İnsanlar həmçinin izləyiblər\' və \'Bunu da bəyənə bilərsiniz\' etiketləri axtarış nəticələrində gizlədilib</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">\'İnsanlar həmçinin izləyiblər\' və \'Bunu da bəyənə bilərsiniz\' etiketləri axtarış nəticələrində görünür</string>
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
<string name="revanced_hide_doodles_title">YouTube Doodle-ları gizlət</string>
<string name="revanced_hide_doodles_summary_on">YouTube Doodles animasiyası simvolda gizlidir</string>
<string name="revanced_hide_doodles_summary_off">YouTube Doodles animasiyası simvolda görünür</string>
<string name="revanced_hide_doodles_user_dialog_message">"YouTube Doodle-ları hər il bir neçə gün görünür.
Əgər hazırda bölgənizdə Doodle göstərilirsə və bu gizlətmə seçimi aktivdirsə, axtarış cizgisi aşağısındakı filtr sahəsi də gizlədiləcək."</string>
@@ -214,6 +233,8 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
<!-- 'Join' should be translated using the same localized wording YouTube displays.
This appears in the video player for certain videos. -->
<string name="revanced_hide_join_membership_button_title">Qoşul düyməsin gizlət</string>
<string name="revanced_hide_join_membership_button_summary_on">Qoşul düyməsi gizlidir</string>
<string name="revanced_hide_join_membership_button_summary_off">Qoşul düyməsi görünür</string>
<string name="revanced_hide_medical_panels_title">Tibbi lövhələri gizlət</string>
<string name="revanced_hide_medical_panels_summary_on">Tibbi lövhələr gizlidir</string>
<string name="revanced_hide_medical_panels_summary_off">Tibbi lövhələr göstərilir</string>
@@ -371,7 +392,11 @@ Məhdudiyyətlər
</patch>
<patch id="ad.general.hideAdsResourcePatch">
<string name="revanced_hide_creator_store_shelf_title">Yaradıcı mağaza bölümün gizlət</string>
<string name="revanced_hide_creator_store_shelf_summary_on">Yaradıcı alış-veriş cərgəsi video oynadıcı altında gizlidir</string>
<string name="revanced_hide_creator_store_shelf_summary_off">Yaradıcı alış-veriş cərgəsi video oynadıcı altında görünür</string>
<string name="revanced_hide_end_screen_store_banner_title">Son ekran mağaza etiketini gizlət</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">Son ekran alış-veriş etiketi gizlədilib</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">Son ekran alış-veriş etiketi görünür</string>
<string name="revanced_hide_fullscreen_ads_title">Tam ekran reklamlarını gizlət</string>
<string name="revanced_hide_fullscreen_ads_summary_on">"Tam ekran reklamları gizlidir
@@ -392,8 +417,12 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur"</string>
<string name="revanced_hide_self_sponsor_ads_summary_on">Özünə sponsorluq edilən kartlar gizlidir</string>
<string name="revanced_hide_self_sponsor_ads_summary_off">Özünə sponsorluq edilən kartlar göstərilir</string>
<string name="revanced_hide_shopping_links_title">Alış-veriş linklərini gizlət</string>
<string name="revanced_hide_shopping_links_summary_on">Alış-veriş linkləri video təsvirdə gizlidir</string>
<string name="revanced_hide_shopping_links_summary_off">Alış-veriş linkləri video təsvirdə görünür</string>
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_view_products_banner_title">“Məhsullara baxın” panelin gizlət</string>
<string name="revanced_hide_view_products_banner_summary_on">Məhsullara baxış etiketi video örtüyündə gizlidir</string>
<string name="revanced_hide_view_products_banner_summary_off">Məhsullara baxış etiketi video örtüyündə görünür</string>
<string name="revanced_hide_web_search_results_title">Veb axtarış nəticələrini gizlət</string>
<string name="revanced_hide_web_search_results_summary_on">Veb axtarış nəticələri gizlədilir</string>
<string name="revanced_hide_web_search_results_summary_off">Veb axtarış nəticələri göstərilir</string>
@@ -707,7 +736,13 @@ Audio trek seçimin göstərmək üçün \"Video axınları saxtalaşdır\"ı iO
<string name="revanced_shorts_player_screen_title">Shorts oynadıcı</string>
<string name="revanced_shorts_player_screen_summary">Shorts oynadıcıda hissəcikləri gizlət və ya göstər</string>
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_hide_shorts_home_title">Shorts-u Ev axınında gizlət</string>
<string name="revanced_hide_shorts_home_summary_on">Ev axını və əlaqəli videolarda gizlidir</string>
<string name="revanced_hide_shorts_home_summary_off">Ev axını və əlaqəli videolarda görünür</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_hide_shorts_subscriptions_title">Shorts-u Abunəliklər axınında gizlət</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Abunəliklər axınında gizlidir</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">Abunəliklər axınında görünür</string>
<string name="revanced_hide_shorts_search_title">Axtarış nəticələrindəki \"Shorts\"u gizlət</string>
<string name="revanced_hide_shorts_search_summary_on">Axtarış nəticələrində gizlidir</string>
<string name="revanced_hide_shorts_search_summary_off">Axtarış nəticələrində görünür</string>
@@ -715,6 +750,8 @@ Audio trek seçimin göstərmək üçün \"Video axınları saxtalaşdır\"ı iO
<string name="revanced_hide_shorts_history_summary_on">Baxış tarixçəsində gizlidir</string>
<string name="revanced_hide_shorts_history_summary_off">Baxış tarixçəsində göstərilib</string>
<string name="revanced_hide_shorts_super_thanks_button_title">Super Təşəkkür Al düyməsini gizlət</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Super Təşəkkürlər Al düyməsi gizlidir</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Super Təşəkkürlər Al düyməsi görünür</string>
<string name="revanced_hide_shorts_effect_button_title">Effekt düyməsini gizlət</string>
<string name="revanced_hide_shorts_effect_button_summary_on">Effekt düyməsi gizlidir</string>
<string name="revanced_hide_shorts_effect_button_summary_off">Effekt düyməsi görünür</string>
@@ -797,7 +834,11 @@ Audio trek seçimin göstərmək üçün \"Video axınları saxtalaşdır\"ı iO
<string name="revanced_hide_shorts_channel_bar_summary_on">Kanal çubuğu gizlidir</string>
<string name="revanced_hide_shorts_channel_bar_summary_off">Kanal çubuğu göstərilir</string>
<string name="revanced_hide_shorts_video_title_title">Video başlığını gizlət</string>
<string name="revanced_hide_shorts_video_title_summary_on">Video başlığı gizlidir</string>
<string name="revanced_hide_shorts_video_title_summary_off">Video başlığı görünür</string>
<string name="revanced_hide_shorts_sound_metadata_label_title">Səs üst məlumat etiketini gizlət</string>
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Səs üst məlumat etiketi gizlədilib</string>
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Səs üst məlumat etiketi görünür</string>
<string name="revanced_hide_shorts_full_video_link_label_title">Video keçidi etiketini gizlət</string>
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Video linki etiketi gizlidir</string>
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Video link etiketi göstərilir</string>
@@ -813,6 +854,9 @@ Avtomatik oynatma YouTube ayarlarında dəyişdirilə bilər: Ayarlar → Oxunu
<string name="revanced_end_screen_suggested_video_summary_off">Son ekranda bildirilən video göstərilir</string>
</patch>
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
<string name="revanced_hide_related_videos_overlay_title">Əlaqəli videolar örtüyünü gizlət</string>
<string name="revanced_hide_related_videos_overlay_summary_on">Əlaqəli videolar yerləşməsi tam ekranda gizlidir</string>
<string name="revanced_hide_related_videos_overlay_summary_off">Əlaqəli videolar yerləşməsi tam ekranda görünür</string>
</patch>
<patch id="layout.hide.time.hideTimestampPatch">
<string name="revanced_hide_timestamp_title">Video vaxt möhürünü gizlət</string>
@@ -1279,8 +1323,10 @@ Bunu aktivləşdirmə, bəzi regionlarda əngəllənib silinən şəkilləri dü
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_alt_thumbnail_home_title">Ev paneli</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_alt_thumbnail_subscription_title">Abunəliklər bölməsi</string>
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (Library) tab. -->
<string name="revanced_alt_thumbnail_library_title">\"Siz\" paneli</string>
<string name="revanced_alt_thumbnail_player_title">Oynadıcı pleylistləri &amp; tövsiyələri</string>
<string name="revanced_alt_thumbnail_search_title">Axtarış nəticələri</string>
<string name="revanced_alt_thumbnail_options_entry_1">Orijinal miniatürlər</string>
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow &amp; Orijinal miniatürlər</string>
@@ -1496,6 +1542,7 @@ AVC maksimum 1080p görüntü imkanına malikdir, Opus audio kodlama olmur və v
<string name="revanced_block_video_ads_summary_off">Video reklamlar bloklanmır</string>
</patch>
<patch id="chat.antidelete.showDeletedMessagesPatch">
<string name="revanced_deleted_msg">Məlumat silindi</string>
<string name="revanced_show_deleted_messages_title">Silinən mesajları göstər</string>
<string name="revanced_show_deleted_messages_entry_1">Silinən mesajlar göstərilməsin</string>
<string name="revanced_show_deleted_messages_entry_2">Silinmiş mesajları boz panel arxasında gizlət</string>
@@ -1516,8 +1563,11 @@ AVC maksimum 1080p görüntü imkanına malikdir, Opus audio kodlama olmur və v
<string name="revanced_settings">ReVanced Tənzimləmələri</string>
<string name="revanced_about_title">Haqqında</string>
<string name="revanced_about_summary">ReVanced Haqqında</string>
<string name="revanced_ads_screen_title">Reklam Əngəlləmə</string>
<string name="revanced_ads_screen_summary">Reklam Əngəlləmə tənzimləmələri</string>
<string name="revanced_chat_screen_title">Söhbət</string>
<string name="revanced_chat_screen_summary">Söhbət tənzimləmələri</string>
<string name="revanced_misc_screen_title">Çoxvariantlı</string>
<string name="revanced_misc_screen_summary">Müxtəlif tənzimləmələr</string>
<string name="revanced_general_category_title">Ümumi tənzimləmələr</string>
<string name="revanced_other_category_title">Digər tənzimləmələr</string>

View File

@@ -171,7 +171,13 @@ Second \"item\" text"</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Плаващ бутон за микрофон при търсене е скрит</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Плаващият бутон за микрофон в търсенето е показан</string>
<string name="revanced_hide_horizontal_shelves_title">Хоризонтални секции</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Хоризонтални рафтове са скрити, като:\n• Извънредни новини\n• Продължи гледането\n• Разгледайте още канали\n• Най-подходящи\n• Пазаруване\n• Гледайте отново"</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Хоризонтални рафтове са скрити, като:
• Извънредни новини
• Продължи гледането
• Разгледайте още канали
• Най-подходящи
• Пазаруване
• Гледайте отново"</string>
<string name="revanced_hide_horizontal_shelves_summary_off">Хоризонталните рафтове са показани</string>
<string name="revanced_hide_image_shelf_title">Скриване на рафта с изображения</string>
<string name="revanced_hide_image_shelf_summary_on">Рафтът с изображения в резултатите от търсенето е скрит</string>

View File

@@ -171,7 +171,13 @@ Nebudete informováni o žádné neočekávané události."</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Plovoucí tlačítko mikrofonu ve vyhledávání je skryto</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Plovoucí tlačítko mikrofonu ve vyhledávání je zobrazeno</string>
<string name="revanced_hide_horizontal_shelves_title">Skrýt horizontální police</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Horizontální poličky jsou skryty, například:• Nejnovější zprávy• Pokračovat ve sledování• Prozkoumat další kanály• Nejdůležitější• Nakupování• Sledovat znovu"</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Vodorovné police jsou skryté, například:
• Nejnovější zprávy
• Pokračovat ve sledování
• Prozkoumat další kanály
• Nejdůležitější
• Nakupování
• Znovu zhlédnout"</string>
<string name="revanced_hide_horizontal_shelves_summary_off">Horizontální police jsou zobrazeny</string>
<string name="revanced_hide_image_shelf_title">Skrýt obrázkovou poličku</string>
<string name="revanced_hide_image_shelf_summary_on">Obrázková polička ve výsledcích vyhledávání je skryta</string>

View File

@@ -46,8 +46,8 @@ Second \"item\" text"</string>
<string name="revanced_settings_import_success">Έγινε εισαγωγή %d ρυθμίσεων</string>
<string name="revanced_settings_import_failure_parse">Η εισαγωγή απέτυχε: %s</string>
<string name="revanced_settings_search_hint">Αναζήτηση ρυθμίσεων</string>
<string name="revanced_settings_search_no_results_title">Δεν βρέθηκαν αποτελέσματα για το \'%s\'</string>
<string name="revanced_settings_search_no_results_summary">Δοκιμάστε μια άλλη λέξη-κλειδί</string>
<string name="revanced_settings_search_no_results_title">Δεν βρέθηκαν αποτελέσματα για \'%s\'</string>
<string name="revanced_settings_search_no_results_summary">Δοκιμάστε άλλη λέξη-κλειδί</string>
<string name="revanced_settings_search_remove_message">Κατάργηση από το ιστορικό αναζήτησης;</string>
<string name="revanced_show_menu_icons_title">Εμφάνιση εικονιδίων στις ρυθμίσεις ReVanced</string>
<string name="revanced_show_menu_icons_summary_on">Τα εικονίδια ρυθμίσεων εμφανίζονται</string>
@@ -167,18 +167,20 @@ Second \"item\" text"</string>
<string name="revanced_hide_feed_survey_title">Έρευνες στη ροή</string>
<string name="revanced_hide_feed_survey_summary_on">Κρυμμένες</string>
<string name="revanced_hide_feed_survey_summary_off">Εμφανίζονται</string>
<string name="revanced_hide_floating_microphone_button_title">Αιωρούμενο κουμπί μικροφώνου</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Το αιωρούμενο κουμπί μικροφώνου στην αναζήτηση είναι κρυμμένο</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Το αιωρούμενο κουμπί μικροφώνου στην αναζήτηση εμφανίζεται</string>
<string name="revanced_hide_floating_microphone_button_title">Αιωρούμενο κουμπί μικροφώνου στην αναζήτηση</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Κρυμμένο</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Εμφανίζεται</string>
<string name="revanced_hide_horizontal_shelves_title">Οριζόντιες ενότητες προτάσεων</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Οριζόντιες ενότητες προτάσεων είναι κρυμμένες, όπως:
<string name="revanced_hide_horizontal_shelves_summary_on">"Κρυμμένες
Αφορά τις οριζόντιες ενότητες προτάσεων, όπως:
• Έκτακτη είδηση
• Συνέχεια παρακολούθησης
• Εξερευνήστε περισσότερα κανάλια
• Πιο σχετικά
• Shopping
• Παρακολουθήστε ξανά"</string>
<string name="revanced_hide_horizontal_shelves_summary_off">Οι οριζόντιες ράφια εμφανίζονται</string>
<string name="revanced_hide_horizontal_shelves_summary_off">Εμφανίζονται</string>
<string name="revanced_hide_image_shelf_title">Ενότητα εικόνων στα αποτελέσματα αναζήτησης</string>
<string name="revanced_hide_image_shelf_summary_on">Κρυμμένη</string>
<string name="revanced_hide_image_shelf_summary_off">Εμφανίζεται</string>
@@ -194,27 +196,27 @@ Second \"item\" text"</string>
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
This item appear in the subscription feed for future livestreams or unreleased videos. -->
<string name="revanced_hide_notify_me_button_title">Κουμπί «Να λαμβάνω ειδοποιήσεις»</string>
<string name="revanced_hide_notify_me_button_summary_on">Το κουμπί «Ειδοποίησέ με» είναι κρυμμένο</string>
<string name="revanced_hide_notify_me_button_summary_off">Το κουμπί «Ειδοποίησέ με» εμφανίζεται</string>
<string name="revanced_hide_notify_me_button_summary_on">Κρυμμένο</string>
<string name="revanced_hide_notify_me_button_summary_off">Εμφανίζεται</string>
<string name="revanced_hide_playables_title">Παιχνίδια YouTube</string>
<string name="revanced_hide_playables_summary_on">Κρυμμένα</string>
<string name="revanced_hide_playables_summary_off">Εμφανίζονται</string>
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
This button usually appears when searching for a YT creator. -->
<string name="revanced_hide_show_more_button_title">Κουμπί «Εμφάνιση περισσότερων»</string>
<string name="revanced_hide_show_more_button_summary_on">Το κουμπί «Εμφάνιση περισσότερων» στα αποτελέσματα αναζήτησης είναι κρυμμένο</string>
<string name="revanced_hide_show_more_button_summary_off">Το κουμπί «Εμφάνιση περισσότερων» στα αποτελέσματα αναζήτησης εμφανίζεται</string>
<string name="revanced_hide_show_more_button_summary_on">Κρυμμένο\n\nΑφορά το κουμπί «Εμφάνιση περισσότερων» στα αποτελέσματα αναζήτησης</string>
<string name="revanced_hide_show_more_button_summary_off">Εμφανίζεται\n\nΑφορά το κουμπί «Εμφάνιση περισσότερων» στα αποτελέσματα αναζήτησης</string>
<string name="revanced_hide_ticket_shelf_title">Ενότητα εισιτηρίων</string>
<string name="revanced_hide_ticket_shelf_summary_on">Κρυμμένη</string>
<string name="revanced_hide_ticket_shelf_summary_off">Εμφανίζεται</string>
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
<string name="revanced_hide_video_recommendation_labels_title">Ετικέτες προτάσεων βίντεο</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">Οι ετικέτες «Άλλοι χρήστες παρακολούθησαν επίσης» και «Ενδέχεται επίσης να σας αρέσει» στα αποτελέσματα αναζήτησης είναι κρυμμένες</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">Οι ετικέτες «Άλλοι χρήστες παρακολούθησαν επίσης» και «Ενδέχεται επίσης να σας αρέσει» στα αποτελέσματα αναζήτησης εμφανίζονται</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">Κρυμμένες\n\nΑφορά τις ετικέτες «Άλλοι χρήστες παρακολούθησαν επίσης» και «Ενδέχεται επίσης να σας αρέσει» στα αποτελέσματα αναζήτησης</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">Εμφανίζονται\n\nΑφορά τις ετικέτες «Άλλοι χρήστες παρακολούθησαν επίσης» και «Ενδέχεται επίσης να σας αρέσει» στα αποτελέσματα αναζήτησης</string>
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
<string name="revanced_hide_doodles_title">YouTube Doodles</string>
<string name="revanced_hide_doodles_summary_on">Η κινούμενη εικόνα YouTube Doodles στο λογότυπο είναι κρυμμένη</string>
<string name="revanced_hide_doodles_summary_off">Η κινούμενη εικόνα YouTube Doodles στο λογότυπο εμφανίζεται</string>
<string name="revanced_hide_doodles_summary_on">Κρυμμένα\n\nΑφορά τις κινούμενες εικόνες YouTube Doodles στο λογότυπο</string>
<string name="revanced_hide_doodles_summary_off">Εμφανίζεται\n\nΑφορά τις κινούμενες εικόνες YouTube Doodles στο λογότυπο</string>
<string name="revanced_hide_doodles_user_dialog_message">"Τα YouTube Doodles εμφανίζονται για μερικές μέρες κάθε χρόνο.
Αν ένα YouTube Doodle εμφανίζεται αυτή τη στιγμή στην περιοχή σας και αυτή η ρύθμιση είναι ενεργοποιημένη, τότε η γραμμή φίλτρων κάτω από τη γραμμή αναζήτησης θα είναι κρυμμένη επίσης."</string>
@@ -392,11 +394,11 @@ Second \"item\" text"</string>
</patch>
<patch id="ad.general.hideAdsResourcePatch">
<string name="revanced_hide_creator_store_shelf_title">Ενότητα καταστήματος δημιουργού</string>
<string name="revanced_hide_creator_store_shelf_summary_on">Η ενότητα καταστήματος δημιουργού κάτω από την οθόνη αναπαραγωγής είναι κρυμμένη</string>
<string name="revanced_hide_creator_store_shelf_summary_on">Κρυμμένη\n\nΑφορά την ενότητα καταστήματος δημιουργού κάτω από την οθόνη αναπαραγωγής</string>
<string name="revanced_hide_creator_store_shelf_summary_off">Εμφανίζεται\n\nΑφορά την ενότητα καταστήματος δημιουργού κάτω από την οθόνη αναπαραγωγής</string>
<string name="revanced_hide_end_screen_store_banner_title">Ετικέτα καταστήματος στην τελική οθόνη</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">Το banner καταστήματος της τελικής οθόνης είναι κρυμμένο</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">Το banner καταστήματος της τελικής οθόνης εμφανίζεται</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">Κρυμμένη</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">Εμφανίζεται</string>
<string name="revanced_hide_fullscreen_ads_title">Διαφημίσεις πλήρους οθόνης</string>
<string name="revanced_hide_fullscreen_ads_summary_on">"Κρυμμένες
@@ -420,9 +422,9 @@ Second \"item\" text"</string>
<string name="revanced_hide_shopping_links_summary_on">Κρυμμένοι</string>
<string name="revanced_hide_shopping_links_summary_off">Εμφανίζονται</string>
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_view_products_banner_title">Ετικέτα «Προβολή προϊόντων»</string>
<string name="revanced_hide_view_products_banner_summary_on">Το banner «Προβολή προϊόντων» στην επικάλυψη βίντεο είναι κρυμμένο</string>
<string name="revanced_hide_view_products_banner_summary_off">Το banner «Προβολή προϊόντων» στην επικάλυψη βίντεο εμφανίζεται</string>
<string name="revanced_hide_view_products_banner_title">Ετικέτα «Προβολή προϊόντων» στην οθόνη αναπαραγωγής</string>
<string name="revanced_hide_view_products_banner_summary_on">Κρυμμένη</string>
<string name="revanced_hide_view_products_banner_summary_off">Εμφανίζεται</string>
<string name="revanced_hide_web_search_results_title">Αποτελέσματα αναζήτησης στο διαδίκτυο</string>
<string name="revanced_hide_web_search_results_summary_on">Κρυμμένα</string>
<string name="revanced_hide_web_search_results_summary_off">Εμφανίζονται</string>
@@ -488,43 +490,43 @@ Second \"item\" text"</string>
Προσαρμόστε την ένταση ήχου σαρώνοντας κάθετα στη δεξιά πλευρά της οθόνης"</string>
<string name="revanced_swipe_volume_summary_off">Η χειρονομία σάρωσης για αλλαγή έντασης ήχου στην πλήρη οθόνη είναι απενεργοποιημένη</string>
<string name="revanced_swipe_press_to_engage_title">Πάτημα για σάρωση</string>
<string name="revanced_swipe_press_to_engage_summary_on">Η χειρονομία πατήματος για σάρωση είναι ενεργοποιημένη</string>
<string name="revanced_swipe_press_to_engage_summary_off">Η χειρονομία πατήματος για σάρωση είναι απενεργοποιημένη</string>
<string name="revanced_swipe_press_to_engage_title">Παρατεταμένο πάτημα για σάρωση</string>
<string name="revanced_swipe_press_to_engage_summary_on">Η χειρονομία παρατεταμένου πατήματος για σάρωση είναι ενεργοποιημένη</string>
<string name="revanced_swipe_press_to_engage_summary_off">Η χειρονομία παρατεταμένου πατήματος για σάρωση είναι απενεργοποιημένη</string>
<string name="revanced_swipe_haptic_feedback_title">Απόκριση δόνησης</string>
<string name="revanced_swipe_haptic_feedback_summary_on">Η απόκριση δόνησης είναι ενεργοποιημένη</string>
<string name="revanced_swipe_haptic_feedback_summary_off">Η απόκριση δόνησης είναι απενεργοποιημένη</string>
<string name="revanced_swipe_save_and_restore_brightness_title">Αποθήκευση και επαναφορά φωτεινότητας</string>
<string name="revanced_swipe_save_and_restore_brightness_summary_on">Αποθήκευση και επαναφορά φωτεινότητας κατά την έξοδο ή την είσοδο σε πλήρη οθόνη</string>
<string name="revanced_swipe_save_and_restore_brightness_summary_off">Να μην αποθηκεύεται και να επαναφέρεται η φωτεινότητα κατά την έξοδο ή την είσοδο σε πλήρη οθόνη</string>
<string name="revanced_swipe_lowest_value_enable_auto_brightness_title">Ενεργοποίηση χειρονομίας αυτόματης φωτεινότητας</string>
<string name="revanced_swipe_save_and_restore_brightness_summary_on">Η φωτεινότητα αποθηκεύεται και επαναφέρεται κατά την έξοδο ή την είσοδο σε πλήρη οθόνη</string>
<string name="revanced_swipe_save_and_restore_brightness_summary_off">Η φωτεινότητα δεν αποθηκεύεται ούτε επαναφέρεται κατά την έξοδο ή την είσοδο σε πλήρη οθόνη</string>
<string name="revanced_swipe_lowest_value_enable_auto_brightness_title">Αυτόματη φωτεινότητα με σάρωση</string>
<string name="revanced_swipe_lowest_value_enable_auto_brightness_summary_on">Η σάρωση προς τα κάτω στη χαμηλότερη τιμή της χειρονομίας φωτεινότητας ενεργοποιεί την αυτόματη φωτεινότητα</string>
<string name="revanced_swipe_lowest_value_enable_auto_brightness_summary_off">Η σάρωση προς τα κάτω στη χαμηλότερη τιμή δεν ενεργοποιεί την αυτόματη φωτεινότητα</string>
<string name="revanced_swipe_lowest_value_enable_auto_brightness_summary_off">Η σάρωση προς τα κάτω στη χαμηλότερη τιμή της χειρονομίας φωτεινότητας δεν ενεργοποιεί την αυτόματη φωτεινότητα</string>
<string name="revanced_swipe_lowest_value_enable_auto_brightness_overlay_text">Αυτόματη</string>
<string name="revanced_swipe_overlay_timeout_title">Χρονικό όριο εμφάνισης πλαισίου σάρωσης</string>
<string name="revanced_swipe_overlay_timeout_summary">Το χρονικό διάστημα χιλιοστών του δευτερολέπτου που είναι ορατό το πλαίσιο σάρωσης</string>
<string name="revanced_swipe_overlay_background_opacity_title">Αδιαφάνεια φόντου σάρωσης</string>
<string name="revanced_swipe_overlay_background_opacity_summary">Τιμή αδιαφάνειας μεταξύ 0-100</string>
<string name="revanced_swipe_overlay_background_opacity_invalid_toast">Η αδιαφάνεια σάρωσης πρέπει να είναι μεταξύ 0-100</string>
<string name="revanced_swipe_overlay_progress_brightness_color_title">Χρώμα φωτεινότητας σάρωσης</string>
<string name="revanced_swipe_overlay_progress_brightness_color_summary">Το χρώμα της γραμμής προόδου για τα στοιχεία ελέγχου φωτεινότητας</string>
<string name="revanced_swipe_overlay_progress_volume_color_title">Χρώμα έντασης ήχου σάρωσης</string>
<string name="revanced_swipe_overlay_progress_volume_color_summary">Το χρώμα της γραμμής προόδου για τα στοιχεία ελέγχου έντασης ήχου</string>
<string name="revanced_swipe_text_overlay_size_title">Μέγεθος κειμένου σάρωσης</string>
<string name="revanced_swipe_text_overlay_size_summary">Το μέγεθος κειμένου για τα στοιχεία ελέγχου σάρωσης μεταξύ 1-30</string>
<string name="revanced_swipe_overlay_progress_brightness_color_title">Χρώμα γραμμής σάρωσης για φωτεινότητα</string>
<string name="revanced_swipe_overlay_progress_brightness_color_summary">Το χρώμα της γραμμής προόδου για τον έλεγχο της φωτεινότητας</string>
<string name="revanced_swipe_overlay_progress_volume_color_title">Χρώμα γραμμής σάρωσης για ένταση ήχου</string>
<string name="revanced_swipe_overlay_progress_volume_color_summary">Το χρώμα της γραμμής προόδου για τον έλεγχο της έντασης ήχου</string>
<string name="revanced_swipe_text_overlay_size_title">Μέγεθος κειμένου φόντου σάρωσης</string>
<string name="revanced_swipe_text_overlay_size_summary">Το μέγεθος κειμένου στο φόντο της σάρωσης μεταξύ 1-30</string>
<string name="revanced_swipe_text_overlay_size_invalid_toast">Το μέγεθος κειμένου πρέπει να είναι μεταξύ 1-30</string>
<string name="revanced_swipe_threshold_title">Κατώτατο όριο μεγέθους σάρωσης</string>
<string name="revanced_swipe_threshold_summary">Η ελάχιστη απόσταση που θα διανύσετε με το δάκτυλο σας για να είναι αναγνωρίσιμη η χειρονομία σάρωσης</string>
<string name="revanced_swipe_threshold_summary">Η ελάχιστη απόσταση που πρέπει να διανυστεί με το δάκτυλο για να είναι αναγνωρίσιμη η χειρονομία σάρωσης</string>
<string name="revanced_swipe_volume_sensitivity_title">Ευαισθησία σάρωσης έντασης ήχου</string>
<string name="revanced_swipe_volume_sensitivity_summary">Πόσο αλλάζει η ένταση ήχου ανά σάρωση</string>
<string name="revanced_swipe_overlay_style_title">Στυλ διάταξης σάρωσης</string>
<string name="revanced_swipe_overlay_style_entry_1">Οριζόντια διάταξη</string>
<string name="revanced_swipe_overlay_style_entry_2">Οριζόντια διάταξη (ελάχιστη - κορυφή)</string>
<string name="revanced_swipe_overlay_style_entry_3">Οριζόντια διάταξη (ελάχιστη - κέντρο)</string>
<string name="revanced_swipe_overlay_style_entry_2">Οριζόντια διάταξη (μινιμαλιστική - κορυφή)</string>
<string name="revanced_swipe_overlay_style_entry_3">Οριζόντια διάταξη (μινιμαλιστική - κέντρο)</string>
<string name="revanced_swipe_overlay_style_entry_4">Κυκλική διάταξη</string>
<string name="revanced_swipe_overlay_style_entry_5">Κυκλική διάταξη (ελάχιστη)</string>
<string name="revanced_swipe_overlay_style_entry_5">Κυκλική διάταξη (μινιμαλιστική)</string>
<string name="revanced_swipe_overlay_style_entry_6">Κάθετη διάταξη</string>
<string name="revanced_swipe_overlay_style_entry_7">Κάθετη διάταξη (ελάχιστη)</string>
<string name="revanced_swipe_overlay_style_entry_7">Κάθετη διάταξη (μινιμαλιστική)</string>
<string name="revanced_swipe_change_video_title">Χειρονομία εναλλαγής βίντεο στην πλήρη οθόνη</string>
<string name="revanced_swipe_change_video_summary_on">Σάρωση αριστερά/δεξιά κατά τη λειτουργία πλήρους οθόνης για αλλαγή σε επόμενο/προηγούμενο βίντεο</string>
<string name="revanced_swipe_change_video_summary_off">Η χειρονομία αλλαγής βίντεο κατά τη λειτουργία πλήρους οθόνης είναι ανενεργή</string>
@@ -736,13 +738,13 @@ Second \"item\" text"</string>
<string name="revanced_shorts_player_screen_title">Οθόνη αναπαραγωγής Shorts</string>
<string name="revanced_shorts_player_screen_summary">Απόκρυψη ή εμφάνιση στοιχείων στην οθόνη αναπαραγωγής Shorts</string>
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_hide_shorts_home_title">Απόκρυψη των Shorts στην αρχική ροή</string>
<string name="revanced_hide_shorts_home_summary_on">Κρυμμένα στην αρχική ροή και στα σχετικά βίντεο</string>
<string name="revanced_hide_shorts_home_summary_off">Εμφανίζονται στην αρχική ροή και στα σχετικά βίντεο</string>
<string name="revanced_hide_shorts_home_title">Shorts στην αρχική σελίδα και στα σχετικά βίντεο</string>
<string name="revanced_hide_shorts_home_summary_on">Κρυμμένα</string>
<string name="revanced_hide_shorts_home_summary_off">Εμφανίζονται</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_hide_shorts_subscriptions_title">Απόκρυψη των Shorts στη ροή εγγραφών</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Κρυμμένα στη ροή εγγραφών</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">Εμφανίζονται στη ροή εγγραφών</string>
<string name="revanced_hide_shorts_subscriptions_title">Shorts στην καρτέλα «Εγγραφές»</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Κρυμμένα</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">Εμφανίζονται</string>
<string name="revanced_hide_shorts_search_title">Shorts στα αποτελέσματα αναζήτησης</string>
<string name="revanced_hide_shorts_search_summary_on">Κρυμμένα</string>
<string name="revanced_hide_shorts_search_summary_off">Εμφανίζονται</string>
@@ -750,8 +752,8 @@ Second \"item\" text"</string>
<string name="revanced_hide_shorts_history_summary_on">Κρυμμένα</string>
<string name="revanced_hide_shorts_history_summary_off">Εμφανίζονται</string>
<string name="revanced_hide_shorts_super_thanks_button_title">Κουμπί «Αγορά Super Thanks»</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Το κουμπί αγοράς Super Thanks είναι κρυμμένο</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Το κουμπί αγοράς Super Thanks εμφανίζεται</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Κρυμμένο</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Εμφανίζεται</string>
<string name="revanced_hide_shorts_effect_button_title">Κουμπί «Εφέ»</string>
<string name="revanced_hide_shorts_effect_button_summary_on">Κρυμμένο</string>
<string name="revanced_hide_shorts_effect_button_summary_off">Εμφανίζεται</string>
@@ -833,12 +835,12 @@ Second \"item\" text"</string>
<string name="revanced_hide_shorts_channel_bar_title">Γραμμή καναλιού</string>
<string name="revanced_hide_shorts_channel_bar_summary_on">Κρυμμένη</string>
<string name="revanced_hide_shorts_channel_bar_summary_off">Εμφανίζεται</string>
<string name="revanced_hide_shorts_video_title_title">Τίτλοι βίντεο</string>
<string name="revanced_hide_shorts_video_title_summary_on">Ο τίτλος του βίντεο είναι κρυμμένος</string>
<string name="revanced_hide_shorts_video_title_summary_off">Ο τίτλος του βίντεο εμφανίζεται</string>
<string name="revanced_hide_shorts_video_title_title">Τίτλος του βίντεο</string>
<string name="revanced_hide_shorts_video_title_summary_on">Κρυμμένος</string>
<string name="revanced_hide_shorts_video_title_summary_off">Εμφανίζεται</string>
<string name="revanced_hide_shorts_sound_metadata_label_title">Ετικέτες μεταδεδομένων ήχου</string>
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Η ετικέτα μεταδεδομένων ήχου είναι κρυμμένη</string>
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Η ετικέτα μεταδεδομένων ήχου εμφανίζεται</string>
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Κρυμμένη</string>
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Εμφανίζεται</string>
<string name="revanced_hide_shorts_full_video_link_label_title">Ετικέτα συνδέσμου βίντεο</string>
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Κρυμμένες</string>
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Εμφανίζονται</string>
@@ -855,9 +857,9 @@ Second \"item\" text"</string>
<string name="revanced_end_screen_suggested_video_summary_off">Εμφανίζεται</string>
</patch>
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
<string name="revanced_hide_related_videos_overlay_title">Απόκρυψη επικάλυψης σχετικών βίντεο</string>
<string name="revanced_hide_related_videos_overlay_summary_on">Η επικάλυψη σχετικών βίντεο σε πλήρη οθόνη είναι κρυμμένη</string>
<string name="revanced_hide_related_videos_overlay_summary_off">Η επικάλυψη σχετικών βίντεο σε πλήρη οθόνη εμφανίζεται</string>
<string name="revanced_hide_related_videos_overlay_title">Προεπισκόπηση σχετικών βίντεο στην πλήρη οθόνη</string>
<string name="revanced_hide_related_videos_overlay_summary_on">Κρυμμένη</string>
<string name="revanced_hide_related_videos_overlay_summary_off">Εμφανίζεται</string>
</patch>
<patch id="layout.hide.time.hideTimestampPatch">
<string name="revanced_hide_timestamp_title">Χρονική πρόοδος βίντεο</string>
@@ -1247,7 +1249,7 @@ Second \"item\" text"</string>
<string name="revanced_miniplayer_type_title">Τύπος ελαχιστοποιημένης οθόνης αναπαραγωγής</string>
<string name="revanced_miniplayer_type_entry_0">Απενεργοποιημένη</string>
<string name="revanced_miniplayer_type_entry_1">Προεπιλογή</string>
<string name="revanced_miniplayer_type_entry_2">Ελάχιστη</string>
<string name="revanced_miniplayer_type_entry_2">Μινιμαλιστική</string>
<string name="revanced_miniplayer_type_entry_3">Ταμπλετ</string>
<string name="revanced_miniplayer_type_entry_4">Μοντέρνος 1</string>
<string name="revanced_miniplayer_type_entry_5">Μοντέρνος 2</string>
@@ -1323,10 +1325,10 @@ Second \"item\" text"</string>
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_alt_thumbnail_home_title">Αρχική σελίδα</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_alt_thumbnail_subscription_title">Καρτέλα εγγραφών</string>
<string name="revanced_alt_thumbnail_subscription_title">Καρτέλα «Εγγραφές»</string>
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (Library) tab. -->
<string name="revanced_alt_thumbnail_library_title">Καρτέλα «Εσείς»</string>
<string name="revanced_alt_thumbnail_player_title">Λίστες αναπαραγωγής &amp; προτάσεις προγράμματος αναπαραγωγής</string>
<string name="revanced_alt_thumbnail_player_title">Λίστες αναπαραγωγής &amp; προτάσεις</string>
<string name="revanced_alt_thumbnail_search_title">Αποτελέσματα αναζήτησης</string>
<string name="revanced_alt_thumbnail_options_entry_1">Αρχικές μικρογραφίες</string>
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow &amp; Αρχικές μικρογραφίες</string>

View File

@@ -161,11 +161,19 @@ Et saa ilmoituksia odottamattomista tapahtumista."</string>
<string name="revanced_hide_crowdfunding_box_title">Piilota joukkorahoituslaatikko</string>
<string name="revanced_hide_crowdfunding_box_summary_on">Joukkorahoituslaatikko on piilotettu</string>
<string name="revanced_hide_crowdfunding_box_summary_off">Joukkorahoituslaatikko näytetään</string>
<string name="revanced_hide_expandable_card_title">Piilota laajennettava kortti</string>
<string name="revanced_hide_expandable_card_summary_on">Laajennettava kortti on piilotettu videoiden alla</string>
<string name="revanced_hide_expandable_card_summary_off">Laajennettava kortti näytetään videoiden alla</string>
<string name="revanced_hide_feed_survey_title">Piilota syötteen kyselyt</string>
<string name="revanced_hide_feed_survey_summary_on">Syötteen kyselyt on piilotettu</string>
<string name="revanced_hide_feed_survey_summary_off">Syötteen kyselyt näytetään</string>
<string name="revanced_hide_floating_microphone_button_title">Piilota kelluva mikrofonipainike</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Kelluva mikrofonipainike on piilotettu haussa</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Kelluva mikrofonipainike näytetään haussa</string>
<string name="revanced_hide_horizontal_shelves_title">Piilota vaakasuuntaiset hyllyt</string>
<string name="revanced_hide_image_shelf_title">Piilota kuvahylly</string>
<string name="revanced_hide_image_shelf_summary_on">Kuvahylly on piilotettu hakutuloksissa</string>
<string name="revanced_hide_image_shelf_summary_off">Kuvahylly näytetään hakutuloksissa</string>
<string name="revanced_hide_latest_posts_title">Piilota uusimmat postaukset</string>
<string name="revanced_hide_latest_posts_summary_on">Uusimmat postaukset on piilotettu</string>
<string name="revanced_hide_latest_posts_summary_off">Uusimmat postaukset näytetään</string>
@@ -178,12 +186,16 @@ Et saa ilmoituksia odottamattomista tapahtumista."</string>
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
This item appear in the subscription feed for future livestreams or unreleased videos. -->
<string name="revanced_hide_notify_me_button_title">Piilota \"Ilmoita minulle\" -painike</string>
<string name="revanced_hide_notify_me_button_summary_on">Ilmoita minulle -painike on piilotettu</string>
<string name="revanced_hide_notify_me_button_summary_off">Ilmoita minulle -painike näytetään</string>
<string name="revanced_hide_playables_title">Piilota Pelattavat</string>
<string name="revanced_hide_playables_summary_on">Pelattavat on piilotettu</string>
<string name="revanced_hide_playables_summary_off">Pelattavat näytetään</string>
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
This button usually appears when searching for a YT creator. -->
<string name="revanced_hide_show_more_button_title">Piilota \"Näytä lisää\" -painike</string>
<string name="revanced_hide_show_more_button_summary_on">Näytä lisää -painike on piilotettu hakutuloksissa</string>
<string name="revanced_hide_show_more_button_summary_off">Näytä lisää -painike näytetään hakutuloksissa</string>
<string name="revanced_hide_ticket_shelf_title">Piilota lippuhylly</string>
<string name="revanced_hide_ticket_shelf_summary_on">Lippuhylly on piilotettu</string>
<string name="revanced_hide_ticket_shelf_summary_off">Lippuhylly näytetään</string>
@@ -208,9 +220,13 @@ Jos Doodle näkyy tällä hetkellä alueellasi ja tämä piilotusasetus on käyt
<!-- 'Join' should be translated using the same localized wording YouTube displays.
This appears in the video player for certain videos. -->
<string name="revanced_hide_join_membership_button_title">Piilota Liity-painike</string>
<string name="revanced_hide_join_membership_button_summary_on">Liity-painike on piilotettu</string>
<string name="revanced_hide_join_membership_button_summary_off">Liity-painike näytetään</string>
<string name="revanced_hide_medical_panels_title">Piilota lääketieteelliset paneelit</string>
<string name="revanced_hide_medical_panels_summary_on">Lääketieteelliset paneelit on piilotettu</string>
<string name="revanced_hide_medical_panels_summary_off">Lääketieteelliset paneelit näytetään</string>
<string name="revanced_hide_quick_actions_title">Piilota pikatoiminnot</string>
<string name="revanced_hide_related_videos_title">Piilota liittyvät videot</string>
<string name="revanced_hide_subscribers_community_guidelines_title">Piilota tilaajien ohjeet</string>
<string name="revanced_hide_subscribers_community_guidelines_summary_on">Tilaajien yhteisön säännöt on piilotettu</string>
<string name="revanced_hide_subscribers_community_guidelines_summary_off">Tilaajien yhteisön säännöt näytetään</string>
@@ -260,6 +276,7 @@ Jos Doodle näkyy tällä hetkellä alueellasi ja tämä piilotusasetus on käyt
<string name="revanced_hide_filter_bar_feed_in_related_videos_title">Piilota liittyvissä videoissa</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_on">Piilotettu liittyvissä videoissa</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_off">Näytetään liittyvissä videoissa</string>
<string name="revanced_channel_screen_title">Kanavasivu</string>
<!-- 'For You' should be translated using the same localized wording YouTube displays. -->
<string name="revanced_hide_for_you_shelf_title">Piilota \"\'Sinulle\" -hylly</string>
<!-- 'Visit Community' should be translated with the same localized wording that YouTube displays. -->

View File

@@ -171,7 +171,13 @@ Hindi ka aabisuhan ng anumang hindi inaasahang mga kaganapan."</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Nakatago ang lumulutang na pindutan ng mikropono sa paghahanap</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Ang lumulutang na pindutan ng mikropono sa paghahanap ay ipinapakita</string>
<string name="revanced_hide_horizontal_shelves_title">Itago ang mga pahalang na istante</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Ang mga pahalang na shelf ay nakatago, tulad ng:\n• Nagbabagang balita\n• Ipagpatuloy ang panonood\n• Galugarin ang higit pang channel\n• Pinakanauugnay\n• Pamimili\n• Panoorin muli"</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Ang mga pahalang na shelf ay nakatago, tulad ng:
• Nagbabagang balita
• Ipagpatuloy ang panonood
• Galugarin ang higit pang channel
• Pinakanauugnay
• Pamimili
• Panoorin muli"</string>
<string name="revanced_hide_horizontal_shelves_summary_off">Ipinapakita ang mga pahalang na istante</string>
<string name="revanced_hide_image_shelf_title">Itago ang image shelf</string>
<string name="revanced_hide_image_shelf_summary_on">Nakago na ang image shelf sa mga resulta ng paghahanap</string>

View File

@@ -168,16 +168,16 @@ Vous ne serez pas informé des événements inattendus."</string>
<string name="revanced_hide_feed_survey_summary_on">Les enquêtes dans le flux sont masquées</string>
<string name="revanced_hide_feed_survey_summary_off">Les enquêtes dans le flux sont affichées</string>
<string name="revanced_hide_floating_microphone_button_title">Masquer le bouton micro flottant</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Le bouton de microphone flottant dans la recherche est masqué</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Le bouton flottant du microphone dans la recherche est affiché</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Le bouton micro flottant dans la recherche est masqué</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Le bouton micro flottant dans la recherche est affiché</string>
<string name="revanced_hide_horizontal_shelves_title">Masquer les étagères horizontales</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Les étagères horizontales sont masquées, telles que:
Dernières nouvelles
<string name="revanced_hide_horizontal_shelves_summary_on">"Des étagères horizontales sont masquées, telles que :
Alerte info
• Continuer à regarder
• Explorer plus de chaînes
• Les plus pertinents
• Les plus pertinentes
• Shopping
• Revoir"</string>
• Regarder à nouveau"</string>
<string name="revanced_hide_horizontal_shelves_summary_off">Les étagères horizontales sont affichées</string>
<string name="revanced_hide_image_shelf_title">Masquer l\'étagère d\'images</string>
<string name="revanced_hide_image_shelf_summary_on">L\'étagère d\'images dans les résultats de recherche est masquée</string>
@@ -194,8 +194,8 @@ Vous ne serez pas informé des événements inattendus."</string>
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
This item appear in the subscription feed for future livestreams or unreleased videos. -->
<string name="revanced_hide_notify_me_button_title">Masquer le bouton M\'avertir</string>
<string name="revanced_hide_notify_me_button_summary_on">Le bouton Me prévenir est masqué</string>
<string name="revanced_hide_notify_me_button_summary_off">Le bouton Me prévenir est affiché</string>
<string name="revanced_hide_notify_me_button_summary_on">Le bouton M\'avertir est masqué</string>
<string name="revanced_hide_notify_me_button_summary_off">Le bouton M\'avertir est affiché</string>
<string name="revanced_hide_playables_title">Masquer les jeux intégrés</string>
<string name="revanced_hide_playables_summary_on">Les jeux intégrés sont masqués</string>
<string name="revanced_hide_playables_summary_off">Les jeux intégrés sont affichés</string>
@@ -208,13 +208,13 @@ Vous ne serez pas informé des événements inattendus."</string>
<string name="revanced_hide_ticket_shelf_summary_on">L\'étagère des billets est masquée</string>
<string name="revanced_hide_ticket_shelf_summary_off">L\'étagère des billets est affichée</string>
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
<string name="revanced_hide_video_recommendation_labels_title">Masquer les étiquettes de recommandation de vidéos</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">Les étiquettes \"Les internautes ont également regardé\" et \"Vous pourriez aussi aimer\" dans les résultats de recherche sont masquées</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">Les étiquettes \"Les internautes ont également regardé\" et \"Vous pourriez aussi aimer\" dans les résultats de recherche sont affichées</string>
<string name="revanced_hide_video_recommendation_labels_title">Masquer les libellés de recommandation de vidéos</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">Les libellés \"Les internautes ont également regardé\" et \"Vous pourriez aussi aimer\" dans les résultats de recherche sont masqués</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">Les libellés \"Les internautes ont également regardé\" et \"Vous pourriez aussi aimer\" dans les résultats de recherche sont affichés</string>
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
<string name="revanced_hide_doodles_title">Masquer les Doodles YouTube</string>
<string name="revanced_hide_doodles_summary_on">L\'animation YouTube Doodles sur le logo est masquée</string>
<string name="revanced_hide_doodles_summary_off">L\'animation YouTube Doodles sur le logo est affichée</string>
<string name="revanced_hide_doodles_summary_on">L\'animation Doodles sur le logo YouTube est masquée</string>
<string name="revanced_hide_doodles_summary_off">L\'animation Doodles sur le logo YouTube est affichée</string>
<string name="revanced_hide_doodles_user_dialog_message">"Les Doodles YouTube sont affichés quelques jours par an.
Si un Doodle est actuellement affiché dans votre région et que cette option de masquage est activée, la barre des filtres sous la barre de recherche sera également masquée."</string>
@@ -293,8 +293,8 @@ Si un Doodle est actuellement affiché dans votre région et que cette option de
<string name="revanced_hide_filter_bar_feed_in_related_videos_title">Masquer dans les vidéos similaires</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_on">Masquée dans les vidéos similaires</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_off">Affichée dans les vidéos similaires</string>
<string name="revanced_channel_screen_title">Page de la chaîne</string>
<string name="revanced_channel_screen_summary">Masquer ou afficher les composants de la page de la chaîne</string>
<string name="revanced_channel_screen_title">Page de chaîne</string>
<string name="revanced_channel_screen_summary">Masquez ou affichez des composants des pages de chaîne</string>
<!-- 'For You' should be translated using the same localized wording YouTube displays. -->
<string name="revanced_hide_for_you_shelf_title">Masquer l\'étagère \"Pour vous\"</string>
<string name="revanced_hide_for_you_shelf_summary_on">L\'étagère Pour vous est masquée</string>
@@ -306,9 +306,9 @@ Si un Doodle est actuellement affiché dans votre région et que cette option de
<string name="revanced_hide_members_shelf_summary_on">L\'étagère des membres est masquée</string>
<string name="revanced_hide_members_shelf_summary_off">L\'étagère des membres est affichée</string>
<!-- 'Visit Community' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_visit_community_button_title">Masquer le bouton \"Visiter la communauté\"</string>
<string name="revanced_hide_visit_community_button_summary_on">Le bouton \"Visiter la communauté\" est masqué</string>
<string name="revanced_hide_visit_community_button_summary_off">Le bouton Visiter la Communauté est affiché</string>
<string name="revanced_hide_visit_community_button_title">Masquer le bouton \"Accéder à la communauté\"</string>
<string name="revanced_hide_visit_community_button_summary_on">Le bouton Accéder à la communauté est masqué</string>
<string name="revanced_hide_visit_community_button_summary_off">Le bouton Accéder à la communauté est affiché</string>
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_visit_store_button_title">Masquer le bouton Visiter la boutique</string>
<string name="revanced_hide_visit_store_button_summary_on">Le bouton Visiter la boutique est masqué</string>
@@ -321,18 +321,18 @@ Si un Doodle est actuellement affiché dans votre région et que cette option de
<string name="revanced_hide_comments_ai_summary_title">Masquer le résumé IA des commentaires</string>
<string name="revanced_hide_comments_ai_summary_summary_on">Le résumé des commentaires est masqué</string>
<string name="revanced_hide_comments_ai_summary_summary_off">Le résumé des commentaires est affiché</string>
<string name="revanced_hide_comments_channel_guidelines_title">Masquer les règles de la chaîne</string>
<string name="revanced_hide_comments_channel_guidelines_summary_on">Les règles de la chaîne sont masquées</string>
<string name="revanced_hide_comments_channel_guidelines_summary_off">Les règles de la chaîne sont affichées</string>
<string name="revanced_hide_comments_channel_guidelines_title">Masquer les consignes de chaîne</string>
<string name="revanced_hide_comments_channel_guidelines_summary_on">Les consignes de chaîne sont masquées</string>
<string name="revanced_hide_comments_channel_guidelines_summary_off">Les consignes de chaîne sont affichées</string>
<string name="revanced_hide_comments_by_members_header_title">Masquer l\'en-tête \"Commentaires des membres\"</string>
<string name="revanced_hide_comments_by_members_header_summary_on">L\'en-tête \"Commentaires des membres\" est masqué</string>
<string name="revanced_hide_comments_by_members_header_summary_off">L\'en-tête \"Commentaires des membres\" est affiché</string>
<string name="revanced_hide_comments_section_title">Masquer la section Commentaires</string>
<string name="revanced_hide_comments_section_summary_on">La section Commentaires est masquée</string>
<string name="revanced_hide_comments_section_summary_off">La section Commentaires est affichée</string>
<string name="revanced_hide_comments_community_guidelines_title">Masquer les règles de la communauté</string>
<string name="revanced_hide_comments_community_guidelines_summary_on">Les règles de la communauté sont masquées</string>
<string name="revanced_hide_comments_community_guidelines_summary_off">Les règles de la communauté sont affichées</string>
<string name="revanced_hide_comments_community_guidelines_title">Masquer le règlement de la communauté</string>
<string name="revanced_hide_comments_community_guidelines_summary_on">Le règlement de la communauté est masqué</string>
<string name="revanced_hide_comments_community_guidelines_summary_off">Le règlement de la communauté est affiché</string>
<string name="revanced_hide_comments_create_a_short_button_title">Masquer le bouton Créer un Short</string>
<string name="revanced_hide_comments_create_a_short_button_summary_on">Le bouton \"Créer un Short\" est masqué</string>
<string name="revanced_hide_comments_create_a_short_button_summary_off">Le bouton \"Créer un Short\" est affiché</string>
@@ -395,8 +395,8 @@ Limitations
<string name="revanced_hide_creator_store_shelf_summary_on">L\'étagère de la boutique du créateur sous le lecteur vidéo est masquée</string>
<string name="revanced_hide_creator_store_shelf_summary_off">L\'étagère de la boutique du créateur sous le lecteur vidéo est affichée</string>
<string name="revanced_hide_end_screen_store_banner_title">Masquer l\'écran de fin de bannière de boutique</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">La bannière de la boutique de l\'écran de fin est masquée</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">La bannière de la boutique de l\'écran de fin est affichée</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">L\'écran de fin de bannière de boutique est masqué</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">L\'écran de fin de bannière de boutique est affiché</string>
<string name="revanced_hide_fullscreen_ads_title">Masquer les annonces plein écran</string>
<string name="revanced_hide_fullscreen_ads_summary_on">"Les annonces plein écran sont masquées
@@ -416,13 +416,13 @@ Cette fonctionnalité est disponible uniquement pour les appareils anciens"</str
<string name="revanced_hide_self_sponsor_ads_title">Masquer les cartes d\'autopromotion</string>
<string name="revanced_hide_self_sponsor_ads_summary_on">Les cartes d\'autopromotion sont masquées</string>
<string name="revanced_hide_self_sponsor_ads_summary_off">Les cartes d\'autopromotion sont affichées</string>
<string name="revanced_hide_shopping_links_title">Masquer les liens d\'achat</string>
<string name="revanced_hide_shopping_links_summary_on">Les liens d\'achat dans la description de la vidéo sont masqués</string>
<string name="revanced_hide_shopping_links_title">Masquer les liens de shopping</string>
<string name="revanced_hide_shopping_links_summary_on">Les liens de shopping dans la description de la vidéo sont masqués</string>
<string name="revanced_hide_shopping_links_summary_off">Les liens de shopping dans la description de la vidéo sont affichés</string>
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_view_products_banner_title">Masquer la bannière \"Afficher les produits\"</string>
<string name="revanced_hide_view_products_banner_summary_on">La bannière Voir les produits dans l\'overlay vidéo est masquée</string>
<string name="revanced_hide_view_products_banner_summary_off">La bannière Voir les produits dans l\'overlay vidéo est affichée</string>
<string name="revanced_hide_view_products_banner_summary_on">La bannière Afficher les produits dans l\'overlay de la vidéo est masquée</string>
<string name="revanced_hide_view_products_banner_summary_off">La bannière Afficher les produits dans l\'overlay de la vidéo est affichée</string>
<string name="revanced_hide_web_search_results_title">Masquer les résultats Web</string>
<string name="revanced_hide_web_search_results_summary_on">Les résultats Web sont masqués</string>
<string name="revanced_hide_web_search_results_summary_off">Les résultats Web sont affichés</string>
@@ -736,13 +736,13 @@ Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur
<string name="revanced_shorts_player_screen_title">Lecteur Shorts</string>
<string name="revanced_shorts_player_screen_summary">Masquez ou affichez des composants dans le lecteur Shorts</string>
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_hide_shorts_home_title">Masquer les Shorts dans le flux d\'Accueil</string>
<string name="revanced_hide_shorts_home_summary_on">Masqué dans le flux d\'Accueil et les vidéos associées</string>
<string name="revanced_hide_shorts_home_summary_off">Affiché dans le flux d\'Accueil et les vidéos associées</string>
<string name="revanced_hide_shorts_home_title">Masquer les Shorts dans le flux Accueil</string>
<string name="revanced_hide_shorts_home_summary_on">Masqués dans le flux Accueil et dans les vidéos associées</string>
<string name="revanced_hide_shorts_home_summary_off">Affichés dans le flux Accueil et dans les vidéos associées</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_hide_shorts_subscriptions_title">Masquer les Shorts dans le flux d\'Abonnements</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Masqué dans le flux d\'Abonnements</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">Affiché dans le flux d\'Abonnements</string>
<string name="revanced_hide_shorts_subscriptions_title">Masquer les Shorts dans le flux Abonnements</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Masqués dans le flux Abonnements</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">Affichés dans le flux Abonnements</string>
<string name="revanced_hide_shorts_search_title">Masquer les Shorts dans les résultats de recherche</string>
<string name="revanced_hide_shorts_search_summary_on">Masqués dans les résultats de recherche</string>
<string name="revanced_hide_shorts_search_summary_off">Affichés dans les résultats de recherche</string>
@@ -750,8 +750,8 @@ Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur
<string name="revanced_hide_shorts_history_summary_on">Masqués dans l\'historique des vidéos regardées</string>
<string name="revanced_hide_shorts_history_summary_off">Affichés dans l\'historique des vidéos regardées</string>
<string name="revanced_hide_shorts_super_thanks_button_title">Masquer le bouton Acheter un Super Thanks</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Le bouton Acheter Super Thanks est masqué</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Le bouton Acheter Super Thanks est affiché</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Le bouton Acheter un Super Thanks est masqué</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Le bouton Acheter un Super Thanks est affiché</string>
<string name="revanced_hide_shorts_effect_button_title">Masquer le bouton d\'effet</string>
<string name="revanced_hide_shorts_effect_button_summary_on">Le bouton d\'effet est masqué</string>
<string name="revanced_hide_shorts_effect_button_summary_off">Le bouton d\'effet est affiché</string>
@@ -837,8 +837,8 @@ Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur
<string name="revanced_hide_shorts_video_title_summary_on">Le titre de la vidéo est masqué</string>
<string name="revanced_hide_shorts_video_title_summary_off">Le titre de la vidéo est affiché</string>
<string name="revanced_hide_shorts_sound_metadata_label_title">Masquer le libellé des métadonnées audio</string>
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">L\'étiquette de métadonnées audio est masquée</string>
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">L\'étiquette de métadonnées audio est affichée</string>
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Le libellé des métadonnées audio est masqué</string>
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Le libellé des métadonnées audio est affiché</string>
<string name="revanced_hide_shorts_full_video_link_label_title">Masquer le libellé du lien vidéo</string>
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Le libellé de lien est masqué</string>
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Le libellé de lien est affiché</string>
@@ -856,8 +856,8 @@ Paramètres → Lecture → Lecture automatique de la vidéo suivante"</string>
</patch>
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
<string name="revanced_hide_related_videos_overlay_title">Masquer l\'overlay des vidéos associées</string>
<string name="revanced_hide_related_videos_overlay_summary_on">L\'overlay des vidéos associées en plein écran est masqué</string>
<string name="revanced_hide_related_videos_overlay_summary_off">L\'overlay des vidéos associées en plein écran est affiché</string>
<string name="revanced_hide_related_videos_overlay_summary_on">L\'overlay des vidéos associées en mode plein écran est masqué</string>
<string name="revanced_hide_related_videos_overlay_summary_off">L\'overlay des vidéos associées en mode plein écran est affiché</string>
</patch>
<patch id="layout.hide.time.hideTimestampPatch">
<string name="revanced_hide_timestamp_title">Masquer le temps écoulé et la durée totale</string>
@@ -1309,9 +1309,9 @@ Le lecteur réduit peut être déplacé hors de l'écran, à gauche comme à dro
<patch id="layout.branding.changeHeaderPatch">
<string name="revanced_header_logo_title">Logo d\'en-tête</string>
<string name="revanced_header_logo_entry_1">Par défaut</string>
<string name="revanced_header_logo_entry_2">Normal</string>
<string name="revanced_header_logo_entry_2">Standard</string>
<!-- For this situation "Minimal" means minimalistic. It does not mean small or tiny. -->
<string name="revanced_header_logo_entry_5">ReVanced minimal</string>
<string name="revanced_header_logo_entry_5">ReVanced minimaliste</string>
<string name="revanced_header_logo_entry_6">Personnalisé</string>
</patch>
<patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch">
@@ -1328,7 +1328,7 @@ L'activation de cette option peut corriger les images manquantes qui sont bloqu
<string name="revanced_alt_thumbnail_subscription_title">Onglet Abonnements</string>
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (Library) tab. -->
<string name="revanced_alt_thumbnail_library_title">Onglet Vous</string>
<string name="revanced_alt_thumbnail_player_title">Playlists du lecteur &amp; recommandations</string>
<string name="revanced_alt_thumbnail_player_title">Playlists et recommandations du lecteur</string>
<string name="revanced_alt_thumbnail_search_title">Résultats de recherche</string>
<string name="revanced_alt_thumbnail_options_entry_1">Miniatures originales</string>
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow et miniatures originales</string>
@@ -1566,8 +1566,8 @@ AVC a une résolution maximale de 1080p et ne prend pas en charge le codec audio
<string name="revanced_settings">Paramètres ReVanced</string>
<string name="revanced_about_title">À propos</string>
<string name="revanced_about_summary">À propos de ReVanced</string>
<string name="revanced_ads_screen_title">Blocage des publicités</string>
<string name="revanced_ads_screen_summary">Paramètres de blocage des publicités</string>
<string name="revanced_ads_screen_title">Blocage des annonces</string>
<string name="revanced_ads_screen_summary">Paramètres de blocage des annonces</string>
<string name="revanced_chat_screen_title">Chat</string>
<string name="revanced_chat_screen_summary">Paramètres du chat</string>
<string name="revanced_misc_screen_title">Divers</string>

View File

@@ -171,7 +171,13 @@ Nem fog értesülni semmilyen váratlan eseményről."</string>
<string name="revanced_hide_floating_microphone_button_summary_on">A lebegő mikrofon gomb a keresésben elrejtve</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Lebegő mikrofon gomb megjelenik a keresésben</string>
<string name="revanced_hide_horizontal_shelves_title">Vízszintes polcok elrejtése</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"A vízszintes polcok el vannak rejtve, mint például:• Friss hírek• Folytatás• További csatornák felfedezése• Legrelevánsabb• Vásárlás• Nézze meg újra"</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"A vízszintes polcok rejtettek, mint például:
• Friss hírek
• Folytassa a megtekintést
• Fedezzen fel további csatornákat
• Legrelevánsabb
• Vásárlás
• Nézze meg újra"</string>
<string name="revanced_hide_horizontal_shelves_summary_off">A vízszintes polcok láthatók</string>
<string name="revanced_hide_image_shelf_title">Képpolc elrejtése</string>
<string name="revanced_hide_image_shelf_summary_on">A keresési eredményekben lévő képpolc el van rejtve</string>

View File

@@ -213,7 +213,7 @@ Anda tidak akan diberi tahu tentang kejadian yang tidak terduga."</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">Label \'Orang juga menonton\' dan \'Anda mungkin juga menyukai\' di hasil pencarian ditampilkan</string>
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
<string name="revanced_hide_doodles_title">Sembunyikan YouTube Doodles</string>
<string name="revanced_hide_doodles_summary_on">Animasi Doodles YouTube di logo disembunyikan</string>
<string name="revanced_hide_doodles_summary_on">Animasi YouTube Doodles pada logo disembunyikan</string>
<string name="revanced_hide_doodles_summary_off">Animasi YouTube Doodles pada logo ditampilkan</string>
<string name="revanced_hide_doodles_user_dialog_message">"YouTube Doodle muncul beberapa hari setiap tahun.
@@ -736,13 +736,13 @@ Untuk menampilkan menu trek Audio, ubah 'Spoof aliran video' ke iOS TV"</string>
<string name="revanced_shorts_player_screen_title">Pemutar Shorts</string>
<string name="revanced_shorts_player_screen_summary">Sembunyikan atau tampilkan komponen di pemutar Shorts</string>
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_hide_shorts_home_title">Sembunyikan Shorts di feed Beranda</string>
<string name="revanced_hide_shorts_home_summary_on">Disembunyikan di feed Beranda dan video terkait</string>
<string name="revanced_hide_shorts_home_summary_off">Ditampilkan di feed Beranda dan video terkait</string>
<string name="revanced_hide_shorts_home_title">Sembunyikan Shorts di umpan Beranda</string>
<string name="revanced_hide_shorts_home_summary_on">Disembunyikan di umpan Beranda dan video terkait</string>
<string name="revanced_hide_shorts_home_summary_off">Ditampilkan di umpan Beranda dan video terkait</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_hide_shorts_subscriptions_title">Sembunyikan Shorts di feed Langganan</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Disembunyikan di feed Langganan</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">Ditampilkan di feed Langganan</string>
<string name="revanced_hide_shorts_subscriptions_title">Sembunyikan Shorts di umpan Langganan</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Disembunyikan di umpan Langganan</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">Ditampilkan di umpan Langganan</string>
<string name="revanced_hide_shorts_search_title">Sembunyikan Shorts di hasil pencarian</string>
<string name="revanced_hide_shorts_search_summary_on">Disembunyikan dalam hasil penelusuran</string>
<string name="revanced_hide_shorts_search_summary_off">Ditampilkan dalam hasil penelusuran</string>
@@ -1323,7 +1323,7 @@ Mengaktifkan ini dapat memperbaiki gambar yang hilang yang diblokir di beberapa
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_alt_thumbnail_home_title">Tab beranda</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_alt_thumbnail_subscription_title">Tab Langganan</string>
<string name="revanced_alt_thumbnail_subscription_title">Bilah Langganan</string>
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (Library) tab. -->
<string name="revanced_alt_thumbnail_library_title">Tab Anda</string>
<string name="revanced_alt_thumbnail_player_title">Daftar putar &amp; rekomendasi pemutar</string>

View File

@@ -171,7 +171,13 @@ Non sarai notificato di eventi imprevisti."</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Il pulsante del microfono fluttuante nella ricerca è nascosto</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Il pulsante del microfono fluttuante nella ricerca è mostrato</string>
<string name="revanced_hide_horizontal_shelves_title">Nascondi sezioni orizzontali</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Le mensole orizzontali sono nascoste, come:\n• Notizie dell'ultima ora\n• Continua a guardare\n• Esplora altri canali\n• Più rilevanti\n• Acquisti\n• Guardalo di nuovo"</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"I ripiani orizzontali sono nascosti, come:
• Ultime notizie
• Continua a guardare
• Esplora altri canali
• Più pertinenti
• Shopping
• Guarda di nuovo"</string>
<string name="revanced_hide_horizontal_shelves_summary_off">Le scaffalature orizzontali sono mostrate</string>
<string name="revanced_hide_image_shelf_title">Nascondi sezione immagini</string>
<string name="revanced_hide_image_shelf_summary_on">La sezione immagini nei risultati di ricerca è nascosta</string>

View File

@@ -33,7 +33,7 @@ Second \"item\" text"</string>
</patch>
<patch id="misc.settings.settingsResourcePatch">
<string name="revanced_settings_submenu_title">設定</string>
<string name="revanced_settings_confirm_user_dialog_title">本当に続行しますか?</string>
<string name="revanced_settings_confirm_user_dialog_title">続行してもよろしいですか?</string>
<string name="revanced_settings_reset">リセット</string>
<string name="revanced_settings_reset_color">色をリセット</string>
<string name="revanced_settings_color_invalid">色の値が無効です</string>
@@ -100,7 +100,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
<string name="revanced_settings_screen_12_video_title">動画</string>
<string name="revanced_restore_old_settings_menus_title">古い設定メニューを復元</string>
<string name="revanced_restore_old_settings_menus_summary_on">旧バージョンの設定メニューが表示されます</string>
<string name="revanced_restore_old_settings_menus_summary_off">通常の設定メニュー表示されま</string>
<string name="revanced_restore_old_settings_menus_summary_off">旧バージョンの設定メニュー表示されません</string>
<string name="revanced_settings_search_history_title">設定の検索履歴を表示</string>
<string name="revanced_settings_search_history_summary_on">設定の検索履歴は表示されます</string>
<string name="revanced_settings_search_history_summary_off">設定の検索履歴は表示されません</string>
@@ -301,9 +301,9 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
<string name="revanced_hide_for_you_shelf_title">「おすすめ」欄を非表示</string>
<string name="revanced_hide_for_you_shelf_summary_on">「おすすめ」欄は表示されません</string>
<string name="revanced_hide_for_you_shelf_summary_off">「おすすめ」欄は表示されます</string>
<string name="revanced_hide_links_preview_title">リンク プレビューを非表示</string>
<string name="revanced_hide_links_preview_summary_on">リンク プレビューは表示されません</string>
<string name="revanced_hide_links_preview_summary_off">リンク プレビューは表示されます</string>
<string name="revanced_hide_links_preview_title">リンク集のプレビューを非表示</string>
<string name="revanced_hide_links_preview_summary_on">リンク集のプレビューは表示されません</string>
<string name="revanced_hide_links_preview_summary_off">リンク集のプレビューは表示されます</string>
<string name="revanced_hide_members_shelf_title">メンバー欄を非表示</string>
<string name="revanced_hide_members_shelf_summary_on">メンバー欄は表示されません</string>
<string name="revanced_hide_members_shelf_summary_off">メンバー欄は表示されます</string>
@@ -317,7 +317,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
<string name="revanced_hide_visit_store_button_summary_off">「ストアに移動」ボタンは表示されます</string>
<string name="revanced_comments_screen_title">コメント</string>
<string name="revanced_comments_screen_summary">コメント セクションの設定</string>
<string name="revanced_hide_comments_ai_chat_summary_title">「チャットの要約」を非表示</string>
<string name="revanced_hide_comments_ai_chat_summary_title">AI による「チャットの要約」を非表示</string>
<string name="revanced_hide_comments_ai_chat_summary_summary_on">「チャットの要約」は表示されません</string>
<string name="revanced_hide_comments_ai_chat_summary_summary_off">「チャットの要約」は表示されます</string>
<string name="revanced_hide_comments_ai_summary_title">AI によるコメントの要約を非表示</string>
@@ -412,9 +412,9 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
<string name="revanced_hide_merchandise_banners_title">商品バナーを非表示</string>
<string name="revanced_hide_merchandise_banners_summary_on">商品バナーは表示されません</string>
<string name="revanced_hide_merchandise_banners_summary_off">商品バナーは表示されます</string>
<string name="revanced_hide_paid_promotion_label_title">「プロモーションを含みます」ボタンを非表示</string>
<string name="revanced_hide_paid_promotion_label_summary_on">プレーヤー画面の「プロモーションを含みます」ボタンは表示されません</string>
<string name="revanced_hide_paid_promotion_label_summary_off">プレーヤー画面の「プロモーションを含みます」ボタンは表示されます</string>
<string name="revanced_hide_paid_promotion_label_title">「プロモーションを含みます」ラベルを非表示</string>
<string name="revanced_hide_paid_promotion_label_summary_on">「プロモーションを含みます」ラベルは表示されません</string>
<string name="revanced_hide_paid_promotion_label_summary_off">「プロモーションを含みます」ラベルは表示されます</string>
<string name="revanced_hide_self_sponsor_ads_title">自己スポンサー カードを非表示</string>
<string name="revanced_hide_self_sponsor_ads_summary_on">自己スポンサー カードは表示されません</string>
<string name="revanced_hide_self_sponsor_ads_summary_off">自己スポンサー カードは表示されます</string>
@@ -422,7 +422,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
<string name="revanced_hide_shopping_links_summary_on">動画の概要欄の商品へのリンクは表示されません</string>
<string name="revanced_hide_shopping_links_summary_off">動画の概要欄の商品へのリンクは表示されます</string>
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_view_products_banner_title">「商品を表示」ボタンを非表示</string>
<string name="revanced_hide_view_products_banner_title">「商品を表示」バナーを非表示</string>
<string name="revanced_hide_view_products_banner_summary_on">動画オーバーレイの「商品を表示」バナーは表示されません</string>
<string name="revanced_hide_view_products_banner_summary_off">動画オーバーレイの「商品を表示」バナーは表示されます</string>
<string name="revanced_hide_web_search_results_title">ウェブ検索結果を非表示</string>
@@ -532,9 +532,9 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
<string name="revanced_swipe_change_video_summary_off">全画面表示でスワイプしても、次 / 前の動画に切り替わりません</string>
</patch>
<patch id="layout.autocaptions.autoCaptionsPatch">
<string name="revanced_disable_auto_captions_title">デフォルトでの字幕表示を無効化</string>
<string name="revanced_disable_auto_captions_summary_on">動画を開いた際字幕表示しません</string>
<string name="revanced_disable_auto_captions_summary_off">動画を開いた際字幕表示しません</string>
<string name="revanced_disable_auto_captions_title">自動字幕表示を無効化</string>
<string name="revanced_disable_auto_captions_summary_on">動画を開いた際の自動字幕表示は、無効です</string>
<string name="revanced_disable_auto_captions_summary_off">動画を開いた際の自動字幕表示は、有効です</string>
</patch>
<patch id="layout.buttons.action.hideButtonsPatch">
<string name="revanced_hide_buttons_screen_title">アクション ボタン</string>
@@ -586,7 +586,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
</patch>
<patch id="layout.buttons.navigation.navigationButtonsPatch">
<string name="revanced_navigation_buttons_screen_title">ナビゲーション ボタン</string>
<string name="revanced_navigation_buttons_screen_summary">画面下部のナビゲーション バーに表示されるボタンの設定</string>
<string name="revanced_navigation_buttons_screen_summary">ナビゲーション バーのボタンを変更または非表示にします</string>
<!-- 'Home' should be translated using the same localized wording YouTube displays for the tab. -->
<string name="revanced_hide_home_button_title">「ホーム」を非表示</string>
<string name="revanced_hide_home_button_summary_on">ホームボタンは表示されません</string>
@@ -621,7 +621,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
<string name="revanced_disable_translucent_status_bar_title">ステータスバーの半透明化を無効にする</string>
<string name="revanced_disable_translucent_status_bar_summary_on">ステータスバーは常に透けません</string>
<string name="revanced_disable_translucent_status_bar_summary_off">ステータスバーは状況に応じて透けます</string>
<string name="revanced_disable_translucent_status_bar_user_dialog_message">一部のデバイスでは、この機能を有効にすると、システムのナビゲーション バーが半透明になりアプリ内の component に重なってしまう可能性があります。</string>
<string name="revanced_disable_translucent_status_bar_user_dialog_message">一部のデバイスでは、この機能を有効にすると、システムのナビゲーション バーが半透明になりアプリ内のコンポーネントに重なってしまう可能性があります。</string>
<string name="revanced_disable_translucent_navigation_bar_light_title">ライトモード時のナビゲーション バーの半透明化を無効にする</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">ライトモード時にナビゲーション バーは透けません</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">ライトモード時にナビゲーション バーが状況に応じて透けます</string>
@@ -679,7 +679,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
<string name="revanced_hide_player_flyout_audio_track_not_available">"「音声トラック」は表示されません
「音声トラック」を表示するには、「動画ストリームを偽装する」の「デフォルトのクライアント」を iOS TV に変更してください"</string>
「音声トラック」を表示するには、「動画ストリームを偽装」の「デフォルトのクライアント」を iOS TV に変更してください"</string>
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
<string name="revanced_hide_player_flyout_watch_in_vr_title">「VR で見る」を非表示</string>
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">「VR で見る」は表示されません</string>
@@ -867,9 +867,9 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
<string name="revanced_hide_timestamp_summary_off">タイムスタンプは表示されます</string>
</patch>
<patch id="layout.panels.popup.playerPopupPanelsPatch">
<string name="revanced_hide_player_popup_panels_title">ポップアップ パネルを非表示</string>
<string name="revanced_hide_player_popup_panels_summary_on">チャット欄やプレイリストを閉じた状態で動画を開きます</string>
<string name="revanced_hide_player_popup_panels_summary_off">チャット欄やプレイリストを展開した状態で動画を開きます</string>
<string name="revanced_hide_player_popup_panels_title">プレーヤー ポップアップ パネルを非表示</string>
<string name="revanced_hide_player_popup_panels_summary_on">動画を開いた際のプレイリストやチャット欄などのプレーヤー ポップアップ パネルは、表示されません</string>
<string name="revanced_hide_player_popup_panels_summary_off">動画を開いた際のプレイリストやチャット欄などのプレーヤー ポップアップ パネルは、表示されます</string>
</patch>
<patch id="layout.player.fullscreen.exitFullscreenPatch">
<string name="revanced_exit_fullscreen_title">再生終了時に全画面表示を解除する</string>
@@ -939,8 +939,8 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
</patch>
<patch id="layout.searchbar.wideSearchbarPatch">
<string name="revanced_wide_searchbar_title">ワイド検索バーを有効化</string>
<string name="revanced_wide_searchbar_summary_on">幅の広い検索バーが表示されま</string>
<string name="revanced_wide_searchbar_summary_off">通常の検索バーが表示されま</string>
<string name="revanced_wide_searchbar_summary_on">ワイド検索バーは有効で</string>
<string name="revanced_wide_searchbar_summary_off">ワイド検索バーは無効で</string>
</patch>
<patch id="layout.seekbar.seekbarThumbnailsPatch">
<string name="revanced_seekbar_thumbnails_high_quality_title">高画質サムネイルを有効にする</string>
@@ -1020,7 +1020,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
<string name="revanced_sb_general_uuid">非公開ユーザー ID</string>
<string name="revanced_sb_general_uuid_sum">この ID は公開すべきではありません。パスワードのようなものであり、誰とも共有すべきではありません。もし誰かがこの ID を手に入れた場合、あなたになりすますことができます</string>
<string name="revanced_sb_general_uuid_invalid">非公開ユーザー ID は 30 文字以上必要です</string>
<string name="revanced_sb_general_api_url">API URL</string>
<string name="revanced_sb_general_api_url">API URL を変更</string>
<string name="revanced_sb_general_api_url_sum">SponsorBlock がサーバーとの通信で使用するアドレス</string>
<string name="revanced_sb_api_url_reset">API URL をリセットしました</string>
<string name="revanced_sb_api_url_invalid">API URL が無効です</string>
@@ -1034,7 +1034,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
<string name="revanced_sb_settings_export_failed">エクスポートに失敗しました: %s</string>
<string name="revanced_sb_settings_revanced_export_user_id_warning">"設定には、SponsorBlock の非公開ユーザー ID が含まれています。この ID はパスワードのようなものであり、決して共有すべきではありません。"</string>
<string name="revanced_sb_settings_revanced_export_user_id_warning_dismiss">今後表示しない</string>
<string name="revanced_sb_diff_segments">セグメントのスキップ</string>
<string name="revanced_sb_diff_segments">セグメントの挙動を変更</string>
<string name="revanced_sb_segments_sponsor">スポンサー</string>
<string name="revanced_sb_segments_sponsor_sum">有料の宣伝 、有料の紹介、直接的な広告。自己宣伝や好意をもって行う、慈善活動、クリエーター、ウェブサイト、製品などの無償の紹介は含まれません</string>
<string name="revanced_sb_segments_selfpromo">無報酬の宣伝 / 自己宣伝</string>
@@ -1163,7 +1163,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
<string name="revanced_sb_about_api_summary">データは SponsorBlock API によって提供されています。詳細を確認するまたは他のプラットフォーム版をダウンロードするには、ここをタップしてください</string>
</patch>
<patch id="layout.formfactor.changeFormFactorPatch">
<string name="revanced_change_form_factor_title">レイアウト</string>
<string name="revanced_change_form_factor_title">レイアウト フォーム ファクター</string>
<string name="revanced_change_form_factor_entry_1">デフォルト</string>
<string name="revanced_change_form_factor_entry_2">スマートフォン</string>
<string name="revanced_change_form_factor_entry_3">タブレット</string>
@@ -1193,11 +1193,11 @@ Automotive レイアウト
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - ナビゲーション アイコンが旧バージョン</string>
</patch>
<patch id="layout.startpage.changeStartPagePatch">
<string name="revanced_change_start_page_title">スタート画面</string>
<string name="revanced_change_start_page_title">スタート画面を変更</string>
<string name="revanced_change_start_page_entry_default">デフォルト</string>
<string name="revanced_change_start_page_entry_all_subscriptions">すべての登録チャンネル</string>
<string name="revanced_change_start_page_entry_browse">チャンネル一覧</string>
<string name="revanced_change_start_page_entry_courses">学び</string>
<string name="revanced_change_start_page_entry_courses">コース / 学び</string>
<string name="revanced_change_start_page_entry_explore">探索</string>
<string name="revanced_change_start_page_entry_fashion">ファッションと美容</string>
<string name="revanced_change_start_page_entry_gaming">ゲーム</string>
@@ -1218,8 +1218,8 @@ Automotive レイアウト
<string name="revanced_change_start_page_entry_virtual_reality">バーチャル リアリティ</string>
<string name="revanced_change_start_page_entry_watch_later">後で見る</string>
<string name="revanced_change_start_page_entry_your_clips">自分のクリップ</string>
<string name="revanced_change_start_page_always_title">スタート画面の変更を常時適用する</string>
<string name="revanced_change_start_page_always_summary_on">"スタート画面の変更は常時適用されます
<string name="revanced_change_start_page_always_title">スタート画面の変更を常時適用</string>
<string name="revanced_change_start_page_always_summary_on">"スタート画面の変更は常時適用されます
制限事項: ツールバーの [戻る] ボタンが機能しない可能性があります"</string>
<string name="revanced_change_start_page_always_summary_off">スタート画面の変更は、アプリ起動時にのみ適用されます</string>
@@ -1245,7 +1245,7 @@ Automotive レイアウト
</patch>
<patch id="layout.miniplayer.miniplayerPatch">
<string name="revanced_miniplayer_screen_title">ミニプレーヤー</string>
<string name="revanced_miniplayer_screen_summary">視聴中に [戻る] ボタンをタップまたは画面を下にスワイプするとアプリ内に表示される小さなプレーヤーの設定</string>
<string name="revanced_miniplayer_screen_summary">アプリ内に表示される小さな画面のプレーヤーのスタイルを変更します</string>
<string name="revanced_miniplayer_type_title">ミニプレーヤーのタイプ</string>
<string name="revanced_miniplayer_type_entry_0">無効</string>
<string name="revanced_miniplayer_type_entry_1">デフォルト</string>
@@ -1390,7 +1390,7 @@ Automotive レイアウト
</patch>
<patch id="misc.hapticfeedback.disableHapticFeedbackPatch">
<string name="revanced_disable_haptic_feedback_title">触覚フィードバック</string>
<string name="revanced_disable_haptic_feedback_summary">触覚フィードバックの設定</string>
<string name="revanced_disable_haptic_feedback_summary">触覚フィードバックの設定を変更します</string>
<string name="revanced_disable_haptic_feedback_chapters_title">チャプターの触覚フィードバックを無効にする</string>
<string name="revanced_disable_haptic_feedback_chapters_summary_on">チャプターの触覚フィードバックは無効です</string>
<string name="revanced_disable_haptic_feedback_chapters_summary_off">チャプターの触覚フィードバックは有効です</string>
@@ -1425,9 +1425,9 @@ Automotive レイアウト
<patch id="video.audio.forceOriginalAudioPatch">
<string name="revanced_force_original_audio_title">オリジナルの音声を強制的に使用</string>
<string name="revanced_force_original_audio_summary_on">オリジナルの音声トラック (言語) を使用します</string>
<string name="revanced_force_original_audio_summary_off">デフォルトの音声トラック (言語) を使用します</string>
<string name="revanced_force_original_audio_summary_off">アプリが選択した音声トラック (言語) を使用します</string>
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
<string name="revanced_force_original_audio_not_available">この機能を使用するには、「動画ストリームを偽装する」のクライアントを iOS TV に変更してください</string>
<string name="revanced_force_original_audio_not_available">この機能を使用するには、「動画ストリームを偽装」のクライアントを iOS TV に変更してください</string>
</patch>
<patch id="video.quality.rememberVideoQualityPatch">
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
@@ -1460,7 +1460,7 @@ Automotive レイアウト
<string name="revanced_custom_speed_menu_summary_on">カスタムした再生速度リストが表示されます</string>
<string name="revanced_custom_speed_menu_summary_off">デフォルトの再生速度リストが表示されます</string>
<string name="revanced_custom_playback_speeds_title">カスタム再生速度リスト</string>
<string name="revanced_custom_playback_speeds_summary">再生速度リストを編集します</string>
<string name="revanced_custom_playback_speeds_summary">カスタム再生速度リストを編集します</string>
<string name="revanced_custom_playback_speeds_invalid">再生速度は %s 未満である必要があります</string>
<string name="revanced_custom_playback_speeds_parse_exception">カスタム再生速度リストが無効です</string>
<string name="revanced_custom_playback_speeds_auto">自動</string>
@@ -1493,16 +1493,16 @@ Automotive レイアウト
<string name="revanced_slide_to_seek_summary_off">スライドしてシークする機能は無効になっています</string>
</patch>
<patch id="misc.fix.playback.spoofVideoStreamsPatch">
<string name="revanced_spoof_video_streams_screen_title">動画ストリームを偽装する</string>
<string name="revanced_spoof_video_streams_screen_title">動画ストリームを偽装</string>
<string name="revanced_spoof_video_streams_screen_summary">動画再生の失敗を回避するために、クライアントの動画ストリームを偽装します</string>
<string name="revanced_spoof_video_streams_title">動画ストリームを偽装する</string>
<string name="revanced_spoof_video_streams_title">動画ストリームを偽装</string>
<string name="revanced_spoof_video_streams_summary_on">動画ストリームは偽装されます</string>
<string name="revanced_spoof_video_streams_summary_off">"動画ストリームは偽装されません
動画の再生に失敗する可能性があります"</string>
<string name="revanced_spoof_video_streams_user_dialog_message">この設定をオフにすると、動画の再生に失敗するようになる可能性があります。</string>
<string name="revanced_spoof_video_streams_client_type_title">デフォルトのクライアント</string>
<string name="revanced_spoof_video_streams_ios_force_avc_title">iOS クライアントで AVC (H.264) を強制的に使用する</string>
<string name="revanced_spoof_video_streams_ios_force_avc_title">iOS クライアントで AVC (H.264) を強制的に使用</string>
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">ビデオ コーデックは強制的に AVC (H.264) が使用されます</string>
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">ビデオ コーデックは自動的に決定されます</string>
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">"この機能を有効にすると、バッテリー寿命が延びたり、動画のカクつきが改善さたりする可能性があります。

View File

@@ -24,7 +24,7 @@ Second \"item\" text"</string>
<string name="revanced_check_environment_failed_title">환경 검사에 실패하였습니다</string>
<string name="revanced_check_environment_dialog_open_official_source_button">공식 홈페이지 열기</string>
<string name="revanced_check_environment_dialog_ignore_button">닫기</string>
<string name="revanced_check_environment_failed_message">&lt;h5&gt;이 앱은 사용자가 패치하지 않은 것 같습니다.&lt;/h5&gt;&lt;br&gt;이 앱은 제대로 작동하지 않을 수 있으며, &lt;b&gt;사용 시 해롭거나 심지어 위험할 수도 있습니다&lt;/b&gt;.&lt;br&gt;&lt;br&gt;이러한 검사는 이 앱이 다른 사람 패치거나 다른 사람으로부터 받은 것임을 의미합니다:&lt;br&gt;&lt;br&gt;&lt;small&gt;%1$s&lt;/small&gt;&lt;br&gt;검증되고 안전한 앱을 사용하고 있는지 확인하려면 &lt;b&gt;이 앱을 삭제하고 직접 패치하는 것&lt;/b&gt;을 강력히 권장합니다.&lt;p&gt;&lt;br&gt;이 경고는 두 번만 표시됩니다.</string>
<string name="revanced_check_environment_failed_message">&lt;h5&gt;이 앱은 사용자가 패치하지 않은 것 같습니다.&lt;/h5&gt;&lt;br&gt;이 앱은 제대로 작동하지 않을 수 있으며, &lt;b&gt;사용 시 해롭거나 심지어 위험할 수도 있습니다&lt;/b&gt;.&lt;br&gt;&lt;br&gt;이러한 검사는 이 앱이 다른 사람에 의하여 패치되었거나 다른 사람으로부터 받은 것임을 의미합니다:&lt;br&gt;&lt;br&gt;&lt;small&gt;%1$s&lt;/small&gt;&lt;br&gt;검증되고 안전한 앱을 사용하고 있는지 확인하려면 &lt;b&gt;이 앱을 삭제하고 직접 패치하는 것&lt;/b&gt;을 강력히 권장합니다.&lt;p&gt;&lt;br&gt;이 경고는 두 번만 표시됩니다.</string>
<string name="revanced_check_environment_not_same_patching_device">다른 기기에서 패치되었습니다</string>
<string name="revanced_check_environment_manager_not_expected_installer">ReVanced Manager에 의해 설치되지 않았습니다</string>
<string name="revanced_check_environment_not_near_patch_time">10분 이상 전에 패치되었습니다</string>
@@ -168,17 +168,20 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
<string name="revanced_hide_feed_survey_summary_on">피드 설문 조사가 숨겨집니다</string>
<string name="revanced_hide_feed_survey_summary_off">피드 설문 조사가 표시됩니다</string>
<string name="revanced_hide_floating_microphone_button_title">플로팅 마이크 버튼 숨기기</string>
<string name="revanced_hide_floating_microphone_button_summary_on">검색에서 떠다니는 마이크 버튼이 숨겨집니다</string>
<string name="revanced_hide_floating_microphone_button_summary_on">검색에서 플로팅 마이크 버튼이 숨겨집니다</string>
<string name="revanced_hide_floating_microphone_button_summary_off">검색에서 플로팅 마이크 버튼이 표시됩니다</string>
<string name="revanced_hide_horizontal_shelves_title">좌우 슬라이드형 선반 숨기기</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"가로 선반이 숨겨집니다:
주요 뉴스
<string name="revanced_hide_horizontal_shelves_summary_on">"다음 선반이 숨겨집니다:
다시 듣기, 다시 시청하기
• 이어서 시청하기
• 채널 더보기
가장 관련성 높은
쇼핑
다시 시청하기"</string>
<string name="revanced_hide_horizontal_shelves_summary_off">가로 선반이 표시됩니다</string>
이 게임 더보기
주요 뉴스, 뉴스 속보
맞춤 실시간 스트림
• 라이브 쇼핑
• 보건 정보 출처
• 관련성, etc."</string>
<string name="revanced_hide_horizontal_shelves_summary_off">다음 선반이 표시됩니다:\n• 다시 듣기, 다시 시청하기\n• 이어서 시청하기\n• 채널 더보기\n• 이 게임 더보기\n• 주요 뉴스, 뉴스 속보\n• 맞춤 실시간 스트림\n• 라이브 쇼핑\n• 보건 정보 출처\n• 관련성, etc.</string>
<string name="revanced_hide_image_shelf_title">이미지 선반 숨기기</string>
<string name="revanced_hide_image_shelf_summary_on">검색 결과에서 이미지 선반이 숨겨집니다</string>
<string name="revanced_hide_image_shelf_summary_off">검색 결과에서 이미지 선반이 표시됩니다</string>
@@ -194,27 +197,27 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
This item appear in the subscription feed for future livestreams or unreleased videos. -->
<string name="revanced_hide_notify_me_button_title">\'알림 받기\' 버튼 숨기기</string>
<string name="revanced_hide_notify_me_button_summary_on">알림 버튼이 숨겨집니다</string>
<string name="revanced_hide_notify_me_button_summary_off">알림 버튼이 표시됩니다</string>
<string name="revanced_hide_notify_me_button_summary_on">\'알림 받기\' 버튼이 숨겨집니다</string>
<string name="revanced_hide_notify_me_button_summary_off">\'알림 받기\' 버튼이 표시됩니다</string>
<string name="revanced_hide_playables_title">Playables(게임 룸) 선반 숨기기</string>
<string name="revanced_hide_playables_summary_on">Playables(게임 룸) 선반이 숨겨집니다\n• YouTube 앱에 내장된 미니 게임\n• 일부 국가에서는 아직 서비스가 제공되지 않습니다</string>
<string name="revanced_hide_playables_summary_off">Playables(게임 룸) 선반이 표시됩니다\n• YouTube 앱에 내장된 미니 게임\n• 일부 국가에서는 아직 서비스가 제공되지 않습니다</string>
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
This button usually appears when searching for a YT creator. -->
<string name="revanced_hide_show_more_button_title">\'자세히 보기\' 버튼 숨기기</string>
<string name="revanced_hide_show_more_button_summary_on">검색 결과에서 보기 버튼이 숨겨집니다</string>
<string name="revanced_hide_show_more_button_summary_off">검색 결과에서 보기 버튼이 표시됩니다</string>
<string name="revanced_hide_show_more_button_summary_on">검색 결과에서 \'자세히 보기\' 버튼이 숨겨집니다</string>
<string name="revanced_hide_show_more_button_summary_off">검색 결과에서 \'자세히 보기\' 버튼이 표시됩니다</string>
<string name="revanced_hide_ticket_shelf_title">이벤트 티켓 선반 숨기기</string>
<string name="revanced_hide_ticket_shelf_summary_on">이벤트 티켓 선반이 숨겨집니다</string>
<string name="revanced_hide_ticket_shelf_summary_off">이벤트 티켓 선반이 표시됩니다</string>
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
<string name="revanced_hide_video_recommendation_labels_title">동영상 추천 라벨 숨기기</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">검색 결과에서 다음 동영상 추천 라벨이 숨겨집니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">검색 결과에서 다음 동영상 추천 라벨이 표시됩니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">검색 결과에서 다음 라벨이 숨겨집니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">검색 결과에서 다음 라벨이 표시됩니다:\n• 시청자가 이 동영상도 시청함\n• 내가 좋아할 만한 동영상</string>
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
<string name="revanced_hide_doodles_title">YouTube Doodles 숨기기</string>
<string name="revanced_hide_doodles_summary_on">로고에서 YouTube Doodles 애니메이션이 숨겨집니다</string>
<string name="revanced_hide_doodles_summary_off">YouTube 로고에 Doodles 애니메이션이 표시됩니다</string>
<string name="revanced_hide_doodles_summary_on">해더 로고에서 YouTube Doodles 애니메이션이 숨겨집니다</string>
<string name="revanced_hide_doodles_summary_off">헤더 로고에서 YouTube Doodles 애니메이션이 표시됩니다</string>
<string name="revanced_hide_doodles_user_dialog_message">"YouTube Doodles는 공휴일이나 기념일 등, 그날에 맞춘 디자인으로 변경되는 왼쪽 상단의 YouTube 헤더를 말합니다.
현재 거주하는 지역에서 YouTube Doodles가 표시되어 있는데 이 설정이 활성화되어 있는 경우에는 검색창 아래에 표시되는 카테고리 바도 숨겨집니다."</string>
@@ -393,7 +396,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
<string name="revanced_hide_creator_store_shelf_title">판매자 스토어 선반 숨기기</string>
<string name="revanced_hide_creator_store_shelf_summary_on">플레이어 하단에서 판매자(크리에이터) 스토어 선반이 숨겨집니다</string>
<string name="revanced_hide_creator_store_shelf_summary_off">플레이어 하단에서 판매자(크리에이터) 스토어 선반이 표시됩니다</string>
<string name="revanced_hide_end_screen_store_banner_title">최종 화면에서 스토어 배너 숨기기</string>
<string name="revanced_hide_end_screen_store_banner_title">최종 화면 스토어 배너 숨기기</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">최종 화면에서 스토어 배너가 숨겨집니다</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">최종 화면에서 스토어 배너가 표시됩니다</string>
<string name="revanced_hide_fullscreen_ads_title">전체 화면 광고 숨기기</string>
@@ -502,9 +505,9 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
<string name="revanced_swipe_overlay_background_opacity_summary">배경 불투명도 값을 0-100 사이에서 지정할 수 있습니다</string>
<string name="revanced_swipe_overlay_background_opacity_invalid_toast">스와이프 배경 불투명도 값은 0-100 사이여야 합니다</string>
<string name="revanced_swipe_overlay_progress_brightness_color_title">스와이프 오버레이 밝기 조절바 색상</string>
<string name="revanced_swipe_overlay_progress_brightness_color_summary">밝기 조절 색상을 지정할 수 있습니다</string>
<string name="revanced_swipe_overlay_progress_brightness_color_summary">밝기 조절 진행률 색상을 지정할 수 있습니다</string>
<string name="revanced_swipe_overlay_progress_volume_color_title">스와이프 오버레이 볼륨 조절바 색상</string>
<string name="revanced_swipe_overlay_progress_volume_color_summary">볼륨 조절 색상을 지정할 수 있습니다</string>
<string name="revanced_swipe_overlay_progress_volume_color_summary">볼륨 조절 진행률 색상을 지정할 수 있습니다</string>
<string name="revanced_swipe_text_overlay_size_title">스와이프 오버레이 텍스트 크기</string>
<string name="revanced_swipe_text_overlay_size_summary">텍스트 크기를 1-30 사이에서 지정할 수 있습니다</string>
<string name="revanced_swipe_text_overlay_size_invalid_toast">텍스트 크기는 1-30 사이여야 합니다</string>
@@ -520,7 +523,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
<string name="revanced_swipe_overlay_style_entry_5">원형 (최소화)</string>
<string name="revanced_swipe_overlay_style_entry_6">세로</string>
<string name="revanced_swipe_overlay_style_entry_7">세로 (최소화)</string>
<string name="revanced_swipe_change_video_title">스와이프 제스처로 동영상 전환 활성화하기</string>
<string name="revanced_swipe_change_video_title">스와이프 제스처로 동영상 전환 활성화하기</string>
<string name="revanced_swipe_change_video_summary_on">전체 화면 중앙에서 위로/아래로 스와이프하여 다음/이전 동영상으로 전환합니다</string>
<string name="revanced_swipe_change_video_summary_off">전체 화면 중앙에서 위로/아래로 스와이프하여 다음/이전 동영상으로 전환하지 않습니다</string>
</patch>
@@ -544,8 +547,8 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
<string name="revanced_hide_share_button_summary_off">공유 버튼이 표시됩니다</string>
<!-- 'Stop ads' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_stop_ads_button_title">광고 중단 버튼 숨기기</string>
<string name="revanced_hide_stop_ads_button_summary_on">광고 중 버튼이 숨겨집니다</string>
<string name="revanced_hide_stop_ads_button_summary_off">광고 중 버튼이 표시됩니다</string>
<string name="revanced_hide_stop_ads_button_summary_on">광고 중 버튼이 숨겨집니다</string>
<string name="revanced_hide_stop_ads_button_summary_off">광고 중 버튼이 표시됩니다</string>
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
This button usually appears only on live streams. -->
<string name="revanced_hide_report_button_title">신고 버튼 숨기기</string>
@@ -732,11 +735,11 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
<string name="revanced_shorts_player_screen_title">Shorts 플레이어</string>
<string name="revanced_shorts_player_screen_summary">Shorts 플레이어에서 구성요소를 숨기거나 표시할 수 있습니다</string>
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_hide_shorts_home_title">홈 피드에서 Shorts 숨기기</string>
<string name="revanced_hide_shorts_home_title">홈 피드에서 Shorts 선반 숨기기</string>
<string name="revanced_hide_shorts_home_summary_on">홈 피드 및 관련 동영상에서 Shorts 선반이 숨겨집니다</string>
<string name="revanced_hide_shorts_home_summary_off">홈 피드 및 관련 동영상에서 Shorts 선반이 표시됩니다</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_hide_shorts_subscriptions_title">구독 피드에서 Shorts 숨기기</string>
<string name="revanced_hide_shorts_subscriptions_title">구독 피드에서 Shorts 선반 숨기기</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">구독 피드에서 Shorts 선반이 숨겨집니다</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">구독 피드에서 Shorts 선반이 표시됩니다</string>
<string name="revanced_hide_shorts_search_title">검색 결과에서 Shorts 선반 숨기기</string>
@@ -1237,9 +1240,9 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
<string name="revanced_shorts_autoplay_title">Shorts 자동재생</string>
<string name="revanced_shorts_autoplay_summary_on">Shorts가 자동넘김됩니다</string>
<string name="revanced_shorts_autoplay_summary_off">Shorts가 반복재생됩니다</string>
<string name="revanced_shorts_autoplay_background_title">Shorts PIP 재생 자동넘김</string>
<string name="revanced_shorts_autoplay_background_summary_on">Shorts PIP 재생이 자동넘김됩니다</string>
<string name="revanced_shorts_autoplay_background_summary_off">Shorts PIP 재생이 반복재생됩니다</string>
<string name="revanced_shorts_autoplay_background_title">Shorts PIP 모드 자동넘김</string>
<string name="revanced_shorts_autoplay_background_summary_on">PIP 모드에서 Shorts가 자동넘김됩니다</string>
<string name="revanced_shorts_autoplay_background_summary_off">PIP 모드에서 Shorts가 반복재생됩니다</string>
</patch>
<patch id="layout.miniplayer.miniplayerPatch">
<string name="revanced_miniplayer_screen_title">미니 플레이어</string>
@@ -1331,7 +1334,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배
<string name="revanced_alt_thumbnail_subscription_title">구독 탭</string>
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (Library) tab. -->
<string name="revanced_alt_thumbnail_library_title">내 페이지 탭</string>
<string name="revanced_alt_thumbnail_player_title">플레이어: 재생목록 &amp; 추천</string>
<string name="revanced_alt_thumbnail_player_title">플레이어: 재생목록, 관련 동영상, etc.</string>
<string name="revanced_alt_thumbnail_search_title">검색 결과</string>
<string name="revanced_alt_thumbnail_options_entry_1">원본 썸네일</string>
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow &amp; 원본 썸네일</string>
@@ -1547,7 +1550,7 @@ AVC의 최대 화질 값은 1080p이고, OPUS 코덱을 사용불가 및 HDR 동
<string name="revanced_block_video_ads_summary_off">동영상 광고를 차단하지 않습니다</string>
</patch>
<patch id="chat.antidelete.showDeletedMessagesPatch">
<string name="revanced_deleted_msg">메시지를 삭제니다</string>
<string name="revanced_deleted_msg">메시지를 삭제하였습니다</string>
<string name="revanced_show_deleted_messages_title">삭제된 메시지 표시하기</string>
<string name="revanced_show_deleted_messages_entry_1">삭제된 메시지 표시하지 않기</string>
<string name="revanced_show_deleted_messages_entry_2">스포일러 뒤에 삭제된 메시지 숨기기</string>
@@ -1569,7 +1572,7 @@ AVC의 최대 화질 값은 1080p이고, OPUS 코덱을 사용불가 및 HDR 동
<string name="revanced_about_title">정보</string>
<string name="revanced_about_summary">ReVanced 정보</string>
<string name="revanced_ads_screen_title">광고 차단</string>
<string name="revanced_ads_screen_summary">광고 차단 설정</string>
<string name="revanced_ads_screen_summary">광고 차단 설정을 할 수 있습니다</string>
<string name="revanced_chat_screen_title">채팅</string>
<string name="revanced_chat_screen_summary">채팅을 설정할 수 있습니다</string>
<string name="revanced_misc_screen_title">기타</string>

View File

@@ -171,7 +171,13 @@ Jūs netiksit informēts par neparedzētiem notikumiem."</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Peldošā mikrofona poga meklēšanā ir paslēpta.</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Peldošā mikrofona poga meklēšanā ir redzama</string>
<string name="revanced_hide_horizontal_shelves_title">Paslēpt horizontālos plauktus</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Horizontālie plaukti ir paslēpti, piemēram:\n• Jaunākās ziņas\n• Turpināt skatīties\n• Izpētīt vairāk kanālu\n• Visatbilstošākais\n• Iepirkšanās\n• Skatīties vēlreiz"</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Horizontālie plaukti ir paslēpti, piemēram:
• Jaunākās ziņas
• Turpināt skatīties
• Izpētīt vairāk kanālu
• Visatbilstošākais
• Iepirkšanās
• Skatīties vēlreiz"</string>
<string name="revanced_hide_horizontal_shelves_summary_off">Horizontālie plaukti ir redzami.</string>
<string name="revanced_hide_image_shelf_title">Slēpt attēlu plauktu</string>
<string name="revanced_hide_image_shelf_summary_on">Attēlu plaukts meklēšanas rezultātos ir paslēpts</string>

View File

@@ -1544,8 +1544,7 @@ A AVC tem resolução máxima de 1080p, Opus audio codec não está disponível,
<string name="revanced_block_video_ads_summary_off">Anúncios de vídeo são desbloqueados</string>
</patch>
<patch id="chat.antidelete.showDeletedMessagesPatch">
<string name="revanced_deleted_msg">Mensagem exclu&#13;
da</string>
<string name="revanced_deleted_msg">Mensagem eliminada</string>
<string name="revanced_show_deleted_messages_title">Mostrar mensagens eliminadas</string>
<string name="revanced_show_deleted_messages_entry_1">Não exibir mensagens excluídas</string>
<string name="revanced_show_deleted_messages_entry_2">Esconder mensagens excluídas atrás de um spoiler</string>
@@ -1566,12 +1565,8 @@ da</string>
<string name="revanced_settings">Configurações Avançadas</string>
<string name="revanced_about_title">Sobre</string>
<string name="revanced_about_summary">Sobre o ReVanced</string>
<string name="revanced_ads_screen_title">Bloqueio de An&#13;
ncios</string>
<string name="revanced_ads_screen_summary">Configura&#13;
&#13;
es de Bloqueio de An&#13;
ncios</string>
<string name="revanced_ads_screen_title">Bloqueio de Anúncios</string>
<string name="revanced_ads_screen_summary">Configurações de bloqueio de anúncios</string>
<string name="revanced_chat_screen_title">Bate-papo</string>
<string name="revanced_chat_screen_summary">Configurações do chat</string>
<string name="revanced_misc_screen_title">Diversos</string>

View File

@@ -169,7 +169,13 @@ Nebudete informovaní o žiadnych nepredvídaných udalostiach."</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Plávajúce tlačidlo mikrofónu vo vyhľadávaní je skryté</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Plávajúce tlačidlo mikrofónu vo vyhľadávaní je zobrazené</string>
<string name="revanced_hide_horizontal_shelves_title">Skryť horizontálne police</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Vodorovné priehradky sú skryté, napríklad:\n• Najnovšie správy\n• Pokračovať v pozeraní\n• Preskúmať ďalšie kanály\n• Najrelevantnejšie\n• Nakupovanie\n• Pozrieť si znova"</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Horizontálne poličky sú skryté, napríklad:
• Aktuálne správy
• Pokračovať v sledovaní
• Preskúmať ďalšie kanály
• Najrelevantnejšie
• Nakupovanie
• Pozrieť znova"</string>
<string name="revanced_hide_horizontal_shelves_summary_off">Horizontálne poličky sú zobrazené</string>
<string name="revanced_hide_image_shelf_title">Skryť poličku s obrázkami</string>
<string name="revanced_hide_image_shelf_summary_on">Polička s obrázkami vo výsledkoch vyhľadávania je skrytá</string>
@@ -366,7 +372,12 @@ Kľúčové slová môžu byť názvy kanálov alebo akýkoľvek text zobrazený
Slová s veľkými písmenami v strede musia byť zadané s použitím veľkých a malých písmen (napr.: iPhone, TikTok, LeBlanc)"</string>
<string name="revanced_hide_keyword_content_about_title">O filtrovaní kľúčových slov</string>
<string name="revanced_hide_keyword_content_about_summary">"Výsledky vyhľadávania domovskej stránky/odberov/hľadania sa filtrujú, aby sa skryli"</string>
<string name="revanced_hide_keyword_content_about_summary">"Domov/Predplatné/Výsledky vyhľadávania sú filtrované tak, aby sa skryl obsah, ktorý zodpovedá kľúčovým slovám
Obmedzenia
• Shorts sa nedajú skryť podľa názvu kanála
• Niektoré komponenty používateľského rozhrania sa nemusia skryť
• Vyhľadávanie kľúčového slova nemusí priniesť žiadne výsledky"</string>
<string name="revanced_hide_keyword_content_about_whole_words_title">Zhodovať celé slová</string>
<!-- Translations _must_ use a localized example. For languages that do not use spaces between words (Chinese, Japanese, etc.) the English AI example should be used since no localized examples exist. Or if using machine translations, or if nobody wants to think of a localized example, then the English 'ai' example should be left as-is. -->
<string name="revanced_hide_keyword_content_about_whole_words_summary">Obkľúčenie kľúčového slova/frázy dvojitými úvodzovkami zabráni čiastočným zhodám názvov videí a mien kanálov&lt;br&gt;&lt;br&gt;Napríklad,&lt;br&gt;&lt;b&gt;\"ai\"&lt;/b&gt; skryje video: &lt;b&gt;Ako funguje AI?&lt;/b&gt;&lt;br&gt;ale neskryje: &lt;b&gt;What does fair use mean?&lt;/b&gt;</string>

View File

@@ -208,13 +208,13 @@ Nećete biti obavešteni ni o kakvim neočekivanim događajima."</string>
<string name="revanced_hide_ticket_shelf_summary_on">Polica sa kartama je skrivena</string>
<string name="revanced_hide_ticket_shelf_summary_off">Polica sa kartama je prikazana</string>
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
<string name="revanced_hide_video_recommendation_labels_title">Sakrij oznake preporuka video snimaka</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">Oznake „Ljudi su gledali i” i „Možda će vam se svideti” u rezultatima pretrage su skrivene</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">Oznake „Ljudi su gledali i” i „Možda će vam se svideti” u rezultatima pretrage su prikazane</string>
<string name="revanced_hide_video_recommendation_labels_title">Sakrij oznake preporuka videa</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">Oznake „Drugi su takođe gledali ovaj video” i „Možda će vam se takođe dopasti” u rezultatima pretrage su skrivene</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">Oznake „Drugi su takođe gledali ovaj video” i „Možda će vam se takođe dopasti” u rezultatima pretrage su prikazane</string>
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
<string name="revanced_hide_doodles_title">Sakrij YouTube Doodles</string>
<string name="revanced_hide_doodles_summary_on">Animacija YouTube Doodles na logotipu je skrivena</string>
<string name="revanced_hide_doodles_summary_off">Animacija YouTube Doodles na logotipu je prikazana</string>
<string name="revanced_hide_doodles_summary_on">Animacija YouTube Doodlesa na logotipu je skrivena</string>
<string name="revanced_hide_doodles_summary_off">Animacija YouTube Doodlesa na logotipu je prikazana</string>
<string name="revanced_hide_doodles_user_dialog_message">"YouTube Doodles se prikazuje nekoliko dana svake godine.
Ako se Doodle trenutno prikazuje u vašem regionu i ova opcija skrivanja je uključena, traka filtera ispod trake za pretragu takođe će biti skrivena."</string>
@@ -417,12 +417,12 @@ Ova funkcija je dostupna samo za starije uređaje"</string>
<string name="revanced_hide_self_sponsor_ads_summary_on">Kartice samosponzorstva su skrivene</string>
<string name="revanced_hide_self_sponsor_ads_summary_off">Kartice samosponzorstva su prikazane</string>
<string name="revanced_hide_shopping_links_title">Sakrij linkove za kupovinu</string>
<string name="revanced_hide_shopping_links_summary_on">Linkovi za kupovinu u opisu video snimka su skriveni</string>
<string name="revanced_hide_shopping_links_summary_on">Linkovi za kupovinu u opisu videa su skriveni</string>
<string name="revanced_hide_shopping_links_summary_off">Linkovi za kupovinu u opisu videa su prikazani</string>
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_view_products_banner_title">Sakrij baner „Pogledajte proizvode”</string>
<string name="revanced_hide_view_products_banner_summary_on">Baner za prikaz proizvoda u video plejeru je skriven</string>
<string name="revanced_hide_view_products_banner_summary_off">Baner za prikaz proizvoda u video plejeru je prikazan</string>
<string name="revanced_hide_view_products_banner_summary_on">Baner „Pogledajte proizvode” u video plejeru je skriven</string>
<string name="revanced_hide_view_products_banner_summary_off">Baner „Pogledajte proizvode” u video plejeru je prikazan</string>
<string name="revanced_hide_web_search_results_title">Sakrij rezultate veb-pretrage</string>
<string name="revanced_hide_web_search_results_summary_on">Rezultati veb-pretrage su skriveni</string>
<string name="revanced_hide_web_search_results_summary_off">Rezultati veb-pretrage su prikazani</string>
@@ -736,22 +736,22 @@ Da biste prikazali meni „Audio snimak”, promenite opciju „Lažirani video
<string name="revanced_shorts_player_screen_title">Shorts plejer</string>
<string name="revanced_shorts_player_screen_summary">Sakrijte ili prikažite komponente u Shorts plejeru</string>
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_hide_shorts_home_title">Sakrij Shorts u Početnom fidu</string>
<string name="revanced_hide_shorts_home_summary_on">Skriveno u Početnom fidu i srodnim video snimcima</string>
<string name="revanced_hide_shorts_home_summary_off">Prikazano u Početnom fidu i srodnim video snimcima</string>
<string name="revanced_hide_shorts_home_title">Sakrij Shorts u fidu „Početna”</string>
<string name="revanced_hide_shorts_home_summary_on">Skriveno u fidu „Početna” i srodnim videima</string>
<string name="revanced_hide_shorts_home_summary_off">Prikazano u fidu „Početna” i srodnim videima</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_hide_shorts_subscriptions_title">Sakrij Shorts u fidu Pretplate</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Skriveno u fidu Pretplate</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">Prikazano u fidu Pretplate</string>
<string name="revanced_hide_shorts_subscriptions_title">Sakrij Shorts u fidu Praćenja”</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Skriveno u fidu Praćenja”</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">Prikazano u fidu Praćenja”</string>
<string name="revanced_hide_shorts_search_title">Sakrij Shorts videe u rezultatima pretrage</string>
<string name="revanced_hide_shorts_search_summary_on">Skriveno u rezultatima pretrage</string>
<string name="revanced_hide_shorts_search_summary_off">Prikazano u rezultatima pretrage</string>
<string name="revanced_hide_shorts_history_title">Sakrij Shorts videe u istoriji gledanja</string>
<string name="revanced_hide_shorts_history_title">Sakrij Shorts u istoriji gledanja</string>
<string name="revanced_hide_shorts_history_summary_on">Skriveno u istoriji gledanja</string>
<string name="revanced_hide_shorts_history_summary_off">Prikazano u istoriji gledanja</string>
<string name="revanced_hide_shorts_super_thanks_button_title">Sakrij dugme za kupovinu „Superhvala”</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Dugme „Kupi Super Zahvalnost” je skriveno</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Dugme „Kupi Super Zahvalnost” je prikazano</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Dugme „Kupi superhvala” je skriveno</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Dugme „Kupi superhvala” je prikazano</string>
<string name="revanced_hide_shorts_effect_button_title">Sakrij dugme „Efekat”</string>
<string name="revanced_hide_shorts_effect_button_summary_on">Dugme „Efekat” je skriveno</string>
<string name="revanced_hide_shorts_effect_button_summary_off">Dugme „Efekat” je prikazano</string>
@@ -834,8 +834,8 @@ Da biste prikazali meni „Audio snimak”, promenite opciju „Lažirani video
<string name="revanced_hide_shorts_channel_bar_summary_on">Traka kanala je skrivena</string>
<string name="revanced_hide_shorts_channel_bar_summary_off">Traka kanala je prikazana</string>
<string name="revanced_hide_shorts_video_title_title">Sakrij naslov Shorts videa</string>
<string name="revanced_hide_shorts_video_title_summary_on">Naslov video snimka je skriven</string>
<string name="revanced_hide_shorts_video_title_summary_off">Naslov video snimka je prikazan</string>
<string name="revanced_hide_shorts_video_title_summary_on">Naslov videa je skriven</string>
<string name="revanced_hide_shorts_video_title_summary_off">Naslov videa je prikazan</string>
<string name="revanced_hide_shorts_sound_metadata_label_title">Sakrij oznaku metapodataka zvuka</string>
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Oznaka metapodataka zvuka je skrivena</string>
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Oznaka metapodataka zvuka je prikazana</string>
@@ -855,9 +855,9 @@ Podešavanja → Reprodukcija → Automatski pusti sledeći video"</string>
<string name="revanced_end_screen_suggested_video_summary_off">Predloženi video na završnom ekranu je prikazan</string>
</patch>
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
<string name="revanced_hide_related_videos_overlay_title">Sakrij preklop srodnih video snimaka</string>
<string name="revanced_hide_related_videos_overlay_summary_on">Preklop srodnih video snimaka u režimu celog ekrana je skriven</string>
<string name="revanced_hide_related_videos_overlay_summary_off">Preklop srodnih video snimaka u režimu celog ekrana je prikazan</string>
<string name="revanced_hide_related_videos_overlay_title">Sakrij srodne videe</string>
<string name="revanced_hide_related_videos_overlay_summary_on">Srodni videi u režimu celog ekrana su skriveni</string>
<string name="revanced_hide_related_videos_overlay_summary_off">Srodni videi u režimu celog ekrana su prikazani</string>
</patch>
<patch id="layout.hide.time.hideTimestampPatch">
<string name="revanced_hide_timestamp_title">Sakrij vremensku oznaku videa</string>
@@ -1323,10 +1323,10 @@ Ako ovo omogućite, mogu se popraviti nedostajuće slike koje su blokirane u nek
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_alt_thumbnail_home_title">Kartica „Početna”</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_alt_thumbnail_subscription_title">Kartica Pretplate</string>
<string name="revanced_alt_thumbnail_subscription_title">Kartica Praćenja”</string>
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (Library) tab. -->
<string name="revanced_alt_thumbnail_library_title">Kartica „Vi”</string>
<string name="revanced_alt_thumbnail_player_title">Plejliste plejera &amp; preporuke</string>
<string name="revanced_alt_thumbnail_player_title">Plejliste plejera i preporuke</string>
<string name="revanced_alt_thumbnail_search_title">Rezultati pretrage</string>
<string name="revanced_alt_thumbnail_options_entry_1">Originalne sličice</string>
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow i originalne sličice</string>
@@ -1543,7 +1543,7 @@ AVC ima maksimalnu rezoluciju od 1080p, audio kodek Opus nije dostupan, a reprod
<string name="revanced_block_video_ads_summary_off">Video oglasi su odblokirani</string>
</patch>
<patch id="chat.antidelete.showDeletedMessagesPatch">
<string name="revanced_deleted_msg">Poruka obrisana</string>
<string name="revanced_deleted_msg">Poruka izbrisana</string>
<string name="revanced_show_deleted_messages_title">Prikaz izbrisanih poruka</string>
<string name="revanced_show_deleted_messages_entry_1">Ne prikazuj izbrisane poruke</string>
<string name="revanced_show_deleted_messages_entry_2">Sakrij izbrisane poruke iza spojlera</string>

View File

@@ -178,7 +178,7 @@ Second \"item\" text"</string>
• Најрелевантније
• Куповина
• Гледајте поново"</string>
<string name="revanced_hide_horizontal_shelves_summary_off">Приказане су хоризонталне полице</string>
<string name="revanced_hide_horizontal_shelves_summary_off">Хоризонталне полице су приказане</string>
<string name="revanced_hide_image_shelf_title">Сакриј полицу са сликама</string>
<string name="revanced_hide_image_shelf_summary_on">Полица са сликама у резултатима претраге је скривена</string>
<string name="revanced_hide_image_shelf_summary_off">Полица са сликама у резултатима претраге је приказана</string>
@@ -208,13 +208,13 @@ Second \"item\" text"</string>
<string name="revanced_hide_ticket_shelf_summary_on">Полица са картама је скривена</string>
<string name="revanced_hide_ticket_shelf_summary_off">Полица са картама је приказана</string>
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
<string name="revanced_hide_video_recommendation_labels_title">Сакриј ознаке препоруке видеа</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">Ознаке „Људи су такође гледали” и „Можда ће вам се свидети” у резултатима претраге су скривене</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">Ознаке „Људи су такође гледали” и „Можда ће вам се свидети” у резултатима претраге су приказане</string>
<string name="revanced_hide_video_recommendation_labels_title">Сакриј ознаке препорука видеа</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">Ознаке „Други су такође гледали овај видео” и „Можда ће вам се такође допасти” у резултатима претраге су скривене</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">Ознаке „Други су такође гледали овај видео” и „Можда ће вам се такође допасти” у резултатима претраге су приказане</string>
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
<string name="revanced_hide_doodles_title">Сакриј YouTube Doodles</string>
<string name="revanced_hide_doodles_summary_on">Анимација YouTube Doodles-а на логоу је скривена</string>
<string name="revanced_hide_doodles_summary_off">YouTube Doodles анимација на логотипу је приказана</string>
<string name="revanced_hide_doodles_summary_on">Анимација YouTube Doodles-а на логотипу је скривена</string>
<string name="revanced_hide_doodles_summary_off">Анимација YouTube Doodles-а на логотипу је приказана</string>
<string name="revanced_hide_doodles_user_dialog_message">"YouTube Doodles се приказује неколико дана сваке године.
Ако се Doodle тренутно приказује у вашем региону и ова опција скривања је укључена, трака филтера испод траке за претрагу такође ће бити скривена."</string>
@@ -393,10 +393,10 @@ Second \"item\" text"</string>
<patch id="ad.general.hideAdsResourcePatch">
<string name="revanced_hide_creator_store_shelf_title">Сакриј полицу продавнице креатора</string>
<string name="revanced_hide_creator_store_shelf_summary_on">Полица продавнице креатора испод видео плејера је скривена</string>
<string name="revanced_hide_creator_store_shelf_summary_off">Полица продавнице аутора испод видео плејера је приказана</string>
<string name="revanced_hide_creator_store_shelf_summary_off">Полица продавнице креатора испод видео плејера је приказана</string>
<string name="revanced_hide_end_screen_store_banner_title">Сакриј банер продавнице на завршном екрану</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">Банер продавнице на крају екрана је скривен</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">Банер продавнице на крају екрана је приказан</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">Банер продавнице на завршном екрану је скривен</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">Банер продавнице на завршном екрану је приказан</string>
<string name="revanced_hide_fullscreen_ads_title">Сакриј огласе преко целог екрана</string>
<string name="revanced_hide_fullscreen_ads_summary_on">"Огласи преко целог екрана су скривени
@@ -421,8 +421,8 @@ Second \"item\" text"</string>
<string name="revanced_hide_shopping_links_summary_off">Линкови за куповину у опису видеа су приказани</string>
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_view_products_banner_title">Сакриј банер „Погледајте производе”</string>
<string name="revanced_hide_view_products_banner_summary_on">Банер „Прегледај производе” у видео преклапању је скривен</string>
<string name="revanced_hide_view_products_banner_summary_off">Банер „Прегледај производе” у видео преклапању је приказан</string>
<string name="revanced_hide_view_products_banner_summary_on">Банер „Погледајте производе” у видео плејеру је скривен</string>
<string name="revanced_hide_view_products_banner_summary_off">Банер „Погледајте производе” у видео плејеру је приказан</string>
<string name="revanced_hide_web_search_results_title">Сакриј резултате веб-претраге</string>
<string name="revanced_hide_web_search_results_summary_on">Резултати веб-претраге су скривени</string>
<string name="revanced_hide_web_search_results_summary_off">Резултати веб-претраге су приказани</string>
@@ -736,22 +736,22 @@ Second \"item\" text"</string>
<string name="revanced_shorts_player_screen_title">Shorts плејер</string>
<string name="revanced_shorts_player_screen_summary">Сакријте или прикажите компоненте у Shorts плејеру</string>
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_hide_shorts_home_title">Сакриј Shorts у почетном фиду</string>
<string name="revanced_hide_shorts_home_summary_on">Скривено у почетном фиду и сродним видео записима</string>
<string name="revanced_hide_shorts_home_summary_off">Приказано у почетном фиду и сродним видео записима</string>
<string name="revanced_hide_shorts_home_title">Сакриј Shorts у фиду „Почетна”</string>
<string name="revanced_hide_shorts_home_summary_on">Скривено у фиду „Почетна” и сродним видеима</string>
<string name="revanced_hide_shorts_home_summary_off">Приказано у фиду „Почетна” и сродним видеима</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_hide_shorts_subscriptions_title">Сакриј Shorts у фиду Претплате</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Скривено у фиду Претплате</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">Приказано у фиду Претплате</string>
<string name="revanced_hide_shorts_subscriptions_title">Сакриј Shorts у фиду Праћења”</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Скривено у фиду Праћења”</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">Приказано у фиду Праћења”</string>
<string name="revanced_hide_shorts_search_title">Сакриј Shorts видее у резултатима претраге</string>
<string name="revanced_hide_shorts_search_summary_on">Скривено у резултатима претраге</string>
<string name="revanced_hide_shorts_search_summary_off">Приказано у резултатима претраге</string>
<string name="revanced_hide_shorts_history_title">Сакриј Shorts видее у историји гледања</string>
<string name="revanced_hide_shorts_history_title">Сакриј Shorts у историји гледања</string>
<string name="revanced_hide_shorts_history_summary_on">Скривено у историји гледања</string>
<string name="revanced_hide_shorts_history_summary_off">Приказано у историји гледања</string>
<string name="revanced_hide_shorts_super_thanks_button_title">Сакриј дугме за куповину „Суперхвала”</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Дугме „Купи Супер Хвала” је скривено</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Дугме „Купи Супер Хвала” је приказано</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Дугме „Купи суперхвала” је скривено</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Дугме „Купи суперхвала” је приказано</string>
<string name="revanced_hide_shorts_effect_button_title">Сакриј дугме „Ефекат”</string>
<string name="revanced_hide_shorts_effect_button_summary_on">Дугме „Ефекат” је скривено</string>
<string name="revanced_hide_shorts_effect_button_summary_off">Дугме „Ефекат” је приказано</string>
@@ -855,9 +855,9 @@ Second \"item\" text"</string>
<string name="revanced_end_screen_suggested_video_summary_off">Предложени видео на завршном екрану је приказан</string>
</patch>
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
<string name="revanced_hide_related_videos_overlay_title">Сакриј преклапање сродних видео записа</string>
<string name="revanced_hide_related_videos_overlay_summary_on">Преклапање сродних видео записа у пуном екрану је скривено</string>
<string name="revanced_hide_related_videos_overlay_summary_off">Преклапање сродних видео записа у пуном екрану је приказано</string>
<string name="revanced_hide_related_videos_overlay_title">Сакриј сродне видее</string>
<string name="revanced_hide_related_videos_overlay_summary_on">Сродни видеи у режиму целог екрана су скривени</string>
<string name="revanced_hide_related_videos_overlay_summary_off">Сродни видеи у режиму целог екрана су приказани</string>
</patch>
<patch id="layout.hide.time.hideTimestampPatch">
<string name="revanced_hide_timestamp_title">Сакриј временску ознаку видеа</string>
@@ -1326,10 +1326,10 @@ Second \"item\" text"</string>
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_alt_thumbnail_home_title">Картица „Почетна”</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_alt_thumbnail_subscription_title">Картица Претплате</string>
<string name="revanced_alt_thumbnail_subscription_title">Картица Праћења”</string>
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (Library) tab. -->
<string name="revanced_alt_thumbnail_library_title">Картица „Ви”</string>
<string name="revanced_alt_thumbnail_player_title">Плејлисте плејера &amp; препоруке</string>
<string name="revanced_alt_thumbnail_player_title">Плејлисте плејера и препоруке</string>
<string name="revanced_alt_thumbnail_search_title">Резултати претраге</string>
<string name="revanced_alt_thumbnail_options_entry_1">Оригиналне сличице</string>
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow и оригиналне сличице</string>
@@ -1546,7 +1546,7 @@ AVC има максималну резолуцију од 1080p, аудио ко
<string name="revanced_block_video_ads_summary_off">Видео огласи су одблокирани</string>
</patch>
<patch id="chat.antidelete.showDeletedMessagesPatch">
<string name="revanced_deleted_msg">Порука обрисана</string>
<string name="revanced_deleted_msg">Порука избрисана</string>
<string name="revanced_show_deleted_messages_title">Приказ избрисаних порука</string>
<string name="revanced_show_deleted_messages_entry_1">Не приказуј избрисане поруке</string>
<string name="revanced_show_deleted_messages_entry_2">Сакриј избрисане поруке иза спојлера</string>

View File

@@ -52,24 +52,24 @@ Second \"item\" text"</string>
<string name="revanced_show_menu_icons_title">Visa ikoner för ReVanced-inställningar</string>
<string name="revanced_show_menu_icons_summary_on">Inställningsikoner visas</string>
<string name="revanced_show_menu_icons_summary_off">Ikoner för inställningar visas inte</string>
<string name="revanced_language_title">Språket för ReVanced</string>
<string name="revanced_language_title">Språk för ReVanced</string>
<string name="revanced_language_user_dialog_message">"Översättningar till vissa språk kan vara ofullständiga eller saknas.
För att översätta till nya språk besök translate.revanced.app"</string>
<string name="revanced_language_DEFAULT">Språk i app</string>
<string name="revanced_pref_import_export_title">Importera / Exportera</string>
<string name="revanced_pref_import_export_summary">Importera / Exportera ReVanced-inställningar</string>
<string name="revanced_language_DEFAULT">Appspråk</string>
<string name="revanced_pref_import_export_title">Importera/exportera</string>
<string name="revanced_pref_import_export_summary">Importera/exportera ReVanced-inställningar</string>
<!-- Settings about dialog. -->
<string name="revanced_settings_about_links_body">Du använder ReVanced Patches version &lt;i&gt;%s&lt;/i&gt;</string>
<string name="revanced_settings_about_links_dev_header">Anteckning</string>
<string name="revanced_settings_about_links_dev_body">Denna version är en pre-release och du kan uppleva oväntade problem</string>
<string name="revanced_settings_about_links_dev_header">Obs!</string>
<string name="revanced_settings_about_links_dev_body">Den här versionen är en förhandsversion och du kan uppleva oväntade problem</string>
<string name="revanced_settings_about_links_header">Officiella länkar</string>
<!-- NOTE: the about strings above are duplicated in the TikTok about screen code,
and changes made here must also be made there. -->
</patch>
<patch id="misc.gms.gmsCoreSupportResourcePatch">
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
<string name="gms_core_toast_not_installed_message">MicroG GmsCore är inte installerat. Installera den.</string>
<string name="gms_core_toast_not_installed_message">MicroG GmsCore är inte installerat. Installera det.</string>
<string name="gms_core_dialog_title">Åtgärd krävs</string>
<string name="gms_core_dialog_not_whitelisted_not_allowed_in_background_message">"MicroG GmsCore saknar behörighet att köras i bakgrunden.
@@ -95,7 +95,7 @@ Tryck på Fortsätt-knappen och tillåt optimeringsändringar."</string>
<string name="revanced_settings_screen_05_player_title">Spelare</string>
<string name="revanced_settings_screen_07_seekbar_title">Sökreglage</string>
<string name="revanced_settings_screen_08_swipe_controls_title">Svepkontroller</string>
<string name="revanced_settings_screen_11_misc_title">Diverse</string>
<string name="revanced_settings_screen_11_misc_title">Övrigt</string>
<string name="revanced_settings_screen_12_video_title">Video</string>
<string name="revanced_restore_old_settings_menus_title">Återställ gamla inställningsmenyer</string>
<string name="revanced_restore_old_settings_menus_summary_on">Gamla inställningsmenyer visas</string>
@@ -106,8 +106,8 @@ Tryck på Fortsätt-knappen och tillåt optimeringsändringar."</string>
</patch>
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
<string name="revanced_shorts_disable_background_playback_title">Inaktivera uppspelning av Shorts-videor i bakgrunden</string>
<string name="revanced_shorts_disable_background_playback_summary_on">Uppspelning av Shorts-videor i bakgrunden är inaktiverat</string>
<string name="revanced_shorts_disable_background_playback_summary_off">Uppspelning av Shorts-videor i bakgrunden är aktiverat</string>
<string name="revanced_shorts_disable_background_playback_summary_on">Uppspelning av Shorts-videor i bakgrunden är inaktiverad</string>
<string name="revanced_shorts_disable_background_playback_summary_off">Uppspelning av Shorts-videor i bakgrunden är aktiverad</string>
</patch>
<patch id="misc.debugging.enableDebuggingPatch">
<string name="revanced_debug_screen_title">Felsökning</string>
@@ -116,24 +116,24 @@ Tryck på Fortsätt-knappen och tillåt optimeringsändringar."</string>
<string name="revanced_debug_summary_on">Felsökningsloggar är aktiverade</string>
<string name="revanced_debug_summary_off">Felsökningsloggar är inaktiverade</string>
<string name="revanced_debug_protobuffer_title">Logga protokollbuffert</string>
<string name="revanced_debug_protobuffer_summary_on">Felsökningsloggar inkluderar protobuffert</string>
<string name="revanced_debug_protobuffer_summary_off">Felsökningsloggar inkluderar inte protobuffert</string>
<string name="revanced_debug_protobuffer_summary_on">Felsökningsloggar inkluderar protokollbuffert</string>
<string name="revanced_debug_protobuffer_summary_off">Felsökningsloggar inkluderar inte protokollbuffert</string>
<string name="revanced_debug_protobuffer_user_dialog_message">"Om du aktiverar den här inställningen loggas ytterligare layoutdata, inklusive text på skärmen för vissa UI-komponenter.
Detta kan hjälpa till att identifiera komponenter när du skapar anpassade filter.
Men om du aktiverar detta kommer även vissa användardata, t.ex. din IP-adress, att loggas."</string>
<string name="revanced_debug_stacktrace_title">Logga stackspår</string>
<string name="revanced_debug_stacktrace_summary_on">Felsökningsloggar inkluderar stackspår</string>
<string name="revanced_debug_stacktrace_summary_off">Felsökningsloggar inkluderar inte stackspår</string>
<string name="revanced_debug_toast_on_error_title">Visa ett meddelande om ett fel uppstår med ReVanced</string>
<string name="revanced_debug_toast_on_error_summary_on">Meddelande visas om fel uppstår</string>
<string name="revanced_debug_toast_on_error_summary_off">Meddelande visas inte om fel uppstår</string>
<string name="revanced_debug_toast_on_error_user_dialog_message">"Om du stänger av felmeddelanden döljs alla ReVanced-felmeddelanden.
<string name="revanced_debug_stacktrace_title">Logga stackspårning</string>
<string name="revanced_debug_stacktrace_summary_on">Felsökningsloggar inkluderar stackspårning</string>
<string name="revanced_debug_stacktrace_summary_off">Felsökningsloggar inkluderar inte stackspårning</string>
<string name="revanced_debug_toast_on_error_title">Visa ett popup-meddelande om det uppstår ett ReVanced-fel</string>
<string name="revanced_debug_toast_on_error_summary_on">Ett popup-meddelande visas om ett fel uppstår</string>
<string name="revanced_debug_toast_on_error_summary_off">Inget popup-meddelande visas om ett fel uppstår</string>
<string name="revanced_debug_toast_on_error_user_dialog_message">"Om du stänger av pupup-felmeddelanden döljs alla ReVanced-felmeddelanden.
Du kommer inte att bli meddelad om oväntade händelser."</string>
<string name="revanced_debug_export_logs_to_clipboard_title">Exportera felsökningsloggar</string>
<string name="revanced_debug_export_logs_to_clipboard_summary">Kopierar ReVanced-felsökningsloggar till Urklipp</string>
<string name="revanced_debug_export_logs_to_clipboard_summary">Kopierar ReVanced-felsökningsloggar till urklipp</string>
<string name="revanced_debug_logs_disabled">Felsökningsloggar är inaktiverade</string>
<string name="revanced_debug_logs_none_found">Inga loggar hittades</string>
<string name="revanced_debug_logs_copied_to_clipboard">Loggar kopierade</string>
@@ -144,11 +144,11 @@ Du kommer inte att bli meddelad om oväntade händelser."</string>
</patch>
<patch id="layout.hide.general.hideLayoutComponentsPatch">
<string name="revanced_hide_album_cards_title">Dölj albumkort</string>
<string name="revanced_hide_album_cards_summary_on">Skivkorten är dolda</string>
<string name="revanced_hide_album_cards_summary_off">Albumkort är synliga</string>
<string name="revanced_hide_album_cards_summary_on">Albumkort är dolda</string>
<string name="revanced_hide_album_cards_summary_off">Albumkort visas</string>
<string name="revanced_hide_artist_cards_title">Dölj artistkort</string>
<string name="revanced_hide_artist_cards_summary_on">Konstnärskort är dolda</string>
<string name="revanced_hide_artist_cards_summary_off">Artistkort är synliga</string>
<string name="revanced_hide_artist_cards_summary_on">Artistkort är dolda</string>
<string name="revanced_hide_artist_cards_summary_off">Artistkort visas</string>
<string name="revanced_hide_chips_shelf_title">Dölj chip-hylla</string>
<string name="revanced_hide_chips_shelf_summary_on">Chip-hyllan är dold</string>
<string name="revanced_hide_chips_shelf_summary_off">Chip-hyllan visas</string>
@@ -161,17 +161,17 @@ Du kommer inte att bli meddelad om oväntade händelser."</string>
<string name="revanced_hide_crowdfunding_box_title">Dölj insamlingsrutan</string>
<string name="revanced_hide_crowdfunding_box_summary_on">Insamlingsrutan är dold</string>
<string name="revanced_hide_crowdfunding_box_summary_off">Insamlingsrutan visas</string>
<string name="revanced_hide_expandable_card_title">Dölj utökbart kort</string>
<string name="revanced_hide_expandable_card_summary_on">Utökbart kort under videor är dolt</string>
<string name="revanced_hide_expandable_card_summary_off">Utökbart kort under videor visas</string>
<string name="revanced_hide_expandable_card_title">Dölj expanderbart kort</string>
<string name="revanced_hide_expandable_card_summary_on">Expanderbart kort under videor är dolt</string>
<string name="revanced_hide_expandable_card_summary_off">Expanderbart kort under videor visas</string>
<string name="revanced_hide_feed_survey_title">Dölj enkäter i flödet</string>
<string name="revanced_hide_feed_survey_summary_on">Enkäter i flödet är dolda</string>
<string name="revanced_hide_feed_survey_summary_off">Enkäter i flödet visas</string>
<string name="revanced_hide_floating_microphone_button_title">Dölj svävande mikrofonknapp</string>
<string name="revanced_hide_floating_microphone_button_title">Dölj flytande mikrofonknapp</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Flytande mikrofonknapp i sökning är dold</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Flytande mikrofonknapp i sökning visas</string>
<string name="revanced_hide_horizontal_shelves_title">Dölj horisontella hyllor</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Hyllor är dolda, till exempel:
<string name="revanced_hide_horizontal_shelves_summary_on">"Horisontella hyllor är dolda, till exempel:
• Senaste nytt
• Fortsätt titta
• Utforska fler kanaler
@@ -196,25 +196,25 @@ Du kommer inte att bli meddelad om oväntade händelser."</string>
<string name="revanced_hide_notify_me_button_title">Dölj knappen \"Meddela mig\"</string>
<string name="revanced_hide_notify_me_button_summary_on">Knappen Meddela mig är dold</string>
<string name="revanced_hide_notify_me_button_summary_off">Knappen Meddela mig visas</string>
<string name="revanced_hide_playables_title">Dölj Playables</string>
<string name="revanced_hide_playables_summary_on">Playables är dolda</string>
<string name="revanced_hide_playables_summary_off">Spelbara är synliga</string>
<string name="revanced_hide_playables_title">Dölj Spelhörna</string>
<string name="revanced_hide_playables_summary_on">Spelhörna är dold</string>
<string name="revanced_hide_playables_summary_off">Spelhörna visas</string>
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
This button usually appears when searching for a YT creator. -->
<string name="revanced_hide_show_more_button_title">Dölj knappen \"Visa mer\"</string>
<string name="revanced_hide_show_more_button_title">Dölj knappen Visa mer</string>
<string name="revanced_hide_show_more_button_summary_on">Knappen Visa mer i sökresultat är dold</string>
<string name="revanced_hide_show_more_button_summary_off">Knappen Visa mer i sökresultat visas</string>
<string name="revanced_hide_ticket_shelf_title">Dölj biljetthylla</string>
<string name="revanced_hide_ticket_shelf_summary_on">Biljettpanelen är dold</string>
<string name="revanced_hide_ticket_shelf_summary_off">Biljettpanelen visas</string>
<string name="revanced_hide_ticket_shelf_summary_on">Biljetthyllan är dold</string>
<string name="revanced_hide_ticket_shelf_summary_off">Biljetthyllan visas</string>
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
<string name="revanced_hide_video_recommendation_labels_title">Dölj etiketter för videorekommendationer</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">Etiketter för \"Andra har även tittat på\" och \"Du kanske även gillar\" i sökresultaten är dolda</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">Etiketter för \"Andra har även tittat på\" och \"Du kanske även gillar\" i sökresultaten visas</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">\"Andra har även tittat på\"- och \"Du kanske även gillar\"-etiketterna i sökresultaten är dolda</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">\"Andra har även tittat på\"- och \"Du kanske även gillar\"-etiketterna i sökresultaten visas</string>
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
<string name="revanced_hide_doodles_title">Dölj YouTube-doodles</string>
<string name="revanced_hide_doodles_summary_on">YouTube Doodles-animation på logotypen är dold</string>
<string name="revanced_hide_doodles_summary_off">YouTube Doodles-animering på logotypen visas</string>
<string name="revanced_hide_doodles_summary_on">YouTube-doodles-animation på logotypen är dold</string>
<string name="revanced_hide_doodles_summary_off">YouTube-doodles-animering på logotypen visas</string>
<string name="revanced_hide_doodles_user_dialog_message">"YouTube-doodles visas några dagar varje år.
Om en doodle visas för närvarande i din region och den här döljningsinställningen är på, kommer filterfältet under sökfältet också att döljas."</string>
@@ -278,30 +278,30 @@ Om en doodle visas för närvarande i din region och den här döljningsinställ
<string name="revanced_hide_transcript_section_summary_on">Avsnittet Manuskript är dolt</string>
<string name="revanced_hide_transcript_section_summary_off">Avsnittet Manuskript visas</string>
<string name="revanced_hide_description_components_screen_title">Videobeskrivning</string>
<string name="revanced_hide_description_components_screen_summary">Dölj eller visa videobeskrivningskomponenter</string>
<string name="revanced_hide_description_components_screen_summary">Dölj eller visa komponenter i videobeskrivningen</string>
<string name="revanced_hide_filter_bar_screen_title">Filterfält</string>
<string name="revanced_hide_filter_bar_screen_summary">Dölj eller visa filterfältet i flödena, historiken, sökresultaten och relaterade videor</string>
<string name="revanced_hide_filter_bar_screen_summary">Dölj eller visa filterfältet i flödena, historiken, sökresultaten och liknande videor</string>
<string name="revanced_hide_filter_bar_feed_in_feed_title">Dölj i flöden</string>
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Dold i flöden</string>
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Dolt i flöden</string>
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">Visas i flöden</string>
<string name="revanced_hide_filter_bar_feed_in_history_title">Dölj i historik</string>
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Dold i historik</string>
<string name="revanced_hide_filter_bar_feed_in_history_summary_on">Dolt i historik</string>
<string name="revanced_hide_filter_bar_feed_in_history_summary_off">Visas i historik</string>
<string name="revanced_hide_filter_bar_feed_in_search_title">Dölj i sökresultat</string>
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Dold i sökresultat</string>
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Dolt i sökresultat</string>
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">Visas i sökresultat</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_title">Dölj i relaterade videor</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_on">Dold i relaterade videor</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_off">Visas i relaterade videor</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_title">Dölj i liknande videor</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_on">Dolt i liknande videor</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_off">Visas i liknande videor</string>
<string name="revanced_channel_screen_title">Kanalsida</string>
<string name="revanced_channel_screen_summary">Dölj eller visa komponenter på kanalsidan</string>
<!-- 'For You' should be translated using the same localized wording YouTube displays. -->
<string name="revanced_hide_for_you_shelf_title">Dölj hyllan \"För dig\"</string>
<string name="revanced_hide_for_you_shelf_summary_on">Hyllan \"För dig\" är dold</string>
<string name="revanced_hide_for_you_shelf_summary_off">Hyllan \"För dig\" visas</string>
<string name="revanced_hide_links_preview_title">Dölj förhandsvisning av länkar</string>
<string name="revanced_hide_links_preview_summary_on">Förhandsvisning av länkar är dold</string>
<string name="revanced_hide_links_preview_summary_off">Förhandsvisning av länkar visas</string>
<string name="revanced_hide_for_you_shelf_summary_on">Hyllan För dig är dold</string>
<string name="revanced_hide_for_you_shelf_summary_off">Hyllan För dig visas</string>
<string name="revanced_hide_links_preview_title">Dölj förhandsgranskning av länkar</string>
<string name="revanced_hide_links_preview_summary_on">Förhandsgranskning av länkar är dold</string>
<string name="revanced_hide_links_preview_summary_off">Förhandsgranskning av länkar visas</string>
<string name="revanced_hide_members_shelf_title">Dölj medlemshylla</string>
<string name="revanced_hide_members_shelf_summary_on">Medlemshyllan är dold</string>
<string name="revanced_hide_members_shelf_summary_off">Medlemshyllan visas</string>
@@ -677,7 +677,7 @@ Om du ändrar den här inställningen och det inte får effekt kan du försöka
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
<string name="revanced_hide_player_flyout_audio_track_not_available">"Ljudspårsmenyn är dold
För att visa ljudspårsmenyn, ändra \"Spoof video streams\" till iOS TV"</string>
För att visa ljudspårsmenyn, ändra \"Förfalska videoströmmar\" till iOS TV"</string>
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
<string name="revanced_hide_player_flyout_watch_in_vr_title">Dölj Titta i VR</string>
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Menyn Titta i VR är dold</string>
@@ -972,11 +972,11 @@ Den här funktionen fungerar bäst med en videokvalitet på 720p eller lägre oc
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Hoppa över-knappen visas för hela segmentet</string>
<string name="revanced_sb_auto_hide_skip_button_duration">Varaktighet för Hoppa över-knappen</string>
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Hur länge knappen för att hoppa över och hoppa till höjdpunkt ska visas innan den döljs automatiskt</string>
<string name="revanced_sb_general_skiptoast">Visa toastmeddelande för ångra överhoppning</string>
<string name="revanced_sb_general_skiptoast_sum_on">Meddelande visas när ett segment hoppas över automatiskt. Tryck på toastmeddelandet för att ångra överhoppningen</string>
<string name="revanced_sb_general_skiptoast">Visa popup-meddelande för att ångra överhoppning</string>
<string name="revanced_sb_general_skiptoast_sum_on">Popup-meddelande visas när ett segment hoppas över automatiskt. Tryck på popup-meddelandet för att ångra överhoppningen</string>
<string name="revanced_sb_general_skiptoast_sum_off">Toastmeddelande visas inte</string>
<string name="revanced_sb_toast_on_skip_duration">Varaktighet för överhoppningstoastmeddelande</string>
<string name="revanced_sb_toast_on_skip_duration_sum">Hur länge toast-meddelandet för ångra överhoppning ska visas</string>
<string name="revanced_sb_toast_on_skip_duration">Varaktighet för överhoppningsmeddelande</string>
<string name="revanced_sb_toast_on_skip_duration_sum">Hur länge popup-meddelandet för att ångra överhoppning ska visas</string>
<string name="revanced_sb_duration_1s">1 sekund</string>
<string name="revanced_sb_duration_2s">2 sekunder</string>
<string name="revanced_sb_duration_3s">3 sekunder</string>
@@ -1023,7 +1023,7 @@ Den här funktionen fungerar bäst med en videokvalitet på 720p eller lägre oc
<string name="revanced_sb_api_url_changed">API-webbadress ändrades</string>
<string name="revanced_sb_settings_ie">Importera/exportera inställningar</string>
<string name="revanced_sb_settings_copy">Kopiera</string>
<string name="revanced_sb_settings_ie_sum">Din SponsorBlock JSON-konfiguration som kan importeras/exporteras till ReVanced och andra SponsorBlock plattformar</string>
<string name="revanced_sb_settings_ie_sum">Din JSON-konfiguration för SponsorBlock som kan importeras/exporteras till ReVanced och andra SponsorBlock-plattformar</string>
<string name="revanced_sb_settings_ie_sum_warning">Din JSON-konfiguration för SponsorBlock som kan importeras/exporteras till ReVanced och andra SponsorBlock-plattformar. Detta inkluderar ditt privata användar-id. Se till att dela detta klokt</string>
<string name="revanced_sb_settings_import_successful">Inställningar har importerats</string>
<string name="revanced_sb_settings_import_failed">Det gick inte att importera: %s</string>
@@ -1112,7 +1112,7 @@ Redan finns"</string>
<string name="revanced_sb_new_segment_disabled_category">Kategorin är inaktiverad i inställningar. Aktivera kategori för att skicka.</string>
<string name="revanced_sb_new_segment_title">Nytt Sponsorblock-segment</string>
<string name="revanced_sb_new_segment_mark_time_as_question">Ange %s som början eller slutet av ett nytt segment?</string>
<string name="revanced_sb_new_segment_mark_start">Start</string>
<string name="revanced_sb_new_segment_mark_start">Början</string>
<string name="revanced_sb_new_segment_mark_end">Slut</string>
<string name="revanced_sb_new_segment_now">Nu</string>
<string name="revanced_sb_new_segment_time_start">Tid då segmentet börjar på</string>
@@ -1176,7 +1176,7 @@ Billayout
• Flödet ordnas efter ämnen och kanaler"</string>
</patch>
<patch id="layout.spoofappversion.spoofAppVersionPatch">
<string name="revanced_spoof_app_version_title">Spoof app-version</string>
<string name="revanced_spoof_app_version_title">Förfalska appversionen</string>
<string name="revanced_spoof_app_version_summary_on">Version förfalskad</string>
<string name="revanced_spoof_app_version_summary_off">Version inte förfalskad</string>
<string name="revanced_spoof_app_version_user_dialog_message">"Appversionen kommer att förfalskas till en äldre version av YouTube.
@@ -1186,7 +1186,7 @@ Detta kommer att ändra utseendet och funktionerna i appen, men okända bieffekt
Om det senare stängs av rekommenderas det att rensa appens data för att förhindra UI-buggar."</string>
<!-- It is ideal, but not required, if the text here appears is alphabetically after the text used for 'revanced_spoof_app_version_title'.
This is because the 'General layout' menu uses alphabetic sorting, and it functionally works better if the spoof target selector appears below the 'Spoof app version' UI switch. -->
<string name="revanced_spoof_app_version_target_title">Spoof app-versionsmål</string>
<string name="revanced_spoof_app_version_target_title">Mål för Förfalska appversionen</string>
<string name="revanced_spoof_app_version_target_entry_1">19.35.36 - Återställ gamla ikoner i Shorts-spelaren</string>
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - Återställ gamla navigeringsikoner</string>
</patch>
@@ -1216,8 +1216,8 @@ Om det senare stängs av rekommenderas det att rensa appens data för att förhi
<string name="revanced_change_start_page_entry_virtual_reality">Virtuell verklighet</string>
<string name="revanced_change_start_page_entry_watch_later">Titta senare</string>
<string name="revanced_change_start_page_entry_your_clips">Dina klipp</string>
<string name="revanced_change_start_page_always_title">Ändra alltid startsida</string>
<string name="revanced_change_start_page_always_summary_on">"Startsidan ändras alltid
<string name="revanced_change_start_page_always_title">Byt alltid startsida</string>
<string name="revanced_change_start_page_always_summary_on">"Startsidan byts alltid
Begränsning: Bakåtknappen i verktygsfältet kanske inte fungerar"</string>
<string name="revanced_change_start_page_always_summary_off">Startsidan ändras endast vid appstart</string>
@@ -1313,25 +1313,25 @@ Minispelaren kan dras utanför skärmen till vänster eller höger"</string>
<string name="revanced_header_logo_entry_6">Anpassad</string>
</patch>
<patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch">
<string name="revanced_bypass_image_region_restrictions_title">Begränsningar för förbipassering av bildregionen</string>
<string name="revanced_bypass_image_region_restrictions_summary_on">Använder bildvärd yt4.ggpht.com</string>
<string name="revanced_bypass_image_region_restrictions_summary_off">"Använder originalbildvärd
<string name="revanced_bypass_image_region_restrictions_title">Kringgå regionsbegränsningar för bilder</string>
<string name="revanced_bypass_image_region_restrictions_summary_on">Använder bildvärden yt4.ggpht.com</string>
<string name="revanced_bypass_image_region_restrictions_summary_off">"Använder ursprunglig bildvärd
Att aktivera detta kan åtgärda saknade bilder som är blockerade i vissa regioner"</string>
Om du aktiverar detta kan det åtgärda saknade bilder som blockeras i vissa regioner"</string>
</patch>
<patch id="layout.thumbnails.alternativeThumbnailsPatch">
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_alt_thumbnail_home_title">Hemflik</string>
<string name="revanced_alt_thumbnail_home_title">Fliken Hem</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_alt_thumbnail_subscription_title">Fliken Prenumerationer</string>
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (Library) tab. -->
<string name="revanced_alt_thumbnail_library_title">Du flik</string>
<string name="revanced_alt_thumbnail_player_title">Spelarlistor &amp; rekommendationer för spelare</string>
<string name="revanced_alt_thumbnail_library_title">Fliken Ditt YouTube</string>
<string name="revanced_alt_thumbnail_player_title">Spellistor och rekommendationer i spelaren</string>
<string name="revanced_alt_thumbnail_search_title">Sökresultat</string>
<string name="revanced_alt_thumbnail_options_entry_1">Miniatyr original</string>
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow &amp; Original miniatyrer</string>
<string name="revanced_alt_thumbnail_options_entry_3">DeArrow &amp; fångar fortfarande</string>
<string name="revanced_alt_thumbnail_options_entry_4">Fortfarande fångar</string>
<string name="revanced_alt_thumbnail_options_entry_1">Ursprungliga miniatyrer</string>
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow och ursprungliga miniatyrer</string>
<string name="revanced_alt_thumbnail_options_entry_3">DeArrow och stillbilder</string>
<string name="revanced_alt_thumbnail_options_entry_4">Stillbilder</string>
<string name="revanced_alt_thumbnail_dearrow_about_summary">"DeArrow tillhandahåller crowdsourcing-baserade miniatyrbilder för YouTube-videor. Dessa miniatyrbilder är ofta mer relevanta än de som tillhandahålls av YouTube
Om detta aktiveras skickas videoadresser till API-servern och inga andra data skickas. Om en video inte har DeArrow-miniatyrer visas originalet eller stillbilder
@@ -1341,9 +1341,9 @@ Tryck här för att läsa mer om DeArrow"</string>
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_on">Meddelande visas om DeArrow inte är tillgängligt</string>
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_off">Meddelande visas inte om DeArrow inte är tillgängligt</string>
<string name="revanced_alt_thumbnail_dearrow_api_url_title">DeArrow API-slutpunkt</string>
<string name="revanced_alt_thumbnail_dearrow_api_url_summary">URL till DeArrow miniatyrbilds slutpunkt</string>
<string name="revanced_alt_thumbnail_stills_about_title">Fortfarande videoinspelningar</string>
<string name="revanced_alt_thumbnail_stills_about_summary">Fortfarande tas bilder från början/mitten/slutet av varje video. Dessa bilder är inbyggda i YouTube och ingen extern API används</string>
<string name="revanced_alt_thumbnail_dearrow_api_url_summary">DeArrow-miniatyrcacheminnets slutpunktsadress</string>
<string name="revanced_alt_thumbnail_stills_about_title">Stillbilder från videor</string>
<string name="revanced_alt_thumbnail_stills_about_summary">Stillbilder tas från början/mitten/slutet av varje video. Dessa bilder är inbyggda i YouTube och inget externt API används</string>
<string name="revanced_alt_thumbnail_stills_fast_title">Använd snabbt stillbilder</string>
<string name="revanced_alt_thumbnail_stills_fast_summary_on">Använda medelhög kvalitet fortfarande fångar. Miniatyrer kommer att ladda snabbare, men levande strömmar, outgivna eller mycket gamla videor kan visa tomma miniatyrer</string>
<string name="revanced_alt_thumbnail_stills_fast_summary_off">Använda hög kvalitet fortfarande fångar</string>
@@ -1374,14 +1374,14 @@ Tryck här för att läsa mer om DeArrow"</string>
<string name="revanced_auto_repeat_summary_off">Automatisk upprepning är inaktiverad</string>
</patch>
<patch id="misc.dimensions.spoof.spoofDeviceDimensionsPatch">
<string name="revanced_spoof_device_dimensions_title">Enhetsdimensioner för Spoof</string>
<string name="revanced_spoof_device_dimensions_summary_on">"Enhetens dimensioner förfalskas
<string name="revanced_spoof_device_dimensions_title">Förfalska enhetens mått</string>
<string name="revanced_spoof_device_dimensions_summary_on">"Enhetens mått förfalskas
Högre videokvalitet kan låsas upp men du kan uppleva hackig videouppspelning, sämre batteritid och okända bieffekter"</string>
<string name="revanced_spoof_device_dimensions_summary_off">"Enhetens dimensioner förfalskas inte
Högre videokvaliteter kan låsas upp men du kan uppleva hackig videouppspelning, sämre batteritid och okända bieffekter"</string>
<string name="revanced_spoof_device_dimensions_summary_off">"Enhetens mått förfalskas inte
Att aktivera detta kan låsa upp högre videokvalitet"</string>
<string name="revanced_spoof_device_dimensions_user_dialog_message">Att aktivera detta kan orsaka uppspelning av videouppspelning, sämre batteritid och okända biverkningar.</string>
Om du aktiverar detta kan högre videokvaliteter låsas upp"</string>
<string name="revanced_spoof_device_dimensions_user_dialog_message">Om du aktiverar detta kan det leda till hackig videouppspelning, sämre batteritid och okända biverkningar.</string>
</patch>
<patch id="misc.gms.gmsCoreSupportResourcePatch">
<string name="microg_settings_title">GmsCore inställningar</string>
@@ -1396,9 +1396,9 @@ Att aktivera detta kan låsa upp högre videokvalitet"</string>
<string name="revanced_disable_haptic_feedback_precise_seeking_title">Inaktivera haptik för exakt sökning</string>
<string name="revanced_disable_haptic_feedback_precise_seeking_summary_on">Haptik för exakt sökning är inaktiverad</string>
<string name="revanced_disable_haptic_feedback_precise_seeking_summary_off">Haptik för exakt sökning är aktiverad</string>
<string name="revanced_disable_haptic_feedback_seek_undo_title">Inaktivera ångra-sökning haptik</string>
<string name="revanced_disable_haptic_feedback_seek_undo_summary_on">Ångra-sökning haptik är inaktiverad</string>
<string name="revanced_disable_haptic_feedback_seek_undo_summary_off">Ångra-sökning haptik är aktiverad</string>
<string name="revanced_disable_haptic_feedback_seek_undo_title">Inaktivera haptik för att ångra sökning</string>
<string name="revanced_disable_haptic_feedback_seek_undo_summary_on">Haptik för att ångra sökning är inaktiverad</string>
<string name="revanced_disable_haptic_feedback_seek_undo_summary_off">Haptik för att ångra sökning är aktiverad</string>
<string name="revanced_disable_haptic_feedback_zoom_title">Inaktivera zoomhaptik</string>
<string name="revanced_disable_haptic_feedback_zoom_summary_on">Zoomhaptik är inaktiverad</string>
<string name="revanced_disable_haptic_feedback_zoom_summary_off">Zoomhaptik är aktiverad</string>
@@ -1407,9 +1407,9 @@ Att aktivera detta kan låsa upp högre videokvalitet"</string>
<string name="microg_offline_account_login_error">Om du nyligen har ändrat dina inloggningsuppgifter, avinstallera och installera om MicroG.</string>
</patch>
<patch id="misc.links.bypassURLRedirectsPatch">
<string name="revanced_bypass_url_redirects_title">Bypass URL omdirigerar</string>
<string name="revanced_bypass_url_redirects_summary_on">URL-omdirigeringar förbigås</string>
<string name="revanced_bypass_url_redirects_summary_off">URL-omdirigeringar förbigås inte</string>
<string name="revanced_bypass_url_redirects_title">Hoppa över webbadressomdirigeringar</string>
<string name="revanced_bypass_url_redirects_summary_on">Webbadressomdirigeringar hoppas över</string>
<string name="revanced_bypass_url_redirects_summary_off">Webbadressomdirigeringar hoppas inte över</string>
</patch>
<patch id="misc.links.openLinksExternallyPatch">
<string name="revanced_external_browser_title">Öppna länkar i webbläsaren</string>
@@ -1422,11 +1422,11 @@ Att aktivera detta kan låsa upp högre videokvalitet"</string>
<string name="revanced_remove_tracking_query_parameter_summary_off">Spårnings frågeparameter har inte tagits bort från länkar</string>
</patch>
<patch id="video.audio.forceOriginalAudioPatch">
<string name="revanced_force_original_audio_title">Forcera originalljudspråk</string>
<string name="revanced_force_original_audio_title">Tvinga fram ursprungligt ljudspråk</string>
<string name="revanced_force_original_audio_summary_on">Använder originalljudspråk</string>
<string name="revanced_force_original_audio_summary_off">Använder standardljud</string>
<!-- 'Spoof video streams' should be the same translation used for 'revanced_spoof_video_streams_screen_title'. -->
<string name="revanced_force_original_audio_not_available">För att använda den här funktionen, ändra \"Förfalska videoströmmar\" till iOS TV</string>
<string name="revanced_force_original_audio_not_available">Om du vill använda den här funktionen ändrar du \"Förfalska videoströmmar\" till iOS TV</string>
</patch>
<patch id="video.quality.rememberVideoQualityPatch">
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
@@ -1492,35 +1492,35 @@ Att aktivera detta kan låsa upp högre videokvalitet"</string>
<string name="revanced_slide_to_seek_summary_off">Dra för att söka är inaktiverat</string>
</patch>
<patch id="misc.fix.playback.spoofVideoStreamsPatch">
<string name="revanced_spoof_video_streams_screen_title">Spoof videoströmmar</string>
<string name="revanced_spoof_video_streams_screen_summary">Spoof klientens videoströmmar för att förhindra uppspelningsproblem</string>
<string name="revanced_spoof_video_streams_title">Spoof videoströmmar</string>
<string name="revanced_spoof_video_streams_screen_title">Förfalska videoströmmar</string>
<string name="revanced_spoof_video_streams_screen_summary">Förfalska klientens videoströmmar för att förhindra uppspelningsproblem</string>
<string name="revanced_spoof_video_streams_title">Förfalska videoströmmar</string>
<string name="revanced_spoof_video_streams_summary_on">Videoströmmar är förfalskade</string>
<string name="revanced_spoof_video_streams_summary_off">"Videoströmmar förfalskas inte
Videouppspelning kanske inte fungerar"</string>
<string name="revanced_spoof_video_streams_user_dialog_message">Att stänga av den här inställningen kan orsaka videouppspelningsproblem.</string>
<string name="revanced_spoof_video_streams_client_type_title">Standard klient</string>
<string name="revanced_spoof_video_streams_ios_force_avc_title">Tvinga iOS AVC (H.264)</string>
<string name="revanced_spoof_video_streams_user_dialog_message">Om du stänger av den här inställningen kan det leda till problem med videouppspelning.</string>
<string name="revanced_spoof_video_streams_client_type_title">Standardklient</string>
<string name="revanced_spoof_video_streams_ios_force_avc_title">Tvinga fram iOS AVC (H.264)</string>
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">Videokodek tvingas till AVC (H.264)</string>
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">Videokodeken bestäms automatiskt</string>
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">"Att aktivera detta kan förbättra batteritiden och åtgärda hackande uppspelning.
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">"Om du aktiverar detta kan det förbättra batteritiden och åtgärda hackig uppspelning.
AVC har en maximal upplösning på 1080p, Opus-ljudkodek är inte tillgänglig och videouppspelning använder mer internetdata än VP9 eller AV1."</string>
AVC har en maximal upplösning på 1080p, Opus-ljudkodek är inte tillgängligt och videouppspelning använder mer internetdata än VP9 eller AV1."</string>
<string name="revanced_spoof_video_streams_about_ios_tv_title">Biverkningar av iOS-förfalskning</string>
<string name="revanced_spoof_video_streams_about_ios_tv_summary">"• Filmer eller betalvideor kanske inte spelas upp
• Jämn volym är inte tillgängligt
• Jämn volym är inte tillgänglig
• Videor slutar 1 sekund för tidigt"</string>
<string name="revanced_spoof_video_streams_about_android_title">Biverkningar av Android-förfalskning</string>
<string name="revanced_spoof_video_streams_about_android_summary">"• Ljudspårsmenyn saknas
Stabilt ljud är inte tillgängligt
• Tvinga originalspråk är inte tillgängligt"</string>
<string name="revanced_spoof_video_streams_about_no_av1">• Ingen AV1-videocodec</string>
<string name="revanced_spoof_video_streams_about_kids_videos">• Videor för barn spelas möglicherweise nicht ab, wenn Sie abgemeldet sind oder sich im Inkognito-Modus befinden</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">Visa i statistik för nördar</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">Klienttyp visas i statistik för nördar</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">Klienten är dold i statistik för nördar</string>
<string name="revanced_spoof_video_streams_language_title">VR standardinställningsspråk för ljudström</string>
Jämn volym är inte tillgänglig
• Tvinga fram ursprungligt ljud är inte tillgängligt"</string>
<string name="revanced_spoof_video_streams_about_no_av1">• Ingen AV1-videokodek</string>
<string name="revanced_spoof_video_streams_about_kids_videos">• Videor för barn kanske inte spelas upp när du är utloggad eller i inkognitoläge</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">Visa i Statistik för nördar</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">Klienttypen visas i Statistik för nördar</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">Klienten är dold i Statistik för nördar</string>
<string name="revanced_spoof_video_streams_language_title">Standardspråk för VR-ljudström</string>
</patch>
</app>
<app id="twitch">

View File

@@ -167,11 +167,11 @@ Second \"item\" text"</string>
<string name="revanced_hide_feed_survey_title">Приховати опитування</string>
<string name="revanced_hide_feed_survey_summary_on">Опитування в стрічці приховано</string>
<string name="revanced_hide_feed_survey_summary_off">Опитування в стрічці показуються</string>
<string name="revanced_hide_floating_microphone_button_title">Приховати кнопку мікрофона</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Кнопку плаваючого мікрофона в пошуку приховано</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Плавальна кнопка мікрофона у пошуку відображається</string>
<string name="revanced_hide_floating_microphone_button_title">Приховати плаваючу кнопку мікрофона</string>
<string name="revanced_hide_floating_microphone_button_summary_on">Плаваючу кнопку мікрофона в пошуку приховано</string>
<string name="revanced_hide_floating_microphone_button_summary_off">Плаваюча кнопка мікрофона в пошуку показується</string>
<string name="revanced_hide_horizontal_shelves_title">Приховати горизонтальні полиці</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"Приховано такі полиці:
<string name="revanced_hide_horizontal_shelves_summary_on">"Горизонтальні полиці приховано:
• Гарячі новини
• Продовжити перегляд
• Переглянути більше каналів
@@ -193,31 +193,31 @@ Second \"item\" text"</string>
<string name="revanced_hide_movies_section_summary_off">Секція фільмів показується</string>
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
This item appear in the subscription feed for future livestreams or unreleased videos. -->
<string name="revanced_hide_notify_me_button_title">Приховати кнопку \"Сповістити\"</string>
<string name="revanced_hide_notify_me_button_summary_on">Кнопку \</string>
<string name="revanced_hide_notify_me_button_summary_off">Кнопка \</string>
<string name="revanced_hide_notify_me_button_title">Приховати кнопку \"Сповістити мене\"</string>
<string name="revanced_hide_notify_me_button_summary_on">Кнопку \"Сповістити мене\" приховано</string>
<string name="revanced_hide_notify_me_button_summary_off">Кнопка \"Сповістити мене\" показується</string>
<string name="revanced_hide_playables_title">Приховати \"Ігрову кімнату\"</string>
<string name="revanced_hide_playables_summary_on">Розділ \"Ігрова кімната\" приховано</string>
<string name="revanced_hide_playables_summary_off">Розділ \"Ігрова кімната\" показується</string>
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
This button usually appears when searching for a YT creator. -->
<string name="revanced_hide_show_more_button_title">Приховати кнопку \"Показати більше\"</string>
<string name="revanced_hide_show_more_button_summary_on">Кнопку \</string>
<string name="revanced_hide_show_more_button_summary_off">Кнопка \</string>
<string name="revanced_hide_show_more_button_summary_on">Кнопку \"Показати більше\" у результатах пошуку приховано</string>
<string name="revanced_hide_show_more_button_summary_off">Кнопка \"Показати більше\" у результатах пошуку показується</string>
<string name="revanced_hide_ticket_shelf_title">Приховати полицю квитків</string>
<string name="revanced_hide_ticket_shelf_summary_on">Полицю квитків приховано</string>
<string name="revanced_hide_ticket_shelf_summary_off">Полиця квитків показується</string>
<!-- 'People also watched' and 'You might also like' should be translated using the same localized wording YouTube displays. -->
<string name="revanced_hide_video_recommendation_labels_title">Приховати мітки відеорекомендацій</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">Мітки \</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">Мітки \</string>
<string name="revanced_hide_video_recommendation_labels_summary_on">Мітки \"Інші користувачі також переглядали це відео\" та \"Вам також може сподобатися\" у результатах пошуку приховано</string>
<string name="revanced_hide_video_recommendation_labels_summary_off">Мітки \"Інші користувачі також переглядали це відео\" та \"Вам також може сподобатися\" у результатах пошуку показуються</string>
<!-- https://logos.fandom.com/wiki/YouTube/Yoodles -->
<string name="revanced_hide_doodles_title">Приховати YouTube Doodles</string>
<string name="revanced_hide_doodles_summary_on">Анімацію \</string>
<string name="revanced_hide_doodles_summary_off">Анімація Doodles на логотипі YouTube відображається</string>
<string name="revanced_hide_doodles_user_dialog_message">"Yoodles з'являються на декілька днів щороку.
<string name="revanced_hide_doodles_title">Приховати Дудли YouTube</string>
<string name="revanced_hide_doodles_summary_on">Анімацію Дудлів YouTube на логотипі приховано</string>
<string name="revanced_hide_doodles_summary_off">Анімація Дудлів YouTube на логотипі показується</string>
<string name="revanced_hide_doodles_user_dialog_message">"Дудли YouTube показуються кілька днів на рік.
Якщо Yoodles наразі зображаються у вашому регіоні й це налаштування приховування увімкнено, то панель фільтрів під рядком пошуку також приховуватиметься."</string>
Якщо Дудл зараз показується у вашому регіоні, і це налаштування приховування ввімкнено, то панель фільтрів під рядком пошуку також буде приховано."</string>
<string name="revanced_hide_channel_bar_title">Приховати панель каналу</string>
<string name="revanced_hide_channel_bar_summary_on">Панель каналу під відеоплеєром приховано</string>
<string name="revanced_hide_channel_bar_summary_off">Панель каналу під відеоплеєром показується</string>
@@ -232,9 +232,9 @@ Second \"item\" text"</string>
<string name="revanced_hide_info_panels_summary_off">Інформаційні панелі показуються</string>
<!-- 'Join' should be translated using the same localized wording YouTube displays.
This appears in the video player for certain videos. -->
<string name="revanced_hide_join_membership_button_title">Приховати кнопку Спонсорувати</string>
<string name="revanced_hide_join_membership_button_summary_on">Кнопку \"Спонсорувати\" приховано</string>
<string name="revanced_hide_join_membership_button_summary_off">Кнопка \"Спонсорувати\" показується</string>
<string name="revanced_hide_join_membership_button_title">Приховати кнопку \"Підписатися +\"</string>
<string name="revanced_hide_join_membership_button_summary_on">Кнопку \"Підписатися +\" приховано</string>
<string name="revanced_hide_join_membership_button_summary_off">Кнопка \"Підписатися +\" показується</string>
<string name="revanced_hide_medical_panels_title">Приховати медичні панелі</string>
<string name="revanced_hide_medical_panels_summary_on">Панелі про медицину приховано</string>
<string name="revanced_hide_medical_panels_summary_off">Панелі про медицину показуються</string>
@@ -393,7 +393,7 @@ Second \"item\" text"</string>
<patch id="ad.general.hideAdsResourcePatch">
<string name="revanced_hide_creator_store_shelf_title">Приховати полицю магазину автора</string>
<string name="revanced_hide_creator_store_shelf_summary_on">Полицю магазину автора під відеоплеєром приховано</string>
<string name="revanced_hide_creator_store_shelf_summary_off">Полиця магазину творця під відеоплеєром показується</string>
<string name="revanced_hide_creator_store_shelf_summary_off">Полиця магазину автора під відеоплеєром показується</string>
<string name="revanced_hide_end_screen_store_banner_title">Приховати банер магазину на кінцевому екрані</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">Банер магазину на кінцевому екрані приховано</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">Банер магазину на кінцевому екрані показується</string>
@@ -421,8 +421,8 @@ Second \"item\" text"</string>
<string name="revanced_hide_shopping_links_summary_off">Посилання на покупки в описі відео показуються</string>
<!-- 'View products' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_view_products_banner_title">Приховати банер \"Перегляд товарів\"</string>
<string name="revanced_hide_view_products_banner_summary_on">Банер \</string>
<string name="revanced_hide_view_products_banner_summary_off">Банер \</string>
<string name="revanced_hide_view_products_banner_summary_on">Банер перегляду товарів у інтерфейсі відеоплеєра приховано</string>
<string name="revanced_hide_view_products_banner_summary_off">Банер перегляду товарів у інтерфейсі відеоплеєра показується</string>
<string name="revanced_hide_web_search_results_title">Приховати результати вебпошуку</string>
<string name="revanced_hide_web_search_results_summary_on">Результати вебпошуку приховано</string>
<string name="revanced_hide_web_search_results_summary_off">Результати вебпошуку показуються</string>
@@ -736,13 +736,13 @@ Second \"item\" text"</string>
<string name="revanced_shorts_player_screen_title">Плеєр Shorts</string>
<string name="revanced_shorts_player_screen_summary">Приховати або показувати компоненти у плеєрі Shorts</string>
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_hide_shorts_home_title">Приховати Shorts у стрічці \</string>
<string name="revanced_hide_shorts_home_summary_on">Приховано в стрічці \</string>
<string name="revanced_hide_shorts_home_summary_off">Показуються в стрічці \</string>
<string name="revanced_hide_shorts_home_title">Приховати Shorts у стрічці</string>
<string name="revanced_hide_shorts_home_summary_on">Приховано в домашній стрічці та пов’язаних відео</string>
<string name="revanced_hide_shorts_home_summary_off">Показуються в домашній стрічці та пов’язаних відео</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_hide_shorts_subscriptions_title">Приховати Shorts у стрічці \</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Приховано в стрічці \</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">Показуються в стрічці \</string>
<string name="revanced_hide_shorts_subscriptions_title">Приховати Shorts у підписках</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Приховано в стрічці підписок</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">Показуються в стрічці підписок</string>
<string name="revanced_hide_shorts_search_title">Приховати Shorts у пошуку</string>
<string name="revanced_hide_shorts_search_summary_on">Приховано в результатах пошуку</string>
<string name="revanced_hide_shorts_search_summary_off">Показуються в результатах пошуку</string>
@@ -750,8 +750,8 @@ Second \"item\" text"</string>
<string name="revanced_hide_shorts_history_summary_on">Приховано в історії переглядів</string>
<string name="revanced_hide_shorts_history_summary_off">Показуються в історії переглядів</string>
<string name="revanced_hide_shorts_super_thanks_button_title">Приховати \"Суперподяка\"</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Кнопку \</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Кнопка \</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Кнопку \"Суперподяка\" приховано</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Кнопка \"Суперподяка\" показується</string>
<string name="revanced_hide_shorts_effect_button_title">Приховати \"Ефект\"</string>
<string name="revanced_hide_shorts_effect_button_summary_on">Кнопку \"Ефект\" приховано</string>
<string name="revanced_hide_shorts_effect_button_summary_off">Кнопка \"Ефект\" показується</string>
@@ -762,9 +762,9 @@ Second \"item\" text"</string>
<string name="revanced_hide_shorts_hashtag_button_summary_on">Кнопку хештегу приховано</string>
<string name="revanced_hide_shorts_hashtag_button_summary_off">Кнопка хештегу показується</string>
<!-- 'Join' should be translated using the same localized wording YouTube displays for the button. -->
<string name="revanced_hide_shorts_join_button_title">Приховати \"Спонсорувати\"</string>
<string name="revanced_hide_shorts_join_button_summary_on">Кнопку \"Спонсорувати\" приховано</string>
<string name="revanced_hide_shorts_join_button_summary_off">Кнопка \"Спонсорувати\" показується</string>
<string name="revanced_hide_shorts_join_button_title">Приховати \"Підписатися +\"</string>
<string name="revanced_hide_shorts_join_button_summary_on">Кнопку \"Підписатися +\" приховано</string>
<string name="revanced_hide_shorts_join_button_summary_off">Кнопка \"Підписатися +\" показується</string>
<string name="revanced_hide_shorts_location_label_title">Приховати мітку місцезнаходження</string>
<string name="revanced_hide_shorts_location_label_summary_on">Мітку місцезнаходження приховано</string>
<string name="revanced_hide_shorts_location_label_summary_off">Мітка місцезнаходження показується</string>
@@ -833,7 +833,7 @@ Second \"item\" text"</string>
<string name="revanced_hide_shorts_channel_bar_title">Приховати панель каналу</string>
<string name="revanced_hide_shorts_channel_bar_summary_on">Панель каналу приховано</string>
<string name="revanced_hide_shorts_channel_bar_summary_off">Панель каналу показується</string>
<string name="revanced_hide_shorts_video_title_title">Приховати заголовок відео</string>
<string name="revanced_hide_shorts_video_title_title">Приховати назву відео</string>
<string name="revanced_hide_shorts_video_title_summary_on">Назву відео приховано</string>
<string name="revanced_hide_shorts_video_title_summary_off">Назва відео показується</string>
<string name="revanced_hide_shorts_sound_metadata_label_title">Приховати мітку метаданих звуку</string>
@@ -856,8 +856,8 @@ Second \"item\" text"</string>
</patch>
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
<string name="revanced_hide_related_videos_overlay_title">Приховати накладення пов\'язаних відео</string>
<string name="revanced_hide_related_videos_overlay_summary_on">Пов’язані відео під час проведення пальцем вгору в повноекранному режимі приховано</string>
<string name="revanced_hide_related_videos_overlay_summary_off">Пов’язані відео під час проведення пальцем вгору в повноекранному режимі показуються</string>
<string name="revanced_hide_related_videos_overlay_summary_on">Накладення пов’язаних відео в повноекранному режимі приховано</string>
<string name="revanced_hide_related_videos_overlay_summary_off">Накладення пов’язаних відео в повноекранному режимі показуються</string>
</patch>
<patch id="layout.hide.time.hideTimestampPatch">
<string name="revanced_hide_timestamp_title">Приховати мітку часу відео</string>
@@ -1323,14 +1323,14 @@ Second \"item\" text"</string>
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
<string name="revanced_alt_thumbnail_home_title">Вкладка \"Головна\"</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
<string name="revanced_alt_thumbnail_subscription_title">Вкладка \</string>
<string name="revanced_alt_thumbnail_subscription_title">Вкладка \"Підписки\"</string>
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (Library) tab. -->
<string name="revanced_alt_thumbnail_library_title">Вкладка \"Ви\"</string>
<string name="revanced_alt_thumbnail_player_title">Списки відтворення &amp; рекомендації</string>
<string name="revanced_alt_thumbnail_player_title">Списки відтворення та рекомендації</string>
<string name="revanced_alt_thumbnail_search_title">Результати пошуку</string>
<string name="revanced_alt_thumbnail_options_entry_1">Оригінальні прев\'ю</string>
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow &amp; Оригінальні прев\'ю</string>
<string name="revanced_alt_thumbnail_options_entry_3">DeArrow &amp; Стоп-кадри</string>
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow та Оригінальні прев\'ю</string>
<string name="revanced_alt_thumbnail_options_entry_3">DeArrow та Стоп-кадри</string>
<string name="revanced_alt_thumbnail_options_entry_4">Стоп-кадри</string>
<string name="revanced_alt_thumbnail_dearrow_about_summary">"DeArrow надає прев'ю для відео YouTube, які створюються користувачами. Ці прев'ю часто більш релевантні, ніж ті, що надає YouTube

View File

@@ -100,9 +100,9 @@ Nhấn nút tiếp tục và cho phép thay đổi lựa chọn tối ưu hóa."
<string name="revanced_restore_old_settings_menus_title">Khôi phục trình đơn cài đặt cũ</string>
<string name="revanced_restore_old_settings_menus_summary_on">Các trình đơn cài đặt cũ được hiển thị</string>
<string name="revanced_restore_old_settings_menus_summary_off">Các trình đơn cài đặt cũ không được hiển thị</string>
<string name="revanced_settings_search_history_title">Hiện lịch sử tìm kiếm trong cài đặt</string>
<string name="revanced_settings_search_history_summary_on">Đã hiển thị lịch sử tìm kiếm trong cài đặt</string>
<string name="revanced_settings_search_history_summary_off">Không hiển thị lịch sử tìm kiếm trong phần cài đặt</string>
<string name="revanced_settings_search_history_title">Hiện lịch sử tìm kiếm cài đặt</string>
<string name="revanced_settings_search_history_summary_on">Lịch sử tìm kiếm cài đặt đã được hiển thị</string>
<string name="revanced_settings_search_history_summary_off">Lịch sử tìm kiếm cài đặt không được hiển thị</string>
</patch>
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
<string name="revanced_shorts_disable_background_playback_title">Tắt phát nền cho Shorts</string>

View File

@@ -172,12 +172,12 @@ Second \"item\" text"</string>
<string name="revanced_hide_floating_microphone_button_summary_off">搜尋中的浮動麥克風按鈕已顯示</string>
<string name="revanced_hide_horizontal_shelves_title">隱藏橫向區塊</string>
<string name="revanced_hide_horizontal_shelves_summary_on">"橫向區塊已隱藏,例如:
• 即時新聞
• 繼續觀看
• 探索更多頻道
• 最相關
• 購物
• 再看一次 "</string>
• 即時新聞
• 繼續觀看
• 探索更多頻道
• 最相關
• 購物
• 再看一次"</string>
<string name="revanced_hide_horizontal_shelves_summary_off">橫向區塊已顯示</string>
<string name="revanced_hide_image_shelf_title">隱藏圖庫</string>
<string name="revanced_hide_image_shelf_summary_on">已隱藏搜尋結果中的圖庫</string>

View File

@@ -516,6 +516,11 @@ This feature is only available for older devices"</string>
<string name="revanced_remove_viewer_discretion_dialog_summary_off">Dialog will be shown</string>
<string name="revanced_remove_viewer_discretion_dialog_user_dialog_message">This does not bypass the age restriction. It just accepts it automatically.</string>
</patch>
<patch id="interaction.doubletap.disableChapterSkipDoubleTapPatch">
<string name="revanced_disable_chapter_skip_double_tap_title">Disable double tap chapter skip</string>
<string name="revanced_disable_chapter_skip_double_tap_summary_on">Double tap can never trigger a skip to the next/previous chapter</string>
<string name="revanced_disable_chapter_skip_double_tap_summary_off">Double tap can occasionally trigger a skip to the next/previous chapter</string>
</patch>
<patch id="interaction.downloads.downloadsResourcePatch">
<string name="revanced_external_downloader_screen_title">External downloads</string>
<string name="revanced_external_downloader_screen_summary">Settings for using an external downloader</string>