Compare commits

..

94 Commits

Author SHA1 Message Date
semantic-release-bot
6544cd5fc6 chore(release): 4.14.0-dev.2 [skip ci]
# [4.14.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.14.0-dev.1...v4.14.0-dev.2) (2024-08-24)

### Features

* **Duolingo:** Add `Disable ads` and `Enable debug menu` patch ([#3422](https://github.com/ReVanced/revanced-patches/issues/3422)) ([4e323aa](4e323aa206))
2024-08-24 12:46:50 +00:00
Joshua May
4e323aa206 feat(Duolingo): Add Disable ads and Enable debug menu patch (#3422)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
2024-08-24 14:44:35 +02:00
ReVanced Bot
c1cee281ff chore: Sync translations (#3574) 2024-08-23 00:37:22 -04:00
ReVanced Bot
0779f9fc5e chore: Sync translations (#3573) 2024-08-23 00:13:52 -04:00
semantic-release-bot
0ee5cf98ab chore(release): 4.14.0-dev.1 [skip ci]
# [4.14.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.4-dev.2...v4.14.0-dev.1) (2024-08-22)

### Features

* **YouTube - Spoof client:** Allow forcing AVC codec with iOS ([#3570](https://github.com/ReVanced/revanced-patches/issues/3570)) ([6bb848b](6bb848b991))
2024-08-22 17:51:00 +00:00
LisoUseInAIKyrios
6bb848b991 feat(YouTube - Spoof client): Allow forcing AVC codec with iOS (#3570) 2024-08-22 13:48:49 -04:00
semantic-release-bot
188b66ffe7 chore(release): 4.13.4-dev.2 [skip ci]
## [4.13.4-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.13.4-dev.1...v4.13.4-dev.2) (2024-08-20)

### Bug Fixes

* **YouTube - SponsorBlock:** Handle if the user enters an invalid number into any SB settings ([a276425](a276425d83))
2024-08-20 04:19:14 +00:00
LisoUseInAIKyrios
a276425d83 fix(YouTube - SponsorBlock): Handle if the user enters an invalid number into any SB settings 2024-08-20 00:17:11 -04:00
LisoUseInAIKyrios
e556c3f692 chore: Sync translations (#3564) 2024-08-20 00:16:08 -04:00
revanced-bot
cb30248eab chore: Sync translations 2024-08-20 04:15:01 +00:00
semantic-release-bot
c5ce742ab4 chore(release): 4.13.4-dev.1 [skip ci]
## [4.13.4-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.3...v4.13.4-dev.1) (2024-08-18)

### Bug Fixes

* **SwissID:** Rename `Remove Google Play Integrity Integrity check` to `Remove Google Play Integrity check` ([#3558](https://github.com/ReVanced/revanced-patches/issues/3558)) ([bdd2f7c](bdd2f7cb0f))
2024-08-18 13:22:20 +00:00
Pun Butrach
bdd2f7cb0f fix(SwissID): Rename Remove Google Play Integrity Integrity check to Remove Google Play Integrity check (#3558) 2024-08-18 17:20:23 +04:00
semantic-release-bot
b7600f448d chore(release): 4.13.3 [skip ci]
## [4.13.3](https://github.com/ReVanced/revanced-patches/compare/v4.13.2...v4.13.3) (2024-08-15)

### Bug Fixes

* **YouTube:** Remove translated string that breaks patching ([aa3487a](aa3487aa92))
2024-08-15 20:40:18 +00:00
LisoUseInAIKyrios
5c4bf7676d chore: Merge branch dev to main (#3552) 2024-08-15 16:38:21 -04:00
semantic-release-bot
fcd2f9b4c4 chore(release): 4.13.3-dev.1 [skip ci]
## [4.13.3-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.2...v4.13.3-dev.1) (2024-08-15)

### Bug Fixes

* **YouTube:** Remove translated string that breaks patching ([aa3487a](aa3487aa92))
2024-08-15 20:36:50 +00:00
LisoUseInAIKyrios
aa3487aa92 fix(YouTube): Remove translated string that breaks patching 2024-08-15 16:34:52 -04:00
LisoUseInAIKyrios
ada642f4a7 chore: Merge branch dev to main (#3551) 2024-08-15 16:29:00 -04:00
LisoUseInAIKyrios
eac758588a chore: Remove non breaking space from German translation 2024-08-15 16:14:36 -04:00
ReVanced Bot
5d047eae77 chore: Sync translations (#3550) 2024-08-15 15:58:52 -04:00
semantic-release-bot
ed92bf1be6 chore(release): 4.13.2 [skip ci]
## [4.13.2](https://github.com/ReVanced/revanced-patches/compare/v4.13.1...v4.13.2) (2024-08-15)

### Bug Fixes

* **YouTube - GmsCore Support:** Fix patch exception by using correct patch offset ([#3543](https://github.com/ReVanced/revanced-patches/issues/3543)) ([3d0d94b](3d0d94b6c8))
2024-08-15 18:39:08 +00:00
oSumAtrIX
c6318e890f chore: Merge branch dev to main (#3544) 2024-08-15 22:37:04 +04:00
semantic-release-bot
7f3b1c54da chore(release): 4.13.2-dev.1 [skip ci]
## [4.13.2-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.1...v4.13.2-dev.1) (2024-08-15)

### Bug Fixes

* **YouTube - GmsCore Support:** Fix patch exception by using correct patch offset ([#3543](https://github.com/ReVanced/revanced-patches/issues/3543)) ([3d0d94b](3d0d94b6c8))
2024-08-15 18:35:56 +00:00
LisoUseInAIKyrios
3d0d94b6c8 fix(YouTube - GmsCore Support): Fix patch exception by using correct patch offset (#3543) 2024-08-15 22:33:53 +04:00
semantic-release-bot
b84e6afebd chore(release): 4.13.1 [skip ci]
## [4.13.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.0...v4.13.1) (2024-08-15)

### Bug Fixes

* **YouTube - Check watch history domain name resolution:** Add compatibility field ([d7be94a](d7be94a193))
2024-08-15 17:58:11 +00:00
oSumAtrIX
3eab130276 chore: Merge branch dev to main (#3541) 2024-08-15 21:55:53 +04:00
semantic-release-bot
95f8e9b3a9 chore(release): 4.13.1-dev.1 [skip ci]
## [4.13.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.0...v4.13.1-dev.1) (2024-08-15)

### Bug Fixes

* **YouTube - Check watch history domain name resolution:** Add compatibility field ([d7be94a](d7be94a193))
2024-08-15 17:53:15 +00:00
LisoUseInAIKyrios
d7be94a193 fix(YouTube - Check watch history domain name resolution): Add compatibility field 2024-08-15 13:51:02 -04:00
semantic-release-bot
e4e20bec6c chore(release): 4.13.0 [skip ci]
# [4.13.0](https://github.com/ReVanced/revanced-patches/compare/v4.12.0...v4.13.0) (2024-08-15)

### Bug Fixes

* **YouTube - GmsCore support:** Fix notifications not working by using the correct permissions ([c64757f](c64757f80a))

### Features

* **Google Photos:** Add `Spoof features` patch ([#3459](https://github.com/ReVanced/revanced-patches/issues/3459)) ([f814d87](f814d87c17))
* **SCB Easy:** Remove broken `Remove debugging detection` patch ([#3518](https://github.com/ReVanced/revanced-patches/issues/3518)) ([45e4f70](45e4f70137))
* **YouTube:** Add `Check watch history domain name resolution` patch ([#3537](https://github.com/ReVanced/revanced-patches/issues/3537)) ([87eb836](87eb83607c))
2024-08-15 17:29:30 +00:00
oSumAtrIX
b8bd63a34c chore: Merge branch dev to main (#3533) 2024-08-15 21:26:59 +04:00
semantic-release-bot
8b602ca6be chore(release): 4.13.0-dev.2 [skip ci]
# [4.13.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.13.0-dev.1...v4.13.0-dev.2) (2024-08-15)

### Features

* **YouTube:** Add `Check watch history domain name resolution` patch ([#3537](https://github.com/ReVanced/revanced-patches/issues/3537)) ([87eb836](87eb83607c))
2024-08-15 16:08:55 +00:00
LisoUseInAIKyrios
87eb83607c feat(YouTube): Add Check watch history domain name resolution patch (#3537)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2024-08-15 12:06:19 -04:00
semantic-release-bot
567121d641 chore(release): 4.13.0-dev.1 [skip ci]
# [4.13.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.12.1-dev.1...v4.13.0-dev.1) (2024-08-15)

### Features

* **Google Photos:** Add `Spoof features` patch ([#3459](https://github.com/ReVanced/revanced-patches/issues/3459)) ([f814d87](f814d87c17))
* **SCB Easy:** Remove broken `Remove debugging detection` patch ([#3518](https://github.com/ReVanced/revanced-patches/issues/3518)) ([45e4f70](45e4f70137))
2024-08-15 05:47:21 +00:00
Pun Butrach
45e4f70137 feat(SCB Easy): Remove broken Remove debugging detection patch (#3518)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2024-08-15 07:45:00 +02:00
oSumAtrIX
f814d87c17 feat(Google Photos): Add Spoof features patch (#3459) 2024-08-15 07:43:01 +02:00
semantic-release-bot
d0e92b225e chore(release): 4.12.1-dev.1 [skip ci]
## [4.12.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.12.0...v4.12.1-dev.1) (2024-08-15)

### Bug Fixes

* **YouTube - GmsCore support:** Fix notifications not working by using the correct permissions ([c64757f](c64757f80a))
2024-08-15 05:41:06 +00:00
oSumAtrIX
c64757f80a fix(YouTube - GmsCore support): Fix notifications not working by using the correct permissions
Regression had been introduced in 1af65de1f6. This commit reverts this.
2024-08-15 07:39:00 +02:00
ReVanced Bot
58b6f1fba0 chore: Sync translations (#3532) 2024-08-13 01:13:23 -04:00
semantic-release-bot
630857ba16 chore(release): 4.12.0 [skip ci]
# [4.12.0](https://github.com/ReVanced/revanced-patches/compare/v4.11.0...v4.12.0) (2024-08-06)

### Bug Fixes

* **Google Photos - GmsCore support:** Fix by checking first if a method exists before trying to patch it ([26449cf](26449cf7c6))
* **Instagram - Hide ads:**  Restore compatibility with latest version by fixing fingerprint ([#3455](https://github.com/ReVanced/revanced-patches/issues/3455)) ([f2bf2da](f2bf2da9a5))
* **Messenger - Disable switching emoji to sticker:** Constrain to last working version `439.0.0.29.119` ([1cf25f9](1cf25f9dc9))
* **SoundCloud - Enable offline sync:** Stop crashing by reversing order of patching instructions from last to first to retain indices ([98f9bba](98f9bba7ed))
* **YouTube - Bypass image region restrictions:** Move setting to `Misc` menu ([7acb6cd](7acb6cdc96))
* **YouTube - Client Spoof:** Restore missing high qualities by spoofing the iOS client user agent ([#3468](https://github.com/ReVanced/revanced-patches/issues/3468)) ([a4b0e76](a4b0e76755))
* **YouTube - Hide keyword content:** Do not hide flyout menu ([cfbc4aa](cfbc4aa6b2))
* **YouTube - SponsorBlock:** Correctly show minute timestamp when creating a new segment ([8886fc4](8886fc4f54))
* **YouTube - SponsorBlock:** Improve create segment manual seek accuracy ([#3491](https://github.com/ReVanced/revanced-patches/issues/3491)) ([2e8d5c6](2e8d5c61f8))
* **YouTube - Spoof client:** Fix tracking history on brand accounts ([#3480](https://github.com/ReVanced/revanced-patches/issues/3480)) ([eed856d](eed856d64c))
* **YouTube - Spoof client:** Restore livestream audio only playback with iOS spoofing ([#3504](https://github.com/ReVanced/revanced-patches/issues/3504)) ([eadbf5f](eadbf5f459))

### Features

* Add `Hide mock location` patch ([#3417](https://github.com/ReVanced/revanced-patches/issues/3417)) ([250cc7c](250cc7cbde))
* Add `Spoof build info` patch ([d87f36e](d87f36e7e2))
* **Boost for Reddit:** Add `Disable ads` patch ([#3474](https://github.com/ReVanced/revanced-patches/issues/3474)) ([d2afc53](d2afc53c2b))
* **CandyLink:** Remove non-functional `Unlock pro` patch ([1e81d0c](1e81d0c9f8))
* **Expense Manager:** Remove non-functional `Unlock pro` patch ([e4232b6](e4232b6c74))
* **Google News:** Add `Enable CustomTabs` and `GmsCore support` patch ([#3111](https://github.com/ReVanced/revanced-patches/issues/3111)) ([273af26](273af26274))
* **Google Photos:** Add `GmsCore support` patch ([#3414](https://github.com/ReVanced/revanced-patches/issues/3414)) ([1af65de](1af65de1f6))
* **Instagram:** Remove unnecessary `Hide timeline ads` patch ([8038bd2](8038bd2e98))
* **SoundCloud:** Add `Enable offline sync` patch ([#3407](https://github.com/ReVanced/revanced-patches/issues/3407)) ([b944fb7](b944fb7bf1))
* **SwissID:** Add `Remove Google Play Integrity Integrity check` patch ([#3478](https://github.com/ReVanced/revanced-patches/issues/3478)) ([3380080](33800801a3))
* **YouTube - Description components:** Add `Hide 'Key concepts' section` option ([#3495](https://github.com/ReVanced/revanced-patches/issues/3495)) ([337bdc3](337bdc3d39))
* **YouTube:** Add `Bypass image region restrictions` patch ([#3442](https://github.com/ReVanced/revanced-patches/issues/3442)) ([9ef51ab](9ef51abde7))
2024-08-06 00:08:03 +00:00
oSumAtrIX
82ae367946 chore: Merge branch dev to main (#3438) 2024-08-06 02:05:44 +02:00
semantic-release-bot
95a7118dcf chore(release): 4.12.0-dev.17 [skip ci]
# [4.12.0-dev.17](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.16...v4.12.0-dev.17) (2024-08-06)

### Bug Fixes

* **Google Photos - GmsCore support:** Fix by checking first if a method exists before trying to patch it ([26449cf](26449cf7c6))
* **Messenger - Disable switching emoji to sticker:** Constrain to last working version `439.0.0.29.119` ([1cf25f9](1cf25f9dc9))

### Features

* **CandyLink:** Remove non-functional `Unlock pro` patch ([1e81d0c](1e81d0c9f8))
* **Expense Manager:** Remove non-functional `Unlock pro` patch ([e4232b6](e4232b6c74))
* **Instagram:** Remove unnecessary `Hide timeline ads` patch ([8038bd2](8038bd2e98))
2024-08-06 00:04:26 +00:00
oSumAtrIX
26449cf7c6 fix(Google Photos - GmsCore support): Fix by checking first if a method exists before trying to patch it 2024-08-06 02:01:44 +02:00
oSumAtrIX
e4232b6c74 feat(Expense Manager): Remove non-functional Unlock pro patch 2024-08-06 01:40:11 +02:00
oSumAtrIX
1cf25f9dc9 fix(Messenger - Disable switching emoji to sticker): Constrain to last working version 439.0.0.29.119 2024-08-06 01:31:46 +02:00
oSumAtrIX
8038bd2e98 feat(Instagram): Remove unnecessary Hide timeline ads patch
The `Hide ads` patch supersedes this patch.
2024-08-06 01:27:06 +02:00
oSumAtrIX
1e81d0c9f8 feat(CandyLink): Remove non-functional Unlock pro patch
Servers now check the purchase status.
2024-08-06 01:25:28 +02:00
ReVanced Bot
c48cedaddf chore: Sync translations (#3507) 2024-08-05 15:56:44 -04:00
semantic-release-bot
4085d1f9dc chore(release): 4.12.0-dev.16 [skip ci]
# [4.12.0-dev.16](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.15...v4.12.0-dev.16) (2024-08-04)

### Bug Fixes

* **YouTube - Spoof client:** Restore livestream audio only playback with iOS spoofing ([#3504](https://github.com/ReVanced/revanced-patches/issues/3504)) ([eadbf5f](eadbf5f459))
2024-08-04 19:40:12 +00:00
LisoUseInAIKyrios
eadbf5f459 fix(YouTube - Spoof client): Restore livestream audio only playback with iOS spoofing (#3504) 2024-08-04 21:38:10 +02:00
ILoveOpenSourceApplications
b12b3a73a6 refactor(YouTube Music): Rename Hide music video ads to Hide video ads and add patch description (#3494)
Co-authored-by: ILoveOpenSourceApplications <ILoveOpenSourceApplications@users.noreply.github.com>
Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
2024-08-04 10:09:48 +02:00
semantic-release-bot
572a310589 chore(release): 4.12.0-dev.15 [skip ci]
# [4.12.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.14...v4.12.0-dev.15) (2024-08-02)

### Bug Fixes

* **YouTube - SponsorBlock:** Improve create segment manual seek accuracy ([#3491](https://github.com/ReVanced/revanced-patches/issues/3491)) ([2e8d5c6](2e8d5c61f8))
2024-08-02 13:42:52 +00:00
LisoUseInAIKyrios
2e8d5c61f8 fix(YouTube - SponsorBlock): Improve create segment manual seek accuracy (#3491) 2024-08-02 09:40:28 -04:00
ReVanced Bot
025766bb42 chore: Sync translations (#3499) 2024-08-02 09:37:23 -04:00
semantic-release-bot
e31966159a chore(release): 4.12.0-dev.14 [skip ci]
# [4.12.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.13...v4.12.0-dev.14) (2024-08-01)

### Features

* **YouTube - Description components:** Add `Hide 'Key concepts' section` option ([#3495](https://github.com/ReVanced/revanced-patches/issues/3495)) ([337bdc3](337bdc3d39))
2024-08-01 11:29:29 +00:00
ILoveOpenSourceApplications
337bdc3d39 feat(YouTube - Description components): Add Hide 'Key concepts' section option (#3495)
Co-authored-by: ILoveOpenSourceApplications <ILoveOpenSourceApplications@users.noreply.github.com>
2024-08-01 13:27:28 +02:00
semantic-release-bot
13ed4a2f39 chore(release): 4.12.0-dev.13 [skip ci]
# [4.12.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.12...v4.12.0-dev.13) (2024-07-31)

### Features

* **Boost for Reddit:** Add `Disable ads` patch ([#3474](https://github.com/ReVanced/revanced-patches/issues/3474)) ([d2afc53](d2afc53c2b))
2024-07-31 17:56:11 +00:00
LilithSilver
d2afc53c2b feat(Boost for Reddit): Add Disable ads patch (#3474)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2024-07-31 19:53:44 +02:00
ReVanced Bot
1fab0ae59a chore: Sync translations (#3482) 2024-07-29 01:04:13 -04:00
semantic-release-bot
5c8c597d19 chore(release): 4.12.0-dev.12 [skip ci]
# [4.12.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.11...v4.12.0-dev.12) (2024-07-28)

### Features

* **SwissID:** Add `Remove Google Play Integrity Integrity check` patch ([#3478](https://github.com/ReVanced/revanced-patches/issues/3478)) ([3380080](33800801a3))
2024-07-28 21:58:12 +00:00
Cedric
33800801a3 feat(SwissID): Add Remove Google Play Integrity Integrity check patch (#3478)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2024-07-28 23:56:12 +02:00
semantic-release-bot
62c47665e4 chore(release): 4.12.0-dev.11 [skip ci]
# [4.12.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.10...v4.12.0-dev.11) (2024-07-28)

### Bug Fixes

* **YouTube - Bypass image region restrictions:** Move setting to `Misc` menu ([7acb6cd](7acb6cdc96))
2024-07-28 18:18:31 +00:00
LisoUseInAIKyrios
7acb6cdc96 fix(YouTube - Bypass image region restrictions): Move setting to Misc menu
The setting is closer in nature to the other settings in Misc than the settings in the General menu.
2024-07-28 14:16:19 -04:00
semantic-release-bot
a5d32c3da3 chore(release): 4.12.0-dev.10 [skip ci]
# [4.12.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.9...v4.12.0-dev.10) (2024-07-28)

### Bug Fixes

* **YouTube - Client Spoof:** Restore missing high qualities by spoofing the iOS client user agent ([#3468](https://github.com/ReVanced/revanced-patches/issues/3468)) ([a4b0e76](a4b0e76755))
2024-07-28 14:52:33 +00:00
Zain Arbani
a4b0e76755 fix(YouTube - Client Spoof): Restore missing high qualities by spoofing the iOS client user agent (#3468)
Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2024-07-28 16:50:30 +02:00
semantic-release-bot
0a7b2c5ec2 chore(release): 4.12.0-dev.9 [skip ci]
# [4.12.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.8...v4.12.0-dev.9) (2024-07-28)

### Bug Fixes

* **YouTube - Spoof client:** Fix tracking history on brand accounts ([#3480](https://github.com/ReVanced/revanced-patches/issues/3480)) ([eed856d](eed856d64c))
2024-07-28 13:56:03 +00:00
oSumAtrIX
eed856d64c fix(YouTube - Spoof client): Fix tracking history on brand accounts (#3480) 2024-07-28 15:53:48 +02:00
LisoUseInAIKyrios
e8d481397f chore(YouTube): Comments 2024-07-26 10:45:24 -04:00
semantic-release-bot
d0eceb3e36 chore(release): 4.12.0-dev.8 [skip ci]
# [4.12.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.7...v4.12.0-dev.8) (2024-07-26)

### Bug Fixes

* **YouTube - SponsorBlock:** Correctly show minute timestamp when creating a new segment ([8886fc4](8886fc4f54))
2024-07-26 14:38:36 +00:00
LisoUseInAIKyrios
8886fc4f54 fix(YouTube - SponsorBlock): Correctly show minute timestamp when creating a new segment 2024-07-26 10:30:14 -04:00
semantic-release-bot
fb4256f17c chore(release): 4.12.0-dev.7 [skip ci]
# [4.12.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.6...v4.12.0-dev.7) (2024-07-24)

### Bug Fixes

* **SoundCloud - Enable offline sync:** Stop crashing by reversing order of patching instructions from last to first to retain indices ([98f9bba](98f9bba7ed))
2024-07-24 18:03:03 +00:00
oSumAtrIX
98f9bba7ed fix(SoundCloud - Enable offline sync): Stop crashing by reversing order of patching instructions from last to first to retain indices 2024-07-24 20:00:35 +02:00
semantic-release-bot
8e72067dcb chore(release): 4.12.0-dev.6 [skip ci]
# [4.12.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.5...v4.12.0-dev.6) (2024-07-20)

### Features

* Add `Spoof build info` patch ([d87f36e](d87f36e7e2))
2024-07-20 16:08:40 +00:00
oSumAtrIX
d87f36e7e2 feat: Add Spoof build info patch 2024-07-20 18:06:27 +02:00
oSumAtrIX
4432fe65df build: Bump dependencies 2024-07-20 06:14:35 +02:00
semantic-release-bot
8b0d8ee9f4 chore(release): 4.12.0-dev.5 [skip ci]
# [4.12.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.4...v4.12.0-dev.5) (2024-07-20)

### Features

* Add `Hide mock location` patch ([#3417](https://github.com/ReVanced/revanced-patches/issues/3417)) ([250cc7c](250cc7cbde))
* **Google Photos:** Add `GmsCore support` patch ([#3414](https://github.com/ReVanced/revanced-patches/issues/3414)) ([1af65de](1af65de1f6))
2024-07-20 04:02:23 +00:00
epireyn
250cc7cbde feat: Add Hide mock location patch (#3417)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2024-07-20 06:00:19 +02:00
xob0t
1af65de1f6 feat(Google Photos): Add GmsCore support patch (#3414)
Co-authored-by: benjy3gg <benjy3gg@gmail.com>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2024-07-20 05:58:47 +02:00
semantic-release-bot
6e87e3044c chore(release): 4.12.0-dev.4 [skip ci]
# [4.12.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.3...v4.12.0-dev.4) (2024-07-20)

### Features

* **Google News:** Add `Enable CustomTabs` and `GmsCore support` patch ([#3111](https://github.com/ReVanced/revanced-patches/issues/3111)) ([273af26](273af26274))
2024-07-20 02:57:11 +00:00
benjy3gg
273af26274 feat(Google News): Add Enable CustomTabs and GmsCore support patch (#3111)
Co-authored-by: benjy3gg <benjy3gg@gmail.com>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2024-07-20 04:55:08 +02:00
semantic-release-bot
2b1b081051 chore(release): 4.12.0-dev.3 [skip ci]
# [4.12.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.2...v4.12.0-dev.3) (2024-07-18)

### Bug Fixes

* **Instagram - Hide ads:**  Restore compatibility with latest version by fixing fingerprint ([#3455](https://github.com/ReVanced/revanced-patches/issues/3455)) ([f2bf2da](f2bf2da9a5))
2024-07-18 23:52:11 +00:00
Tim
f2bf2da9a5 fix(Instagram - Hide ads): Restore compatibility with latest version by fixing fingerprint (#3455) 2024-07-19 01:50:03 +02:00
ReVanced Bot
15317003b1 chore: Sync translations (#3451) 2024-07-18 17:22:23 +04:00
semantic-release-bot
6c81a5b65f chore(release): 4.12.0-dev.2 [skip ci]
# [4.12.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.1...v4.12.0-dev.2) (2024-07-15)

### Features

* **YouTube:** Add `Bypass image region restrictions` patch ([#3442](https://github.com/ReVanced/revanced-patches/issues/3442)) ([9ef51ab](9ef51abde7))
2024-07-15 19:01:14 +00:00
LisoUseInAIKyrios
9ef51abde7 feat(YouTube): Add Bypass image region restrictions patch (#3442)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2024-07-15 02:56:12 +04:00
semantic-release-bot
1d31565d47 chore(release): 4.12.0-dev.1 [skip ci]
# [4.12.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.11.1-dev.1...v4.12.0-dev.1) (2024-07-13)

### Features

* **SoundCloud:** Add `Enable offline sync` patch ([#3407](https://github.com/ReVanced/revanced-patches/issues/3407)) ([b944fb7](b944fb7bf1))
2024-07-13 23:45:56 +00:00
LightCat
b944fb7bf1 feat(SoundCloud): Add Enable offline sync patch (#3407)
Co-authored-by: bewzusore <bewzusore>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
Co-authored-by: BenCat07 <BenCat07@gitlab.com>
2024-07-14 01:43:48 +02:00
semantic-release-bot
dfd46d8e8f chore(release): 4.11.1-dev.1 [skip ci]
## [4.11.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.11.0...v4.11.1-dev.1) (2024-07-12)

### Bug Fixes

* **YouTube - Hide keyword content:** Do not hide flyout menu ([cfbc4aa](cfbc4aa6b2))
2024-07-12 22:45:58 +00:00
oSumAtrIX
f64e03a1f6 ci: Correct usage of repository variable 2024-07-13 00:43:59 +02:00
semantic-release-bot
a65970bdc2 chore(release): 4.11.1-dev.1 [skip ci]
## [4.11.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.11.0...v4.11.1-dev.1) (2024-07-12)

### Bug Fixes

* **YouTube - Hide keyword content:** Do not hide flyout menu ([cfbc4aa](cfbc4aa6b2))
2024-07-12 18:17:37 +00:00
LisoUseInAIKyrios
cfbc4aa6b2 fix(YouTube - Hide keyword content): Do not hide flyout menu 2024-07-12 22:15:13 +04:00
semantic-release-bot
b04652890e chore(release): 4.11.0 [skip ci]
# [4.11.0](https://github.com/ReVanced/revanced-patches/compare/v4.10.0...v4.11.0) (2024-07-11)

### Bug Fixes

* **Boost for reddit - Fix missing audio in video downloads:** Replace correct strings ([#3379](https://github.com/ReVanced/revanced-patches/issues/3379)) ([0b098a2](0b098a2027))
* **Windy - Unlock pro:** Revert changing package name ([#3402](https://github.com/ReVanced/revanced-patches/issues/3402)) ([dd6a9f9](dd6a9f977f))
* **Windy - Unlock pro:** Use correct package name ([#3397](https://github.com/ReVanced/revanced-patches/issues/3397)) ([e4ae9cc](e4ae9ccd26))
* **YouTube - Hide layout components:** Detect if a keyword filter hides all videos ([#3365](https://github.com/ReVanced/revanced-patches/issues/3365)) ([03eb9c0](03eb9c032a))
* **YouTube - Settings:** Move some settings to different menus, adjust default setting values ([#3415](https://github.com/ReVanced/revanced-patches/issues/3415)) ([def1ec4](def1ec4de6))
* **YouTube - SponsorBlock:** Skip segments when casting ([#3331](https://github.com/ReVanced/revanced-patches/issues/3331)) ([a81a6bf](a81a6bf5b2))

### Features

* Add `Remove share targets` patch ([#3334](https://github.com/ReVanced/revanced-patches/issues/3334)) ([70e54f8](70e54f8794))
* Add translations ([#2963](https://github.com/ReVanced/revanced-patches/issues/2963)) ([f5f0240](f5f024024a))
* **Bandcamp:** Add `Remove play limits` patch ([#3366](https://github.com/ReVanced/revanced-patches/issues/3366)) ([f0fb2fa](f0fb2fa3ba))
* **Instagram:** Add `Hide ads` patch ([#3380](https://github.com/ReVanced/revanced-patches/issues/3380)) ([decdff9](decdff9037))
* **RAR:** Add `Hide purchase reminder` patch ([#3321](https://github.com/ReVanced/revanced-patches/issues/3321)) ([55556f3](55556f3efc))
* **Soundcloud:** Add `Hide ads` and `Disable telemetry` patch ([#3386](https://github.com/ReVanced/revanced-patches/issues/3386)) ([a036c1f](a036c1fa0a))
* **Stocard:** Add `Hide offers tab` and `Hide story bubbles` patch ([#3359](https://github.com/ReVanced/revanced-patches/issues/3359)) ([e2f9193](e2f9193aa8))
2024-07-11 18:56:56 +00:00
LisoUseInAIKyrios
4fe1dbe9e0 chore: Merge branch dev to main (#3369) 2024-07-11 22:54:46 +04:00
ReVanced Bot
32acfbaee7 chore: Sync translations (#3427) 2024-07-11 02:24:16 +04:00
semantic-release-bot
d02a490f36 chore(release): 4.11.0-dev.7 [skip ci]
# [4.11.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v4.11.0-dev.6...v4.11.0-dev.7) (2024-07-10)

### Features

* **Bandcamp:** Add `Remove play limits` patch ([#3366](https://github.com/ReVanced/revanced-patches/issues/3366)) ([f0fb2fa](f0fb2fa3ba))
2024-07-10 22:23:36 +00:00
xob0t
f0fb2fa3ba feat(Bandcamp): Add Remove play limits patch (#3366)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2024-07-11 00:21:40 +02:00
174 changed files with 8343 additions and 7548 deletions

View File

@@ -17,7 +17,7 @@ jobs:
ref: dev
- name: Pull strings
uses: crowdin/github-action@v1
uses: crowdin/github-action@v2
with:
config: crowdin.yml
download_translations: true

View File

@@ -19,7 +19,7 @@ jobs:
fetch-depth: 0
- name: Push strings
uses: crowdin/github-action@v1
uses: crowdin/github-action@v2
with:
config: crowdin.yml
upload_sources: true

View File

@@ -42,7 +42,7 @@ jobs:
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
fingerprint: ${{ env.GPG_FINGERPRINT }}
fingerprint: ${{ vars.GPG_FINGERPRINT }}
- name: Release
env:

View File

@@ -1,3 +1,314 @@
# [4.14.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.14.0-dev.1...v4.14.0-dev.2) (2024-08-24)
### Features
* **Duolingo:** Add `Disable ads` and `Enable debug menu` patch ([#3422](https://github.com/ReVanced/revanced-patches/issues/3422)) ([d0a8599](https://github.com/ReVanced/revanced-patches/commit/d0a8599f76ce653e5d7c98069ad3c58b9ab9c5eb))
# [4.14.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.4-dev.2...v4.14.0-dev.1) (2024-08-22)
### Features
* **YouTube - Spoof client:** Allow forcing AVC codec with iOS ([#3570](https://github.com/ReVanced/revanced-patches/issues/3570)) ([1a49d1f](https://github.com/ReVanced/revanced-patches/commit/1a49d1f3c2a343d05d0abc07c143add486246fd0))
## [4.13.4-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.13.4-dev.1...v4.13.4-dev.2) (2024-08-20)
### Bug Fixes
* **YouTube - SponsorBlock:** Handle if the user enters an invalid number into any SB settings ([37b3dd1](https://github.com/ReVanced/revanced-patches/commit/37b3dd1e789f8bb16fa1b9dd582e39c89dbe730c))
## [4.13.4-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.3...v4.13.4-dev.1) (2024-08-18)
### Bug Fixes
* **SwissID:** Rename `Remove Google Play Integrity Integrity check` to `Remove Google Play Integrity check` ([#3558](https://github.com/ReVanced/revanced-patches/issues/3558)) ([0f5a771](https://github.com/ReVanced/revanced-patches/commit/0f5a771a5cff5684b4a8fd317f4938fe2cf3cbbe))
## [4.13.3](https://github.com/ReVanced/revanced-patches/compare/v4.13.2...v4.13.3) (2024-08-15)
### Bug Fixes
* **YouTube:** Remove translated string that breaks patching ([a48c2db](https://github.com/ReVanced/revanced-patches/commit/a48c2db53d84767c8fd5d569f9ce1c46c2bfd9a1))
## [4.13.3-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.2...v4.13.3-dev.1) (2024-08-15)
### Bug Fixes
* **YouTube:** Remove translated string that breaks patching ([a48c2db](https://github.com/ReVanced/revanced-patches/commit/a48c2db53d84767c8fd5d569f9ce1c46c2bfd9a1))
## [4.13.2](https://github.com/ReVanced/revanced-patches/compare/v4.13.1...v4.13.2) (2024-08-15)
### Bug Fixes
* **YouTube - GmsCore Support:** Fix patch exception by using correct patch offset ([#3543](https://github.com/ReVanced/revanced-patches/issues/3543)) ([b2b8454](https://github.com/ReVanced/revanced-patches/commit/b2b8454aa992bcb217fb03eb4de5532e0a9bd354))
## [4.13.2-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.1...v4.13.2-dev.1) (2024-08-15)
### Bug Fixes
* **YouTube - GmsCore Support:** Fix patch exception by using correct patch offset ([#3543](https://github.com/ReVanced/revanced-patches/issues/3543)) ([b2b8454](https://github.com/ReVanced/revanced-patches/commit/b2b8454aa992bcb217fb03eb4de5532e0a9bd354))
## [4.13.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.0...v4.13.1) (2024-08-15)
### Bug Fixes
* **YouTube - Check watch history domain name resolution:** Add compatibility field ([6c598f0](https://github.com/ReVanced/revanced-patches/commit/6c598f084ed90ee1318e4c66d8c1751c797b8e3b))
## [4.13.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.0...v4.13.1-dev.1) (2024-08-15)
### Bug Fixes
* **YouTube - Check watch history domain name resolution:** Add compatibility field ([6c598f0](https://github.com/ReVanced/revanced-patches/commit/6c598f084ed90ee1318e4c66d8c1751c797b8e3b))
# [4.13.0](https://github.com/ReVanced/revanced-patches/compare/v4.12.0...v4.13.0) (2024-08-15)
### Bug Fixes
* **YouTube - GmsCore support:** Fix notifications not working by using the correct permissions ([19ddae2](https://github.com/ReVanced/revanced-patches/commit/19ddae2d15e513e18eb1556c468cd94bd197685b))
### Features
* **Google Photos:** Add `Spoof features` patch ([#3459](https://github.com/ReVanced/revanced-patches/issues/3459)) ([7c218cd](https://github.com/ReVanced/revanced-patches/commit/7c218cd168aa72eb99bcb47d12dfa45616e8ad88))
* **SCB Easy:** Remove broken `Remove debugging detection` patch ([#3518](https://github.com/ReVanced/revanced-patches/issues/3518)) ([f4e23cb](https://github.com/ReVanced/revanced-patches/commit/f4e23cbb8a24638318d8cee20a1991c51855d9d2))
* **YouTube:** Add `Check watch history domain name resolution` patch ([#3537](https://github.com/ReVanced/revanced-patches/issues/3537)) ([2af1425](https://github.com/ReVanced/revanced-patches/commit/2af142525cda07a131335faadd4b3889979fd077))
# [4.13.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.13.0-dev.1...v4.13.0-dev.2) (2024-08-15)
### Features
* **YouTube:** Add `Check watch history domain name resolution` patch ([#3537](https://github.com/ReVanced/revanced-patches/issues/3537)) ([2af1425](https://github.com/ReVanced/revanced-patches/commit/2af142525cda07a131335faadd4b3889979fd077))
# [4.13.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.12.1-dev.1...v4.13.0-dev.1) (2024-08-15)
### Features
* **Google Photos:** Add `Spoof features` patch ([#3459](https://github.com/ReVanced/revanced-patches/issues/3459)) ([7c218cd](https://github.com/ReVanced/revanced-patches/commit/7c218cd168aa72eb99bcb47d12dfa45616e8ad88))
* **SCB Easy:** Remove broken `Remove debugging detection` patch ([#3518](https://github.com/ReVanced/revanced-patches/issues/3518)) ([f4e23cb](https://github.com/ReVanced/revanced-patches/commit/f4e23cbb8a24638318d8cee20a1991c51855d9d2))
## [4.12.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.12.0...v4.12.1-dev.1) (2024-08-15)
### Bug Fixes
* **YouTube - GmsCore support:** Fix notifications not working by using the correct permissions ([19ddae2](https://github.com/ReVanced/revanced-patches/commit/19ddae2d15e513e18eb1556c468cd94bd197685b))
# [4.12.0](https://github.com/ReVanced/revanced-patches/compare/v4.11.0...v4.12.0) (2024-08-06)
### Bug Fixes
* **Google Photos - GmsCore support:** Fix by checking first if a method exists before trying to patch it ([acf38ca](https://github.com/ReVanced/revanced-patches/commit/acf38cafae5eb9896b43f3a6cbd808ac273cd081))
* **Instagram - Hide ads:** Restore compatibility with latest version by fixing fingerprint ([#3455](https://github.com/ReVanced/revanced-patches/issues/3455)) ([4505fa4](https://github.com/ReVanced/revanced-patches/commit/4505fa4138bb55c8957790239c01b8dda63d6cdd))
* **Messenger - Disable switching emoji to sticker:** Constrain to last working version `439.0.0.29.119` ([6207c31](https://github.com/ReVanced/revanced-patches/commit/6207c314c657a1188d1081b0a196a61e49cad83b))
* **SoundCloud - Enable offline sync:** Stop crashing by reversing order of patching instructions from last to first to retain indices ([63b6ced](https://github.com/ReVanced/revanced-patches/commit/63b6cede5fa5bcf377ced422da4e861996a41f0d))
* **YouTube - Bypass image region restrictions:** Move setting to `Misc` menu ([094ae59](https://github.com/ReVanced/revanced-patches/commit/094ae59fc92663fff6c5d6f5cbece41822a326f9))
* **YouTube - Client Spoof:** Restore missing high qualities by spoofing the iOS client user agent ([#3468](https://github.com/ReVanced/revanced-patches/issues/3468)) ([0e6ae5f](https://github.com/ReVanced/revanced-patches/commit/0e6ae5fee752a76604cf9b95f9a76c0cbe5f7dae))
* **YouTube - Hide keyword content:** Do not hide flyout menu ([687c9f7](https://github.com/ReVanced/revanced-patches/commit/687c9f7eb03cca5f7b3486f07f2e3453ebc77faf))
* **YouTube - SponsorBlock:** Correctly show minute timestamp when creating a new segment ([d74c366](https://github.com/ReVanced/revanced-patches/commit/d74c366dbf5f25c20fbfc5a0157c3c15dda82a16))
* **YouTube - SponsorBlock:** Improve create segment manual seek accuracy ([#3491](https://github.com/ReVanced/revanced-patches/issues/3491)) ([1544981](https://github.com/ReVanced/revanced-patches/commit/15449819ff74b636fb2fa6aacd770142c51d2e5d))
* **YouTube - Spoof client:** Fix tracking history on brand accounts ([#3480](https://github.com/ReVanced/revanced-patches/issues/3480)) ([69c1f16](https://github.com/ReVanced/revanced-patches/commit/69c1f16f7eb0d5759a44f7f7a09b1757ce8f61dd))
* **YouTube - Spoof client:** Restore livestream audio only playback with iOS spoofing ([#3504](https://github.com/ReVanced/revanced-patches/issues/3504)) ([90d3288](https://github.com/ReVanced/revanced-patches/commit/90d32880906787d82c4b9a7a1099b46dff3a0870))
### Features
* Add `Hide mock location` patch ([#3417](https://github.com/ReVanced/revanced-patches/issues/3417)) ([5f81b40](https://github.com/ReVanced/revanced-patches/commit/5f81b40e7d5567fb5689d08ccc9caeaa267c3143))
* Add `Spoof build info` patch ([e7829b4](https://github.com/ReVanced/revanced-patches/commit/e7829b41e782c9feda23b9d6acf48bae277d24d9))
* **Boost for Reddit:** Add `Disable ads` patch ([#3474](https://github.com/ReVanced/revanced-patches/issues/3474)) ([b292c20](https://github.com/ReVanced/revanced-patches/commit/b292c200bf4ea5b4f71d96690ac011e7843552f0))
* **CandyLink:** Remove non-functional `Unlock pro` patch ([7ae9f8f](https://github.com/ReVanced/revanced-patches/commit/7ae9f8fa0a349b91853e9554f18e564ca6ff887c))
* **Expense Manager:** Remove non-functional `Unlock pro` patch ([ebbcac7](https://github.com/ReVanced/revanced-patches/commit/ebbcac74fd8598daebb4be0bd7c430c41333e2d4))
* **Google News:** Add `Enable CustomTabs` and `GmsCore support` patch ([#3111](https://github.com/ReVanced/revanced-patches/issues/3111)) ([ad59096](https://github.com/ReVanced/revanced-patches/commit/ad590962275f888b335252ad5bed0f34e959d3c7))
* **Google Photos:** Add `GmsCore support` patch ([#3414](https://github.com/ReVanced/revanced-patches/issues/3414)) ([24528e0](https://github.com/ReVanced/revanced-patches/commit/24528e0a6eec17ce0a3c52f8862585933615ad28))
* **Instagram:** Remove unnecessary `Hide timeline ads` patch ([5e1d001](https://github.com/ReVanced/revanced-patches/commit/5e1d001056df68e1e2b39f1365215c91bcc9e46b))
* **SoundCloud:** Add `Enable offline sync` patch ([#3407](https://github.com/ReVanced/revanced-patches/issues/3407)) ([4de86c6](https://github.com/ReVanced/revanced-patches/commit/4de86c6407376bcd3cc0513a2f0707410b8d7ccd))
* **SwissID:** Add `Remove Google Play Integrity Integrity check` patch ([#3478](https://github.com/ReVanced/revanced-patches/issues/3478)) ([60492ae](https://github.com/ReVanced/revanced-patches/commit/60492aea7863e07d8bf1af9380ae9295ca161f3c))
* **YouTube - Description components:** Add `Hide 'Key concepts' section` option ([#3495](https://github.com/ReVanced/revanced-patches/issues/3495)) ([d75b645](https://github.com/ReVanced/revanced-patches/commit/d75b64595a7ac26faca4c0ae21923b22f6783975))
* **YouTube:** Add `Bypass image region restrictions` patch ([#3442](https://github.com/ReVanced/revanced-patches/issues/3442)) ([765fab2](https://github.com/ReVanced/revanced-patches/commit/765fab2af2769349446cc0f2109343ef3bd8c621))
# [4.12.0-dev.17](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.16...v4.12.0-dev.17) (2024-08-06)
### Bug Fixes
* **Google Photos - GmsCore support:** Fix by checking first if a method exists before trying to patch it ([acf38ca](https://github.com/ReVanced/revanced-patches/commit/acf38cafae5eb9896b43f3a6cbd808ac273cd081))
* **Messenger - Disable switching emoji to sticker:** Constrain to last working version `439.0.0.29.119` ([6207c31](https://github.com/ReVanced/revanced-patches/commit/6207c314c657a1188d1081b0a196a61e49cad83b))
### Features
* **CandyLink:** Remove non-functional `Unlock pro` patch ([7ae9f8f](https://github.com/ReVanced/revanced-patches/commit/7ae9f8fa0a349b91853e9554f18e564ca6ff887c))
* **Expense Manager:** Remove non-functional `Unlock pro` patch ([ebbcac7](https://github.com/ReVanced/revanced-patches/commit/ebbcac74fd8598daebb4be0bd7c430c41333e2d4))
* **Instagram:** Remove unnecessary `Hide timeline ads` patch ([5e1d001](https://github.com/ReVanced/revanced-patches/commit/5e1d001056df68e1e2b39f1365215c91bcc9e46b))
# [4.12.0-dev.16](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.15...v4.12.0-dev.16) (2024-08-04)
### Bug Fixes
* **YouTube - Spoof client:** Restore livestream audio only playback with iOS spoofing ([#3504](https://github.com/ReVanced/revanced-patches/issues/3504)) ([90d3288](https://github.com/ReVanced/revanced-patches/commit/90d32880906787d82c4b9a7a1099b46dff3a0870))
# [4.12.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.14...v4.12.0-dev.15) (2024-08-02)
### Bug Fixes
* **YouTube - SponsorBlock:** Improve create segment manual seek accuracy ([#3491](https://github.com/ReVanced/revanced-patches/issues/3491)) ([1544981](https://github.com/ReVanced/revanced-patches/commit/15449819ff74b636fb2fa6aacd770142c51d2e5d))
# [4.12.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.13...v4.12.0-dev.14) (2024-08-01)
### Features
* **YouTube - Description components:** Add `Hide 'Key concepts' section` option ([#3495](https://github.com/ReVanced/revanced-patches/issues/3495)) ([d75b645](https://github.com/ReVanced/revanced-patches/commit/d75b64595a7ac26faca4c0ae21923b22f6783975))
# [4.12.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.12...v4.12.0-dev.13) (2024-07-31)
### Features
* **Boost for Reddit:** Add `Disable ads` patch ([#3474](https://github.com/ReVanced/revanced-patches/issues/3474)) ([b292c20](https://github.com/ReVanced/revanced-patches/commit/b292c200bf4ea5b4f71d96690ac011e7843552f0))
# [4.12.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.11...v4.12.0-dev.12) (2024-07-28)
### Features
* **SwissID:** Add `Remove Google Play Integrity Integrity check` patch ([#3478](https://github.com/ReVanced/revanced-patches/issues/3478)) ([60492ae](https://github.com/ReVanced/revanced-patches/commit/60492aea7863e07d8bf1af9380ae9295ca161f3c))
# [4.12.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.10...v4.12.0-dev.11) (2024-07-28)
### Bug Fixes
* **YouTube - Bypass image region restrictions:** Move setting to `Misc` menu ([094ae59](https://github.com/ReVanced/revanced-patches/commit/094ae59fc92663fff6c5d6f5cbece41822a326f9))
# [4.12.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.9...v4.12.0-dev.10) (2024-07-28)
### Bug Fixes
* **YouTube - Client Spoof:** Restore missing high qualities by spoofing the iOS client user agent ([#3468](https://github.com/ReVanced/revanced-patches/issues/3468)) ([0e6ae5f](https://github.com/ReVanced/revanced-patches/commit/0e6ae5fee752a76604cf9b95f9a76c0cbe5f7dae))
# [4.12.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.8...v4.12.0-dev.9) (2024-07-28)
### Bug Fixes
* **YouTube - Spoof client:** Fix tracking history on brand accounts ([#3480](https://github.com/ReVanced/revanced-patches/issues/3480)) ([69c1f16](https://github.com/ReVanced/revanced-patches/commit/69c1f16f7eb0d5759a44f7f7a09b1757ce8f61dd))
# [4.12.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.7...v4.12.0-dev.8) (2024-07-26)
### Bug Fixes
* **YouTube - SponsorBlock:** Correctly show minute timestamp when creating a new segment ([d74c366](https://github.com/ReVanced/revanced-patches/commit/d74c366dbf5f25c20fbfc5a0157c3c15dda82a16))
# [4.12.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.6...v4.12.0-dev.7) (2024-07-24)
### Bug Fixes
* **SoundCloud - Enable offline sync:** Stop crashing by reversing order of patching instructions from last to first to retain indices ([63b6ced](https://github.com/ReVanced/revanced-patches/commit/63b6cede5fa5bcf377ced422da4e861996a41f0d))
# [4.12.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.5...v4.12.0-dev.6) (2024-07-20)
### Features
* Add `Spoof build info` patch ([e7829b4](https://github.com/ReVanced/revanced-patches/commit/e7829b41e782c9feda23b9d6acf48bae277d24d9))
# [4.12.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.4...v4.12.0-dev.5) (2024-07-20)
### Features
* Add `Hide mock location` patch ([#3417](https://github.com/ReVanced/revanced-patches/issues/3417)) ([5f81b40](https://github.com/ReVanced/revanced-patches/commit/5f81b40e7d5567fb5689d08ccc9caeaa267c3143))
* **Google Photos:** Add `GmsCore support` patch ([#3414](https://github.com/ReVanced/revanced-patches/issues/3414)) ([24528e0](https://github.com/ReVanced/revanced-patches/commit/24528e0a6eec17ce0a3c52f8862585933615ad28))
# [4.12.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.3...v4.12.0-dev.4) (2024-07-20)
### Features
* **Google News:** Add `Enable CustomTabs` and `GmsCore support` patch ([#3111](https://github.com/ReVanced/revanced-patches/issues/3111)) ([ad59096](https://github.com/ReVanced/revanced-patches/commit/ad590962275f888b335252ad5bed0f34e959d3c7))
# [4.12.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.2...v4.12.0-dev.3) (2024-07-18)
### Bug Fixes
* **Instagram - Hide ads:** Restore compatibility with latest version by fixing fingerprint ([#3455](https://github.com/ReVanced/revanced-patches/issues/3455)) ([4505fa4](https://github.com/ReVanced/revanced-patches/commit/4505fa4138bb55c8957790239c01b8dda63d6cdd))
# [4.12.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.1...v4.12.0-dev.2) (2024-07-15)
### Features
* **YouTube:** Add `Bypass image region restrictions` patch ([#3442](https://github.com/ReVanced/revanced-patches/issues/3442)) ([765fab2](https://github.com/ReVanced/revanced-patches/commit/765fab2af2769349446cc0f2109343ef3bd8c621))
# [4.12.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.11.1-dev.1...v4.12.0-dev.1) (2024-07-13)
### Features
* **SoundCloud:** Add `Enable offline sync` patch ([#3407](https://github.com/ReVanced/revanced-patches/issues/3407)) ([4de86c6](https://github.com/ReVanced/revanced-patches/commit/4de86c6407376bcd3cc0513a2f0707410b8d7ccd))
## [4.11.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.11.0...v4.11.1-dev.1) (2024-07-12)
### Bug Fixes
* **YouTube - Hide keyword content:** Do not hide flyout menu ([687c9f7](https://github.com/ReVanced/revanced-patches/commit/687c9f7eb03cca5f7b3486f07f2e3453ebc77faf))
## [4.11.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.11.0...v4.11.1-dev.1) (2024-07-12)
### Bug Fixes
* **YouTube - Hide keyword content:** Do not hide flyout menu ([687c9f7](https://github.com/ReVanced/revanced-patches/commit/687c9f7eb03cca5f7b3486f07f2e3453ebc77faf))
# [4.11.0](https://github.com/ReVanced/revanced-patches/compare/v4.10.0...v4.11.0) (2024-07-11)
### Bug Fixes
* **Boost for reddit - Fix missing audio in video downloads:** Replace correct strings ([#3379](https://github.com/ReVanced/revanced-patches/issues/3379)) ([b43db98](https://github.com/ReVanced/revanced-patches/commit/b43db98e8483e2939d8fb9cd02443f24aeaae3c3))
* **Windy - Unlock pro:** Revert changing package name ([#3402](https://github.com/ReVanced/revanced-patches/issues/3402)) ([541f1e7](https://github.com/ReVanced/revanced-patches/commit/541f1e702665630a3737f67a4cc0c4f7b4899f8f))
* **Windy - Unlock pro:** Use correct package name ([#3397](https://github.com/ReVanced/revanced-patches/issues/3397)) ([1d8459a](https://github.com/ReVanced/revanced-patches/commit/1d8459ac992b12371c41df3c25b6386119770d15))
* **YouTube - Hide layout components:** Detect if a keyword filter hides all videos ([#3365](https://github.com/ReVanced/revanced-patches/issues/3365)) ([6aa47ec](https://github.com/ReVanced/revanced-patches/commit/6aa47ec1050cf32158ab608441c0649501184971))
* **YouTube - Settings:** Move some settings to different menus, adjust default setting values ([#3415](https://github.com/ReVanced/revanced-patches/issues/3415)) ([7201ac4](https://github.com/ReVanced/revanced-patches/commit/7201ac45c158682413c8584aac7bb37b770fc924))
* **YouTube - SponsorBlock:** Skip segments when casting ([#3331](https://github.com/ReVanced/revanced-patches/issues/3331)) ([d9395fd](https://github.com/ReVanced/revanced-patches/commit/d9395fdbca45cf68fbc63469e228eefbd6c2bf2e))
### Features
* Add `Remove share targets` patch ([#3334](https://github.com/ReVanced/revanced-patches/issues/3334)) ([9414122](https://github.com/ReVanced/revanced-patches/commit/94141228163aee8d051491db51fc1e4c8b86f0e6))
* Add translations ([#2963](https://github.com/ReVanced/revanced-patches/issues/2963)) ([69ea6f3](https://github.com/ReVanced/revanced-patches/commit/69ea6f3bc2b5f419320f17c150489dcb9eed76ce))
* **Bandcamp:** Add `Remove play limits` patch ([#3366](https://github.com/ReVanced/revanced-patches/issues/3366)) ([ad8d3bb](https://github.com/ReVanced/revanced-patches/commit/ad8d3bb1c86f1324234e890f1171ec4a18e56dd9))
* **Instagram:** Add `Hide ads` patch ([#3380](https://github.com/ReVanced/revanced-patches/issues/3380)) ([c6b2f8c](https://github.com/ReVanced/revanced-patches/commit/c6b2f8c0172b4fd142927d9448ed855831c86ae4))
* **RAR:** Add `Hide purchase reminder` patch ([#3321](https://github.com/ReVanced/revanced-patches/issues/3321)) ([8fbe7e3](https://github.com/ReVanced/revanced-patches/commit/8fbe7e3d38c43adfa0755bcbe87f8c6b7696da3a))
* **Soundcloud:** Add `Hide ads` and `Disable telemetry` patch ([#3386](https://github.com/ReVanced/revanced-patches/issues/3386)) ([3c79f3d](https://github.com/ReVanced/revanced-patches/commit/3c79f3d34d978aead60de19e64d05fbebc1bc73a))
* **Stocard:** Add `Hide offers tab` and `Hide story bubbles` patch ([#3359](https://github.com/ReVanced/revanced-patches/issues/3359)) ([fbd0507](https://github.com/ReVanced/revanced-patches/commit/fbd0507ce5cdeb93a1f661aa8097139c61e643a0))
# [4.11.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v4.11.0-dev.6...v4.11.0-dev.7) (2024-07-10)
### Features
* **Bandcamp:** Add `Remove play limits` patch ([#3366](https://github.com/ReVanced/revanced-patches/issues/3366)) ([ad8d3bb](https://github.com/ReVanced/revanced-patches/commit/ad8d3bb1c86f1324234e890f1171ec4a18e56dd9))
# [4.11.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v4.11.0-dev.5...v4.11.0-dev.6) (2024-07-10)

View File

@@ -22,6 +22,50 @@ public final class app/revanced/patches/all/interaction/gestures/PredictiveBackG
public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V
}
public final class app/revanced/patches/all/location/hide/HideMockLocationPatch : app/revanced/patches/all/misc/transformation/BaseTransformInstructionsPatch {
public static final field INSTANCE Lapp/revanced/patches/all/location/hide/HideMockLocationPatch;
public synthetic fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Ljava/lang/Object;
public fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Lkotlin/Pair;
public synthetic fun transform (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Object;)V
public fun transform (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Lkotlin/Pair;)V
}
public abstract class app/revanced/patches/all/misc/build/BaseSpoofBuildInfoPatch : app/revanced/patches/all/misc/transformation/BaseTransformInstructionsPatch {
public fun <init> ()V
public synthetic fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Ljava/lang/Object;
public fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Lkotlin/Pair;
protected fun getBoard ()Ljava/lang/String;
protected fun getBootloader ()Ljava/lang/String;
protected fun getBrand ()Ljava/lang/String;
protected fun getCpuAbi ()Ljava/lang/String;
protected fun getCpuAbi2 ()Ljava/lang/String;
protected fun getDevice ()Ljava/lang/String;
protected fun getDisplay ()Ljava/lang/String;
protected fun getFingerprint ()Ljava/lang/String;
protected fun getHardware ()Ljava/lang/String;
protected fun getHost ()Ljava/lang/String;
protected fun getId ()Ljava/lang/String;
protected fun getManufacturer ()Ljava/lang/String;
protected fun getModel ()Ljava/lang/String;
protected fun getOdmSku ()Ljava/lang/String;
protected fun getProduct ()Ljava/lang/String;
protected fun getRadio ()Ljava/lang/String;
protected fun getSerial ()Ljava/lang/String;
protected fun getSku ()Ljava/lang/String;
protected fun getSocManufacturer ()Ljava/lang/String;
protected fun getSocModel ()Ljava/lang/String;
protected fun getTags ()Ljava/lang/String;
protected fun getTime ()Ljava/lang/Long;
protected fun getType ()Ljava/lang/String;
protected fun getUser ()Ljava/lang/String;
public synthetic fun transform (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Object;)V
public fun transform (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Lkotlin/Pair;)V
}
public final class app/revanced/patches/all/misc/build/SpoofBuildInfoPatch : app/revanced/patches/all/misc/build/BaseSpoofBuildInfoPatch {
public fun <init> ()V
}
public final class app/revanced/patches/all/misc/debugging/EnableAndroidDebuggingPatch : app/revanced/patcher/patch/ResourcePatch {
public static final field INSTANCE Lapp/revanced/patches/all/misc/debugging/EnableAndroidDebuggingPatch;
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
@@ -181,6 +225,12 @@ public final class app/revanced/patches/backdrops/misc/pro/ProUnlockPatch : app/
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/candylinkvpn/UnlockProPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/candylinkvpn/UnlockProPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
@@ -193,6 +243,18 @@ public final class app/revanced/patches/cieid/restrictions/root/BypassRootChecks
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/duolingo/ad/DisableAdsPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/duolingo/ad/DisableAdsPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/duolingo/debug/EnableDebugMenuPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/duolingo/debug/EnableDebugMenuPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/facebook/ads/story/HideStoryAdsPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/facebook/ads/story/HideStoryAdsPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
@@ -211,6 +273,46 @@ public final class app/revanced/patches/finanzonline/detection/root/RootDetectio
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/googlenews/customtabs/EnableCustomTabs : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/googlenews/customtabs/EnableCustomTabs;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch : app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportPatch {
public static final field INSTANCE Lapp/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch;
}
public final class app/revanced/patches/googlenews/misc/gms/GmsCoreSupportResourcePatch : app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportResourcePatch {
public static final field INSTANCE Lapp/revanced/patches/googlenews/misc/gms/GmsCoreSupportResourcePatch;
}
public final class app/revanced/patches/googlenews/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch {
public static final field INSTANCE Lapp/revanced/patches/googlenews/misc/integrations/IntegrationsPatch;
}
public final class app/revanced/patches/googlephotos/features/SpoofFeaturesPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/googlephotos/features/SpoofFeaturesPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/googlephotos/features/fingerprints/InitializeFeaturesEnumFingerprint : app/revanced/patcher/fingerprint/MethodFingerprint {
public static final field INSTANCE Lapp/revanced/patches/googlephotos/features/fingerprints/InitializeFeaturesEnumFingerprint;
}
public final class app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatch : app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportPatch {
public static final field INSTANCE Lapp/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatch;
}
public final class app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportResourcePatch : app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportResourcePatch {
public static final field INSTANCE Lapp/revanced/patches/googlephotos/misc/gms/GmsCoreSupportResourcePatch;
}
public final class app/revanced/patches/googlephotos/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch {
public static final field INSTANCE Lapp/revanced/patches/googlephotos/misc/integrations/IntegrationsPatch;
}
public final class app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
@@ -343,6 +445,12 @@ public final class app/revanced/patches/music/ad/video/HideMusicVideoAds : app/r
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/music/ad/video/HideVideoAds : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/music/ad/video/HideVideoAds;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/music/ad/video/MusicVideoAdsPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/music/ad/video/MusicVideoAdsPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
@@ -604,6 +712,12 @@ public final class app/revanced/patches/reddit/customclients/baconreader/api/Spo
public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V
}
public final class app/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/BaseSpoofClientPatch {
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch;
public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V
@@ -1044,6 +1158,12 @@ public final class app/revanced/patches/soundcloud/analytics/DisableTelemetryPat
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/soundcloud/offlinesync/EnableOfflineSyncPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/soundcloud/offlinesync/EnableOfflineSyncPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/spotify/layout/theme/CustomThemePatch : app/revanced/patcher/patch/ResourcePatch {
public static final field INSTANCE Lapp/revanced/patches/spotify/layout/theme/CustomThemePatch;
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
@@ -1092,6 +1212,12 @@ public final class app/revanced/patches/strava/upselling/DisableSubscriptionSugg
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/swissid/integritycheck/RemoveGooglePlayIntegrityCheck : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/swissid/integritycheck/RemoveGooglePlayIntegrityCheck;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/ticktick/misc/themeunlock/UnlockProPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/ticktick/misc/themeunlock/UnlockProPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
@@ -1712,6 +1838,12 @@ public final class app/revanced/patches/youtube/layout/thumbnails/AlternativeThu
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictions : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictions;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/youtube/misc/announcements/AnnouncementsPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
@@ -1778,6 +1910,16 @@ public final class app/revanced/patches/youtube/misc/gms/GmsCoreSupportResourceP
public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V
}
public final class app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook;
public final fun addImageUrlErrorCallbackHook (Ljava/lang/String;)V
public final fun addImageUrlHook (Ljava/lang/String;Z)V
public static synthetic fun addImageUrlHook$default (Lapp/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook;Ljava/lang/String;ZILjava/lang/Object;)V
public final fun addImageUrlSuccessCallbackHook (Ljava/lang/String;)V
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/youtube/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch {
public static final field INSTANCE Lapp/revanced/patches/youtube/misc/integrations/IntegrationsPatch;
}
@@ -1990,6 +2132,7 @@ public final class app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPat
}
public final class app/revanced/util/BytecodeUtilsKt {
public static final fun alsoResolve (Lapp/revanced/patcher/fingerprint/MethodFingerprint;Lapp/revanced/patcher/data/BytecodeContext;Lapp/revanced/patcher/fingerprint/MethodFingerprint;)Lapp/revanced/patcher/fingerprint/MethodFingerprintResult;
public static final fun containsWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)Z
public static final fun findMutableMethodOf (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lcom/android/tools/smali/dexlib2/iface/Method;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;
public static final fun findOpcodeIndicesReversed (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)Ljava/util/List;
@@ -2005,7 +2148,11 @@ public final class app/revanced/util/BytecodeUtilsKt {
public static final fun indexOfIdResourceOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I
public static final fun injectHideViewCall (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V
public static final fun resultOrThrow (Lapp/revanced/patcher/fingerprint/MethodFingerprint;)Lapp/revanced/patcher/fingerprint/MethodFingerprintResult;
public static final fun returnEarly (Lapp/revanced/patcher/fingerprint/MethodFingerprint;Z)V
public static final fun returnEarly (Ljava/lang/Iterable;Z)V
public static final fun returnEarly (Ljava/util/List;Z)V
public static synthetic fun returnEarly$default (Lapp/revanced/patcher/fingerprint/MethodFingerprint;ZILjava/lang/Object;)V
public static synthetic fun returnEarly$default (Ljava/lang/Iterable;ZILjava/lang/Object;)V
public static synthetic fun returnEarly$default (Ljava/util/List;ZILjava/lang/Object;)V
public static final fun transformMethods (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lkotlin/jvm/functions/Function1;)V
public static final fun traverseClassHierarchy (Lapp/revanced/patcher/data/BytecodeContext;Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lkotlin/jvm/functions/Function1;)V

View File

@@ -1,4 +1,4 @@
org.gradle.parallel = true
org.gradle.caching = true
kotlin.code.style = official
version = 4.11.0-dev.6
version = 4.14.0-dev.2

View File

@@ -2,9 +2,9 @@
revanced-patcher = "19.3.1"
#noinspection GradleDependency
smali = "3.0.5" # 3.0.7 breaks binary compatibility. Tracking https://github.com/google/smali/issues/58.
guava = "33.1.0-jre"
gson = "2.10.1"
binary-compatibility-validator = "0.14.0"
guava = "33.2.1-jre"
gson = "2.11.0"
binary-compatibility-validator = "0.15.1"
kotlin = "2.0.0"
[libraries]

View File

@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

2152
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,7 @@
"@saithodev/semantic-release-backmerge": "^4.0.1",
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"gradle-semantic-release-plugin": "^1.9.1",
"semantic-release": "^23.0.8"
"gradle-semantic-release-plugin": "^1.9.2",
"semantic-release": "^24.0.0"
}
}

View File

@@ -0,0 +1,56 @@
@file:Suppress("unused")
package app.revanced.patches.all.location.hide
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.all.misc.transformation.BaseTransformInstructionsPatch
import app.revanced.patches.all.misc.transformation.IMethodCall
import app.revanced.patches.all.misc.transformation.fromMethodReference
import app.revanced.util.getReference
import com.android.tools.smali.dexlib2.iface.ClassDef
import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.Instruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@Patch(
name = "Hide mock location",
description = "Prevents the app from knowing the device location is being mocked by a third party app.",
use = false
)
object HideMockLocationPatch : BaseTransformInstructionsPatch<Pair<Instruction, Int>>() {
override fun filterMap(
classDef: ClassDef,
method: Method,
instruction: Instruction,
instructionIndex: Int
): Pair<Instruction, Int>? {
val reference = instruction.getReference<MethodReference>() ?: return null
if (fromMethodReference<MethodCall>(reference) == null) return null
return instruction to instructionIndex
}
override fun transform(mutableMethod: MutableMethod, entry: Pair<Instruction, Int>) {
val (instruction, index) = entry
instruction as FiveRegisterInstruction
// Replace return value with a constant `false` boolean.
mutableMethod.replaceInstruction(
index + 1,
"const/4 v${instruction.registerC}, 0x0"
)
}
}
private enum class MethodCall(
override val definedClassName: String,
override val methodName: String,
override val methodParams: Array<String>,
override val returnType: String
) : IMethodCall {
IsMock("Landroid/location/Location;", "isMock", emptyArray(), "Z"),
IsFromMockProvider("Landroid/location/Location;", "isFromMockProvider", emptyArray(), "Z")
}

View File

@@ -0,0 +1,120 @@
package app.revanced.patches.all.misc.build
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.all.misc.transformation.BaseTransformInstructionsPatch
import app.revanced.util.getReference
import com.android.tools.smali.dexlib2.iface.ClassDef
import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.instruction.Instruction
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
abstract class BaseSpoofBuildInfoPatch : BaseTransformInstructionsPatch<Pair<Int, Pair<String, String>>>() {
// The build information supported32BitAbis, supported64BitAbis, and supportedAbis are not supported for now,
// because initializing an array in transform is a bit more complex.
protected open val board: String? = null
protected open val bootloader: String? = null
protected open val brand: String? = null
protected open val cpuAbi: String? = null
protected open val cpuAbi2: String? = null
protected open val device: String? = null
protected open val display: String? = null
protected open val fingerprint: String? = null
protected open val hardware: String? = null
protected open val host: String? = null
protected open val id: String? = null
protected open val manufacturer: String? = null
protected open val model: String? = null
protected open val odmSku: String? = null
protected open val product: String? = null
protected open val radio: String? = null
protected open val serial: String? = null
protected open val sku: String? = null
protected open val socManufacturer: String? = null
protected open val socModel: String? = null
protected open val tags: String? = null
protected open val time: Long? = null
protected open val type: String? = null
protected open val user: String? = null
// Lazy, so that patch options above are initialized before they are accessed.
private val replacements: Map<String, Pair<String, String>> by lazy {
buildMap {
if (board != null) put("BOARD", "const-string" to "\"$board\"")
if (bootloader != null) put("BOOTLOADER", "const-string" to "\"$bootloader\"")
if (brand != null) put("BRAND", "const-string" to "\"$brand\"")
if (cpuAbi != null) put("CPU_ABI", "const-string" to "\"$cpuAbi\"")
if (cpuAbi2 != null) put("CPU_ABI2", "const-string" to "\"$cpuAbi2\"")
if (device != null) put("DEVICE", "const-string" to "\"$device\"")
if (display != null) put("DISPLAY", "const-string" to "\"$display\"")
if (fingerprint != null) put("FINGERPRINT", "const-string" to "\"$fingerprint\"")
if (hardware != null) put("HARDWARE", "const-string" to "\"$hardware\"")
if (host != null) put("HOST", "const-string" to "\"$host\"")
if (id != null) put("ID", "const-string" to "\"$id\"")
if (manufacturer != null) put("MANUFACTURER", "const-string" to "\"$manufacturer\"")
if (model != null) put("MODEL", "const-string" to "\"$model\"")
if (odmSku != null) put("ODM_SKU", "const-string" to "\"$odmSku\"")
if (product != null) put("PRODUCT", "const-string" to "\"$product\"")
if (radio != null) put("RADIO", "const-string" to "\"$radio\"")
if (serial != null) put("SERIAL", "const-string" to "\"$serial\"")
if (sku != null) put("SKU", "const-string" to "\"$sku\"")
if (socManufacturer != null) put("SOC_MANUFACTURER", "const-string" to "\"$socManufacturer\"")
if (socModel != null) put("SOC_MODEL", "const-string" to "\"$socModel\"")
if (tags != null) put("TAGS", "const-string" to "\"$tags\"")
if (time != null) put("TIME", "const-wide" to "$time")
if (type != null) put("TYPE", "const-string" to "\"$type\"")
if (user != null) put("USER", "const-string" to "\"$user\"")
}
}
override fun filterMap(
classDef: ClassDef,
method: Method,
instruction: Instruction,
instructionIndex: Int
): Pair<Int, Pair<String, String>>? {
val reference = instruction.getReference<FieldReference>() ?: return null
if (reference.definingClass != BUILD_CLASS_DESCRIPTOR) return null
return replacements[reference.name]?.let { instructionIndex to it }
}
override fun transform(mutableMethod: MutableMethod, entry: Pair<Int, Pair<String, String>>) {
val (index, replacement) = entry
val (opcode, operand) = replacement
val register = mutableMethod.getInstruction<OneRegisterInstruction>(index).registerA
mutableMethod.replaceInstruction(index, "$opcode v$register, $operand")
}
private companion object {
private const val BUILD_CLASS_DESCRIPTOR = "Landroid/os/Build;"
}
}

View File

@@ -0,0 +1,183 @@
package app.revanced.patches.all.misc.build
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.longPatchOption
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption
@Patch(
name = "Spoof build info",
description = "Spoof the information about the current build.",
use = false
)
@Suppress("unused")
class SpoofBuildInfoPatch : BaseSpoofBuildInfoPatch() {
override val board by stringPatchOption(
key = "board",
default = null,
title = "Board",
description = "The name of the underlying board, like \"goldfish\"."
)
override val bootloader by stringPatchOption(
key = "bootloader",
default = null,
title = "Bootloader",
description = "The system bootloader version number."
)
override val brand by stringPatchOption(
key = "brand",
default = null,
title = "Brand",
description = "The consumer-visible brand with which the product/hardware will be associated, if any."
)
override val cpuAbi by stringPatchOption(
key = "cpu-abi",
default = null,
title = "CPU ABI",
description = "This field was deprecated in API level 21. Use SUPPORTED_ABIS instead."
)
override val cpuAbi2 by stringPatchOption(
key = "cpu-abi-2",
default = null,
title = "CPU ABI 2",
description = "This field was deprecated in API level 21. Use SUPPORTED_ABIS instead."
)
override val device by stringPatchOption(
key = "device",
default = null,
title = "Device",
description = "The name of the industrial design."
)
override val display by stringPatchOption(
key = "display",
default = null,
title = "Display",
description = "A build ID string meant for displaying to the user."
)
override val fingerprint by stringPatchOption(
key = "fingerprint",
default = null,
title = "Fingerprint",
description = "A string that uniquely identifies this build."
)
override val hardware by stringPatchOption(
key = "hardware",
default = null,
title = "Hardware",
description = "The name of the hardware (from the kernel command line or /proc)."
)
override val host by stringPatchOption(
key = "host",
default = null,
title = "Host",
description = "The host."
)
override val id by stringPatchOption(
key = "id",
default = null,
title = "ID",
description = "Either a changelist number, or a label like \"M4-rc20\"."
)
override val manufacturer by stringPatchOption(
key = "manufacturer",
default = null,
title = "Manufacturer",
description = "The manufacturer of the product/hardware."
)
override val model by stringPatchOption(
key = "model",
default = null,
title = "Model",
description = "The end-user-visible name for the end product."
)
override val odmSku by stringPatchOption(
key = "odm-sku",
default = null,
title = "ODM SKU",
description = "The SKU of the device as set by the original design manufacturer (ODM)."
)
override val product by stringPatchOption(
key = "product",
default = null,
title = "Product",
description = "The name of the overall product."
)
override val radio by stringPatchOption(
key = "radio",
default = null,
title = "Radio",
description = "This field was deprecated in API level 15. " +
"The radio firmware version is frequently not available when this class is initialized, " +
"leading to a blank or \"unknown\" value for this string. Use getRadioVersion() instead."
)
override val serial by stringPatchOption(
key = "serial",
default = null,
title = "Serial",
description = "This field was deprecated in API level 26. Use getSerial() instead."
)
override val sku by stringPatchOption(
key = "sku",
default = null,
title = "SKU",
description = "The SKU of the hardware (from the kernel command line)."
)
override val socManufacturer by stringPatchOption(
key = "soc-manufacturer",
default = null,
title = "SOC Manufacturer",
description = "The manufacturer of the device's primary system-on-chip."
)
override val socModel by stringPatchOption(
key = "soc-model",
default = null,
title = "SOC Model",
description = "The model name of the device's primary system-on-chip."
)
override val tags by stringPatchOption(
key = "tags",
default = null,
title = "Tags",
description = "Comma-separated tags describing the build, like \"unsigned,debug\"."
)
override val time by longPatchOption(
key = "time",
default = null,
title = "Time",
description = "The time at which the build was produced, given in milliseconds since the UNIX epoch."
)
override val type by stringPatchOption(
key = "type",
default = null,
title = "Type",
description = "The type of build, like \"user\" or \"eng\"."
)
override val user by stringPatchOption(
key = "user",
default = null,
title = "User",
description = "The user."
)
}

View File

@@ -83,7 +83,7 @@ object AddResourcesPatch : ResourcePatch(), MutableMap<Value, MutableSet<BaseRes
"eu-rES" to "eu",
"fa-rIR" to "fa",
"fi-rFI" to "fi",
"tl-rPH" to "tl",
"fil-rPH" to "tl",
"fr-rFR" to "fr",
"gl-rES" to "gl",
"gu-rIN" to "gu",
@@ -125,6 +125,7 @@ object AddResourcesPatch : ResourcePatch(), MutableMap<Value, MutableSet<BaseRes
"sk-rSK" to "sk",
"sl-rSI" to "sl",
"sq-rAL" to "sq",
"sr-rCS" to "b+sr+Latn",
"sr-rSP" to "sr",
"sv-rSE" to "sv",
"sw-rKE" to "sw",
@@ -138,7 +139,6 @@ object AddResourcesPatch : ResourcePatch(), MutableMap<Value, MutableSet<BaseRes
"uz-rUZ" to "uz",
"vi-rVN" to "vi",
"zh-rCN" to "zh-rCN",
"zh-rHK" to "zh-rHK",
"zh-rTW" to "zh-rTW",
"zu-rZA" to "zu",
)
@@ -347,7 +347,10 @@ object AddResourcesPatch : ResourcePatch(), MutableMap<Value, MutableSet<BaseRes
val targetFile =
context.get("res/$value/$resourceFileName.xml").also {
it.parentFile?.mkdirs()
it.createNewFile()
if(it.createNewFile()) {
it.writeText("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n</resources>")
}
}
context.xmlEditor[targetFile.path].let { editor ->

View File

@@ -0,0 +1,23 @@
package app.revanced.patches.bandcamp.limitations
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.bandcamp.limitations.fingerprints.HandlePlaybackLimitsPatch
import app.revanced.util.exception
@Patch(
name = "Remove play limits",
description = "Disables purchase nagging and playback limits of not purchased tracks.",
compatiblePackages = [CompatiblePackage("com.bandcamp.android")],
)
@Suppress("unused")
object RemovePlayLimitsPatch : BytecodePatch(
setOf(HandlePlaybackLimitsPatch),
) {
override fun execute(context: BytecodeContext) =
HandlePlaybackLimitsPatch.result?.mutableMethod?.addInstructions(0, "return-void")
?: throw HandlePlaybackLimitsPatch.exception
}

View File

@@ -0,0 +1,7 @@
package app.revanced.patches.bandcamp.limitations.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
internal object HandlePlaybackLimitsPatch : MethodFingerprint(
strings = listOf("play limits processing track", "found play_count"),
)

View File

@@ -1,20 +1,23 @@
package app.revanced.patches.candylinkvpn
import app.revanced.util.exception
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.candylinkvpn.fingerprints.IsPremiumPurchasedFingerprint
import app.revanced.util.exception
@Patch(
name = "Unlock pro",
compatiblePackages = [CompatiblePackage("com.candylink.openvpn")]
compatiblePackages = [CompatiblePackage("com.candylink.openvpn")],
)
@Deprecated(
"This patch does not work anymore and will be removed in the future, " +
"because the servers now check the purchase status.",
)
@Suppress("unused")
object UnlockProPatch : BytecodePatch(
setOf(IsPremiumPurchasedFingerprint)
setOf(IsPremiumPurchasedFingerprint),
) {
override fun execute(context: BytecodeContext) {
IsPremiumPurchasedFingerprint.result?.mutableMethod?.addInstructions(
@@ -22,7 +25,7 @@ object UnlockProPatch : BytecodePatch(
"""
const/4 v0, 0x1
return v0
"""
""",
) ?: throw IsPremiumPurchasedFingerprint.exception
}
}
}

View File

@@ -0,0 +1,41 @@
package app.revanced.patches.duolingo.ad
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.duolingo.ad.fingerprints.InitializeMonetizationDebugSettingsFingerprint
import app.revanced.util.resultOrThrow
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
@Patch(
name = "Disable ads",
compatiblePackages = [CompatiblePackage("com.duolingo")]
)
@Suppress("unused")
object DisableAdsPatch : BytecodePatch(
setOf(InitializeMonetizationDebugSettingsFingerprint)
) {
override fun execute(context: BytecodeContext) {
// Couple approaches to remove ads exist:
//
// MonetizationDebugSettings has a boolean value for "disableAds".
// OnboardingState has a getter to check if the user has any "adFreeSessions".
// SharedPreferences has a debug boolean value with key "disable_ads", which maps to "DebugCategory.DISABLE_ADS".
//
// MonetizationDebugSettings seems to be the most general setting to work fine.
InitializeMonetizationDebugSettingsFingerprint.resultOrThrow().let {
it.mutableMethod.apply {
val insertIndex = it.scanResult.patternScanResult!!.startIndex
val register = getInstruction<TwoRegisterInstruction>(insertIndex).registerA
addInstructions(
insertIndex,
"const/4 v$register, 0x1"
)
}
}
}
}

View File

@@ -0,0 +1,21 @@
package app.revanced.patches.duolingo.ad.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal object InitializeMonetizationDebugSettingsFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
parameters = listOf(
"Z", // disableAds
"Z", // useDebugBilling
"Z", // showManageSubscriptions
"Z", // alwaysShowSuperAds
"Lcom/duolingo/debug/FamilyQuestOverride;",
),
opcodes = listOf(
Opcode.IPUT_BOOLEAN
)
)

View File

@@ -0,0 +1,35 @@
package app.revanced.patches.duolingo.debug
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.duolingo.debug.fingerprints.InitializeBuildConfigProviderFingerprint
import app.revanced.util.resultOrThrow
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
@Patch(
name = "Enable debug menu",
compatiblePackages = [CompatiblePackage("com.duolingo", ["5.158.4"])],
use = false
)
@Suppress("unused")
object EnableDebugMenuPatch : BytecodePatch(
setOf(InitializeBuildConfigProviderFingerprint)
) {
override fun execute(context: BytecodeContext) {
InitializeBuildConfigProviderFingerprint.resultOrThrow().let {
it.mutableMethod.apply {
val insertIndex = it.scanResult.patternScanResult!!.startIndex
val register = getInstruction<TwoRegisterInstruction>(insertIndex).registerA
addInstructions(
insertIndex,
"const/4 v$register, 0x1"
)
}
}
}
}

View File

@@ -0,0 +1,25 @@
package app.revanced.patches.duolingo.debug.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
/**
* The `BuildConfigProvider` class has two booleans:
*
* - `isChina`: (usually) compares "play" with "china"...except for builds in China
* - `isDebug`: compares "release" with "debug" <-- we want to force this to `true`
*/
internal object InitializeBuildConfigProviderFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
strings = listOf(
"debug",
"release",
"china",
),
opcodes = listOf(
Opcode.IPUT_BOOLEAN
)
)

View File

@@ -0,0 +1,32 @@
package app.revanced.patches.googlenews.customtabs
import app.revanced.patcher.data.BytecodeContext
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.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.googlenews.customtabs.fingerprints.LaunchCustomTabFingerprint
import app.revanced.util.resultOrThrow
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@Patch(
name = "Enable CustomTabs",
description = "Enables CustomTabs to open articles in your default browser.",
compatiblePackages = [CompatiblePackage("com.google.android.apps.magazines")],
)
@Suppress("unused")
object EnableCustomTabs : BytecodePatch(
setOf(LaunchCustomTabFingerprint)
) {
override fun execute(context: BytecodeContext) {
LaunchCustomTabFingerprint.resultOrThrow().let { result ->
result.mutableMethod.apply {
val checkIndex = result.scanResult.patternScanResult!!.endIndex + 1
val register = getInstruction<OneRegisterInstruction>(checkIndex).registerA
replaceInstruction(checkIndex, "const/4 v$register, 0x1")
}
}
}
}

View File

@@ -0,0 +1,18 @@
package app.revanced.patches.googlenews.customtabs.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal object LaunchCustomTabFingerprint : MethodFingerprint(
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
opcodes = listOf(
Opcode.IPUT_OBJECT,
Opcode.CONST_4,
Opcode.IPUT,
Opcode.CONST_4,
Opcode.IPUT_BOOLEAN,
),
customFingerprint = { _, classDef -> classDef.endsWith("CustomTabsArticleLauncher;") },
)

View File

@@ -0,0 +1,6 @@
package app.revanced.patches.googlenews.misc.gms
internal object Constants {
const val MAGAZINES_PACKAGE_NAME = "com.google.android.apps.magazines"
const val REVANCED_MAGAZINES_PACKAGE_NAME = "app.revanced.android.magazines"
}

View File

@@ -0,0 +1,23 @@
package app.revanced.patches.googlenews.misc.gms
import app.revanced.patches.googlenews.misc.gms.Constants.MAGAZINES_PACKAGE_NAME
import app.revanced.patches.googlenews.misc.gms.Constants.REVANCED_MAGAZINES_PACKAGE_NAME
import app.revanced.patches.googlenews.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorGroupIdOption
import app.revanced.patches.googlenews.misc.gms.fingerprints.MagazinesActivityOnCreateFingerprint
import app.revanced.patches.googlenews.misc.integrations.IntegrationsPatch
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch
@Suppress("unused")
object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
fromPackageName = MAGAZINES_PACKAGE_NAME,
toPackageName = REVANCED_MAGAZINES_PACKAGE_NAME,
primeMethodFingerprint = null,
mainActivityOnCreateFingerprint = MagazinesActivityOnCreateFingerprint,
integrationsPatchDependency = IntegrationsPatch::class,
gmsCoreSupportResourcePatch = GmsCoreSupportResourcePatch,
// Remove version constraint,
// once https://github.com/ReVanced/revanced-patches/pull/3111#issuecomment-2240877277 is resolved.
compatiblePackages = setOf(CompatiblePackage(MAGAZINES_PACKAGE_NAME, setOf("5.108.0.644447823"))),
) {
override val gmsCoreVendorGroupId by gmsCoreVendorGroupIdOption
}

View File

@@ -0,0 +1,11 @@
package app.revanced.patches.googlenews.misc.gms
import app.revanced.patches.googlenews.misc.gms.Constants.MAGAZINES_PACKAGE_NAME
import app.revanced.patches.googlenews.misc.gms.Constants.REVANCED_MAGAZINES_PACKAGE_NAME
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportResourcePatch
object GmsCoreSupportResourcePatch : BaseGmsCoreSupportResourcePatch(
fromPackageName = MAGAZINES_PACKAGE_NAME,
toPackageName = REVANCED_MAGAZINES_PACKAGE_NAME,
spoofedPackageSignature = "24bb24c05e47e0aefa68a58a766179d9b613a666",
)

View File

@@ -0,0 +1,9 @@
package app.revanced.patches.googlenews.misc.gms.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
internal object MagazinesActivityOnCreateFingerprint : MethodFingerprint(
customFingerprint = { methodDef, classDef ->
methodDef.name == "onCreate" && classDef.endsWith("/StartActivity;")
},
)

View File

@@ -0,0 +1,7 @@
package app.revanced.patches.googlenews.misc.gms.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
internal object PrimeMethodFingerprint : MethodFingerprint(
strings = listOf("com.google.android.GoogleCamera", "com.android.vending"),
)

View File

@@ -0,0 +1,10 @@
package app.revanced.patches.googlenews.misc.integrations
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.googlenews.misc.integrations.fingerprints.StartActivityInitFingerprint
import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch
@Patch(requiresIntegrations = true)
object IntegrationsPatch : BaseIntegrationsPatch(
setOf(StartActivityInitFingerprint),
)

View File

@@ -0,0 +1,41 @@
package app.revanced.patches.googlenews.misc.integrations.fingerprints
import app.revanced.patches.googlenews.misc.integrations.fingerprints.StartActivityInitFingerprint.getApplicationContextIndex
import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
internal object StartActivityInitFingerprint : IntegrationsFingerprint(
opcodes = listOf(
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT,
Opcode.CONST_4,
Opcode.IF_EQZ,
Opcode.CONST,
Opcode.INVOKE_VIRTUAL,
Opcode.IPUT_OBJECT,
Opcode.IPUT_BOOLEAN,
Opcode.INVOKE_VIRTUAL, // Calls startActivity.getApplicationContext().
Opcode.MOVE_RESULT_OBJECT,
),
insertIndexResolver = { method ->
getApplicationContextIndex = method.indexOfFirstInstructionOrThrow {
getReference<MethodReference>()?.name == "getApplicationContext"
}
getApplicationContextIndex + 2 // Below the move-result-object instruction.
},
contextRegisterResolver = { method ->
val moveResultInstruction = method.implementation!!.instructions.elementAt(getApplicationContextIndex + 1)
as OneRegisterInstruction
moveResultInstruction.registerA
},
customFingerprint = { methodDef, classDef ->
methodDef.name == "onCreate" && classDef.endsWith("/StartActivity;")
},
) {
private var getApplicationContextIndex = -1
}

View File

@@ -0,0 +1,14 @@
package app.revanced.patches.googlephotos.features
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.all.misc.build.BaseSpoofBuildInfoPatch
@Patch(description = "Spoof build info to Google Pixel XL.")
internal class SpoofBuildInfoPatch : BaseSpoofBuildInfoPatch() {
override val brand = "google"
override val manufacturer = "Google"
override val device = "marlin"
override val product = "marlin"
override val model = "Pixel XL"
override val fingerprint = "google/marlin/marlin:10/QP1A.191005.007.A3/5972272:user/release-keys"
}

View File

@@ -0,0 +1,87 @@
package app.revanced.patches.googlephotos.features
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringArrayPatchOption
import app.revanced.patches.googlephotos.features.fingerprints.InitializeFeaturesEnumFingerprint
import app.revanced.util.getReference
import app.revanced.util.resultOrThrow
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.StringReference
@Patch(
name = "Spoof features",
description = "Spoofs the device to enable Google Pixel exclusive features, including unlimited storage.",
dependencies = [SpoofBuildInfoPatch::class],
compatiblePackages = [CompatiblePackage("com.google.android.apps.photos")],
)
@Suppress("unused")
object SpoofFeaturesPatch : BytecodePatch(setOf(InitializeFeaturesEnumFingerprint)) {
private val featuresToEnable by stringArrayPatchOption(
"featuresToEnable",
arrayOf(
"com.google.android.apps.photos.NEXUS_PRELOAD",
"com.google.android.apps.photos.nexus_preload",
),
title = "Features to enable",
description = "Google Pixel exclusive features to enable. Features up to Pixel XL enable the unlimited storage feature.",
required = true,
)
private val featuresToDisable by stringArrayPatchOption(
"featuresToDisable",
arrayOf(
"com.google.android.apps.photos.PIXEL_2017_PRELOAD",
"com.google.android.apps.photos.PIXEL_2018_PRELOAD",
"com.google.android.apps.photos.PIXEL_2019_MIDYEAR_PRELOAD",
"com.google.android.apps.photos.PIXEL_2019_PRELOAD",
"com.google.android.feature.PIXEL_2020_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2020_EXPERIENCE",
"com.google.android.feature.PIXEL_2021_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2021_EXPERIENCE",
"com.google.android.feature.PIXEL_2022_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2022_EXPERIENCE",
"com.google.android.feature.PIXEL_2023_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2023_EXPERIENCE",
"com.google.android.feature.PIXEL_2024_MIDYEAR_EXPERIENCE",
"com.google.android.feature.PIXEL_2024_EXPERIENCE",
"com.google.android.feature.PIXEL_2025_MIDYEAR_EXPERIENCE",
),
title = "Features to disable",
description = "Google Pixel exclusive features to disable." +
"Features after Pixel XL may have to be disabled for unlimited storage depending on the device.",
required = true,
)
override fun execute(context: BytecodeContext) {
val featuresToEnable = featuresToEnable!!.toSet()
val featuresToDisable = featuresToDisable!!.toSet()
InitializeFeaturesEnumFingerprint.resultOrThrow().let { result ->
result.mutableMethod.apply {
getInstructions().filter { it.opcode == Opcode.CONST_STRING }.forEach {
val feature = it.getReference<StringReference>()!!.string
val spoofedFeature = when (feature) {
in featuresToEnable -> "android.hardware.wifi"
in featuresToDisable -> "dummy"
else -> return@forEach
}
val constStringIndex = it.location.index
val constStringRegister = (it as OneRegisterInstruction).registerA
replaceInstruction(
constStringIndex,
"const-string v$constStringRegister, \"$spoofedFeature\"",
)
}
}
}
}
}

View File

@@ -0,0 +1,7 @@
package app.revanced.patches.googlephotos.features.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
object InitializeFeaturesEnumFingerprint : MethodFingerprint(
strings = listOf("com.google.android.apps.photos.NEXUS_PRELOAD"),
)

View File

@@ -0,0 +1,6 @@
package app.revanced.patches.googlephotos.misc.gms
internal object Constants {
const val PHOTOS_PACKAGE_NAME = "com.google.android.apps.photos"
const val REVANCED_PHOTOS_PACKAGE_NAME = "app.revanced.android.photos"
}

View File

@@ -0,0 +1,21 @@
package app.revanced.patches.googlephotos.misc.gms
import app.revanced.patches.googlephotos.misc.gms.Constants.PHOTOS_PACKAGE_NAME
import app.revanced.patches.googlephotos.misc.gms.Constants.REVANCED_PHOTOS_PACKAGE_NAME
import app.revanced.patches.googlephotos.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorGroupIdOption
import app.revanced.patches.googlephotos.misc.gms.fingerprints.PhotosActivityOnCreateFingerprint
import app.revanced.patches.googlephotos.misc.integrations.IntegrationsPatch
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch
@Suppress("unused")
object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
fromPackageName = PHOTOS_PACKAGE_NAME,
toPackageName = REVANCED_PHOTOS_PACKAGE_NAME,
primeMethodFingerprint = null,
mainActivityOnCreateFingerprint = PhotosActivityOnCreateFingerprint,
integrationsPatchDependency = IntegrationsPatch::class,
gmsCoreSupportResourcePatch = GmsCoreSupportResourcePatch,
compatiblePackages = setOf(CompatiblePackage(PHOTOS_PACKAGE_NAME)),
) {
override val gmsCoreVendorGroupId by gmsCoreVendorGroupIdOption
}

View File

@@ -0,0 +1,11 @@
package app.revanced.patches.googlephotos.misc.gms
import app.revanced.patches.googlephotos.misc.gms.Constants.PHOTOS_PACKAGE_NAME
import app.revanced.patches.googlephotos.misc.gms.Constants.REVANCED_PHOTOS_PACKAGE_NAME
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportResourcePatch
object GmsCoreSupportResourcePatch : BaseGmsCoreSupportResourcePatch(
fromPackageName = PHOTOS_PACKAGE_NAME,
toPackageName = REVANCED_PHOTOS_PACKAGE_NAME,
spoofedPackageSignature = "24bb24c05e47e0aefa68a58a766179d9b613a600",
)

View File

@@ -0,0 +1,9 @@
package app.revanced.patches.googlephotos.misc.gms.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
internal object PhotosActivityOnCreateFingerprint : MethodFingerprint(
customFingerprint = { methodDef, classDef ->
methodDef.name == "onCreate" && classDef.endsWith("/HomeActivity;")
},
)

View File

@@ -0,0 +1,10 @@
package app.revanced.patches.googlephotos.misc.integrations
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.googlephotos.misc.integrations.fingerprints.HomeActivityInitFingerprint
import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch
@Patch(requiresIntegrations = true)
object IntegrationsPatch : BaseIntegrationsPatch(
setOf(HomeActivityInitFingerprint),
)

View File

@@ -0,0 +1,37 @@
package app.revanced.patches.googlephotos.misc.integrations.fingerprints
import app.revanced.patches.googlephotos.misc.integrations.fingerprints.HomeActivityInitFingerprint.getApplicationContextIndex
import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
internal object HomeActivityInitFingerprint : IntegrationsFingerprint(
opcodes = listOf(
Opcode.CONST_STRING,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.IF_NEZ,
Opcode.INVOKE_VIRTUAL, // Calls getApplicationContext().
Opcode.MOVE_RESULT_OBJECT,
),
insertIndexResolver = { method ->
getApplicationContextIndex = method.indexOfFirstInstructionOrThrow {
getReference<MethodReference>()?.name == "getApplicationContext"
}
getApplicationContextIndex + 2 // Below the move-result-object instruction.
},
contextRegisterResolver = { method ->
val moveResultInstruction = method.implementation!!.instructions.elementAt(getApplicationContextIndex + 1)
as OneRegisterInstruction
moveResultInstruction.registerA
},
customFingerprint = { methodDef, classDef ->
methodDef.name == "onCreate" && classDef.endsWith("/HomeActivity;")
},
) {
private var getApplicationContextIndex = -1
}

View File

@@ -12,15 +12,15 @@ import app.revanced.util.returnEarly
@Patch(
name = "Remove root detection",
description = "Removes the check for root permissions and unlocked bootloader.",
compatiblePackages = [CompatiblePackage("at.gv.oe.app")]
compatiblePackages = [CompatiblePackage("at.gv.oe.app")],
)
@Suppress("unused")
object RootDetectionPatch : BytecodePatch(
setOf(AttestationSupportedCheckFingerprint, BootloaderCheckFingerprint, RootCheckFingerprint)
setOf(AttestationSupportedCheckFingerprint, BootloaderCheckFingerprint, RootCheckFingerprint),
) {
override fun execute(context: BytecodeContext) = listOf(
override fun execute(context: BytecodeContext) = setOf(
AttestationSupportedCheckFingerprint,
BootloaderCheckFingerprint,
RootCheckFingerprint
RootCheckFingerprint,
).returnEarly(true)
}

View File

@@ -10,7 +10,7 @@ import app.revanced.util.exception
@Patch(
name = "Hide ads",
description = "Hides ads in stories, discover, profile, etc." +
description = "Hides ads in stories, discover, profile, etc. " +
"An ad can still appear once when refreshing the home feed.",
compatiblePackages = [CompatiblePackage("com.instagram.android")],
)

View File

@@ -2,16 +2,13 @@ package app.revanced.patches.instagram.patches.ad.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal object AdInjectorFingerprint : MethodFingerprint(
returnType = "Z",
accessFlags = AccessFlags.PRIVATE.value,
parameters = listOf("L", "L"),
opcodes = listOf(
Opcode.IGET,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
strings = listOf(
"SponsoredContentController.insertItem",
"SponsoredContentController::Delivery",
),
strings = listOf("SponsoredContentController::Delivery"),
)

View File

@@ -14,9 +14,9 @@ import app.revanced.util.exception
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
@Patch(
name = "Hide timeline ads",
compatiblePackages = [CompatiblePackage("com.instagram.android")],
)
@Deprecated("This patch is not needed anymore.", replaceWith = ReplaceWith("HideAdsPatch"))
@Suppress("unused")
object HideTimelineAdsPatch : BytecodePatch(
setOf(

View File

@@ -13,7 +13,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@Patch(
name = "Disable switching emoji to sticker",
description = "Disables switching from emoji to sticker search mode in message input field.",
compatiblePackages = [CompatiblePackage("com.facebook.orca")],
compatiblePackages = [CompatiblePackage("com.facebook.orca", ["439.0.0.29.119"])],
)
@Suppress("unused")
object DisableSwitchingEmojiToStickerPatch : BytecodePatch(

View File

@@ -8,20 +8,20 @@ import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.moneymanager.fingerprints.UnlockProFingerprint
@Patch(
name = "Unlock pro",
compatiblePackages = [CompatiblePackage("com.ithebk.expensemanager")]
compatiblePackages = [CompatiblePackage("com.ithebk.expensemanager")],
)
@Deprecated("This patch is not functional anymore and will be removed in the future.")
@Suppress("unused")
object UnlockProPatch : BytecodePatch(
setOf(UnlockProFingerprint)
){
setOf(UnlockProFingerprint),
) {
override fun execute(context: BytecodeContext) {
UnlockProFingerprint.result!!.mutableMethod.addInstructions(
UnlockProFingerprint.result!!.mutableMethod.addInstructions(
0,
"""
const/4 v0, 0x1
return v0
"""
""",
)
}
}
}

View File

@@ -6,11 +6,12 @@ import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.music.ad.video.fingerprints.ShowMusicVideoAdsParentFingerprint
import app.revanced.patches.music.ad.video.fingerprints.ShowVideoAdsParentFingerprint
import app.revanced.util.exception
@Patch(
name = "Hide music video ads",
name = "Hide video ads",
description = "Hides ads that appear while listening to or streaming music videos, podcasts, or songs.",
compatiblePackages = [
CompatiblePackage(
"com.google.android.apps.youtube.music",
@@ -25,24 +26,32 @@ import app.revanced.util.exception
],
)
@Suppress("unused")
object HideMusicVideoAds : BytecodePatch(
setOf(ShowMusicVideoAdsParentFingerprint),
object HideVideoAds : BytecodePatch(
setOf(ShowVideoAdsParentFingerprint),
) {
override fun execute(context: BytecodeContext) {
ShowMusicVideoAdsParentFingerprint.result?.let {
val showMusicVideoAdsMethod = context
ShowVideoAdsParentFingerprint.result?.let {
val showVideoAdsMethod = context
.toMethodWalker(it.mutableMethod)
.nextMethod(it.scanResult.patternScanResult!!.startIndex + 1, true).getMethod() as MutableMethod
showMusicVideoAdsMethod.addInstruction(0, "const/4 p1, 0x0")
} ?: throw ShowMusicVideoAdsParentFingerprint.exception
showVideoAdsMethod.addInstruction(0, "const/4 p1, 0x0")
} ?: throw ShowVideoAdsParentFingerprint.exception
}
}
@Deprecated("This patch class has been renamed to HideMusicVideoAds.")
@Deprecated("This patch class has been renamed to HideVideoAds.")
object HideMusicVideoAds : BytecodePatch(
dependencies = setOf(HideVideoAds::class)
) {
override fun execute(context: BytecodeContext) {
}
}
@Deprecated("This patch class has been renamed to HideVideoAds.")
object MusicVideoAdsPatch : BytecodePatch(
dependencies = setOf(HideMusicVideoAds::class),
) {
override fun execute(context: BytecodeContext) {
}
}
}

View File

@@ -3,7 +3,7 @@ package app.revanced.patches.music.ad.video.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.Opcode
internal object ShowMusicVideoAdsParentFingerprint : MethodFingerprint(
internal object ShowVideoAdsParentFingerprint : MethodFingerprint(
opcodes = listOf(
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_VIRTUAL,

View File

@@ -3,7 +3,9 @@ package app.revanced.patches.music.misc.gms
import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME
import app.revanced.patches.music.misc.gms.Constants.REVANCED_MUSIC_PACKAGE_NAME
import app.revanced.patches.music.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorGroupIdOption
import app.revanced.patches.music.misc.gms.fingerprints.*
import app.revanced.patches.music.misc.gms.fingerprints.CastDynamiteModuleV2Fingerprint
import app.revanced.patches.music.misc.gms.fingerprints.MusicActivityOnCreateFingerprint
import app.revanced.patches.music.misc.gms.fingerprints.PrimeMethodFingerprint
import app.revanced.patches.music.misc.integrations.IntegrationsPatch
import app.revanced.patches.shared.fingerprints.CastContextFetchFingerprint
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch
@@ -14,9 +16,6 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
toPackageName = REVANCED_MUSIC_PACKAGE_NAME,
primeMethodFingerprint = PrimeMethodFingerprint,
earlyReturnFingerprints = setOf(
ServiceCheckFingerprint,
GooglePlayUtilityFingerprint,
CastDynamiteModuleFingerprint,
CastDynamiteModuleV2Fingerprint,
CastContextFetchFingerprint,
),
@@ -32,13 +31,10 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
"7.01.53",
"7.02.52",
"7.03.52",
)
)
),
),
),
fingerprints = setOf(
ServiceCheckFingerprint,
GooglePlayUtilityFingerprint,
CastDynamiteModuleFingerprint,
CastDynamiteModuleV2Fingerprint,
CastContextFetchFingerprint,
PrimeMethodFingerprint,

View File

@@ -1,18 +0,0 @@
package app.revanced.patches.music.misc.gms.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
internal object GooglePlayUtilityFingerprint : MethodFingerprint(
"I",
AccessFlags.PUBLIC or AccessFlags.STATIC,
listOf("L", "I"),
strings = listOf(
"This should never happen.",
"MetadataValueReader",
"GooglePlayServicesUtil",
"com.android.vending",
"android.hardware.type.embedded"
)
)

View File

@@ -1,12 +0,0 @@
package app.revanced.patches.music.misc.gms.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
internal object ServiceCheckFingerprint : MethodFingerprint(
"V",
AccessFlags.PUBLIC or AccessFlags.STATIC,
listOf("L", "I"),
strings = listOf("Google Play Services not available"),
)

View File

@@ -11,7 +11,7 @@ import app.revanced.util.exception
@Patch(
name = "Spoof Android device ID",
description = "Spoofs the Android device ID used by the app for account authentication." +
description = "Spoofs the Android device ID used by the app for account authentication. " +
"This can be used to copy the account to another device.",
compatiblePackages = [
CompatiblePackage(

View File

@@ -15,5 +15,5 @@ abstract class BaseDisableAdsPatch(
compatiblePackages = compatiblePackages,
fingerprints = setOf(IsAdsEnabledFingerprint),
) {
override fun execute(context: BytecodeContext) = listOf(IsAdsEnabledFingerprint).returnEarly()
override fun execute(context: BytecodeContext) = IsAdsEnabledFingerprint.returnEarly()
}

View File

@@ -0,0 +1,23 @@
package app.revanced.patches.reddit.customclients.boostforreddit.ads
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patches.reddit.customclients.boostforreddit.ads.fingerprints.*
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.util.resultOrThrow
@Patch(
name = "Disable ads",
compatiblePackages = [CompatiblePackage("com.rubenmayayo.reddit")],
)
@Suppress("unused")
object DisableAdsPatch : BytecodePatch(
setOf(MaxMediationFingerprint, AdmobMediationFingerprint),
) {
override fun execute(context: BytecodeContext) =
arrayOf(MaxMediationFingerprint, AdmobMediationFingerprint).forEach {
it.resultOrThrow().mutableMethod.addInstructions(0, "return-void")
}
}

View File

@@ -0,0 +1,7 @@
package app.revanced.patches.reddit.customclients.boostforreddit.ads.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
internal object AdmobMediationFingerprint : MethodFingerprint(
strings = listOf("AdmobMediation: Attempting to initialize SDK")
)

View File

@@ -0,0 +1,7 @@
package app.revanced.patches.reddit.customclients.boostforreddit.ads.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
internal object MaxMediationFingerprint : MethodFingerprint(
strings = listOf("MaxMediation: Attempting to initialize SDK")
)

View File

@@ -22,5 +22,5 @@ object UnlockSubscriptionPatch : BytecodePatch(
setOf(StartSubscriptionActivityFingerprint, BillingClientOnServiceConnected),
) {
override fun execute(context: BytecodeContext) =
listOf(StartSubscriptionActivityFingerprint, BillingClientOnServiceConnected).returnEarly()
setOf(StartSubscriptionActivityFingerprint, BillingClientOnServiceConnected).returnEarly()
}

View File

@@ -10,11 +10,13 @@ import app.revanced.patches.scbeasy.detection.debugging.fingerprints.DebuggingDe
@Patch(
use = false,
name = "Remove debugging detection",
description = "Removes the USB and wireless debugging checks.",
compatiblePackages = [CompatiblePackage("com.scb.phone")]
)
@Suppress("unused")
@Deprecated("This patch no longer work and will be removed in the future " +
"due to the complexity of the application.\n" +
"See https://github.com/ReVanced/revanced-patches/issues/3517 for more details.")
object RemoveDebuggingDetectionPatch : BytecodePatch(
setOf(DebuggingDetectionFingerprint)
) {

View File

@@ -11,15 +11,20 @@ import app.revanced.patches.all.misc.packagename.ChangePackageNamePatch
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.ACTIONS
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.AUTHORITIES
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.PERMISSIONS
import app.revanced.patches.shared.misc.gms.fingerprints.CastDynamiteModuleFingerprint
import app.revanced.patches.shared.misc.gms.fingerprints.GmsCoreSupportFingerprint
import app.revanced.patches.shared.misc.gms.fingerprints.GmsCoreSupportFingerprint.GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME
import app.revanced.patches.shared.misc.gms.fingerprints.GooglePlayUtilityFingerprint
import app.revanced.patches.shared.misc.gms.fingerprints.ServiceCheckFingerprint
import app.revanced.util.exception
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import app.revanced.util.returnEarly
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction21c
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
import com.android.tools.smali.dexlib2.iface.reference.StringReference
import com.android.tools.smali.dexlib2.immutable.reference.ImmutableStringReference
import com.android.tools.smali.dexlib2.util.MethodUtil
@@ -42,8 +47,8 @@ import com.android.tools.smali.dexlib2.util.MethodUtil
abstract class BaseGmsCoreSupportPatch(
private val fromPackageName: String,
private val toPackageName: String,
private val primeMethodFingerprint: MethodFingerprint,
private val earlyReturnFingerprints: Set<MethodFingerprint>,
private val primeMethodFingerprint: MethodFingerprint?,
private val earlyReturnFingerprints: Set<MethodFingerprint> = setOf(),
private val mainActivityOnCreateFingerprint: MethodFingerprint,
private val integrationsPatchDependency: PatchClass,
gmsCoreSupportResourcePatch: BaseGmsCoreSupportResourcePatch,
@@ -62,6 +67,9 @@ abstract class BaseGmsCoreSupportPatch(
compatiblePackages = compatiblePackages,
fingerprints = setOf(
GmsCoreSupportFingerprint,
GooglePlayUtilityFingerprint,
ServiceCheckFingerprint,
CastDynamiteModuleFingerprint,
mainActivityOnCreateFingerprint,
) + fingerprints,
requiresIntegrations = true,
@@ -91,17 +99,36 @@ abstract class BaseGmsCoreSupportPatch(
}
// Specific method that needs to be patched.
transformPrimeMethod(packageName)
primeMethodFingerprint?.let { transformPrimeMethod(packageName) }
// Return these methods early to prevent the app from crashing.
earlyReturnFingerprints.toList().returnEarly()
earlyReturnFingerprints.returnEarly()
ServiceCheckFingerprint.returnEarly()
// Not all apps have CastDynamiteModule, so we need to check if it's present.
if (CastDynamiteModuleFingerprint.result != null) {
CastDynamiteModuleFingerprint.returnEarly()
}
// Google Play Utility is not present in all apps, so we need to check if it's present.
if (GooglePlayUtilityFingerprint.result != null) {
GooglePlayUtilityFingerprint.returnEarly()
}
// Verify GmsCore is installed and whitelisted for power optimizations and background usage.
mainActivityOnCreateFingerprint.result?.mutableMethod?.addInstructions(
0,
"invoke-static/range { p0 .. p0 }, Lapp/revanced/integrations/shared/GmsCoreSupport;->" +
"checkGmsCore(Landroid/app/Activity;)V",
) ?: throw mainActivityOnCreateFingerprint.exception
mainActivityOnCreateFingerprint.result?.mutableMethod?.apply {
// Temporary fix for Google photos integration.
var setContextIndex = indexOfFirstInstruction {
val reference = getReference<MethodReference>() ?: return@indexOfFirstInstruction false
reference.toString() == "Lapp/revanced/integrations/shared/Utils;->setContext(Landroid/content/Context;)V"
}
// Add after setContext call, because this patch needs the context.
addInstructions(
if (setContextIndex < 0) 0 else setContextIndex + 1,
"invoke-static/range { p0 .. p0 }, Lapp/revanced/integrations/shared/GmsCoreSupport;->" +
"checkGmsCore(Landroid/app/Activity;)V",
)
} ?: throw mainActivityOnCreateFingerprint.exception
// Change the vendor of GmsCore in ReVanced Integrations.
GmsCoreSupportFingerprint.result?.mutableClass?.methods
@@ -192,7 +219,7 @@ abstract class BaseGmsCoreSupportPatch(
}
private fun transformPrimeMethod(packageName: String) {
primeMethodFingerprint.result?.mutableMethod?.apply {
primeMethodFingerprint!!.result?.mutableMethod?.apply {
var register = 2
val index = getInstructions().indexOfFirst {
@@ -305,6 +332,7 @@ abstract class BaseGmsCoreSupportPatch(
"com.google.android.gms.languageprofile.service.START",
"com.google.android.gms.clearcut.service.START",
"com.google.android.gms.icing.LIGHTWEIGHT_INDEX_SERVICE",
"com.google.android.gms.accountsettings.action.VIEW_SETTINGS",
// potoken
"com.google.android.gms.potokens.service.START",

View File

@@ -96,27 +96,23 @@ abstract class BaseGmsCoreSupportResourcePatch(
private fun ResourceContext.patchManifest() {
val packageName = ChangePackageNamePatch.setOrGetFallbackPackageName(toPackageName)
val manifest = this.get("AndroidManifest.xml").readText()
this.get("AndroidManifest.xml").writeText(
manifest.replace(
"package=\"$fromPackageName",
"package=\"$packageName",
).replace(
"android:authorities=\"$fromPackageName",
"android:authorities=\"$packageName",
).replace(
"$fromPackageName.permission.C2D_MESSAGE",
"$packageName.permission.C2D_MESSAGE",
).replace(
"$fromPackageName.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION",
"$packageName.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION",
).replace(
"com.google.android.c2dm",
"$gmsCoreVendorGroupId.android.c2dm",
).replace(
"</queries>",
"<package android:name=\"$gmsCoreVendorGroupId.android.gms\"/></queries>",
),
val transformations = mapOf(
"package=\"$fromPackageName" to "package=\"$packageName",
"android:authorities=\"$fromPackageName" to "android:authorities=\"$packageName",
"$fromPackageName.permission.C2D_MESSAGE" to "$packageName.permission.C2D_MESSAGE",
"$fromPackageName.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" to "$packageName.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION",
"com.google.android.c2dm" to "$gmsCoreVendorGroupId.android.c2dm",
"com.google.android.libraries.photos.api.mars" to "$gmsCoreVendorGroupId.android.apps.photos.api.mars",
"</queries>" to "<package android:name=\"$gmsCoreVendorGroupId.android.gms\"/></queries>",
)
get("AndroidManifest.xml", false).writeText(
transformations.entries.fold(get("AndroidManifest.xml", false).readText()) { acc, (from, to) ->
acc.replace(
from,
to,
)
},
)
}

View File

@@ -1,4 +1,4 @@
package app.revanced.patches.music.misc.gms.fingerprints
package app.revanced.patches.shared.misc.gms.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint

View File

@@ -1,4 +1,4 @@
package app.revanced.patches.youtube.misc.gms.fingerprints
package app.revanced.patches.shared.misc.gms.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
@@ -8,5 +8,5 @@ internal object GooglePlayUtilityFingerprint : MethodFingerprint(
returnType = "I",
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
parameters = listOf("L", "I"),
strings = listOf("This should never happen.", "MetadataValueReader", "com.google.android.gms")
)
strings = listOf("This should never happen.", "MetadataValueReader", "com.google.android.gms"),
)

View File

@@ -1,4 +1,4 @@
package app.revanced.patches.youtube.misc.gms.fingerprints
package app.revanced.patches.shared.misc.gms.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
@@ -8,5 +8,5 @@ internal object ServiceCheckFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
parameters = listOf("L", "I"),
strings = listOf("Google Play Services not available", "GooglePlayServices not available due to error ")
)
strings = listOf("Google Play Services not available")
)

View File

@@ -10,7 +10,7 @@ import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.soundcloud.ad.fingerprints.InterceptFingerprint
import app.revanced.patches.soundcloud.ad.fingerprints.FeatureConstructorFingerprint
import app.revanced.patches.soundcloud.shared.fingerprints.FeatureConstructorFingerprint
import app.revanced.patches.soundcloud.ad.fingerprints.UserConsumerPlanConstructorFingerprint
import app.revanced.util.resultOrThrow

View File

@@ -0,0 +1,83 @@
package app.revanced.patches.soundcloud.offlinesync
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.soundcloud.offlinesync.fingerprints.DownloadOperationsHeaderVerificationFingerprint
import app.revanced.patches.soundcloud.offlinesync.fingerprints.DownloadOperationsURLBuilderFingerprint
import app.revanced.patches.soundcloud.shared.fingerprints.FeatureConstructorFingerprint
import app.revanced.util.getReference
import app.revanced.util.resultOrThrow
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
@Patch(
name = "Enable offline sync",
compatiblePackages = [CompatiblePackage("com.soundcloud.android")],
)
@Suppress("unused")
object EnableOfflineSyncPatch : BytecodePatch(
setOf(
FeatureConstructorFingerprint, DownloadOperationsURLBuilderFingerprint,
DownloadOperationsHeaderVerificationFingerprint
),
) {
override fun execute(context: BytecodeContext) {
// Enable the feature to allow offline track syncing by modifying the JSON server response.
// This method is the constructor of a class representing a "Feature" object parsed from JSON data.
// p1 is the name of the feature.
// p2 is true if the feature is enabled, false otherwise.
FeatureConstructorFingerprint.resultOrThrow().mutableMethod.apply {
val afterCheckNotNullIndex = 2
addInstructionsWithLabels(
afterCheckNotNullIndex,
"""
const-string v0, "offline_sync"
invoke-virtual { p1, v0 }, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :skip
const/4 p2, 0x1
""",
ExternalLabel("skip", getInstruction(afterCheckNotNullIndex)),
)
}
// Patch the URL builder to use the HTTPS_STREAM endpoint
// instead of the offline sync endpoint to downloading the track.
DownloadOperationsURLBuilderFingerprint.resultOrThrow().mutableMethod.apply {
val getEndpointsEnumFieldIndex = 1
val getEndpointsEnumFieldInstruction = getInstruction<OneRegisterInstruction>(getEndpointsEnumFieldIndex)
val targetRegister = getEndpointsEnumFieldInstruction.registerA
val endpointsType = getEndpointsEnumFieldInstruction.getReference<FieldReference>()!!.type
replaceInstruction(
getEndpointsEnumFieldIndex,
"sget-object v$targetRegister, $endpointsType->HTTPS_STREAM:$endpointsType"
)
}
// The HTTPS_STREAM endpoint does not return the necessary headers for offline sync.
// Mock the headers to prevent the app from crashing by setting them to empty strings.
// The headers are all cosmetic and do not affect the functionality of the app.
DownloadOperationsHeaderVerificationFingerprint.resultOrThrow().mutableMethod.apply {
// The first three null checks need to be patched.
getInstructions().asSequence().filter {
it.opcode == Opcode.IF_EQZ
}.take(3).toList().map { it.location.index }.asReversed().forEach { nullCheckIndex ->
val headerStringRegister = getInstruction<OneRegisterInstruction>(nullCheckIndex).registerA
addInstruction(nullCheckIndex, "const-string v$headerStringRegister, \"\"")
}
}
}
}

View File

@@ -0,0 +1,21 @@
package app.revanced.patches.soundcloud.offlinesync.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal object DownloadOperationsHeaderVerificationFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("L","L"),
opcodes = listOf(
Opcode.CONST_STRING,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.CONST_STRING
),
customFingerprint = { _, classDef ->
classDef.sourceFile == "DownloadOperations.kt"
}
)

View File

@@ -0,0 +1,20 @@
package app.revanced.patches.soundcloud.offlinesync.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal object DownloadOperationsURLBuilderFingerprint : MethodFingerprint(
returnType = "Ljava/lang/String",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("L","L"),
opcodes = listOf(
Opcode.IGET_OBJECT,
Opcode.SGET_OBJECT,
Opcode.FILLED_NEW_ARRAY
),
customFingerprint = { _, classDef ->
classDef.sourceFile == "DownloadOperations.kt"
}
)

View File

@@ -1,4 +1,4 @@
package app.revanced.patches.soundcloud.ad.fingerprints
package app.revanced.patches.soundcloud.shared.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint

View File

@@ -0,0 +1,37 @@
package app.revanced.patches.swissid.integritycheck
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.swissid.integritycheck.fingerprints.CheckIntegrityFingerprint
import app.revanced.util.resultOrThrow
@Patch(
name = "Remove Google Play Integrity check",
description = "Removes the Google Play Integrity check. With this it's possible to use SwissID on custom ROMS." +
"If the device is rooted, root permissions must be hidden from the app.",
compatiblePackages = [CompatiblePackage("com.swisssign.swissid.mobile")],
)
@Suppress("unused")
object RemoveGooglePlayIntegrityCheck : BytecodePatch(
setOf(CheckIntegrityFingerprint),
) {
private const val RESULT_METHOD_REFERENCE = " Lcom/swisssign/deviceintegrity/" +
"DeviceintegrityPlugin\$onMethodCall\$1;->\$result:" +
"Lio/flutter/plugin/common/MethodChannel\$Result;"
private const val SUCCESS_METHOD_REFERENCE =
"Lio/flutter/plugin/common/MethodChannel\$Result;->success(Ljava/lang/Object;)V"
override fun execute(context: BytecodeContext) =
CheckIntegrityFingerprint.resultOrThrow().mutableMethod.addInstructions(
0,
"""
iget-object p1, p0, $RESULT_METHOD_REFERENCE
const-string v0, "VALID"
invoke-interface {p1, v0}, $SUCCESS_METHOD_REFERENCE
return-void
""",
)
}

View File

@@ -0,0 +1,11 @@
package app.revanced.patches.swissid.integritycheck.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal object CheckIntegrityFingerprint : MethodFingerprint(
returnType = "V",
parameters = listOf("Lcom/swisssign/deviceintegrity/model/DeviceIntegrityResult;"),
strings = listOf("it", "result")
)

View File

@@ -97,6 +97,7 @@ object HideLayoutComponentsPatch : BytecodePatch(
SwitchPreference("revanced_hide_attributes_section"),
SwitchPreference("revanced_hide_chapters_section"),
SwitchPreference("revanced_hide_info_cards_section"),
SwitchPreference("revanced_hide_key_concepts_section"),
SwitchPreference("revanced_hide_podcast_section"),
SwitchPreference("revanced_hide_transcript_section"),
),

View File

@@ -1,36 +1,18 @@
package app.revanced.patches.youtube.layout.thumbnails
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
import app.revanced.patcher.fingerprint.MethodFingerprint
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
import app.revanced.patches.all.misc.resources.AddResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.ListPreference
import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.shared.misc.settings.preference.TextPreference
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.MessageDigestImageUrlFingerprint
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.MessageDigestImageUrlParentFingerprint
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.RequestFingerprint
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback.OnFailureFingerprint
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback.OnResponseStartedFingerprint
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback.OnSucceededFingerprint
import app.revanced.patches.youtube.misc.imageurlhook.CronetImageUrlHook
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
import app.revanced.patches.youtube.misc.navigation.NavigationBarHookPatch
import app.revanced.patches.youtube.misc.settings.SettingsPatch
import app.revanced.util.resultOrThrow
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
@Patch(
name = "Alternative thumbnails",
@@ -39,7 +21,8 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
IntegrationsPatch::class,
SettingsPatch::class,
AddResourcesPatch::class,
NavigationBarHookPatch::class
NavigationBarHookPatch::class,
CronetImageUrlHook::class
],
compatiblePackages = [
CompatiblePackage(
@@ -74,65 +57,10 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
],
)
@Suppress("unused")
object AlternativeThumbnailsPatch : BytecodePatch(
setOf(
MessageDigestImageUrlParentFingerprint,
OnResponseStartedFingerprint,
RequestFingerprint,
),
) {
object AlternativeThumbnailsPatch : BytecodePatch(emptySet()) {
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
"Lapp/revanced/integrations/youtube/patches/AlternativeThumbnailsPatch;"
private lateinit var loadImageUrlMethod: MutableMethod
private var loadImageUrlIndex = 0
private lateinit var loadImageSuccessCallbackMethod: MutableMethod
private var loadImageSuccessCallbackIndex = 0
private lateinit var loadImageErrorCallbackMethod: MutableMethod
private var loadImageErrorCallbackIndex = 0
/**
* @param highPriority If the hook should be called before all other hooks.
*/
@Suppress("SameParameterValue")
private fun addImageUrlHook(targetMethodClass: String, highPriority: Boolean) {
loadImageUrlMethod.addInstructions(
if (highPriority) 0 else loadImageUrlIndex,
"""
invoke-static { p1 }, $targetMethodClass->overrideImageURL(Ljava/lang/String;)Ljava/lang/String;
move-result-object p1
""",
)
loadImageUrlIndex += 2
}
/**
* If a connection completed, which includes normal 200 responses but also includes
* status 404 and other error like http responses.
*/
@Suppress("SameParameterValue")
private fun addImageUrlSuccessCallbackHook(targetMethodClass: String) {
loadImageSuccessCallbackMethod.addInstruction(
loadImageSuccessCallbackIndex++,
"invoke-static { p1, p2 }, $targetMethodClass->handleCronetSuccess(" +
"Lorg/chromium/net/UrlRequest;Lorg/chromium/net/UrlResponseInfo;)V",
)
}
/**
* If a connection outright failed to complete any connection.
*/
@Suppress("SameParameterValue")
private fun addImageUrlErrorCallbackHook(targetMethodClass: String) {
loadImageErrorCallbackMethod.addInstruction(
loadImageErrorCallbackIndex++,
"invoke-static { p1, p2, p3 }, $targetMethodClass->handleCronetFailure(" +
"Lorg/chromium/net/UrlRequest;Lorg/chromium/net/UrlResponseInfo;Ljava/io/IOException;)V",
)
}
override fun execute(context: BytecodeContext) {
AddResourcesPatch(this::class)
@@ -177,62 +105,8 @@ object AlternativeThumbnailsPatch : BytecodePatch(
ListPreference("revanced_alt_thumbnail_stills_time", summaryKey = null)
)
fun MethodFingerprint.alsoResolve(fingerprint: MethodFingerprint) =
also { resolve(context, fingerprint.resultOrThrow().classDef) }.resultOrThrow()
fun MethodFingerprint.resolveAndLetMutableMethod(
fingerprint: MethodFingerprint,
block: (MutableMethod) -> Unit,
) = alsoResolve(fingerprint).also { block(it.mutableMethod) }
MessageDigestImageUrlFingerprint.resolveAndLetMutableMethod(MessageDigestImageUrlParentFingerprint) {
loadImageUrlMethod = it
addImageUrlHook(INTEGRATIONS_CLASS_DESCRIPTOR, true)
}
OnSucceededFingerprint.resolveAndLetMutableMethod(OnResponseStartedFingerprint) {
loadImageSuccessCallbackMethod = it
addImageUrlSuccessCallbackHook(INTEGRATIONS_CLASS_DESCRIPTOR)
}
OnFailureFingerprint.resolveAndLetMutableMethod(OnResponseStartedFingerprint) {
loadImageErrorCallbackMethod = it
addImageUrlErrorCallbackHook(INTEGRATIONS_CLASS_DESCRIPTOR)
}
// The URL is required for the failure callback hook, but the URL field is obfuscated.
// Add a helper get method that returns the URL field.
RequestFingerprint.resultOrThrow().apply {
// The url is the only string field that is set inside the constructor.
val urlFieldInstruction = mutableMethod.getInstructions().first {
if (it.opcode != Opcode.IPUT_OBJECT) return@first false
val reference = (it as ReferenceInstruction).reference as FieldReference
reference.type == "Ljava/lang/String;"
} as ReferenceInstruction
val urlFieldName = (urlFieldInstruction.reference as FieldReference).name
val definingClass = RequestFingerprint.IMPLEMENTATION_CLASS_NAME
val addedMethodName = "getHookedUrl"
mutableClass.methods.add(
ImmutableMethod(
definingClass,
addedMethodName,
emptyList(),
"Ljava/lang/String;",
AccessFlags.PUBLIC.value,
null,
null,
MutableMethodImplementation(2),
).toMutable().apply {
addInstructions(
"""
iget-object v0, p0, $definingClass->$urlFieldName:Ljava/lang/String;
return-object v0
""",
)
},
)
}
CronetImageUrlHook.addImageUrlHook(INTEGRATIONS_CLASS_DESCRIPTOR)
CronetImageUrlHook.addImageUrlSuccessCallbackHook(INTEGRATIONS_CLASS_DESCRIPTOR)
CronetImageUrlHook.addImageUrlErrorCallbackHook(INTEGRATIONS_CLASS_DESCRIPTOR)
}
}

View File

@@ -0,0 +1,71 @@
package app.revanced.patches.youtube.layout.thumbnails
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.all.misc.resources.AddResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.youtube.misc.imageurlhook.CronetImageUrlHook
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
import app.revanced.patches.youtube.misc.settings.SettingsPatch
@Patch(
name = "Bypass image region restrictions",
description = "Adds an option to use a different host for user avatar and channel images " +
"and can fix missing images that are blocked in some countries.",
dependencies = [
IntegrationsPatch::class,
SettingsPatch::class,
AddResourcesPatch::class,
CronetImageUrlHook::class
],
compatiblePackages = [
CompatiblePackage(
"com.google.android.youtube",
[
"18.32.39",
"18.37.36",
"18.38.44",
"18.43.45",
"18.44.41",
"18.45.43",
"18.48.39",
"18.49.37",
"19.01.34",
"19.02.39",
"19.03.36",
"19.04.38",
"19.05.36",
"19.06.39",
"19.07.40",
"19.08.36",
"19.09.38",
"19.10.39",
"19.11.43",
"19.12.41",
"19.13.37",
"19.14.43",
"19.15.36",
"19.16.39",
]
)
]
)
@Suppress("unused")
object BypassImageRegionRestrictions : BytecodePatch(emptySet()) {
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
"Lapp/revanced/integrations/youtube/patches/BypassImageRegionRestrictionsPatch;"
override fun execute(context: BytecodeContext) {
AddResourcesPatch(this::class)
SettingsPatch.PreferenceScreen.MISC.addPreferences(
SwitchPreference("revanced_bypass_image_region_restrictions")
)
// A priority hook is not needed, as the image urls of interest are not modified
// by AlternativeThumbnails or any other patch in this repo.
CronetImageUrlHook.addImageUrlHook(INTEGRATIONS_CLASS_DESCRIPTOR)
}
}

View File

@@ -0,0 +1,69 @@
package app.revanced.patches.youtube.misc.dns
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.all.misc.resources.AddResourcesPatch
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
import app.revanced.patches.youtube.shared.fingerprints.MainActivityOnCreateFingerprint
import app.revanced.util.resultOrThrow
@Patch(
name = "Check watch history domain name resolution",
description = "Checks if the device DNS server is preventing user watch history from being saved.",
dependencies = [IntegrationsPatch::class],
compatiblePackages = [
CompatiblePackage(
"com.google.android.youtube",
[
"18.32.39",
"18.37.36",
"18.38.44",
"18.43.45",
"18.44.41",
"18.45.43",
"18.48.39",
"18.49.37",
"19.01.34",
"19.02.39",
"19.03.36",
"19.04.38",
"19.05.36",
"19.06.39",
"19.07.40",
"19.08.36",
"19.09.38",
"19.10.39",
"19.11.43",
"19.12.41",
"19.13.37",
"19.14.43",
"19.15.36",
"19.16.39",
],
),
],
)
@Suppress("unused")
internal object CheckWatchHistoryDomainNameResolutionPatch : BytecodePatch(
setOf(MainActivityOnCreateFingerprint),
) {
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
"Lapp/revanced/integrations/youtube/patches/CheckWatchHistoryDomainNameResolutionPatch;"
override fun execute(context: BytecodeContext) {
AddResourcesPatch(this::class)
MainActivityOnCreateFingerprint.resultOrThrow().mutableMethod.addInstructions(
// FIXME: Insert index must be greater than the insert index used by GmsCoreSupport,
// as both patch the same method and GmsCoreSupport check should be first,
// but the patch does not depend on GmsCoreSupport, so it should not be possible to enforce this
// unless a third patch is added that this patch and GmsCoreSupport depend on to manage
// the order of the patches.
1,
"invoke-static/range { p0 .. p0 }, $INTEGRATIONS_CLASS_DESCRIPTOR->checkDnsResolver(Landroid/app/Activity;)V",
)
}
}

View File

@@ -5,6 +5,7 @@ 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.getInstructions
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.extensions.or
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchException
@@ -13,9 +14,13 @@ import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
import app.revanced.patches.all.misc.resources.AddResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.ListPreference
import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.youtube.misc.backgroundplayback.BackgroundPlaybackPatch
import app.revanced.patches.youtube.misc.fix.playback.fingerprints.*
import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch
import app.revanced.patches.youtube.misc.settings.SettingsPatch
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
@@ -37,16 +42,21 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
SettingsPatch::class,
AddResourcesPatch::class,
UserAgentClientSpoofPatch::class,
// Required since iOS livestream fix partially enables background playback.
BackgroundPlaybackPatch::class,
PlayerTypeHookPatch::class,
],
compatiblePackages = [
CompatiblePackage(
"com.google.android.youtube",
[
"18.37.36",
"18.38.44",
"18.43.45",
"18.44.41",
"18.45.43",
// This patch works with these versions,
// but the dependent background playback patch does not.
// "18.37.36",
// "18.38.44",
// "18.43.45",
// "18.44.41",
// "18.45.43",
"18.48.39",
"18.49.37",
"19.01.34",
@@ -77,18 +87,29 @@ object SpoofClientPatch : BytecodePatch(
SetPlayerRequestClientTypeFingerprint,
CreatePlayerRequestBodyFingerprint,
CreatePlayerRequestBodyWithModelFingerprint,
CreatePlayerRequestBodyWithVersionReleaseFingerprint,
// Player gesture config.
PlayerGestureConfigSyntheticFingerprint,
// Player speed menu item.
CreatePlaybackSpeedMenuItemFingerprint,
),
// Video qualities missing.
BuildRequestFingerprint,
// Livestream audio only background playback.
PlayerResponseModelBackgroundAudioPlaybackFingerprint,
)
) {
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
"Lapp/revanced/integrations/youtube/patches/spoof/SpoofClientPatch;"
private const val CLIENT_INFO_CLASS_DESCRIPTOR =
"Lcom/google/protos/youtube/api/innertube/InnertubeContext\$ClientInfo;"
private const val REQUEST_CLASS_DESCRIPTOR =
"Lorg/chromium/net/ExperimentalUrlRequest;"
private const val REQUEST_BUILDER_CLASS_DESCRIPTOR =
"Lorg/chromium/net/ExperimentalUrlRequest\$Builder;"
override fun execute(context: BytecodeContext) {
AddResourcesPatch(this::class)
@@ -99,9 +120,16 @@ object SpoofClientPatch : BytecodePatch(
sorting = PreferenceScreen.Sorting.UNSORTED,
preferences = setOf(
SwitchPreference("revanced_spoof_client"),
SwitchPreference("revanced_spoof_client_use_ios"),
),
),
ListPreference("revanced_spoof_client_type",
summaryKey = null,
entriesKey = "revanced_spoof_client_type_entries",
entryValuesKey = "revanced_spoof_client_type_entry_values"
),
SwitchPreference("revanced_spoof_client_ios_force_avc"),
NonInteractivePreference("revanced_spoof_client_about_android_ios"),
NonInteractivePreference("revanced_spoof_client_about_android_vr")
)
)
)
// region Block /initplayback requests to fall back to /get_watch requests.
@@ -153,7 +181,7 @@ object SpoofClientPatch : BytecodePatch(
.getInstructions().find { instruction ->
// requestMessage.clientInfo = clientInfoBuilder.build();
instruction.opcode == Opcode.IPUT_OBJECT &&
instruction.getReference<FieldReference>()?.type == CLIENT_INFO_CLASS_DESCRIPTOR
instruction.getReference<FieldReference>()?.type == CLIENT_INFO_CLASS_DESCRIPTOR
}?.getReference<FieldReference>() ?: throw PatchException("Could not find clientInfoField")
// Client info object's client type field.
@@ -164,13 +192,15 @@ object SpoofClientPatch : BytecodePatch(
// Client info object's client version field.
val clientInfoClientVersionField = result.mutableMethod
.getInstruction(result.scanResult.stringsScanResult!!.matches.first().index + 1)
.getReference<FieldReference>() ?: throw PatchException("Could not find clientInfoClientVersionField")
.getReference<FieldReference>()
?: throw PatchException("Could not find clientInfoClientVersionField")
Triple(clientInfoField, clientInfoClientTypeField, clientInfoClientVersionField)
}
val clientInfoClientModelField = CreatePlayerRequestBodyWithModelFingerprint.resultOrThrow().let {
val getClientModelIndex = CreatePlayerRequestBodyWithModelFingerprint.indexOfBuildModelInstruction(it.method)
val getClientModelIndex =
CreatePlayerRequestBodyWithModelFingerprint.indexOfBuildModelInstruction(it.method)
// The next IPUT_OBJECT instruction after getting the client model is setting the client model field.
val index = it.mutableMethod.indexOfFirstInstructionOrThrow(getClientModelIndex) {
@@ -181,6 +211,19 @@ object SpoofClientPatch : BytecodePatch(
?: throw PatchException("Could not find clientInfoClientModelField")
}
val clientInfoOsVersionField = CreatePlayerRequestBodyWithVersionReleaseFingerprint.resultOrThrow().let {
val getOsVersionIndex =
CreatePlayerRequestBodyWithVersionReleaseFingerprint.indexOfBuildVersionReleaseInstruction(it.method)
// The next IPUT_OBJECT instruction after getting the client os version is setting the client os version field.
val index = it.mutableMethod.indexOfFirstInstructionOrThrow(getOsVersionIndex) {
opcode == Opcode.IPUT_OBJECT
}
it.mutableMethod.getInstruction(index).getReference<FieldReference>()
?: throw PatchException("Could not find clientInfoOsVersionField")
}
// endregion
// region Spoof client type for /player requests.
@@ -198,7 +241,7 @@ object SpoofClientPatch : BytecodePatch(
addInstruction(
checkCastIndex + 1,
"invoke-static { v$requestMessageInstanceRegister }," +
" ${result.classDef.type}->$setClientInfoMethodName($clientInfoContainerClassName)V",
" ${result.classDef.type}->$setClientInfoMethodName($clientInfoContainerClassName)V",
)
}
@@ -240,6 +283,12 @@ object SpoofClientPatch : BytecodePatch(
invoke-static { v1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->getClientVersion(Ljava/lang/String;)Ljava/lang/String;
move-result-object v1
iput-object v1, v0, $clientInfoClientVersionField
# Set client os version to the spoofed value.
iget-object v1, v0, $clientInfoOsVersionField
invoke-static { v1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->getOsVersion(Ljava/lang/String;)Ljava/lang/String;
move-result-object v1
iput-object v1, v0, $clientInfoOsVersionField
:disabled
return-void
@@ -283,6 +332,23 @@ object SpoofClientPatch : BytecodePatch(
// endregion
// region Fix livestream audio only background play if spoofing to iOS.
// This force enables audio background playback.
PlayerResponseModelBackgroundAudioPlaybackFingerprint.resultOrThrow().mutableMethod.addInstructions(
0,
"""
invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->overrideBackgroundAudioPlayback()Z
move-result v0
if-eqz v0, :do_not_override
return v0
:do_not_override
nop
"""
)
// endregion
// Fix playback speed menu item if spoofing to iOS.
CreatePlaybackSpeedMenuItemFingerprint.resultOrThrow().let {
@@ -291,7 +357,8 @@ object SpoofClientPatch : BytecodePatch(
it.mutableMethod.apply {
// Find the conditional check if the playback speed menu item is not created.
val shouldCreateMenuIndex = indexOfFirstInstructionOrThrow(scanResult.endIndex) { opcode == Opcode.IF_EQZ }
val shouldCreateMenuIndex =
indexOfFirstInstructionOrThrow(scanResult.endIndex) { opcode == Opcode.IF_EQZ }
val shouldCreateMenuRegister = getInstruction<OneRegisterInstruction>(shouldCreateMenuIndex).registerA
addInstructions(
@@ -305,5 +372,28 @@ object SpoofClientPatch : BytecodePatch(
}
// endregion
// region Fix video qualities missing, if spoofing to iOS by overriding the user agent.
BuildRequestFingerprint.resultOrThrow().let { result ->
result.mutableMethod.apply {
val buildRequestIndex = getInstructions().lastIndex - 2
val requestBuilderRegister = getInstruction<FiveRegisterInstruction>(buildRequestIndex).registerC
val newRequestBuilderIndex = result.scanResult.patternScanResult!!.endIndex
val urlRegister = getInstruction<FiveRegisterInstruction>(newRequestBuilderIndex).registerD
// Replace "requestBuilder.build(): Request" with "overrideUserAgent(requestBuilder, url): Request".
replaceInstruction(
buildRequestIndex,
"invoke-static { v$requestBuilderRegister, v$urlRegister }, " +
"$INTEGRATIONS_CLASS_DESCRIPTOR->" +
"overrideUserAgent(${REQUEST_BUILDER_CLASS_DESCRIPTOR}Ljava/lang/String;)" +
REQUEST_CLASS_DESCRIPTOR
)
}
}
// endregion
}
}

View File

@@ -0,0 +1,15 @@
package app.revanced.patches.youtube.misc.fix.playback.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal object BuildRequestFingerprint : MethodFingerprint(
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
returnType = "Lorg/chromium/net/UrlRequest;",
opcodes = listOf(
Opcode.INVOKE_DIRECT,
Opcode.INVOKE_VIRTUAL
)
)

View File

@@ -0,0 +1,31 @@
package app.revanced.patches.youtube.misc.fix.playback.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import app.revanced.patches.youtube.misc.fix.playback.fingerprints.CreatePlayerRequestBodyWithVersionReleaseFingerprint.indexOfBuildVersionReleaseInstruction
import app.revanced.util.containsWideLiteralInstructionValue
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
internal object CreatePlayerRequestBodyWithVersionReleaseFingerprint : MethodFingerprint(
returnType = "L",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf(),
customFingerprint = { methodDef, _ ->
methodDef.containsWideLiteralInstructionValue(1073741824) &&
indexOfBuildVersionReleaseInstruction(methodDef) >= 0
},
) {
fun indexOfBuildVersionReleaseInstruction(methodDef: Method) =
methodDef.indexOfFirstInstruction {
val reference = getReference<FieldReference>()
reference?.definingClass == "Landroid/os/Build\$VERSION;" &&
reference.name == "RELEASE" &&
reference.type == "Ljava/lang/String;"
}
}

View File

@@ -0,0 +1,25 @@
package app.revanced.patches.youtube.misc.fix.playback.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal object PlayerResponseModelBackgroundAudioPlaybackFingerprint : MethodFingerprint(
returnType = "Z",
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
parameters = listOf("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;"),
opcodes = listOf(
Opcode.CONST_4,
Opcode.IF_EQZ,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.IF_NEZ,
Opcode.GOTO,
Opcode.RETURN,
null, // Opcode.CONST_4 or Opcode.MOVE
Opcode.RETURN,
)
)

View File

@@ -7,7 +7,8 @@ import app.revanced.patches.youtube.misc.fix.playback.SpoofClientPatch
import app.revanced.patches.youtube.misc.gms.Constants.REVANCED_YOUTUBE_PACKAGE_NAME
import app.revanced.patches.youtube.misc.gms.Constants.YOUTUBE_PACKAGE_NAME
import app.revanced.patches.youtube.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorGroupIdOption
import app.revanced.patches.youtube.misc.gms.fingerprints.*
import app.revanced.patches.youtube.misc.gms.fingerprints.CastDynamiteModuleV2Fingerprint
import app.revanced.patches.youtube.misc.gms.fingerprints.PrimeMethodFingerprint
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
import app.revanced.patches.youtube.shared.fingerprints.MainActivityOnCreateFingerprint
@@ -17,9 +18,6 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
toPackageName = REVANCED_YOUTUBE_PACKAGE_NAME,
primeMethodFingerprint = PrimeMethodFingerprint,
earlyReturnFingerprints = setOf(
ServiceCheckFingerprint,
GooglePlayUtilityFingerprint,
CastDynamiteModuleFingerprint,
CastDynamiteModuleV2Fingerprint,
CastContextFetchFingerprint,
),
@@ -34,11 +32,12 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
CompatiblePackage(
"com.google.android.youtube",
setOf(
"18.37.36",
"18.38.44",
"18.43.45",
"18.44.41",
"18.45.43",
// Patch supports these versions but ClientSpoof does not.
// "18.37.36",
// "18.38.44",
// "18.43.45",
// "18.44.41",
// "18.45.43",
"18.48.39",
"18.49.37",
"19.01.34",
@@ -61,9 +60,6 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
),
),
fingerprints = setOf(
ServiceCheckFingerprint,
GooglePlayUtilityFingerprint,
CastDynamiteModuleFingerprint,
CastDynamiteModuleV2Fingerprint,
CastContextFetchFingerprint,
PrimeMethodFingerprint,

View File

@@ -1,8 +0,0 @@
package app.revanced.patches.youtube.misc.gms.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
internal object CastDynamiteModuleFingerprint : MethodFingerprint(
strings = listOf("com.google.android.gms.cast.framework.internal.CastDynamiteModuleImpl")
)

View File

@@ -0,0 +1,132 @@
package app.revanced.patches.youtube.misc.imageurlhook
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
import app.revanced.patcher.fingerprint.MethodFingerprint
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.MessageDigestImageUrlFingerprint
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.MessageDigestImageUrlParentFingerprint
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.RequestFingerprint
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.request.callback.OnFailureFingerprint
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.request.callback.OnResponseStartedFingerprint
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.request.callback.OnSucceededFingerprint
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
import app.revanced.util.alsoResolve
import app.revanced.util.resultOrThrow
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
@Patch(
description = "Hooks Cronet image urls",
dependencies = [
IntegrationsPatch::class
]
)
object CronetImageUrlHook : BytecodePatch(
setOf(
MessageDigestImageUrlParentFingerprint,
OnResponseStartedFingerprint,
RequestFingerprint
)
) {
private lateinit var loadImageUrlMethod: MutableMethod
private var loadImageUrlIndex = 0
private lateinit var loadImageSuccessCallbackMethod: MutableMethod
private var loadImageSuccessCallbackIndex = 0
private lateinit var loadImageErrorCallbackMethod: MutableMethod
private var loadImageErrorCallbackIndex = 0
/**
* @param highPriority If the hook should be called before all other hooks.
*/
fun addImageUrlHook(targetMethodClass: String, highPriority: Boolean = false) {
loadImageUrlMethod.addInstructions(
if (highPriority) 0 else loadImageUrlIndex,
"""
invoke-static { p1 }, $targetMethodClass->overrideImageURL(Ljava/lang/String;)Ljava/lang/String;
move-result-object p1
""",
)
loadImageUrlIndex += 2
}
/**
* If a connection completed, which includes normal 200 responses but also includes
* status 404 and other error like http responses.
*/
fun addImageUrlSuccessCallbackHook(targetMethodClass: String) {
loadImageSuccessCallbackMethod.addInstruction(
loadImageSuccessCallbackIndex++,
"invoke-static { p1, p2 }, $targetMethodClass->handleCronetSuccess(" +
"Lorg/chromium/net/UrlRequest;Lorg/chromium/net/UrlResponseInfo;)V",
)
}
/**
* If a connection outright failed to complete any connection.
*/
fun addImageUrlErrorCallbackHook(targetMethodClass: String) {
loadImageErrorCallbackMethod.addInstruction(
loadImageErrorCallbackIndex++,
"invoke-static { p1, p2, p3 }, $targetMethodClass->handleCronetFailure(" +
"Lorg/chromium/net/UrlRequest;Lorg/chromium/net/UrlResponseInfo;Ljava/io/IOException;)V",
)
}
override fun execute(context: BytecodeContext) {
loadImageUrlMethod = MessageDigestImageUrlFingerprint
.alsoResolve(context, MessageDigestImageUrlParentFingerprint).mutableMethod
loadImageSuccessCallbackMethod = OnSucceededFingerprint
.alsoResolve(context, OnResponseStartedFingerprint).mutableMethod
loadImageErrorCallbackMethod = OnFailureFingerprint
.alsoResolve(context, OnResponseStartedFingerprint).mutableMethod
// The URL is required for the failure callback hook, but the URL field is obfuscated.
// Add a helper get method that returns the URL field.
RequestFingerprint.resultOrThrow().apply {
// The url is the only string field that is set inside the constructor.
val urlFieldInstruction = mutableMethod.getInstructions().single {
if (it.opcode != Opcode.IPUT_OBJECT) return@single false
val reference = (it as ReferenceInstruction).reference as FieldReference
reference.type == "Ljava/lang/String;"
} as ReferenceInstruction
val urlFieldName = (urlFieldInstruction.reference as FieldReference).name
val definingClass = RequestFingerprint.IMPLEMENTATION_CLASS_NAME
val addedMethodName = "getHookedUrl"
mutableClass.methods.add(
ImmutableMethod(
definingClass,
addedMethodName,
emptyList(),
"Ljava/lang/String;",
AccessFlags.PUBLIC.value,
null,
null,
MutableMethodImplementation(2),
).toMutable().apply {
addInstructions(
"""
iget-object v0, p0, $definingClass->$urlFieldName:Ljava/lang/String;
return-object v0
""",
)
}
)
}
}
}

View File

@@ -1,4 +1,4 @@
package app.revanced.patches.youtube.layout.thumbnails.fingerprints
package app.revanced.patches.youtube.misc.imageurlhook.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint

View File

@@ -1,4 +1,4 @@
package app.revanced.patches.youtube.layout.thumbnails.fingerprints
package app.revanced.patches.youtube.misc.imageurlhook.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint

View File

@@ -1,8 +1,8 @@
package app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet
package app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.RequestFingerprint.IMPLEMENTATION_CLASS_NAME
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.RequestFingerprint.IMPLEMENTATION_CLASS_NAME
import com.android.tools.smali.dexlib2.AccessFlags
internal object RequestFingerprint : MethodFingerprint(

View File

@@ -1,4 +1,4 @@
package app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback
package app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.request.callback
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint

View File

@@ -1,4 +1,4 @@
package app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback
package app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.request.callback
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint

View File

@@ -1,4 +1,4 @@
package app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback
package app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.request.callback
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint

View File

@@ -7,12 +7,14 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.or
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableClass
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
import app.revanced.patches.youtube.video.information.fingerprints.*
import app.revanced.patches.youtube.video.playerresponse.PlayerResponseMethodHookPatch
import app.revanced.patches.youtube.video.videoid.VideoIdPatch
import app.revanced.util.alsoResolve
import app.revanced.util.exception
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
@@ -45,9 +47,11 @@ object VideoInformationPatch : BytecodePatch(
)
) {
private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/VideoInformation;"
private const val INTEGRATIONS_PLAYER_INTERFACE = "Lapp/revanced/integrations/youtube/patches/VideoInformation${'$'}PlaybackController;"
private lateinit var playerInitMethod: MutableMethod
private var playerInitInsertIndex = 4
private var playerInitInsertIndex = -1
private var playerInitInsertRegister = -1
private lateinit var mdxInitMethod: MutableMethod
private var mdxInitInsertIndex = -1
@@ -70,42 +74,43 @@ object VideoInformationPatch : BytecodePatch(
with(PlayerInitFingerprint.resultOrThrow()) {
playerInitMethod = mutableClass.methods.first { MethodUtil.isConstructor(it) }
// hook the player controller for use through integrations
// find the location of the first invoke-direct call and extract the register storing the 'this' object reference.
val initThisIndex = playerInitMethod.indexOfFirstInstructionOrThrow {
opcode == Opcode.INVOKE_DIRECT && getReference<MethodReference>()?.name == "<init>"
}
playerInitInsertRegister = playerInitMethod.getInstruction<FiveRegisterInstruction>(initThisIndex).registerC
playerInitInsertIndex = initThisIndex + 1
// Hook the player controller for use through integrations.
onCreateHook(INTEGRATIONS_CLASS_DESCRIPTOR, "initialize")
// seek method
val seekFingerprintResultMethod =
SeekFingerprint.also { it.resolve(context, classDef) }.resultOrThrow().method
SeekFingerprint.alsoResolve(context, PlayerInitFingerprint).method
val seekRelativeFingerprintResultMethod =
SeekRelativeFingerprint.alsoResolve(context, PlayerInitFingerprint).method
// create helper method
val seekHelperMethod = generateSeekMethodHelper(seekFingerprintResultMethod)
// add the seekTo method to the class for the integrations to call
mutableClass.methods.add(seekHelperMethod)
// Create integrations interface methods.
addSeekInterfaceMethods(mutableClass, seekFingerprintResultMethod, seekRelativeFingerprintResultMethod)
}
with(MdxPlayerDirectorSetVideoStageFingerprint.resultOrThrow()) {
mdxInitMethod = mutableClass.methods.first { MethodUtil.isConstructor(it) }
// find the location of the first invoke-direct call and extract the register storing the 'this' object reference
val initThisIndex = mdxInitMethod.indexOfFirstInstructionOrThrow {
opcode == Opcode.INVOKE_DIRECT && getReference<MethodReference>()?.name == "<init>"
}
mdxInitInsertRegister = mdxInitMethod.getInstruction<FiveRegisterInstruction>(initThisIndex).registerC
mdxInitInsertIndex = initThisIndex + 1
// hook the MDX director for use through integrations
// Hook the MDX director for use through integrations.
onCreateHookMdx(INTEGRATIONS_CLASS_DESCRIPTOR, "initializeMdx")
// MDX seek method
val mdxSeekFingerprintResultMethod =
MdxSeekFingerprint.apply { resolve(context, classDef) }.resultOrThrow().method
MdxSeekFingerprint.alsoResolve(context, MdxPlayerDirectorSetVideoStageFingerprint).method
val mdxSeekRelativeFingerprintResultMethod =
MdxSeekRelativeFingerprint.alsoResolve(context, MdxPlayerDirectorSetVideoStageFingerprint).method
// create helper method
val mdxSeekHelperMethod = generateSeekMethodHelper(mdxSeekFingerprintResultMethod)
// add the seekTo method to the class for the integrations to call
mutableClass.methods.add(mdxSeekHelperMethod)
addSeekInterfaceMethods(mutableClass, mdxSeekFingerprintResultMethod, mdxSeekRelativeFingerprintResultMethod)
}
with(CreateVideoPlayerSeekbarFingerprint.result!!) {
@@ -173,33 +178,42 @@ object VideoInformationPatch : BytecodePatch(
userSelectedPlaybackSpeedHook(INTEGRATIONS_CLASS_DESCRIPTOR, "userSelectedPlaybackSpeed")
}
private fun generateSeekMethodHelper(seekMethod: Method): MutableMethod {
private fun addSeekInterfaceMethods(targetClass: MutableClass, seekToMethod: Method, seekToRelativeMethod: Method) {
// Add the interface and methods that integrations calls.
targetClass.interfaces.add(INTEGRATIONS_PLAYER_INTERFACE)
// create helper method
val generatedMethod = ImmutableMethod(
seekMethod.definingClass,
"seekTo",
listOf(ImmutableMethodParameter("J", null, "time")),
"Z",
AccessFlags.PUBLIC or AccessFlags.FINAL,
null, null,
MutableMethodImplementation(4)
).toMutable()
arrayOf(
seekToMethod to "seekTo",
seekToRelativeMethod to "seekToRelative"
).forEach { (method, name) ->
// Add interface method.
// Get enum type for the seek helper method.
val seekSourceEnumType = method.parameterTypes[1].toString()
// get enum type for the seek helper method
val seekSourceEnumType = seekMethod.parameterTypes[1].toString()
val interfaceImplementation = ImmutableMethod(
targetClass.type,
name,
listOf(ImmutableMethodParameter("J", null, "time")),
"Z",
AccessFlags.PUBLIC or AccessFlags.FINAL,
null, null,
MutableMethodImplementation(4)
).toMutable()
// insert helper method instructions
generatedMethod.addInstructions(
0,
"""
sget-object v0, $seekSourceEnumType->a:$seekSourceEnumType
invoke-virtual { p0, p1, p2, v0 }, $seekMethod
move-result p1
return p1
"""
)
return generatedMethod
// Insert helper method instructions.
interfaceImplementation.addInstructions(
0,
"""
# first enum (field a) is SEEK_SOURCE_UNKNOWN
sget-object v0, $seekSourceEnumType->a:$seekSourceEnumType
invoke-virtual { p0, p1, p2, v0 }, $method
move-result p1
return p1
"""
)
targetClass.methods.add(interfaceImplementation)
}
}
private fun MutableMethod.insert(insertIndex: Int, register: String, descriptor: String) =
@@ -220,8 +234,8 @@ object VideoInformationPatch : BytecodePatch(
internal fun onCreateHook(targetMethodClass: String, targetMethodName: String) =
playerInitMethod.insert(
playerInitInsertIndex++,
"v0",
"$targetMethodClass->$targetMethodName(Ljava/lang/Object;)V"
"v$playerInitInsertRegister",
"$targetMethodClass->$targetMethodName($INTEGRATIONS_PLAYER_INTERFACE)V"
)
/**
@@ -234,7 +248,7 @@ object VideoInformationPatch : BytecodePatch(
mdxInitMethod.insert(
mdxInitInsertIndex++,
"v$mdxInitInsertRegister",
"$targetMethodClass->$targetMethodName(Ljava/lang/Object;)V"
"$targetMethodClass->$targetMethodName($INTEGRATIONS_PLAYER_INTERFACE)V"
)
/**

View File

@@ -5,6 +5,9 @@ import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
/**
* Resolves using class found in [MdxPlayerDirectorSetVideoStageFingerprint].
*/
internal object MdxSeekFingerprint : MethodFingerprint(
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
returnType = "Z",

View File

@@ -0,0 +1,19 @@
package app.revanced.patches.youtube.video.information.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
/**
* Resolves using class found in [MdxPlayerDirectorSetVideoStageFingerprint].
*/
internal object MdxSeekRelativeFingerprint : MethodFingerprint(
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
returnType = "Z",
parameters = listOf("J", "L"),
opcodes = listOf(
Opcode.IGET_OBJECT,
Opcode.INVOKE_INTERFACE
)
)

View File

@@ -3,6 +3,9 @@ package app.revanced.patches.youtube.video.information.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
/**
* Resolves using class found in [PlayerInitFingerprint].
*/
internal object SeekFingerprint : MethodFingerprint(
strings = listOf("Attempting to seek during an ad")
)

View File

@@ -0,0 +1,21 @@
package app.revanced.patches.youtube.video.information.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
/**
* Resolves using class found in [PlayerInitFingerprint].
*/
internal object SeekRelativeFingerprint : MethodFingerprint(
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
returnType = "Z",
parameters = listOf("J", "L"),
opcodes = listOf(
Opcode.ADD_LONG_2ADDR,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.RETURN
)
)

View File

@@ -114,7 +114,7 @@ fun Method.indexOfFirstWideLiteralInstructionValue(literal: Long) = implementati
*
* @return the first literal instruction with the value, or throws [PatchException] if not found.
*/
fun Method.indexOfFirstWideLiteralInstructionValueOrThrow(literal: Long) : Int {
fun Method.indexOfFirstWideLiteralInstructionValueOrThrow(literal: Long): Int {
val index = indexOfFirstWideLiteralInstructionValue(literal)
if (index < 0) throw PatchException("Could not find literal value: $literal")
return index
@@ -160,7 +160,7 @@ inline fun <reified T : Reference> Instruction.getReference() = (this as? Refere
// TODO: delete this on next major release, the overloaded method with an optional start index serves the same purposes.
// Method is deprecated, but annotation is commented out otherwise during compilation usage of the replacement is
// incorrectly flagged as deprecated.
//@Deprecated("Use the overloaded method with an optional start index.", ReplaceWith("indexOfFirstInstruction(predicate)"))
// @Deprecated("Use the overloaded method with an optional start index.", ReplaceWith("indexOfFirstInstruction(predicate)"))
fun Method.indexOfFirstInstruction(predicate: Instruction.() -> Boolean) = indexOfFirstInstruction(0, predicate)
/**
@@ -211,28 +211,47 @@ fun Method.findOpcodeIndicesReversed(opcode: Opcode): List<Int> {
}
/**
* Return the resolved methods of [MethodFingerprint]s early.
* Return the resolved method early.
*/
fun List<MethodFingerprint>.returnEarly(bool: Boolean = false) {
fun MethodFingerprint.returnEarly(bool: Boolean = false) {
val const = if (bool) "0x1" else "0x0"
this.forEach { fingerprint ->
fingerprint.result?.let { result ->
val stringInstructions = when (result.method.returnType.first()) {
'L' ->
"""
result?.let { result ->
val stringInstructions = when (result.method.returnType.first()) {
'L' ->
"""
const/4 v0, $const
return-object v0
"""
'V' -> "return-void"
'I', 'Z' ->
"""
'V' -> "return-void"
'I', 'Z' ->
"""
const/4 v0, $const
return v0
"""
else -> throw Exception("This case should never happen.")
}
else -> throw Exception("This case should never happen.")
}
result.mutableMethod.addInstructions(0, stringInstructions)
} ?: throw fingerprint.exception
}
result.mutableMethod.addInstructions(0, stringInstructions)
} ?: throw exception
}
/**
* Return the resolved methods early.
*/
fun Iterable<MethodFingerprint>.returnEarly(bool: Boolean = false) = forEach { fingerprint ->
fingerprint.returnEarly(bool)
}
/**
* Return the resolved methods early.
*/
@Deprecated("Use the Iterable version")
fun List<MethodFingerprint>.returnEarly(bool: Boolean = false) = forEach { fingerprint ->
fingerprint.returnEarly(bool)
}
/**
* Resolves this fingerprint using the classDef of a parent fingerprint.
*/
fun MethodFingerprint.alsoResolve(context: BytecodeContext, parentFingerprint: MethodFingerprint) =
also { resolve(context, parentFingerprint.resultOrThrow().classDef) }.resultOrThrow()

View File

@@ -171,10 +171,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
<patch id="layout.sponsorblock.SponsorBlockResourcePatch">
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title' -->
<!-- Toast shown if network connection times out. Translations of this should not be longer than the original English or the text can be clipped and not entirely shown. -->
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<!-- Shown in the settings preferences, and translations can be any text length. -->
</patch>
<patch id="layout.spoofappversion.SpoofAppVersionPatch">
@@ -198,6 +194,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
</patch>
<patch id="layout.theme.ThemeResourcePatch">
</patch>
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
</patch>
<patch id="layout.thumbnails.AlternativeThumbnailsPatch">
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
<!-- 'Subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
@@ -206,6 +204,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
</patch>
<patch id="misc.announcements.AnnouncementsPatch">
</patch>
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
</patch>
<patch id="misc.autorepeat.AutoRepeatPatch">
</patch>
<patch id="misc.dimensions.spoof.SpoofDeviceDimensionsPatch">
@@ -216,8 +216,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
</patch>
<patch id="misc.links.OpenLinksExternallyPatch">
</patch>
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
</patch>
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
</patch>
<patch id="misc.zoomhaptics.ZoomHapticsPatch">

View File

@@ -171,10 +171,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
<patch id="layout.sponsorblock.SponsorBlockResourcePatch">
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title' -->
<!-- Toast shown if network connection times out. Translations of this should not be longer than the original English or the text can be clipped and not entirely shown. -->
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<!-- Shown in the settings preferences, and translations can be any text length. -->
</patch>
<patch id="layout.spoofappversion.SpoofAppVersionPatch">
@@ -198,6 +194,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
</patch>
<patch id="layout.theme.ThemeResourcePatch">
</patch>
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
</patch>
<patch id="layout.thumbnails.AlternativeThumbnailsPatch">
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
<!-- 'Subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
@@ -206,6 +204,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
</patch>
<patch id="misc.announcements.AnnouncementsPatch">
</patch>
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
</patch>
<patch id="misc.autorepeat.AutoRepeatPatch">
</patch>
<patch id="misc.dimensions.spoof.SpoofDeviceDimensionsPatch">
@@ -216,8 +216,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
</patch>
<patch id="misc.links.OpenLinksExternallyPatch">
</patch>
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
</patch>
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
</patch>
<patch id="misc.zoomhaptics.ZoomHapticsPatch">

View File

@@ -211,6 +211,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_hide_info_cards_section_title">ØĨØŽŲØ§ØĄ Ų‚ØŗŲ… Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„Ų…ØšŲ„ŲˆŲ…Ø§ØĒ</string>
<string name="revanced_hide_info_cards_section_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ų‚ØŗŲ… Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„Ų…ØšŲ„ŲˆŲ…Ø§ØĒ</string>
<string name="revanced_hide_info_cards_section_summary_off">؊ØĒŲ… ØšØąØļ Ų‚ØŗŲ… Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„Ų…ØšŲ„ŲˆŲ…Ø§ØĒ</string>
<string name="revanced_hide_key_concepts_section_title">ØĨØŽŲØ§ØĄ Ų‚ØŗŲ… \'Ø§Ų„Ų…ŲØ§Ų‡ŲŠŲ… Ø§Ų„ØŖØŗØ§ØŗŲŠØŠ\'</string>
<string name="revanced_hide_key_concepts_section_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ų‚ØŗŲ… \'Ø§Ų„Ų…ŲØ§Ų‡ŲŠŲ… Ø§Ų„ØŖØŗØ§ØŗŲŠØŠ\'</string>
<string name="revanced_hide_key_concepts_section_summary_off">؊ØĒŲ… ØšØąØļ Ų‚ØŗŲ… \'Ø§Ų„Ų…ŲØ§Ų‡ŲŠŲ… Ø§Ų„ØŖØŗØ§ØŗŲŠØŠ\'</string>
<string name="revanced_hide_transcript_section_title">ØĨØŽŲØ§ØĄ Ų‚ØŗŲ… Ø§Ų„Ų†Øĩ</string>
<string name="revanced_hide_transcript_section_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ų‚ØŗŲ… Ø§Ų„Ų†Øĩ</string>
<string name="revanced_hide_transcript_section_summary_off">؊ØĒŲ… ØšØąØļ Ų‚ØŗŲ… Ø§Ų„Ų†Øĩ</string>
@@ -246,7 +249,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_hide_keyword_toast_invalid_common">Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ ØēŲŠØą ØĩØ§Ų„Ø­ØŠ. Ų„Ø§ ŲŠŲ…ŲƒŲ† Ø§ØŗØĒØŽØ¯Ø§Ų…: \'%s\' ŲƒØšØ§Ų…Ų„ ØĒØĩŲŲŠØŠ</string>
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
<string name="revanced_hide_keyword_toast_invalid_length">Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ ØēŲŠØą ØĩØ§Ų„Ø­ØŠ. \'%1$s\' ØŖŲ‚Ų„ Ų…Ų† %2$d Ø­ØąŲŲ‹Ø§</string>
<string name="revanced_hide_keyword_toast_invalid_broad">Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ \'$s\' ØŗŲˆŲ ØĒØŽŲŲŠ ØŦŲ…ŲŠØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ</string>
<string name="revanced_hide_keyword_toast_invalid_broad">Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ \'%s\' ØŗŲˆŲ ØĒØŽŲŲŠ ØŦŲ…ŲŠØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ</string>
</patch>
<patch id="ad.general.HideAdsResourcePatch">
<string name="revanced_hide_general_ads_title">ØĨØŽŲØ§ØĄ Ø§Ų„ØĨØšŲ„Ø§Ų†Ø§ØĒ Ø§Ų„ØšØ§Ų…ØŠ</string>
@@ -771,6 +774,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_sb_general_skipcount_sum_off">ØĒŲ… ØĒØšØˇŲŠŲ„ ØĒØĒبؚ Ų…ØąØ§ØĒ Ø§Ų„ØĒØŽØˇŲŠ</string>
<string name="revanced_sb_general_min_duration">Ø§Ų„Ø­Ø¯ Ø§Ų„ØŖØ¯Ų†Ų‰ Ų„Ų…Ø¯ØŠ Ø§Ų„Ų…Ų‚ØˇØš</string>
<string name="revanced_sb_general_min_duration_sum">Ų„Ų† ؊ØĒŲ… ØšØąØļ Ø§Ų„Ų…Ų‚Ø§ØˇØš Ø§Ų„ØŖŲ‚ØĩØą Ų…Ų† Ų‡Ø°Ų‡ Ø§Ų„Ų‚ŲŠŲ…ØŠ (Ø¨Ø§Ų„ØĢŲˆØ§Ų†ŲŠ) ØŖŲˆ ØĒØŽØˇŲŠŲ‡Ø§</string>
<string name="revanced_sb_general_min_duration_invalid">Ø§Ų„Ų…Ø¯ØŠ Ø§Ų„Ø˛Ų…Ų†ŲŠØŠ ØēŲŠØą ØĩØ§Ų„Ø­ØŠ</string>
<string name="revanced_sb_general_uuid">Ų…ØšØąŲ Ø§Ų„Ų…ØŗØĒØŽØ¯Ų… Ø§Ų„ŲØąŲŠØ¯ Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ</string>
<string name="revanced_sb_general_uuid_sum">؊ØŦب ØŖŲ† ŲŠØ¨Ų‚Ų‰ Ų‡Ø°Ø§ ؎اØĩŲ‹Ø§. Ø§Ų†Ų‡ Ų…ØĢŲ„ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą ŲˆŲ„Ø§ ŲŠŲ†Ø¨Øē؊ Ų…Ø´Ø§ØąŲƒØĒŲ‡ Ų…Øš ØŖŲŠ Ø´ØŽØĩ. ØĨذا ŲƒØ§Ų† Ø´ØŽØĩ Ų…Ø§ ŲŠŲ…Ų„Ųƒ Ų‡Ø°Ø§ØŒ ŲŲŠŲ…ŲƒŲ†Ų‡ Ø§Ų†ØĒØ­Ø§Ų„ Ø´ØŽØĩ؊ØĒ؃</string>
<string name="revanced_sb_general_uuid_invalid">؊ØŦب ØŖŲ† ŲŠŲƒŲˆŲ† Ų…ØšØąŲ Ø§Ų„Ų…ØŗØĒØŽØ¯Ų… Ø§Ų„ØŽØ§Øĩ 30 Ø­ØąŲŲ‹Ø§ ØšŲ„Ų‰ Ø§Ų„ØŖŲ‚Ų„</string>
@@ -864,17 +868,13 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_sb_new_segment_choose_category">ا؎ØĒŲŠØ§Øą ؁ØĻØŠ Ø§Ų„Ų…Ų‚ØˇØš</string>
<string name="revanced_sb_new_segment_disabled_category">Ø§Ų„ŲØĻØŠ Ų…ØšØˇŲ„ØŠ ؁؊ Ø§Ų„ØĨؚداداØĒ. ØĒŲ…ŲƒŲŠŲ† Ø§Ų„ŲØĻØŠ Ų„Ų„ØĨØąØŗØ§Ų„.</string>
<string name="revanced_sb_new_segment_title">Ų…Ų‚ØˇØš Ų…Ø§Ų†ŲØš ØąŲØšŲŽØ§ØŠ ØŦØ¯ŲŠØ¯</string>
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<string name="revanced_sb_new_segment_mark_time_as_question">ØĒØšŲŠŲŠŲ† %1$02d:%2$02d:%3$03d ŲƒØ¨Ø¯Ø§ŲŠØŠ ØŖŲ… Ų†Ų‡Ø§ŲŠØŠ Ų„Ų…Ų‚ØˇØš ØŦØ¯ŲŠØ¯ØŸ</string>
<string name="revanced_sb_new_segment_mark_time_as_question">ØĒØšŲŠŲŠŲ† %s ŲƒØ¨Ø¯Ø§ŲŠØŠ ØŖŲˆ Ų†Ų‡Ø§ŲŠØŠ Ų„Ų…Ų‚ØˇØš ØŦØ¯ŲŠØ¯ØŸ</string>
<string name="revanced_sb_new_segment_mark_start">Ø§Ų„Ø¨Ø¯Ø§ŲŠØŠ</string>
<string name="revanced_sb_new_segment_mark_end">Ø§Ų„Ų†Ų‡Ø§ŲŠØŠ</string>
<string name="revanced_sb_new_segment_now">Ø§Ų„ØĸŲ†</string>
<string name="revanced_sb_new_segment_time_start">Ø§Ų„ŲˆŲ‚ØĒ Ø§Ų„Ø°ŲŠ ŲŠØ¨Ø¯ØŖ ØšŲ†Ø¯Ų‡ Ø§Ų„Ų…Ų‚ØˇØš</string>
<string name="revanced_sb_new_segment_time_end">Ø§Ų„ŲˆŲ‚ØĒ Ø§Ų„Ø°ŲŠ ŲŠŲ†ØĒŲ‡ŲŠ ØšŲ†Ø¯Ų‡ Ø§Ų„Ų…Ų‚ØˇØš</string>
<string name="revanced_sb_new_segment_confirm_title">Ų‡Ų„ Ø§Ų„ØŖŲˆŲ‚Ø§ØĒ ØĩØ­ŲŠØ­ØŠØŸ</string>
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<string name="revanced_sb_new_segment_confirm_content">Ø§Ų„Ų…Ų‚ØˇØš Ų…Ų†\n\n%1$s\nto\n%2$s\n\n(%3$s)\n\nReady to ØŦØ§Ų‡Ø˛ Ų„Ų„ØĨØąØŗØ§Ų„ØŸ</string>
<string name="revanced_sb_new_segment_start_is_before_end">؊ØŦب ØŖŲ† ØĒŲƒŲˆŲ† Ø§Ų„Ø¨Ø¯Ø§ŲŠØŠ Ų‚Ø¨Ų„ Ø§Ų„Ų†Ų‡Ø§ŲŠØŠ</string>
<string name="revanced_sb_new_segment_mark_locations_first">ØļØš ØšŲ„Ø§Ų…ØŠ ØšŲ„Ų‰ Ų…ŲˆŲ‚ØšŲŠŲ† ؁؊ Ø´ØąŲŠØˇ Ø§Ų„ŲˆŲ‚ØĒ ØŖŲˆŲ„Ų‹Ø§</string>
@@ -925,7 +925,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_spoof_app_version_target_entry_2">18.20.39 - Ø§ØŗØĒؚاد؊ ØŗØąØšØŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„ŲˆØ§ØŗØšØŠ &amp; Ų‚Ø§ØĻŲ…ØŠ Ø§Ų„ØŦŲˆØ¯ØŠ</string>
<string name="revanced_spoof_app_version_target_entry_3">18.09.39 - Ø§ØŗØĒؚاد؊ ØšŲ„Ø§Ų…ØŠ ØĒØ¨ŲˆŲŠØ¨ Ø§Ų„Ų…ŲƒØĒب؊</string>
<string name="revanced_spoof_app_version_target_entry_4">17.41.37 - Ø§ØŗØĒؚاد؊ ØąŲ Ų‚Ø§ØĻŲ…ØŠ Ø§Ų„ØĒØ´ØēŲŠŲ„ Ø§Ų„Ų‚Ø¯ŲŠŲ…</string>
<string name="revanced_spoof_app_version_target_entry_5">17.30.34 - Ø§ØŗØĒؚاد؊ ØĒØĩŲ…ŲŠŲ… ŲˆØ§ØŦŲ‡ØŠ Ø§Ų„Ų…ØŗØĒØŽØ¯Ų… Ø§Ų„Ų‚Ø¯ŲŠŲ…</string>
<string name="revanced_spoof_app_version_target_entry_5">17.33.42 - Ø§ØŗØĒؚاد؊ ØĒØĩŲ…ŲŠŲ… ŲˆØ§ØŦŲ‡ØŠ Ø§Ų„Ų…ØŗØĒØŽØ¯Ų… Ø§Ų„Ų‚Ø¯ŲŠŲ…</string>
</patch>
<patch id="layout.startpage.ChangeStartPagePatch">
<string name="revanced_start_page_title">ØĒØšŲŠŲŠŲ† ØĩŲØ­ØŠ Ø§Ų„Ø¨Ø¯Ø§ŲŠØŠ</string>
@@ -990,6 +990,11 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_seekbar_custom_color_value_summary">Ų„ŲˆŲ† Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ‚Ø¯Ų…</string>
<string name="revanced_seekbar_custom_color_invalid">Ų„ŲˆŲ† Ø§Ų„Ø´ØąŲŠØˇ ØēŲŠØą ØĩØ§Ų„Ø­. Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„Ų‚ŲŠŲ…ØŠ Ø§Ų„Ø§ŲØĒØąØ§ØļŲŠØŠ.</string>
</patch>
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
<string name="revanced_bypass_image_region_restrictions_title">ØĒØŦØ§ŲˆØ˛ Ų‚ŲŠŲˆØ¯ Ų…Ų†ØˇŲ‚ØŠ Ø§Ų„ØĩŲˆØąØŠ</string>
<string name="revanced_bypass_image_region_restrictions_summary_on">Ø§ØŗØĒØŽØ¯Ø§Ų… Ų…Øļ؊؁ Ø§Ų„ØĩŲˆØąØŠ yt4.ggpht.com</string>
<string name="revanced_bypass_image_region_restrictions_summary_off">Ø§ØŗØĒØŽØ¯Ø§Ų… Ų…Øļ؊؁ Ø§Ų„ØĩŲˆØą Ø§Ų„ØŖØĩŲ„ŲŠ\n\nØĒŲ…ŲƒŲŠŲ† Ų‡Ø°Ø§ ŲŠŲ…ŲƒŲ† ØĨØĩŲ„Ø§Ø­ Ø§Ų„ØĩŲˆØą Ø§Ų„Ų…ŲŲ‚ŲˆØ¯ØŠ Ø§Ų„ØĒ؊ ؊ØĒŲ… Ø­Ø¸ØąŲ‡Ø§ ؁؊ بؚØļ Ø§Ų„Ų…Ų†Ø§ØˇŲ‚</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">ØšŲ„Ø§Ų…ØŠ ØĒØ¨ŲˆŲŠØ¨ Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ</string>
@@ -1030,6 +1035,11 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_announcements_connection_failed">ŲØ´Ų„ Ø§Ų„Ø§ØĒØĩØ§Ų„ Ø¨Ų…ŲˆŲØą Ø§Ų„ØĨØšŲ„Ø§Ų†Ø§ØĒ</string>
<string name="revanced_announcements_dialog_dismiss">ØĒØŦØ§Ų‡Ų„</string>
</patch>
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
<string name="revanced_check_watch_history_domain_name_dialog_title">ØĒØ­Ø°ŲŠØą</string>
<string name="revanced_check_watch_history_domain_name_dialog_message">Ų„Ų… ؊ØĒŲ… Ø­ŲØ¸ ØŗØŦŲ„ Ø§Ų„Ų…Ø´Ø§Ų‡Ø¯ØŠ Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ.&lt;br&gt;&lt;br&gt;Ų…Ų† Ø§Ų„Ų…ØąØŦØ­ ØŖŲ† ŲŠŲƒŲˆŲ† Ø§Ų„ØŗØ¨Ø¨ ؁؊ Ø°Ų„Ųƒ Ų‡Ųˆ Ų…Ø§Ų†Øš ØĨØšŲ„Ø§Ų†Ø§ØĒ DNS ØŖŲˆ ŲˆŲƒŲŠŲ„ Ø§Ų„Ø´Ø¨ŲƒØŠ.&lt;br&gt;&lt;br&gt;Ų„ØĨØĩŲ„Ø§Ø­ Ų‡Ø°Ų‡ Ø§Ų„Ų…Ø´ŲƒŲ„ØŠØŒ Ų‚Ų… بØĨØļØ§ŲØŠ &lt;b&gt;s.youtube.com&lt;/b&gt; ØĨŲ„Ų‰ Ø§Ų„Ų‚Ø§ØĻŲ…ØŠ Ø§Ų„Ø¨ŲŠØļØ§ØĄ ØŖŲˆ Ų‚Ų… بØĨŲŠŲ‚Ø§Ų ØĒØ´ØēŲŠŲ„ ØŦŲ…ŲŠØš ØŖØ¯ŲˆØ§ØĒ Ø­Ø¸Øą DNS ŲˆŲˆŲƒŲ„Ø§ØĄ Ø§Ų„Ø¨ØąŲˆŲƒØŗŲŠ.</string>
<string name="revanced_check_watch_history_domain_name_dialog_ignore">Ų„Ø§ ØĒØšØąØļ Ų…ØąØŠ ØŖØŽØąŲ‰</string>
</patch>
<patch id="misc.autorepeat.AutoRepeatPatch">
<string name="revanced_auto_repeat_title">ØĒŲ…ŲƒŲŠŲ† Ø§Ų„ØĒŲƒØąØ§Øą Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊</string>
<string name="revanced_auto_repeat_summary_on">ØĒŲ… ØĒŲ…ŲƒŲŠŲ† Ø§Ų„ØĒŲƒØąØ§Øą Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊</string>
@@ -1055,10 +1065,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_external_browser_summary_on">؁ØĒØ­ Ø§Ų„ØąŲˆØ§Ø¨Øˇ ØŽØ§ØąØŦŲŠŲ‹Ø§</string>
<string name="revanced_external_browser_summary_off">؁ØĒØ­ Ø§Ų„ØąŲˆØ§Ø¨Øˇ ؁؊ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚</string>
</patch>
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
<string name="revanced_background_playback_title">Ø§Ų„ØĒØ´ØēŲŠŲ„ ؁؊ Ø§Ų„ØŽŲ„ŲŲŠØŠ</string>
<string name="revanced_background_playback_summary">ŲŠŲ…ŲƒŲ† Ø§Ų„ØšØĢŲˆØą ØšŲ„Ų‰ Ų‡Ø°Ø§ Ø§Ų„ØĨؚداد ؁؊ Ø§Ų„ØĨؚداداØĒ -&gt; Ø§Ų„ØŽŲ„ŲŲŠØŠ</string>
</patch>
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
<string name="revanced_remove_tracking_query_parameter_title">ØĨØ˛Ø§Ų„ØŠ Ų…ØšŲ„Ų…ØŠ ØĒØĒبؚ Ø§Ų„Ø§ØŗØĒØšŲ„Ø§Ų…</string>
<string name="revanced_remove_tracking_query_parameter_summary_on">؊ØĒŲ… ØĨØ˛Ø§Ų„ØŠ Ų…ØšŲ„Ų…ØŠ Ø§ØŗØĒØšŲ„Ø§Ų… Ø§Ų„ØĒØĒبؚ Ų…Ų† Ø§Ų„ØąŲˆØ§Ø¨Øˇ</string>
@@ -1115,9 +1121,15 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_spoof_client_summary_on">؊ØĒŲ… Ų…Ø­Ø§ŲƒØ§ØŠ Ø§Ų„ØšŲ…ŲŠŲ„</string>
<string name="revanced_spoof_client_summary_off">Ų„Ø§ ؊ØĒŲ… Ų…Ø­Ø§ŲƒØ§ØŠ Ø§Ų„ØšŲ…ŲŠŲ„\n\nŲ‚Ø¯ Ų„Ø§ ŲŠØšŲ…Ų„ ØĒØ´ØēŲŠŲ„ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string>
<string name="revanced_spoof_client_user_dialog_message">ØĨŲŠŲ‚Ø§Ų ØĒØ´ØēŲŠŲ„ Ų‡Ø°Ø§ Ø§Ų„ØĨؚداد Ų‚Ø¯ ŲŠØŗØ¨Ø¨ Ų…Ø´Ø§ŲƒŲ„ ؁؊ ØĒØ´ØēŲŠŲ„ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ.</string>
<string name="revanced_spoof_client_use_ios_title">Spoof Client to iOS</string>
<string name="revanced_spoof_client_use_ios_summary_on">ØĒØĒŲ… Ø­Ø§Ų„ŲŠŲ‹Ø§ Ų…Ø­Ø§ŲƒØ§ØŠ Ø§Ų„ØšŲ…ŲŠŲ„ ØĨŲ„Ų‰ iOS\n\nØ§Ų„ØĸØĢØ§Øą Ø§Ų„ØŦØ§Ų†Ø¨ŲŠØŠ ØĒØ´Ų…Ų„:\nâ€ĸ Ų„Ø§ ؊؈ØŦد ŲŲŠØ¯ŲŠŲˆ HDR\nâ€ĸ Ų‚Ø¯ Ų„Ø§ ŲŠØšŲ…Ų„ ØŗØŦŲ„ Ø§Ų„Ų…Ø´Ø§Ų‡Ø¯ØŠ\nâ€ĸ Ų‚Ø¯ ØĒŲƒŲˆŲ† ØŦŲˆØ¯ØŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„ØŖØšŲ„Ų‰ Ų…ŲŲ‚ŲˆØ¯ØŠ\nâ€ĸ Ų„Ø§ ŲŠŲ…ŲƒŲ† ØĒØ´ØēŲŠŲ„ Ø§Ų„Ø¨ØĢ Ø§Ų„Ų…Ø¨Ø§Ø´Øą ؃Øĩ؈ØĒ ŲŲ‚Øˇ\nâ€ĸ Ø§Ų„Ø¨ØĢ Ø§Ų„Ų…Ø¨Ø§Ø´Øą ØēŲŠØą Ų…ØĒŲˆŲØą ØšŲ„Ų‰ Android 8.0</string>
<string name="revanced_spoof_client_use_ios_summary_off">ØĒØĒŲ… Ų…Ø­Ø§ŲƒØ§ØŠ Ø§Ų„ØšŲ…ŲŠŲ„ Ø­Ø§Ų„ŲŠŲ‹Ø§ ØĨŲ„Ų‰ Android VR\n\nØ§Ų„ØĸØĢØ§Øą Ø§Ų„ØŦØ§Ų†Ø¨ŲŠØŠ ØĒØ´Ų…Ų„:\nâ€ĸ Ų„Ø§ ؊؈ØŦد ŲŲŠØ¯ŲŠŲˆ HDR\nâ€ĸ ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ Ø§Ų„ØŖØˇŲØ§Ų„ Ų„Ø§ ؊ØĒŲ… ØĒØ´ØēŲŠŲ„Ų‡Ų…\nâ€ĸ Ų…Ų‚Ø§ØˇØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…ØĒŲˆŲ‚ŲØŠ ŲŠŲ…ŲƒŲ† ØŖŲ† ØĒØŗØĒØŖŲ†Ų ØšØ´ŲˆØ§ØĻŲŠØ§\nâ€ĸ ØŦŲˆØ¯ØŠ Ų…Ų†ØŽŲØļØŠ Ų„Ų…ØĩØēØąØ§ØĒ Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ‚Ø¯Ų…\nâ€ĸ Ø˛Øą Ø§Ų„ØĒŲ†Ø˛ŲŠŲ„ Ų…ØŽŲŲŠ Ø¨Ø´ŲƒŲ„ داØĻŲ…\nâ€ĸ Ø¨ØˇØ§Ų‚Ø§ØĒ Ų†Ų‡Ø§ŲŠØŠ Ø§Ų„Ø´Ø§Ø´ØŠ Ų…ØŽŲŲŠØŠ Ø¨Ø´ŲƒŲ„ داØĻŲ…</string>
<string name="revanced_spoof_client_type_title">Ų†ŲˆØš Spoof Client</string>
<string name="revanced_spoof_client_ios_force_avc_title">ŲØąØļ AVC iOS (H.264)</string>
<string name="revanced_spoof_client_ios_force_avc_summary_on">ØĒØąŲ…ŲŠØ˛ ŲŲŠØ¯ŲŠŲˆ iOS Ų‡Ųˆ AVC</string>
<string name="revanced_spoof_client_ios_force_avc_summary_off">ØĒØąŲ…ŲŠØ˛ ŲŲŠØ¯ŲŠŲˆ iOS Ų‡Ųˆ AVC ØŖŲˆ VP9 ØŖŲˆ AV1</string>
<string name="revanced_spoof_client_ios_force_avc_user_dialog_message">Ų‚Ø¯ ŲŠØ¤Ø¯ŲŠ ØĒŲ…ŲƒŲŠŲ† Ų‡Ø°Ø§ ØĨŲ„Ų‰ ØĒØ­ØŗŲŠŲ† ØšŲ…Øą Ø§Ų„Ø¨ØˇØ§ØąŲŠØŠ ؈ØĨØĩŲ„Ø§Ø­ Ų…Ø´ŲƒŲ„ØŠ ØĒŲ‚ØˇŲŠØš Ø§Ų„ØĒØ´ØēŲŠŲ„.\n\n؊ØĒŲ…ØĒØš ØĒŲ†ØŗŲŠŲ‚ AVC Ø¨Ø¯Ų‚ØŠ Ų‚ØĩŲˆŲ‰ ØĒØ¨Ų„Øē 1080P، ŲˆØŗŲŠØŗØĒØŽØ¯Ų… ØĒØ´ØēŲŠŲ„ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…Ø˛ŲŠØ¯ Ų…Ų† Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĨŲ†ØĒØąŲ†ØĒ Ų…Ų‚Ø§ØąŲ†ØŠŲ‹ بØĒŲ†ØŗŲŠŲ‚ VP9 ØŖŲˆ AV1.</string>
<string name="revanced_spoof_client_about_android_ios_title">Ø§Ų„ØĒØŖØĢŲŠØąØ§ØĒ Ø§Ų„ØŦØ§Ų†Ø¨ŲŠØŠ Ų„Ų…Ø­Ø§ŲƒØ§ØŠ iOS</string>
<string name="revanced_spoof_client_about_android_ios_summary">â€ĸ HDR Ų…Ø¯ØšŲˆŲ… ŲŲ‚Øˇ Ų…Øš ØĒØąŲ…ŲŠØ˛ AV1\nâ€ĸ ØŗØŦŲ„ Ø§Ų„Ų…Ø´Ø§Ų‡Ø¯ØŠ Ų„Ø§ ŲŠØšŲ…Ų„ Ų…Øš Ø­ØŗØ§Ø¨ Ø§Ų„ØšŲ„Ø§Ų…ØŠ Ø§Ų„ØĒØŦØ§ØąŲŠØŠ</string>
<string name="revanced_spoof_client_about_android_vr_title">Ø§Ų„ØĒØŖØĢŲŠØąØ§ØĒ Ø§Ų„ØŦØ§Ų†Ø¨ŲŠØŠ Ų„Ų…Ø­Ø§ŲƒØ§ØŠ Android VR</string>
<string name="revanced_spoof_client_about_android_vr_summary">â€ĸ Ų„Ø§ ؊؈ØŦد ŲŲŠØ¯ŲŠŲˆ HDR\nâ€ĸ Ų„Ø§ ؊ØĒŲ… ØĒØ´ØēŲŠŲ„ Ų…Ų‚Ø§ØˇØš ŲŲŠØ¯ŲŠŲˆ Ø§Ų„ØŖØˇŲØ§Ų„\nâ€ĸ ŲŠŲ…ŲƒŲ† Ø§ØŗØĒØĻŲ†Ø§Ų Ų…Ų‚Ø§ØˇØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…ØĒŲˆŲ‚ŲØŠ Ų…Ø¤Ų‚ØĒŲ‹Ø§ Ø¨Ø´ŲƒŲ„ ØšØ´ŲˆØ§ØĻ؊\nâ€ĸ Ų…ØĩØēØąØ§ØĒ Ø´ØąŲŠØˇ ØĒŲ‚Ø¯Ų… ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ Shorts Ų…Ų†ØŽŲØļØŠ Ø§Ų„ØŦŲˆØ¯ØŠ\nâ€ĸ Ø˛Øą ØĨØŦØąØ§ØĄ Ø§Ų„ØĒŲ†Ø˛ŲŠŲ„ Ų…ØŽŲŲŠ\nâ€ĸ Ø¨ØˇØ§Ų‚Ø§ØĒ شاش؊ Ø§Ų„Ų†Ų‡Ø§ŲŠØŠ Ų…ØŽŲŲŠØŠ</string>
<string name="revanced_spoof_client_storyboard_timeout">Ų…Ø­Ø§ŲƒØ§ØŠ Ų…ØĩØēØąØ§ØĒ Ø§Ų„ØšŲ…ŲŠŲ„ ØēŲŠØą Ų…ØĒŲˆŲØąØŠ (Ø§Ų†ØĒŲ‡ØĒ Ų…Ų‡Ų„ØŠ API)</string>
<string name="revanced_spoof_client_storyboard_io_exception">Ų…Ø­Ø§ŲƒØ§ØŠ Ų…ØĩØēØąØ§ØĒ Ø§Ų„ØšŲ…ŲŠŲ„ ØēŲŠØą Ų…ØĒŲˆŲØąØŠ Ų…Ø¤Ų‚ØĒŲ‹Ø§: %s</string>
</patch>

View File

@@ -171,10 +171,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
<patch id="layout.sponsorblock.SponsorBlockResourcePatch">
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title' -->
<!-- Toast shown if network connection times out. Translations of this should not be longer than the original English or the text can be clipped and not entirely shown. -->
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<!-- Shown in the settings preferences, and translations can be any text length. -->
</patch>
<patch id="layout.spoofappversion.SpoofAppVersionPatch">
@@ -198,6 +194,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
</patch>
<patch id="layout.theme.ThemeResourcePatch">
</patch>
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
</patch>
<patch id="layout.thumbnails.AlternativeThumbnailsPatch">
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
<!-- 'Subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
@@ -206,6 +204,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
</patch>
<patch id="misc.announcements.AnnouncementsPatch">
</patch>
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
</patch>
<patch id="misc.autorepeat.AutoRepeatPatch">
</patch>
<patch id="misc.dimensions.spoof.SpoofDeviceDimensionsPatch">
@@ -216,8 +216,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
</patch>
<patch id="misc.links.OpenLinksExternallyPatch">
</patch>
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
</patch>
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
</patch>
<patch id="misc.zoomhaptics.ZoomHapticsPatch">

File diff suppressed because it is too large Load Diff

View File

@@ -211,6 +211,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_hide_info_cards_section_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ Ņ€Đ°ĐˇĐ´ĐˇĐĩĐģ Ņ–ĐŊŅ„Đ°Ņ€ĐŧĐ°Ņ†Ņ‹ĐšĐŊҋ҅ ĐēĐ°Ņ€Ņ‚</string>
<string name="revanced_hide_info_cards_section_summary_on">РаСдСĐĩĐģ Ņ–ĐŊŅ„Đ°Ņ€ĐŧĐ°Ņ†Ņ‹ĐšĐŊҋ҅ ĐēĐ°Ņ€Ņ‚Đ°Đē ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹</string>
<string name="revanced_hide_info_cards_section_summary_off">ПаĐēаСваĐĩŅ†Ņ†Đ° Ņ€Đ°ĐˇĐ´ĐˇĐĩĐģ Ņ–ĐŊŅ„Đ°Ņ€ĐŧĐ°Ņ†Ņ‹ĐšĐŊҋ҅ ĐēĐ°Ņ€Ņ‚</string>
<string name="revanced_hide_key_concepts_section_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ Ņ€Đ°ĐˇĐ´ĐˇĐĩĐģ ÂĢКĐģŅŽŅ‡Đ°Đ˛Ņ‹Ņ ĐŋаĐŊŅŅ†Ņ†Ņ–Âģ</string>
<string name="revanced_hide_key_concepts_section_summary_on">РаСдСĐĩĐģ \"КĐģŅŽŅ‡Đ°Đ˛Ņ‹Ņ ĐŋаĐŊŅŅ†Ņ†Ņ–\" ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹</string>
<string name="revanced_hide_key_concepts_section_summary_off">ПаĐēаСаĐŊŅ‹ Ņ€Đ°ĐˇĐ´ĐˇĐĩĐģ ÂĢКĐģŅŽŅ‡Đ°Đ˛Ņ‹Ņ ĐŋаĐŊŅŅ†Ņ†Ņ–Âģ</string>
<string name="revanced_hide_transcript_section_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ Ņ€Đ°ĐˇĐ´ĐˇĐĩĐģ ŅŅ‚ŅĐŊĐ°ĐŗŅ€Đ°ĐŧŅ‹</string>
<string name="revanced_hide_transcript_section_summary_on">РаСдСĐĩĐģ ŅŅ‚ŅĐŊĐ°ĐŗŅ€Đ°ĐŧŅ‹ ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹</string>
<string name="revanced_hide_transcript_section_summary_off">ПаĐēаСваĐĩŅ†Ņ†Đ° Ņ€Đ°ĐˇĐ´ĐˇĐĩĐģ ŅŅ‚ŅĐŊĐ°ĐŗŅ€Đ°ĐŧŅ‹</string>
@@ -246,7 +249,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_hide_keyword_toast_invalid_common">ĐŅĐŋŅ€Đ°Đ˛Ņ–ĐģҌĐŊаĐĩ ĐēĐģŅŽŅ‡Đ°Đ˛ĐžĐĩ ҁĐģОва. НĐĩĐŧĐ°ĐŗŅ‡Ņ‹Đŧа Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°Ņ†ŅŒ: \"%s\" ҃ ŅĐēĐ°ŅŅ†Ņ– ҄ҖĐģŅŒŅ‚Ņ€Đ°</string>
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
<string name="revanced_hide_keyword_toast_invalid_length">ĐŅĐŋŅ€Đ°Đ˛Ņ–ĐģҌĐŊаĐĩ ĐēĐģŅŽŅ‡Đ°Đ˛ĐžĐĩ ҁĐģОва. \"%1$s\" СĐŧŅŅˆŅ‡Đ°Đĩ ĐŧĐĩĐŊ҈ Са %2$d ҁҖĐŧваĐģĐ°Ņž</string>
<string name="revanced_hide_keyword_toast_invalid_broad">КĐģŅŽŅ‡Đ°Đ˛ĐžĐĩ ҁĐģОва \"$s\" ŅŅ…Đ°Đ˛Đ°Đĩ ŅžŅĐĩ Đ˛Ņ–Đ´ŅĐ°</string>
<string name="revanced_hide_keyword_toast_invalid_broad">КĐģŅŽŅ‡Đ°Đ˛ĐžĐĩ ҁĐģОва \"%s\" ŅŅ…Đ°Đ˛Đ°Đĩ ŅžŅĐĩ Đ˛Ņ–Đ´ŅĐ°</string>
</patch>
<patch id="ad.general.HideAdsResourcePatch">
<string name="revanced_hide_general_ads_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ Đ°ĐŗŅƒĐģҌĐŊŅƒŅŽ Ņ€ŅĐēĐģаĐŧ҃</string>
@@ -864,17 +867,13 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_sb_new_segment_choose_category">Đ’Ņ‹ĐąĐĩҀҋ҆Đĩ ĐēĐ°Ņ‚ŅĐŗĐžŅ€Ņ‹ŅŽ ҁĐĩĐŗĐŧĐĩĐŊŅ‚Đ°</string>
<string name="revanced_sb_new_segment_disabled_category">ĐšĐ°Ņ‚ŅĐŗĐžŅ€Ņ‹Ņ адĐēĐģŅŽŅ‡Đ°ĐŊа Ņž ĐŊаĐģĐ°Đ´Đ°Ņ…. ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†Đĩ ĐēĐ°Ņ‚ŅĐŗĐžŅ€Ņ‹ŅŽ Đ´ĐģŅ адĐŋŅ€Đ°ŅžĐēŅ–.</string>
<string name="revanced_sb_new_segment_title">ĐĐžĐ˛Ņ‹ ҁĐĩĐŗĐŧĐĩĐŊŅ‚ SponsorBlock</string>
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<string name="revanced_sb_new_segment_mark_time_as_question">ĐŖŅŅ‚Đ°ĐģŅĐ˛Đ°Ņ†ŅŒ %1$02d:%2$02d:%3$03d ҃ ŅĐēĐ°ŅŅ†Ņ– ĐŋĐ°Ņ‡Đ°Ņ‚Đē҃ айО ĐēаĐŊŅ†Đ° ĐŊĐžĐ˛Đ°ĐŗĐ° ҁĐĩĐŗĐŧĐĩĐŊŅ‚Đ°?</string>
<string name="revanced_sb_new_segment_mark_time_as_question">ĐŖŅŅ‚Đ°ĐģŅĐ˛Đ°Ņ†ŅŒ %s ҃ ŅĐēĐ°ŅŅ†Ņ– ĐŋĐ°Ņ‡Đ°Ņ‚Đē҃ айО ĐēаĐŊŅ†Đ° ĐŊĐžĐ˛Đ°ĐŗĐ° ҁĐĩĐŗĐŧĐĩĐŊŅ‚Đ°?</string>
<string name="revanced_sb_new_segment_mark_start">ĐŋĐ°Ņ‡Đ°Ņ†ŅŒ</string>
<string name="revanced_sb_new_segment_mark_end">ĐēаĐŊĐĩ҆</string>
<string name="revanced_sb_new_segment_now">ĐˇĐ°Ņ€Đ°Đˇ</string>
<string name="revanced_sb_new_segment_time_start">Đ§Đ°Ņ ĐŋĐ°Ņ‡Đ°Ņ‚Đē҃ ҁĐĩĐŗĐŧĐĩĐŊŅ‚Đ°</string>
<string name="revanced_sb_new_segment_time_end">Đ§Đ°Ņ СаĐēаĐŊŅ‡ŅĐŊĐŊŅ ҁĐĩĐŗĐŧĐĩĐŊŅ‚Đ°</string>
<string name="revanced_sb_new_segment_confirm_title">ĐĻŅ– ĐŋŅ€Đ°Đ˛Ņ–ĐģҌĐŊŅ‹ Ņ‡Đ°Ņ?</string>
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<string name="revanced_sb_new_segment_confirm_content">ĐĄĐĩĐŗĐŧĐĩĐŊŅ‚ ад\n\n%1$s\nда\n%2$s\n\n(%3$s)\n\nĐ“Đ°Ņ‚ĐžĐ˛Ņ‹ адĐŋŅ€Đ°Đ˛Ņ–Ņ†ŅŒ?</string>
<string name="revanced_sb_new_segment_start_is_before_end">ĐŸĐ°Ņ‡Ņ‹ĐŊĐ°Ņ†ŅŒ Ņ‚Ņ€ŅĐąĐ° Ņ€Đ°ĐŊĐĩĐš Са ĐēаĐŊĐĩ҆</string>
<string name="revanced_sb_new_segment_mark_locations_first">ĐĄĐŋĐ°Ņ‡Đ°Ņ‚Đē҃ адСĐŊĐ°Ņ‡Ņ†Đĩ два ĐŧĐĩҁ҆ҋ ĐŊа ĐŋаĐŊŅĐģŅ– Ņ‡Đ°ŅŅƒ</string>
@@ -990,6 +989,11 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_seekbar_custom_color_value_summary">КоĐģĐĩŅ€ ĐŋаĐŊŅĐģŅ– ĐŋĐžŅˆŅƒĐē҃</string>
<string name="revanced_seekbar_custom_color_invalid">ĐŅĐŋŅ€Đ°Đ˛Ņ–ĐģҌĐŊаĐĩ СĐŊĐ°Ņ‡ŅĐŊĐŊĐĩ ĐēĐžĐģĐĩŅ€Ņƒ ĐŋаĐŊŅĐģŅ– ĐŋĐžŅˆŅƒĐē҃. Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ĐĩŅ†Ņ†Đ° СĐŊĐ°Ņ‡ŅĐŊĐŊĐĩ Đŋа СĐŧĐ°ŅžŅ‡Đ°ĐŊĐŊŅ–.</string>
</patch>
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
<string name="revanced_bypass_image_region_restrictions_title">ĐĐąŅ‹Ņ…ĐžĐ´ айĐŧĐĩĐļаваĐŊĐŊŅŅž Ņ€ŅĐŗŅ–Ņ‘ĐŊ҃</string>
<string name="revanced_bypass_image_region_restrictions_summary_on">Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐŊĐŊĐĩ Ņ…Đ°ŅŅ‚Đ° Đ˛Ņ–Đ´Đ°Ņ€Ņ‹ŅĐ°Ņž yt4.ggpht.com</string>
<string name="revanced_bypass_image_region_restrictions_summary_off">Đ’Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐŊĐŊĐĩ Đ°Ņ€Ņ‹ĐŗŅ–ĐŊаĐģҌĐŊĐ°ĐŗĐ° Ņ…Đ°ŅŅ‚Đ° Đ˛Ņ–Đ´Đ°Ņ€Ņ‹ŅĐ°Ņž\n\nĐŖĐēĐģŅŽŅ‡ŅĐŊĐŊĐĩ ĐŗŅŅ‚Đ°Đš ĐžĐŋ҆ҋҖ ĐŧĐžĐļа Đ˛Ņ‹ĐŋŅ€Đ°Đ˛Ņ–Ņ†ŅŒ Đ°Đ´ŅŅƒŅ‚ĐŊŅ–Ņ‡Đ°ŅŽŅ‡Ņ‹Ņ Đ˛Ņ–Đ´Đ°Ņ€Ņ‹ŅŅ‹, ŅĐēŅ–Ņ СайĐģаĐēŅ–Ņ€Đ°Đ˛Đ°ĐŊŅ‹Ņ Ņž ĐŊĐĩĐēĐ°Ņ‚ĐžŅ€Ņ‹Ņ… Ņ€ŅĐŗŅ–Ņ‘ĐŊĐ°Ņ…</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">ГаĐģĐžŅžĐŊĐ°Ņ ŅžĐēĐģадĐēа</string>
@@ -1030,6 +1034,10 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_announcements_connection_failed">НĐĩ ŅžĐ´Đ°ĐģĐžŅŅ ĐŋадĐēĐģŅŽŅ‡Ņ‹Ņ†Ņ†Đ° да ĐŋĐ°ŅŅ‚Đ°ŅžŅˆŅ‡Ņ‹Đēа ай\"ŅŅž</string>
<string name="revanced_announcements_dialog_dismiss">Ņ€Đ°ŅŅĐģĐ°ĐąŅ–Ņ†Ņ†Đ°</string>
</patch>
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
<string name="revanced_check_watch_history_domain_name_dialog_title">ĐŖĐ˛Đ°ĐŗĐ°</string>
<string name="revanced_check_watch_history_domain_name_dialog_ignore">БоĐģҌ҈ ĐŊĐĩ ĐŋаĐēĐ°ĐˇĐ˛Đ°Ņ†ŅŒ</string>
</patch>
<patch id="misc.autorepeat.AutoRepeatPatch">
<string name="revanced_auto_repeat_title">ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ Đ°ŅžŅ‚Đ°ĐŧĐ°Ņ‚Ņ‹Ņ‡ĐŊŅ‹ ĐŋĐ°ŅžŅ‚ĐžŅ€</string>
<string name="revanced_auto_repeat_summary_on">ĐŅžŅ‚Đ°ĐŧĐ°Ņ‚Ņ‹Ņ‡ĐŊŅ‹ ĐŋĐ°ŅžŅ‚ĐžŅ€ ҃ĐēĐģŅŽŅ‡Đ°ĐŊŅ‹</string>
@@ -1055,10 +1063,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_external_browser_summary_on">АдĐēҀҋ҆҆ґ ҁĐŋĐ°ŅŅ‹ĐģаĐē СвОĐŊĐē҃</string>
<string name="revanced_external_browser_summary_off">АдĐēҀҋ҆҆ґ ҁĐŋĐ°ŅŅ‹ĐģаĐē ҃ ĐŋŅ€Đ°ĐŗŅ€Đ°ĐŧĐĩ</string>
</patch>
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
<string name="revanced_background_playback_title">ФОĐŊаваĐĩ ĐŋŅ€Đ°ĐšĐŗŅ€Đ°Đ˛Đ°ĐŊĐŊĐĩ</string>
<string name="revanced_background_playback_summary">Đ“ŅŅ‚ŅƒŅŽ ĐŊаĐģĐ°Đ´Ņƒ ĐŧĐžĐļĐŊа СĐŊĐ°ĐšŅŅ†Ņ– Ņž НаĐģĐ°Đ´Đ°Ņ… -&gt; ФОĐŊ</string>
</patch>
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
<string name="revanced_remove_tracking_query_parameter_title">Đ’Ņ‹Đ´Đ°ĐģŅ–Ņ†ŅŒ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ СаĐŋŅ‹Ņ‚Ņƒ Đ°Đ´ŅĐžŅ‡Đ˛Đ°ĐŊĐŊŅ</string>
<string name="revanced_remove_tracking_query_parameter_summary_on">ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ СаĐŋŅ‹Ņ‚Ņƒ Đ°Đ´ŅĐžŅ‡Đ˛Đ°ĐŊĐŊŅ Đ˛Ņ‹Đ´Đ°ĐģĐĩĐŊŅ‹ ŅĐ° ҁĐŋĐ°ŅŅ‹ĐģаĐē</string>
@@ -1115,9 +1119,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_spoof_client_summary_on">КĐģŅ–ĐĩĐŊŅ‚ ĐŋĐ°Đ´Ņ€ĐžĐąĐģĐĩĐŊŅ‹</string>
<string name="revanced_spoof_client_summary_off">КĐģŅ–ĐĩĐŊŅ‚ ĐŊĐĩ ĐŋĐ°Đ´Ņ€ĐžĐąĐģĐĩĐŊŅ‹\n\nĐŸŅ€Đ°ĐšĐŗŅ€Đ°Đ˛Đ°ĐŊĐŊĐĩ Đ˛Ņ–Đ´ŅĐ° ĐŧĐžĐļа ĐŊĐĩ ĐŋŅ€Đ°Ņ†Đ°Đ˛Đ°Ņ†ŅŒ</string>
<string name="revanced_spoof_client_user_dialog_message">АдĐēĐģŅŽŅ‡ŅĐŊĐŊĐĩ ĐŗŅŅ‚Đ°Đš ĐŊаĐģĐ°Đ´Ņ‹ ĐŧĐžĐļа Đ˛Ņ‹ĐēĐģŅ–ĐēĐ°Ņ†ŅŒ ĐŋŅ€Đ°ĐąĐģĐĩĐŧŅ‹ С ĐŋŅ€Đ°ĐšĐŗŅ€Đ°Đ˛Đ°ĐŊĐŊĐĩĐŧ Đ˛Ņ–Đ´ŅĐ°.</string>
<string name="revanced_spoof_client_use_ios_title">ĐŸĐ°Đ´Ņ€ĐžĐąĐēа ĐēĐģŅ–ĐĩĐŊŅ‚Đ° Đ´ĐģŅ iOS</string>
<string name="revanced_spoof_client_use_ios_summary_on">КĐģŅ–ĐĩĐŊŅ‚ ĐˇĐ°Ņ€Đ°Đˇ ĐŋĐ°Đ´Ņ€ĐžĐąĐģĐĩĐŊŅ‹ ĐŊа iOS\n\nĐŸĐ°ĐąĐžŅ‡ĐŊŅ‹Ņ ŅŅ„ĐĩĐē҂ҋ ŅžĐēĐģŅŽŅ‡Đ°ŅŽŅ†ŅŒ:\nâ€ĸ ĐŅĐŧа HDR-Đ˛Ņ–Đ´ŅĐ°\nâ€ĸ Đ“Ņ–ŅŅ‚ĐžŅ€Ņ‹Ņ ĐŋŅ€Đ°ĐŗĐģŅĐ´Đ°Ņž ĐŧĐžĐļа ĐŊĐĩ ĐŋŅ€Đ°Ņ†Đ°Đ˛Đ°Ņ†ŅŒ\nâ€ĸ МоĐļа Đ°Đ´ŅŅƒŅ‚ĐŊŅ–Ņ‡Đ°Ņ†ŅŒ йОĐģҌ҈ Đ˛Ņ‹ŅĐžĐēĐ°Ņ ŅĐēĐ°ŅŅ†ŅŒ Đ˛Ņ–Đ´ŅĐ°\nâ€ĸ Đ–Ņ‹Đ˛Ņ‹Ņ Ņ‚Ņ€Đ°ĐŊҁĐģŅŅ†Ņ‹Ņ– ĐŊĐĩ ĐŧĐžĐŗŅƒŅ†ŅŒ ĐŋŅ€Đ°ĐšĐŗŅ€Đ°Đ˛Đ°Ņ†Ņ†Đ° Ņ‚ĐžĐģҌĐēŅ– ŅĐē Đ°ŅžĐ´Ņ‹Ņ\nâ€ĸ Đ–Ņ‹Đ˛Đ°Ņ Ņ‚Ņ€Đ°ĐŊҁĐģŅŅ†Ņ‹Ņ ĐŋĐ°Ņ‚ĐžĐēŅ– ĐŊĐĩĐ´Đ°ŅŅ‚ŅƒĐŋĐŊŅ‹Ņ ĐŊа Android 8.0</string>
<string name="revanced_spoof_client_use_ios_summary_off">КĐģŅ–ĐĩĐŊŅ‚ ҃ Ņ†ŅĐŋĐĩŅ€Đ°ŅˆĐŊŅ– Ņ‡Đ°Ņ ĐŋĐ°Đ´Ņ€ĐžĐąĐģĐĩĐŊŅ‹ Đ´ĐģŅ Android VR\n\nĐŸĐ°ĐąĐžŅ‡ĐŊŅ‹Ņ ŅŅ„ĐĩĐē҂ҋ ŅžĐēĐģŅŽŅ‡Đ°ŅŽŅ†ŅŒ:\nâ€ĸ ĐŅĐŧа HDR-Đ˛Ņ–Đ´ŅĐ°\nâ€ĸ Đ”ĐˇŅ–Ņ†ŅŅ‡Ņ‹Ņ Đ˛Ņ–Đ´ŅĐ° ĐŊĐĩ ĐŋŅ€Đ°ĐšĐŗŅ€Đ°Đ˛Đ°ŅŽŅ†Ņ†Đ°\nâ€ĸ ĐŸŅ€Ņ‹ĐŋŅ‹ĐŊĐĩĐŊŅ‹Ņ Đ˛Ņ–Đ´ŅĐ° ĐŧĐžĐŗŅƒŅ†ŅŒ адĐŊĐ°ŅžĐģŅŅ†Ņ†Đ° Đ˛Ņ‹ĐŋадĐēĐžĐ˛Ņ‹Đŧ ҇ҋĐŊаĐŧ\nâ€ĸ ĐŅ–ĐˇĐēĐ°Ņ ŅĐēĐ°ŅŅ†ŅŒ ĐŧŅ–ĐŊŅ–ŅŅ†ŅŽŅ€ ĐŊа ĐŋаĐŊŅĐģŅ– ĐŋĐžŅˆŅƒĐē҃ Shorts\nâ€ĸ КĐŊĐžĐŋĐēа дСĐĩŅĐŊĐŊŅ ĐĄĐŋаĐŧĐŋĐ°Đ˛Đ°Ņ†ŅŒ ĐˇĐ°ŅžŅŅ‘Đ´Ņ‹ ŅŅ…Đ°Đ˛Đ°ĐŊа\nâ€ĸ ĐšĐ°Ņ€Ņ‚ĐēŅ– ĐēаĐŊŅ†Đ°Đ˛ĐžĐŗĐ° ŅĐēŅ€Đ°ĐŊа ĐˇĐ°ŅžŅŅ‘Đ´Ņ‹ ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹</string>
<string name="revanced_spoof_client_storyboard_timeout">ĐœŅ–ĐŊŅ–ŅŅ†ŅŽŅ€Ņ‹ ĐēĐģŅ–ĐĩĐŊŅ‚Đ° Spoof ĐŊĐĩĐ´Đ°ŅŅ‚ŅƒĐŋĐŊŅ‹Ņ (Ņ‡Đ°Ņ Ņ‡Đ°ĐēаĐŊĐŊŅ API ҁĐēĐžĐŊŅ‡Ņ‹ŅžŅŅ)</string>
<string name="revanced_spoof_client_storyboard_io_exception">ĐœŅ–ĐŊŅ–ŅŅ†ŅŽŅ€Ņ‹ ĐēĐģŅ–ĐĩĐŊŅ‚Đ° Spoof Ņ‡Đ°ŅĐžĐ˛Đ° ĐŊĐĩĐ´Đ°ŅŅ‚ŅƒĐŋĐŊŅ‹Ņ: %s</string>
</patch>
@@ -1166,6 +1167,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_twitch_debug_mode_summary_off">Đ ŅĐļŅ‹Đŧ адĐģадĐēŅ– Twitch адĐēĐģŅŽŅ‡Đ°ĐŊŅ‹</string>
</patch>
<patch id="misc.settings.SettingsPatch">
<string name="revanced_settings">НаĐģĐ°Đ´Ņ‹ ReVanced</string>
<string name="revanced_ads_screen_title">Ай\"ŅĐ˛Ņ‹</string>
<string name="revanced_ads_screen_summary">НаĐģĐ°Đ´Ņ‹ ĐąĐģаĐēŅ–Ņ€ĐžŅžĐēŅ– Ņ€ŅĐēĐģаĐŧŅ‹</string>
<string name="revanced_chat_screen_title">Đ§Đ°Ņ‚</string>

View File

@@ -45,12 +45,20 @@ This is because Crowdin requires temporarily flattening this file and removing t
</patch>
<patch id="misc.gms.BaseGmsCoreSupportResourcePatch">
<!-- 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">GmsCore ĐŊĐĩ Đĩ иĐŊŅŅ‚Đ°ĐģĐ¸Ņ€Đ°ĐŊ. ИĐŊŅŅ‚Đ°ĐģĐ¸Ņ€Đ°ĐšŅ‚Đĩ ĐŗĐž.</string>
<string name="gms_core_dialog_title">ĐŅƒĐļĐŊĐž Đĩ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ</string>
<string name="gms_core_dialog_not_whitelisted_not_allowed_in_background_message">MicroG GmsCore ĐŊĐĩ ĐŧĐžĐļĐĩ да Ņ€Đ°ĐąĐžŅ‚Đ¸ Đ˛ŅŠĐ˛ Ņ„ĐžĐŊОв Ņ€ĐĩĐļиĐŧ.\n\nМоĐģŅ, ҁĐģĐĩĐ´Đ˛Đ°ĐšŅ‚Đĩ Ņ€ŅŠĐēĐžĐ˛ĐžĐ´ŅŅ‚Đ˛ĐžŅ‚Đž \"Don\'t kill my app“ Са Đ˛Đ°ŅˆĐ¸Ņ Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊ и ĐŋŅ€Đ¸ĐģĐžĐļĐĩŅ‚Đĩ иĐŊŅŅ‚Ņ€ŅƒĐēŅ†Đ¸Đ¸Ņ‚Đĩ ĐŊа MicroG.\n\nĐĸОва Đĩ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž, Са да Ņ€Đ°ĐąĐžŅ‚Đ¸ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž.</string>
<string name="gms_core_dialog_open_website_text">ĐžŅ‚Đ˛ĐžŅ€Đ¸ ŅĐ°ĐšŅ‚Đ°</string>
<string name="gms_core_dialog_not_whitelisted_using_battery_optimizations_message">За да иСйĐĩĐŗĐŊĐĩŅ‚Đĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧи Đĩ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž да иСĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ ĐžĐŋŅ‚Đ¸ĐŧĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ° ĐŊа ĐąĐ°Ņ‚ĐĩŅ€Đ¸ŅŅ‚Đ° Са GmsCore.\n\nĐĐ°Ņ‚Đ¸ŅĐŊĐĩŅ‚Đĩ \"ĐŸŅ€ĐžĐ´ĐžĐģĐļи\" и иСĐēŅŽŅ‡ĐĩŅ€Đĩ ĐžĐŋŅ‚Đ¸ĐŧĐ¸ĐˇĐ°Ņ†Đ¸ŅŅ‚Đ° ĐŊа ĐąĐ°Ņ‚ĐĩŅ€Đ¸ŅŅ‚Đ°.</string>
<string name="gms_core_dialog_continue_text">ĐŸŅ€ĐžĐ´ŅŠĐģĐļи</string>
</patch>
</app>
<app id="youtube">
<patch id="misc.settings.SettingsResourcePatch">
<string name="revanced_settings_about_links_body">ВиĐĩ иСĐŋĐžĐģĐˇĐ˛Đ°Ņ‚Đĩ вĐĩŅ€ŅĐ¸ŅŅ‚Đ° ĐŊа ReVanced Patches&lt;i&gt;%s&lt;/i&gt;</string>
<string name="revanced_settings_about_links_dev_header">ЗабĐĩĐģĐĩĐļĐēа</string>
<string name="revanced_settings_about_links_dev_body">ĐĸаСи вĐĩŅ€ŅĐ¸Ņ Đĩ ĐŋŅ€ĐĩĐ´Đ˛Đ°Ņ€Đ¸Ņ‚ĐĩĐģĐŊа, Ņ‚Đ°Đēа ҇Đĩ ĐŧĐžĐļĐĩ да ҁҀĐĩ҉ĐŊĐĩŅ‚Đĩ ĐŊĐĩĐžŅ‡Đ°ĐēваĐŊи ĐŋŅ€ĐžĐąĐģĐĩĐŧи</string>
<string name="revanced_settings_about_links_header">ĐžŅ„Đ¸Ņ†Đ¸Đ°ĐģĐŊи ĐģиĐŊĐēОвĐĩ</string>
<string name="revanced_pref_import_export_title">ИĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ / ЕĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ</string>
<string name="revanced_pref_import_export_summary">ИĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ / ЕĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ReVanced ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ</string>
</patch>
@@ -62,7 +70,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_settings_screen_04_player_title">ПĐģĐĩĐšŅŠŅ€</string>
<string name="revanced_settings_screen_05_general_title">ĐžĐąŅ‰Đž ĐžŅ„ĐžŅ€ĐŧĐģĐĩĐŊиĐĩ</string>
<string name="revanced_settings_screen_06_shorts_title">Shorts</string>
<string name="revanced_settings_screen_07_seekbar_title">Seekbar</string>
<string name="revanced_settings_screen_07_seekbar_title">ЛĐĩĐŊŅ‚Đ° Са ĐŋŅ€ĐžĐŗŅ€Đĩҁ ĐŊа видĐĩĐžŅ‚Đž</string>
<string name="revanced_settings_screen_08_swipe_controls_title">КоĐŊŅ‚Ņ€ĐžĐģи ҁ ĐŋĐģŅŠĐˇĐŗĐ°ĐŊĐĩ</string>
<string name="revanced_settings_screen_11_misc_title">РаСĐŊи</string>
<string name="revanced_settings_screen_12_video_title">ВидĐĩĐž</string>
@@ -85,28 +93,39 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_debug_toast_on_error_user_dialog_message">АĐēĐž иСĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ ŅĐ¸ŅŅ‚ĐĩĐŧĐŊĐ¸Ņ‚Đĩ ŅŅŠĐžĐąŅ‰ĐĩĐŊĐ¸Ņ, ҉Đĩ ҁĐēŅ€Đ¸ĐĩŅ‚Đĩ Đ˛ŅĐ¸Ņ‡Đēи ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ Са ReVanced ĐŗŅ€Đĩ҈Đēи. \n\nĐŅĐŧа да ĐąŅŠĐ´ĐĩŅ‚Đĩ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐĩĐŊи, аĐēĐž ĐŊĐ°ŅŅ‚ŅŠĐŋŅŅ‚ ĐŊĐĩĐžŅ‡Đ°ĐēваĐŊи ŅŅŠĐąĐ¸Ņ‚Đ¸Ņ.</string>
</patch>
<patch id="layout.hide.general.HideLayoutComponentsPatch">
<string name="revanced_disable_like_subscribe_glow_title">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐšŅ‚Đĩ ĐŋĐžĐ´ŅĐ˛ĐĩŅ‚ĐēĐ°Ņ‚Đ° ĐŊа ĐąŅƒŅ‚ĐžĐŊа ĐĨĐ°Ņ€ĐĩŅĐ˛Đ°Đŧ /АйОĐŊаĐŧĐĩĐŊŅ‚</string>
<string name="revanced_disable_like_subscribe_glow_summary_on">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ „ĐĨĐ°Ņ€ĐĩŅĐ˛Đ°Đŧ“ и „АбоĐŊĐ¸Ņ€Đ°ĐŊĐĩ“ ĐŊŅĐŧа да ŅĐ˛ĐĩŅ‚ŅŅ‚, ĐēĐžĐŗĐ°Ņ‚Đž ĐąŅŠĐ´Đ°Ņ‚ ĐŊĐ°Ņ‚Đ¸ŅĐŊĐ°Ņ‚Đ¸</string>
<string name="revanced_disable_like_subscribe_glow_summary_off">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ „ĐĨĐ°Ņ€ĐĩŅĐ˛Đ°Đŧ“ и „АбоĐŊĐ¸Ņ€Đ°ĐŊĐĩ“ ҉Đĩ ŅĐ˛ĐĩŅ‚ŅŅ‚, ĐēĐžĐŗĐ°Ņ‚Đž ĐąŅŠĐ´Đ°Ņ‚ ĐŊĐ°Ņ‚Đ¸ŅĐŊĐ°Ņ‚Đ¸</string>
<string name="revanced_hide_gray_separator_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ŅĐ¸Đ˛Đ¸Ņ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģ</string>
<string name="revanced_hide_gray_separator_summary_on">ĐĄĐ¸Đ˛Đ¸Ņ‚Đĩ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģи ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_gray_separator_summary_off">ĐĄĐ¸Đ˛Đ¸Ņ‚Đĩ Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ĐĩĐģи ŅĐ° ĐŋĐžĐēаСаĐŊи</string>
<string name="revanced_hide_channel_watermark_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа вОдĐŊĐ¸Ņ СĐŊаĐē ĐŊа ĐēаĐŊаĐģа</string>
<string name="revanced_hide_channel_watermark_summary_on">ВодĐŊĐ¸ŅŅ‚ СĐŊаĐē Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_channel_watermark_summary_off">ВодĐŊĐ¸ŅŅ‚ СĐŊаĐē Đĩ ĐŋĐžĐēаСаĐŊ</string>
<string name="revanced_hide_horizontal_shelves_title">ĐĨĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģĐŊи ҁĐĩĐēŅ†Đ¸Đ¸</string>
<string name="revanced_hide_horizontal_shelves_summary_on">ĐĨĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģĐŊĐ¸Ņ‚Đĩ ҁĐĩĐēŅ†Đ¸Đ¸ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸:\nâ€ĸ Đ˜ĐˇĐ˛ŅŠĐŊŅ€ĐĩĐ´ĐŊи ĐŊОвиĐŊи\nâ€ĸ ĐŸŅ€ĐžĐ´ŅŠĐģĐļĐĩŅ‚Đĩ да ĐŗĐģĐĩĐ´Đ°Ņ‚Đĩ\nâ€ĸ Đ Đ°ĐˇĐŗĐģĐĩĐ´Đ°ĐšŅ‚Đĩ ĐžŅ‰Đĩ ĐēаĐŊаĐģи\nâ€ĸ ĐŸĐ°ĐˇĐ°Ņ€ŅƒĐ˛Đ°ĐŊĐĩ\nâ€ĸ ГĐģĐĩĐ´Đ°ĐšŅ‚Đĩ ĐžŅ‚ĐŊОвО</string>
<string name="revanced_hide_horizontal_shelves_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>
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
<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>
<!-- '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>
<!-- 'People also watch' should be translated using the same localized wording YouTube displays. -->
<string name="revanced_hide_search_result_recommendations_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐĩĐŋĐžŅ€ŅŠĐēĐ¸Ņ‚Đĩ \'Đ”Ņ€ŅƒĐŗĐ¸ Ņ…Đ°Ņ€ĐĩŅĐ˛Đ°Ņ‚ ŅŅŠŅ‰Đž\'</string>
<string name="revanced_hide_search_result_recommendations_summary_on">ĐŸŅ€ĐĩĐŋĐžŅ€ŅŠĐēĐ¸Ņ‚Đĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_search_result_recommendations_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_timed_reactions_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Đ˛Ņ€ĐĩĐŧĐĩĐ˛Đ¸Ņ‚Đĩ Ņ€ĐĩаĐēŅ†Đ¸Đ¸</string>
@@ -157,6 +176,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
<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>
<string name="revanced_hide_playables_title">Đ˜ĐŗŅ€Đ¸ в YouTube</string>
<string name="revanced_hide_playables_summary_on">Đ˜ĐŗŅ€Đ¸ в YouTube ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_playables_summary_off">Đ˜ĐŗŅ€Đ¸Ņ‚Đĩ в YouTube ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
<string name="revanced_hide_quick_actions_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅŠŅ€ĐˇĐ¸Ņ‚Đĩ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ в Ņ€ĐĩĐļиĐŧ ĐŊа Ņ†ŅĐģ ĐĩĐēŅ€Đ°ĐŊ</string>
<string name="revanced_hide_quick_actions_summary_on">Đ‘ŅŠŅ€ĐˇĐ¸Ņ‚Đĩ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ в Ņ€ĐĩĐļиĐŧ ĐŊа Ņ†ŅĐģ ĐĩĐēŅ€Đ°ĐŊ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_quick_actions_summary_off">Đ‘ŅŠŅ€ĐˇĐ¸Ņ‚Đĩ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ в Ņ€ĐĩĐļиĐŧ ĐŊа Ņ†ŅĐģ ĐĩĐēŅ€Đ°ĐŊ ŅĐ° ĐŋĐžĐēаСаĐŊи</string>
@@ -178,9 +200,22 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_hide_chips_shelf_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Ņ€Đ°Ņ„Ņ‚Đ° Са Ņ‡Đ¸ĐŋОвĐĩ</string>
<string name="revanced_hide_chips_shelf_summary_on">Đ Đ°Ņ„Ņ‚ŅŠŅ‚ Са Ņ‡Đ¸ĐŋОвĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_chips_shelf_summary_off">Đ Đ°Ņ„Ņ‚ŅŠŅ‚ Са Ņ‡Đ¸ĐŋОвĐĩ Đĩ ĐŋĐžĐēаСаĐŊ</string>
<string name="revanced_hide_attributes_section_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐĩĐēŅ†Đ¸ŅŅ‚Đ° ҁ Đ°Ņ‚Ņ€Đ¸ĐąŅƒŅ‚Đ¸</string>
<string name="revanced_hide_attributes_section_summary_on">„ПоĐŋ҃ĐģŅŅ€ĐŊи ĐŧĐĩŅŅ‚Đ°â€œ, â€žĐ˜ĐŗŅ€Đ¸â€œ и â€žĐœŅƒĐˇĐ¸Đēа“ ĐŋОд ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩŅ‚Đž ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_attributes_section_summary_off">„ПоĐŋ҃ĐģŅŅ€ĐŊи ĐŧĐĩŅŅ‚Đ°â€œ, â€žĐ˜ĐŗŅ€Đ¸â€œ и â€žĐœŅƒĐˇĐ¸Đēа“ ĐŋОд ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩŅ‚Đž ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
<string name="revanced_hide_chapters_section_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐĩĐēŅ†Đ¸ŅŅ‚Đ° ҁ ĐˇĐ°ĐŗĐģĐ°Đ˛Đ¸Ņ</string>
<string name="revanced_hide_chapters_section_summary_on">ĐĄĐĩĐēŅ†Đ¸ŅŅ‚Đ° ҁ ĐˇĐ°ĐŗĐģĐ°Đ˛Đ¸Ņ Đĩ ҁĐēŅ€Đ¸Ņ‚Đ°</string>
<string name="revanced_hide_chapters_section_summary_off">ĐĄĐĩĐēŅ†Đ¸ŅŅ‚Đ° ҁ ĐˇĐ°ĐŗĐģĐ°Đ˛Đ¸Ņ ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_podcast_section_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ҁĐĩĐēŅ†Đ¸ŅŅ‚Đ° â€žĐ Đ°ĐˇĐŗĐģĐĩĐ´Đ°ĐšŅ‚Đĩ ĐŋОдĐēĐ°ŅŅ‚Đ°â€œ</string>
<string name="revanced_hide_podcast_section_summary_on">\"Đ Đ°ĐˇĐŗĐģĐĩĐ´Đ°ĐšŅ‚Đĩ ĐŋОдĐēĐ°ŅŅ‚Đ°\" Đĩ ҁĐēŅ€Đ¸Ņ‚Đ°</string>
<string name="revanced_hide_podcast_section_summary_off">\"Đ Đ°ĐˇĐŗĐģĐĩĐ´Đ°ĐšŅ‚Đĩ ĐŋОдĐēĐ°ŅŅ‚Đ°\" ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_info_cards_section_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Ņ€Đ°ĐˇĐ´ĐĩĐģа Са иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ĐžĐŊĐŊи ĐēĐ°Ņ€Ņ‚Đ¸</string>
<string name="revanced_hide_info_cards_section_summary_on">РаСдĐĩĐģŅŠŅ‚ Са иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ĐžĐŊĐŊи ĐēĐ°Ņ€Ņ‚Đ¸ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_info_cards_section_summary_off">РаСдĐĩĐģŅŠŅ‚ Са иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ĐžĐŊĐŊи ĐēĐ°Ņ€Ņ‚Đ¸ Đĩ ĐŋĐžĐēаСаĐŊ</string>
<string name="revanced_hide_key_concepts_section_title">РаСдĐĩĐģ „КĐģŅŽŅ‡ĐžĐ˛Đ¸ ĐŋĐžĐŊŅŅ‚Đ¸Ņâ€œ</string>
<string name="revanced_hide_key_concepts_section_summary_on">РаСдĐĩĐģ „КĐģŅŽŅ‡ĐžĐ˛Đ¸ ĐŋĐžĐŊŅŅ‚Đ¸Ņâ€œ ŅĐ° ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_key_concepts_section_summary_off">РаСдĐĩĐģ „КĐģŅŽŅ‡ĐžĐ˛Đ¸ ĐŋĐžĐŊŅŅ‚Đ¸Ņâ€œ ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_transcript_section_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Ņ€Đ°ĐˇĐ´ĐĩĐģа Са Ņ‚Ņ€Đ°ĐŊҁĐēŅ€Đ¸ĐŋŅ†Đ¸Ņ</string>
<string name="revanced_hide_transcript_section_summary_on">РаСдĐĩĐģŅŠŅ‚ Са Ņ‚Ņ€Đ°ĐŊҁĐēŅ€Đ¸ĐŋŅ†Đ¸Ņ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_transcript_section_summary_off">РаСдĐĩĐģŅŠŅ‚ Са Ņ‚Ņ€Đ°ĐŊҁĐēŅ€Đ¸ĐŋŅ†Đ¸Ņ Đĩ ĐŋĐžĐēаСаĐŊ</string>
<string name="revanced_hide_description_components_screen_title">ОĐŋĐ¸ŅĐ°ĐŊиĐĩ ĐŊа видĐĩĐžŅ‚Đž</string>
@@ -200,6 +235,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_hide_keyword_content_home_summary_on">ВидĐĩĐžĐēĐģиĐŋОвĐĩŅ‚Đĩ ĐŊа ĐŊĐ°Ņ‡Đ°ĐģĐŊĐ¸Ņ ĐĩĐēŅ€Đ°ĐŊ ŅĐ° Ņ„Đ¸ĐģŅ‚Ņ€Đ¸Ņ€Đ°ĐŊи ҁ ĐēĐģŅŽŅ‡ĐžĐ˛Đ¸ Đ´ŅƒĐŧи</string>
<string name="revanced_hide_keyword_content_home_summary_off">ВидĐĩĐžĐēĐģиĐŋОвĐĩŅ‚Đĩ ĐŊа ĐŊĐ°Ņ‡Đ°ĐģĐŊĐ¸Ņ ĐĩĐēŅ€Đ°ĐŊ ĐŊĐĩ ŅĐ° Ņ„Đ¸ĐģŅ‚Ņ€Đ¸Ņ€Đ°ĐŊи ҁ ĐēĐģŅŽŅ‡ĐžĐ˛Đ¸ Đ´ŅƒĐŧи</string>
<string name="revanced_hide_keyword_content_subscriptions_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа видĐĩĐžĐēĐģиĐŋОвĐĩ ĐžŅ‚ айОĐŊаĐŧĐĩĐŊŅ‚Đ¸ ҁ ĐēĐģŅŽŅ‡ĐžĐ˛Đ¸ Đ´ŅƒĐŧи</string>
<string name="revanced_hide_keyword_content_subscriptions_summary_on">ВидĐĩĐžĐēĐģиĐŋОвĐĩŅ‚Đĩ в Ņ€Đ°ĐˇĐ´ĐĩĐģа Са айОĐŊаĐŧĐĩĐŊŅ‚Đ¸ ŅĐ° ŅĐ° Ņ„Đ¸ĐģŅ‚Ņ€Đ¸Ņ€Đ°ĐŊи ҁ ĐēĐģŅŽŅ‡ĐžĐ˛Đ¸ Đ´ŅƒĐŧи</string>
<string name="revanced_hide_keyword_content_subscriptions_summary_off">ВидĐĩĐžĐēĐģиĐŋОвĐĩŅ‚Đĩ в Ņ€Đ°ĐˇĐ´ĐĩĐģа Са айОĐŊаĐŧĐĩĐŊŅ‚Đ¸ ŅĐ° ŅĐ° Ņ„Đ¸ĐģŅ‚Ņ€Đ¸Ņ€Đ°ĐŊи ҁ ĐēĐģŅŽŅ‡ĐžĐ˛Đ¸ Đ´ŅƒĐŧи</string>
<string name="revanced_hide_keyword_content_search_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐˇŅƒĐģŅ‚Đ°Ņ‚Đ¸ ĐžŅ‚ Ņ‚ŅŠŅ€ŅĐĩĐŊĐ¸Ņ ҁ ĐēĐģŅŽŅ‡ĐžĐ˛Đ¸ Đ´ŅƒĐŧи</string>
<string name="revanced_hide_keyword_content_search_summary_on">Đ ĐĩĐˇŅƒĐģŅ‚Đ°Ņ‚Đ¸Ņ‚Đĩ ĐžŅ‚ Ņ‚ŅŠŅ€ŅĐĩĐŊĐ¸Ņ ŅĐ° Ņ„Đ¸ĐģŅ‚Ņ€Đ¸Ņ€Đ°ĐŊи ҁ ĐēĐģŅŽŅ‡ĐžĐ˛Đ¸ Đ´ŅƒĐŧи</string>
@@ -211,16 +247,24 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_hide_keyword_content_about_title">За Ņ„Đ¸ĐģŅ‚Ņ€Đ¸Ņ€Đ°ĐŊĐĩ ҁ ĐēĐģŅŽŅ‡ĐžĐ˛Đ¸ Đ´ŅƒĐŧи</string>
<string name="revanced_hide_keyword_content_about_summary">ĐĐ°Ņ‡Đ°ĐģĐž/АйОĐŊаĐŧĐĩĐŊŅ‚/Đ ĐĩĐˇŅƒĐģŅ‚Đ°Ņ‚Đ¸Ņ‚Đĩ ĐžŅ‚ Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩŅ‚Đž ҁĐĩ Ņ„Đ¸ĐģŅ‚Ņ€Đ¸Ņ€Đ°Ņ‚, Са да ҁĐĩ ҁĐēŅ€Đ¸Đĩ ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩŅ‚Đž, ĐēĐžĐĩŅ‚Đž ŅŅŠĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛Đ° ĐŊа ĐēĐģŅŽŅ‡ĐžĐ˛Đ¸Ņ‚Đĩ Ņ„Ņ€Đ°ĐˇĐ¸\n\nĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐ¸Ņ\nâ€ĸ ĐŅĐēОи ĐēŅ€Đ°Ņ‚Đēи видĐĩĐžĐēĐģиĐŋОвĐĩ ĐŧĐžĐļĐĩ да ĐŊĐĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸\nâ€ĸ ĐŅĐēОи ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅ‚Đ¸ ĐŊа ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēĐ¸Ņ иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ ĐŧĐžĐļĐĩ да ĐŊĐĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸\nâ€ĸ ĐĸŅŠŅ€ŅĐĩĐŊĐĩŅ‚Đž ĐŊа ĐēĐģŅŽŅ‡ĐžĐ˛Đ° Đ´ŅƒĐŧа ĐŧĐžĐļĐĩ да ĐŊĐĩ ĐŋĐžĐēаĐļĐĩ Ņ€ĐĩĐˇŅƒĐģŅ‚Đ°Ņ‚Đ¸</string>
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
<string name="revanced_hide_keyword_toast_invalid_common">НĐĩваĐģидĐŊа Đ´ŅƒĐŧа. НĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ иСĐŋĐžĐģСва: \'%s\' ĐēĐ°Ņ‚Đž Ņ„Đ¸ĐģŅ‚ŅŠŅ€</string>
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
<string name="revanced_hide_keyword_toast_invalid_length">НĐĩваĐģидĐŊа ĐēĐģŅŽŅ‡ĐžĐ˛Đ° Đ´ŅƒĐŧа. %1$s Đĩ ĐŋĐž-ĐŧаĐģĐēĐž ĐžŅ‚ %2$d СĐŊаĐēа</string>
<string name="revanced_hide_keyword_toast_invalid_broad">КĐģŅŽŅ‡ĐžĐ˛Đ°Ņ‚Đ° Đ´ŅƒĐŧа \'%s\' ҉Đĩ ҁĐēŅ€Đ¸Đĩ Đ˛ŅĐ¸Ņ‡Đēи видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
</patch>
<patch id="ad.general.HideAdsResourcePatch">
<string name="revanced_hide_general_ads_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐžĐąŅ‰Đ¸Ņ‚Đĩ Ņ€ĐĩĐēĐģаĐŧи</string>
<string name="revanced_hide_general_ads_summary_on">ĐžĐąŅ‰Đ¸Ņ‚Đĩ Ņ€ĐĩĐēĐģаĐŧи ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_general_ads_summary_off">ĐžĐąŅ‰Đ¸Ņ‚Đĩ Ņ€ĐĩĐēĐģаĐŧи ŅĐ° ĐŋĐžĐēаСаĐŊи</string>
<string name="revanced_hide_fullscreen_ads_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐēĐģаĐŧĐ¸Ņ‚Đĩ в Ņ€ĐĩĐļиĐŧ ĐŊа Ņ†ŅĐģ ĐĩĐēŅ€Đ°ĐŊ</string>
<string name="revanced_hide_fullscreen_ads_summary_on">Đ ĐĩĐēĐģаĐŧĐ¸Ņ‚Đĩ ĐŊа Ņ†ŅĐģ ĐĩĐēŅ€Đ°ĐŊ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸\n\in ĐĸаСи Ņ„ŅƒĐŊĐēŅ†Đ¸Ņ Đĩ Đ´ĐžŅŅ‚ŅŠĐŋĐŊа ŅĐ°ĐŧĐž Са ĐŋĐž-ŅŅ‚Đ°Ņ€Đ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°</string>
<string name="revanced_hide_fullscreen_ads_summary_off">Đ ĐĩĐēĐģаĐŧĐ¸Ņ‚Đĩ в Ņ€ĐĩĐļиĐŧ ĐŊа Ņ†ŅĐģ ĐĩĐēŅ€Đ°ĐŊ ŅĐ° ĐŋĐžĐēаСаĐŊи</string>
<string name="revanced_hide_buttoned_ads_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐēĐģаĐŧĐŊи ĐąŅƒŅ‚ĐžĐŊи</string>
<string name="revanced_hide_buttoned_ads_summary_on">Đ ĐĩĐēĐģаĐŧĐ¸Ņ‚Đĩ ĐēĐ°Ņ‚Đž ĐąŅƒŅ‚ĐžĐŊ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_buttoned_ads_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>
@@ -231,6 +275,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_hide_shopping_links_summary_on">Đ’Ņ€ŅŠĐˇĐēĐ¸Ņ‚Đĩ Са ĐŋĐ°ĐˇĐ°Ņ€ŅƒĐ˛Đ°ĐŊĐĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_shopping_links_summary_off">Đ’Ņ€ŅŠĐˇĐēĐ¸Ņ‚Đĩ Са ĐŋĐ°ĐˇĐ°Ņ€ŅƒĐ˛Đ°ĐŊĐĩ ŅĐ° ĐŋĐžĐēаСаĐŊи</string>
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_visit_store_button_title">ĐĄĐēŅ€Đ¸ĐšŅ‚Đĩ ĐąŅƒŅ‚ĐžĐŊа â€žĐŸĐžŅĐĩŅ‚ĐĩŅ‚Đĩ ĐŧĐ°ĐŗĐ°ĐˇĐ¸ĐŊа“ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸Ņ‚Đĩ ĐŊа ĐēаĐŊаĐģĐ¸Ņ‚Đĩ</string>
<string name="revanced_hide_visit_store_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_visit_store_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Đĩ ĐŋĐžĐēаСаĐŊ</string>
<string name="revanced_hide_web_search_results_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐˇŅƒĐģŅ‚Đ°Ņ‚Đ¸Ņ‚Đĩ ĐžŅ‚ ҃ĐĩĐą Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩŅ‚Đž</string>
@@ -240,6 +285,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_hide_merchandise_banners_summary_on">БаĐŊĐĩŅ€Đ¸Ņ‚Đĩ Са ŅŅ‚ĐžĐēи ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_merchandise_banners_summary_off">БаĐŊĐĩŅ€Đ¸Ņ‚Đĩ Са ŅŅ‚ĐžĐēи ŅĐ° ĐŋĐžĐēаСаĐŊи</string>
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">ĐĄĐēŅ€. ĐŊа Ņ€ĐĩĐēĐģаĐŧи ĐŊа Ņ†ŅĐģ ĐĩĐēŅ€Đ°ĐŊ, Са ĐŋĐž-ŅŅ‚Đ°Ņ€Đ¸ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°</string>
</patch>
<patch id="ad.getpremium.HideGetPremiumPatch">
<string name="revanced_hide_get_premium_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа YouTube Premium ĐŋŅ€ĐžĐŧĐžŅ†Đ¸Đ¸</string>
@@ -255,14 +301,17 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_share_copy_url_success">URL Đ°Đ´Ņ€ĐĩŅŅŠŅ‚ Đĩ ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊ в ĐēĐģиĐŋĐąĐžŅ€Đ´Đ°</string>
<string name="revanced_share_copy_url_timestamp_success">URL Đ°Đ´Ņ€ĐĩŅŅŠŅ‚ ҁ Đ˛Ņ€ĐĩĐŧĐĩви ĐžŅ‚ĐŋĐĩŅ‡Đ°Ņ‚ŅŠĐē Đĩ ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊ</string>
<string name="revanced_copy_video_url_title">ПоĐēаСваĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа URL Đ°Đ´Ņ€ĐĩŅĐ° ĐŊа видĐĩĐžĐēĐģиĐŋа</string>
<string name="revanced_copy_video_url_summary_on">ПоĐēаСаĐŊ Đĩ ĐąŅƒŅ‚ĐžĐŊ. ДоĐēĐžŅĐŊĐĩŅ‚Đĩ, Са да ĐēĐžĐŋĐ¸Ņ€Đ°Ņ‚Đĩ URL ĐŊа видĐĩĐžŅ‚Đž. ДоĐēĐžŅĐŊĐĩŅ‚Đĩ и ĐˇĐ°Đ´Ņ€ŅŠĐļŅ‚Đĩ, Са да ĐēĐžĐŋĐ¸Ņ€Đ°Ņ‚Đĩ URL Đ°Đ´Ņ€ĐĩŅĐ° ĐŊа видĐĩĐžĐēĐģиĐŋа ҁ ĐēĐģĐĩĐšĐŧĐž Са Đ˛Ņ€ĐĩĐŧĐĩ</string>
<string name="revanced_copy_video_url_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ ĐŊĐĩ Đĩ ĐŋĐžĐēаСаĐŊ</string>
<string name="revanced_copy_video_url_timestamp_title">ПоĐēаСваĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са ĐēĐžĐŋĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа URL Đ°Đ´Ņ€ĐĩŅĐ° ĐŊа Đ˛Ņ€ĐĩĐŧĐĩĐ˛Đ¸Ņ ĐžŅ‚ĐŋĐĩŅ‡Đ°Ņ‚ŅŠĐē ĐŊа видĐĩĐžĐēĐģиĐŋа</string>
<string name="revanced_copy_video_url_timestamp_summary_on">ПоĐēаСаĐŊ Đĩ ĐąŅƒŅ‚ĐžĐŊ. ДоĐēĐžŅĐŊĐĩŅ‚Đĩ, Са да ĐēĐžĐŋĐ¸Ņ€Đ°Ņ‚Đĩ URL Đ°Đ´Ņ€ĐĩŅĐ° ĐŊа видĐĩĐžĐēĐģиĐŋа ҁ ĐēĐģĐĩĐšĐŧĐž Са Đ˛Ņ€ĐĩĐŧĐĩ. ДоĐēĐžŅĐŊĐĩŅ‚Đĩ и ĐˇĐ°Đ´Ņ€ŅŠĐļŅ‚Đĩ, Са да ĐēĐžĐŋĐ¸Ņ€Đ°Ņ‚Đĩ видĐĩĐžĐēĐģиĐŋ ĐąĐĩС ĐēĐģĐĩĐšĐŧĐž Са Đ˛Ņ€ĐĩĐŧĐĩ</string>
<string name="revanced_copy_video_url_timestamp_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ ĐŊĐĩ Đĩ ĐŋĐžĐēаСаĐŊ</string>
</patch>
<patch id="interaction.dialog.RemoveViewerDiscretionDialogPatch">
<string name="revanced_remove_viewer_discretion_dialog_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžĐˇĐžŅ€ĐĩŅ†Đ° Са Đ˛ŅŠĐˇŅ€Đ°ŅŅ‚ĐžĐ˛Đž ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊиĐĩ</string>
<string name="revanced_remove_viewer_discretion_dialog_summary_on">ДиаĐģĐžĐŗĐžĐ˛Đ¸ŅŅ‚ ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆ ҉Đĩ ĐąŅŠĐ´Đĩ ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐ°Ņ‚</string>
<string name="revanced_remove_viewer_discretion_dialog_summary_off">ДиаĐģĐžĐŗĐžĐ˛Đ¸ŅŅ‚ ĐŋŅ€ĐžĐˇĐžŅ€Đĩ҆ ҉Đĩ ĐąŅŠĐ´Đĩ ĐŋĐžĐēаСаĐŊ</string>
<string name="revanced_remove_viewer_discretion_dialog_user_dialog_message">ĐĸаСи Ņ„ŅƒĐŊĐēŅ†Đ¸Ņ ĐŊĐĩ СаОйиĐēаĐģŅ Đ˛ŅŠĐˇŅ€Đ°ŅŅ‚ĐžĐ˛ĐžŅ‚Đž ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊиĐĩ. ĐĸŅ ĐŋŅ€ĐžŅŅ‚Đž ĐŋŅ€Đ¸ĐĩĐŧа Đ˛ŅŠĐˇŅ€Đ°ŅŅ‚ĐžĐ˛Đ°Ņ‚Đ° ĐŗŅ€Đ°ĐŊĐ¸Ņ†Đ° Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž.</string>
</patch>
<patch id="interaction.downloads.DownloadsResourcePatch">
<string name="revanced_external_downloader_screen_title">Đ’ŅŠĐŊ҈ĐŊи Đ¸ĐˇŅ‚ĐĩĐŗĐģŅĐŊĐ¸Ņ</string>
@@ -276,6 +325,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_external_downloader_action_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са Đ¸ĐˇŅ‚ĐĩĐŗĐģŅĐŊĐĩ ĐžŅ‚Đ˛Đ°Ņ€Ņ Đ˛ĐŗŅ€Đ°Đ´ĐĩĐŊĐžŅ‚Đž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ Са Đ¸ĐˇŅ‚ĐĩĐŗĐģŅĐŊĐĩ</string>
<string name="revanced_external_downloader_name_title">ИĐŧĐĩ ĐŊа ĐŋаĐēĐĩŅ‚Đ° ĐŊа Đ¸ĐˇŅ‚ĐĩĐŗĐģŅŅ‰ĐžŅ‚Đž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ</string>
<string name="revanced_external_downloader_name_summary">ИĐŧĐĩ ĐŊа ĐŋаĐēĐĩŅ‚Đ° ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž Са Đ¸ĐˇŅ‚ĐĩĐŗĐģŅĐŊĐĩ, ĐēĐ°Ņ‚Đž NewPipe иĐģи Seal</string>
<string name="revanced_external_downloader_not_installed_warning">%s ĐŊĐĩ Đĩ иĐŊŅŅ‚Đ°ĐģĐ¸Ņ€Đ°ĐŊ. ИĐŊŅŅ‚Đ°ĐģĐ¸Ņ€Đ°ĐšŅ‚Đĩ ĐŗĐž.</string>
</patch>
<patch id="interaction.seekbar.DisablePreciseSeekingGesturePatch">
<string name="revanced_disable_precise_seeking_gesture_title">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐļĐĩŅŅ‚Đ° Са Ņ‚ĐžŅ‡ĐŊĐž Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ</string>
@@ -303,6 +353,10 @@ This is because Crowdin requires temporarily flattening this file and removing t
<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_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_overlay_text">ĐĐ˛Ņ‚Đž</string>
<string name="revanced_swipe_overlay_timeout_title">Đ—Đ°Đ´Ņ€ŅŠĐļĐēа ĐŊа ĐŋĐģŅŠĐˇĐŗĐ°Ņ‰Đ°Ņ‚Đ° ĐēĐžĐŊŅ‚Ņ€ĐžĐģа</string>
<string name="revanced_swipe_overlay_timeout_summary">Đ’Ņ€ĐĩĐŧĐĩ Са ĐēĐžĐĩŅ‚Đž ĐŋĐģŅŠĐˇĐŗĐ°Ņ‰Đ°Ņ‚Đ° ĐēĐžĐŊŅ‚Ņ€ĐžĐģа Đĩ видиĐŧа</string>
<string name="revanced_swipe_text_overlay_size_title">РаСĐŧĐĩŅ€ ĐŊа Ņ‚ĐĩĐēŅŅ‚Đ° ĐŋŅ€Đ¸ ĐŋĐģŅŠĐˇĐŗĐ°ĐŊĐĩ</string>
@@ -313,196 +367,763 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_swipe_threshold_summary">ĐŸŅ€Đ°Đŗ ĐŋŅ€Đĩди да ҁĐĩ ĐžŅŅŠŅ‰ĐĩŅŅ‚Đ˛Đ¸ ĐŋĐģŅŠĐˇĐŗĐ°ĐŊĐĩŅ‚Đž</string>
</patch>
<patch id="layout.autocaptions.AutoCaptionsPatch">
<string name="revanced_auto_captions_title">ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊи ĐĄŅƒĐąŅ‚Đ¸Ņ‚Ņ€Đ¸</string>
<string name="revanced_auto_captions_summary_on">ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐ¸Ņ‚Đĩ ĐĄŅƒĐąŅ‚Đ¸Ņ‚Ņ€Đ¸ ŅĐ° Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊи</string>
<string name="revanced_auto_captions_summary_off">ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐ¸Ņ‚Đĩ ĐĄŅƒĐąŅ‚Đ¸Ņ‚Ņ€Đ¸ ŅĐ° аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊи</string>
</patch>
<patch id="layout.buttons.action.HideButtonsPatch">
<string name="revanced_hide_buttons_screen_title">Đ‘ŅƒŅ‚ĐžĐŊи Са Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ</string>
<string name="revanced_hide_buttons_screen_summary">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ иĐģи ĐŋĐžĐēаСваĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊи ĐŋОд видĐĩĐžŅ‚Đž</string>
<string name="revanced_hide_like_dislike_button_title">Đ‘ŅƒŅ‚ĐžĐŊи \"ĐĨĐ°Ņ€ĐĩŅĐ˛Đ°Đŧ\" и \"НĐĩ Ņ…Đ°Ņ€ĐĩŅĐ˛Đ°Đŧ\"</string>
<string name="revanced_hide_like_dislike_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ \"ĐĨĐ°Ņ€ĐĩŅĐ˛Đ°Đŧ\" и \"НĐĩ Ņ…Đ°Ņ€ĐĩŅĐ˛Đ°Đŧ\" ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_like_dislike_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ \"ĐĨĐ°Ņ€ĐĩŅĐ˛Đ°Đŧ\" и \"НĐĩ Ņ…Đ°Ņ€ĐĩŅĐ˛Đ°Đŧ\" ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
<!-- 'Share' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_share_button_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐŋОдĐĩĐģŅĐŊĐĩŅ‚Đž</string>
<string name="revanced_hide_share_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са ҁĐŋОдĐĩĐģŅĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_share_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>
<string name="revanced_hide_report_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са Đ´ĐžĐēĐģадваĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_report_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са Đ´ĐžĐēĐģадваĐŊĐĩ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Remix' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_remix_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са Ņ€ĐĩĐŧиĐēҁ</string>
<string name="revanced_hide_remix_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са Ņ€ĐĩĐŧиĐēҁ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_remix_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са Ņ€ĐĩĐŧиĐēҁ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Download' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_download_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са Đ¸ĐˇŅ‚ĐĩĐŗĐģŅĐŊĐĩ</string>
<string name="revanced_hide_download_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са Đ¸ĐˇŅ‚ĐĩĐŗĐģŅĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_download_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са Đ¸ĐˇŅ‚ĐĩĐŗĐģŅĐŊĐĩ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Thanks' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_thanks_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са ĐąĐģĐ°ĐŗĐžĐ´Đ°Ņ€ĐŊĐžŅŅ‚</string>
<string name="revanced_hide_thanks_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐąĐģĐ°ĐŗĐžĐ´Đ°Ņ€ĐŊĐžŅŅ‚ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_thanks_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐąĐģĐ°ĐŗĐžĐ´Đ°Ņ€ĐŊĐžŅŅ‚ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_clip_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ĐēĐģиĐŋ</string>
<string name="revanced_hide_clip_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐēĐģиĐŋ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_clip_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐēĐģиĐŋ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_playlist_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са ЗаĐŋаСваĐŊĐĩ в ĐŋĐģĐĩĐšĐģĐ¸ŅŅ‚Đ°</string>
<string name="revanced_hide_playlist_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ЗаĐŋаСваĐŊĐĩ в ĐŋĐģĐĩĐšĐģĐ¸ŅŅ‚Đ° Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_playlist_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ЗаĐŋаСваĐŊĐĩ в ĐŋĐģĐĩĐšĐģĐ¸ŅŅ‚Đ° ҁĐĩ ĐŋĐžĐēаСва</string>
</patch>
<patch id="layout.buttons.autoplay.HideAutoplayButtonPatch">
<string name="revanced_hide_autoplay_button_title">Đ‘ŅƒŅ‚ĐžĐŊа Са Đ°Đ˛Ņ‚. иСĐŋҊĐģĐŊĐĩĐŊиĐĩ</string>
<string name="revanced_hide_autoplay_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са Đ°Đ˛Ņ‚. иСĐŋҊĐģĐŊĐĩĐŊиĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_autoplay_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са Đ°Đ˛Ņ‚. иСĐŋҊĐģĐŊĐĩĐŊиĐĩ ҁĐĩ ĐŋĐžĐēаСва</string>
</patch>
<patch id="layout.buttons.captions.HideCaptionsButtonPatch">
<!-- This button does not display any text, but 'captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title' -->
<string name="revanced_hide_captions_button_title">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐĄŅƒĐąŅ‚Đ¸Ņ‚Ņ€Đ¸</string>
<string name="revanced_hide_captions_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са ŅŅƒĐąŅ‚Đ¸Ņ‚Đ¸ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_captions_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са ŅŅƒĐąŅ‚Đ¸Ņ‚Đ¸ ҁĐĩ ĐŋĐžĐēаСва</string>
</patch>
<patch id="layout.buttons.cast.HideCastButtonPatch">
<string name="revanced_hide_cast_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са ĐŋŅ€ĐĩдаваĐŊĐĩ ĐŊа Đĸв</string>
<string name="revanced_hide_cast_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ĐŋŅ€ĐĩдаваĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_cast_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ĐŋŅ€ĐĩдаваĐŊĐĩ ҁĐĩ ĐŋĐžĐēаСва</string>
</patch>
<patch id="layout.buttons.navigation.NavigationButtonsPatch">
<string name="revanced_navigation_buttons_screen_title">Đ‘ŅƒŅ‚ĐžĐŊи Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ</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>
<string name="revanced_hide_home_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐŊĐ°Ņ‡Đ°ĐģĐž ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Shorts' should be translated using the same localized wording YouTube displays the tab. -->
<string name="revanced_hide_shorts_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са ĐšŅ€Đ°Ņ‚Đēи ĐēĐģиĐŋОвĐĩ</string>
<string name="revanced_hide_shorts_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐēŅ€Đ°Ņ‚Đēи ĐēĐģиĐŋОвĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_shorts_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐēŅ€Đ°Ņ‚Đēи ĐēĐģиĐŋОвĐĩ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- The Create button has no display name. Translate normally. -->
<string name="revanced_hide_create_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ĐēĐģиĐŋ</string>
<string name="revanced_hide_create_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_create_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays the tab. -->
<string name="revanced_hide_subscriptions_button_title">АйОĐŊаĐŧĐĩĐŊŅ‚Đ¸</string>
<string name="revanced_hide_subscriptions_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са айОĐŊаĐŧĐĩĐŊŅ‚Đ¸ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_subscriptions_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са айОĐŊаĐŧĐĩĐŊŅ‚Đ¸ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Notifications' should be translated using the same localized wording YouTube displays the tab. -->
<string name="revanced_switch_create_with_notifications_button_title">ЗаĐŧĐĩĐŊĐĩŅ‚Đĩ ĐąŅƒŅ‚ĐžĐŊа â€žĐĄŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ“ ҁ ĐąŅƒŅ‚ĐžĐŊа „ИзвĐĩŅŅ‚Đ¸Ņâ€œ</string>
<string name="revanced_switch_create_with_notifications_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ҁĐĩ СаĐŧĐĩĐŊŅ ҁ ĐąŅƒŅ‚ĐžĐŊа Са иСвĐĩŅŅ‚Đ¸Ņ\n\nЗабĐĩĐģĐĩĐļĐēа: АĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ĐŊа Ņ‚Đ°ĐˇĐ¸ ĐžĐŋŅ†Đ¸Ņ ŅŅŠŅ‰Đž ҁĐēŅ€Đ¸Đ˛Đ° видĐĩĐžŅ€ĐĩĐēĐģаĐŧи</string>
<string name="revanced_switch_create_with_notifications_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ \"ĐĄŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ\" и \"ИСвĐĩŅŅ‚Đ¸Ņ\" ĐŊĐĩ ŅĐ° Ņ€Đ°ĐˇĐŧĐĩĐŊĐĩĐŊи</string>
<string name="revanced_hide_navigation_button_labels_title">ИĐŧĐĩĐŊа ĐŊа ĐąŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ ĐŊа ĐģĐĩĐŊŅ‚Đ°Ņ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ</string>
<string name="revanced_hide_navigation_button_labels_summary_on">Đ•Ņ‚Đ¸ĐēĐĩŅ‚Đ¸Ņ‚Đĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_navigation_button_labels_summary_off">Đ•Ņ‚Đ¸ĐēĐĩŅ‚Đ¸Ņ‚Đĩ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
</patch>
<patch id="layout.hide.player.flyoutmenupanel.HidePlayerFlyoutMenuPatch">
<string name="revanced_hide_player_flyout_title">ĐŸĐ°Đ´Đ°Ņ‰Đž ĐŧĐĩĐŊŅŽ</string>
<string name="revanced_hide_player_flyout_summary">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ иĐģи ĐŋĐžĐēаСваĐŊĐĩ ĐŊа ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸ ĐžŅ‚ ĐŋĐ°Đ´Đ°Ņ‰ĐžŅ‚Đž ĐŧĐĩĐŊŅŽ ĐŊа ĐŋĐģĐĩĐšŅŠŅ€Đ°</string>
<!-- 'Captions' should be translated using the same localized wording YouTube displays for the menu item. -->
<string name="revanced_hide_player_flyout_captions_title">МĐĩĐŊŅŽ \"ĐĄŅƒĐąŅ‚Đ¸Ņ‚Ņ€Đ¸\"</string>
<string name="revanced_hide_player_flyout_captions_summary_on">МĐĩĐŊŅŽŅ‚Đž Са ŅŅƒĐąŅ‚Đ¸Ņ‚Ņ€Đ¸Đĩ ҁĐēŅ€Đ¸Ņ‚Đž</string>
<string name="revanced_hide_player_flyout_captions_summary_off">МĐĩĐŊŅŽŅ‚Đž Са ŅŅƒĐąŅ‚Đ¸Ņ‚Ņ€Đ¸Đĩ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Additional settings' should be translated using the same localized wording YouTube displays for the menu item. -->
<string name="revanced_hide_player_flyout_additional_settings_title">МĐĩĐŊŅŽ \"ДоĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊи ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи\"</string>
<string name="revanced_hide_player_flyout_additional_settings_summary_on">ДоĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊĐ¸Ņ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_player_flyout_additional_settings_summary_off">ДоĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊĐ¸Ņ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
<!-- 'Loop video' should be translated using the same localized wording YouTube displays for the menu item. -->
<string name="revanced_hide_player_flyout_loop_video_title">\"ĐŸĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩ\"</string>
<string name="revanced_hide_player_flyout_loop_video_summary_on">МĐĩĐŊŅŽŅ‚Đž Са ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐĩĐŊиĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚Đž</string>
<string name="revanced_hide_player_flyout_loop_video_summary_off">МĐĩĐŊŅŽŅ‚Đž Са ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐĩĐŊиĐĩ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Ambient mode' should be translated using the same localized wording YouTube displays for the menu item. -->
<string name="revanced_hide_player_flyout_ambient_mode_title">Ambient mode</string>
<string name="revanced_hide_player_flyout_ambient_mode_summary_on">МĐĩĐŊŅŽŅ‚Đž Са ĐžĐēĐžĐģĐĩĐŊ Ņ€ĐĩĐļиĐŧ Đĩ ҁĐēŅ€Đ¸Ņ‚Đž</string>
<string name="revanced_hide_player_flyout_ambient_mode_summary_off">МĐĩĐŊŅŽŅ‚Đž Са ĐžĐēĐžĐģĐĩĐŊ Ņ€ĐĩĐļиĐŧ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Help & feedback' should be translated using the same localized wording YouTube displays for the menu item. -->
<string name="revanced_hide_player_flyout_help_title">ПоĐŧĐžŅ‰ &amp; ĐžŅ‚ĐˇĐ¸Đ˛Đ¸</string>
<string name="revanced_hide_player_flyout_help_summary_on">МĐĩĐŊŅŽŅ‚Đž &amp; Са ĐŋĐžĐŧĐžŅ‰ Đĩ ҁĐēŅ€Đ¸Ņ‚Đž</string>
<string name="revanced_hide_player_flyout_help_summary_off">МĐĩĐŊŅŽŅ‚Đž &amp; Са ĐŋĐžĐŧĐžŅ‰ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Playback speed' should be translated using the same localized wording YouTube displays for the menu item. -->
<string name="revanced_hide_player_flyout_speed_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐēĐžŅ€ĐžŅŅ‚Ņ‚Đ° ĐŊа Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩ</string>
<string name="revanced_hide_player_flyout_speed_summary_on">МĐĩĐŊŅŽŅ‚Đž Са ҁĐēĐžŅ€ĐžŅŅ‚ ĐŊа видĐĩĐžŅ‚Đž Đĩ ҁĐēŅ€Đ¸Ņ‚Đž</string>
<string name="revanced_hide_player_flyout_speed_summary_off">МĐĩĐŊŅŽŅ‚Đž Са ҁĐēĐžŅ€ĐžŅŅ‚ ĐŊа видĐĩĐžŅ‚Đž ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'More info' should be translated using the same localized wording YouTube displays for the menu item.
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
<string name="revanced_hide_player_flyout_more_info_title">\"ДоĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊа иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ\"</string>
<string name="revanced_hide_player_flyout_more_info_summary_on">\"ДоĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊа иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ\" Đĩ ҁĐēŅ€Đ¸Ņ‚Đ°</string>
<string name="revanced_hide_player_flyout_more_info_summary_off">\"ДоĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊа иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ\" ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
<string name="revanced_hide_player_flyout_lock_screen_title">\"ЗаĐēĐģŅŽŅ‡ĐĩĐŊ ĐĩĐēŅ€Đ°ĐŊ\"</string>
<string name="revanced_hide_player_flyout_lock_screen_summary_on">МĐĩĐŊŅŽŅ‚Đž ĐŊа СаĐēĐģŅŽŅ‡ĐĩĐŊ ĐĩĐēŅ€Đ°ĐŊ Đĩ ҁĐēŅ€Đ¸Ņ‚Đž</string>
<string name="revanced_hide_player_flyout_lock_screen_summary_off">МĐĩĐŊŅŽŅ‚Đž ĐŊа СаĐēĐģŅŽŅ‡ĐĩĐŊ ĐĩĐēŅ€Đ°ĐŊ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
<string name="revanced_hide_player_flyout_audio_track_title">Đ˜ĐˇĐąĐžŅ€ ĐŊа ĐŅƒĐ´Đ¸Đž</string>
<string name="revanced_hide_player_flyout_audio_track_summary_on">МĐĩĐŊŅŽŅ‚Đž Са Đ¸ĐˇĐąĐžŅ€ ĐŊа ĐŅƒĐ´Đ¸Đž Đĩ ҁĐēŅ€Đ¸Ņ‚Đž</string>
<string name="revanced_hide_player_flyout_audio_track_summary_off">МĐĩĐŊŅŽŅ‚Đž Са Đ¸ĐˇĐąĐžŅ€ ĐŊа ĐŅƒĐ´Đ¸Đž ҁĐĩ ĐŋĐžĐēаСва</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>
<string name="revanced_hide_player_flyout_watch_in_vr_summary_off">МĐĩĐŊŅŽŅ‚Đž Са ĐŗĐģĐĩдаĐŊĐĩ в VR ҁĐĩ ĐŋĐžĐēаСва</string>
</patch>
<patch id="layout.buttons.player.hide.HidePlayerButtonsPatch">
<string name="revanced_hide_player_buttons_title">Đ‘ŅƒŅ‚ĐžĐŊи Са ĐŸŅ€ĐĩĐ´Đ¸ŅˆĐŊĐž &amp; ĐĄĐģĐĩĐ´Đ˛Đ°Ņ‰Đž видĐĩĐž</string>
<string name="revanced_hide_player_buttons_summary_on">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_player_buttons_summary_off">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
</patch>
<patch id="layout.hide.albumcards.AlbumCardsResourcePatch">
<string name="revanced_hide_album_cards_title">\"ĐšĐ°Ņ€Ņ‚Đ¸ ĐŊа аĐģĐąŅƒĐŧĐ¸Ņ‚Đĩ\"</string>
<string name="revanced_hide_album_cards_summary_on">АĐģĐąŅƒĐŧĐŊĐ¸Ņ‚Đĩ ĐēĐ°Ņ€Ņ‚Đ¸ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_album_cards_summary_off">АĐģĐąŅƒĐŧĐŊĐ¸Ņ‚Đĩ ĐēĐ°Ņ€Ņ‚Đ¸ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
</patch>
<patch id="layout.hide.comments.CommentsPatch">
<string name="revanced_comments_screen_title">КоĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸</string>
<string name="revanced_comments_screen_summary">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ иĐģи ĐŋĐžĐēаСваĐŊĐĩ ĐŊа ҁĐĩĐēŅ†Đ¸ŅŅ‚Đ° Са ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸</string>
<string name="revanced_hide_comments_by_members_header_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа „КоĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸, ĐŊаĐŋŅ€Đ°Đ˛ĐĩĐŊи ĐžŅ‚ ҇ĐģĐĩĐŊОвĐĩ“</string>
<string name="revanced_hide_comments_by_members_header_summary_on">„КоĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸ ĐžŅ‚ ҇ĐģĐĩĐŊОвĐĩ“ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_comments_by_members_header_summary_off">„КоĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸ ĐžŅ‚ ҇ĐģĐĩĐŊОвĐĩ“ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
<string name="revanced_hide_comments_section_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐĩĐēŅ†Đ¸ŅŅ‚Đ° ҁ ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸</string>
<string name="revanced_hide_comments_section_summary_on">ĐĄĐĩĐēŅ†Đ¸ŅŅ‚Đ° ҁ ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸ Đĩ ҁĐēŅ€Đ¸Ņ‚Đ°</string>
<string name="revanced_hide_comments_section_summary_off">ĐĄĐĩĐēŅ†Đ¸ŅŅ‚Đ° ҁ ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸ ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_comments_create_a_short_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа Shorts</string>
<string name="revanced_hide_comments_create_a_short_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊ Са ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа Shorts Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_comments_create_a_short_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊ Са ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа Shorts ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_comments_preview_comment_title">ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸</string>
<string name="revanced_hide_comments_preview_comment_summary_on">ĐŸŅ€ĐĩĐŗĐģĐĩда ĐŊа ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_comments_preview_comment_summary_off">ĐŸŅ€ĐĩĐŗĐģĐĩда ĐŊа ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸ ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_comments_thanks_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са ĐąĐģĐ°ĐŗĐžĐ´Đ°Ņ€ĐŊĐžŅŅ‚</string>
<string name="revanced_hide_comments_thanks_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐąĐģĐ°ĐŗĐžĐ´Đ°Ņ€ĐŊĐžŅŅ‚ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_comments_thanks_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐąĐģĐ°ĐŗĐžĐ´Đ°Ņ€ĐŊĐžŅŅ‚ ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_comments_timestamp_and_emoji_buttons_title">Đ‘ŅƒŅ‚ĐžĐŊи в ĐģĐĩĐŊŅ‚Đ°Ņ‚Đ° ĐŊа ĐŋŅ€ĐžĐŗŅ€ĐĩŅĐ° и ĐĩĐŧĐžŅ‚Đ¸ĐēĐžĐŊи</string>
<string name="revanced_hide_comments_timestamp_and_emoji_buttons_summary_on">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_comments_timestamp_and_emoji_buttons_summary_off">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
</patch>
<patch id="layout.hide.crowdfundingbox.CrowdfundingBoxResourcePatch">
<string name="revanced_hide_crowdfunding_box_title">Đ”Đ°Ņ€Đ¸Ņ‚ĐĩĐģҁĐēа ĐēŅƒŅ‚Đ¸Ņ</string>
<string name="revanced_hide_crowdfunding_box_summary_on">ĐšŅƒŅ‚Đ¸ŅŅ‚Đ° Са Đ´Đ°Ņ€ĐĩĐŊĐ¸Ņ Đĩ ҁĐēŅ€Đ¸Ņ‚Đ°</string>
<string name="revanced_hide_crowdfunding_box_summary_off">ĐšŅƒŅ‚Đ¸ŅŅ‚Đ° Са Đ´Đ°Ņ€ĐĩĐŊĐ¸Ņ ҁĐĩ ĐŋĐžĐēаСва</string>
</patch>
<patch id="layout.hide.endscreencards.HideEndscreenCardsResourcePatch">
<string name="revanced_hide_endscreen_cards_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐĩĐŋĐžŅ€ŅŠĐēĐ¸Ņ‚Đĩ в ĐēŅ€Đ°Ņ</string>
<string name="revanced_hide_endscreen_cards_summary_on">ĐŸŅ€ĐĩĐŋĐžŅ€ŅŠĐēĐ¸Ņ‚Đĩ в ĐēŅ€Đ°Ņ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_endscreen_cards_summary_off">ĐŸŅ€ĐĩĐŋĐžŅ€ŅŠĐēĐ¸Ņ‚Đĩ в ĐēŅ€Đ°Ņ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
</patch>
<patch id="layout.hide.filterbar.HideFilterBarResourcePatch">
<string name="revanced_hide_filter_bar_screen_title">ЛĐĩĐŊŅ‚Đ° ҁ Ņ„Đ¸ĐģŅ‚Ņ€Đ¸</string>
<string name="revanced_hide_filter_bar_screen_summary">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ иĐģи ĐŋĐžĐēаСваĐŊĐĩ ĐŊа ĐģĐĩĐŊŅ‚Đ°Ņ‚Đ° ҁ ĐēĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸Đ¸ в ĐĩĐŧĐ¸ŅĐ¸ŅŅ‚Đ°, Ņ€ĐĩĐˇŅƒĐģŅ‚Đ°Ņ‚Đ¸Ņ‚Đĩ ĐžŅ‚ Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩŅ‚Đž и ŅĐ˛ŅŠŅ€ĐˇĐ°ĐŊĐ¸Ņ‚Đĩ видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
<string name="revanced_hide_filter_bar_feed_in_feed_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐŗĐžŅ€ĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° ҁ ĐēĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸Đ¸ в ĐĩĐŧĐ¸ŅĐ¸ŅŅ‚Đ°</string>
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">ĐĄĐēŅ€Đ¸Ņ‚Đ°</string>
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">ПоĐēаСва ҁĐĩ</string>
<string name="revanced_hide_filter_bar_feed_in_search_title">ФиĐģŅ‚ŅŠŅ€Đ¸ ĐŊа Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ</string>
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">ПаĐŊĐĩĐģŅŠŅ‚ ҁ Ņ„Đ¸ĐģŅ‚ŅŠŅ€Đ¸ ĐŊа Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">ПаĐŊĐĩĐģŅŠŅ‚ ҁ Ņ„Đ¸ĐģŅ‚ŅŠŅ€Đ¸ ĐŊа Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ в ŅŅ€ĐžĐ´ĐŊи видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_on">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ в ŅŅ€ĐžĐ´ĐŊи видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_off">ПоĐēаСаĐŊĐž в ŅŅ€ĐžĐ´ĐŊи видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
</patch>
<patch id="layout.hide.floatingmicrophone.HideFloatingMicrophoneButtonResourcePatch">
<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>
</patch>
<patch id="layout.hide.fullscreenambientmode.DisableFullscreenAmbientModePatch">
<string name="revanced_disable_fullscreen_ambient_mode_title">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐšŅ‚Đĩ ĐžĐēĐžĐģĐŊĐ¸Ņ Ņ€ĐĩĐļиĐŧ ĐŊа Ņ†ŅĐģ ĐĩĐēŅ€Đ°ĐŊ</string>
<string name="revanced_disable_fullscreen_ambient_mode_summary_on">ĐŸĐžĐ´ŅĐ˛ĐĩŅ‚ĐēĐ°Ņ‚Đ° в Ņ€ĐĩĐļиĐŧ ĐŊа Ņ†ŅĐģ ĐĩĐēŅ€Đ°ĐŊ Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊа</string>
<string name="revanced_disable_fullscreen_ambient_mode_summary_off">ĐŸĐžĐ´ŅĐ˛ĐĩŅ‚ĐēĐ°Ņ‚Đ° в Ņ€ĐĩĐļиĐŧ ĐŊа Ņ†ŅĐģ ĐĩĐēŅ€Đ°ĐŊ Đĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊа</string>
</patch>
<patch id="layout.hide.infocards.HideInfocardsResourcePatch">
<string name="revanced_hide_info_cards_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа иĐŊŅ„Đž. ĐēĐ°Ņ€Ņ‚Đ¸</string>
<string name="revanced_hide_info_cards_summary_on">ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ĐžĐŊĐŊĐ¸Ņ‚Đĩ ĐēĐ°Ņ€Ņ‚Đ¸ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_info_cards_summary_off">ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ĐžĐŊĐŊĐ¸Ņ‚Đĩ ĐēĐ°Ņ€Ņ‚Đ¸ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
</patch>
<patch id="layout.hide.rollingnumber.DisableRollingNumberAnimationPatch">
<string name="revanced_disable_rolling_number_animations_title">АĐŊиĐŧĐ°Ņ†Đ¸Ņ ĐŊа Ņ‡Đ¸ŅĐģа в Ņ€ĐĩаĐģĐŊĐž Đ˛Ņ€ĐĩĐŧĐĩ</string>
<string name="revanced_disable_rolling_number_animations_summary_on">АĐŊиĐŧĐ°Ņ†Đ¸ŅŅ‚Đ° Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊа</string>
<string name="revanced_disable_rolling_number_animations_summary_off">АĐŊиĐŧĐ°Ņ†Đ¸ŅŅ‚Đ° Đĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊа</string>
</patch>
<patch id="layout.hide.seekbar.HideSeekbarPatch">
<string name="revanced_hide_seekbar_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐģĐĩĐŊŅ‚Đ° Са Đ˛Ņ€ĐĩĐŧĐĩ ĐŊа ĐŋĐģĐĩĐšŅŠŅ€Đ°</string>
<string name="revanced_hide_seekbar_summary_on">ЛĐĩĐŊŅ‚Đ°Ņ‚Đ° Са Đ˛Ņ€ĐĩĐŧĐĩ ĐŊа ĐŋĐģĐĩĐšŅŠŅ€Đ° Đĩ ҁĐēŅ€Đ¸Ņ‚Đ°</string>
<string name="revanced_hide_seekbar_summary_off">ЛĐĩĐŊŅ‚Đ°Ņ‚Đ° Са Đ˛Ņ€ĐĩĐŧĐĩ ĐŊа ĐŋĐģĐĩĐšŅŠŅ€Đ° ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_seekbar_thumbnail_title">ĐĄĐēŅ€. ĐģĐĩĐŊŅ‚Đ° Са Đ˛Ņ€ĐĩĐŧĐĩ ĐŋŅ€Đ¸ ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸Ņ‚Đĩ</string>
<string name="revanced_hide_seekbar_thumbnail_summary_on">ЛĐĩĐŊŅ‚Đ°Ņ‚Đ° Са Đ˛Ņ€ĐĩĐŧĐĩ ĐŋŅ€Đ¸ ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸Ņ‚Đĩ Đĩ ҁĐēŅ€Đ¸Ņ‚Đ°</string>
<string name="revanced_hide_seekbar_thumbnail_summary_off">ЛĐĩĐŊŅ‚Đ°Ņ‚Đ° Са Đ˛Ņ€ĐĩĐŧĐĩ ĐŋŅ€Đ¸ ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸Ņ‚Đĩ ҁĐĩ ĐŋĐžĐēаСва</string>
</patch>
<patch id="layout.hide.shorts.HideShortsComponentsResourcePatch">
<!-- '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">Shorts в ĐŊĐ°Ņ‡Đ°ĐģĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_shorts_home_summary_off">Shorts в ĐŊĐ°Ņ‡Đ°ĐģĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° ŅĐ° ĐŋĐžĐēаСаĐŊи</string>
<!-- 'subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
<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>
<string name="revanced_hide_shorts_search_summary_on">Shorts в Ņ€ĐĩĐˇŅƒĐģŅ‚Đ°Ņ‚Đ¸Ņ‚Đĩ ĐžŅ‚ Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩŅ‚Đž ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_shorts_search_summary_off">Shorts в Ņ€ĐĩĐˇŅƒĐģŅ‚Đ°Ņ‚Đ¸Ņ‚Đĩ ĐžŅ‚ Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩŅ‚Đž ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</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>
<!-- 'subscribe' should be translated using the same localized wording YouTube displays for the button. -->
<string name="revanced_hide_shorts_subscribe_button_title">ĐĄĐēŅ€Đ¸ĐšŅ‚Đĩ ĐąŅƒŅ‚ĐžĐŊа „АбоĐŊĐ¸Ņ€Đ°ĐŊĐĩ“</string>
<string name="revanced_hide_shorts_subscribe_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ „АбоĐŊĐ¸Ņ€Đ°ĐŊĐĩ“ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_shorts_subscribe_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ „АбоĐŊĐ¸Ņ€Đ°ĐŊĐĩ“ ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_shorts_paused_overlay_buttons_title">ПоĐēаСваĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊи ĐŋŅ€Đ¸ ĐŋĐ°ŅƒĐˇĐ°</string>
<string name="revanced_hide_shorts_paused_overlay_buttons_summary_on">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ ĐŋŅ€Đ¸ ĐŋĐ°ŅƒĐˇĐ° ҁĐĩ ҁĐēŅ€Đ¸Đ˛Đ°Ņ‚</string>
<string name="revanced_hide_shorts_paused_overlay_buttons_summary_off">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ ĐŋŅ€Đ¸ ĐŋĐ°ŅƒĐˇĐ° ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
<string name="revanced_hide_shorts_shop_button_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са ĐŋĐ°ĐˇĐ°Ņ€ŅƒĐ˛Đ°ĐŊĐĩ</string>
<string name="revanced_hide_shorts_shop_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐŋĐ°ĐˇĐ°Ņ€ŅƒĐ˛Đ°ĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_shorts_shop_button_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_tagged_products_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐŧĐ°Ņ€ĐēĐ¸Ņ€Đ°ĐŊĐ¸Ņ‚Đĩ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ¸</string>
<string name="revanced_hide_shorts_tagged_products_summary_on">ĐĄĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_shorts_tagged_products_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>
<string name="revanced_hide_shorts_save_sound_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са СаĐŋаСваĐŊĐĩ ĐŊа Đ°ŅƒĐ´Đ¸ĐžŅ‚Đž в ĐŋĐģĐĩĐšĐģĐ¸ŅŅ‚Đ°</string>
<string name="revanced_hide_shorts_save_sound_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ЗаĐŋаСваĐŊĐĩ в ĐŋĐģĐĩĐšĐģĐ¸ŅŅ‚Đ° Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_shorts_save_sound_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ЗаĐŋаСваĐŊĐĩ в ĐŋĐģĐĩĐšĐģĐ¸ŅŅ‚Đ° ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_shorts_search_suggestions_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸ŅŅ‚Đ° Са Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ</string>
<string name="revanced_hide_shorts_search_suggestions_summary_on">ĐŸŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸ŅŅ‚Đ° Са Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_shorts_search_suggestions_summary_off">ĐŸŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸ŅŅ‚Đ° Са Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
<string name="revanced_hide_shorts_like_button_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са Ņ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐĩ</string>
<string name="revanced_hide_shorts_like_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са Ņ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_shorts_like_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са Ņ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐĩ ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_shorts_dislike_button_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са ĐŊĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐĩ</string>
<string name="revanced_hide_shorts_dislike_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐŊĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_shorts_dislike_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐŊĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐĩ ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_shorts_comments_button_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸</string>
<string name="revanced_hide_shorts_comments_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊ Са ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_shorts_comments_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊ Са ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'remix' should be translated using the same localized wording YouTube displays for the button. -->
<string name="revanced_hide_shorts_remix_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са Ņ€ĐĩĐŧиĐēҁ</string>
<string name="revanced_hide_shorts_remix_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са Ņ€ĐĩĐŧиĐēҁ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_shorts_remix_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са Ņ€ĐĩĐŧиĐēҁ ҁĐĩ ĐŋĐžĐēаСва</string>
<!-- 'share' should be translated using the same localized wording YouTube displays for the button. -->
<string name="revanced_hide_shorts_share_button_title">Đ‘ŅƒŅ‚ĐžĐŊ Са ҁĐŋОдĐĩĐģŅĐŊĐĩ</string>
<string name="revanced_hide_shorts_share_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са ҁĐŋОдĐĩĐģŅĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_shorts_share_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са ҁĐŋОдĐĩĐģŅĐŊĐĩ ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_shorts_info_panel_title">ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ĐžĐŊĐŊи ĐŋаĐŊĐĩĐģи</string>
<string name="revanced_hide_shorts_info_panel_summary_on">ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ĐžĐŊĐŊĐ¸Ņ‚Đĩ ĐŋаĐŊĐĩĐģи ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_hide_shorts_info_panel_summary_off">ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ĐžĐŊĐŊĐ¸Ņ‚Đĩ ĐŋаĐŊĐĩĐģи ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</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_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_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>
<string name="revanced_hide_shorts_sound_button_title">ĐĄĐēŅ€Đ¸ĐšŅ‚Đĩ ĐąŅƒŅ‚ĐžĐŊа â€žĐ—Đ˛ŅƒĐē“</string>
<string name="revanced_hide_shorts_sound_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊа Са Đ—Đ˛ŅƒĐē Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_hide_shorts_sound_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊа Са Đ—Đ˛ŅƒĐē ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_hide_shorts_navigation_bar_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐģĐĩĐŊŅ‚Đ°Ņ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ</string>
<string name="revanced_hide_shorts_navigation_bar_summary_on">ĐĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸ĐžĐŊĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° Đĩ ҁĐēŅ€Đ¸Ņ‚Đ°</string>
<string name="revanced_hide_shorts_navigation_bar_summary_off">ĐĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸ĐžĐŊĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° ҁĐĩ ĐŋĐžĐēаСва</string>
</patch>
<patch id="layout.hide.suggestedvideoendscreen.DisableSuggestedVideoEndScreenResourcePatch">
<string name="revanced_disable_suggested_video_end_screen_title">ĐŸŅ€ĐĩĐŋĐžŅ€ŅŠŅ‡Đ°ĐŊи видĐĩĐžĐēĐģиĐŋОвĐĩ в ĐēŅ€Đ°Ņ</string>
<string name="revanced_disable_suggested_video_end_screen_summary_on">ĐŸŅ€ĐĩĐŋĐžŅ€ŅŠŅ‡Đ°ĐŊĐ¸Ņ‚Đĩ видĐĩĐžĐēĐģиĐŋОвĐĩ в ĐēŅ€Đ°Ņ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_disable_suggested_video_end_screen_summary_off">ĐŸŅ€ĐĩĐŋĐžŅ€ŅŠŅ‡Đ°ĐŊĐ¸Ņ‚Đĩ видĐĩĐžĐēĐģиĐŋОвĐĩ в ĐēŅ€Đ°Ņ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
</patch>
<patch id="layout.hide.time.HideTimestampPatch">
<string name="revanced_hide_timestamp_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐēĐģĐĩĐšĐŧĐžŅ‚Đž Са Đ˛Ņ€ĐĩĐŧĐĩ ĐŊа видĐĩĐžĐēĐģиĐŋа</string>
<string name="revanced_hide_timestamp_summary_on">ĐĄĐēŅ€Đ¸Ņ‚Đž</string>
<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>
</patch>
<patch id="layout.player.overlay.CustomPlayerOverlayOpacityResourcePatch">
<string name="revanced_player_overlay_opacity_title">ĐŸŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐžŅŅ‚ ĐŊа ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ в ПĐģĐĩĐ°Ņ€Đ°</string>
<string name="revanced_player_overlay_opacity_summary">ĐĄŅ‚ĐžĐšĐŊĐžŅŅ‚ ĐŊа ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐžŅŅ‚ ĐŧĐĩĐļĐ´Ņƒ 0-100, ĐēŅŠĐ´ĐĩŅ‚Đž 0 Đĩ ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐž</string>
<string name="revanced_player_overlay_opacity_invalid_toast">ĐŸŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐžŅŅ‚Ņ‚Đ° ĐŊа ĐŧĐĩĐŊŅŽŅ‚Đž ĐŊа ĐŋĐģĐĩĐšŅŠŅ€Đ° Ņ‚Ņ€ŅĐąĐ˛Đ° да ĐąŅŠĐ´Đĩ ĐŧĐĩĐļĐ´Ņƒ 0-100</string>
</patch>
<patch id="layout.returnyoutubedislike.ReturnYouTubeDislikeResourcePatch">
<string name="revanced_ryd_video_likes_hidden_by_video_owner">ĐĄĐēŅ€Đ¸Ņ‚Đž</string>
<!-- Toast shown if network connection times out. Translations of this should not be longer than the original English or the text can be clipped and not entirely shown. -->
<string name="revanced_ryd_failure_connection_timeout">НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸ŅŅ‚Đ° Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ ŅĐ° ĐŊаĐģĐ¸Ņ‡ĐŊи (API timed out)</string>
<string name="revanced_ryd_failure_connection_status_code">НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸ŅŅ‚Đ° ĐŊĐĩ ŅĐ° ĐŊаĐģĐ¸Ņ‡ĐŊи (status %d)</string>
<string name="revanced_ryd_failure_client_rate_limit_requested">НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸ŅŅ‚Đ° ĐŊĐĩ ŅĐ° Đ´ĐžŅŅ‚ŅŠĐŋĐŊи (Đ´ĐžŅŅ‚Đ¸ĐŗĐŊĐ°Ņ‚ ĐģиĐŧĐ¸Ņ‚ ĐŊа API)</string>
<string name="revanced_ryd_failure_generic">НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸ŅŅ‚Đ° ĐŊĐĩ ŅĐ° ĐŊаĐģĐ¸Ņ‡ĐŊи (%s)</string>
<!-- Toast shown if the user enables RYD while a video is opened, and then tries to vote for the video. -->
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">ĐŸŅ€ĐĩĐˇĐ°Ņ€Đĩди видĐĩĐžŅ‚Đž Са ĐŗĐģĐ°ŅŅƒĐ˛Đ°ĐŊĐĩ ҁ ReturnYouTubeDislike</string>
<string name="revanced_ryd_enable_summary_on">НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸ŅŅ‚Đ° ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
<string name="revanced_ryd_enable_summary_off">НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸ŅŅ‚Đ° ĐŊĐĩ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚</string>
<string name="revanced_ryd_shorts_title">ПоĐē. ĐŊĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸Ņ в ĐēŅ€Đ°Ņ‚ĐēĐ¸Ņ‚Đĩ ĐēĐģиĐŋОвĐĩ</string>
<string name="revanced_ryd_shorts_summary_on">НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸ŅŅ‚Đ° ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ в ĐēŅ€Đ°Ņ‚ĐēĐ¸Ņ‚Đĩ ĐēĐģиĐŋОвĐĩ</string>
<string name="revanced_ryd_shorts_summary_on_disclaimer">НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸Ņ, ĐŋĐžĐēаСаĐŊи в Shorts\n\nĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊиĐĩ: НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸ŅŅ‚Đ° ĐŧĐžĐļĐĩ да ĐŊĐĩ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ в Ņ€ĐĩĐļиĐŧ „иĐŊĐēĐžĐŗĐŊĐ¸Ņ‚Đžâ€œ</string>
<string name="revanced_ryd_shorts_summary_off">НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸ŅŅ‚Đ° ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸ в ĐēŅ€Đ°Ņ‚ĐēĐ¸Ņ‚Đĩ ĐēĐģиĐŋОвĐĩ</string>
<string name="revanced_ryd_dislike_percentage_title">НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸Ņ ĐēĐ°Ņ‚Đž ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚</string>
<string name="revanced_ryd_dislike_percentage_summary_on">НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸ŅŅ‚Đ° ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ ĐēĐ°Ņ‚Đž ĐŋŅ€ĐžŅ†ĐĩĐŊŅ‚</string>
<string name="revanced_ryd_dislike_percentage_summary_off">НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸ŅŅ‚Đ° ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ ĐēĐ°Ņ‚Đž Ņ‡Đ¸ŅĐģĐž</string>
<!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' -->
<string name="revanced_ryd_compact_layout_title">КоĐŧĐŋаĐēŅ‚ĐĩĐŊ ĐąŅƒŅ‚ĐžĐŊ Са Ņ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐĩ</string>
<string name="revanced_ryd_compact_layout_summary_on">ВĐēĐģŅŽŅ‡ĐĩĐŊ ĐēĐžĐŧĐŋаĐēŅ‚ĐĩĐŊ ĐąŅƒŅ‚ĐžĐŊ \"ĐĨĐ°Ņ€ĐĩŅĐ˛Đ° Đŧи\"</string>
<string name="revanced_ryd_compact_layout_summary_off">Най-Đ´ĐžĐąŅŠŅ€ Đ¸ĐˇĐŗĐģĐĩĐ´ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са Ņ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐĩ</string>
<string name="revanced_ryd_toast_on_connection_error_title">ПоĐēаСваĐŊĐĩ ĐŊа иСвĐĩŅŅ‚Đ¸Đĩ, аĐēĐž API ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ</string>
<string name="revanced_ryd_toast_on_connection_error_summary_on">ПоĐēаСва иСвĐĩŅŅ‚Đ¸Đĩ, аĐēĐž Return YouTube Dislike ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ</string>
<string name="revanced_ryd_toast_on_connection_error_summary_off">НĐĩ ҁĐĩ ĐŋĐžĐēаСва иСвĐĩŅŅ‚Đ¸Đĩ, аĐēĐž ReturnYouTube Dislike ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ</string>
<string name="revanced_ryd_about">ĐžŅ‚ĐŊĐžŅĐŊĐž</string>
<string name="revanced_ryd_attribution_summary">ДаĐŊĐŊĐ¸Ņ‚Đĩ Са ĐŊĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐĩ ŅĐ° ĐžŅ‚ Return YouTube Dislike API. ДоĐēĐžŅĐŊĐĩŅ‚Đĩ Са да ĐŊĐ°ŅƒŅ‡Đ¸Ņ‚Đĩ ĐŋОвĐĩ҇Đĩ</string>
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
<string name="revanced_ryd_statistics_category_title">ĐĄŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đēа Return YouTube Dislike API ĐŊа Ņ‚ĐžĐ˛Đ° ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž</string>
<string name="revanced_ryd_statistics_getFetchCallResponseTimeAverage_title">Đ’Ņ€ĐĩĐŧĐĩ Са ĐžŅ‚ĐŗĐžĐ˛ĐžŅ€ ĐŊа API, ҁҀĐĩĐ´ĐŊĐž</string>
<string name="revanced_ryd_statistics_getFetchCallResponseTimeMin_title">Đ’Ņ€ĐĩĐŧĐĩ Са ĐžŅ‚ĐŗĐžĐ˛ĐžŅ€ ĐŊа API, ĐŧиĐŊиĐŧаĐģĐŊĐž</string>
<string name="revanced_ryd_statistics_getFetchCallResponseTimeMax_title">Đ’Ņ€ĐĩĐŧĐĩ Са ĐžŅ‚ĐŗĐžĐ˛ĐžŅ€ ĐŊа API, ĐŧаĐēŅĐ¸ĐŧаĐģĐŊĐž</string>
<string name="revanced_ryd_statistics_getFetchCallResponseTimeLast_title">Đ’Ņ€ĐĩĐŧĐĩ Са ĐžŅ‚ĐŗĐžĐ˛ĐžŅ€ ĐŊа API, ĐŋĐžŅĐģĐĩĐ´ĐŊĐž видĐĩĐž</string>
<string name="revanced_ryd_statistics_getFetchCallResponseTimeLast_rate_limit_summary">НĐĩŅ…Đ°Ņ€ĐĩŅĐ˛Đ°ĐŊĐ¸ŅŅ‚Đ° Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ ŅĐ° ĐŊаĐģĐ¸Ņ‡ĐŊи - в ŅĐ¸Đģа Đĩ ĐģиĐŧĐ¸Ņ‚ŅŠŅ‚ API ĐēĐģиĐĩĐŊŅ‚Đ°</string>
<string name="revanced_ryd_statistics_getFetchCallCount_title">API ĐŋĐžĐģŅƒŅ‡Đ°Đ˛Đ° ĐŗĐģĐ°ŅĐžĐ˛Đĩ, ĐąŅ€ĐžĐš ĐˇĐ°ŅĐ˛Đēи</string>
<string name="revanced_ryd_statistics_getFetchCallCount_zero_summary">НĐĩ҃ҁĐŋĐĩ҈ĐŊи ĐŧŅ€ĐĩĐļОви ĐˇĐ°ŅĐ˛Đēи</string>
<string name="revanced_ryd_statistics_getFetchCallCount_non_zero_summary">%d ĐŧŅ€ĐĩĐļОви ĐˇĐ°ŅĐ˛Đēи</string>
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_title">API иСвĐģĐ¸Ņ‡Đ° ĐŗĐģĐ°ŅĐžĐ˛Đĩ, ĐąŅ€ĐžĐš Đ¸ĐˇŅ‡Đ°ĐēваĐŊĐ¸Ņ</string>
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_zero_summary">ĐœŅ€ĐĩĐļĐžĐ˛Đ¸Ņ‚Đĩ ĐˇĐ°ŅĐ˛Đēи ĐŊŅĐŧĐ°Ņ…Đ° Đ¸ĐˇŅ‡Đ°ĐēваĐŊĐĩ</string>
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_non_zero_summary">%d Đ¸ĐˇŅ‚Đĩ҇Đĩ Đ˛Ņ€ĐĩĐŧĐĩŅ‚Đž Са Đ¸ĐˇŅ‡Đ°ĐēваĐŊĐĩ ĐŊа ĐŧŅ€ĐĩĐļĐžĐ˛Đ¸Ņ‚Đĩ ĐŋОвиĐēваĐŊĐ¸Ņ</string>
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_title">ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐ¸Ņ ĐŊа ҁĐēĐžŅ€ĐžŅŅ‚Ņ‚Đ° ĐŊа API ĐēĐģиĐĩĐŊŅ‚</string>
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_zero_summary">ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐ¸ŅŅ‚Đ° ĐŊа ҁĐēĐžŅ€ĐžŅŅ‚Ņ‚Đ° ĐŊа ĐēĐģиĐĩĐŊŅ‚Đ° ĐŊа Api ĐŊĐĩ ŅĐ° ĐžŅ‚ĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_non_zero_summary">ĐžŅ‚ĐēŅ€Đ¸Ņ‚Đ¸ ŅĐ° ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐ¸Ņ ĐŊа ҁĐēĐžŅ€ĐžŅŅ‚Ņ‚Đ° ĐŊа ĐēĐģиĐĩĐŊŅ‚Đ° ĐŊа Api %d ĐŋŅŠŅ‚Đ¸</string>
<string name="revanced_ryd_statistics_millisecond_text">%d ĐŧиĐģĐ¸ŅĐĩĐē҃ĐŊди</string>
</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>
</patch>
<patch id="layout.seekbar.RestoreOldSeekbarThumbnailsPatch">
<string name="revanced_restore_old_seekbar_thumbnails_title">ĐĄŅ‚Đ°Ņ€Đ¸ ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸ ĐŊа Đ˛Ņ€ĐĩĐŧĐĩĐ˛Đ°Ņ‚Đ° ĐģиĐŊĐ¸Ņ</string>
<string name="revanced_restore_old_seekbar_thumbnails_summary_on">Над ĐģĐĩĐŊŅ‚Đ°Ņ‚Đ° Са Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩ ҁĐĩ ĐŋĐžŅĐ˛ŅĐ˛Đ°Ņ‚ ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸</string>
<string name="revanced_restore_old_seekbar_thumbnails_summary_off">МиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸Ņ‚Đĩ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ в Ņ€ĐĩĐļиĐŧ ĐŊа Ņ†ŅĐģ ĐĩĐēŅ€Đ°ĐŊ</string>
</patch>
<patch id="layout.sponsorblock.SponsorBlockResourcePatch">
<string name="revanced_sb_enable_sb">ВĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ ĐŊа SponsorBlock</string>
<string name="revanced_sb_enable_sb_sum">SponsorBlock Đĩ ŅĐ¸ŅŅ‚ĐĩĐŧа Са ĐŋŅ€ĐĩҁĐēĐ°Ņ‡Đ°ĐŊĐĩ ĐŊа Đ´ĐžŅĐ°Đ´ĐŊи Ņ‡Đ°ŅŅ‚Đ¸ и Ņ€ĐĩĐēĐģаĐŧи ĐžŅ‚ видĐĩĐžĐēĐģиĐŋОвĐĩŅ‚Đĩ в YouTube</string>
<string name="revanced_sb_appearance_category">ОбĐģиĐē</string>
<string name="revanced_sb_enable_voting">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐŗĐģĐ°ŅŅƒĐ˛Đ°ĐŊĐĩ</string>
<string name="revanced_sb_enable_voting_sum_on">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐŗĐģĐ°ŅŅƒĐ˛Đ°ĐŊĐĩ ĐŊа Ņ‡Đ°ŅŅ‚ ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_sb_enable_voting_sum_off">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐŗĐģĐ°ŅŅƒĐ˛Đ°ĐŊĐĩ ĐŊа Ņ‡Đ°ŅŅ‚ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title' -->
<string name="revanced_sb_enable_compact_skip_button">КоĐŧĐŋаĐēŅ‚ĐĩĐŊ ĐąŅƒŅ‚ĐžĐŊ Са ĐŋŅ€ĐžĐŋ҃ҁĐēаĐŊĐĩ</string>
<string name="revanced_sb_enable_compact_skip_button_sum_on">МиĐŊ. ŅˆĐ¸Ņ€Đ¸ĐŊа ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са ĐŋŅ€ĐžĐŋ҃ҁĐēаĐŊĐĩ</string>
<string name="revanced_sb_enable_compact_skip_button_sum_off">Най-Đ´ĐžĐąŅŠŅ€ Đ¸ĐˇĐŗĐģĐĩĐ´ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са ĐŋŅ€ĐžĐŋ҃ҁĐēаĐŊĐĩ</string>
<string name="revanced_sb_enable_auto_hide_skip_segment_button">ĐĐ˛Ņ‚. ҁĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са ĐŋŅ€ĐžĐŋ҃ҁĐēаĐŊĐĩ</string>
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐŋŅ€ĐžĐŋ҃ҁĐēаĐŊĐĩ ҁĐĩ ҁĐēŅ€Đ¸Đ˛Đ° ҁĐģĐĩĐ´ ĐŊŅĐēĐžĐģĐēĐž ҁĐĩĐē҃ĐŊди</string>
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Đ‘ŅƒŅ‚ĐžĐŊа Са ĐŋŅ€ĐžĐŋ҃ҁĐēаĐŊĐĩ ҁĐĩ ĐŋĐžĐēаСва Са Ņ†ŅĐģĐ°Ņ‚Đ° Ņ‡Đ°ŅŅ‚</string>
<string name="revanced_sb_general_skiptoast">ПоĐēаСв. иСвĐĩŅŅ‚Đ¸Đĩ ĐŋŅ€Đ¸ Đ°Đ˛Ņ‚ĐžĐŧ. ĐŋŅ€ĐžĐŋ҃ҁĐē. Ņ‡Đ°ŅŅ‚</string>
<string name="revanced_sb_general_skiptoast_sum_on">ПоĐēаСваĐŊĐĩ ĐŊа иСвĐĩŅŅ‚Đ¸Đĩ ĐŋŅ€Đ¸ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚Đ° Ņ‡Đ°ŅŅ‚. ДоĐēĐžŅĐŊĐĩŅ‚Đĩ Ņ‚ŅƒĐē Са ĐŋŅ€Đ¸ĐŧĐĩŅ€</string>
<string name="revanced_sb_general_skiptoast_sum_off">ИСвĐĩŅŅ‚Đ¸ĐĩŅ‚Đž ĐŊĐĩ ҁĐĩ ĐŋĐžĐēаСва. ДоĐēĐžŅĐŊĐĩŅ‚Đĩ Ņ‚ŅƒĐē Са ĐŋŅ€Đ¸ĐŧĐĩŅ€</string>
<string name="revanced_sb_general_time_without">ПоĐēаСваĐŊĐĩ ĐŊа Đ´ŅŠĐģĐļиĐŊĐ°Ņ‚Đ° ĐŊа видĐĩĐžŅ‚Đž ĐąĐĩС ŅĐ¸ĐŗĐŧĐĩĐŊŅ‚Đ¸Ņ‚Đĩ</string>
<string name="revanced_sb_general_time_without_sum_on">Đ”ŅŠĐģĐļиĐŊĐ°Ņ‚Đ° ĐŊа видĐĩĐžŅ‚Đž ĐąĐĩС Đ˛ŅĐ¸Ņ‡Đēи Ņ‡Đ°ŅŅ‚Đ¸ ĐŋĐžĐēаСаĐŊа в ҁĐēОйи Đ´Đž Ņ†ŅĐģĐ°Ņ‚Đ° Đ´ŅŠĐģĐļиĐŊа</string>
<string name="revanced_sb_general_time_without_sum_off">ĐĻŅĐģĐ°Ņ‚Đ° Đ´ŅŠĐģĐļиĐŊа ĐŊа видĐĩŅ‚Đž ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_sb_create_segment_category">ĐĄŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ĐŊОви Ņ‡Đ°ŅŅ‚Đ¸</string>
<string name="revanced_sb_enable_create_segment">ПоĐēаСваĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са ĐŊОва Ņ‡Đ°ŅŅ‚</string>
<string name="revanced_sb_enable_create_segment_sum_on">Đ‘ŅƒŅ‚ĐžĐŊа ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ Са ĐŊОва Ņ‡Đ°ŅŅ‚ ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_sb_enable_create_segment_sum_off">Đ‘ŅƒŅ‚ĐžĐŊа ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ Са ĐŊОва Ņ‡Đ°ŅŅ‚ ĐŊĐĩ ҁĐĩ ĐŋĐžĐēаСва</string>
<string name="revanced_sb_general_adjusting">ĐĐ°ŅŅ‚Ņ€ĐžĐšĐ˛Đ°ĐŊĐĩ ŅŅ‚ŅŠĐŋĐēа ĐŊа ĐŊĐžĐ˛Đ°Ņ‚Đ° Ņ‡Đ°ŅŅ‚</string>
<string name="revanced_sb_general_adjusting_sum">МиĐģĐ¸ŅĐĩĐē҃ĐŊĐ´Đ¸Ņ‚Đĩ ҁ ĐēĐžĐšŅ‚Đž ҁĐĩ ĐŋŅ€ĐĩĐŧĐĩŅŅ‚Đ˛Đ°Ņ‚ ĐąŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ Са ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēа ĐŋŅ€Đ¸ ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа Ņ‡Đ°ŅŅ‚</string>
<string name="revanced_sb_general_adjusting_invalid">ĐĄŅ‚ĐžĐšĐŊĐžŅŅ‚Ņ‚Đ° Ņ‚Ņ€ŅĐąĐ˛Đ° да Đĩ ĐŋĐžĐģĐžĐļĐ¸Ņ‚ĐĩĐģĐŊĐž Ņ‡Đ¸ŅĐģĐž</string>
<string name="revanced_sb_guidelines_preference_title">ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ ĐŊа Ņ€ŅŠĐēОвОдĐŊĐ¸Ņ‚Đĩ ĐģиĐŊии</string>
<string name="revanced_sb_guidelines_preference_sum">ĐŖĐēаСаĐŊĐ¸ŅŅ‚Đ° ŅŅŠĐ´ŅŠŅ€ĐļĐ°Ņ‚ ĐŋŅ€Đ°Đ˛Đ¸Đģа и ŅŅŠĐ˛ĐĩŅ‚Đ¸ Са ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ĐŊОви Ņ‡Đ°ŅŅ‚Đ¸</string>
<string name="revanced_sb_guidelines_popup_title">ĐĄĐģĐĩĐ´Đ˛Đ°ĐšŅ‚Đĩ ҃ĐēаСаĐŊĐ¸ŅŅ‚Đ°</string>
<string name="revanced_sb_guidelines_popup_content">ĐŸŅ€ĐžŅ‡ĐĩŅ‚ĐĩŅ‚Đĩ ҃ĐēаСаĐŊĐ¸ŅŅ‚Đ° ĐŊа SponsorBlock ĐŋŅ€Đĩди да ŅŅŠĐˇĐ´Đ°Đ´ĐĩŅ‚Đĩ ĐŊОви Ņ‡Đ°ŅŅ‚Đ¸</string>
<string name="revanced_sb_guidelines_popup_already_read">ВĐĩ҇Đĩ ĐŋŅ€ĐžŅ‡ĐĩŅ‚ĐžŅ…</string>
<string name="revanced_sb_guidelines_popup_open">ПоĐēаĐļи Đŧи</string>
<string name="revanced_sb_general">ĐžĐąŅ‰Đ¸</string>
<string name="revanced_sb_toast_on_connection_error_title">ПоĐēаСваĐŊĐĩ ĐŊа иСвĐĩŅŅ‚Đ¸Đĩ, аĐēĐž API ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ</string>
<string name="revanced_sb_toast_on_connection_error_summary_on">ПоĐēаСва ҁĐĩ иСвĐĩŅŅ‚Đ¸Đĩ, аĐēĐž SponsorBlock ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ</string>
<string name="revanced_sb_toast_on_connection_error_summary_off">ПоĐēаСва ҁĐĩ иСвĐĩŅŅ‚Đ¸Đĩ, аĐēĐž SponsorBlock ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ</string>
<string name="revanced_sb_general_skipcount">ĐŸŅ€ĐžŅĐģĐĩĐ´. ĐŊа ĐąŅ€ĐžŅ ĐŋŅ€ĐžĐŋ҃ҁĐēаĐŊĐ¸Ņ</string>
<string name="revanced_sb_general_skipcount_sum_on">ПоĐēаСва в ĐēĐģĐ°ŅĐ°Ņ†Đ¸ŅŅ‚Đ° ĐŊа SponsorBlock ĐēĐžĐģĐēĐž Đ˛Ņ€ĐĩĐŧĐĩ Đĩ ҁĐŋĐĩҁ҂ĐĩĐŊĐž. ĐĄŅŠĐžĐąŅ‰ĐĩĐŊиĐĩ ҁĐĩ иСĐŋŅ€Đ°Ņ‰Đ° ĐŋŅ€Đ¸ Đ˛ŅŅĐēа ĐŋŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚Đ° Ņ‡Đ°ŅŅ‚</string>
<string name="revanced_sb_general_skipcount_sum_off">ĐŸŅ€ĐžŅĐģĐĩĐ´. ĐŊа ĐąŅ€ĐžŅ ĐŋŅ€ĐžĐŋ҃ҁĐēаĐŊĐ¸Ņ Đĩ иСĐēĐģŅŽŅ‡ĐĩĐŊ</string>
<string name="revanced_sb_general_min_duration">МиĐŊиĐŧаĐģĐŊа ĐŋŅ€ĐžĐ´ŅŠĐģĐļĐ¸Ņ‚ĐĩĐģĐŊĐžŅŅ‚ ĐŊа ҁĐĩĐŗĐŧĐĩĐŊŅ‚Đ°</string>
<string name="revanced_sb_general_min_duration_sum">Đ§Đ°ŅŅ‚Đ¸, ĐŋĐž-ĐēŅ€Đ°Ņ‚Đēи ĐžŅ‚ Ņ‚Đ°ĐˇĐ¸ ŅŅ‚ĐžĐšĐŊĐžŅŅ‚ (в ҁĐĩĐē҃ĐŊди) ĐŊŅĐŧа да ĐąŅŠĐ´Đ°Ņ‚ ĐŋŅ€ĐžĐŋ҃ҁĐēаĐŊи иĐģи ĐŋĐžĐēаСваĐŊи</string>
<string name="revanced_sb_general_min_duration_invalid">НĐĩваĐģидĐŊа Đ˛Ņ€ĐĩĐŧĐĩŅ‚Ņ€Đ°ĐĩĐŊĐĩ</string>
<string name="revanced_sb_general_uuid">Đ’Đ°ŅˆĐ¸ŅŅ‚ ҃ĐŊиĐēаĐģĐĩĐŊ ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēи id</string>
<string name="revanced_sb_general_uuid_sum">ĐĸОва Ņ‚Ņ€ŅĐąĐ˛Đ° да ҁĐĩ Đ´ŅŠŅ€Đļи Ņ‚Đ°ĐšĐŊĐž. ĐĸĐž Đĩ ĐēĐ°Ņ‚Đž ĐŋĐ°Ņ€ĐžĐģа и ĐŊĐĩ Ņ‚Ņ€ŅĐąĐ˛Đ° да ҁĐĩ ҁĐŋОдĐĩĐģŅ ҁ ĐŊиĐēĐžĐŗĐž. АĐēĐž ĐŊŅĐēОК ĐŗĐž иĐŧа, Ņ‚Đž Ņ‚ĐžĐš ĐŧĐžĐļĐĩ да ҁĐĩ ĐŋŅ€ĐĩĐ´ŅŅ‚Đ°Đ˛Đ¸ вĐŧĐĩŅŅ‚Đž Đ˛Đ°Ņ</string>
<string name="revanced_sb_general_uuid_invalid">Đ›Đ¸Ņ‡ĐŊĐ¸ŅŅ‚ Id Ņ‚Ņ€ŅĐąĐ˛Đ° да Đĩ ҁ Đ´ŅŠĐģĐļиĐŊа ĐŋĐžĐŊĐĩ 30 СĐŊаĐēа</string>
<string name="revanced_sb_general_api_url">ĐŸŅ€ĐžĐŧŅĐŊа URL ĐŊа API</string>
<string name="revanced_sb_general_api_url_sum">ĐĐ´Ņ€ĐĩŅŅŠŅ‚, ĐēĐžĐšŅ‚Đž SponsorBlock иСĐŋĐžĐģСва Са ŅĐ˛ŅŠŅ€ĐˇĐ˛Đ°ĐŊĐĩ ĐēҊĐŧ ŅŅŠŅ€Đ˛ŅŠŅ€Đ°</string>
<string name="revanced_sb_api_url_reset">ĐŅƒĐģĐ¸Ņ€Đ°ĐŊĐĩ URL Đ°Đ´Ņ€ĐĩŅĐ° ĐŊа API</string>
<string name="revanced_sb_api_url_invalid">URL Đ°Đ´Ņ€ĐĩŅŅŠŅ‚ Đĩ ĐŊĐĩваĐģидĐĩĐŊ</string>
<string name="revanced_sb_api_url_changed">URL Đ°Đ´Ņ€ĐĩŅŅŠŅ‚ ĐŊа API Đĩ ĐŋŅ€ĐžĐŧĐĩĐŊĐĩĐŊ</string>
<string name="revanced_sb_settings_ie">ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи Са вĐŊĐ°ŅŅĐŊĐĩ и иСĐŊĐ°ŅŅĐŊĐĩ</string>
<string name="revanced_sb_settings_copy">КоĐŋĐ¸Ņ€Đ°ĐŊĐĩ</string>
<string name="revanced_sb_settings_ie_sum">Đ’Đ°ŅˆĐ°Ņ‚Đ° JSON ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Ņ ĐŊа SponsorBlock ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊа/ĐĩĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊа в ReVanced и Đ´Ņ€ŅƒĐŗĐ¸ ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€Đŧи ĐŊа SponsorBlock</string>
<string name="revanced_sb_settings_ie_sum_warning">Đ’Đ°ŅˆĐ°Ņ‚Đ° SponsorBlock JSON ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Ņ ĐēĐžŅŅ‚Đž ĐŧĐžĐļĐĩ да ҁĐĩ иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ°/ĐĩĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ° Đ´Đž ReVanced иĐģи Đ´Ņ€ŅƒĐŗĐ¸ ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€Đŧи ĐŋĐžĐģĐˇĐ˛Đ°Ņ‰Đ¸ SponsorBlock. ĐĸОва вĐēĐģŅŽŅ‡Đ˛Đ° Đ˛Đ°ŅˆĐ¸Ņ ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēи id. ĐĄĐŋОдĐĩĐģŅĐšŅ‚Đĩ Ņ‚ĐžĐ˛Đ° Ņ€Đ°ĐˇŅƒĐŧĐŊĐž</string>
<string name="revanced_sb_settings_import_successful">ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ ŅĐ° ҃ҁĐŋĐĩ҈ĐŊĐž Đ˛ŅŠŅŅ‚Đ°ĐŊОвĐĩĐŊи</string>
<string name="revanced_sb_settings_import_failed">НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž иĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ: %s</string>
<string name="revanced_sb_settings_export_failed">НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ĐĩĐēҁĐŋĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа %s</string>
<string name="revanced_sb_settings_revanced_export_user_id_warning">Đ’Đ°ŅˆĐ¸Ņ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŊа SponsorBlock ŅŅŠĐ´ŅŠŅ€ĐļĐ°Ņ‚ ĐģĐ¸Ņ‡ĐŊĐž Id.\n\nĐ’Đ°ŅˆĐĩŅ‚Đž Id Đĩ ĐēĐ°Ņ‚Đž ĐŋĐ°Ņ€ĐžĐģа и ĐŊĐĩ Ņ‚Ņ€ŅĐąĐ˛Đ° да ҁĐĩ ҁĐŋОдĐĩĐģŅ ҁ ĐŊиĐēĐžĐŗĐž\n</string>
<string name="revanced_sb_settings_revanced_export_user_id_warning_dismiss">НĐĩ ĐŋĐžĐēаСваК ĐžŅ‚ĐŊОвО</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>
<string name="revanced_sb_segments_selfpromo_sum">ПодобĐŊĐž ĐŊа „СĐŋĐžĐŊŅĐžŅ€â€œ, ҁ иСĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ ĐŊа ĐŊĐĩĐŋĐģĐ°Ņ‚ĐĩĐŊĐž иĐģи ŅĐ°ĐŧĐžŅ€ĐĩĐēĐģаĐŧа. ВĐēĐģŅŽŅ‡Đ˛Đ° Ņ€Đ°ĐˇĐ´ĐĩĐģи Са ŅŅ‚ĐžĐēи, Đ´Đ°Ņ€ĐĩĐŊĐ¸Ņ иĐģи иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Са Ņ‚ĐžĐ˛Đ° ҁ ĐēĐžĐŗĐž ŅĐ° ŅĐ¸ ŅŅŠŅ‚Ņ€ŅƒĐ´ĐŊĐ¸Ņ‡Đ¸Đģи</string>
<string name="revanced_sb_segments_interaction">НаĐŋĐžĐŧĐŊŅĐŊĐĩ Са Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ (айОĐŊĐ¸Ņ€Đ°ĐŊĐĩ)</string>
<string name="revanced_sb_segments_interaction_sum">ĐšŅ€Đ°Ņ‚ĐēĐž ĐŊаĐŋĐžĐŧĐŊŅĐŊĐĩ да Ņ…Đ°Ņ€ĐĩŅĐ°Ņ‚Đĩ, айОĐŊĐ¸Ņ€Đ°Ņ‚Đĩ иĐģи ĐŋĐžŅĐģĐĩĐ´Đ˛Đ°Ņ‚Đĩ в ҁҀĐĩĐ´Đ°Ņ‚Đ° ĐŊа ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩŅ‚Đž. АĐēĐž Đĩ Đ´ŅŠĐģĐŗĐž иĐģи Са ĐŊĐĩŅ‰Đž ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊĐž, вĐŧĐĩŅŅ‚Đž Ņ‚ĐžĐ˛Đ° Ņ‚Ņ€ŅĐąĐ˛Đ° да ĐąŅŠĐ´Đĩ ŅĐ°ĐŧĐžŅ€ĐĩĐēĐģаĐŧа</string>
<string name="revanced_sb_segments_highlight">АĐē҆ĐĩĐŊŅ‚Đ¸</string>
<string name="revanced_sb_segments_highlight_sum">Đ§Đ°ŅŅ‚Ņ‚Đ° ĐžŅ‚ видĐĩĐžŅ‚Đž ĐēĐžŅŅ‚Đž ĐŋОвĐĩ҇ĐĩŅ‚Đž Ņ…ĐžŅ€Đ° Ņ‚ŅŠŅ€ŅŅŅ‚</string>
<string name="revanced_sb_segments_intro">ĐŸĐ°ŅƒĐˇĐ° / ĐĐ°Ņ‡Đ°ĐģĐŊа аĐŊиĐŧĐ°Ņ†Đ¸Ņ</string>
<string name="revanced_sb_segments_intro_sum">ИĐŊŅ‚ĐĩŅ€Đ˛Đ°Đģ ĐąĐĩС Ņ€ĐĩаĐģĐŊĐž ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩ. МоĐļĐĩ да ĐąŅŠĐ´Đĩ ĐŋĐ°ŅƒĐˇĐ°, ŅŅ‚Đ°Ņ‚Đ¸Ņ‡ĐĩĐŊ ĐēĐ°Đ´ŅŠŅ€, ĐŋĐžĐ˛Ņ‚Đ°Ņ€ŅŅ‰Đ° ҁĐĩ аĐŊиĐŧĐ°Ņ†Đ¸Ņ. ĐĸОва ĐŊĐĩ Ņ‚Ņ€ŅĐąĐ˛Đ° да ҁĐĩ иСĐŋĐžĐģСва Са ĐŋŅ€ĐĩŅ…ĐžĐ´Đ¸, ŅŅŠĐ´ŅŠŅ€ĐļĐ°Ņ‰Đ¸ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ</string>
<string name="revanced_sb_segments_outro">ĐšĐ°Ņ€Ņ‚Đ¸ в ĐēŅ€Đ°Ņ/ĐŸĐžŅŅĐŊĐĩĐŊĐ¸Ņ</string>
<string name="revanced_sb_segments_outro_sum">ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ иĐģи ĐēĐžĐŗĐ°Ņ‚Đž ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ ĐēŅ€Đ°ĐšĐŊĐ¸Ņ‚Đĩ ĐēĐ°Ņ€Ņ‚Đ¸ ĐŊа YouTube. НĐĩ Са СаĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ ҁ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ</string>
<string name="revanced_sb_segments_preview">ĐšŅ€Đ°Ņ‚ŅŠĐē ĐŋŅ€ĐĩĐŗĐģĐĩĐ´/ĐžĐąĐžĐąŅ‰ĐĩĐŊиĐĩ</string>
<string name="revanced_sb_segments_preview_sum">КоĐģĐĩĐēŅ†Đ¸Ņ ĐžŅ‚ ĐēĐģиĐŋОвĐĩ, ĐēĐžĐ¸Ņ‚Đž ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ ĐēаĐēвО ĐŋŅ€ĐĩĐ´ŅŅ‚ĐžĐ¸ в Ņ‚ĐžĐˇĐ¸ видĐĩĐžĐēĐģиĐŋ иĐģи в Đ´Ņ€ŅƒĐŗĐ¸ видĐĩĐžĐēĐģиĐŋОвĐĩ ĐžŅ‚ ĐŋĐžŅ€ĐĩĐ´Đ¸Ņ†Đ°Ņ‚Đ°, ĐēŅŠĐ´ĐĩŅ‚Đž Ņ†ŅĐģĐ°Ņ‚Đ° иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ҁĐĩ ĐŋĐžĐ˛Ņ‚Đ°Ņ€Ņ ĐŋĐž-ĐēҊҁĐŊĐž Đ˛ŅŠĐ˛ видĐĩĐžĐēĐģиĐŋа</string>
<string name="revanced_sb_segments_filler">ĐŸŅŠĐģĐŊĐĩĐļ/ШĐĩĐŗĐ¸</string>
<string name="revanced_sb_segments_filler_sum">ĐĄŅ†ĐĩĐŊи Đ¸ĐˇĐ˛ŅŠĐŊ Ņ‚ĐĩĐŧĐ°Ņ‚Đ°, дОйавĐĩĐŊи ŅĐ°ĐŧĐž Са ĐŋҊĐģĐŊĐĩĐļ иĐģи Ņ…ŅƒĐŧĐžŅ€, ĐēĐžĐ¸Ņ‚Đž ĐŊĐĩ ŅĐ° ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸Đŧи Са Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ĐŊа ĐžŅĐŊОвĐŊĐžŅ‚Đž ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩ ĐŊа видĐĩĐžĐēĐģиĐŋа. ĐĸОва ĐŊĐĩ Ņ‚Ņ€ŅĐąĐ˛Đ° да вĐēĐģŅŽŅ‡Đ˛Đ° ҁĐĩĐŗĐŧĐĩĐŊŅ‚Đ¸, ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ŅŅ‰Đ¸ ĐēĐžĐŊŅ‚ĐĩĐēҁ҂ иĐģи ҁĐŋŅ€Đ°Đ˛ĐžŅ‡ĐŊи даĐŊĐŊи</string>
<string name="revanced_sb_segments_nomusic">ĐœŅƒĐˇĐ¸Đēа: Đ§Đ°ŅŅ‚ ĐąĐĩС ĐŧŅƒĐˇĐ¸Đēа</string>
<string name="revanced_sb_segments_nomusic_sum">За иСĐŋĐžĐģСваĐŊĐĩ ŅĐ°ĐŧĐž в ĐŧŅƒĐˇĐ¸ĐēаĐģĐŊи видĐĩĐžĐēĐģиĐŋОвĐĩ. ĐĸОва Ņ‚Ņ€ŅĐąĐ˛Đ° да ҁĐĩ иСĐŋĐžĐģСва ŅĐ°ĐŧĐž Са Ņ‡Đ°ŅŅ‚Đ¸ ĐžŅ‚ ĐŧŅƒĐˇĐ¸ĐēаĐģĐŊи видĐĩĐžĐēĐģиĐŋОвĐĩ, ĐēĐžĐ¸Ņ‚Đž вĐĩ҇Đĩ ĐŊĐĩ ŅĐ° ĐžĐąŅ…Đ˛Đ°ĐŊĐ°Ņ‚Đ¸ ĐžŅ‚ Đ´Ņ€ŅƒĐŗĐ° ĐēĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸Ņ</string>
<string name="revanced_sb_skip_button_compact">ĐŸŅ€ĐžĐŋ҃ҁĐŊи</string>
<string name="revanced_sb_skip_button_compact_highlight">АĐē҆ĐĩĐŊŅ‚Đ¸</string>
<string name="revanced_sb_skip_button_sponsor">ĐŸŅ€ĐžĐŋ҃ҁĐŊи ҁĐŋĐžĐŊŅĐžŅ€</string>
<string name="revanced_sb_skip_button_selfpromo">ĐŸŅ€ĐžĐŋ҃ҁĐŊи ĐŋŅ€ĐžĐŧĐžŅ†Đ¸Ņ</string>
<string name="revanced_sb_skip_button_interaction">ĐŸŅ€ĐžĐŋ҃ҁĐŊи ĐŋОдĐēаĐŊваĐŊĐĩ</string>
<string name="revanced_sb_skip_button_highlight">ĐŸŅ€ĐžĐŋ҃ҁĐŊи Đ´Đž аĐē҆ĐĩĐŊŅ‚Đ¸</string>
<string name="revanced_sb_skip_button_intro_beginning">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐĩŅ‚Đĩ Đ˛ŅŠĐ˛ĐĩĐ´ĐĩĐŊиĐĩŅ‚Đž</string>
<string name="revanced_sb_skip_button_intro_middle">ĐŸŅ€ĐžĐŋ҃ҁĐŊи ĐŋĐ°ŅƒĐˇĐ°</string>
<string name="revanced_sb_skip_button_intro_end">ĐŸŅ€ĐžĐŋ҃ҁĐŊи ĐŋĐ°ŅƒĐˇĐ°</string>
<string name="revanced_sb_skip_button_outro">ĐŸŅ€ĐžĐŋ҃ҁĐŊи СаĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ</string>
<string name="revanced_sb_skip_button_preview_beginning">ĐŸŅ€ĐžĐŋ҃ҁĐŊи ĐŋŅ€ĐĩĐŗĐģĐĩĐ´</string>
<string name="revanced_sb_skip_button_preview_middle">ĐŸŅ€ĐžĐŋ҃ҁĐŊи ĐŋŅ€ĐĩĐŗĐģĐĩĐ´</string>
<string name="revanced_sb_skip_button_preview_end">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐĩŅ‚Đĩ ĐžĐąĐžĐąŅ‰ĐĩĐŊиĐĩŅ‚Đž</string>
<string name="revanced_sb_skip_button_filler">ĐŸŅ€ĐžĐŋ҃ҁĐŊи ĐŋҊĐģĐŊĐĩĐļ</string>
<string name="revanced_sb_skip_button_nomusic">ĐŸŅ€ĐžĐŋ҃ҁĐŊи Ņ‡Đ°ŅŅ‚ ĐąĐĩС ĐŧŅƒĐˇĐ¸Đēа</string>
<string name="revanced_sb_skip_button_unsubmitted">ĐŸŅ€ĐžĐŋ҃ҁĐēаĐŊĐĩ ĐŊа ҁĐĩĐŗĐŧĐĩĐŊŅ‚</string>
<string name="revanced_sb_skipped_sponsor">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚ ҁĐŋĐžĐŊŅĐžŅ€</string>
<string name="revanced_sb_skipped_selfpromo">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚Đ° ŅĐ°ĐŧĐžŅ€ĐĩĐēĐģаĐŧа</string>
<string name="revanced_sb_skipped_interaction">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚Đž Đ´ĐžŅĐ°Đ´ĐŊĐž ĐŊаĐŋĐžĐŧĐŊŅĐŊĐĩ</string>
<string name="revanced_sb_skipped_highlight">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚Đž Đ´Đž аĐē҆ĐĩĐŊŅ‚</string>
<string name="revanced_sb_skipped_intro_beginning">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚Đž Đ˛ŅŠĐ˛ĐĩĐ´ĐĩĐŊиĐĩ</string>
<string name="revanced_sb_skipped_intro_middle">ĐŸŅ€ĐžĐŋ҃ҁĐŊи ĐŋĐ°ŅƒĐˇĐ¸</string>
<string name="revanced_sb_skipped_intro_end">ĐŸŅ€ĐžĐŋ҃ҁĐŊи ĐŋĐ°ŅƒĐˇĐ¸</string>
<string name="revanced_sb_skipped_outro">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚Đž СаĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ</string>
<string name="revanced_sb_skipped_preview_beginning">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚ ĐŋŅ€ĐĩĐŗĐģĐĩĐ´</string>
<string name="revanced_sb_skipped_preview_middle">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚ ĐŋŅ€ĐĩĐŗĐģĐĩĐ´</string>
<string name="revanced_sb_skipped_preview_end">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚Đž ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐĩĐŊиĐĩ</string>
<string name="revanced_sb_skipped_filler">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚ ĐŋҊĐģĐŊĐĩĐļ</string>
<string name="revanced_sb_skipped_nomusic">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚Đ° Ņ‡Đ°ŅŅ‚ ĐąĐĩС ĐŧŅƒĐˇĐ¸Đēа</string>
<string name="revanced_sb_skipped_unsubmitted">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚ ĐŊĐĩиСĐŋŅ€Đ°Ņ‚ĐĩĐŊ ҁĐĩĐŗĐŧĐĩĐŊŅ‚</string>
<string name="revanced_sb_skipped_multiple_segments">ĐŸŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚Đ¸ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž Ņ‡Đ°ŅŅ‚Đ¸</string>
<string name="revanced_sb_skip_automatically">Да ҁĐĩ ĐŋŅ€ĐĩҁĐēĐ°Ņ‡Đ° ĐžŅ‚ ŅĐ°ĐŧĐž ҁĐĩĐąĐĩ ŅĐ¸</string>
<string name="revanced_sb_skip_automatically_once">ĐĐ˛Ņ‚. ĐŋŅ€ĐžĐŋ҃ҁĐēаĐŊĐĩ вĐĩĐ´ĐŊҊĐļ</string>
<string name="revanced_sb_skip_showbutton">ПоĐēаСваК ĐąŅƒŅ‚ĐžĐŊ Са ĐŋŅ€ĐžĐŋ҃ҁĐēаĐŊĐĩ</string>
<string name="revanced_sb_skip_seekbaronly">ПоĐēаСв. в ĐģĐĩĐŊŅ‚Đ°Ņ‚Đ° Са Đ˛Ņ€ĐĩĐŧĐĩ</string>
<string name="revanced_sb_skip_ignore">ИСĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ</string>
<string name="revanced_sb_submit_failed_invalid">НĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ иСĐŋŅ€Đ°Ņ‚Đ¸ ҁĐĩĐŗĐŧĐĩĐŊŅ‚: %s</string>
<string name="revanced_sb_submit_failed_timeout">SponsorBlock Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ Ņ€Đ°ĐąĐžŅ‚Đ¸</string>
<string name="revanced_sb_submit_failed_unknown_error">НĐĩ ĐŧĐžĐŗĐ°Ņ‚ да ҁĐĩ иСĐŋŅ€Đ°Ņ‚ŅŅ‚ ŅĐ¸ĐŗĐŧĐĩĐŊŅ‚Đ¸: (ŅŅ‚Đ°Ņ‚ŅƒŅ:%1$d %2$s)</string>
<string name="revanced_sb_submit_failed_rate_limit">НĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ иСĐŋŅ€Đ°Ņ‚Đ¸ Ņ‡Đ°ŅŅ‚Ņ‚Đ°.\nĐ‘Ņ€ĐžŅŅ‚ Đĩ ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊ (ĐĸĐ˛ŅŠŅ€Đ´Đĩ ĐŧĐŊĐžĐŗĐž ĐžŅ‚ ĐĩдиĐŊ и ŅŅŠŅ‰ ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģ, IP)</string>
<string name="revanced_sb_submit_failed_forbidden">НĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ иСĐŋŅ€Đ°Ņ‚Đ¸ Ņ‡Đ°ŅŅ‚Ņ‚Đ°: %s</string>
<string name="revanced_sb_submit_failed_duplicate">НĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ иСĐŋŅ€Đ°Ņ‚Đ¸ Ņ‡Đ°ŅŅ‚Ņ‚Đ°.\nВĐĩ҇Đĩ ŅŅŠŅ‰ĐĩŅŅ‚Đ˛ŅƒĐ˛Đ°</string>
<string name="revanced_sb_submit_succeeded">Đ§Đ°ŅŅ‚Ņ‚Đ° Đĩ иСĐŋŅ€Đ°Ņ‚ĐĩĐŊа ҃ҁĐŋĐĩ҈ĐŊĐž</string>
<!-- Toast shown if network connection times out. Translations of this should not be longer than the original English or the text can be clipped and not entirely shown. -->
<string name="revanced_sb_sponsorblock_connection_failure_timeout">SponsorBlock Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ (API timed out)</string>
<string name="revanced_sb_sponsorblock_connection_failure_status">SponsorBlock Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ (status %d)</string>
<string name="revanced_sb_sponsorblock_connection_failure_generic">SponsorBlock Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ</string>
<string name="revanced_sb_vote_failed_timeout">НĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ ĐŗĐģĐ°ŅŅƒĐ˛Đ° Са ҁĐĩĐŗĐŧĐĩĐŊŅ‚ (API timed out)</string>
<string name="revanced_sb_vote_failed_unknown_error">НĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ ĐŗĐģĐ°ŅŅƒĐ˛Đ° Са Ņ‡Đ°ŅŅ‚Đ¸Ņ‚Đĩ: (ŅŅ‚Đ°Ņ‚ŅƒŅ: %1$d %2$s)</string>
<string name="revanced_sb_vote_failed_forbidden">НĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ ĐŗĐģĐ°ŅŅƒĐ˛Đ° Са Ņ‡Đ°ŅŅ‚: %s</string>
<string name="revanced_sb_vote_upvote">ПоĐģĐžĐļĐ¸Ņ‚ĐĩĐģĐĩĐŊ Đ˛ĐžŅ‚</string>
<string name="revanced_sb_vote_downvote">ĐžŅ‚Ņ€Đ¸Ņ†Đ°Ņ‚ĐĩĐģĐĩĐŊ Đ˛ĐžŅ‚</string>
<string name="revanced_sb_vote_category">ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐēĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸ŅŅ‚Đ°</string>
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<string name="revanced_sb_vote_no_segments">ĐŅĐŧа ҁĐĩĐŗĐŧĐĩĐŊŅ‚Đ¸, Са ĐēĐžĐ¸Ņ‚Đž да ĐŗĐģĐ°ŅŅƒĐ˛Đ°Ņ‚Đĩ</string>
<string name="revanced_sb_new_segment_choose_category">ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐēĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸Ņ ҁĐĩĐŗĐŧĐĩĐŊŅ‚</string>
<string name="revanced_sb_new_segment_disabled_category">ĐšĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸ŅŅ‚Đ° Đĩ иСĐēĐģ. в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ. ВĐēĐģ. Ņ Са да ĐŧĐžĐļĐĩŅ‚Đĩ да иСĐŋŅ€Đ°Ņ‚Đ¸Ņ‚Đĩ.</string>
<string name="revanced_sb_new_segment_title">Нова Ņ‡Đ°ŅŅ‚ в SponsorBlock</string>
<string name="revanced_sb_new_segment_mark_time_as_question">ЗадаваĐŊĐĩ ĐŊа %s ĐēĐ°Ņ‚Đž ĐŊĐ°Ņ‡Đ°ĐģĐž иĐģи ĐēŅ€Đ°Đš ĐŊа ĐŊОв Ņ€Đ°ĐˇĐ´ĐĩĐģ?</string>
<string name="revanced_sb_new_segment_mark_start">ĐŊĐ°Ņ‡Đ°ĐģĐž</string>
<string name="revanced_sb_new_segment_mark_end">ĐēŅ€Đ°Đš</string>
<string name="revanced_sb_new_segment_now">ҁĐĩĐŗĐ°</string>
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<string name="revanced_sb_new_segment_time_start">Đ§Đ°ŅŅ‚Ņ‚Đ° СаĐŋĐžŅ‡Đ˛Đ° ĐžŅ‚</string>
<string name="revanced_sb_new_segment_time_end">Đ§Đ°ŅŅ‚Ņ‚Đ° ŅĐ˛ŅŠŅ€ŅˆĐ˛Đ° Đ´Đž</string>
<string name="revanced_sb_new_segment_confirm_title">Đ’Ņ€ĐĩĐŧĐĩĐŊĐ°Ņ‚Đ° Ņ‚ĐžŅ‡ĐŊи Đģи ŅĐ°?</string>
<string name="revanced_sb_new_segment_confirm_content">ĐĄĐĩĐŗĐŧĐĩĐŊŅ‚ŅŠŅ‚ ĐŋŅ€ĐžĐ´ŅŠĐģĐļава ĐžŅ‚\n\n%1$s\nĐ´Đž\n%2$s\n\n(%3$s)\n\nĐ“ĐžŅ‚ĐžĐ˛ Đģи Đĩ Са иСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ?</string>
<string name="revanced_sb_new_segment_start_is_before_end">ĐĐ°Ņ‡Đ°ĐģĐžŅ‚Đž Ņ‚Ņ€ŅĐąĐ˛Đ° да ĐąŅŠĐ´Đĩ ĐŋŅ€Đĩди ĐēŅ€Đ°Ņ</string>
<string name="revanced_sb_new_segment_mark_locations_first">ĐŸŅŠŅ€Đ˛Đž ĐŧĐ°Ņ€ĐēĐ¸Ņ€Đ°ĐšŅ‚Đĩ двĐĩ ĐŧĐĩŅŅ‚Đ° в ĐģĐĩĐŊŅ‚Đ°Ņ‚Đ° Са Đ˛Ņ€ĐĩĐŧĐĩŅ‚Đž</string>
<string name="revanced_sb_new_segment_preview_segment_first">ĐŸŅ€ĐĩĐŗĐģĐĩĐ´ и ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēа ĐŊа Ņ‡Đ°ŅŅ‚Ņ‚Đ° Са ĐŊĐžŅ€ĐŧаĐģĐŊĐž ĐŋŅ€ĐžĐŋ҃ҁĐēаĐŊĐĩ</string>
<string name="revanced_sb_new_segment_edit_by_hand_title">Đ ŅŠŅ‡ĐŊĐž Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ˛Ņ€ĐĩĐŧĐĩĐŊĐ°Ņ‚Đ° ĐŊа Ņ‡Đ°ŅŅ‚Ņ‚Đ°</string>
<string name="revanced_sb_new_segment_edit_by_hand_content">ЖĐĩĐģаĐĩŅ‚Đĩ Đģи да Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°Ņ‚Đĩ Đ˛Ņ€ĐĩĐŧĐĩĐŊĐ°Ņ‚Đ° Са ĐŊĐ°Ņ‡Đ°ĐģĐž иĐģи ĐēŅ€Đ°Đš ĐŊа Ņ‡Đ°ŅŅ‚Ņ‚Đ°?</string>
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">ЗададĐĩĐŊĐž Đĩ ĐŊĐĩваĐģидĐŊĐž Đ˛Ņ€ĐĩĐŧĐĩ</string>
<string name="revanced_sb_stats">ĐĄŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đēа</string>
<!-- Shown in the settings preferences, and translations can be any text length. -->
<string name="revanced_sb_stats_connection_failure">ĐĄŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸ĐēĐ°Ņ‚Đ° Đĩ Đ˛Ņ€Đ°ĐŧĐĩĐŊĐŊĐž ĐŊĐĩĐ´ĐžŅŅ‚ŅŠĐŋĐŊа (API ĐŊĐĩ Ņ€Đ°ĐąĐžŅ‚Đ¸)</string>
<string name="revanced_sb_stats_loading">Đ—Đ°Ņ€ĐĩĐļдаĐŊĐĩ...</string>
<string name="revanced_sb_stats_sb_disabled">SponsorBlock Đĩ иСĐēĐģŅŽŅ‡ĐĩĐŊĐž</string>
<string name="revanced_sb_stats_username">Đ’Đ°ŅˆĐĩŅ‚Đž ĐŋĐžŅ‚Ņ€ĐĩĐą. иĐŧĐĩ: &lt;b&gt;%s&lt;/b&gt;</string>
<string name="revanced_sb_stats_username_change">ДоĐēĐžŅĐŊĐĩŅ‚Đĩ Са ĐŋŅ€ĐžĐŧŅĐŊа ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēĐžŅ‚Đž иĐŧĐĩ</string>
<string name="revanced_sb_stats_username_change_unknown_error">НĐĩ ĐŧĐžĐļĐĩ да ҁĐĩ ĐŋŅ€ĐžĐŧĐĩĐŊи ĐŋĐžŅ‚Ņ€ĐĩĐą. иĐŧĐĩ: ĐĄŅŠŅŅ‚ĐžŅĐŊиĐĩ: %1$d%2$s</string>
<string name="revanced_sb_stats_username_changed">ĐŸĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēĐžŅ‚Đž иĐŧĐĩ Đĩ ҃ҁĐŋĐĩ҈ĐŊĐž ĐŋŅ€ĐžĐŧĐĩĐŊĐĩĐŊĐž</string>
<string name="revanced_sb_stats_reputation">Đ ĐĩĐŋŅƒŅ‚Đ°Ņ†Đ¸ŅŅ‚Đ° ви Đĩ &lt;b&gt;%.2f&lt;/b&gt;</string>
<string name="revanced_sb_stats_submissions">ĐĄŅŠĐˇĐ´Đ°Đ´ĐžŅ…Ņ‚Đĩ &lt;b&gt;%s&lt;/b&gt; Ņ‡Đ°ŅŅ‚Đ¸</string>
<string name="revanced_sb_stats_saved_zero">SponsorBlock ĐēĐģĐ°ŅĐ°Ņ†Đ¸Ņ</string>
<string name="revanced_sb_stats_saved">ĐĄĐŋĐ°ŅĐ¸Ņ…Ņ‚Đĩ Ņ…ĐžŅ€Đ°Ņ‚Đ° ĐžŅ‚ &lt;b&gt;%s&lt;/b&gt; Ņ‡Đ°ŅŅ‚Đ¸</string>
<string name="revanced_sb_stats_saved_sum_zero">ДоĐēĐžŅĐŊĐĩŅ‚Đĩ Са да Đ˛Đ¸Đ´Đ¸Ņ‚Đĩ ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸ĐēĐ°Ņ‚Đ° и Ņ‚ĐĩСи Đ´ĐžĐŋŅ€Đ¸ĐŊĐĩҁĐģи ĐŊаК-ĐŧĐŊĐžĐŗĐž</string>
<string name="revanced_sb_stats_saved_sum">ĐĸОва Đĩ &lt;b&gt;%s&lt;/b&gt; ĐžŅ‚ ĐļĐ¸Đ˛ĐžŅ‚Đ° иĐŧ.&lt;br&gt;ĐŠŅ€Đ°ĐēĐŊĐĩŅ‚Đĩ, Са да Đ˛Đ¸Đ´Đ¸Ņ‚Đĩ ĐēĐģĐ°ŅĐ°Ņ†Đ¸ŅŅ‚Đ°</string>
<string name="revanced_sb_stats_self_saved">ĐŸŅ€ĐžĐŋ҃ҁĐŊаĐģи ҁ҂Đĩ &lt;b&gt;%s&lt;/b&gt; Ņ‡Đ°ŅŅ‚Đ¸</string>
<string name="revanced_sb_stats_self_saved_sum">ĐĸОва Đĩ &lt;b&gt;%s&lt;/b&gt;</string>
<string name="revanced_sb_stats_self_saved_reset_title">ĐŅƒĐģĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐąŅ€ĐžŅŅ‡Đ° ĐŊа ĐŋŅ€ĐžĐŋ҃ҁĐŊĐ°Ņ‚Đ¸ Ņ‡Đ°ŅŅ‚Đ¸?</string>
<string name="revanced_sb_stats_saved_hour_format">%1$s Ņ‡Đ°ŅĐžĐ˛Đĩ %2$s ĐŧиĐŊŅƒŅ‚Đ¸</string>
<string name="revanced_sb_stats_saved_minute_format">%1$s ĐŧиĐŊŅƒŅ‚Đ¸ %2$s ҁĐĩĐē҃ĐŊди</string>
<string name="revanced_sb_stats_saved_second_format">%s ҁĐĩĐē҃ĐŊди</string>
<string name="revanced_sb_color_dot_label">ĐĻĐ˛ŅŅ‚:</string>
<string name="revanced_sb_color_changed">ĐĻвĐĩŅ‚ŅŠŅ‚ Đĩ ĐŋŅ€ĐžĐŧĐĩĐŊĐĩĐŊ</string>
<string name="revanced_sb_color_reset">Đ’ŅŠĐˇŅŅ‚Đ°ĐŊОви Ņ†Đ˛ĐĩŅ‚Đ°</string>
<string name="revanced_sb_color_invalid">НĐĩваĐģидĐŊа ŅŅ‚ĐžĐšĐŊĐžŅŅ‚ Са Ņ†Đ˛ĐĩŅ‚Đ°</string>
<string name="revanced_sb_reset_color">Đ’ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ ĐŊа Ņ†Đ˛ŅŅ‚</string>
<string name="revanced_sb_reset">ĐŅƒĐģĐ¸Ņ€Đ°ĐŊĐĩ</string>
<string name="revanced_sb_about">ĐžŅ‚ĐŊĐžŅĐŊĐž</string>
<string name="revanced_sb_about_api_sum">ДаĐŊĐŊĐ¸Ņ‚Đĩ ŅĐ° ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐĩĐŊи ĐžŅ‚ SponsorBlock API. ДоĐēĐžŅĐŊĐĩŅ‚Đĩ Ņ‚ŅƒĐē Са ĐŋОвĐĩ҇Đĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ и Đ¸ĐˇŅ‚ĐĩĐŗĐģĐ¸ŅĐŊĐ¸Ņ</string>
</patch>
<patch id="layout.spoofappversion.SpoofAppVersionPatch">
<string name="revanced_spoof_app_version_title">ПодĐģŅŠĐŗĐ˛Đ°ĐŊĐĩ Са вĐĩŅ€ŅĐ¸ŅŅ‚Đ° ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž</string>
<string name="revanced_spoof_app_version_summary_on">ПодĐŋŅ€Đ°Đ˛ĐĩĐŊа вĐĩŅ€ŅĐ¸Ņ</string>
<string name="revanced_spoof_app_version_summary_off">НĐĩ ĐŋОдĐŋŅ€Đ°Đ˛ĐĩĐŊа вĐĩŅ€ŅĐ¸Ņ</string>
<string name="revanced_spoof_app_version_user_dialog_message">ВĐĩŅ€ŅĐ¸ŅŅ‚Đ° ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž YouTube ҉Đĩ ĐąŅŠĐ´Đĩ ĐŋŅ€ĐžĐŧĐĩĐŊĐĩĐŊа ĐŊа ĐŋĐž-ŅŅ‚Đ°Ņ€Đ°.\n\nĐĸОва ҉Đĩ ĐŋŅ€ĐžĐŧĐĩĐŊи Đ˛ŅŠĐŊ҈ĐŊĐ¸Ņ вид и Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸Ņ‚Đĩ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž.\n\nĐŊĐž аĐēĐž ĐŋĐž-ĐēҊҁĐŊĐž ҁĐĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°, ҁĐĩ ĐŋŅ€ĐĩĐŋĐžŅ€ŅŠŅ‡Đ˛Đ° да Đ¸ĐˇŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đĩ даĐŊĐŊĐ¸Ņ‚Đĩ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž, Са да иСйĐĩĐŗĐŊĐĩŅ‚Đĩ ĐŗŅ€Đĩ҈Đēи в ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēĐ¸Ņ иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ.</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">ПодĐģŅŠĐŗĐ˛Đ°ĐŊĐĩ Са вĐĩŅ€ŅĐ¸ŅŅ‚Đ° ĐŊа</string>
<!-- 'RYD' is 'Return YouTube Dislike' -->
<string name="revanced_spoof_app_version_target_entry_1">18.33.40 - Đ’ŅŠĐˇŅŅ‚Đ°ĐŊОвĐĩŅ‚Đĩ RYD в Ņ€ĐĩĐļиĐŧ „иĐŊĐēĐžĐŗĐŊĐ¸Ņ‚Đžâ€œ ĐŊа Shorts</string>
<string name="revanced_spoof_app_version_target_entry_2">18.20.39 - Đ’ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ ĐŊа видĐĩĐž ҁĐēĐžŅ€ĐžŅŅ‚ &amp; в ĐŧĐĩĐŊŅŽŅ‚Đž Са ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž</string>
<string name="revanced_spoof_app_version_target_entry_3">18.09.39 - Đ’ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ ĐŊа Ņ‚Đ°Đą \"БибĐģĐ¸ĐžŅ‚ĐĩĐēа\"</string>
<string name="revanced_spoof_app_version_target_entry_4">17.41.37 - Đ’Ņ€ŅŠŅ‰Đ°ĐŊĐĩ ĐŊа ҁĐĩĐēŅ†Đ¸ŅŅ‚Đ° ҁ ĐŋĐģĐĩĐšĐģĐ¸ŅŅ‚Đ° ĐēҊĐŧ ŅŅ‚Đ°Ņ€Đ¸Ņ ŅŅ‚Đ¸Đģ</string>
<string name="revanced_spoof_app_version_target_entry_5">17.33.42 - Đ’ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛ŅĐ˛Đ° ŅŅ‚Đ°Ņ€Đ¸Ņ Đ¸ĐˇĐŗĐģĐĩĐ´</string>
</patch>
<patch id="layout.startpage.ChangeStartPagePatch">
<string name="revanced_start_page_title">Задай ĐŊĐ°Ņ‡Đ°ĐģĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°</string>
<string name="revanced_start_page_entry_0">По ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ</string>
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
<string name="revanced_start_page_entry_1">ĐĐ°Ņ‡Đ°ĐģĐž</string>
<string name="revanced_start_page_entry_2">ĐĸŅŠŅ€ŅĐĩĐŊĐĩ</string>
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the subscriptions tab. -->
<string name="revanced_start_page_entry_3">АйОĐŊаĐŧĐĩĐŊŅ‚Đ¸</string>
<string name="revanced_start_page_entry_4">Đ Đ°ĐˇĐŗĐģĐĩĐ´Đ°ĐšŅ‚Đĩ</string>
<string name="revanced_start_page_entry_5">Shorts</string>
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (library) tab. -->
<string name="revanced_start_page_entry_6">РаСдĐĩĐģ \"ВиĐĩ\"</string>
<string name="revanced_start_page_entry_7">ĐĨĐ°Ņ€ĐĩŅĐ°ĐŊи видĐĩа</string>
<!-- 'History' should be translated using the same localized wording YouTube displays for the 'history' section in the 'You' tab. -->
<string name="revanced_start_page_entry_8">Đ˜ŅŅ‚ĐžŅ€Đ¸Ņ</string>
<string name="revanced_start_page_entry_9">ПоĐŋ҃ĐģŅŅ€ĐŊи</string>
</patch>
<patch id="layout.startupshortsreset.DisableResumingShortsOnStartupPatch">
<string name="revanced_disable_resuming_shorts_player_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Shorts ĐŋĐģĐĩĐšŅŠŅ€Đ° ĐŋŅ€Đ¸ ŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ</string>
<string name="revanced_disable_resuming_shorts_player_summary_on">Shorts ĐŋĐģĐĩĐšŅŠŅ€Đ° ĐŋŅ€Đ¸ ŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_disable_resuming_shorts_player_summary_off">Shorts ĐŋĐģĐĩĐšŅŠŅ€Đ° ĐŋŅ€Đ¸ ŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž ҁĐĩ ĐŋĐžĐēаСва</string>
</patch>
<patch id="layout.tablet.EnableTabletLayoutPatch">
<string name="revanced_tablet_layout_title">ВĐēĐģŅŽŅ‡Đ¸ Ņ€ĐĩĐļиĐŧ Са Ņ‚Đ°ĐąĐģĐĩŅ‚</string>
<string name="revanced_tablet_layout_summary_on">Đ ĐĩĐļиĐŧ Са Ņ‚Đ°ĐąĐģĐĩŅ‚ Đĩ вĐēĐģ.</string>
<string name="revanced_tablet_layout_summary_off">Đ ĐĩĐļиĐŧ Са Ņ‚Đ°ĐąĐģĐĩŅ‚ Đĩ иСĐēĐģ.</string>
<string name="revanced_tablet_layout_user_dialog_message">ĐŸŅƒĐąĐģиĐēĐ°Ņ†Đ¸Đ¸Ņ‚Đĩ в ĐžĐąŅ‰ĐŊĐžŅŅ‚Ņ‚Đ° ĐŊĐĩ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ ĐŊа ĐžŅ„ĐžŅ€ĐŧĐģĐĩĐŊĐ¸Ņ Са Ņ‚Đ°ĐąĐģĐĩŅ‚</string>
</patch>
<patch id="layout.miniplayer.MiniplayerPatch">
<string name="revanced_miniplayer_screen_title">МиĐŊиĐŧĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ ĐĩĐēŅ€Đ°ĐŊ Са Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩ</string>
<string name="revanced_miniplayer_screen_summary">ĐŸŅ€ĐžĐŧĐĩĐŊĐĩŅ‚Đĩ ŅŅ‚Đ¸Đģа ĐŊа ĐŧиĐŊиĐŧĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐ¸Ņ ĐĩĐēŅ€Đ°ĐŊ Са Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩ</string>
<string name="revanced_miniplayer_type_title">МиĐŊиĐŧĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ Ņ‚Đ¸Đŋ ĐĩĐēŅ€Đ°ĐŊ Са ĐŗĐģĐĩдаĐŊĐĩ</string>
<string name="revanced_miniplayer_type_entry_1">ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģ</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>
<string name="revanced_miniplayer_type_entry_6">МодĐĩŅ€ĐĩĐŊ 3</string>
<string name="revanced_miniplayer_hide_expand_close_title">Đ‘ŅƒŅ‚ĐžĐŊи Са Ņ€Đ°ĐˇŅˆĐ¸Ņ€ŅĐ˛Đ°ĐŊĐĩ и ŅĐ˛Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐĩĐēŅ€Đ°ĐŊа</string>
<string name="revanced_miniplayer_hide_expand_close_summary_on">ĐĄĐēŅ€Đ¸Ņ‚.\n(ĐŋĐģŅŠĐˇĐŊĐĩŅ‚Đĩ ĐŧиĐŊиĐŧĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐ¸Ņ ĐĩĐēŅ€Đ°ĐŊ ĐŊа ĐŋĐģĐĩĐšŅŠŅ€Đ°, Са да Ņ€Đ°ĐˇŅˆĐ¸Ņ€Đ¸Ņ‚Đĩ иĐģи ĐˇĐ°Ņ‚Đ˛ĐžŅ€Đ¸Ņ‚Đĩ видĐĩĐžĐēĐģиĐŋа)</string>
<string name="revanced_miniplayer_hide_expand_close_summary_off">Đ‘ŅƒŅ‚ĐžĐŊи Са Ņ€Đ°ĐˇŅˆĐ¸Ņ€ŅĐ˛Đ°ĐŊĐĩ и ŅĐ˛Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐĩĐēŅ€Đ°ĐŊа ŅĐ° видиĐŧи</string>
<string name="revanced_miniplayer_hide_subtext_title">ЕĐēŅ€Đ°ĐŊĐŊи Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Đĩ, ĐĩŅ‚Đ¸ĐēĐĩŅ‚Đ¸</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">ĐĄĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">ПоĐēĐ°ĐˇĐ˛Đ°Ņ‚ ҁĐĩ</string>
<string name="revanced_miniplayer_hide_rewind_forward_title">Đ‘ŅƒŅ‚ĐžĐŊи Са ĐŊаĐŋŅ€ĐĩĐ´ и ĐŊаСад</string>
<string name="revanced_miniplayer_hide_rewind_forward_summary_on">Đ‘ŅƒŅ‚ĐžĐŊи Са ĐŊаĐŋŅ€ĐĩĐ´ и ĐŊаСад ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_miniplayer_hide_rewind_forward_summary_off">Đ‘ŅƒŅ‚ĐžĐŊи Са ĐŊаĐŋŅ€ĐĩĐ´ и ĐŊаСад ŅĐ° ĐŋĐžĐēаСаĐŊи</string>
<string name="revanced_miniplayer_opacity_title">ĐŸŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐžŅŅ‚ ĐŊа ĐŧĐĩĐŊŅŽŅ‚Đ°Ņ‚Đ°</string>
<string name="revanced_miniplayer_opacity_summary">ĐĄŅ‚ĐžĐšĐŊĐžŅŅ‚ ĐŊа ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐžŅŅ‚ ĐŧĐĩĐļĐ´Ņƒ 0-100, ĐēŅŠĐ´ĐĩŅ‚Đž 0 Đĩ ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐž</string>
<string name="revanced_miniplayer_opacity_invalid_toast">ĐŸŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐžŅŅ‚Ņ‚Đ° ĐŊа ĐŧĐĩĐŊŅŽŅ‚Đž Ņ‚Ņ€ŅĐąĐ˛Đ° да ĐąŅŠĐ´Đĩ ĐŧĐĩĐļĐ´Ņƒ 0-100</string>
</patch>
<patch id="layout.theme.ThemeBytecodePatch">
<string name="revanced_gradient_loading_screen_title">ФОĐŊ ĐŊа ĐĩĐēŅ€Đ°ĐŊа ĐŋŅ€Đ¸ ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа видĐĩĐž</string>
<string name="revanced_gradient_loading_screen_summary_on">ЕĐēŅ€Đ°ĐŊŅŠŅ‚ Са ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ҉Đĩ иĐŧа ĐŗŅ€Đ°Đ´Đ¸ĐĩĐŊŅ‚ĐĩĐŊ Ņ„ĐžĐŊ</string>
<string name="revanced_gradient_loading_screen_summary_off">ЕĐēŅ€Đ°ĐŊŅŠŅ‚ Са ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ҉Đĩ иĐŧа ĐŋĐģŅŠŅ‚ĐĩĐŊ Ņ„ĐžĐŊ</string>
</patch>
<patch id="layout.theme.ThemeResourcePatch">
<string name="revanced_seekbar_custom_color_title">ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа Ņ†Đ˛ĐĩŅ‚Đ° ĐŊа иĐŊдиĐēĐ°Ņ‚ĐžŅ€Đ° Са Đ˛Ņ€ĐĩĐŧĐĩ</string>
<string name="revanced_seekbar_custom_color_summary_on">ПоĐēаСва ҁĐĩ ĐŋĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ Ņ†Đ˛ŅŅ‚ ĐŊа ĐģĐĩĐŊŅ‚Đ°Ņ‚Đ° Са ĐŊаĐŋŅ€ĐĩĐ´ŅŠĐē</string>
<string name="revanced_seekbar_custom_color_summary_off">ПоĐēаСва ҁĐĩ ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģĐŊĐ¸Ņ Ņ†Đ˛ŅŅ‚ ĐŊа ĐģĐĩĐŊŅ‚Đ°Ņ‚Đ° Са ĐŊаĐŋŅ€ĐĩĐ´ŅŠĐē</string>
<string name="revanced_seekbar_custom_color_value_title">ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ Ņ†Đ˛ŅŅ‚ ĐŊа ĐģĐĩĐŊŅ‚Đ°Ņ‚Đ° Са ĐŊаĐŋŅ€ĐĩĐ´ŅŠĐē</string>
<string name="revanced_seekbar_custom_color_value_summary">ĐĻвĐĩŅ‚ĐžĐ˛Đĩ ĐŊа ĐģĐĩĐŊŅ‚Đ°Ņ‚Đ° Са ĐŊаĐŋŅ€ĐĩĐ´ŅŠĐē</string>
<string name="revanced_seekbar_custom_color_invalid">НĐĩваĐģидĐŊа ŅŅ‚ĐžĐšĐŊĐžŅŅ‚ ĐŊа Ņ†Đ˛ĐĩŅ‚Đ°. ИСĐŋĐžĐģСвК ŅŅ‚ĐžĐšĐŊĐžŅŅ‚ ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ.</string>
</patch>
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
<string name="revanced_bypass_image_region_restrictions_title">ĐŸŅ€ĐĩҁĐēĐžŅ‡ĐĩŅ‚Đĩ ĐˇĐ°ĐąŅ€Đ°ĐŊĐ°Ņ‚Đ° Са ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ</string>
<string name="revanced_bypass_image_region_restrictions_summary_on">ДоĐŧĐĩĐšĐŊŅŠŅ‚ yt4.ggpht.com ҁĐĩ иСĐŋĐžĐģСва Са ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ</string>
<string name="revanced_bypass_image_region_restrictions_summary_off">ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģĐŊĐ¸ŅŅ‚ Đ´ĐžĐŧĐĩĐšĐŊ ҁĐĩ иСĐŋĐžĐģСва Са ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ\n\nАĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ĐŊа Ņ‚Đ°ĐˇĐ¸ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēа ĐŧĐžĐļĐĩ да ĐēĐžŅ€Đ¸ĐŗĐ¸Ņ€Đ° ĐˇĐ°Ņ€ĐĩĐļдаĐŊĐĩŅ‚Đž ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ, ĐēĐžĐ¸Ņ‚Đž ŅĐ° ĐąĐģĐžĐēĐ¸Ņ€Đ°ĐŊи в ĐŊŅĐēОи Ņ€ĐĩĐŗĐ¸ĐžĐŊи</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">РаСдĐĩĐģ ĐĐ°Ņ‡Đ°ĐģĐž</string>
<!-- 'Subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
<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">ПĐģĐĩĐšĐģĐ¸ŅŅ‚Đ¸, ĐŋŅ€ĐĩĐ´ĐģĐžĐļĐĩĐŊĐ¸Ņ</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_4">НĐĩĐŋОдвиĐļĐŊи ĐēĐ°Đ´Ņ€Đ¸</string>
<string name="revanced_alt_thumbnail_dearrow_about_summary">DeArrow ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛Ņ ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸ ĐŊа ĐŋŅƒĐąĐģиĐēĐ°Ņ‚Đ° Са видĐĩĐžĐēĐģиĐŋОвĐĩ. ĐĸĐĩСи ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸ ҇ĐĩŅŅ‚Đž ŅĐ° ĐŋĐž-ĐŋĐžĐ´Ņ…ĐžĐ´ŅŅ‰Đ¸ ĐžŅ‚ Ņ‚ĐĩСи, ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐĩĐŊи ĐžŅ‚ ŅĐ°ĐŧĐ¸Ņ YouTube. АĐēĐž Đĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐž, URL Đ°Đ´Ņ€ĐĩŅĐ¸Ņ‚Đĩ ĐŊа видĐĩĐž ҉Đĩ ĐąŅŠĐ´Đ°Ņ‚ иСĐŋŅ€Đ°Ņ‚ĐĩĐŊи Đ´Đž API ŅŅŠŅ€Đ˛ŅŠŅ€Đ°, ĐąĐĩС да ҁĐĩ иСĐŋŅ€Đ°Ņ‰Đ°Ņ‚ Đ´Ņ€ŅƒĐŗĐ¸ даĐŊĐŊи. АĐēĐž видĐĩĐžĐēĐģиĐŋŅŠŅ‚ ĐŊŅĐŧа ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸ ĐŊа DeArrow, ҉Đĩ ҁĐĩ ĐŋĐžĐēаĐļĐ°Ņ‚ иĐģи ĐŊĐĩĐŗĐžĐ˛Đ¸Ņ‚Đĩ ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģĐŊи ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸, иĐģи ĐˇĐ°ŅĐŊĐĩŅ‚Đ¸ ĐēĐ°Đ´Ņ€Đ¸. ĐŠŅ€Đ°ĐēĐŊĐĩŅ‚Đĩ, Са да ĐŊĐ°ŅƒŅ‡Đ¸Ņ‚Đĩ ĐŋОвĐĩ҇Đĩ Са DeArrow</string>
<string name="revanced_alt_thumbnail_dearrow_connection_toast_title">ПоĐēаСваĐŊĐĩ ĐŊа иСвĐĩŅŅ‚Đ¸Đĩ, аĐēĐž API ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ</string>
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_on">ПоĐēаСва ҁĐĩ иСвĐĩŅŅ‚Đ¸Đĩ, аĐēĐž DeArrow ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ</string>
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_off">ПоĐēаСва ҁĐĩ иСвĐĩŅŅ‚Đ¸Đĩ, аĐēĐž DeArrow ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ</string>
<string name="revanced_alt_thumbnail_dearrow_api_url_title">ĐšŅ€Đ°ĐšĐŊа Ņ‚ĐžŅ‡Đēа ĐŊа API ĐŊа DeArrow</string>
<string name="revanced_alt_thumbnail_dearrow_api_url_summary">URL Đ°Đ´Ņ€ĐĩŅŅŠŅ‚ ĐŊа ĐēŅ€Đ°ĐšĐŊĐ°Ņ‚Đ° Ņ‚ĐžŅ‡Đēа Са ŅŅŠŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ ĐŊа ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸ DeArrow</string>
<string name="revanced_alt_thumbnail_stills_about_title">НĐĩĐŋОдвиĐļĐŊи ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸</string>
<string name="revanced_alt_thumbnail_stills_about_summary">НĐĩĐŋОдвиĐļĐŊĐ¸Ņ‚Đĩ ҁĐŊиĐŧĐēи ҁĐĩ ĐŋŅ€Đ°Đ˛ŅŅ‚ ĐžŅ‚ ĐŊĐ°Ņ‡Đ°ĐģĐžŅ‚Đž / ҁҀĐĩĐ´Đ°Ņ‚Đ° / ĐēŅ€Đ°Ņ ĐŊа Đ˛ŅĐĩĐēи видĐĩĐžĐēĐģиĐŋ. ĐĸĐĩСи Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ ŅĐ° Đ˛ĐŗŅ€Đ°Đ´ĐĩĐŊи в YouTube и ĐŊĐĩ ҁĐĩ иСĐŋĐžĐģСва Đ˛ŅŠĐŊ҈ĐĩĐŊ API</string>
<string name="revanced_alt_thumbnail_stills_fast_title">ИСĐŋĐžĐģСваĐŊĐĩ ĐŊа ĐąŅŠŅ€ĐˇĐž ĐˇĐ°ŅĐŊĐĩĐŧаĐŊĐĩ ĐŊа ĐēĐ°Đ´Ņ€Đ¸</string>
<string name="revanced_alt_thumbnail_stills_fast_summary_on">ИСĐŋĐžĐģĐˇĐ˛Đ°Ņ‚ ҁĐĩ ĐēĐ°Đ´Ņ€Đ¸ ҁҊҁ ҁҀĐĩĐ´ĐŊĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž. МиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸Ņ‚Đĩ ҉Đĩ ҁĐĩ ĐˇĐ°Ņ€ĐĩĐļĐ´Đ°Ņ‚ ĐŋĐž-ĐąŅŠŅ€ĐˇĐž, ĐŊĐž видĐĩĐžĐēĐģиĐŋОвĐĩ ĐŊа ĐļивО, ĐŊĐĩиСдадĐĩĐŊи иĐģи ĐŧĐŊĐžĐŗĐž ŅŅ‚Đ°Ņ€Đ¸ ĐŧĐžĐļĐĩ да ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ ĐŋŅ€Đ°ĐˇĐŊи ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸</string>
<string name="revanced_alt_thumbnail_stills_fast_summary_off">ИСĐŋĐžĐģСваĐŊĐĩ ĐŊа Đ˛Đ¸ŅĐžĐēĐžĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛ĐĩĐŊи ҁĐŊиĐŧĐēи</string>
<string name="revanced_alt_thumbnail_stills_time_title">Đ’Ņ€ĐĩĐŧĐĩŅ‚Đž ĐŊа видĐĩĐžĐēĐģиĐŋа, ĐžŅ‚ ĐēĐžĐšŅ‚Đž ҉Đĩ ĐąŅŠĐ´Đ°Ņ‚ вСĐĩŅ‚Đ¸ ĐēĐ°Đ´Ņ€Đ¸Ņ‚Đĩ</string>
<string name="revanced_alt_thumbnail_stills_time_entry_1">ĐĐ°Ņ‡Đ°ĐģĐž ĐŊа видĐĩĐžŅ‚Đž</string>
<string name="revanced_alt_thumbnail_stills_time_entry_2">ĐĄŅ€ĐĩĐ´Đ°Ņ‚Đ° ĐŊа видĐĩĐžŅ‚Đž</string>
<string name="revanced_alt_thumbnail_stills_time_entry_3">ĐšŅ€Đ°Ņ ĐŊа видĐĩĐžŅ‚Đž</string>
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
<string name="revanced_alt_thumbnail_dearrow_error">DeArrow Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ. (ĐēОд ĐŊа ŅŅŠŅŅ‚ĐžŅĐŊиĐĩŅ‚Đž: %s)</string>
<string name="revanced_alt_thumbnail_dearrow_error_generic">DeArrow Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ Đĩ ĐŊаĐģĐ¸Ņ‡ĐĩĐŊ</string>
</patch>
<patch id="misc.announcements.AnnouncementsPatch">
<string name="revanced_announcements_title">ПоĐēаСваĐŊĐĩ ĐŊа ReVanced ŅŅŠĐžĐąŅ‰ĐĩĐŊĐ¸Ņ</string>
<string name="revanced_announcements_summary_on">ĐĄŅŠĐžĐąŅ‰ĐĩĐŊĐ¸ŅŅ‚Đ° ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ ĐŋŅ€Đ¸ ŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ</string>
<string name="revanced_announcements_summary_off">ĐĄŅŠĐžĐąŅ‰ĐĩĐŊĐ¸ŅŅ‚Đ° ĐŊĐĩ ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ ĐŋŅ€Đ¸ ŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ</string>
<string name="revanced_announcements_enabled_summary">ПоĐēаСваĐŊĐĩ ĐŊа ŅŅŠĐžĐąŅ‰ĐĩĐŊĐ¸Ņ ĐŋŅ€Đ¸ ŅŅ‚Đ°Ņ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ</string>
<string name="revanced_announcements_connection_failed">НĐĩ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐ˛ŅŠŅ€ĐˇĐ˛Đ°ĐŊĐĩ ҁ Đ´ĐžŅŅ‚Đ°Đ˛Ņ‡Đ¸Đē ĐŊа ŅŅŠĐžĐąŅ‰ĐĩĐŊĐ¸Ņ</string>
<string name="revanced_announcements_dialog_dismiss">ĐžŅ‚Ņ…Đ˛ŅŠŅ€Đģи</string>
</patch>
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
<string name="revanced_check_watch_history_domain_name_dialog_title">ĐŸŅ€ĐĩĐ´ŅƒĐŋŅ€ĐĩĐļĐ´ĐĩĐŊиĐĩ</string>
<string name="revanced_check_watch_history_domain_name_dialog_message">Đ˜ŅŅ‚ĐžŅ€Đ¸ŅŅ‚Đ° ви ĐŊа ĐŗĐģĐĩдаĐŊĐĩ ĐŊĐĩ ҁĐĩ СаĐŋаСва.&lt;br&gt;&lt;br&gt;ĐĸОва ĐŊаК-вĐĩŅ€ĐžŅŅ‚ĐŊĐž Đĩ ĐŋŅ€Đ¸Ņ‡Đ¸ĐŊĐĩĐŊĐž ĐžŅ‚ DNS ĐąĐģĐžĐēĐ¸Ņ€Đ°Ņ‰ Ņ€ĐĩĐēĐģаĐŧи иĐģи ĐŧŅ€ĐĩĐļОв ĐŋŅ€ĐžĐēŅĐ¸.&lt;br&gt;&lt;br&gt;За да ĐēĐžŅ€Đ¸ĐŗĐ¸Ņ€Đ°Ņ‚Đĩ Ņ‚ĐžĐ˛Đ°, ĐŋĐžŅŅ‚Đ°Đ˛ĐĩŅ‚Đĩ &lt;b&gt;s.youtube в ĐąĐĩĐģĐ¸Ņ ҁĐŋĐ¸ŅŅŠĐē.com&lt;/b&gt; иĐģи иСĐēĐģŅŽŅ‡ĐĩŅ‚Đĩ Đ˛ŅĐ¸Ņ‡Đēи DNS ĐąĐģĐžĐēĐĩŅ€Đ¸ и ĐŋŅ€ĐžĐēŅĐ¸Ņ‚Đ°.</string>
<string name="revanced_check_watch_history_domain_name_dialog_ignore">НĐĩ ĐŋĐžĐēаСваК ĐžŅ‚ĐŊОвО</string>
</patch>
<patch id="misc.autorepeat.AutoRepeatPatch">
<string name="revanced_auto_repeat_title">ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐ˛Ņ‚Đ°Ņ€ŅĐŊĐĩ ĐŊа Ņ‚ĐĩĐēŅƒŅ‰Đ¸Ņ видĐĩĐžĐēĐģиĐŋ</string>
<string name="revanced_auto_repeat_summary_on">ВĐēĐģŅŽŅ‡ĐĩĐŊĐž Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐ˛Ņ‚Đ°Ņ€ŅĐŊĐĩ ĐŊа Ņ‚ĐĩĐēŅƒŅ‰Đ¸Ņ видĐĩĐžĐēĐģиĐŋ</string>
<string name="revanced_auto_repeat_summary_off">ИСĐēĐģŅŽŅ‡ĐĩĐŊĐž Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋĐžĐ˛Ņ‚Đ°Ņ€ŅĐŊĐĩ ĐŊа Ņ‚ĐĩĐēŅƒŅ‰Đ¸Ņ видĐĩĐžĐēĐģиĐŋ</string>
</patch>
<patch id="misc.dimensions.spoof.SpoofDeviceDimensionsPatch">
<string name="revanced_spoof_device_dimensions_title">Đ›ŅŠĐļĐģиви ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ ĐŊа ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž</string>
<string name="revanced_spoof_device_dimensions_summary_on">ПодĐŋŅ€Đ°Đ˛ĐĩĐŊĐ°Ņ‚Đ° Ņ€ĐĩСОĐģŅŽŅ†Đ¸Ņ ĐŊа ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž\n\nМоĐļĐĩ да ҁĐĩ ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸ ĐŋĐž-Đ˛Đ¸ŅĐžĐēĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŊа видĐĩĐžŅ‚Đž, ĐŊĐž ĐŧĐžĐļĐĩ да иСĐŋĐ¸Ņ‚Đ°Ņ‚Đĩ ĐˇĐ°ŅĐ¸Ņ‡Đ°ĐŊĐĩ ĐŋŅ€Đ¸ Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩ ĐŊа видĐĩĐž, ĐŋĐž-ĐģĐžŅˆ ĐļĐ¸Đ˛ĐžŅ‚ ĐŊа ĐąĐ°Ņ‚ĐĩŅ€Đ¸ŅŅ‚Đ° и ĐŊĐĩиСвĐĩҁ҂ĐŊи ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ‡ĐŊи ĐĩŅ„ĐĩĐēŅ‚Đ¸</string>
<string name="revanced_spoof_device_dimensions_summary_off">Đ ĐĩСОĐģŅŽŅ†Đ¸ŅŅ‚Đ° ĐŊа ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛ĐžŅ‚Đž ĐŊĐĩ Đĩ ĐŋОдĐŋŅ€Đ°Đ˛ĐĩĐŊа\n\nАĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ĐŊа Ņ‚ĐžĐ˛Đ° ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸ ĐŋĐž-Đ˛Đ¸ŅĐžĐēĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŊа видĐĩĐžŅ‚Đž</string>
<string name="revanced_spoof_device_dimensions_user_dialog_message">Đ Đ°ĐˇŅ€ĐĩŅˆĐ°Đ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа Ņ‚ĐžĐ˛Đ° ĐŧĐžĐļĐĩ да ĐŋŅ€Đ¸Ņ‡Đ¸ĐŊи ĐŋŅ€ĐĩĐēŅŠŅĐ˛Đ°ĐŊĐĩ ĐŊа Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩŅ‚Đž ĐŊа видĐĩĐž, вĐģĐžŅˆĐĩĐŊ ĐļĐ¸Đ˛ĐžŅ‚ ĐŊа ĐąĐ°Ņ‚ĐĩŅ€Đ¸ŅŅ‚Đ° и ĐŊĐĩиСвĐĩҁ҂ĐŊи ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ‡ĐŊи ĐĩŅ„ĐĩĐēŅ‚Đ¸.</string>
</patch>
<patch id="misc.gms.GmsCoreSupportResourcePatch">
<string name="microg_settings_title">GmsCore ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи</string>
<string name="microg_settings_summary">ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŊа GmsCore</string>
</patch>
<patch id="misc.links.BypassURLRedirectsPatch">
<string name="revanced_bypass_url_redirects_title">ЗаобиĐēаĐģŅĐŊĐĩ ĐŊа URL ĐŋŅ€ĐĩĐŊĐ°ŅĐžŅ‡Đ˛Đ°ĐŊĐĩ</string>
<string name="revanced_bypass_url_redirects_summary_on">URL ĐŋŅ€ĐĩĐŊĐ°ŅĐžŅ‡Đ˛Đ°ĐŊĐ¸ŅŅ‚Đ° ҁĐĩ СаОйиĐēаĐģŅŅ‚</string>
<string name="revanced_bypass_url_redirects_summary_off">URL ĐŋŅ€ĐĩĐŊĐ°ŅĐžŅ‡Đ˛Đ°ĐŊĐ¸ŅŅ‚Đ° ĐŊĐĩ ҁĐĩ СаОйиĐēаĐģŅŅ‚</string>
</patch>
<patch id="misc.links.OpenLinksExternallyPatch">
</patch>
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
<string name="revanced_external_browser_title">ĐžŅ‚Đ˛Đ°Ņ€ŅĐŊĐĩ ĐŊа Đ˛Ņ€ŅŠĐˇĐēи в ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°</string>
<string name="revanced_external_browser_summary_on">ĐžŅ‚Đ˛Đ°Ņ€ŅĐŊĐĩ ĐŊа Đ˛ŅŠĐŊ҈ĐŊи Đ˛Ņ€ŅŠĐˇĐēи</string>
<string name="revanced_external_browser_summary_off">ĐžŅ‚Đ˛Đ°Ņ€ŅĐŊĐĩ ĐŊа Đ˛Ņ€ŅŠĐˇĐēи в ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩŅ‚Đž</string>
</patch>
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
<string name="revanced_remove_tracking_query_parameter_title">ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚ŅŠŅ€Đ° ĐŊа ĐˇĐ°ŅĐ˛ĐēĐ°Ņ‚Đ° Са ĐŋŅ€ĐžŅĐģĐĩĐ´ŅĐ˛Đ°ĐŊĐĩ</string>
<string name="revanced_remove_tracking_query_parameter_summary_on">ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚ŅŠŅ€ŅŠŅ‚ ĐŊа ĐˇĐ°ŅĐ˛ĐēĐ°Ņ‚Đ° Са ĐŋŅ€ĐžŅĐģĐĩĐ´ŅĐ˛Đ°ĐŊĐĩ Đĩ ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐ°Ņ‚ ĐžŅ‚ Đ˛Ņ€ŅŠĐˇĐēĐ¸Ņ‚Đĩ</string>
<string name="revanced_remove_tracking_query_parameter_summary_off">ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚ŅŠŅ€ŅŠŅ‚ ĐŊа ĐˇĐ°ŅĐ˛ĐēĐ°Ņ‚Đ° Са ĐŋŅ€ĐžŅĐģĐĩĐ´ŅĐ˛Đ°ĐŊĐĩ ĐŊĐĩ Đĩ ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐ°Ņ‚ ĐžŅ‚ Đ˛Ņ€ŅŠĐˇĐēĐ¸Ņ‚Đĩ</string>
</patch>
<patch id="misc.zoomhaptics.ZoomHapticsPatch">
<string name="revanced_disable_zoom_haptics_title">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ˛Đ¸ĐąŅ€Đ°Ņ†Đ¸Ņ ĐŋŅ€Đ¸ ĐŧĐ°Ņ‰Đ°ĐąĐ¸Ņ€Đ°ĐŊĐĩ</string>
<string name="revanced_disable_zoom_haptics_summary_on">Đ’Đ¸ĐąŅ€Đ°Ņ†Đ¸Đ¸Ņ‚Đĩ ŅĐ° Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊи</string>
<string name="revanced_disable_zoom_haptics_summary_off">Đ’Đ¸ĐąŅ€Đ°Ņ†Đ¸Đ¸Ņ‚Đĩ ŅĐ° аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊи</string>
</patch>
<patch id="video.quality.RememberVideoQualityPatch">
<string name="revanced_video_quality_default_entry_1">ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž</string>
<string name="revanced_remember_video_quality_last_selected_title">ЗаĐŋĐžĐŧĐŊи ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛ĐžŅ‚Đž ĐŊа видĐĩĐžŅ‚Đž</string>
<string name="revanced_remember_video_quality_last_selected_summary_on">ĐŸŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛ĐžŅ‚Đž ҁĐĩ ĐžŅ‚ĐŊĐ°ŅŅŅ‚ Са Đ˛ŅĐ¸Ņ‡Đēи видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
<string name="revanced_remember_video_quality_last_selected_summary_off">ĐŸŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛ĐžŅ‚Đž ҁĐĩ ĐžŅ‚ĐŊĐ°ŅŅŅ‚ ŅĐ°ĐŧĐž Са Ņ‚ĐĩĐēŅƒŅ‰Đ¸Ņ видĐĩĐžĐēĐģиĐŋ</string>
<string name="revanced_video_quality_default_wifi_title">ĐŸŅ€ĐĩĐ´ĐŋĐžŅ‡Đ¸Ņ‚Đ°ĐŊĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŋŅ€Đ¸ Wi-Fi</string>
<string name="revanced_video_quality_default_mobile_title">ĐŸŅ€ĐĩĐ´ĐŋĐžŅ‡Đ¸Ņ‚Đ°ĐŊĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŋŅ€Đ¸ ĐŧОйиĐģĐŊи даĐŊĐŊи</string>
<string name="revanced_remember_video_quality_mobile">ĐŧОйиĐģĐŊи даĐŊĐŊи</string>
<string name="revanced_remember_video_quality_wifi">wi-fi</string>
<string name="revanced_remember_video_quality_toast">ĐŸŅ€ĐžĐŧĐĩĐŊĐĩĐŊĐž ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐž %1$s ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŊа: %2$s</string>
</patch>
<patch id="video.speed.button.PlaybackSpeedButtonPatch">
<string name="revanced_playback_speed_dialog_button_title">ПоĐēаСваĐŊĐĩ ĐąŅƒŅ‚ĐžĐŊ Са ҁĐēĐžŅ€ĐžŅŅ‚</string>
<string name="revanced_playback_speed_dialog_button_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Đĩ ĐŋĐžĐēаСаĐŊ</string>
<string name="revanced_playback_speed_dialog_button_summary_off">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ ĐŊĐĩ Đĩ ĐŋĐžĐēаСаĐŊ</string>
</patch>
<patch id="video.speed.custom.CustomPlaybackSpeedPatch">
<string name="revanced_custom_playback_speeds_title">ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊи ҁĐēĐžŅ€ĐžŅŅ‚Đ¸ ĐŊа Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩ</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>
</patch>
<patch id="video.speed.remember.RememberPlaybackSpeedPatch">
<string name="revanced_remember_playback_speed_last_selected_title">ЗаĐŋĐžĐŧĐŊи ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ в ҁĐēĐžŅ€ĐžŅŅ‚Ņ‚Đ° ĐŊа Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩ</string>
<string name="revanced_remember_playback_speed_last_selected_summary_on">ĐŸŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ в ҁĐēĐžŅ€ĐžŅŅ‚Ņ‚Đ° ĐŊа Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩ ҁĐĩ ĐžŅ‚ĐŊĐ°ŅŅŅ‚ Са Đ˛ŅĐ¸Ņ‡Đēи видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
<string name="revanced_remember_playback_speed_last_selected_summary_off">ĐŸŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ в ҁĐēĐžŅ€ĐžŅŅ‚Ņ‚Đ° ĐŊа Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩ ҁĐĩ ĐžŅ‚ĐŊĐ°ŅŅŅ‚ ŅĐ°ĐŧĐž Са Ņ‚ĐĩĐēŅƒŅ‰Đ¸Ņ видĐĩĐžĐēĐģиĐŋ</string>
<string name="revanced_playback_speed_default_title">ĐĄĐēĐžŅ€ĐžŅŅ‚ ĐŊа Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩ ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ</string>
<string name="revanced_remember_playback_speed_toast">ĐĄĐēĐžŅ€ĐžŅŅ‚Ņ‚Đ° ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ Đĩ ĐŋŅ€ĐžĐŧĐĩĐŊĐĩĐŊа ĐŊа: %s</string>
</patch>
<patch id="video.videoqualitymenu.RestoreOldVideoQualityMenuResourcePatch">
<string name="revanced_restore_old_video_quality_menu_title">Đ’ŅŠĐˇŅŅ‚Đ°ĐŊОвĐĩŅ‚Đĩ ŅŅ‚Đ°Ņ€ĐžŅ‚Đž ĐŧĐĩĐŊŅŽ Са ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŊа видĐĩĐžŅ‚Đž</string>
<string name="revanced_restore_old_video_quality_menu_summary_on">ПоĐēаСва ҁĐĩ ŅŅ‚Đ°Ņ€ĐžŅ‚Đž ĐŧĐĩĐŊŅŽ Са видĐĩĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž</string>
<string name="revanced_restore_old_video_quality_menu_summary_off">ĐĄŅ‚Đ°Ņ€ĐžŅ‚Đž ĐŧĐĩĐŊŅŽ Са видĐĩĐž ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đž Đĩ ҁĐēŅ€Đ¸Ņ‚Đž</string>
</patch>
<patch id="interaction.seekbar.EnableSlideToSeekPatch">
<string name="revanced_slide_to_seek_title">АĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ҁĐģаКд Са ĐŋŅ€ĐĩĐ˛ŅŠŅ€Ņ‚Đ°ĐŊĐĩ</string>
<string name="revanced_slide_to_seek_summary_on">ĐĄĐģаКд Са ĐŋŅ€ĐĩĐ˛ŅŠŅ€Ņ‚Đ°ĐŊĐĩ Đĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ</string>
<string name="revanced_slide_to_seek_summary_off">ĐĄĐģаКд Са ĐŋŅ€ĐĩĐ˛ŅŠŅ€Ņ‚Đ°ĐŊĐĩ Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ</string>
</patch>
<patch id="misc.fix.playback.SpoofClientPatch">
<string name="revanced_spoof_client_screen_title">ПодĐŧŅĐŊа ĐŊа вĐĩŅ€ŅĐ¸ŅŅ‚Đ° (ĐŊа ĐēĐģиĐĩĐŊŅ‚Đ°)</string>
<string name="revanced_spoof_client_screen_summary">ПодĐŧŅĐŊа ĐŊа вĐĩŅ€ŅĐ¸ŅŅ‚Đ°, Са да ĐŋŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧи ҁ Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩŅ‚Đž ĐŊа видĐĩĐž</string>
<string name="revanced_spoof_client_title">ПодĐŧŅĐŊа ĐŊа вĐĩŅ€ŅĐ¸ŅŅ‚Đ° (ĐŊа ĐēĐģиĐĩĐŊŅ‚Đ°)</string>
<string name="revanced_spoof_client_summary_on">ВĐĩŅ€ŅĐ¸ŅŅ‚Đ° Đĩ ĐŋОдĐŧĐĩĐŊĐĩĐŊа</string>
<string name="revanced_spoof_client_summary_off">КĐģиĐĩĐŊŅ‚ŅŠŅ‚ ĐŊĐĩ Đĩ ĐŋОдĐŋŅ€Đ°Đ˛ĐĩĐŊ.\n\nĐ’ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩŅ‚Đž ĐŊа видĐĩĐž ĐŧĐžĐļĐĩ да ĐŊĐĩ Ņ€Đ°ĐąĐžŅ‚Đ¸</string>
<string name="revanced_spoof_client_user_dialog_message">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ĐŊа Ņ‚Đ°ĐˇĐ¸ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēа ҉Đĩ дОвĐĩĐ´Đĩ Đ´Đž ĐŋŅ€ĐžĐąĐģĐĩĐŧи ҁ Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļдаĐŊĐĩŅ‚Đž ĐŊа видĐĩĐž.</string>
<string name="revanced_spoof_client_about_android_vr_summary">â€ĸ ĐŅĐŧа HDR видĐĩĐž\nâ€ĸ ДĐĩ҂ҁĐēĐ¸Ņ‚Đĩ видĐĩĐžĐēĐģиĐŋОвĐĩ ĐŊĐĩ ҁĐĩ Đ˛ŅŠĐˇĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐļĐ´Đ°Ņ‚\nâ€ĸ ĐŸĐžŅŅ‚Đ°Đ˛ĐĩĐŊĐ¸Ņ‚Đĩ ĐŊа ĐŋĐ°ŅƒĐˇĐ° видĐĩĐžĐēĐģиĐŋОвĐĩ ĐŧĐžĐŗĐ°Ņ‚ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐģĐŊĐž да ҁĐĩ Đ˛ŅŠĐˇĐžĐąĐŊĐžĐ˛ŅŅ‚\nâ€ĸ ĐĐ¸ŅĐēĐžĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛ĐĩĐŊи ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Đ¸ ĐŊа ĐģĐĩĐŊŅ‚Đ°Ņ‚Đ° Са Ņ‚ŅŠŅ€ŅĐĩĐŊĐĩ ĐŊа Shorts\nâ€ĸ Đ‘ŅƒŅ‚ĐžĐŊ Са Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ Са Đ¸ĐˇŅ‚ĐĩĐŗĐģŅĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚Đž\nâ€ĸ ĐšĐ°Ņ€Ņ‚Đ¸Ņ‚Đĩ ĐŊа ĐēŅ€Đ°ĐšĐŊĐ¸Ņ ĐĩĐēŅ€Đ°ĐŊ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
</patch>
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
<patch id="misc.fix.playback.SpoofSignaturePatch">
@@ -513,22 +1134,53 @@ This is because Crowdin requires temporarily flattening this file and removing t
</app>
<app id="twitch">
<patch id="ad.audio.AudioAdsPatch">
<string name="revanced_block_audio_ads_title">ĐŅƒĐ´Đ¸Đž Ņ€ĐĩĐēĐģаĐŧи</string>
<string name="revanced_block_audio_ads_summary_on">ĐŅƒĐ´Đ¸Đž Ņ€ĐĩĐēĐģаĐŧĐ°Ņ‚Đ° Đĩ ĐąĐģĐžĐēĐ¸Ņ€Đ°ĐŊа</string>
<string name="revanced_block_audio_ads_summary_off">ĐŅƒĐ´Đ¸Đž Ņ€ĐĩĐēĐģаĐŧĐ°Ņ‚Đ° Đĩ Ņ€Đ°ĐˇĐąĐģĐžĐēĐ¸Ņ€Đ°ĐŊа</string>
</patch>
<patch id="ad.embedded.EmbeddedAdsPatch">
<string name="revanced_embedded_ads_service_unavailable">%s Đĩ ĐŊĐĩĐ´ĐžŅŅ‚ŅŠĐŋĐĩĐŊ. МоĐļĐĩ да ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ Ņ€ĐĩĐēĐģаĐŧи. ОĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ Đ´Ņ€ŅƒĐŗĐ° ҃ҁĐģŅƒĐŗĐ° Са ĐąĐģĐžĐēĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐēĐģаĐŧи.</string>
<string name="revanced_embedded_ads_service_failed">%s ŅŅŠŅ€Đ˛ŅŠŅ€ŅŠŅ‚ Đ˛ŅŠŅ€ĐŊа ĐŗŅ€Đĩ҈Đēа. МоĐļĐĩ да ҁĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ‚ Ņ€ĐĩĐēĐģаĐŧи. ОĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ да ĐŋŅ€ĐĩвĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ Đ´Ņ€ŅƒĐŗĐ° ҃ҁĐģŅƒĐŗĐ° Са ĐąĐģĐžĐēĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ€ĐĩĐēĐģаĐŧи.</string>
<string name="revanced_block_embedded_ads_title">БĐģĐžĐēĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ˛ĐŗŅ€Đ°Đ´ĐĩĐŊи видĐĩĐžŅ€ĐĩĐēĐģаĐŧи</string>
<string name="revanced_block_embedded_ads_entry_1">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐž</string>
<string name="revanced_block_embedded_ads_entry_2">Luminous ĐŋŅ€ĐžĐēŅĐ¸</string>
<string name="revanced_block_embedded_ads_entry_3">PurpleAdBlock ĐŋŅ€ĐžĐēŅĐ¸</string>
</patch>
<patch id="ad.video.VideoAdsPatch">
<string name="revanced_block_video_ads_title">ВидĐĩĐž Ņ€ĐĩĐēĐģаĐŧи</string>
<string name="revanced_block_video_ads_summary_on">ВидĐĩĐž Ņ€ĐĩĐēĐģаĐŧĐ°Ņ‚Đ° Đĩ ĐąĐģĐžĐēĐ¸Ņ€Đ°ĐŊа</string>
<string name="revanced_block_video_ads_summary_off">ВидĐĩĐž Ņ€ĐĩĐēĐģаĐŧĐ°Ņ‚Đ° Đĩ Ņ€Đ°ĐˇĐąĐģĐžĐēĐ¸Ņ€Đ°ĐŊа</string>
</patch>
<patch id="chat.antidelete.ShowDeletedMessagesPatch">
<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>
<string name="revanced_show_deleted_messages_entry_3">ПоĐēаСваĐŊĐĩ ĐŊа Đ¸ĐˇŅ‚Ņ€Đ¸Ņ‚Đ¸Ņ‚Đĩ ŅŅŠĐžĐąŅ‰ĐĩĐŊĐ¸Ņ ĐēĐ°Ņ‚Đž ĐˇĐ°Ņ‡ĐĩŅ€ĐēĐŊĐ°Ņ‚ Ņ‚ĐĩĐēҁ҂</string>
</patch>
<patch id="chat.autoclaim.AutoClaimChannelPointsPatch">
<string name="revanced_auto_claim_channel_points_title">ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Đ¸ĐˇĐ¸ŅĐēваĐŊĐĩ ĐŊа Channel Points</string>
<string name="revanced_auto_claim_channel_points_summary_on">ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Đ¸ĐˇĐ¸ŅĐēваĐŊĐĩ ĐŊа Channel Points</string>
<string name="revanced_auto_claim_channel_points_summary_off">Channel Points в ĐēаĐŊаĐģа ĐŊĐĩ ҁĐĩ Đ¸ĐˇĐ¸ŅĐēĐ˛Đ°Ņ‚ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž</string>
</patch>
<patch id="debug.DebugModePatch">
<!-- Twitch specific internal debug mode, and not the same as 'revanced_debug_title' -->
<string name="revanced_twitch_debug_mode_title">АĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐšŅ‚Đĩ Ņ€ĐĩĐļиĐŧа Са ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŗŅ€Đĩ҈Đēи в Twitch</string>
<string name="revanced_twitch_debug_mode_summary_on">Đ ĐĩĐļиĐŧŅŠŅ‚ Са ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŗŅ€Đĩ҈Đēи в Twitch Đĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ (ĐŊĐĩ ҁĐĩ ĐŋŅ€ĐĩĐŋĐžŅ€ŅŠŅ‡Đ˛Đ°)</string>
<string name="revanced_twitch_debug_mode_summary_off">Đ ĐĩĐļиĐŧŅŠŅ‚ Са ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŗŅ€Đĩ҈Đēи в Twitch Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ</string>
</patch>
<patch id="misc.settings.SettingsPatch">
<string name="revanced_settings">ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŊа ReVanced</string>
<string name="revanced_ads_screen_title">Đ ĐĩĐēĐģаĐŧи</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>
<string name="revanced_misc_screen_summary">ДоĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊи ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи</string>
<string name="revanced_general_category_title">ĐžŅĐŊОвĐŊи ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи</string>
<string name="revanced_other_category_title">Đ”Ņ€ŅƒĐŗĐ¸ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи</string>
<string name="revanced_client_ads_category_title">КĐģиĐĩĐŊ҂ҁĐēа Ņ€ĐĩĐēĐģаĐŧа</string>
<string name="revanced_surestream_ads_category_title">ĐĄŅŠŅ€Đ˛Đ°Ņ€ĐŊа Ņ€ĐĩĐēĐģаĐŧа</string>
<string name="revanced_twitch_debug_title">ДĐŊĐĩвĐŊиĐē ĐŊа ĐžŅ‚ŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа ĐŗŅ€Đĩ҈Đēи</string>
<string name="revanced_twitch_debug_summary_on">ДĐŊĐĩвĐŊиĐēŅŠŅ‚ Са ĐžŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŗŅ€Đĩ҈Đēи Đĩ аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ</string>
<string name="revanced_twitch_debug_summary_off">ДĐŊĐĩвĐŊиĐēŅŠŅ‚ Са ĐžŅŅ‚Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŗŅ€Đĩ҈Đēи Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ</string>

View File

@@ -69,7 +69,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_settings_screen_03_feed_title">āĻĢāĻŋāĻĄ</string>
<string name="revanced_settings_screen_04_player_title">āĻĒā§āĻ˛ā§‡ā§ŸāĻžāϰ</string>
<string name="revanced_settings_screen_05_general_title">āϏāĻžāϧāĻžāϰāĻŖ āϞ⧇-āφāωāϟ</string>
<string name="revanced_settings_screen_06_shorts_title">āĻļāĻ°ā§āϟāϏ</string>
<string name="revanced_settings_screen_07_seekbar_title">āϏāĻŋāĻ•āĻŦāĻžāϰ</string>
<string name="revanced_settings_screen_08_swipe_controls_title">āϏ⧋āϝāĻŧāĻžāχāĻĒ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞ</string>
<string name="revanced_settings_screen_11_misc_title">āĻŦāĻŋāĻŦāĻŋāϧ</string>
@@ -202,6 +201,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_hide_chips_shelf_summary_off">āϚāĻŋāĻĒ āĻļ⧇āϞāĻĒ āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āĻšā§Ÿā§‡āϛ⧇</string>
<string name="revanced_hide_attributes_section_title">āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āĻŦāĻŋāĻ­āĻžāĻ— āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_hide_attributes_section_summary_on">\'āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϝ⧁āĻ•ā§āϤ āĻ¸ā§āĻĨāĻžāύ\', āϗ⧇āĻŽ āĻāĻŦāĻ‚ āϏāĻ™ā§āĻ—ā§€āϤ āĻŦāĻŋāĻ­āĻžāĻ—āϗ⧁āϞāĻŋ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_hide_attributes_section_summary_off">\'āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϝ⧁āĻ•ā§āϤ āĻ¸ā§āĻĨāĻžāύ\', āϗ⧇āĻŽ āĻāĻŦāĻ‚ āϏāĻ™ā§āĻ—ā§€āϤ āĻŦāĻŋāĻ­āĻžāĻ—āϗ⧁āϞāĻŋ āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āĻšā§Ÿā§‡āϛ⧇</string>
<string name="revanced_hide_info_cards_section_title">āϤāĻĨā§āϝ āĻ•āĻžāĻ°ā§āĻĄ āϏ⧇āĻ•āĻļāύ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_hide_info_cards_section_summary_on">āϤāĻĨā§āϝ āĻ•āĻžāĻ°ā§āĻĄ āϏ⧇āĻ•āĻļāύ āϞ⧁āĻ•āĻŋā§Ÿā§‡ āĻ°ā§Ÿā§‡āϛ⧇</string>
<string name="revanced_hide_info_cards_section_summary_off">āϤāĻĨā§āϝ āĻ•āĻžāĻ°ā§āĻĄ āϏ⧇āĻ•āĻļāύ āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āĻšā§Ÿā§‡āϛ⧇</string>
@@ -793,17 +793,12 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_sb_new_segment_choose_category">āϏ⧇āĻ—āĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āĻŦāĻŋāĻ­āĻžāĻ— āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ</string>
<string name="revanced_sb_new_segment_disabled_category">āϏ⧇āϟāĻŋāĻ‚ āĻĨ⧇āϕ⧇ āĻŦāĻŋāĻ­āĻžāĻ— āύāĻŋāĻ¸ā§āĻ•ā§āϰāĻŋ⧟ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇āĨ¤ āϜāĻŽāĻž āĻĻāĻŋāϤ⧇ āĻŦāĻŋāĻ­āĻžāĻ— āϏāĻ•ā§āϰāĻŋ⧟ āĻ•āϰ⧁āύāĨ¤</string>
<string name="revanced_sb_new_segment_title">āύāϤ⧁āύ āĻ¸ā§āĻĒāĻ¨ā§āϏāϰāĻŦā§āϞāĻ• āϏ⧇āĻ—āĻŽā§‡āĻ¨ā§āϟ</string>
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<string name="revanced_sb_new_segment_mark_time_as_question">āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āϏ⧇āĻ—āĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āĻļ⧁āϰ⧁ āĻŦāĻž āĻļ⧇āώ āĻšāĻŋāϏāĻžāĻŦ⧇ %1$02d:%2$02d:%3$03d āϏ⧇āϟ āĻ•āϰāĻŦ⧇āύ?</string>
<string name="revanced_sb_new_segment_mark_start">āĻļ⧁āϰ⧁</string>
<string name="revanced_sb_new_segment_mark_end">āĻļ⧇āώ</string>
<string name="revanced_sb_new_segment_now">āĻāĻ–āύ</string>
<string name="revanced_sb_new_segment_time_start">āϏ⧇āĻ—āĻŽā§‡āĻ¨ā§āϟāϟāĻŋ āĻļ⧁āϰ⧁ āĻšāĻ“āϝāĻŧāĻžāϰ āϏāĻŽāϝāĻŧ</string>
<string name="revanced_sb_new_segment_time_end">āϏ⧇āĻ—āĻŽā§‡āĻ¨ā§āϟāϟāĻŋ āĻļ⧇āώ āĻšāĻ“āϝāĻŧāĻžāϰ āϏāĻŽāϝāĻŧ</string>
<string name="revanced_sb_new_segment_confirm_title">āϏāĻŽāϝāĻŧāĻ•āĻžāϞ āĻ•āĻŋ āϏāĻ āĻŋāĻ•?</string>
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
<string name="revanced_sb_new_segment_confirm_content">āϏ⧇āĻ—āĻŽā§‡āĻ¨ā§āϟ āϏāĻŽā§ŸāĻ•āĻžāϞ\n\n%1$s\nāĻĨ⧇āϕ⧇\n%2$s\n\n(%3$s)\n\nāϜāĻŽāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ?</string>
<string name="revanced_sb_new_segment_start_is_before_end">āĻļ⧁āϰ⧁ āĻ…āĻŦāĻļā§āϝāχ āĻļ⧇āώ⧇āϰ āφāϗ⧇ āĻšāϤ⧇ āĻšāĻŦ⧇</string>
<string name="revanced_sb_new_segment_mark_locations_first">āφāϗ⧇ āϏāĻŽā§Ÿ āĻŦāĻžāϰ⧇ āĻĻ⧁āϟāĻŋ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ</string>
@@ -851,10 +846,10 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_spoof_app_version_target_title">āĻ¸ā§āĻĒ⧁āĻĢ āĻ…ā§āϝāĻžāĻĒ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ āϞāĻ•ā§āĻˇā§āϝ</string>
<!-- 'RYD' is 'Return YouTube Dislike' -->
<string name="revanced_spoof_app_version_target_entry_1">18.33.40 - āĻ›āĻĻā§āĻŽāĻŦ⧇āĻļāĻŋ āĻŽā§‹āĻĄā§‡ RYD āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇</string>
<string name="revanced_spoof_app_version_target_entry_2">ā§§ā§Ž.⧍ā§Ļ.ā§Šā§¯ - āĻĒā§āϰāĻļā§āĻŦāĻ¸ā§āϤ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻ¸ā§āĻĒāĻŋāĻĄ āĻāĻŦāĻ‚ āϗ⧁āĻŖāĻŽāĻžāύ āĻŽā§‡āύ⧁ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇</string>
<string name="revanced_spoof_app_version_target_entry_3">ā§§ā§Ž.ā§Ļ⧝.ā§Šā§¯ - āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻŸā§āϝāĻžāĻĒ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇</string>
<string name="revanced_spoof_app_version_target_entry_4">ā§§ā§­.ā§Ēā§§.ā§Šā§¯ - āĻĒ⧁āϰ⧋āύ⧋ āĻĒā§āϞ⧇āϞāĻŋāĻ¸ā§āϟ āĻļ⧇āϞāĻĢ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇</string>
<string name="revanced_spoof_app_version_target_entry_5">ā§§ā§­.ā§Šā§Š.ā§Ē⧍ - āĻĒ⧁āϰ⧋āύ⧋ UI āϞ⧇āφāωāϟ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇</string>
<string name="revanced_spoof_app_version_target_entry_2">18.20.39 - āĻĒā§āϰāĻļā§āĻŦāĻ¸ā§āϤ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻ¸ā§āĻĒāĻŋāĻĄ āĻāĻŦāĻ‚ āϗ⧁āĻŖāĻŽāĻžāύ āĻŽā§‡āύ⧁ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇</string>
<string name="revanced_spoof_app_version_target_entry_3">18.09.39 - āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻŸā§āϝāĻžāĻĒ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇</string>
<string name="revanced_spoof_app_version_target_entry_4">17.41.37 - āĻĒ⧁āϰ⧋āύ⧋ āĻĒā§āϞ⧇āϞāĻŋāĻ¸ā§āϟ āĻļ⧇āϞāĻĢ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇</string>
<string name="revanced_spoof_app_version_target_entry_5">17.33.42 - āĻĒ⧁āϰ⧋āύ⧋ UI āϞ⧇āφāωāϟ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰ⧇</string>
</patch>
<patch id="layout.startpage.ChangeStartPagePatch">
<string name="revanced_start_page_title">āĻļ⧁āϰ⧁āϰ āĻĒ⧃āĻˇā§āĻ āĻž āϏ⧇āϟ āĻ•āϰ⧁āύ</string>
@@ -920,6 +915,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_seekbar_custom_color_value_summary">āϏāĻŋāĻ•āĻŦāĻžāϰ⧇āϰ āϰāĻ‚</string>
<string name="revanced_seekbar_custom_color_invalid">āϏāĻŋāĻ•āĻŦāĻžāϰ⧇ āϭ⧁āϞ āϰāĻ‚ āĻĻā§‡ā§ŸāĻž āĻšā§Ÿā§‡āϛ⧇āĨ¤ āĻŽā§‚āϞ āϰāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϛ⧇āĨ¤</string>
</patch>
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
</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">āĻšā§‹āĻŽ āĻŸā§āϝāĻžāĻŦ</string>
@@ -960,6 +957,10 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_announcements_connection_failed">āĻ˜ā§‹āώāύāĻžāĻĻāĻžāϤāĻžāϰ āϏāĻžāĻĨ⧇ āϏāĻŽā§āĻĒāĻ°ā§āĻ• āĻ¸ā§āĻĨāĻžāĻĒāύ āĻŦā§āϝāĻ°ā§āĻĨ āĻšā§Ÿā§‡āϛ⧇</string>
<string name="revanced_announcements_dialog_dismiss">āĻŦāĻžāϤāĻŋāϞ āĻ•āϰ⧁āύ</string>
</patch>
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
<string name="revanced_check_watch_history_domain_name_dialog_title">āϏāϤāĻ°ā§āϕ⧀āĻ•āϰāĻŖ</string>
<string name="revanced_check_watch_history_domain_name_dialog_ignore">āφāĻŦāĻžāϰ āĻĻ⧇āĻ–āĻžāĻŦ⧇āύ āύāĻž</string>
</patch>
<patch id="misc.autorepeat.AutoRepeatPatch">
<string name="revanced_auto_repeat_title">āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟āĻ­āĻžāĻŦ⧇-āφāĻŦāĻžāϰ āĻĻ⧇āĻ–āĻžāύ⧋ āϏāĻ•ā§āϰāĻŋ⧟ āĻ•āϰ⧁āύ</string>
<string name="revanced_auto_repeat_summary_on">āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟āĻ­āĻžāĻŦ⧇-āφāĻŦāĻžāϰ āĻĻ⧇āĻ–āĻžāύ⧋ āϏāĻ•ā§āϰāĻŋ⧟ āĻšā§Ÿā§‡āϛ⧇</string>
@@ -985,10 +986,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_external_browser_summary_on">āϞāĻŋāĻ‚āĻ• āĻŦāĻžāĻšāĻŋāϰ⧇ āϖ⧁āϞ⧁āύ</string>
<string name="revanced_external_browser_summary_off">āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϞāĻŋāĻ‚āĻ• āϖ⧁āϞāϛ⧇</string>
</patch>
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
<string name="revanced_background_playback_title">āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āĻĒā§āϞ⧇āĻŦā§āϝāĻžāĻ•</string>
<string name="revanced_background_playback_summary">āĻāχ āϏ⧇āϟāĻŋāĻ‚āϟāĻŋ āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžāĻŦ⧇ āϏ⧇āϟāĻŋāĻ‚ -> āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ -āĻ</string>
</patch>
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
<string name="revanced_remove_tracking_query_parameter_title">āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚ āĻ•āϰāĻžāϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āĻŽā§āϛ⧁āύ</string>
<string name="revanced_remove_tracking_query_parameter_summary_on">āϞāĻŋāĻ‚āĻ• āĻĨ⧇āϕ⧇ āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚ āĻ•āϰāĻžāϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻšā§Ÿā§‡āϛ⧇</string>
@@ -1045,9 +1042,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
<string name="revanced_spoof_client_summary_on">āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āϟ āĻ¸ā§āĻĒ⧁āĻĢ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇</string>
<string name="revanced_spoof_client_summary_off">āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āϟ āĻ¸ā§āĻĒ⧁āĻĢ āĻ•āϰāĻž āĻšā§ŸāύāĻŋ\n\nāĻ­āĻŋāĻĄāĻŋāĻ“ āĻĒā§āϞ⧇āĻŦā§āϝāĻžāĻ• āĻ āĻŋāĻ•āĻŽāϤ⧋ āĻ•āĻžāϜ āύāĻžāĻ“ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇</string>
<string name="revanced_spoof_client_user_dialog_message">āĻāχ āϏ⧇āϟāĻŋāĻ‚āϟāĻŋ āĻŦāĻ¨ā§āϧ āĻ•āϰāĻžāϰ āĻĢāϞ⧇ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĒā§āϞ⧇āĻŦā§āϝāĻžāĻ• āĻ¤ā§āϰ⧁āϟāĻŋ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤</string>
<string name="revanced_spoof_client_use_ios_title">āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āϟ iOS āĻ āĻ¸ā§āĻĒ⧁āĻĢ āĻ•āϰ⧁āύ</string>
<string name="revanced_spoof_client_use_ios_summary_on">āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āϟ āĻāĻ–āύ iOS āĻ āĻ¸ā§āĻĒ⧁āĻĢ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇\n\nāĻĒāĻžāĻ°ā§āĻļā§āĻŦāĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋ⧟āĻž āĻ°ā§Ÿā§‡āϛ⧇:\nâ€ĸ āϕ⧋āύ āĻāχāϚāĻŋāĻĄāĻŋāφāϰ āĻ­āĻŋāĻĄāĻŋāĻ“ āύ⧇āχ\nâ€ĸ āĻ­āĻŋāĻĄāĻŋāĻ“ āχāϤāĻŋāĻšāĻžāϏ āĻ•āĻžāϜ āύāĻžāĻ“ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇\nâ€ĸ āωāĻšā§āϚ āĻ­āĻŋāĻĄāĻŋāĻ“ āϗ⧁āĻŖāĻŽāĻžāύ āĻ…āύ⧁āĻĒāĻ¸ā§āĻĨāĻŋāϤ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇\nâ€ĸāĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻ…āĻĄāĻŋāĻ“āϤ⧇ āϞāĻžāχāĻ­ āĻ¸ā§āĻŸā§āϰāĻŋāĻŽ āϚāϞāĻŦ⧇ āύāĻž\nâ€ĸ āĻ…ā§āϝāĻžāĻ¨ā§āĻĄā§āĻ°ā§Ÿā§‡āϟ ā§Ž āϏāĻ‚āĻ¸ā§āĻ•āϰāϪ⧇ āϞāĻžāχāĻ­ āĻ¸ā§āĻŸā§āϰāĻŋāĻŽ āωāĻĒāϞāĻ­ā§āϝ āύ⧟</string>
<string name="revanced_spoof_client_use_ios_summary_off">āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāϕ⧇ āĻŦāĻ°ā§āϤāĻŽāĻžāύ⧇ Android VR-āĻāϰ āϏāĻžāĻĨ⧇ āĻĒā§āϰāϤāĻžāϰāĻŖāĻž āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇\n\nāϏāĻžāχāĻĄ āĻāĻĢ⧇āĻ•ā§āϟāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇:\nâ€ĸ āϕ⧋āύāĻ“ HDR āĻ­āĻŋāĻĄāĻŋāĻ“ āύ⧇āχ\nâ€ĸ āĻŦāĻžāĻšā§āϚāĻžāĻĻ⧇āϰ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĒā§āϞ⧇āĻŦā§āϝāĻžāĻ• āĻšāϝāĻŧ āύāĻž\nâ€ĸ āĻŦāĻŋāϰāϤāĻŋ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻ­āĻŋāĻĄāĻŋāĻ“āϗ⧁āϞāĻŋ āĻāϞ⧋āĻŽā§‡āϞ⧋āĻ­āĻžāĻŦ⧇ āφāĻŦāĻžāϰ āĻļ⧁āϰ⧁ āĻšāϤ⧇ āĻĒāĻžāϰ⧇\nâ€ĸ āύāĻŋāĻŽā§āύāĻŽāĻžāύ⧇āϰ āĻļāĻ°ā§āϟāϏ āϏāĻŋāĻ•āĻŦāĻžāϰ āĻĨāĻžāĻŽā§āĻŦāύ⧇āϞ\nâ€ĸ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ…ā§āϝāĻžāĻ•āĻļāύ āĻŦā§‹āϤāĻžāĻŽ āϏāĻŦāϏāĻŽāϝāĻŧ āϞ⧁āĻ•āĻžāύ⧋ āĻĨāĻžāϕ⧇\nâ€ĸ āĻļ⧇āώ āĻ¸ā§āĻ•ā§āϰāĻŋāύ āĻ•āĻžāĻ°ā§āĻĄ āϏāĻŦāϏāĻŽāϝāĻŧ āϞ⧁āĻ•āĻžāύ⧋ āĻĨāĻžāϕ⧇</string>
<string name="revanced_spoof_client_storyboard_timeout">āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āϟ āĻ¸ā§āĻĒ⧁āĻĢ āĻĨāĻžāĻŽā§āĻŦāύ⧇āχāϞ āϏāĻžāĻŽā§ŸāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āωāĻĒāϞāĻ­ā§āϝ āύ⧟ (API āϏāĻŽā§Ÿ āĻļ⧇āώ āĻšā§Ÿā§‡āϛ⧇)</string>
<string name="revanced_spoof_client_storyboard_io_exception">āĻ¸ā§āĻĒ⧁āĻĢ āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āϟ āĻĨāĻžāĻŽā§āĻŦāύ⧇āχāϞ āϏāĻžāĻŽā§ŸāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āωāĻĒāϞāĻ­ā§āϝ āύ⧟: %s</string>
</patch>

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