Compare commits

...

81 Commits

Author SHA1 Message Date
semantic-release-bot
12de922afa chore: Release v5.12.0-dev.3 [skip ci]
# [5.12.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.12.0-dev.2...v5.12.0-dev.3) (2025-02-11)

### Bug Fixes

* **Windy.app:** Remove obsolete `Unlock pro` patch ([#4428](https://github.com/ReVanced/revanced-patches/issues/4428)) ([421af92](421af92f4c))
2025-02-11 15:11:34 +00:00
dependabot[bot]
580bb3cf6c chore(deps-dev): bump semantic-release from 24.1.2 to 24.2.1 (#4397) 2025-02-11 17:07:28 +02:00
LisoUseInAIKyrios
421af92f4c fix(Windy.app): Remove obsolete Unlock pro patch (#4428) 2025-02-11 17:05:46 +02:00
github-actions[bot]
4d03e1b5a1 chore: Sync translations (#4446) 2025-02-11 17:05:17 +02:00
LisoUseInAIKyrios
24d68df6cd refactor: Improve XML performance 2025-02-11 15:24:29 +02:00
semantic-release-bot
e9aee17746 chore: Release v5.12.0-dev.2 [skip ci]
# [5.12.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.12.0-dev.1...v5.12.0-dev.2) (2025-02-11)

### Features

* **Return YouTube Dislike:** add `Show estimated likes` setting ([#4443](https://github.com/ReVanced/revanced-patches/issues/4443)) ([7c4285e](7c4285e3e6))
2025-02-11 10:15:24 +00:00
LisoUseInAIKyrios
7c4285e3e6 feat(Return YouTube Dislike): add Show estimated likes setting (#4443) 2025-02-11 12:12:24 +02:00
semantic-release-bot
e3110271a7 chore: Release v5.12.0-dev.1 [skip ci]
# [5.12.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.11.0...v5.12.0-dev.1) (2025-02-10)

### Features

* **YouTube - SponsorBlock:** Redesign skip buttons ([#4427](https://github.com/ReVanced/revanced-patches/issues/4427)) ([0079ece](0079eceb87))
2025-02-10 18:33:12 +00:00
MarcaD
0079eceb87 feat(YouTube - SponsorBlock): Redesign skip buttons (#4427)
Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
2025-02-10 20:30:06 +02:00
github-actions[bot]
af2a97cb16 chore: Sync translations (#4436) 2025-02-10 20:29:28 +02:00
semantic-release-bot
aeb552e8f2 chore: Release v5.11.0 [skip ci]
# [5.11.0](https://github.com/ReVanced/revanced-patches/compare/v5.10.0...v5.11.0) (2025-02-07)

### Bug Fixes

* Fix broken `Remove screen capture restriction`,  `Remove screenshot restriction`, `Spoof Wi-Fi connection`, and `Export internal data documents provider` patch ([#4405](https://github.com/ReVanced/revanced-patches/issues/4405)) ([399889c](399889c6fa))
* **YouTube - Enable slide to seek:** Change patch to default include ([76fd33c](76fd33ca54))
* **YouTube - Hide layout components:** Hide new type of community post ([#4404](https://github.com/ReVanced/revanced-patches/issues/4404)) ([a06c031](a06c0318bf))
* **YouTube - Theme:** Use custom seekbar color for cairo startup animation ([#4399](https://github.com/ReVanced/revanced-patches/issues/4399)) ([f81b658](f81b658fb7))

### Features

* **YouTube - Change start page:** Add additional start pages ([#4413](https://github.com/ReVanced/revanced-patches/issues/4413)) ([b7ebfdd](b7ebfddf65))
2025-02-07 07:05:36 +00:00
LisoUseInAIKyrios
6e936fea42 chore: Merge branch dev to main (#4388) 2025-02-07 09:02:22 +02:00
github-actions[bot]
f63769f39f chore: Sync translations (#4421) 2025-02-07 08:58:04 +02:00
semantic-release-bot
1c9ab20a63 chore: Release v5.11.0-dev.2 [skip ci]
# [5.11.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.11.0-dev.1...v5.11.0-dev.2) (2025-02-06)

### Bug Fixes

* Fix broken `Remove screen capture restriction`,  `Remove screenshot restriction`, `Spoof Wi-Fi connection`, and `Export internal data documents provider` patch ([#4405](https://github.com/ReVanced/revanced-patches/issues/4405)) ([399889c](399889c6fa))
2025-02-06 12:29:29 +00:00
github-actions[bot]
cdeccad908 chore: Sync translations (#4417) 2025-02-06 14:25:50 +02:00
LisoUseInAIKyrios
399889c6fa fix: Fix broken Remove screen capture restriction, Remove screenshot restriction, Spoof Wi-Fi connection, and Export internal data documents provider patch (#4405) 2025-02-06 14:24:40 +02:00
github-actions[bot]
ec77861410 chore: Sync translations (#4415) 2025-02-05 20:42:07 +02:00
semantic-release-bot
b5afc6d827 chore: Release v5.11.0-dev.1 [skip ci]
# [5.11.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.10.1-dev.3...v5.11.0-dev.1) (2025-02-05)

### Features

* **YouTube - Change start page:** Add additional start pages ([#4413](https://github.com/ReVanced/revanced-patches/issues/4413)) ([b7ebfdd](b7ebfddf65))
2025-02-05 18:36:04 +00:00
LisoUseInAIKyrios
b7ebfddf65 feat(YouTube - Change start page): Add additional start pages (#4413) 2025-02-05 20:32:42 +02:00
github-actions[bot]
2742aca48b chore: Sync translations (#4414) 2025-02-05 20:32:21 +02:00
semantic-release-bot
14ca4d3288 chore: Release v5.10.1-dev.3 [skip ci]
## [5.10.1-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.10.1-dev.2...v5.10.1-dev.3) (2025-02-03)

### Bug Fixes

* **YouTube - Hide layout components:** Hide new type of community post ([#4404](https://github.com/ReVanced/revanced-patches/issues/4404)) ([a06c031](a06c0318bf))
2025-02-03 10:15:53 +00:00
ILoveOpenSourceApplications
a06c0318bf fix(YouTube - Hide layout components): Hide new type of community post (#4404) 2025-02-03 12:13:15 +02:00
semantic-release-bot
7f9f668435 chore: Release v5.10.1-dev.2 [skip ci]
## [5.10.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.10.1-dev.1...v5.10.1-dev.2) (2025-02-03)

### Bug Fixes

* **YouTube - Enable slide to seek:** Change patch to default include ([76fd33c](76fd33ca54))
2025-02-03 10:11:28 +00:00
LisoUseInAIKyrios
76fd33ca54 fix(YouTube - Enable slide to seek): Change patch to default include 2025-02-03 12:08:28 +02:00
semantic-release-bot
9a653e9c5a chore: Release v5.10.1-dev.1 [skip ci]
## [5.10.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.10.0...v5.10.1-dev.1) (2025-02-02)

### Bug Fixes

* **YouTube - Theme:** Use custom seekbar color for cairo startup animation ([#4399](https://github.com/ReVanced/revanced-patches/issues/4399)) ([f81b658](f81b658fb7))
2025-02-02 09:14:21 +00:00
LisoUseInAIKyrios
f81b658fb7 fix(YouTube - Theme): Use custom seekbar color for cairo startup animation (#4399) 2025-02-02 11:10:57 +02:00
LisoUseInAIKyrios
7ff39d89d6 refactor(YouTube - Spoof app version): Use more concise description of 19.26.42 2025-01-31 12:51:49 +02:00
LisoUseInAIKyrios
78ab0ec2bd refactor(YouTube - Swipe controls): Use more consistent settings language of 'opacity' and 0-100 scale 2025-01-31 12:40:45 +02:00
semantic-release-bot
3ab67f1539 chore: Release v5.10.0 [skip ci]
# [5.10.0](https://github.com/ReVanced/revanced-patches/compare/v5.9.0...v5.10.0) (2025-01-31)

### Bug Fixes

* **SwissId - Play integrity Removal:** Add recommended app version ([#4370](https://github.com/ReVanced/revanced-patches/issues/4370)) ([6fa2dee](6fa2deea69))
* Use correct path to fix invalid file paths ([043ebbb](043ebbb6d4))
* **YouTube - Hide ads:** fix 'Hide the Visit store button on channel pages' not working ([#4364](https://github.com/ReVanced/revanced-patches/issues/4364)) ([a73db03](a73db03671))
* **YouTube - Hide Ads:** Hide end screen store banner without leaving empty space ([#4367](https://github.com/ReVanced/revanced-patches/issues/4367)) ([aaeee4a](aaeee4a895))
* **YouTube - Hide ads:** Hide new types of tablet ads ([f844a1c](f844a1cd76))
* **YouTube - Hide layout components:** Hide new kind of community post ([#4341](https://github.com/ReVanced/revanced-patches/issues/4341)) ([6721a28](6721a284cd))
* **YouTube - Hide seekbar:** Do not hide player seekbar if hide feed seekbar is enabled ([#4333](https://github.com/ReVanced/revanced-patches/issues/4333)) ([7c8efca](7c8efcaf41))
* **YouTube - Hide video description components:** Use correct string key names ([64cdce2](64cdce28a6))
* **YouTube - Spoof video streams:** Update settings side effects summary text ([#4369](https://github.com/ReVanced/revanced-patches/issues/4369)) ([6802529](680252967e))
* **YouTube - Theme:** Fix 19.25 - 19.45 patch error ([df2d070](df2d070a43))
* **YouTube - Theme:** Replace custom seekbar gradient colors instead of disabling ([#4329](https://github.com/ReVanced/revanced-patches/issues/4329)) ([f4989ed](f4989ed0a5))

### Features

* **YouTube - Hide ads:** Add `Hide end screen store banner` ([#4351](https://github.com/ReVanced/revanced-patches/issues/4351)) ([76bbd7e](76bbd7ed2f))
* **YouTube - Hide video description components:** Add `Hide How this content was made section` ([#4355](https://github.com/ReVanced/revanced-patches/issues/4355)) ([a72404e](a72404eeab))
* **YouTube - Theme:** Add option to use custom seekbar accent color ([#4337](https://github.com/ReVanced/revanced-patches/issues/4337)) ([8104bbd](8104bbd7d7))
* **YouTube:** Add patch `Disable HDR video` ([#4347](https://github.com/ReVanced/revanced-patches/issues/4347)) ([1d12c41](1d12c4156d))
2025-01-31 09:18:31 +00:00
LisoUseInAIKyrios
8652cd613f chore: Merge branch dev to main (#4330) 2025-01-31 11:15:01 +02:00
github-actions[bot]
bc8388713c chore: Sync translations (#4386) 2025-01-31 11:14:34 +02:00
github-actions[bot]
d4b2e3be3e chore: Sync translations (#4385) 2025-01-31 10:55:59 +02:00
LisoUseInAIKyrios
57c48b7829 ci: Fix Crowdin pull 2025-01-31 10:51:42 +02:00
LisoUseInAIKyrios
aaa7523ee4 chore: Add translatable string tags 2025-01-31 10:03:31 +02:00
LisoUseInAIKyrios
785df4fe69 ci: Preprocess strings before pushing to Crowdin (#4383) 2025-01-31 09:58:26 +02:00
github-actions[bot]
83208eb50d chore: Sync translations (#4382) 2025-01-30 09:36:37 +02:00
github-actions[bot]
9437db11eb chore: Sync translations (#4381) 2025-01-30 09:32:21 +02:00
github-actions[bot]
1843c8bf70 chore: Sync translations (#4380) 2025-01-30 09:27:20 +02:00
LisoUseInAIKyrios
778b51fbff ci: Fix Crowdin cron pull strings? 2025-01-30 09:25:20 +02:00
github-actions[bot]
ee0fdcdf86 chore: Sync translations (#4379) 2025-01-30 09:18:15 +02:00
semantic-release-bot
57cc73d9c4 chore: Release v5.10.0-dev.11 [skip ci]
# [5.10.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.10...v5.10.0-dev.11) (2025-01-30)

### Bug Fixes

* Use correct path to fix invalid file paths ([043ebbb](043ebbb6d4))
2025-01-30 00:58:00 +00:00
oSumAtrIX
043ebbb6d4 fix: Use correct path to fix invalid file paths 2025-01-30 01:53:44 +01:00
semantic-release-bot
d5551923fc chore: Release v5.10.0-dev.10 [skip ci]
# [5.10.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.9...v5.10.0-dev.10) (2025-01-29)

### Bug Fixes

* **YouTube - Hide ads:** Hide new types of tablet ads ([f844a1c](f844a1cd76))
2025-01-29 18:57:01 +00:00
LisoUseInAIKyrios
f844a1cd76 fix(YouTube - Hide ads): Hide new types of tablet ads 2025-01-29 20:52:57 +02:00
semantic-release-bot
a7e3277cc1 chore: Release v5.10.0-dev.9 [skip ci]
# [5.10.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.8...v5.10.0-dev.9) (2025-01-29)

### Bug Fixes

* **SwissId - Play integrity Removal:** Add recommended app version ([#4370](https://github.com/ReVanced/revanced-patches/issues/4370)) ([6fa2dee](6fa2deea69))
2025-01-29 17:47:51 +00:00
Corentin C
6fa2deea69 fix(SwissId - Play integrity Removal): Add recommended app version (#4370) 2025-01-29 19:44:27 +02:00
github-actions[bot]
dcca2a3697 chore: Sync translations (#4374) 2025-01-29 19:43:28 +02:00
semantic-release-bot
018160fd9c chore: Release v5.10.0-dev.8 [skip ci]
# [5.10.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.7...v5.10.0-dev.8) (2025-01-29)

### Bug Fixes

* **YouTube - Spoof video streams:** Update settings side effects summary text ([#4369](https://github.com/ReVanced/revanced-patches/issues/4369)) ([6802529](680252967e))
2025-01-29 14:04:01 +00:00
LisoUseInAIKyrios
680252967e fix(YouTube - Spoof video streams): Update settings side effects summary text (#4369) 2025-01-29 16:00:22 +02:00
semantic-release-bot
e79eba81d9 chore: Release v5.10.0-dev.7 [skip ci]
# [5.10.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.6...v5.10.0-dev.7) (2025-01-29)

### Bug Fixes

* **YouTube - Hide ads:** fix 'Hide the Visit store button on channel pages' not working ([#4364](https://github.com/ReVanced/revanced-patches/issues/4364)) ([a73db03](a73db03671))
2025-01-29 08:31:07 +00:00
ILoveOpenSourceApplications
a73db03671 fix(YouTube - Hide ads): fix 'Hide the Visit store button on channel pages' not working (#4364) 2025-01-29 10:28:26 +02:00
semantic-release-bot
055ad04281 chore: Release v5.10.0-dev.6 [skip ci]
# [5.10.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.5...v5.10.0-dev.6) (2025-01-29)

### Bug Fixes

* **YouTube - Hide Ads:** Hide end screen store banner without leaving empty space ([#4367](https://github.com/ReVanced/revanced-patches/issues/4367)) ([aaeee4a](aaeee4a895))
2025-01-29 07:44:09 +00:00
LisoUseInAIKyrios
aaeee4a895 fix(YouTube - Hide Ads): Hide end screen store banner without leaving empty space (#4367) 2025-01-29 09:40:59 +02:00
semantic-release-bot
654b339f66 chore: Release v5.10.0-dev.5 [skip ci]
# [5.10.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.4...v5.10.0-dev.5) (2025-01-27)

### Bug Fixes

* **YouTube - Hide video description components:** Use correct string key names ([64cdce2](64cdce28a6))
2025-01-27 15:01:10 +00:00
LisoUseInAIKyrios
64cdce28a6 fix(YouTube - Hide video description components): Use correct string key names 2025-01-27 16:58:44 +02:00
semantic-release-bot
d01b9a67c5 chore: Release v5.10.0-dev.4 [skip ci]
# [5.10.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.3...v5.10.0-dev.4) (2025-01-27)

### Features

* **YouTube - Hide video description components:** Add `Hide How this content was made section` ([#4355](https://github.com/ReVanced/revanced-patches/issues/4355)) ([a72404e](a72404eeab))
2025-01-27 08:39:16 +00:00
ILoveOpenSourceApplications
a72404eeab feat(YouTube - Hide video description components): Add Hide How this content was made section (#4355) 2025-01-27 10:36:13 +02:00
semantic-release-bot
3ff104528e chore: Release v5.10.0-dev.3 [skip ci]
# [5.10.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.2...v5.10.0-dev.3) (2025-01-27)

### Features

* **YouTube - Hide ads:** Add `Hide end screen store banner` ([#4351](https://github.com/ReVanced/revanced-patches/issues/4351)) ([76bbd7e](76bbd7ed2f))
2025-01-27 08:35:53 +00:00
ILoveOpenSourceApplications
76bbd7ed2f feat(YouTube - Hide ads): Add Hide end screen store banner (#4351) 2025-01-27 10:32:15 +02:00
semantic-release-bot
2fdf0f85c1 chore: Release v5.10.0-dev.2 [skip ci]
# [5.10.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.1...v5.10.0-dev.2) (2025-01-25)

### Features

* **YouTube:** Add patch `Disable HDR video` ([#4347](https://github.com/ReVanced/revanced-patches/issues/4347)) ([1d12c41](1d12c4156d))
2025-01-25 08:29:47 +00:00
LisoUseInAIKyrios
1d12c4156d feat(YouTube): Add patch Disable HDR video (#4347) 2025-01-25 10:26:46 +02:00
semantic-release-bot
c43050dce8 chore: Release v5.10.0-dev.1 [skip ci]
# [5.10.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.9.1-dev.4...v5.10.0-dev.1) (2025-01-23)

### Features

* **YouTube - Theme:** Add option to use custom seekbar accent color ([#4337](https://github.com/ReVanced/revanced-patches/issues/4337)) ([8104bbd](8104bbd7d7))
2025-01-23 20:18:40 +00:00
LisoUseInAIKyrios
8104bbd7d7 feat(YouTube - Theme): Add option to use custom seekbar accent color (#4337) 2025-01-23 22:15:23 +02:00
semantic-release-bot
8487888e6b chore: Release v5.9.1-dev.4 [skip ci]
## [5.9.1-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.9.1-dev.3...v5.9.1-dev.4) (2025-01-22)

### Bug Fixes

* **YouTube - Hide layout components:** Hide new kind of community post ([#4341](https://github.com/ReVanced/revanced-patches/issues/4341)) ([6721a28](6721a284cd))
2025-01-22 21:03:27 +00:00
Bceez
6721a284cd fix(YouTube - Hide layout components): Hide new kind of community post (#4341) 2025-01-22 22:00:33 +01:00
semantic-release-bot
6cde702854 chore: Release v5.9.1-dev.3 [skip ci]
## [5.9.1-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.9.1-dev.2...v5.9.1-dev.3) (2025-01-22)

### Bug Fixes

* **YouTube - Hide seekbar:** Do not hide player seekbar if hide feed seekbar is enabled ([#4333](https://github.com/ReVanced/revanced-patches/issues/4333)) ([7c8efca](7c8efcaf41))
2025-01-22 12:01:57 +00:00
LisoUseInAIKyrios
7c8efcaf41 fix(YouTube - Hide seekbar): Do not hide player seekbar if hide feed seekbar is enabled (#4333) 2025-01-22 12:57:53 +01:00
semantic-release-bot
350ee02e3b chore: Release v5.9.1-dev.2 [skip ci]
## [5.9.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.9.1-dev.1...v5.9.1-dev.2) (2025-01-22)

### Bug Fixes

* **YouTube - Theme:** Fix 19.25 - 19.45 patch error ([df2d070](df2d070a43))
2025-01-22 08:26:21 +00:00
LisoUseInAIKyrios
df2d070a43 fix(YouTube - Theme): Fix 19.25 - 19.45 patch error 2025-01-22 09:23:31 +01:00
semantic-release-bot
8167aaccc8 chore: Release v5.9.1-dev.1 [skip ci]
## [5.9.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.9.0...v5.9.1-dev.1) (2025-01-21)

### Bug Fixes

* **YouTube - Theme:** Replace custom seekbar gradient colors instead of disabling ([#4329](https://github.com/ReVanced/revanced-patches/issues/4329)) ([f4989ed](f4989ed0a5))
2025-01-21 20:23:57 +00:00
LisoUseInAIKyrios
f4989ed0a5 fix(YouTube - Theme): Replace custom seekbar gradient colors instead of disabling (#4329) 2025-01-21 21:20:19 +01:00
semantic-release-bot
8f5a0531bc chore: Release v5.9.0 [skip ci]
# [5.9.0](https://github.com/ReVanced/revanced-patches/compare/v5.8.1...v5.9.0) (2025-01-20)

### Bug Fixes

* **YouTube - Spoof video streams:** Resolve playback issues after changing from cellular to wifi ([#4277](https://github.com/ReVanced/revanced-patches/issues/4277)) ([fcad0ab](fcad0ab5bb))
* **YouTube - Spoof video streams:** Update client user-agent ([#4304](https://github.com/ReVanced/revanced-patches/issues/4304)) ([d85bcc3](d85bcc3c16))

### Features

* **YouTube - Hide feed components:** Handle new type of surveys ([#4295](https://github.com/ReVanced/revanced-patches/issues/4295)) ([e5e897d](e5e897de77))
* **YouTube - Playback speed:** Add option to change 2x tap and hold speed ([#4307](https://github.com/ReVanced/revanced-patches/issues/4307)) ([0615990](0615990138))
* **YouTube - Settings:** Add option to use new Cairo settings menus ([#4305](https://github.com/ReVanced/revanced-patches/issues/4305)) ([064b859](064b859d39))
2025-01-20 11:18:05 +00:00
LisoUseInAIKyrios
622554de14 chore: Merge branch dev to main (#4280) 2025-01-20 13:14:47 +02:00
github-actions[bot]
66e330ffe6 chore: Sync translations (#4319) 2025-01-20 12:14:23 +01:00
LisoUseInAIKyrios
2afcd3d63d chore: Change localized string log to warning 2025-01-20 11:52:31 +01:00
semantic-release-bot
80d7c78cf6 chore: Release v5.9.0-dev.4 [skip ci]
# [5.9.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.9.0-dev.3...v5.9.0-dev.4) (2025-01-20)

### Bug Fixes

* **YouTube - Spoof video streams:** Update client user-agent ([#4304](https://github.com/ReVanced/revanced-patches/issues/4304)) ([d85bcc3](d85bcc3c16))
2025-01-20 10:51:48 +00:00
LisoUseInAIKyrios
d85bcc3c16 fix(YouTube - Spoof video streams): Update client user-agent (#4304) 2025-01-20 11:49:00 +01:00
github-actions[bot]
21368ea696 chore: Sync translations (#4318) 2025-01-20 11:48:40 +01:00
semantic-release-bot
e687d3ed37 chore: Release v5.9.0-dev.3 [skip ci]
# [5.9.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.9.0-dev.2...v5.9.0-dev.3) (2025-01-19)

### Features

* **YouTube - Settings:** Add option to use new Cairo settings menus ([#4305](https://github.com/ReVanced/revanced-patches/issues/4305)) ([064b859](064b859d39))
2025-01-19 23:25:39 +00:00
LisoUseInAIKyrios
064b859d39 feat(YouTube - Settings): Add option to use new Cairo settings menus (#4305)
Co-authored-by: MarcaDian <152095496+marcadian@users.noreply.github.com>
2025-01-20 01:22:15 +02:00
github-actions[bot]
89882ddaf8 chore: Sync translations (#4316) 2025-01-20 01:21:48 +02:00
179 changed files with 8637 additions and 5608 deletions

View File

@@ -2,7 +2,7 @@ name: Pull strings
on: on:
schedule: schedule:
- cron: "0 */8 * * *" - cron: "0 */6 * * *"
workflow_dispatch: workflow_dispatch:
jobs: jobs:
@@ -26,6 +26,7 @@ jobs:
config: crowdin.yml config: crowdin.yml
upload_sources: false upload_sources: false
download_translations: true download_translations: true
skip_ref_checkout: true
localization_branch_name: feat/translations localization_branch_name: feat/translations
create_pull_request: false create_pull_request: false
env: env:

View File

@@ -18,6 +18,11 @@ jobs:
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Preprocess strings
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./gradlew clean preprocessCrowdinStrings
- name: Push strings - name: Push strings
uses: crowdin/github-action@v2 uses: crowdin/github-action@v2
with: with:

View File

@@ -1,3 +1,233 @@
# [5.12.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.12.0-dev.2...v5.12.0-dev.3) (2025-02-11)
### Bug Fixes
* **Windy.app:** Remove obsolete `Unlock pro` patch ([#4428](https://github.com/ReVanced/revanced-patches/issues/4428)) ([83d116e](https://github.com/ReVanced/revanced-patches/commit/83d116e8fd3935ee431cfdf0b8e095d04ee77259))
# [5.12.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.12.0-dev.1...v5.12.0-dev.2) (2025-02-11)
### Features
* **Return YouTube Dislike:** add `Show estimated likes` setting ([#4443](https://github.com/ReVanced/revanced-patches/issues/4443)) ([9a88b42](https://github.com/ReVanced/revanced-patches/commit/9a88b4239fd63d5f91105fec8e7d59d318a5d09a))
# [5.12.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.11.0...v5.12.0-dev.1) (2025-02-10)
### Features
* **YouTube - SponsorBlock:** Redesign skip buttons ([#4427](https://github.com/ReVanced/revanced-patches/issues/4427)) ([8f4883f](https://github.com/ReVanced/revanced-patches/commit/8f4883fc002420bfb4056401e23445c99e1d3fce))
# [5.11.0](https://github.com/ReVanced/revanced-patches/compare/v5.10.0...v5.11.0) (2025-02-07)
### Bug Fixes
* Fix broken `Remove screen capture restriction`, `Remove screenshot restriction`, `Spoof Wi-Fi connection`, and `Export internal data documents provider` patch ([#4405](https://github.com/ReVanced/revanced-patches/issues/4405)) ([1d52b74](https://github.com/ReVanced/revanced-patches/commit/1d52b7478d34e699d8c629eeaa9fdbb470b7d5c8))
* **YouTube - Enable slide to seek:** Change patch to default include ([50358cd](https://github.com/ReVanced/revanced-patches/commit/50358cddea3eef4051d248040d23f774521dce00))
* **YouTube - Hide layout components:** Hide new type of community post ([#4404](https://github.com/ReVanced/revanced-patches/issues/4404)) ([f67ab2b](https://github.com/ReVanced/revanced-patches/commit/f67ab2baf25d543ceb55fcec48bda441ebf2b998))
* **YouTube - Theme:** Use custom seekbar color for cairo startup animation ([#4399](https://github.com/ReVanced/revanced-patches/issues/4399)) ([1cba294](https://github.com/ReVanced/revanced-patches/commit/1cba2948a6787118eb380ffcec35ee4fb99447ea))
### Features
* **YouTube - Change start page:** Add additional start pages ([#4413](https://github.com/ReVanced/revanced-patches/issues/4413)) ([b434182](https://github.com/ReVanced/revanced-patches/commit/b434182df69313c4eb5f0dfd98101cb80e46ead2))
# [5.11.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.11.0-dev.1...v5.11.0-dev.2) (2025-02-06)
### Bug Fixes
* Fix broken `Remove screen capture restriction`, `Remove screenshot restriction`, `Spoof Wi-Fi connection`, and `Export internal data documents provider` patch ([#4405](https://github.com/ReVanced/revanced-patches/issues/4405)) ([1d52b74](https://github.com/ReVanced/revanced-patches/commit/1d52b7478d34e699d8c629eeaa9fdbb470b7d5c8))
# [5.11.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.10.1-dev.3...v5.11.0-dev.1) (2025-02-05)
### Features
* **YouTube - Change start page:** Add additional start pages ([#4413](https://github.com/ReVanced/revanced-patches/issues/4413)) ([b434182](https://github.com/ReVanced/revanced-patches/commit/b434182df69313c4eb5f0dfd98101cb80e46ead2))
## [5.10.1-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.10.1-dev.2...v5.10.1-dev.3) (2025-02-03)
### Bug Fixes
* **YouTube - Hide layout components:** Hide new type of community post ([#4404](https://github.com/ReVanced/revanced-patches/issues/4404)) ([f67ab2b](https://github.com/ReVanced/revanced-patches/commit/f67ab2baf25d543ceb55fcec48bda441ebf2b998))
## [5.10.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.10.1-dev.1...v5.10.1-dev.2) (2025-02-03)
### Bug Fixes
* **YouTube - Enable slide to seek:** Change patch to default include ([50358cd](https://github.com/ReVanced/revanced-patches/commit/50358cddea3eef4051d248040d23f774521dce00))
## [5.10.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.10.0...v5.10.1-dev.1) (2025-02-02)
### Bug Fixes
* **YouTube - Theme:** Use custom seekbar color for cairo startup animation ([#4399](https://github.com/ReVanced/revanced-patches/issues/4399)) ([1cba294](https://github.com/ReVanced/revanced-patches/commit/1cba2948a6787118eb380ffcec35ee4fb99447ea))
# [5.10.0](https://github.com/ReVanced/revanced-patches/compare/v5.9.0...v5.10.0) (2025-01-31)
### Bug Fixes
* **SwissId - Play integrity Removal:** Add recommended app version ([#4370](https://github.com/ReVanced/revanced-patches/issues/4370)) ([d8ed474](https://github.com/ReVanced/revanced-patches/commit/d8ed474b165f094fdedc32caaae1f82ebc99eb3d))
* Use correct path to fix invalid file paths ([5ff4ee8](https://github.com/ReVanced/revanced-patches/commit/5ff4ee823da55c7b135eab8b62e07be465612b55))
* **YouTube - Hide ads:** fix 'Hide the Visit store button on channel pages' not working ([#4364](https://github.com/ReVanced/revanced-patches/issues/4364)) ([9d63ea9](https://github.com/ReVanced/revanced-patches/commit/9d63ea9a10ab5128ce18a1f53a946e84550da258))
* **YouTube - Hide Ads:** Hide end screen store banner without leaving empty space ([#4367](https://github.com/ReVanced/revanced-patches/issues/4367)) ([7e68390](https://github.com/ReVanced/revanced-patches/commit/7e683906418434dd4e2104337d73a2292415c615))
* **YouTube - Hide ads:** Hide new types of tablet ads ([574bcc8](https://github.com/ReVanced/revanced-patches/commit/574bcc844746b7445ec3e93b47daceafefad85e7))
* **YouTube - Hide layout components:** Hide new kind of community post ([#4341](https://github.com/ReVanced/revanced-patches/issues/4341)) ([02685c4](https://github.com/ReVanced/revanced-patches/commit/02685c4567aca55f22d45dc238a7d1f0ea264143))
* **YouTube - Hide seekbar:** Do not hide player seekbar if hide feed seekbar is enabled ([#4333](https://github.com/ReVanced/revanced-patches/issues/4333)) ([f5cf6f2](https://github.com/ReVanced/revanced-patches/commit/f5cf6f2a445492d33815a9772f49deac2d70eba9))
* **YouTube - Hide video description components:** Use correct string key names ([0f28c2b](https://github.com/ReVanced/revanced-patches/commit/0f28c2b44c0051ea7ab3136433b84c73321cf5bd))
* **YouTube - Spoof video streams:** Update settings side effects summary text ([#4369](https://github.com/ReVanced/revanced-patches/issues/4369)) ([e5b3aa1](https://github.com/ReVanced/revanced-patches/commit/e5b3aa1cc6a2465cb006487d528de888bc7cd430))
* **YouTube - Theme:** Fix 19.25 - 19.45 patch error ([5b47a5f](https://github.com/ReVanced/revanced-patches/commit/5b47a5f0f6299daaae209341064fd85f16ca18a6))
* **YouTube - Theme:** Replace custom seekbar gradient colors instead of disabling ([#4329](https://github.com/ReVanced/revanced-patches/issues/4329)) ([f03da98](https://github.com/ReVanced/revanced-patches/commit/f03da983051021e0c372557a5354d5d967409564))
### Features
* **YouTube - Hide ads:** Add `Hide end screen store banner` ([#4351](https://github.com/ReVanced/revanced-patches/issues/4351)) ([5505087](https://github.com/ReVanced/revanced-patches/commit/55050878028fed82b0f583a9f7ba06b8f267f8ec))
* **YouTube - Hide video description components:** Add `Hide How this content was made section` ([#4355](https://github.com/ReVanced/revanced-patches/issues/4355)) ([68ec54e](https://github.com/ReVanced/revanced-patches/commit/68ec54ef850ae8d6461dd0ef2846e6efbb59e482))
* **YouTube - Theme:** Add option to use custom seekbar accent color ([#4337](https://github.com/ReVanced/revanced-patches/issues/4337)) ([952b4fc](https://github.com/ReVanced/revanced-patches/commit/952b4fc4c9291e1a3e71437b503857763c973dd4))
* **YouTube:** Add patch `Disable HDR video` ([#4347](https://github.com/ReVanced/revanced-patches/issues/4347)) ([0528f7c](https://github.com/ReVanced/revanced-patches/commit/0528f7cad856a2b1347e41944167b0583fc4a3d9))
# [5.10.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.10...v5.10.0-dev.11) (2025-01-30)
### Bug Fixes
* Use correct path to fix invalid file paths ([5ff4ee8](https://github.com/ReVanced/revanced-patches/commit/5ff4ee823da55c7b135eab8b62e07be465612b55))
# [5.10.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.9...v5.10.0-dev.10) (2025-01-29)
### Bug Fixes
* **YouTube - Hide ads:** Hide new types of tablet ads ([574bcc8](https://github.com/ReVanced/revanced-patches/commit/574bcc844746b7445ec3e93b47daceafefad85e7))
# [5.10.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.8...v5.10.0-dev.9) (2025-01-29)
### Bug Fixes
* **SwissId - Play integrity Removal:** Add recommended app version ([#4370](https://github.com/ReVanced/revanced-patches/issues/4370)) ([d8ed474](https://github.com/ReVanced/revanced-patches/commit/d8ed474b165f094fdedc32caaae1f82ebc99eb3d))
# [5.10.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.7...v5.10.0-dev.8) (2025-01-29)
### Bug Fixes
* **YouTube - Spoof video streams:** Update settings side effects summary text ([#4369](https://github.com/ReVanced/revanced-patches/issues/4369)) ([e5b3aa1](https://github.com/ReVanced/revanced-patches/commit/e5b3aa1cc6a2465cb006487d528de888bc7cd430))
# [5.10.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.6...v5.10.0-dev.7) (2025-01-29)
### Bug Fixes
* **YouTube - Hide ads:** fix 'Hide the Visit store button on channel pages' not working ([#4364](https://github.com/ReVanced/revanced-patches/issues/4364)) ([9d63ea9](https://github.com/ReVanced/revanced-patches/commit/9d63ea9a10ab5128ce18a1f53a946e84550da258))
# [5.10.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.5...v5.10.0-dev.6) (2025-01-29)
### Bug Fixes
* **YouTube - Hide Ads:** Hide end screen store banner without leaving empty space ([#4367](https://github.com/ReVanced/revanced-patches/issues/4367)) ([7e68390](https://github.com/ReVanced/revanced-patches/commit/7e683906418434dd4e2104337d73a2292415c615))
# [5.10.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.4...v5.10.0-dev.5) (2025-01-27)
### Bug Fixes
* **YouTube - Hide video description components:** Use correct string key names ([0f28c2b](https://github.com/ReVanced/revanced-patches/commit/0f28c2b44c0051ea7ab3136433b84c73321cf5bd))
# [5.10.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.3...v5.10.0-dev.4) (2025-01-27)
### Features
* **YouTube - Hide video description components:** Add `Hide How this content was made section` ([#4355](https://github.com/ReVanced/revanced-patches/issues/4355)) ([68ec54e](https://github.com/ReVanced/revanced-patches/commit/68ec54ef850ae8d6461dd0ef2846e6efbb59e482))
# [5.10.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.2...v5.10.0-dev.3) (2025-01-27)
### Features
* **YouTube - Hide ads:** Add `Hide end screen store banner` ([#4351](https://github.com/ReVanced/revanced-patches/issues/4351)) ([5505087](https://github.com/ReVanced/revanced-patches/commit/55050878028fed82b0f583a9f7ba06b8f267f8ec))
# [5.10.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.10.0-dev.1...v5.10.0-dev.2) (2025-01-25)
### Features
* **YouTube:** Add patch `Disable HDR video` ([#4347](https://github.com/ReVanced/revanced-patches/issues/4347)) ([0528f7c](https://github.com/ReVanced/revanced-patches/commit/0528f7cad856a2b1347e41944167b0583fc4a3d9))
# [5.10.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.9.1-dev.4...v5.10.0-dev.1) (2025-01-23)
### Features
* **YouTube - Theme:** Add option to use custom seekbar accent color ([#4337](https://github.com/ReVanced/revanced-patches/issues/4337)) ([952b4fc](https://github.com/ReVanced/revanced-patches/commit/952b4fc4c9291e1a3e71437b503857763c973dd4))
## [5.9.1-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.9.1-dev.3...v5.9.1-dev.4) (2025-01-22)
### Bug Fixes
* **YouTube - Hide layout components:** Hide new kind of community post ([#4341](https://github.com/ReVanced/revanced-patches/issues/4341)) ([02685c4](https://github.com/ReVanced/revanced-patches/commit/02685c4567aca55f22d45dc238a7d1f0ea264143))
## [5.9.1-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.9.1-dev.2...v5.9.1-dev.3) (2025-01-22)
### Bug Fixes
* **YouTube - Hide seekbar:** Do not hide player seekbar if hide feed seekbar is enabled ([#4333](https://github.com/ReVanced/revanced-patches/issues/4333)) ([f5cf6f2](https://github.com/ReVanced/revanced-patches/commit/f5cf6f2a445492d33815a9772f49deac2d70eba9))
## [5.9.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.9.1-dev.1...v5.9.1-dev.2) (2025-01-22)
### Bug Fixes
* **YouTube - Theme:** Fix 19.25 - 19.45 patch error ([5b47a5f](https://github.com/ReVanced/revanced-patches/commit/5b47a5f0f6299daaae209341064fd85f16ca18a6))
## [5.9.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.9.0...v5.9.1-dev.1) (2025-01-21)
### Bug Fixes
* **YouTube - Theme:** Replace custom seekbar gradient colors instead of disabling ([#4329](https://github.com/ReVanced/revanced-patches/issues/4329)) ([f03da98](https://github.com/ReVanced/revanced-patches/commit/f03da983051021e0c372557a5354d5d967409564))
# [5.9.0](https://github.com/ReVanced/revanced-patches/compare/v5.8.1...v5.9.0) (2025-01-20)
### Bug Fixes
* **YouTube - Spoof video streams:** Resolve playback issues after changing from cellular to wifi ([#4277](https://github.com/ReVanced/revanced-patches/issues/4277)) ([e93e1c8](https://github.com/ReVanced/revanced-patches/commit/e93e1c8ec3367e941034e9c4e3725ec1db429a60))
* **YouTube - Spoof video streams:** Update client user-agent ([#4304](https://github.com/ReVanced/revanced-patches/issues/4304)) ([7917871](https://github.com/ReVanced/revanced-patches/commit/7917871f510b6b805370ef98a0cf8a4e2df0e900))
### Features
* **YouTube - Hide feed components:** Handle new type of surveys ([#4295](https://github.com/ReVanced/revanced-patches/issues/4295)) ([c770e03](https://github.com/ReVanced/revanced-patches/commit/c770e03f3801367cb531af860fbdfa43dca89af0))
* **YouTube - Playback speed:** Add option to change 2x tap and hold speed ([#4307](https://github.com/ReVanced/revanced-patches/issues/4307)) ([02fb26e](https://github.com/ReVanced/revanced-patches/commit/02fb26e9458fb8635d497e6e78f964055244d738))
* **YouTube - Settings:** Add option to use new Cairo settings menus ([#4305](https://github.com/ReVanced/revanced-patches/issues/4305)) ([7b8a2a2](https://github.com/ReVanced/revanced-patches/commit/7b8a2a2721ab5351f8c0251401aceddf0c5327df))
# [5.9.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.9.0-dev.3...v5.9.0-dev.4) (2025-01-20)
### Bug Fixes
* **YouTube - Spoof video streams:** Update client user-agent ([#4304](https://github.com/ReVanced/revanced-patches/issues/4304)) ([7917871](https://github.com/ReVanced/revanced-patches/commit/7917871f510b6b805370ef98a0cf8a4e2df0e900))
# [5.9.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.9.0-dev.2...v5.9.0-dev.3) (2025-01-19)
### Features
* **YouTube - Settings:** Add option to use new Cairo settings menus ([#4305](https://github.com/ReVanced/revanced-patches/issues/4305)) ([7b8a2a2](https://github.com/ReVanced/revanced-patches/commit/7b8a2a2721ab5351f8c0251401aceddf0c5327df))
# [5.9.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.9.0-dev.1...v5.9.0-dev.2) (2025-01-18) # [5.9.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.9.0-dev.1...v5.9.0-dev.2) (2025-01-18)

View File

@@ -1,4 +1,11 @@
android.namespace = "app.revanced.extension" android {
namespace = "app.revanced.extension"
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
dependencies { dependencies {
compileOnly(libs.annotation) compileOnly(libs.annotation)

View File

@@ -12,7 +12,7 @@ import android.os.Handler;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
/** @noinspection deprecation, unused */ @SuppressWarnings({"deprecation", "unused"})
public class SpoofWifiPatch { public class SpoofWifiPatch {
// Used to check what the (real or fake) active network is (take a look at `hasTransport`). // Used to check what the (real or fake) active network is (take a look at `hasTransport`).

View File

@@ -1,3 +1,16 @@
android {
namespace = "app.revanced.extension"
defaultConfig {
minSdk = 21
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
dependencies { dependencies {
compileOnly(libs.annotation) compileOnly(libs.annotation)
} }

View File

@@ -1,5 +1,6 @@
package app.revanced.extension.all.misc.directory.documentsprovider; package app.revanced.extension.all.misc.directory.documentsprovider;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.ProviderInfo; import android.content.pm.ProviderInfo;
@@ -23,6 +24,7 @@ import java.util.Objects;
/** /**
* A DocumentsProvider that allows access to the app's internal data directory. * A DocumentsProvider that allows access to the app's internal data directory.
*/ */
@SuppressLint("LongLogTag")
public class InternalDataDocumentsProvider extends DocumentsProvider { public class InternalDataDocumentsProvider extends DocumentsProvider {
private static final String[] rootColumns = private static final String[] rootColumns =
{"root_id", "mime_types", "flags", "icon", "title", "summary", "document_id"}; {"root_id", "mime_types", "flags", "icon", "title", "summary", "document_id"};

View File

@@ -1,4 +1,15 @@
android.namespace = "app.revanced.extension" android {
namespace = "app.revanced.extension"
defaultConfig {
minSdk = 21
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
dependencies { dependencies {
compileOnly(libs.annotation) compileOnly(libs.annotation)

View File

@@ -5,7 +5,8 @@ import android.os.Build;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
public final class RemoveScreencaptureRestrictionPatch { @SuppressWarnings("unused")
public final class RemoveScreenCaptureRestrictionPatch {
// Member of AudioAttributes.Builder // Member of AudioAttributes.Builder
@RequiresApi(api = Build.VERSION_CODES.Q) @RequiresApi(api = Build.VERSION_CODES.Q)
public static AudioAttributes.Builder setAllowedCapturePolicy(final AudioAttributes.Builder builder, final int capturePolicy) { public static AudioAttributes.Builder setAllowedCapturePolicy(final AudioAttributes.Builder builder, final int capturePolicy) {

View File

@@ -1 +1,16 @@
android.namespace = "app.revanced.extension" android {
namespace = "app.revanced.extension"
defaultConfig {
minSdk = 21
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
dependencies {
compileOnly(libs.annotation)
}

View File

@@ -3,6 +3,7 @@ package app.revanced.extension.all.screenshot.removerestriction;
import android.view.Window; import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
@SuppressWarnings("unused")
public class RemoveScreenshotRestrictionPatch { public class RemoveScreenshotRestrictionPatch {
public static void addFlags(Window window, int flags) { public static void addFlags(Window window, int flags) {

View File

@@ -4,7 +4,7 @@ plugins {
android { android {
namespace = "app.revanced.extension" namespace = "app.revanced.extension"
compileSdk = 33 compileSdk = 34
defaultConfig { defaultConfig {
minSdk = 24 minSdk = 24

View File

@@ -1 +1,5 @@
// Do not remove. Necessary for the extension plugin to be applied to the project. android {
defaultConfig {
minSdk = 26
}
}

View File

@@ -4,7 +4,7 @@ plugins {
android { android {
namespace = "app.revanced.extension" namespace = "app.revanced.extension"
compileSdk = 33 compileSdk = 34
defaultConfig { defaultConfig {
minSdk = 24 minSdk = 24

View File

@@ -722,8 +722,8 @@ public class Utils {
Preference preference = group.getPreference(i); Preference preference = group.getPreference(i);
final Sort preferenceSort; final Sort preferenceSort;
if (preference instanceof PreferenceGroup) { if (preference instanceof PreferenceGroup subGroup) {
sortPreferenceGroups((PreferenceGroup) preference); sortPreferenceGroups(subGroup);
preferenceSort = groupSort; // Sort value for groups is for it's content, not itself. preferenceSort = groupSort; // Sort value for groups is for it's content, not itself.
} else { } else {
// Allow individual preferences to set a key sorting. // Allow individual preferences to set a key sorting.

View File

@@ -4,6 +4,10 @@ import android.os.Build;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import java.util.Locale;
import java.util.Objects;
import app.revanced.extension.shared.Logger;
import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.BaseSettings;
public enum ClientType { public enum ClientType {
@@ -11,13 +15,17 @@ public enum ClientType {
ANDROID_VR_NO_AUTH( ANDROID_VR_NO_AUTH(
28, 28,
"ANDROID_VR", "ANDROID_VR",
"com.google.android.apps.youtube.vr.oculus",
"Oculus", "Oculus",
"Quest 3", "Quest 3",
"Android", "Android",
"12", "12",
"com.google.android.apps.youtube.vr.oculus/1.56.21 (Linux; U; Android 12; GB) gzip", // Android 12.1
"32", // Android 12.1 "32",
"1.56.21", "SQ3A.220605.009.A1",
"132.0.6808.3",
"1.61.48",
false,
false, false,
"Android VR No auth" "Android VR No auth"
), ),
@@ -26,67 +34,81 @@ public enum ClientType {
ANDROID_UNPLUGGED( ANDROID_UNPLUGGED(
29, 29,
"ANDROID_UNPLUGGED", "ANDROID_UNPLUGGED",
"com.google.android.apps.youtube.unplugged",
"Google", "Google",
"Google TV Streamer", "Google TV Streamer",
"Android", "Android",
"14", "14",
"com.google.android.apps.youtube.unplugged/8.49.0 (Linux; U; Android 14; GB) gzip",
"34", "34",
"UTT3.240625.001.K5",
"132.0.6808.3",
"8.49.0", "8.49.0",
true, true,
true,
"Android TV" "Android TV"
), ),
// Cannot play livestreams and lacks HDR, but can play videos with music and labeled "for children". // Cannot play livestreams and lacks HDR, but can play videos with music and labeled "for children".
// Google Pixel 9 Pro Fold
// https://dumps.tadiphone.dev/dumps/google/barbet
ANDROID_CREATOR( ANDROID_CREATOR(
14, 14,
"ANDROID_CREATOR", "ANDROID_CREATOR",
Build.MANUFACTURER, "com.google.android.apps.youtube.creator",
Build.MODEL, "Google",
"Pixel 9 Pro Fold",
"Android", "Android",
"11", "15",
"com.google.android.apps.youtube.creator/24.45.100 (Linux; U; Android 11) gzip", "35",
"30", "AP3A.241005.015.A2",
"24.45.100", "132.0.6779.0",
"23.47.101",
true,
true, true,
"Android Creator" "Android Creator"
), ),
ANDROID_VR( ANDROID_VR(
ANDROID_VR_NO_AUTH.id, ANDROID_VR_NO_AUTH.id,
ANDROID_VR_NO_AUTH.clientName, ANDROID_VR_NO_AUTH.clientName,
ANDROID_VR_NO_AUTH.packageName,
ANDROID_VR_NO_AUTH.deviceMake, ANDROID_VR_NO_AUTH.deviceMake,
ANDROID_VR_NO_AUTH.deviceModel, ANDROID_VR_NO_AUTH.deviceModel,
ANDROID_VR_NO_AUTH.osName, ANDROID_VR_NO_AUTH.osName,
ANDROID_VR_NO_AUTH.osVersion, ANDROID_VR_NO_AUTH.osVersion,
ANDROID_VR_NO_AUTH.userAgent,
ANDROID_VR_NO_AUTH.androidSdkVersion, ANDROID_VR_NO_AUTH.androidSdkVersion,
ANDROID_VR_NO_AUTH.buildId,
ANDROID_VR_NO_AUTH.cronetVersion,
ANDROID_VR_NO_AUTH.clientVersion, ANDROID_VR_NO_AUTH.clientVersion,
ANDROID_VR_NO_AUTH.requiresAuth,
true, true,
"Android VR" "Android VR"
), ),
IOS_UNPLUGGED( IOS_UNPLUGGED(
33, 33,
"IOS_UNPLUGGED", "IOS_UNPLUGGED",
"com.google.ios.youtubeunplugged",
"Apple", "Apple",
forceAVC() forceAVC()
? "iPhone12,5" // 11 Pro Max (last device with iOS 13) // 11 Pro Max (last device with iOS 13)
: "iPhone16,2", // 15 Pro Max ? "iPhone12,5"
// 15 Pro Max
: "iPhone16,2",
"iOS", "iOS",
// iOS 13 and earlier uses only AVC. 14+ adds VP9 and AV1.
forceAVC() forceAVC()
? "13.7.17H35" // Last release of iOS 13. // iOS 13 and earlier uses only AVC. 14+ adds VP9 and AV1.
? "13.7.17H35"
: "18.2.22C152", : "18.2.22C152",
forceAVC() null,
? "com.google.ios.youtubeunplugged/6.45 (iPhone12,5; U; CPU iOS 13_7 like Mac OS X)" null,
: "com.google.ios.youtubeunplugged/8.49 (iPhone16,2; U; CPU iOS 18_2_22 like Mac OS X)",
null, null,
// Version number should be a valid iOS release. // Version number should be a valid iOS release.
// https://www.ipa4fun.com/history/152043/ // https://www.ipa4fun.com/history/152043/
// Some newer versions can also force AVC,
// but 6.45 is the last version that supports iOS 13.
forceAVC() forceAVC()
// Some newer versions can also force AVC,
// but 6.45 is the last version that supports iOS 13.
? "6.45" ? "6.45"
: "8.49", : "8.49",
true, true,
true,
forceAVC() forceAVC()
? "iOS TV Force AVC" ? "iOS TV Force AVC"
: "iOS TV" : "iOS TV"
@@ -104,6 +126,16 @@ public enum ClientType {
public final String clientName; public final String clientName;
/**
* App package name.
*/
private final String packageName;
/**
* Player user-agent.
*/
public final String userAgent;
/** /**
* Device model, equivalent to {@link Build#MANUFACTURER} (System property: ro.product.vendor.manufacturer) * Device model, equivalent to {@link Build#MANUFACTURER} (System property: ro.product.vendor.manufacturer)
*/ */
@@ -124,11 +156,6 @@ public enum ClientType {
*/ */
public final String osVersion; public final String osVersion;
/**
* Player user-agent.
*/
public final String userAgent;
/** /**
* Android SDK version, equivalent to {@link Build.VERSION#SDK} (System property: ro.build.version.sdk) * Android SDK version, equivalent to {@link Build.VERSION#SDK} (System property: ro.build.version.sdk)
* Field is null if not applicable. * Field is null if not applicable.
@@ -136,43 +163,97 @@ public enum ClientType {
@Nullable @Nullable
public final String androidSdkVersion; public final String androidSdkVersion;
/**
* Android build id, equivalent to {@link Build#ID}.
* Field is null if not applicable.
*/
@Nullable
private final String buildId;
/**
* Cronet release version, as found in decompiled client apk.
* Field is null if not applicable.
*/
@Nullable
private final String cronetVersion;
/** /**
* App version. * App version.
*/ */
public final String clientVersion; public final String clientVersion;
/** /**
* If the client can access the API logged in. * If this client requires authentication and does not work
* if logged out or in incognito mode.
*/ */
public final boolean canLogin; public final boolean requiresAuth;
/**
* If the client should use authentication if available.
*/
public final boolean useAuth;
/** /**
* Friendly name displayed in stats for nerds. * Friendly name displayed in stats for nerds.
*/ */
public final String friendlyName; public final String friendlyName;
@SuppressWarnings("ConstantLocale")
ClientType(int id, ClientType(int id,
String clientName, String clientName,
String packageName,
String deviceMake, String deviceMake,
String deviceModel, String deviceModel,
String osName, String osName,
String osVersion, String osVersion,
String userAgent,
@Nullable String androidSdkVersion, @Nullable String androidSdkVersion,
@Nullable String buildId,
@Nullable String cronetVersion,
String clientVersion, String clientVersion,
boolean canLogin, boolean requiresAuth,
boolean useAuth,
String friendlyName) { String friendlyName) {
this.id = id; this.id = id;
this.clientName = clientName; this.clientName = clientName;
this.packageName = packageName;
this.deviceMake = deviceMake; this.deviceMake = deviceMake;
this.deviceModel = deviceModel; this.deviceModel = deviceModel;
this.osName = osName; this.osName = osName;
this.osVersion = osVersion; this.osVersion = osVersion;
this.userAgent = userAgent;
this.androidSdkVersion = androidSdkVersion; this.androidSdkVersion = androidSdkVersion;
this.buildId = buildId;
this.cronetVersion = cronetVersion;
this.clientVersion = clientVersion; this.clientVersion = clientVersion;
this.canLogin = canLogin; this.requiresAuth = requiresAuth;
this.useAuth = useAuth;
this.friendlyName = friendlyName; this.friendlyName = friendlyName;
Locale defaultLocale = Locale.getDefault();
if (androidSdkVersion == null) {
// Convert version from '18.2.22C152' into '18_2_22'
String userAgentOsVersion = osVersion
.replaceAll("(\\d+\\.\\d+\\.\\d+).*", "$1")
.replace(".", "_");
// https://github.com/mitmproxy/mitmproxy/issues/4836
this.userAgent = String.format("%s/%s (%s; U; CPU iOS %s like Mac OS X; %s)",
packageName,
clientVersion,
deviceModel,
userAgentOsVersion,
defaultLocale
);
} else {
this.userAgent = String.format("%s/%s (Linux; U; Android %s; %s; %s; Build/%s; Cronet/%s)",
packageName,
clientVersion,
osVersion,
defaultLocale,
deviceModel,
Objects.requireNonNull(buildId),
Objects.requireNonNull(cronetVersion)
);
}
Logger.printDebug(() -> "userAgent: " + this.userAgent);
} }
} }

View File

@@ -5,12 +5,12 @@ import org.json.JSONObject;
import java.io.IOException; import java.io.IOException;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.util.Locale;
import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Logger;
import app.revanced.extension.shared.requests.Requester; import app.revanced.extension.shared.requests.Requester;
import app.revanced.extension.shared.requests.Route; import app.revanced.extension.shared.requests.Route;
import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.BaseSettings;
import app.revanced.extension.shared.settings.AppLanguage;
import app.revanced.extension.shared.spoof.ClientType; import app.revanced.extension.shared.spoof.ClientType;
final class PlayerRoutes { final class PlayerRoutes {
@@ -31,7 +31,7 @@ final class PlayerRoutes {
private PlayerRoutes() { private PlayerRoutes() {
} }
static String createInnertubeBody(ClientType clientType) { static String createInnertubeBody(ClientType clientType, String videoId) {
JSONObject innerTubeBody = new JSONObject(); JSONObject innerTubeBody = new JSONObject();
try { try {
@@ -42,27 +42,28 @@ final class PlayerRoutes {
// but if this is a fall over client it will set the language even though // but if this is a fall over client it will set the language even though
// the audio language is not selectable in the UI. // the audio language is not selectable in the UI.
ClientType userSelectedClient = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get(); ClientType userSelectedClient = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
AppLanguage language = userSelectedClient == ClientType.ANDROID_VR_NO_AUTH Locale streamLocale = userSelectedClient == ClientType.ANDROID_VR_NO_AUTH
? BaseSettings.SPOOF_VIDEO_STREAMS_LANGUAGE.get() ? BaseSettings.SPOOF_VIDEO_STREAMS_LANGUAGE.get().getLocale()
: AppLanguage.DEFAULT; : Locale.getDefault();
JSONObject client = new JSONObject(); JSONObject client = new JSONObject();
client.put("hl", language.getLanguage());
client.put("clientName", clientType.clientName);
client.put("clientVersion", clientType.clientVersion);
client.put("deviceMake", clientType.deviceMake); client.put("deviceMake", clientType.deviceMake);
client.put("deviceModel", clientType.deviceModel); client.put("deviceModel", clientType.deviceModel);
client.put("clientName", clientType.clientName);
client.put("clientVersion", clientType.clientVersion);
client.put("osName", clientType.osName); client.put("osName", clientType.osName);
client.put("osVersion", clientType.osVersion); client.put("osVersion", clientType.osVersion);
if (clientType.androidSdkVersion != null) { if (clientType.androidSdkVersion != null) {
client.put("androidSdkVersion", clientType.androidSdkVersion); client.put("androidSdkVersion", clientType.androidSdkVersion);
} }
client.put("hl", streamLocale.getLanguage());
client.put("gl", streamLocale.getCountry());
context.put("client", client); context.put("client", client);
innerTubeBody.put("context", context); innerTubeBody.put("context", context);
innerTubeBody.put("contentCheckOk", true); innerTubeBody.put("contentCheckOk", true);
innerTubeBody.put("racyCheckOk", true); innerTubeBody.put("racyCheckOk", true);
innerTubeBody.put("videoId", "%s"); innerTubeBody.put("videoId", videoId);
} catch (JSONException e) { } catch (JSONException e) {
Logger.printException(() -> "Failed to create innerTubeBody", e); Logger.printException(() -> "Failed to create innerTubeBody", e);
} }
@@ -78,7 +79,9 @@ final class PlayerRoutes {
connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("User-Agent", clientType.userAgent); connection.setRequestProperty("User-Agent", clientType.userAgent);
connection.setRequestProperty("X-YouTube-Client-Version", String.valueOf(clientType.id)); // Not a typo. "Client-Name" uses the client type id.
connection.setRequestProperty("X-YouTube-Client-Name", String.valueOf(clientType.id));
connection.setRequestProperty("X-YouTube-Client-Version", clientType.clientVersion);
connection.setUseCaches(false); connection.setUseCaches(false);
connection.setDoOutput(true); connection.setDoOutput(true);

View File

@@ -120,7 +120,8 @@ public class StreamingDataRequest {
} }
@Nullable @Nullable
private static HttpURLConnection send(ClientType clientType, String videoId, private static HttpURLConnection send(ClientType clientType,
String videoId,
Map<String, String> playerHeaders, Map<String, String> playerHeaders,
boolean showErrorToasts) { boolean showErrorToasts) {
Objects.requireNonNull(clientType); Objects.requireNonNull(clientType);
@@ -128,21 +129,24 @@ public class StreamingDataRequest {
Objects.requireNonNull(playerHeaders); Objects.requireNonNull(playerHeaders);
final long startTime = System.currentTimeMillis(); final long startTime = System.currentTimeMillis();
Logger.printDebug(() -> "Fetching video streams for: " + videoId + " using client: " + clientType);
try { try {
HttpURLConnection connection = PlayerRoutes.getPlayerResponseConnectionFromRoute(GET_STREAMING_DATA, clientType); HttpURLConnection connection = PlayerRoutes.getPlayerResponseConnectionFromRoute(GET_STREAMING_DATA, clientType);
connection.setConnectTimeout(HTTP_TIMEOUT_MILLISECONDS); connection.setConnectTimeout(HTTP_TIMEOUT_MILLISECONDS);
connection.setReadTimeout(HTTP_TIMEOUT_MILLISECONDS); connection.setReadTimeout(HTTP_TIMEOUT_MILLISECONDS);
boolean authHeadersIncludes = false;
for (String key : REQUEST_HEADER_KEYS) { for (String key : REQUEST_HEADER_KEYS) {
String value = playerHeaders.get(key); String value = playerHeaders.get(key);
if (value != null) { if (value != null) {
if (key.equals(AUTHORIZATION_HEADER)) { if (key.equals(AUTHORIZATION_HEADER)) {
if (!clientType.canLogin) { if (!clientType.useAuth) {
Logger.printDebug(() -> "Not including request header: " + key); Logger.printDebug(() -> "Not including request header: " + key);
continue; continue;
} }
authHeadersIncludes = true;
} }
Logger.printDebug(() -> "Including request header: " + key); Logger.printDebug(() -> "Including request header: " + key);
@@ -150,7 +154,15 @@ public class StreamingDataRequest {
} }
} }
String innerTubeBody = String.format(PlayerRoutes.createInnertubeBody(clientType), videoId); if (!authHeadersIncludes && clientType.requiresAuth) {
Logger.printDebug(() -> "Skipping client since user is not logged in: " + clientType
+ " videoId: " + videoId);
return null;
}
Logger.printDebug(() -> "Fetching video streams for: " + videoId + " using client: " + clientType);
String innerTubeBody = PlayerRoutes.createInnertubeBody(clientType, videoId);
byte[] requestBody = innerTubeBody.getBytes(StandardCharsets.UTF_8); byte[] requestBody = innerTubeBody.getBytes(StandardCharsets.UTF_8);
connection.setFixedLengthStreamingMode(requestBody.length); connection.setFixedLengthStreamingMode(requestBody.length);
connection.getOutputStream().write(requestBody); connection.getOutputStream().write(requestBody);

View File

@@ -4,7 +4,7 @@ plugins {
android { android {
namespace = "app.revanced.extension" namespace = "app.revanced.extension"
compileSdk = 33 compileSdk = 34
defaultConfig { defaultConfig {
minSdk = 24 minSdk = 24

View File

@@ -3,3 +3,14 @@ dependencies {
compileOnly(project(":extensions:tiktok:stub")) compileOnly(project(":extensions:tiktok:stub"))
compileOnly(libs.annotation) compileOnly(libs.annotation)
} }
android {
defaultConfig {
minSdk = 22
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}

View File

@@ -21,9 +21,11 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
protected void syncSettingWithPreference(@NonNull Preference pref, protected void syncSettingWithPreference(@NonNull Preference pref,
@NonNull Setting<?> setting, @NonNull Setting<?> setting,
boolean applySettingToPreference) { boolean applySettingToPreference) {
if (pref instanceof RangeValuePreference rangeValuePref) { if (pref instanceof RangeValuePreference) {
RangeValuePreference rangeValuePref = (RangeValuePreference) pref;
Setting.privateSetValueFromString(setting, rangeValuePref.getValue()); Setting.privateSetValueFromString(setting, rangeValuePref.getValue());
} else if (pref instanceof DownloadPathPreference downloadPathPref) { } else if (pref instanceof DownloadPathPreference) {
DownloadPathPreference downloadPathPref = (DownloadPathPreference) pref;
Setting.privateSetValueFromString(setting, downloadPathPref.getValue()); Setting.privateSetValueFromString(setting, downloadPathPref.getValue());
} else { } else {
super.syncSettingWithPreference(pref, setting, applySettingToPreference); super.syncSettingWithPreference(pref, setting, applySettingToPreference);
@@ -32,7 +34,7 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
@Override @Override
protected void initialize() { protected void initialize() {
final var context = getContext(); final var context = getActivity();
// Currently no resources can be compiled for TikTok (fails with aapt error). // Currently no resources can be compiled for TikTok (fails with aapt error).
// So all TikTok Strings are hard coded in the extension. // So all TikTok Strings are hard coded in the extension.

View File

@@ -4,14 +4,9 @@ plugins {
android { android {
namespace = "app.revanced.extension" namespace = "app.revanced.extension"
compileSdk = 33 compileSdk = 34
defaultConfig { defaultConfig {
minSdk = 24 minSdk = 22
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
} }
} }

View File

@@ -1,3 +1,9 @@
dependencies { dependencies {
compileOnly(project(":extensions:tumblr:stub")) compileOnly(project(":extensions:tumblr:stub"))
} }
android {
defaultConfig {
minSdk = 26
}
}

View File

@@ -1,17 +1,14 @@
android.namespace = "app.revanced.extension"
plugins { plugins {
id(libs.plugins.android.library.get().pluginId) id(libs.plugins.android.library.get().pluginId)
} }
android { android {
namespace = "app.revanced.extension" namespace = "app.revanced.extension"
compileSdk = 33 compileSdk = 34
defaultConfig { defaultConfig {
minSdk = 24 minSdk = 26
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
} }
} }

View File

@@ -6,3 +6,14 @@ dependencies {
compileOnly(libs.annotation) compileOnly(libs.annotation)
compileOnly(libs.appcompat) compileOnly(libs.appcompat)
} }
android {
defaultConfig {
minSdk = 21
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}

View File

@@ -4,14 +4,9 @@ plugins {
android { android {
namespace = "app.revanced.extension" namespace = "app.revanced.extension"
compileSdk = 33 compileSdk = 34
defaultConfig { defaultConfig {
minSdk = 24 minSdk = 21
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
} }
} }

View File

@@ -1,8 +1,13 @@
//noinspection GradleDependency
android.compileSdk = 33
dependencies { dependencies {
compileOnly(project(":extensions:shared:library")) compileOnly(project(":extensions:shared:library"))
compileOnly(project(":extensions:youtube:stub")) compileOnly(project(":extensions:youtube:stub"))
compileOnly(libs.annotation) compileOnly(libs.annotation)
} }
android {
compileSdk = 33 // TODO: Update Swipe controls code to allow updating this to the latest sdk.
defaultConfig {
minSdk = 26
}
}

View File

@@ -90,4 +90,12 @@ public class ThemeHelper {
public static int getForegroundColor() { public static int getForegroundColor() {
return isDarkTheme() ? getLightThemeColor() : getDarkThemeColor(); return isDarkTheme() ? getLightThemeColor() : getDarkThemeColor();
} }
public static int getToolbarBackgroundColor() {
final String colorName = isDarkTheme()
? "yt_black3"
: "yt_white1";
return getColorInt(colorName);
}
} }

View File

@@ -23,21 +23,30 @@ public final class ChangeStartPagePatch {
/** /**
* Browse id. * Browse id.
*/ */
ALL_SUBSCRIPTIONS("FEchannels", TRUE),
BROWSE("FEguide_builder", TRUE), BROWSE("FEguide_builder", TRUE),
EXPLORE("FEexplore", TRUE), EXPLORE("FEexplore", TRUE),
HISTORY("FEhistory", TRUE), HISTORY("FEhistory", TRUE),
LIBRARY("FElibrary", TRUE), LIBRARY("FElibrary", TRUE),
MOVIE("FEstorefront", TRUE), MOVIE("FEstorefront", TRUE),
NOTIFICATIONS("FEactivity", TRUE),
PLAYLISTS("FEplaylist_aggregation", TRUE),
SUBSCRIPTIONS("FEsubscriptions", TRUE), SUBSCRIPTIONS("FEsubscriptions", TRUE),
TRENDING("FEtrending", TRUE), TRENDING("FEtrending", TRUE),
YOUR_CLIPS("FEclips", TRUE),
/** /**
* Channel id, this can be used as a browseId. * Channel id, this can be used as a browseId.
*/ */
COURSES("UCtFRv9O2AHqOZjjynzrv-xg", TRUE),
FASHION("UCrpQ4p1Ql_hG8rKXIKM1MOQ", TRUE),
GAMING("UCOpNcN46UbXVtpKMrmU4Abg", TRUE), GAMING("UCOpNcN46UbXVtpKMrmU4Abg", TRUE),
LIVE("UC4R8DWoMoI7CAwX8_LjQHig", TRUE), LIVE("UC4R8DWoMoI7CAwX8_LjQHig", TRUE),
MUSIC("UC-9-kyTW8ZkZNDHQJ6FgpwQ", TRUE), MUSIC("UC-9-kyTW8ZkZNDHQJ6FgpwQ", TRUE),
NEWS("UCYfdidRxbB8Qhf0Nx7ioOYw", TRUE),
SHOPPING("UCkYQyvc_i9hXEo4xic9Hh2g", TRUE),
SPORTS("UCEgdi0XIXXZ-qJOFPf4JSKw", TRUE), SPORTS("UCEgdi0XIXXZ-qJOFPf4JSKw", TRUE),
VIRTUAL_REALITY("UCzuqhhs6NWbgTzMuM09WKDQ", TRUE),
/** /**
* Playlist id, this can be used as a browseId. * Playlist id, this can be used as a browseId.
@@ -51,12 +60,12 @@ public final class ChangeStartPagePatch {
SEARCH("com.google.android.youtube.action.open.search", FALSE), SEARCH("com.google.android.youtube.action.open.search", FALSE),
SHORTS("com.google.android.youtube.action.open.shorts", FALSE); SHORTS("com.google.android.youtube.action.open.shorts", FALSE);
@Nullable
final Boolean isBrowseId;
@NonNull @NonNull
final String id; final String id;
@Nullable
final Boolean isBrowseId;
StartPage(@NonNull String id, @Nullable Boolean isBrowseId) { StartPage(@NonNull String id, @Nullable Boolean isBrowseId) {
this.id = id; this.id = id;
this.isBrowseId = isBrowseId; this.isBrowseId = isBrowseId;
@@ -122,7 +131,7 @@ public final class ChangeStartPagePatch {
} }
appLaunched = true; appLaunched = true;
final String intentAction = START_PAGE.id; String intentAction = START_PAGE.id;
Logger.printDebug(() -> "Changing intent action to " + intentAction); Logger.printDebug(() -> "Changing intent action to " + intentAction);
intent.setAction(intentAction); intent.setAction(intentAction);
} }

View File

@@ -0,0 +1,15 @@
package app.revanced.extension.youtube.patches;
import app.revanced.extension.youtube.settings.Settings;
@SuppressWarnings("unused")
public class DisableHdrPatch {
/**
* Injection point.
*/
public static boolean disableHDRVideo() {
return !Settings.DISABLE_HDR_VIDEO.get();
}
}

View File

@@ -9,14 +9,23 @@ import app.revanced.extension.shared.settings.BaseSettings;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final class EnableDebuggingPatch { public final class EnableDebuggingPatch {
private static final ConcurrentMap<Long, Boolean> featureFlags /**
= new ConcurrentHashMap<>(300, 0.75f, 1); * Only log if debugging is enabled on startup.
* This prevents enabling debugging
* while the app is running then failing to restart
* resulting in an incomplete log.
*/
private static final boolean LOG_FEATURE_FLAGS = BaseSettings.DEBUG.get();
private static final ConcurrentMap<Long, Boolean> featureFlags = LOG_FEATURE_FLAGS
? new ConcurrentHashMap<>(800, 0.5f, 1)
: null;
/** /**
* Injection point. * Injection point.
*/ */
public static boolean isBooleanFeatureFlagEnabled(boolean value, long flag) { public static boolean isBooleanFeatureFlagEnabled(boolean value, long flag) {
if (value && BaseSettings.DEBUG.get()) { if (LOG_FEATURE_FLAGS && value) {
if (featureFlags.putIfAbsent(flag, true) == null) { if (featureFlags.putIfAbsent(flag, true) == null) {
Logger.printDebug(() -> "boolean feature is enabled: " + flag); Logger.printDebug(() -> "boolean feature is enabled: " + flag);
} }
@@ -29,7 +38,7 @@ public final class EnableDebuggingPatch {
* Injection point. * Injection point.
*/ */
public static double isDoubleFeatureFlagEnabled(double value, long flag, double defaultValue) { public static double isDoubleFeatureFlagEnabled(double value, long flag, double defaultValue) {
if (defaultValue != value && BaseSettings.DEBUG.get()) { if (LOG_FEATURE_FLAGS && defaultValue != value) {
if (featureFlags.putIfAbsent(flag, true) == null) { if (featureFlags.putIfAbsent(flag, true) == null) {
// Align the log outputs to make post processing easier. // Align the log outputs to make post processing easier.
Logger.printDebug(() -> " double feature is enabled: " + flag Logger.printDebug(() -> " double feature is enabled: " + flag
@@ -44,7 +53,7 @@ public final class EnableDebuggingPatch {
* Injection point. * Injection point.
*/ */
public static long isLongFeatureFlagEnabled(long value, long flag, long defaultValue) { public static long isLongFeatureFlagEnabled(long value, long flag, long defaultValue) {
if (defaultValue != value && BaseSettings.DEBUG.get()) { if (LOG_FEATURE_FLAGS && defaultValue != value) {
if (featureFlags.putIfAbsent(flag, true) == null) { if (featureFlags.putIfAbsent(flag, true) == null) {
Logger.printDebug(() -> " long feature is enabled: " + flag Logger.printDebug(() -> " long feature is enabled: " + flag
+ " value: " + value + (defaultValue == 0 ? "" : " default: " + defaultValue)); + " value: " + value + (defaultValue == 0 ? "" : " default: " + defaultValue));
@@ -58,7 +67,7 @@ public final class EnableDebuggingPatch {
* Injection point. * Injection point.
*/ */
public static String isStringFeatureFlagEnabled(String value, long flag, String defaultValue) { public static String isStringFeatureFlagEnabled(String value, long flag, String defaultValue) {
if (BaseSettings.DEBUG.get() && !defaultValue.equals(value)) { if (LOG_FEATURE_FLAGS && !defaultValue.equals(value)) {
if (featureFlags.putIfAbsent(flag, true) == null) { if (featureFlags.putIfAbsent(flag, true) == null) {
Logger.printDebug(() -> " string feature is enabled: " + flag Logger.printDebug(() -> " string feature is enabled: " + flag
+ " value: " + value + (defaultValue.isEmpty() ? "" : " default: " + defaultValue)); + " value: " + value + (defaultValue.isEmpty() ? "" : " default: " + defaultValue));

View File

@@ -4,7 +4,6 @@ import static app.revanced.extension.youtube.returnyoutubedislike.ReturnYouTubeD
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.ShapeDrawable;
import android.os.Build;
import android.text.Spannable; import android.text.Spannable;
import android.text.SpannableString; import android.text.SpannableString;
import android.text.Spanned; import android.text.Spanned;
@@ -366,9 +365,7 @@ public class ReturnYouTubeDislikePatch {
private static final List<WeakReference<TextView>> shortsTextViewRefs = new ArrayList<>(); private static final List<WeakReference<TextView>> shortsTextViewRefs = new ArrayList<>();
private static void clearRemovedShortsTextViews() { private static void clearRemovedShortsTextViews() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // YouTube requires Android N or greater shortsTextViewRefs.removeIf(ref -> ref.get() == null);
shortsTextViewRefs.removeIf(ref -> ref.get() == null);
}
} }
/** /**

View File

@@ -5,10 +5,13 @@ import app.revanced.extension.youtube.settings.Settings;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class VideoAdsPatch { public class VideoAdsPatch {
// Used by app.revanced.patches.youtube.ad.general.video.patch.VideoAdsPatch private static final boolean SHOW_VIDEO_ADS = !Settings.HIDE_VIDEO_ADS.get();
// depends on Whitelist patch (still needs to be written)
/**
* Injection point.
*/
public static boolean shouldShowAds() { public static boolean shouldShowAds() {
return !Settings.HIDE_VIDEO_ADS.get(); // TODO && Whitelist.shouldShowAds(); return SHOW_VIDEO_ADS;
} }
} }

View File

@@ -8,10 +8,12 @@ import android.view.View;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import app.revanced.extension.youtube.settings.Settings; import java.util.List;
import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Logger;
import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.Utils;
import app.revanced.extension.youtube.StringTrieSearch; import app.revanced.extension.youtube.StringTrieSearch;
import app.revanced.extension.youtube.settings.Settings;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final class AdsFilter extends Filter { public final class AdsFilter extends Filter {
@@ -22,6 +24,11 @@ public final class AdsFilter extends Filter {
// endregion // endregion
// https://encrypted-tbn0.gstatic.com/shopping?q=abc
private static final String STORE_BANNER_DOMAIN = "gstatic.com/shopping";
private static final boolean HIDE_END_SCREEN_STORE_BANNER =
Settings.HIDE_END_SCREEN_STORE_BANNER.get();
private final StringTrieSearch exceptions = new StringTrieSearch(); private final StringTrieSearch exceptions = new StringTrieSearch();
private final StringFilterGroup playerShoppingShelf; private final StringFilterGroup playerShoppingShelf;
@@ -66,7 +73,9 @@ public final class AdsFilter extends Filter {
"full_width_square_image_layout", "full_width_square_image_layout",
"video_display_button_group_layout", "video_display_button_group_layout",
"landscape_image_wide_button_layout", "landscape_image_wide_button_layout",
"video_display_carousel_button_group_layout" "video_display_carousel_button_group_layout",
"compact_landscape_image_layout", // Tablet layout search results.
"text_image_no_button_layout" // Tablet layout search results.
); );
final var generalAds = new StringFilterGroup( final var generalAds = new StringFilterGroup(
@@ -112,23 +121,24 @@ public final class AdsFilter extends Filter {
"expandable_list" "expandable_list"
); );
channelProfile = new StringFilterGroup(
null,
"channel_profile.eml"
);
playerShoppingShelf = new StringFilterGroup( playerShoppingShelf = new StringFilterGroup(
null, Settings.HIDE_PLAYER_STORE_SHELF,
"horizontal_shelf.eml" "horizontal_shelf.eml"
); );
playerShoppingShelfBuffer = new ByteArrayFilterGroup( playerShoppingShelfBuffer = new ByteArrayFilterGroup(
Settings.HIDE_PLAYER_STORE_SHELF, null,
"shopping_item_card_list.eml" "shopping_item_card_list.eml"
); );
visitStoreButton = new ByteArrayFilterGroup( channelProfile = new StringFilterGroup(
Settings.HIDE_VISIT_STORE_BUTTON, Settings.HIDE_VISIT_STORE_BUTTON,
"channel_profile.eml",
"page_header.eml"
);
visitStoreButton = new ByteArrayFilterGroup(
null,
"header_store_button" "header_store_button"
); );
@@ -172,6 +182,11 @@ public final class AdsFilter extends Filter {
return false; return false;
} }
// Check for the index because of likelihood of false positives.
if (matchedGroup == shoppingLinks && contentIndex != 0) {
return false;
}
if (exceptions.matches(path)) if (exceptions.matches(path))
return false; return false;
@@ -188,13 +203,25 @@ public final class AdsFilter extends Filter {
return false; return false;
} }
// Check for the index because of likelihood of false positives.
if (matchedGroup == shoppingLinks && contentIndex != 0)
return false;
return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex);
} }
/**
* Injection point.
*
* @param elementsList List of components of the end screen container.
* @param protobufList Component (ProtobufList).
*/
public static void hideEndScreenStoreBanner(List<Object> elementsList, Object protobufList) {
if (HIDE_END_SCREEN_STORE_BANNER && protobufList.toString().contains(STORE_BANNER_DOMAIN)) {
Logger.printDebug(() -> "Hiding store banner");
return;
}
elementsList.add(protobufList);
}
/** /**
* Hide the view, which shows ads in the homepage. * Hide the view, which shows ads in the homepage.
* *

View File

@@ -45,6 +45,11 @@ final class DescriptionComponentsFilter extends Filter {
"transcript_section" "transcript_section"
); );
final StringFilterGroup howThisWasMadeSection = new StringFilterGroup(
Settings.HIDE_HOW_THIS_WAS_MADE_SECTION,
"how_this_was_made_section"
);
macroMarkersCarousel = new StringFilterGroup( macroMarkersCarousel = new StringFilterGroup(
null, null,
"macro_markers_carousel.eml" "macro_markers_carousel.eml"
@@ -64,6 +69,7 @@ final class DescriptionComponentsFilter extends Filter {
addPathCallbacks( addPathCallbacks(
attributesSection, attributesSection,
infoCardsSection, infoCardsSection,
howThisWasMadeSection,
podcastSection, podcastSection,
transcriptSection, transcriptSection,
macroMarkersCarousel macroMarkersCarousel

View File

@@ -80,7 +80,9 @@ public final class LayoutComponentsFilter extends Filter {
"images_post_root_slim.eml", "images_post_root_slim.eml",
"text_post_root_slim.eml", "text_post_root_slim.eml",
"post_base_wrapper_slim.eml", "post_base_wrapper_slim.eml",
"poll_post_root.eml" "poll_post_root.eml",
"videos_post_root.eml",
"post_shelf_slim.eml"
); );
final var communityGuidelines = new StringFilterGroup( final var communityGuidelines = new StringFilterGroup(

View File

@@ -6,11 +6,19 @@ import android.content.res.Resources;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.AnimatedVectorDrawable;
import com.airbnb.lottie.LottieAnimationView;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Arrays; import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
import java.util.Scanner;
import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Logger;
import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.Utils;
import app.revanced.extension.shared.settings.BaseSettings;
import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.settings.Settings;
@SuppressWarnings("unused") @SuppressWarnings("unused")
@@ -18,6 +26,8 @@ public final class SeekbarColorPatch {
private static final boolean SEEKBAR_CUSTOM_COLOR_ENABLED = Settings.SEEKBAR_CUSTOM_COLOR.get(); private static final boolean SEEKBAR_CUSTOM_COLOR_ENABLED = Settings.SEEKBAR_CUSTOM_COLOR.get();
private static final boolean HIDE_SEEKBAR_THUMBNAIL_ENABLED = Settings.HIDE_SEEKBAR_THUMBNAIL.get();
/** /**
* Default color of the litho seekbar. * Default color of the litho seekbar.
* Differs slightly from the default custom seekbar color setting. * Differs slightly from the default custom seekbar color setting.
@@ -25,14 +35,19 @@ public final class SeekbarColorPatch {
private static final int ORIGINAL_SEEKBAR_COLOR = 0xFFFF0000; private static final int ORIGINAL_SEEKBAR_COLOR = 0xFFFF0000;
/** /**
* Default colors of the gradient seekbar. * Feed default colors of the gradient seekbar.
*/ */
private static final int[] ORIGINAL_SEEKBAR_GRADIENT_COLORS = { 0xFFFF0033, 0xFFFF2791 }; private static final int[] FEED_ORIGINAL_SEEKBAR_GRADIENT_COLORS = { 0xFFFF0033, 0xFFFF2791 };
/** /**
* Default positions of the gradient seekbar. * Feed default positions of the gradient seekbar.
*/ */
private static final float[] ORIGINAL_SEEKBAR_GRADIENT_POSITIONS = { 0.8f, 1.0f }; private static final float[] FEED_ORIGINAL_SEEKBAR_GRADIENT_POSITIONS = { 0.8f, 1.0f };
/**
* Empty seekbar gradient, if hide seekbar in feed is enabled.
*/
private static final int[] HIDDEN_SEEKBAR_GRADIENT_COLORS = { 0x0, 0x0 };
/** /**
* Default YouTube seekbar color brightness. * Default YouTube seekbar color brightness.
@@ -41,16 +56,21 @@ public final class SeekbarColorPatch {
/** /**
* If {@link Settings#SEEKBAR_CUSTOM_COLOR} is enabled, * If {@link Settings#SEEKBAR_CUSTOM_COLOR} is enabled,
* this is the color value of {@link Settings#SEEKBAR_CUSTOM_COLOR_VALUE}. * this is the color value of {@link Settings#SEEKBAR_CUSTOM_COLOR_PRIMARY}.
* Otherwise this is {@link #ORIGINAL_SEEKBAR_COLOR}. * Otherwise this is {@link #ORIGINAL_SEEKBAR_COLOR}.
*/ */
private static int seekbarColor = ORIGINAL_SEEKBAR_COLOR; private static int customSeekbarColor = ORIGINAL_SEEKBAR_COLOR;
/** /**
* Custom seekbar hue, saturation, and brightness values. * Custom seekbar hue, saturation, and brightness values.
*/ */
private static final float[] customSeekbarColorHSV = new float[3]; private static final float[] customSeekbarColorHSV = new float[3];
/**
* Custom seekbar color, used for linear gradient replacements.
*/
private static final int[] customSeekbarColorGradient = new int[2];
static { static {
float[] hsv = new float[3]; float[] hsv = new float[3];
Color.colorToHSV(ORIGINAL_SEEKBAR_COLOR, hsv); Color.colorToHSV(ORIGINAL_SEEKBAR_COLOR, hsv);
@@ -63,37 +83,22 @@ public final class SeekbarColorPatch {
private static void loadCustomSeekbarColor() { private static void loadCustomSeekbarColor() {
try { try {
seekbarColor = Color.parseColor(Settings.SEEKBAR_CUSTOM_COLOR_VALUE.get()); customSeekbarColor = Color.parseColor(Settings.SEEKBAR_CUSTOM_COLOR_PRIMARY.get());
Color.colorToHSV(seekbarColor, customSeekbarColorHSV); Color.colorToHSV(customSeekbarColor, customSeekbarColorHSV);
customSeekbarColorGradient[0] = customSeekbarColor;
customSeekbarColorGradient[1] = Color.parseColor(Settings.SEEKBAR_CUSTOM_COLOR_ACCENT.get());
} catch (Exception ex) { } catch (Exception ex) {
Utils.showToastShort(str("revanced_seekbar_custom_color_invalid")); Utils.showToastShort(str("revanced_seekbar_custom_color_invalid"));
Settings.SEEKBAR_CUSTOM_COLOR_VALUE.resetToDefault(); Settings.SEEKBAR_CUSTOM_COLOR_PRIMARY.resetToDefault();
Settings.SEEKBAR_CUSTOM_COLOR_ACCENT.resetToDefault();
loadCustomSeekbarColor(); loadCustomSeekbarColor();
} }
} }
public static int getSeekbarColor() { public static int getSeekbarColor() {
return seekbarColor; return customSeekbarColor;
}
/**
* Injection point
*/
public static boolean playerSeekbarGradientEnabled(boolean original) {
if (SEEKBAR_CUSTOM_COLOR_ENABLED) return false;
return original;
}
/**
* Injection point
*/
public static boolean useLotteLaunchSplashScreen(boolean original) {
Logger.printDebug(() -> "useLotteLaunchSplashScreen original: " + original);
if (SEEKBAR_CUSTOM_COLOR_ENABLED) return false;
return original;
} }
private static int colorChannelTo3Bits(int channel8Bits) { private static int colorChannelTo3Bits(int channel8Bits) {
@@ -119,6 +124,17 @@ public final class SeekbarColorPatch {
/** /**
* Injection point * Injection point
*/ */
public static boolean useLotteLaunchSplashScreen(boolean original) {
// This method is only used for development purposes to force the old style launch screen.
// Forcing this off on some devices can cause unexplained startup crashes,
// where the lottie animation is still used even though this condition appears to bypass it.
return original; // false = drawable style, true = lottie style.
}
/**
* Injection point.
* Old drawable style launch screen.
*/
public static void setSplashAnimationDrawableTheme(AnimatedVectorDrawable vectorDrawable) { public static void setSplashAnimationDrawableTheme(AnimatedVectorDrawable vectorDrawable) {
// Alternatively a ColorMatrixColorFilter can be used to change the color of the drawable // Alternatively a ColorMatrixColorFilter can be used to change the color of the drawable
// without using any styles, but a color filter cannot selectively change the seekbar // without using any styles, but a color filter cannot selectively change the seekbar
@@ -126,7 +142,9 @@ public final class SeekbarColorPatch {
// Even if the seekbar color xml value is changed to a completely different color (such as green), // Even if the seekbar color xml value is changed to a completely different color (such as green),
// a color filter still cannot be selectively applied when the drawable has more than 1 color. // a color filter still cannot be selectively applied when the drawable has more than 1 color.
try { try {
String seekbarStyle = get9BitStyleIdentifier(seekbarColor); // Must set the color even if custom seekbar is off,
// because the xml color was replaced with a themed value.
String seekbarStyle = get9BitStyleIdentifier(customSeekbarColor);
Logger.printDebug(() -> "Using splash seekbar style: " + seekbarStyle); Logger.printDebug(() -> "Using splash seekbar style: " + seekbarStyle);
final int styleIdentifierDefault = Utils.getResourceIdentifier( final int styleIdentifierDefault = Utils.getResourceIdentifier(
@@ -146,6 +164,84 @@ public final class SeekbarColorPatch {
} }
} }
/**
* Injection point.
* Modern Lottie style animation.
*/
public static void setSplashAnimationLottie(LottieAnimationView view, int resourceId) {
try {
if (!SEEKBAR_CUSTOM_COLOR_ENABLED) {
view.patch_setAnimation(resourceId);
return;
}
//noinspection ConstantConditions
if (false) { // Set true to force slow animation for development.
final int longAnimation = Utils.getResourceIdentifier(
Utils.isDarkModeEnabled(Utils.getContext())
? "startup_animation_5s_30fps_dark"
: "startup_animation_5s_30fps_light",
"raw");
if (longAnimation != 0) {
resourceId = longAnimation;
}
}
// Must specify primary key name otherwise the morphing YT logo color is also changed.
String originalKey = "\"k\":";
String originalPrimary = originalKey + "[1,0,0.2,1]";
String originalAccent = originalKey + "[1,0.152941176471,0.56862745098,1]";
String replacementPrimary = originalKey + getColorStringArray(customSeekbarColor);
String replacementAccent = originalKey + getColorStringArray(customSeekbarColorGradient[1]);
String json = loadRawResourceAsString(resourceId);
if (json == null) {
return; // Should never happen.
}
if (BaseSettings.DEBUG.get() && (!json.contains(originalPrimary) || !json.contains(originalAccent))) {
String jsonFinal = json;
Logger.printException(() -> "Could not replace launch animation colors: " + jsonFinal);
}
Logger.printDebug(() -> "Replacing Lottie animation JSON");
json = json.replace(originalPrimary, replacementPrimary);
json = json.replace(originalAccent, replacementAccent);
// cacheKey is not needed since the animation will not be reused.
view.patch_setAnimation(new ByteArrayInputStream(json.getBytes()), null);
} catch (Exception ex) {
Logger.printException(() -> "setSplashAnimationLottie failure", ex);
}
}
private static String getColorStringArray(int color) {
return Arrays.toString(new double[]{
Color.red(color) / 255.0,
Color.green(color) / 255.0,
Color.blue(color) / 255.0,
Color.alpha(color) / 255.0
});
}
private static String loadRawResourceAsString(int resourceId) {
try (InputStream inputStream = Utils.getContext().getResources().openRawResource(resourceId);
Scanner scanner = new Scanner(inputStream, StandardCharsets.UTF_8.name()).useDelimiter("\\A")) {
return scanner.next();
} catch (IOException e) {
Logger.printException(() -> "Could not load resource: " + resourceId);
return null;
}
}
/**
* Injection point.
*/
public static boolean showWatchHistoryProgressDrawable(boolean original) {
return !HIDE_SEEKBAR_THUMBNAIL_ENABLED && original;
}
/** /**
* Injection point. * Injection point.
* *
@@ -156,35 +252,61 @@ public final class SeekbarColorPatch {
*/ */
public static int getLithoColor(int colorValue) { public static int getLithoColor(int colorValue) {
if (colorValue == ORIGINAL_SEEKBAR_COLOR) { if (colorValue == ORIGINAL_SEEKBAR_COLOR) {
if (Settings.HIDE_SEEKBAR_THUMBNAIL.get()) { if (HIDE_SEEKBAR_THUMBNAIL_ENABLED) {
return 0x00000000; return 0x0;
} }
return getSeekbarColorValue(ORIGINAL_SEEKBAR_COLOR); return customSeekbarColor;
} }
return colorValue; return colorValue;
} }
private static String colorArrayToHex(int[] colors) {
final int length = colors.length;
StringBuilder builder = new StringBuilder(length * 12);
builder.append("[");
int i = 0;
for (int color : colors) {
builder.append(String.format("#%X", color));
if (++i < length) {
builder.append(", ");
}
}
builder.append("]");
return builder.toString();
}
/** /**
* Injection point. * Injection point.
*/ */
public static void setLinearGradient(int[] colors, float[] positions) { public static int[] getPlayerLinearGradient(int[] original) {
final boolean hideSeekbar = Settings.HIDE_SEEKBAR_THUMBNAIL.get(); return SEEKBAR_CUSTOM_COLOR_ENABLED
? customSeekbarColorGradient
: original;
}
if (SEEKBAR_CUSTOM_COLOR_ENABLED || hideSeekbar) { /**
* Injection point.
*/
public static int[] getLithoLinearGradient(int[] colors, float[] positions) {
if (SEEKBAR_CUSTOM_COLOR_ENABLED || HIDE_SEEKBAR_THUMBNAIL_ENABLED) {
// Most litho usage of linear gradients is hooked here, // Most litho usage of linear gradients is hooked here,
// so must only change if the values are those for the seekbar. // so must only change if the values are those for the seekbar.
if (Arrays.equals(ORIGINAL_SEEKBAR_GRADIENT_COLORS, colors) if ((Arrays.equals(FEED_ORIGINAL_SEEKBAR_GRADIENT_COLORS, colors)
&& Arrays.equals(ORIGINAL_SEEKBAR_GRADIENT_POSITIONS, positions)) { && Arrays.equals(FEED_ORIGINAL_SEEKBAR_GRADIENT_POSITIONS, positions))) {
Arrays.fill(colors, hideSeekbar return HIDE_SEEKBAR_THUMBNAIL_ENABLED
? 0x00000000 ? HIDDEN_SEEKBAR_GRADIENT_COLORS
: seekbarColor); : customSeekbarColorGradient;
return;
} }
Logger.printDebug(() -> "Ignoring gradient colors: " + Arrays.toString(colors) Logger.printDebug(() -> "Ignoring gradient colors: " + colorArrayToHex(colors)
+ " positions: " + Arrays.toString(positions)); + " positions: " + Arrays.toString(positions));
} }
return colors;
} }
/** /**
@@ -198,7 +320,7 @@ public final class SeekbarColorPatch {
} }
return colorValue == ORIGINAL_SEEKBAR_COLOR return colorValue == ORIGINAL_SEEKBAR_COLOR
? getSeekbarColorValue(ORIGINAL_SEEKBAR_COLOR) ? customSeekbarColor
: colorValue; : colorValue;
} }
@@ -208,11 +330,9 @@ public final class SeekbarColorPatch {
* Overrides color used for the video player seekbar. * Overrides color used for the video player seekbar.
*/ */
public static int getVideoPlayerSeekbarColor(int originalColor) { public static int getVideoPlayerSeekbarColor(int originalColor) {
if (!SEEKBAR_CUSTOM_COLOR_ENABLED) { return SEEKBAR_CUSTOM_COLOR_ENABLED
return originalColor; ? getSeekbarColorValue(originalColor)
} : originalColor;
return getSeekbarColorValue(originalColor);
} }
/** /**
@@ -221,10 +341,6 @@ public final class SeekbarColorPatch {
*/ */
private static int getSeekbarColorValue(int originalColor) { private static int getSeekbarColorValue(int originalColor) {
try { try {
if (!SEEKBAR_CUSTOM_COLOR_ENABLED || originalColor == seekbarColor) {
return originalColor; // nothing to do
}
final int alphaDifference = Color.alpha(originalColor) - Color.alpha(ORIGINAL_SEEKBAR_COLOR); final int alphaDifference = Color.alpha(originalColor) - Color.alpha(ORIGINAL_SEEKBAR_COLOR);
// The seekbar uses the same color but different brightness for different situations. // The seekbar uses the same color but different brightness for different situations.
@@ -237,7 +353,7 @@ public final class SeekbarColorPatch {
hsv[1] = customSeekbarColorHSV[1]; hsv[1] = customSeekbarColorHSV[1];
hsv[2] = clamp(customSeekbarColorHSV[2] + brightnessDifference, 0, 1); hsv[2] = clamp(customSeekbarColorHSV[2] + brightnessDifference, 0, 1);
final int replacementAlpha = clamp(Color.alpha(seekbarColor) + alphaDifference, 0, 255); final int replacementAlpha = clamp(Color.alpha(customSeekbarColor) + alphaDifference, 0, 255);
final int replacementColor = Color.HSVToColor(replacementAlpha, hsv); final int replacementColor = Color.HSVToColor(replacementAlpha, hsv);
Logger.printDebug(() -> String.format("Original color: #%08X replacement color: #%08X", Logger.printDebug(() -> String.format("Original color: #%08X replacement color: #%08X",
originalColor, replacementColor)); originalColor, replacementColor));

View File

@@ -234,6 +234,12 @@ public class ReturnYouTubeDislike {
// example video: https://www.youtube.com/watch?v=UnrU5vxCHxw // example video: https://www.youtube.com/watch?v=UnrU5vxCHxw
// RYD data: https://returnyoutubedislikeapi.com/votes?videoId=UnrU5vxCHxw // RYD data: https://returnyoutubedislikeapi.com/votes?videoId=UnrU5vxCHxw
// //
if (!Settings.RYD_ESTIMATED_LIKE.get()) {
// Change the "Likes" string to show that likes and dislikes are hidden.
String hiddenMessageString = str("revanced_ryd_video_likes_hidden_by_video_owner");
return newSpanUsingStylingOfAnotherSpan(oldSpannable, hiddenMessageString);
}
Logger.printDebug(() -> "Using estimated likes"); Logger.printDebug(() -> "Using estimated likes");
oldLikes = formatDislikeCount(voteData.getLikeCount()); oldLikes = formatDislikeCount(voteData.getLikeCount());
} }
@@ -346,56 +352,49 @@ public class ReturnYouTubeDislike {
} }
private static String formatDislikeCount(long dislikeCount) { private static String formatDislikeCount(long dislikeCount) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { synchronized (ReturnYouTubeDislike.class) { // number formatter is not thread safe, must synchronize
synchronized (ReturnYouTubeDislike.class) { // number formatter is not thread safe, must synchronize if (dislikeCountFormatter == null) {
if (dislikeCountFormatter == null) { Locale locale = Objects.requireNonNull(Utils.getContext()).getResources().getConfiguration().locale;
Locale locale = Objects.requireNonNull(Utils.getContext()).getResources().getConfiguration().locale; dislikeCountFormatter = CompactDecimalFormat.getInstance(locale, CompactDecimalFormat.CompactStyle.SHORT);
dislikeCountFormatter = CompactDecimalFormat.getInstance(locale, CompactDecimalFormat.CompactStyle.SHORT);
// YouTube disregards locale specific number characters // YouTube disregards locale specific number characters
// and instead shows english number characters everywhere. // and instead shows english number characters everywhere.
// To use the same behavior, override the digit characters to use English // To use the same behavior, override the digit characters to use English
// so languages such as Arabic will show "1.234" instead of the native "۱,۲۳٤" // so languages such as Arabic will show "1.234" instead of the native "۱,۲۳٤"
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale); DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale);
symbols.setDigitStrings(DecimalFormatSymbols.getInstance(Locale.ENGLISH).getDigitStrings()); symbols.setDigitStrings(DecimalFormatSymbols.getInstance(Locale.ENGLISH).getDigitStrings());
dislikeCountFormatter.setDecimalFormatSymbols(symbols); dislikeCountFormatter.setDecimalFormatSymbols(symbols);
}
} }
return dislikeCountFormatter.format(dislikeCount);
} }
}
// Will never be reached, as the oldest supported YouTube app requires Android N or greater. return dislikeCountFormatter.format(dislikeCount);
return String.valueOf(dislikeCount); }
} }
private static String formatDislikePercentage(float dislikePercentage) { private static String formatDislikePercentage(float dislikePercentage) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { synchronized (ReturnYouTubeDislike.class) { // Number formatter is not thread safe, must synchronize.
synchronized (ReturnYouTubeDislike.class) { // number formatter is not thread safe, must synchronize if (dislikePercentageFormatter == null) {
if (dislikePercentageFormatter == null) { Locale locale = Objects.requireNonNull(Utils.getContext()).getResources().getConfiguration().locale;
Locale locale = Objects.requireNonNull(Utils.getContext()).getResources().getConfiguration().locale; dislikePercentageFormatter = NumberFormat.getPercentInstance(locale);
dislikePercentageFormatter = NumberFormat.getPercentInstance(locale);
// Want to set the digit strings, and the simplest way is to cast to the implementation NumberFormat returns. // Want to set the digit strings, and the simplest way is to cast to the implementation NumberFormat returns.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
&& dislikePercentageFormatter instanceof DecimalFormat) { && dislikePercentageFormatter instanceof DecimalFormat) {
DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale); DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale);
symbols.setDigitStrings(DecimalFormatSymbols.getInstance(Locale.ENGLISH).getDigitStrings()); symbols.setDigitStrings(DecimalFormatSymbols.getInstance(Locale.ENGLISH).getDigitStrings());
((DecimalFormat) dislikePercentageFormatter).setDecimalFormatSymbols(symbols); ((DecimalFormat) dislikePercentageFormatter).setDecimalFormatSymbols(symbols);
}
} }
if (dislikePercentage >= 0.01) { // at least 1%
dislikePercentageFormatter.setMaximumFractionDigits(0); // show only whole percentage points
} else {
dislikePercentageFormatter.setMaximumFractionDigits(1); // show up to 1 digit precision
}
return dislikePercentageFormatter.format(dislikePercentage);
} }
}
// Will never be reached, as the oldest supported YouTube app requires Android N or greater. if (dislikePercentage >= 0.01) { // at least 1%
return String.valueOf((int) (dislikePercentage * 100)); dislikePercentageFormatter.setMaximumFractionDigits(0); // show only whole percentage points
} else {
dislikePercentageFormatter.setMaximumFractionDigits(1); // show up to 1 digit precision
}
return dislikePercentageFormatter.format(dislikePercentage);
}
} }
@NonNull @NonNull
@@ -403,15 +402,13 @@ public class ReturnYouTubeDislike {
Objects.requireNonNull(videoId); Objects.requireNonNull(videoId);
synchronized (fetchCache) { synchronized (fetchCache) {
// Remove any expired entries. // Remove any expired entries.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { final long now = System.currentTimeMillis();
final long now = System.currentTimeMillis(); fetchCache.values().removeIf(value -> {
fetchCache.values().removeIf(value -> { final boolean expired = value.isExpired(now);
final boolean expired = value.isExpired(now); if (expired)
if (expired) Logger.printDebug(() -> "Removing expired fetch: " + value.videoId);
Logger.printDebug(() -> "Removing expired fetch: " + value.videoId); return expired;
return expired; });
});
}
ReturnYouTubeDislike fetch = fetchCache.get(videoId); ReturnYouTubeDislike fetch = fetchCache.get(videoId);
if (fetch == null) { if (fetch == null) {
@@ -551,6 +548,15 @@ public class ReturnYouTubeDislike {
} }
if (spanIsForLikes) { if (spanIsForLikes) {
if (!Utils.containsNumber(original)) {
if (!Settings.RYD_ESTIMATED_LIKE.get()) {
Logger.printDebug(() -> "Likes are hidden");
return original;
} else {
Logger.printDebug(() -> "Using estimated likes");
}
}
// Scrolling Shorts does not cause the Spans to be reloaded, // Scrolling Shorts does not cause the Spans to be reloaded,
// so there is no need to cache the likes for this situations. // so there is no need to cache the likes for this situations.
Logger.printDebug(() -> "Creating likes span for: " + votingData.videoId); Logger.printDebug(() -> "Creating likes span for: " + votingData.videoId);

View File

@@ -1,26 +1,31 @@
package app.revanced.extension.youtube.settings; package app.revanced.extension.youtube.settings;
import static app.revanced.extension.shared.Utils.getResourceIdentifier;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.os.Build;
import android.preference.PreferenceFragment; import android.preference.PreferenceFragment;
import android.util.TypedValue;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toolbar;
import androidx.annotation.RequiresApi;
import java.util.Objects;
import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Logger;
import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.Utils;
import app.revanced.extension.shared.settings.AppLanguage; import app.revanced.extension.shared.settings.AppLanguage;
import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.BaseSettings;
import app.revanced.extension.youtube.ThemeHelper; import app.revanced.extension.youtube.ThemeHelper;
import app.revanced.extension.youtube.patches.VersionCheckPatch;
import app.revanced.extension.youtube.settings.preference.ReVancedPreferenceFragment; import app.revanced.extension.youtube.settings.preference.ReVancedPreferenceFragment;
import app.revanced.extension.youtube.settings.preference.ReturnYouTubeDislikePreferenceFragment; import app.revanced.extension.youtube.settings.preference.ReturnYouTubeDislikePreferenceFragment;
import app.revanced.extension.youtube.settings.preference.SponsorBlockPreferenceFragment; import app.revanced.extension.youtube.settings.preference.SponsorBlockPreferenceFragment;
import java.util.Objects;
import static app.revanced.extension.shared.Utils.getChildView;
import static app.revanced.extension.shared.Utils.getResourceIdentifier;
/** /**
* Hooks LicenseActivity. * Hooks LicenseActivity.
* <p> * <p>
@@ -29,6 +34,14 @@ import static app.revanced.extension.shared.Utils.getResourceIdentifier;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class LicenseActivityHook { public class LicenseActivityHook {
private static ViewGroup.LayoutParams toolbarLayoutParams;
public static void setToolbarLayoutParams(Toolbar toolbar) {
if (toolbarLayoutParams != null) {
toolbar.setLayoutParams(toolbarLayoutParams);
}
}
/** /**
* Injection point. * Injection point.
* Overrides the ReVanced settings language. * Overrides the ReVanced settings language.
@@ -42,17 +55,36 @@ public class LicenseActivityHook {
return Utils.getContext(); return Utils.getContext();
} }
/**
* Injection point.
*/
public static boolean useCairoSettingsFragment(boolean original) {
// Early targets have layout issues and it's better to always force off.
if (!VersionCheckPatch.IS_19_34_OR_GREATER) {
return false;
}
if (Settings.RESTORE_OLD_SETTINGS_MENUS.get()) {
return false;
}
// On the first launch of a clean install, forcing the cairo menu can give a
// half broken appearance because all the preference icons may not be available yet.
// 19.34+ cairo settings are always on, so it doesn't need to be forced anyway.
// Cairo setting will show on the next launch of the app.
return original;
}
/** /**
* Injection point. * Injection point.
* <p> * <p>
* Hooks LicenseActivity#onCreate in order to inject our own fragment. * Hooks LicenseActivity#onCreate in order to inject our own fragment.
*/ */
@RequiresApi(api = Build.VERSION_CODES.N)
public static void initialize(Activity licenseActivity) { public static void initialize(Activity licenseActivity) {
try { try {
ThemeHelper.setActivityTheme(licenseActivity); ThemeHelper.setActivityTheme(licenseActivity);
licenseActivity.setContentView( licenseActivity.setContentView(getResourceIdentifier(
getResourceIdentifier("revanced_settings_with_toolbar", "layout")); "revanced_settings_with_toolbar", "layout"));
setBackButton(licenseActivity);
PreferenceFragment fragment; PreferenceFragment fragment;
String toolbarTitleResourceName; String toolbarTitleResourceName;
@@ -75,7 +107,7 @@ public class LicenseActivityHook {
return; return;
} }
setToolbarTitle(licenseActivity, toolbarTitleResourceName); createToolbar(licenseActivity, toolbarTitleResourceName);
//noinspection deprecation //noinspection deprecation
licenseActivity.getFragmentManager() licenseActivity.getFragmentManager()
@@ -87,28 +119,36 @@ public class LicenseActivityHook {
} }
} }
private static void setToolbarTitle(Activity activity, String toolbarTitleResourceName) { @RequiresApi(api = Build.VERSION_CODES.N)
ViewGroup toolbar = activity.findViewById(getToolbarResourceId());
TextView toolbarTextView = Objects.requireNonNull(getChildView(toolbar, false,
view -> view instanceof TextView));
toolbarTextView.setText(getResourceIdentifier(toolbarTitleResourceName, "string"));
}
@SuppressLint("UseCompatLoadingForDrawables") @SuppressLint("UseCompatLoadingForDrawables")
private static void setBackButton(Activity activity) { private static void createToolbar(Activity activity, String toolbarTitleResourceName) {
ViewGroup toolbar = activity.findViewById(getToolbarResourceId()); // Replace dummy placeholder toolbar.
ImageButton imageButton = Objects.requireNonNull(getChildView(toolbar, false, // This is required to fix submenu title alignment issue with Android ASOP 15+
view -> view instanceof ImageButton)); ViewGroup toolBarParent = activity.findViewById(
imageButton.setImageDrawable(ReVancedPreferenceFragment.getBackButtonDrawable()); getResourceIdentifier("revanced_toolbar_parent", "id"));
imageButton.setOnClickListener(view -> activity.onBackPressed()); ViewGroup dummyToolbar = toolBarParent.findViewById(getResourceIdentifier(
} "revanced_toolbar", "id"));
toolbarLayoutParams = dummyToolbar.getLayoutParams();
toolBarParent.removeView(dummyToolbar);
private static int getToolbarResourceId() { Toolbar toolbar = new Toolbar(toolBarParent.getContext());
final int toolbarResourceId = getResourceIdentifier("revanced_toolbar", "id"); toolbar.setBackgroundColor(ThemeHelper.getToolbarBackgroundColor());
if (toolbarResourceId == 0) { toolbar.setNavigationIcon(ReVancedPreferenceFragment.getBackButtonDrawable());
throw new IllegalStateException("Could not find back button resource"); toolbar.setNavigationOnClickListener(view -> activity.onBackPressed());
toolbar.setTitle(getResourceIdentifier(toolbarTitleResourceName, "string"));
final int margin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16,
Utils.getContext().getResources().getDisplayMetrics());
toolbar.setTitleMarginStart(margin);
toolbar.setTitleMarginEnd(margin);
TextView toolbarTextView = Utils.getChildView(toolbar, false,
view -> view instanceof TextView);
if (toolbarTextView != null) {
toolbarTextView.setTextColor(ThemeHelper.getForegroundColor());
} }
return toolbarResourceId; setToolbarLayoutParams(toolbar);
toolBarParent.addView(toolbar, 0);
} }
} }

View File

@@ -27,6 +27,8 @@ import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehavi
import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.SKIP_AUTOMATICALLY; import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.SKIP_AUTOMATICALLY;
import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.SKIP_AUTOMATICALLY_ONCE; import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.SKIP_AUTOMATICALLY_ONCE;
import android.graphics.Color;
import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Logger;
import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.BaseSettings;
import app.revanced.extension.shared.settings.BooleanSetting; import app.revanced.extension.shared.settings.BooleanSetting;
@@ -45,6 +47,7 @@ import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings;
public class Settings extends BaseSettings { public class Settings extends BaseSettings {
// Video // Video
public static final BooleanSetting DISABLE_HDR_VIDEO = new BooleanSetting("revanced_disable_hdr_video", FALSE);
public static final BooleanSetting RESTORE_OLD_VIDEO_QUALITY_MENU = new BooleanSetting("revanced_restore_old_video_quality_menu", TRUE); public static final BooleanSetting RESTORE_OLD_VIDEO_QUALITY_MENU = new BooleanSetting("revanced_restore_old_video_quality_menu", TRUE);
public static final BooleanSetting REMEMBER_VIDEO_QUALITY_LAST_SELECTED = new BooleanSetting("revanced_remember_video_quality_last_selected", FALSE); public static final BooleanSetting REMEMBER_VIDEO_QUALITY_LAST_SELECTED = new BooleanSetting("revanced_remember_video_quality_last_selected", FALSE);
public static final IntegerSetting VIDEO_QUALITY_DEFAULT_WIFI = new IntegerSetting("revanced_video_quality_default_wifi", -2); public static final IntegerSetting VIDEO_QUALITY_DEFAULT_WIFI = new IntegerSetting("revanced_video_quality_default_wifi", -2);
@@ -61,6 +64,7 @@ public class Settings extends BaseSettings {
// Ads // Ads
public static final BooleanSetting HIDE_BUTTONED_ADS = new BooleanSetting("revanced_hide_buttoned_ads", TRUE); public static final BooleanSetting HIDE_BUTTONED_ADS = new BooleanSetting("revanced_hide_buttoned_ads", TRUE);
public static final BooleanSetting HIDE_END_SCREEN_STORE_BANNER = new BooleanSetting("revanced_hide_end_screen_store_banner", TRUE, true);
public static final BooleanSetting HIDE_FULLSCREEN_ADS = new BooleanSetting("revanced_hide_fullscreen_ads", TRUE); public static final BooleanSetting HIDE_FULLSCREEN_ADS = new BooleanSetting("revanced_hide_fullscreen_ads", TRUE);
public static final BooleanSetting HIDE_GENERAL_ADS = new BooleanSetting("revanced_hide_general_ads", TRUE); public static final BooleanSetting HIDE_GENERAL_ADS = new BooleanSetting("revanced_hide_general_ads", TRUE);
public static final BooleanSetting HIDE_GET_PREMIUM = new BooleanSetting("revanced_hide_get_premium", TRUE); public static final BooleanSetting HIDE_GET_PREMIUM = new BooleanSetting("revanced_hide_get_premium", TRUE);
@@ -175,6 +179,7 @@ public class Settings extends BaseSettings {
// Description // Description
public static final BooleanSetting HIDE_ATTRIBUTES_SECTION = new BooleanSetting("revanced_hide_attributes_section", FALSE); public static final BooleanSetting HIDE_ATTRIBUTES_SECTION = new BooleanSetting("revanced_hide_attributes_section", FALSE);
public static final BooleanSetting HIDE_CHAPTERS_SECTION = new BooleanSetting("revanced_hide_chapters_section", TRUE); public static final BooleanSetting HIDE_CHAPTERS_SECTION = new BooleanSetting("revanced_hide_chapters_section", TRUE);
public static final BooleanSetting HIDE_HOW_THIS_WAS_MADE_SECTION = new BooleanSetting("revanced_hide_how_this_was_made_section", FALSE);
public static final BooleanSetting HIDE_INFO_CARDS_SECTION = new BooleanSetting("revanced_hide_info_cards_section", TRUE); public static final BooleanSetting HIDE_INFO_CARDS_SECTION = new BooleanSetting("revanced_hide_info_cards_section", TRUE);
public static final BooleanSetting HIDE_KEY_CONCEPTS_SECTION = new BooleanSetting("revanced_hide_key_concepts_section", FALSE); public static final BooleanSetting HIDE_KEY_CONCEPTS_SECTION = new BooleanSetting("revanced_hide_key_concepts_section", FALSE);
public static final BooleanSetting HIDE_PODCAST_SECTION = new BooleanSetting("revanced_hide_podcast_section", TRUE); public static final BooleanSetting HIDE_PODCAST_SECTION = new BooleanSetting("revanced_hide_podcast_section", TRUE);
@@ -204,6 +209,7 @@ public class Settings extends BaseSettings {
public static final BooleanSetting HIDE_PLAYER_FLYOUT_WATCH_IN_VR = new BooleanSetting("revanced_hide_player_flyout_watch_in_vr", TRUE); public static final BooleanSetting HIDE_PLAYER_FLYOUT_WATCH_IN_VR = new BooleanSetting("revanced_hide_player_flyout_watch_in_vr", TRUE);
// General layout // General layout
public static final BooleanSetting RESTORE_OLD_SETTINGS_MENUS = new BooleanSetting("revanced_restore_old_settings_menus", FALSE, true);
public static final EnumSetting<FormFactor> CHANGE_FORM_FACTOR = new EnumSetting<>("revanced_change_form_factor", FormFactor.DEFAULT, true, "revanced_change_form_factor_user_dialog_message"); public static final EnumSetting<FormFactor> CHANGE_FORM_FACTOR = new EnumSetting<>("revanced_change_form_factor", FormFactor.DEFAULT, true, "revanced_change_form_factor_user_dialog_message");
public static final BooleanSetting BYPASS_IMAGE_REGION_RESTRICTIONS = new BooleanSetting("revanced_bypass_image_region_restrictions", FALSE, true); public static final BooleanSetting BYPASS_IMAGE_REGION_RESTRICTIONS = new BooleanSetting("revanced_bypass_image_region_restrictions", FALSE, true);
public static final BooleanSetting GRADIENT_LOADING_SCREEN = new BooleanSetting("revanced_gradient_loading_screen", FALSE, true); public static final BooleanSetting GRADIENT_LOADING_SCREEN = new BooleanSetting("revanced_gradient_loading_screen", FALSE, true);
@@ -266,18 +272,19 @@ public class Settings extends BaseSettings {
public static final BooleanSetting SHORTS_AUTOPLAY_BACKGROUND = new BooleanSetting("revanced_shorts_autoplay_background", TRUE); public static final BooleanSetting SHORTS_AUTOPLAY_BACKGROUND = new BooleanSetting("revanced_shorts_autoplay_background", TRUE);
// Seekbar // Seekbar
public static final BooleanSetting DISABLE_PRECISE_SEEKING_GESTURE = new BooleanSetting("revanced_disable_precise_seeking_gesture", FALSE);
public static final BooleanSetting DISABLE_PRECISE_SEEKING_GESTURE = new BooleanSetting("revanced_disable_precise_seeking_gesture", TRUE);
public static final BooleanSetting HIDE_SEEKBAR = new BooleanSetting("revanced_hide_seekbar", FALSE, true); public static final BooleanSetting HIDE_SEEKBAR = new BooleanSetting("revanced_hide_seekbar", FALSE, true);
public static final BooleanSetting HIDE_SEEKBAR_THUMBNAIL = new BooleanSetting("revanced_hide_seekbar_thumbnail", FALSE); public static final BooleanSetting HIDE_SEEKBAR_THUMBNAIL = new BooleanSetting("revanced_hide_seekbar_thumbnail", FALSE, true);
public static final BooleanSetting HIDE_TIMESTAMP = new BooleanSetting("revanced_hide_timestamp", FALSE); public static final BooleanSetting HIDE_TIMESTAMP = new BooleanSetting("revanced_hide_timestamp", FALSE);
public static final BooleanSetting RESTORE_OLD_SEEKBAR_THUMBNAILS = new BooleanSetting("revanced_restore_old_seekbar_thumbnails", TRUE); public static final BooleanSetting RESTORE_OLD_SEEKBAR_THUMBNAILS = new BooleanSetting("revanced_restore_old_seekbar_thumbnails", TRUE);
public static final BooleanSetting SEEKBAR_CUSTOM_COLOR = new BooleanSetting("revanced_seekbar_custom_color", FALSE, true); public static final BooleanSetting SEEKBAR_TAPPING = new BooleanSetting("revanced_seekbar_tapping", FALSE);
public static final BooleanSetting SEEKBAR_TAPPING = new BooleanSetting("revanced_seekbar_tapping", TRUE);
public static final BooleanSetting SEEKBAR_THUMBNAILS_HIGH_QUALITY = new BooleanSetting("revanced_seekbar_thumbnails_high_quality", FALSE, true, public static final BooleanSetting SEEKBAR_THUMBNAILS_HIGH_QUALITY = new BooleanSetting("revanced_seekbar_thumbnails_high_quality", FALSE, true,
"revanced_seekbar_thumbnails_high_quality_dialog_message", new SeekbarThumbnailsHighQualityAvailability()); "revanced_seekbar_thumbnails_high_quality_dialog_message", new SeekbarThumbnailsHighQualityAvailability());
public static final BooleanSetting SLIDE_TO_SEEK = new BooleanSetting("revanced_slide_to_seek", FALSE, true); public static final BooleanSetting SLIDE_TO_SEEK = new BooleanSetting("revanced_slide_to_seek", FALSE, true);
public static final StringSetting SEEKBAR_CUSTOM_COLOR_VALUE = new StringSetting("revanced_seekbar_custom_color_value", "#FF0033", true, parent(SEEKBAR_CUSTOM_COLOR)); public static final BooleanSetting SEEKBAR_CUSTOM_COLOR = new BooleanSetting("revanced_seekbar_custom_color", FALSE, true);
private static final StringSetting DEPRECATED_SEEKBAR_CUSTOM_COLOR_PRIMARY = new StringSetting("revanced_seekbar_custom_color_value", "#FF0033");
public static final StringSetting SEEKBAR_CUSTOM_COLOR_PRIMARY = new StringSetting("revanced_seekbar_custom_color_primary", "#FF0033", true, parent(SEEKBAR_CUSTOM_COLOR));
public static final StringSetting SEEKBAR_CUSTOM_COLOR_ACCENT = new StringSetting("revanced_seekbar_custom_color_accent", "#FF2791", true, parent(SEEKBAR_CUSTOM_COLOR));
// Misc // Misc
public static final BooleanSetting ANNOUNCEMENTS = new BooleanSetting("revanced_announcements", TRUE); public static final BooleanSetting ANNOUNCEMENTS = new BooleanSetting("revanced_announcements", TRUE);
@@ -307,8 +314,9 @@ public class Settings extends BaseSettings {
parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME)); parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME));
public static final IntegerSetting SWIPE_MAGNITUDE_THRESHOLD = new IntegerSetting("revanced_swipe_threshold", 30, true, public static final IntegerSetting SWIPE_MAGNITUDE_THRESHOLD = new IntegerSetting("revanced_swipe_threshold", 30, true,
parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME)); parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME));
public static final IntegerSetting SWIPE_OVERLAY_BACKGROUND_ALPHA = new IntegerSetting("revanced_swipe_overlay_background_alpha", 127, true, public static final IntegerSetting SWIPE_OVERLAY_OPACITY = new IntegerSetting("revanced_swipe_overlay_background_opacity", 50, true,
parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME)); parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME));
private static final IntegerSetting DEPRECATED_SWIPE_OVERLAY_BACKGROUND_ALPHA = new IntegerSetting("revanced_swipe_overlay_background_alpha", 127);
// Debugging // Debugging
public static final IntegerSetting SWIPE_OVERLAY_TEXT_SIZE = new IntegerSetting("revanced_swipe_text_overlay_size", 22, true, public static final IntegerSetting SWIPE_OVERLAY_TEXT_SIZE = new IntegerSetting("revanced_swipe_text_overlay_size", 22, true,
@@ -325,6 +333,7 @@ public class Settings extends BaseSettings {
public static final BooleanSetting RYD_SHORTS = new BooleanSetting("ryd_shorts", TRUE, parent(RYD_ENABLED)); public static final BooleanSetting RYD_SHORTS = new BooleanSetting("ryd_shorts", TRUE, parent(RYD_ENABLED));
public static final BooleanSetting RYD_DISLIKE_PERCENTAGE = new BooleanSetting("ryd_dislike_percentage", FALSE, parent(RYD_ENABLED)); public static final BooleanSetting RYD_DISLIKE_PERCENTAGE = new BooleanSetting("ryd_dislike_percentage", FALSE, parent(RYD_ENABLED));
public static final BooleanSetting RYD_COMPACT_LAYOUT = new BooleanSetting("ryd_compact_layout", FALSE, parent(RYD_ENABLED)); public static final BooleanSetting RYD_COMPACT_LAYOUT = new BooleanSetting("ryd_compact_layout", FALSE, parent(RYD_ENABLED));
public static final BooleanSetting RYD_ESTIMATED_LIKE = new BooleanSetting("ryd_estimated_like", TRUE, parent(RYD_ENABLED));
public static final BooleanSetting RYD_TOAST_ON_CONNECTION_ERROR = new BooleanSetting("ryd_toast_on_connection_error", TRUE, parent(RYD_ENABLED)); public static final BooleanSetting RYD_TOAST_ON_CONNECTION_ERROR = new BooleanSetting("ryd_toast_on_connection_error", TRUE, parent(RYD_ENABLED));
// SponsorBlock // SponsorBlock
@@ -336,13 +345,14 @@ public class Settings extends BaseSettings {
public static final IntegerSetting SB_CREATE_NEW_SEGMENT_STEP = new IntegerSetting("sb_create_new_segment_step", 150, parent(SB_ENABLED)); public static final IntegerSetting SB_CREATE_NEW_SEGMENT_STEP = new IntegerSetting("sb_create_new_segment_step", 150, parent(SB_ENABLED));
public static final BooleanSetting SB_VOTING_BUTTON = new BooleanSetting("sb_voting_button", FALSE, parent(SB_ENABLED)); public static final BooleanSetting SB_VOTING_BUTTON = new BooleanSetting("sb_voting_button", FALSE, parent(SB_ENABLED));
public static final BooleanSetting SB_CREATE_NEW_SEGMENT = new BooleanSetting("sb_create_new_segment", FALSE, parent(SB_ENABLED)); public static final BooleanSetting SB_CREATE_NEW_SEGMENT = new BooleanSetting("sb_create_new_segment", FALSE, parent(SB_ENABLED));
public static final BooleanSetting SB_SQUARE_LAYOUT = new BooleanSetting("sb_square_layout", FALSE, parent(SB_ENABLED));
public static final BooleanSetting SB_COMPACT_SKIP_BUTTON = new BooleanSetting("sb_compact_skip_button", FALSE, parent(SB_ENABLED)); public static final BooleanSetting SB_COMPACT_SKIP_BUTTON = new BooleanSetting("sb_compact_skip_button", FALSE, parent(SB_ENABLED));
public static final BooleanSetting SB_AUTO_HIDE_SKIP_BUTTON = new BooleanSetting("sb_auto_hide_skip_button", TRUE, parent(SB_ENABLED)); public static final BooleanSetting SB_AUTO_HIDE_SKIP_BUTTON = new BooleanSetting("sb_auto_hide_skip_button", TRUE, parent(SB_ENABLED));
public static final BooleanSetting SB_TOAST_ON_SKIP = new BooleanSetting("sb_toast_on_skip", TRUE, parent(SB_ENABLED)); public static final BooleanSetting SB_TOAST_ON_SKIP = new BooleanSetting("sb_toast_on_skip", TRUE, parent(SB_ENABLED));
public static final BooleanSetting SB_TOAST_ON_CONNECTION_ERROR = new BooleanSetting("sb_toast_on_connection_error", TRUE, parent(SB_ENABLED)); public static final BooleanSetting SB_TOAST_ON_CONNECTION_ERROR = new BooleanSetting("sb_toast_on_connection_error", TRUE, parent(SB_ENABLED));
public static final BooleanSetting SB_TRACK_SKIP_COUNT = new BooleanSetting("sb_track_skip_count", TRUE, parent(SB_ENABLED)); public static final BooleanSetting SB_TRACK_SKIP_COUNT = new BooleanSetting("sb_track_skip_count", TRUE, parent(SB_ENABLED));
public static final FloatSetting SB_SEGMENT_MIN_DURATION = new FloatSetting("sb_min_segment_duration", 0F, parent(SB_ENABLED)); public static final FloatSetting SB_SEGMENT_MIN_DURATION = new FloatSetting("sb_min_segment_duration", 0F, parent(SB_ENABLED));
public static final BooleanSetting SB_VIDEO_LENGTH_WITHOUT_SEGMENTS = new BooleanSetting("sb_video_length_without_segments", TRUE, parent(SB_ENABLED)); public static final BooleanSetting SB_VIDEO_LENGTH_WITHOUT_SEGMENTS = new BooleanSetting("sb_video_length_without_segments", FALSE, parent(SB_ENABLED));
public static final StringSetting SB_API_URL = new StringSetting("sb_api_url", "https://sponsor.ajay.app"); public static final StringSetting SB_API_URL = new StringSetting("sb_api_url", "https://sponsor.ajay.app");
public static final BooleanSetting SB_USER_IS_VIP = new BooleanSetting("sb_user_is_vip", FALSE); public static final BooleanSetting SB_USER_IS_VIP = new BooleanSetting("sb_user_is_vip", FALSE);
public static final IntegerSetting SB_LOCAL_TIME_SAVED_NUMBER_SEGMENTS = new IntegerSetting("sb_local_time_saved_number_segments", 0); public static final IntegerSetting SB_LOCAL_TIME_SAVED_NUMBER_SEGMENTS = new IntegerSetting("sb_local_time_saved_number_segments", 0);
@@ -405,6 +415,35 @@ public class Settings extends BaseSettings {
MINIPLAYER_TYPE.save(MINIMAL); MINIPLAYER_TYPE.save(MINIMAL);
} }
// Migrate old single color seekbar with a slightly brighter accent color based on the primary.
// Eventually delete this logic.
if (!DEPRECATED_SEEKBAR_CUSTOM_COLOR_PRIMARY.isSetToDefault()) {
try {
String oldPrimaryColorString = DEPRECATED_SEEKBAR_CUSTOM_COLOR_PRIMARY.get();
final int oldPrimaryColor = Color.parseColor(oldPrimaryColorString);
SEEKBAR_CUSTOM_COLOR_PRIMARY.save(oldPrimaryColorString);
final float brightnessScale = 1.3f;
final int accentColor = Color.argb(
0, // Save without alpha channel.
Math.min(255, (int) (brightnessScale * Color.red(oldPrimaryColor))),
Math.min(255, (int) (brightnessScale * Color.green(oldPrimaryColor))),
Math.min(255, (int) (brightnessScale * Color.blue(oldPrimaryColor)))
);
SEEKBAR_CUSTOM_COLOR_ACCENT.save(String.format("#%06X", accentColor));
} catch (Exception ex) {
Logger.printException(() -> "Could not parse old seekbar color", ex);
}
DEPRECATED_SEEKBAR_CUSTOM_COLOR_PRIMARY.resetToDefault();
}
if (!DEPRECATED_SWIPE_OVERLAY_BACKGROUND_ALPHA.isSetToDefault()) {
SWIPE_OVERLAY_OPACITY.save(DEPRECATED_SWIPE_OVERLAY_BACKGROUND_ALPHA.get() / 255);
DEPRECATED_SWIPE_OVERLAY_BACKGROUND_ALPHA.resetToDefault();
}
// endregion // endregion
// region SB import/export callbacks // region SB import/export callbacks

View File

@@ -30,6 +30,7 @@ import app.revanced.extension.shared.settings.EnumSetting;
import app.revanced.extension.shared.settings.preference.AbstractPreferenceFragment; import app.revanced.extension.shared.settings.preference.AbstractPreferenceFragment;
import app.revanced.extension.youtube.ThemeHelper; import app.revanced.extension.youtube.ThemeHelper;
import app.revanced.extension.youtube.patches.playback.speed.CustomPlaybackSpeedPatch; import app.revanced.extension.youtube.patches.playback.speed.CustomPlaybackSpeedPatch;
import app.revanced.extension.youtube.settings.LicenseActivityHook;
import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.settings.Settings;
/** /**
@@ -140,9 +141,6 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
.getParent(); .getParent();
// Fix required for Android 15 and YT 19.45+ // Fix required for Android 15 and YT 19.45+
// FIXME:
// On Android 15 the text layout is not aligned the same as the parent
// screen and it looks a little off. Otherwise this works.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
rootView.setOnApplyWindowInsetsListener((v, insets) -> { rootView.setOnApplyWindowInsetsListener((v, insets) -> {
Insets statusInsets = insets.getInsets(WindowInsets.Type.statusBars()); Insets statusInsets = insets.getInsets(WindowInsets.Type.statusBars());
@@ -155,13 +153,10 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
toolbar.setTitle(childScreen.getTitle()); toolbar.setTitle(childScreen.getTitle());
toolbar.setNavigationIcon(getBackButtonDrawable()); toolbar.setNavigationIcon(getBackButtonDrawable());
toolbar.setNavigationOnClickListener(view -> preferenceScreenDialog.dismiss()); toolbar.setNavigationOnClickListener(view -> preferenceScreenDialog.dismiss());
final int margin = (int) TypedValue.applyDimension(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics()
final int margin = (int) TypedValue.applyDimension( );
TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics() toolbar.setTitleMargin(margin, 0, margin, 0);
);
toolbar.setTitleMargin(margin, 0, margin, 0);
}
TextView toolbarTextView = Utils.getChildView(toolbar, TextView toolbarTextView = Utils.getChildView(toolbar,
true, TextView.class::isInstance); true, TextView.class::isInstance);
@@ -169,6 +164,8 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
toolbarTextView.setTextColor(ThemeHelper.getForegroundColor()); toolbarTextView.setTextColor(ThemeHelper.getForegroundColor());
} }
LicenseActivityHook.setToolbarLayoutParams(toolbar);
rootView.addView(toolbar, 0); rootView.addView(toolbar, 0);
return false; return false;
} }

View File

@@ -39,6 +39,11 @@ public class ReturnYouTubeDislikePreferenceFragment extends PreferenceFragment {
*/ */
private SwitchPreference compactLayoutPreference; private SwitchPreference compactLayoutPreference;
/**
* If hidden likes are replaced with an estimated value.
*/
private SwitchPreference estimatedLikesPreference;
/** /**
* If segmented like/dislike button uses smaller compact layout. * If segmented like/dislike button uses smaller compact layout.
*/ */
@@ -48,6 +53,7 @@ public class ReturnYouTubeDislikePreferenceFragment extends PreferenceFragment {
shortsPreference.setEnabled(Settings.RYD_SHORTS.isAvailable()); shortsPreference.setEnabled(Settings.RYD_SHORTS.isAvailable());
percentagePreference.setEnabled(Settings.RYD_DISLIKE_PERCENTAGE.isAvailable()); percentagePreference.setEnabled(Settings.RYD_DISLIKE_PERCENTAGE.isAvailable());
compactLayoutPreference.setEnabled(Settings.RYD_COMPACT_LAYOUT.isAvailable()); compactLayoutPreference.setEnabled(Settings.RYD_COMPACT_LAYOUT.isAvailable());
estimatedLikesPreference.setEnabled(Settings.RYD_ESTIMATED_LIKE.isAvailable());
toastOnRYDNotAvailable.setEnabled(Settings.RYD_TOAST_ON_CONNECTION_ERROR.isAvailable()); toastOnRYDNotAvailable.setEnabled(Settings.RYD_TOAST_ON_CONNECTION_ERROR.isAvailable());
} }
@@ -117,6 +123,19 @@ public class ReturnYouTubeDislikePreferenceFragment extends PreferenceFragment {
}); });
preferenceScreen.addPreference(compactLayoutPreference); preferenceScreen.addPreference(compactLayoutPreference);
estimatedLikesPreference = new SwitchPreference(context);
estimatedLikesPreference.setChecked(Settings.RYD_ESTIMATED_LIKE.get());
estimatedLikesPreference.setTitle(str("revanced_ryd_estimated_like_title"));
estimatedLikesPreference.setSummaryOn(str("revanced_ryd_estimated_like_summary_on"));
estimatedLikesPreference.setSummaryOff(str("revanced_ryd_estimated_like_summary_off"));
estimatedLikesPreference.setOnPreferenceChangeListener((pref, newValue) -> {
Settings.RYD_ESTIMATED_LIKE.save((Boolean) newValue);
ReturnYouTubeDislike.clearAllUICaches();
updateUIState();
return true;
});
preferenceScreen.addPreference(estimatedLikesPreference);
toastOnRYDNotAvailable = new SwitchPreference(context); toastOnRYDNotAvailable = new SwitchPreference(context);
toastOnRYDNotAvailable.setChecked(Settings.RYD_TOAST_ON_CONNECTION_ERROR.get()); toastOnRYDNotAvailable.setChecked(Settings.RYD_TOAST_ON_CONNECTION_ERROR.get());
toastOnRYDNotAvailable.setTitle(str("revanced_ryd_toast_on_connection_error_title")); toastOnRYDNotAvailable.setTitle(str("revanced_ryd_toast_on_connection_error_title"));

View File

@@ -6,7 +6,6 @@ import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.preference.*; import android.preference.*;
import android.text.Html; import android.text.Html;
@@ -37,8 +36,9 @@ public class SponsorBlockPreferenceFragment extends PreferenceFragment {
private SwitchPreference sbEnabled; private SwitchPreference sbEnabled;
private SwitchPreference addNewSegment; private SwitchPreference addNewSegment;
private SwitchPreference votingEnabled; private SwitchPreference votingEnabled;
private SwitchPreference compactSkipButton;
private SwitchPreference autoHideSkipSegmentButton; private SwitchPreference autoHideSkipSegmentButton;
private SwitchPreference compactSkipButton;
private SwitchPreference squareLayout;
private SwitchPreference showSkipToast; private SwitchPreference showSkipToast;
private SwitchPreference trackSkips; private SwitchPreference trackSkips;
private SwitchPreference showTimeWithoutSegments; private SwitchPreference showTimeWithoutSegments;
@@ -62,7 +62,9 @@ public class SponsorBlockPreferenceFragment extends PreferenceFragment {
} else if (!Settings.SB_CREATE_NEW_SEGMENT.get()) { } else if (!Settings.SB_CREATE_NEW_SEGMENT.get()) {
SponsorBlockViewController.hideNewSegmentLayout(); SponsorBlockViewController.hideNewSegmentLayout();
} }
// Voting and add new segment buttons automatically shows/hide themselves. // Voting and add new segment buttons automatically show/hide themselves.
SponsorBlockViewController.updateLayout();
sbEnabled.setChecked(enabled); sbEnabled.setChecked(enabled);
@@ -72,11 +74,14 @@ public class SponsorBlockPreferenceFragment extends PreferenceFragment {
votingEnabled.setChecked(Settings.SB_VOTING_BUTTON.get()); votingEnabled.setChecked(Settings.SB_VOTING_BUTTON.get());
votingEnabled.setEnabled(enabled); votingEnabled.setEnabled(enabled);
autoHideSkipSegmentButton.setEnabled(enabled);
autoHideSkipSegmentButton.setChecked(Settings.SB_AUTO_HIDE_SKIP_BUTTON.get());
compactSkipButton.setChecked(Settings.SB_COMPACT_SKIP_BUTTON.get()); compactSkipButton.setChecked(Settings.SB_COMPACT_SKIP_BUTTON.get());
compactSkipButton.setEnabled(enabled); compactSkipButton.setEnabled(enabled);
autoHideSkipSegmentButton.setChecked(Settings.SB_AUTO_HIDE_SKIP_BUTTON.get()); squareLayout.setChecked(Settings.SB_SQUARE_LAYOUT.get());
autoHideSkipSegmentButton.setEnabled(enabled); squareLayout.setEnabled(enabled);
showSkipToast.setChecked(Settings.SB_TOAST_ON_SKIP.get()); showSkipToast.setChecked(Settings.SB_TOAST_ON_SKIP.get());
showSkipToast.setEnabled(enabled); showSkipToast.setEnabled(enabled);
@@ -176,6 +181,17 @@ public class SponsorBlockPreferenceFragment extends PreferenceFragment {
return true; return true;
}); });
autoHideSkipSegmentButton = new SwitchPreference(context);
autoHideSkipSegmentButton.setTitle(str("revanced_sb_enable_auto_hide_skip_segment_button"));
autoHideSkipSegmentButton.setSummaryOn(str("revanced_sb_enable_auto_hide_skip_segment_button_sum_on"));
autoHideSkipSegmentButton.setSummaryOff(str("revanced_sb_enable_auto_hide_skip_segment_button_sum_off"));
category.addPreference(autoHideSkipSegmentButton);
autoHideSkipSegmentButton.setOnPreferenceChangeListener((preference1, newValue) -> {
Settings.SB_AUTO_HIDE_SKIP_BUTTON.save((Boolean) newValue);
updateUI();
return true;
});
compactSkipButton = new SwitchPreference(context); compactSkipButton = new SwitchPreference(context);
compactSkipButton.setTitle(str("revanced_sb_enable_compact_skip_button")); compactSkipButton.setTitle(str("revanced_sb_enable_compact_skip_button"));
compactSkipButton.setSummaryOn(str("revanced_sb_enable_compact_skip_button_sum_on")); compactSkipButton.setSummaryOn(str("revanced_sb_enable_compact_skip_button_sum_on"));
@@ -187,13 +203,13 @@ public class SponsorBlockPreferenceFragment extends PreferenceFragment {
return true; return true;
}); });
autoHideSkipSegmentButton = new SwitchPreference(context); squareLayout = new SwitchPreference(context);
autoHideSkipSegmentButton.setTitle(str("revanced_sb_enable_auto_hide_skip_segment_button")); squareLayout.setTitle(str("revanced_sb_square_layout"));
autoHideSkipSegmentButton.setSummaryOn(str("revanced_sb_enable_auto_hide_skip_segment_button_sum_on")); squareLayout.setSummaryOn(str("revanced_sb_square_layout_sum_on"));
autoHideSkipSegmentButton.setSummaryOff(str("revanced_sb_enable_auto_hide_skip_segment_button_sum_off")); squareLayout.setSummaryOff(str("revanced_sb_square_layout_sum_off"));
category.addPreference(autoHideSkipSegmentButton); category.addPreference(squareLayout);
autoHideSkipSegmentButton.setOnPreferenceChangeListener((preference1, newValue) -> { squareLayout.setOnPreferenceChangeListener((preference1, newValue) -> {
Settings.SB_AUTO_HIDE_SKIP_BUTTON.save((Boolean) newValue); Settings.SB_SQUARE_LAYOUT.save((Boolean) newValue);
updateUI(); updateUI();
return true; return true;
}); });
@@ -393,9 +409,7 @@ public class SponsorBlockPreferenceFragment extends PreferenceFragment {
importExport.getEditText().setInputType(InputType.TYPE_CLASS_TEXT importExport.getEditText().setInputType(InputType.TYPE_CLASS_TEXT
| InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_FLAG_MULTI_LINE
| InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { importExport.getEditText().setAutofillHints((String) null);
importExport.getEditText().setAutofillHints((String) null);
}
importExport.getEditText().setTextSize(TypedValue.COMPLEX_UNIT_PT, 8); importExport.getEditText().setTextSize(TypedValue.COMPLEX_UNIT_PT, 8);
importExport.setOnPreferenceClickListener(preference1 -> { importExport.setOnPreferenceClickListener(preference1 -> {
importExport.getEditText().setText(SponsorBlockSettings.exportDesktopSettings()); importExport.getEditText().setText(SponsorBlockSettings.exportDesktopSettings());

View File

@@ -89,6 +89,8 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference {
summary += '\n' + str("revanced_spoof_video_streams_about_no_av1"); summary += '\n' + str("revanced_spoof_video_streams_about_no_av1");
} }
summary += '\n' + str("revanced_spoof_video_streams_about_kids_videos");
setTitle(title); setTitle(title);
setSummary(summary); setSummary(summary);
} }

View File

@@ -2,10 +2,11 @@ package app.revanced.extension.youtube.sponsorblock.ui;
import android.content.Context; import android.content.Context;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.RippleDrawable; import android.graphics.drawable.RippleDrawable;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageButton; import android.widget.ImageButton;
@@ -14,15 +15,15 @@ import app.revanced.extension.youtube.settings.Settings;
import app.revanced.extension.youtube.sponsorblock.SponsorBlockUtils; import app.revanced.extension.youtube.sponsorblock.SponsorBlockUtils;
import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Logger;
import static app.revanced.extension.shared.Utils.getResourceColor;
import static app.revanced.extension.shared.Utils.getResourceDimensionPixelSize; import static app.revanced.extension.shared.Utils.getResourceDimensionPixelSize;
import static app.revanced.extension.shared.Utils.getResourceIdentifier; import static app.revanced.extension.shared.Utils.getResourceIdentifier;
public final class NewSegmentLayout extends FrameLayout { public final class NewSegmentLayout extends FrameLayout {
private static final ColorStateList rippleColorStateList = new ColorStateList( private static final ColorStateList rippleColorStateList = new ColorStateList(
new int[][]{new int[]{android.R.attr.state_enabled}}, new int[][]{new int[]{android.R.attr.state_enabled}},
new int[]{0x33ffffff} // sets the ripple color to white new int[]{0x33ffffff} // Ripple effect color (semi-transparent white)
); );
private final int rippleEffectId;
final int defaultBottomMargin; final int defaultBottomMargin;
final int ctaBottomMargin; final int ctaBottomMargin;
@@ -47,10 +48,6 @@ public final class NewSegmentLayout extends FrameLayout {
getResourceIdentifier(context, "revanced_sb_new_segment", "layout"), this, true getResourceIdentifier(context, "revanced_sb_new_segment", "layout"), this, true
); );
TypedValue rippleEffect = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, rippleEffect, true);
rippleEffectId = rippleEffect.resourceId;
initializeButton( initializeButton(
context, context,
"revanced_sb_new_segment_rewind", "revanced_sb_new_segment_rewind",
@@ -120,6 +117,28 @@ public final class NewSegmentLayout extends FrameLayout {
}); });
} }
/**
* Update the layout of this UI control.
*/
public void updateLayout() {
final boolean squareLayout = Settings.SB_SQUARE_LAYOUT.get();
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) getLayoutParams();
final int margin = squareLayout
? 0
: SponsorBlockViewController.ROUNDED_LAYOUT_MARGIN;
params.setMarginStart(margin);
setLayoutParams(params);
GradientDrawable backgroundDrawable = new GradientDrawable();
backgroundDrawable.setColor(getResourceColor("skip_ad_button_background_color"));
final float cornerRadius = squareLayout
? 0
: 16 * getResources().getDisplayMetrics().density;
backgroundDrawable.setCornerRadius(cornerRadius);
setBackground(backgroundDrawable);
}
@FunctionalInterface @FunctionalInterface
private interface ButtonOnClickHandlerFunction { private interface ButtonOnClickHandlerFunction {
void apply(); void apply();

View File

@@ -8,6 +8,7 @@ import static app.revanced.extension.shared.Utils.getResourceIdentifier;
import android.content.Context; import android.content.Context;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@@ -19,11 +20,19 @@ import androidx.annotation.NonNull;
import java.util.Objects; import java.util.Objects;
import app.revanced.extension.youtube.settings.Settings;
import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController; import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController;
import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment; import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment;
public class SkipSponsorButton extends FrameLayout { public class SkipSponsorButton extends FrameLayout {
private static final boolean highContrast = true; /**
* Adds a high contrast border around the skip button.
*
* This feature is not currently used.
* If this is added, it needs an additional button width change because
* as-is the skip button text is clipped when this is on.
*/
private static final boolean highContrast = false;
private final LinearLayout skipSponsorBtnContainer; private final LinearLayout skipSponsorBtnContainer;
private final TextView skipSponsorTextView; private final TextView skipSponsorTextView;
private final Paint background; private final Paint background;
@@ -49,18 +58,23 @@ public class SkipSponsorButton extends FrameLayout {
LayoutInflater.from(context).inflate(getResourceIdentifier(context, "revanced_sb_skip_sponsor_button", "layout"), this, true); // layout:skip_ad_button LayoutInflater.from(context).inflate(getResourceIdentifier(context, "revanced_sb_skip_sponsor_button", "layout"), this, true); // layout:skip_ad_button
setMinimumHeight(getResourceDimensionPixelSize("ad_skip_ad_button_min_height")); // dimen:ad_skip_ad_button_min_height setMinimumHeight(getResourceDimensionPixelSize("ad_skip_ad_button_min_height")); // dimen:ad_skip_ad_button_min_height
skipSponsorBtnContainer = Objects.requireNonNull((LinearLayout) findViewById(getResourceIdentifier(context, "revanced_sb_skip_sponsor_button_container", "id"))); // id:skip_ad_button_container skipSponsorBtnContainer = Objects.requireNonNull(findViewById(getResourceIdentifier(context, "revanced_sb_skip_sponsor_button_container", "id"))); // id:skip_ad_button_container
background = new Paint(); background = new Paint();
background.setColor(getResourceColor("skip_ad_button_background_color")); // color:skip_ad_button_background_color); background.setColor(getResourceColor("skip_ad_button_background_color")); // color:skip_ad_button_background_color);
background.setStyle(Paint.Style.FILL); background.setStyle(Paint.Style.FILL);
border = new Paint(); border = new Paint();
border.setColor(getResourceColor("skip_ad_button_border_color")); // color:skip_ad_button_border_color); border.setColor(getResourceColor("skip_ad_button_border_color")); // color:skip_ad_button_border_color);
border.setStrokeWidth(getResourceDimension("ad_skip_ad_button_border_width")); // dimen:ad_skip_ad_button_border_width); border.setStrokeWidth(getResourceDimension("ad_skip_ad_button_border_width")); // dimen:ad_skip_ad_button_border_width);
border.setStyle(Paint.Style.STROKE); border.setStyle(Paint.Style.STROKE);
skipSponsorTextView = Objects.requireNonNull((TextView) findViewById(getResourceIdentifier(context, "revanced_sb_skip_sponsor_button_text", "id"))); // id:skip_ad_button_text;
skipSponsorTextView = Objects.requireNonNull(findViewById(getResourceIdentifier(context, "revanced_sb_skip_sponsor_button_text", "id"))); // id:skip_ad_button_text;
defaultBottomMargin = getResourceDimensionPixelSize("skip_button_default_bottom_margin"); // dimen:skip_button_default_bottom_margin defaultBottomMargin = getResourceDimensionPixelSize("skip_button_default_bottom_margin"); // dimen:skip_button_default_bottom_margin
ctaBottomMargin = getResourceDimensionPixelSize("skip_button_cta_bottom_margin"); // dimen:skip_button_cta_bottom_margin ctaBottomMargin = getResourceDimensionPixelSize("skip_button_cta_bottom_margin"); // dimen:skip_button_cta_bottom_margin
updateLayout();
skipSponsorBtnContainer.setOnClickListener(v -> { skipSponsorBtnContainer.setOnClickListener(v -> {
// The view controller handles hiding this button, but hide it here as well just in case something goofs. // The view controller handles hiding this button, but hide it here as well just in case something goofs.
setVisibility(View.GONE); setVisibility(View.GONE);
@@ -72,30 +86,56 @@ public class SkipSponsorButton extends FrameLayout {
protected final void dispatchDraw(Canvas canvas) { protected final void dispatchDraw(Canvas canvas) {
final int left = skipSponsorBtnContainer.getLeft(); final int left = skipSponsorBtnContainer.getLeft();
final int top = skipSponsorBtnContainer.getTop(); final int top = skipSponsorBtnContainer.getTop();
final int leftPlusWidth = (left + skipSponsorBtnContainer.getWidth()); final int right = left + skipSponsorBtnContainer.getWidth();
final int topPlusHeight = (top + skipSponsorBtnContainer.getHeight()); final int bottom = top + skipSponsorBtnContainer.getHeight();
canvas.drawRect(left, top, leftPlusWidth, topPlusHeight, background);
if (!highContrast) { // Determine corner radius for rounded button
canvas.drawLines(new float[]{ float cornerRadius = skipSponsorBtnContainer.getHeight() / 2f;
leftPlusWidth, top, left, top,
left, top, left, topPlusHeight, if (Settings.SB_SQUARE_LAYOUT.get()) {
left, topPlusHeight, leftPlusWidth, topPlusHeight}, // Square button.
border); canvas.drawRect(left, top, right, bottom, background);
if (highContrast) {
canvas.drawLines(new float[]{
right, top, left, top,
left, top, left, bottom,
left, bottom, right, bottom},
border); // Draw square border.
}
} else {
// Rounded button.
RectF rect = new RectF(left, top, right, bottom);
canvas.drawRoundRect(rect, cornerRadius, cornerRadius, background); // Draw rounded background.
if (highContrast) {
canvas.drawRoundRect(rect, cornerRadius, cornerRadius, border); // Draw rounded border.
}
} }
super.dispatchDraw(canvas); super.dispatchDraw(canvas);
} }
/** /**
* @return true, if this button state was changed * Update the layout of this button.
*/ */
public boolean updateSkipButtonText(@NonNull SponsorSegment segment) { public void updateLayout() {
if (Settings.SB_SQUARE_LAYOUT.get()) {
// No padding for square corners.
setPadding(0, 0, 0, 0);
} else {
// Apply padding for rounded corners.
final int padding = SponsorBlockViewController.ROUNDED_LAYOUT_MARGIN;
setPadding(padding, 0, padding, 0);
}
}
public void updateSkipButtonText(@NonNull SponsorSegment segment) {
this.segment = segment; this.segment = segment;
CharSequence newText = segment.getSkipButtonText(); CharSequence newText = segment.getSkipButtonText();
//noinspection StringEqualsCharSequence
if (newText.equals(skipSponsorTextView.getText())) { if (newText.equals(skipSponsorTextView.getText())) {
return false; return;
} }
skipSponsorTextView.setText(newText); skipSponsorTextView.setText(newText);
return true;
} }
} }

View File

@@ -19,8 +19,11 @@ import app.revanced.extension.shared.Utils;
import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.settings.Settings;
import app.revanced.extension.youtube.shared.PlayerType; import app.revanced.extension.youtube.shared.PlayerType;
import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment; import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment;
import kotlin.Unit;
public class SponsorBlockViewController { public class SponsorBlockViewController {
public static final int ROUNDED_LAYOUT_MARGIN = 12;
private static WeakReference<RelativeLayout> inlineSponsorOverlayRef = new WeakReference<>(null); private static WeakReference<RelativeLayout> inlineSponsorOverlayRef = new WeakReference<>(null);
private static WeakReference<ViewGroup> youtubeOverlaysLayoutRef = new WeakReference<>(null); private static WeakReference<ViewGroup> youtubeOverlaysLayoutRef = new WeakReference<>(null);
private static WeakReference<SkipSponsorButton> skipHighlightButtonRef = new WeakReference<>(null); private static WeakReference<SkipSponsorButton> skipHighlightButtonRef = new WeakReference<>(null);
@@ -36,7 +39,7 @@ public class SponsorBlockViewController {
static { static {
PlayerType.getOnChange().addObserver((PlayerType type) -> { PlayerType.getOnChange().addObserver((PlayerType type) -> {
playerTypeChanged(type); playerTypeChanged(type);
return null; return Unit.INSTANCE;
}); });
} }
@@ -80,12 +83,16 @@ public class SponsorBlockViewController {
}); });
youtubeOverlaysLayoutRef = new WeakReference<>(viewGroup); youtubeOverlaysLayoutRef = new WeakReference<>(viewGroup);
skipHighlightButtonRef = new WeakReference<>( skipHighlightButtonRef = new WeakReference<>(Objects.requireNonNull(
Objects.requireNonNull(layout.findViewById(getResourceIdentifier("revanced_sb_skip_highlight_button", "id")))); layout.findViewById(getResourceIdentifier("revanced_sb_skip_highlight_button", "id"))));
skipSponsorButtonRef = new WeakReference<>(
Objects.requireNonNull(layout.findViewById(getResourceIdentifier("revanced_sb_skip_sponsor_button", "id")))); skipSponsorButtonRef = new WeakReference<>(Objects.requireNonNull(
newSegmentLayoutRef = new WeakReference<>( layout.findViewById(getResourceIdentifier("revanced_sb_skip_sponsor_button", "id"))));
Objects.requireNonNull(layout.findViewById(getResourceIdentifier("revanced_sb_new_segment_view", "id"))));
NewSegmentLayout newSegmentLayout = Objects.requireNonNull(
layout.findViewById(getResourceIdentifier("revanced_sb_new_segment_view", "id")));
newSegmentLayoutRef = new WeakReference<>(newSegmentLayout);
newSegmentLayout.updateLayout();
newSegmentLayoutVisible = false; newSegmentLayoutVisible = false;
skipHighlight = null; skipHighlight = null;
@@ -101,6 +108,23 @@ public class SponsorBlockViewController {
hideNewSegmentLayout(); hideNewSegmentLayout();
} }
public static void updateLayout() {
SkipSponsorButton button = skipSponsorButtonRef.get();
if (button != null) {
button.updateLayout();
}
button = skipHighlightButtonRef.get();
if (button != null) {
button.updateLayout();
}
NewSegmentLayout newSegmentLayout = newSegmentLayoutRef.get();
if (newSegmentLayout != null) {
newSegmentLayout.updateLayout();
}
}
public static void showSkipHighlightButton(@NonNull SponsorSegment segment) { public static void showSkipHighlightButton(@NonNull SponsorSegment segment) {
skipHighlight = Objects.requireNonNull(segment); skipHighlight = Objects.requireNonNull(segment);
NewSegmentLayout newSegmentLayout = newSegmentLayoutRef.get(); NewSegmentLayout newSegmentLayout = newSegmentLayoutRef.get();

View File

@@ -2,6 +2,8 @@ package app.revanced.extension.youtube.swipecontrols
import android.content.Context import android.content.Context
import android.graphics.Color import android.graphics.Color
import app.revanced.extension.shared.StringRef.str
import app.revanced.extension.shared.Utils
import app.revanced.extension.youtube.settings.Settings import app.revanced.extension.youtube.settings.Settings
import app.revanced.extension.youtube.shared.PlayerType import app.revanced.extension.youtube.shared.PlayerType
@@ -86,7 +88,18 @@ class SwipeControlsConfigurationProvider(
* get the background color for text on the overlay, as a color int * get the background color for text on the overlay, as a color int
*/ */
val overlayTextBackgroundColor: Int val overlayTextBackgroundColor: Int
get() = Color.argb(Settings.SWIPE_OVERLAY_BACKGROUND_ALPHA.get(), 0, 0, 0) get() {
var opacity = Settings.SWIPE_OVERLAY_OPACITY.get()
if (opacity < 0 || opacity > 100) {
Utils.showToastLong(str("revanced_swipe_overlay_background_opacity_invalid_toast"))
Settings.SWIPE_OVERLAY_OPACITY.resetToDefault()
opacity = Settings.SWIPE_OVERLAY_OPACITY.get()
}
opacity = opacity * 255 / 100
return Color.argb(opacity, 0, 0, 0)
}
/** /**
* get the foreground color for text on the overlay, as a color int * get the foreground color for text on the overlay, as a color int

View File

@@ -4,14 +4,9 @@ plugins {
android { android {
namespace = "app.revanced.extension" namespace = "app.revanced.extension"
compileSdk = 33 compileSdk = 34
defaultConfig { defaultConfig {
minSdk = 24 minSdk = 24
} }
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
} }

View File

@@ -0,0 +1,15 @@
package com.airbnb.lottie;
import java.io.InputStream;
@SuppressWarnings("unused")
public class LottieAnimationView {
public void patch_setAnimation(InputStream stream, String cacheKey) {
throw new RuntimeException("stub");
}
public final void patch_setAnimation(int rawResInt) {
throw new RuntimeException("stub");
}
}

View File

@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
org.gradle.parallel = true org.gradle.parallel = true
android.useAndroidX = true android.useAndroidX = true
kotlin.code.style = official kotlin.code.style = official
version = 5.9.0-dev.2 version = 5.12.0-dev.3

24
package-lock.json generated
View File

@@ -9,7 +9,7 @@
"@semantic-release/changelog": "^6.0.3", "@semantic-release/changelog": "^6.0.3",
"@semantic-release/git": "^10.0.1", "@semantic-release/git": "^10.0.1",
"gradle-semantic-release-plugin": "^1.10.1", "gradle-semantic-release-plugin": "^1.10.1",
"semantic-release": "^24.1.2" "semantic-release": "^24.2.1"
} }
}, },
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
@@ -6760,9 +6760,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/semantic-release": { "node_modules/semantic-release": {
"version": "24.1.2", "version": "24.2.1",
"resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.1.2.tgz", "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.2.1.tgz",
"integrity": "sha512-hvEJ7yI97pzJuLsDZCYzJgmRxF8kiEJvNZhf0oiZQcexw+Ycjy4wbdsn/sVMURgNCu8rwbAXJdBRyIxM4pe32g==", "integrity": "sha512-z0/3cutKNkLQ4Oy0HTi3lubnjTsdjjgOqmxdPjeYWe6lhFqUPfwslZxRHv3HDZlN4MhnZitb9SLihDkZNxOXfQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -6782,7 +6782,7 @@
"git-log-parser": "^1.2.0", "git-log-parser": "^1.2.0",
"hook-std": "^3.0.0", "hook-std": "^3.0.0",
"hosted-git-info": "^8.0.0", "hosted-git-info": "^8.0.0",
"import-from-esm": "^1.3.1", "import-from-esm": "^2.0.0",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"marked": "^12.0.0", "marked": "^12.0.0",
"marked-terminal": "^7.0.0", "marked-terminal": "^7.0.0",
@@ -6926,6 +6926,20 @@
"node": ">=18.18.0" "node": ">=18.18.0"
} }
}, },
"node_modules/semantic-release/node_modules/import-from-esm": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-2.0.0.tgz",
"integrity": "sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.3.4",
"import-meta-resolve": "^4.0.0"
},
"engines": {
"node": ">=18.20"
}
},
"node_modules/semantic-release/node_modules/indent-string": { "node_modules/semantic-release/node_modules/indent-string": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",

View File

@@ -4,6 +4,6 @@
"@semantic-release/changelog": "^6.0.3", "@semantic-release/changelog": "^6.0.3",
"@semantic-release/git": "^10.0.1", "@semantic-release/git": "^10.0.1",
"gradle-semantic-release-plugin": "^1.10.1", "gradle-semantic-release-plugin": "^1.10.1",
"semantic-release": "^24.1.2" "semantic-release": "^24.2.1"
} }
} }

View File

@@ -603,16 +603,19 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatch
} }
public final class app/revanced/patches/shared/misc/settings/SettingsPatchKt { public final class app/revanced/patches/shared/misc/settings/SettingsPatchKt {
public static final fun settingsPatch (Ljava/util/List;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch;
public static final fun settingsPatch (Lkotlin/Pair;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch; public static final fun settingsPatch (Lkotlin/Pair;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch;
public static synthetic fun settingsPatch$default (Lkotlin/Pair;Ljava/util/Set;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; public static synthetic fun settingsPatch$default (Ljava/util/List;Ljava/util/Set;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch;
} }
public abstract class app/revanced/patches/shared/misc/settings/preference/BasePreference { public abstract class app/revanced/patches/shared/misc/settings/preference/BasePreference {
public static final field Companion Lapp/revanced/patches/shared/misc/settings/preference/BasePreference$Companion; public static final field Companion Lapp/revanced/patches/shared/misc/settings/preference/BasePreference$Companion;
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun equals (Ljava/lang/Object;)Z public fun equals (Ljava/lang/Object;)Z
public final fun getIcon ()Ljava/lang/String;
public final fun getKey ()Ljava/lang/String; public final fun getKey ()Ljava/lang/String;
public final fun getLayout ()Ljava/lang/String;
public final fun getSummaryKey ()Ljava/lang/String; public final fun getSummaryKey ()Ljava/lang/String;
public final fun getTag ()Ljava/lang/String; public final fun getTag ()Ljava/lang/String;
public final fun getTitleKey ()Ljava/lang/String; public final fun getTitleKey ()Ljava/lang/String;
@@ -635,17 +638,19 @@ public abstract class app/revanced/patches/shared/misc/settings/preference/BaseP
public abstract class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection { public abstract class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection {
public fun <init> ()V public fun <init> ()V
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun getIcon ()Ljava/lang/String;
public final fun getKey ()Ljava/lang/String; public final fun getKey ()Ljava/lang/String;
public final fun getLayout ()Ljava/lang/String;
public final fun getPreferences ()Ljava/util/Set; public final fun getPreferences ()Ljava/util/Set;
public final fun getTitleKey ()Ljava/lang/String; public final fun getTitleKey ()Ljava/lang/String;
public abstract fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference; public abstract fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;
} }
public class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection { public class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection {
public fun <init> (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;)V public fun <init> (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;)V
public synthetic fun <init> (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun addPreferences ([Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)V public final fun addPreferences ([Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)V
public final fun getCategories ()Ljava/util/Set; public final fun getCategories ()Ljava/util/Set;
public synthetic fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference; public synthetic fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;
@@ -653,8 +658,8 @@ public class app/revanced/patches/shared/misc/settings/preference/BasePreference
} }
public class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen$Category : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection { public class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen$Category : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection {
public fun <init> (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V public fun <init> (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V
public synthetic fun <init> (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun addPreferences ([Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)V public final fun addPreferences ([Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)V
public synthetic fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference; public synthetic fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;
public fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/PreferenceCategory; public fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/PreferenceCategory;
@@ -673,8 +678,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/InputTyp
} }
public final class app/revanced/patches/shared/misc/settings/preference/IntentPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { public final class app/revanced/patches/shared/misc/settings/preference/IntentPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference {
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;)V public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun equals (Ljava/lang/Object;)Z public fun equals (Ljava/lang/Object;)Z
public final fun getIntent ()Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent; public final fun getIntent ()Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;
public fun hashCode ()I public fun hashCode ()I
@@ -694,8 +699,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/ListPref
public fun <init> ()V public fun <init> ()V
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;)V public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun getEntries ()Lapp/revanced/util/resource/ArrayResource; public final fun getEntries ()Lapp/revanced/util/resource/ArrayResource;
public final fun getEntriesKey ()Ljava/lang/String; public final fun getEntriesKey ()Ljava/lang/String;
public final fun getEntryValues ()Lapp/revanced/util/resource/ArrayResource; public final fun getEntryValues ()Lapp/revanced/util/resource/ArrayResource;
@@ -704,22 +709,22 @@ public final class app/revanced/patches/shared/misc/settings/preference/ListPref
} }
public final class app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { public final class app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference : app/revanced/patches/shared/misc/settings/preference/BasePreference {
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun getSelectable ()Z public final fun getSelectable ()Z
public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element;
} }
public class app/revanced/patches/shared/misc/settings/preference/PreferenceCategory : app/revanced/patches/shared/misc/settings/preference/BasePreference { public class app/revanced/patches/shared/misc/settings/preference/PreferenceCategory : app/revanced/patches/shared/misc/settings/preference/BasePreference {
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun getPreferences ()Ljava/util/Set; public final fun getPreferences ()Ljava/util/Set;
public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element;
} }
public class app/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { public class app/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference {
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;)V public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun getPreferences ()Ljava/util/Set; public final fun getPreferences ()Ljava/util/Set;
public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element;
} }
@@ -728,6 +733,7 @@ public final class app/revanced/patches/shared/misc/settings/preference/Preferen
public static final field BY_KEY Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting; public static final field BY_KEY Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;
public static final field BY_TITLE Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting; public static final field BY_TITLE Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;
public static final field UNSORTED Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting; public static final field UNSORTED Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;
public final fun appendSortType (Ljava/lang/String;)Ljava/lang/String;
public static fun getEntries ()Lkotlin/enums/EnumEntries; public static fun getEntries ()Lkotlin/enums/EnumEntries;
public final fun getKeySuffix ()Ljava/lang/String; public final fun getKeySuffix ()Ljava/lang/String;
public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting; public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;
@@ -746,8 +752,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/SummaryT
public final class app/revanced/patches/shared/misc/settings/preference/SwitchPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { public final class app/revanced/patches/shared/misc/settings/preference/SwitchPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference {
public fun <init> ()V public fun <init> ()V
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun getSummaryOffKey ()Ljava/lang/String; public final fun getSummaryOffKey ()Ljava/lang/String;
public final fun getSummaryOnKey ()Ljava/lang/String; public final fun getSummaryOnKey ()Ljava/lang/String;
public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element;
@@ -755,8 +761,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/SwitchPr
public final class app/revanced/patches/shared/misc/settings/preference/TextPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { public final class app/revanced/patches/shared/misc/settings/preference/TextPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference {
public fun <init> ()V public fun <init> ()V
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;)V public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun getInputType ()Lapp/revanced/patches/shared/misc/settings/preference/InputType; public final fun getInputType ()Lapp/revanced/patches/shared/misc/settings/preference/InputType;
public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element;
} }
@@ -1359,6 +1365,7 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat
public static final fun is_19_43_or_greater ()Z public static final fun is_19_43_or_greater ()Z
public static final fun is_19_46_or_greater ()Z public static final fun is_19_46_or_greater ()Z
public static final fun is_19_47_or_greater ()Z public static final fun is_19_47_or_greater ()Z
public static final fun is_19_49_or_greater ()Z
} }
public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt { public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt {
@@ -1407,6 +1414,10 @@ public final class app/revanced/patches/youtube/video/audio/ForceOriginalAudioPa
public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
} }
public final class app/revanced/patches/youtube/video/hdr/DisableHdrPatchKt {
public static final fun getDisableHdrPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/youtube/video/information/VideoInformationPatchKt { public final class app/revanced/patches/youtube/video/information/VideoInformationPatchKt {
public static final fun getVideoInformationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getVideoInformationPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
public static final fun userSelectedPlaybackSpeedHook (Ljava/lang/String;Ljava/lang/String;)V public static final fun userSelectedPlaybackSpeedHook (Ljava/lang/String;Ljava/lang/String;)V

View File

@@ -21,6 +21,25 @@ dependencies {
compileOnly(project(":patches:stub")) compileOnly(project(":patches:stub"))
} }
tasks {
register<JavaExec>("preprocessCrowdinStrings") {
description = "Preprocess strings for Crowdin push"
dependsOn(compileKotlin)
classpath = sourceSets["main"].runtimeClasspath
mainClass.set("app.revanced.util.CrowdinPreprocessorKt")
args = listOf(
"src/main/resources/addresources/values/strings.xml",
// Ideally this would use build/tmp/crowdin/strings.xml
// But using that does not work with Crowdin pull because
// it does not recognize the strings.xml file belongs to this project.
"src/main/resources/addresources/values/strings.xml"
)
}
}
kotlin { kotlin {
compilerOptions { compilerOptions {
freeCompilerArgs = listOf("-Xcontext-receivers") freeCompilerArgs = listOf("-Xcontext-receivers")

View File

@@ -14,7 +14,7 @@ val exportInternalDataDocumentsProviderPatch = resourcePatch(
) { ) {
dependsOn( dependsOn(
bytecodePatch { bytecodePatch {
extendWith("extensions/all/misc/directory/export-internal-data-documents-provider.rve") extendWith("extensions/all/misc/directory/documentsprovider/export-internal-data-documents-provider.rve")
}, },
) )

View File

@@ -359,7 +359,7 @@ val addResourcesPatch = resourcePatch(
} }
getOrPut(resourceFileName) { getOrPut(resourceFileName) {
val targetFile = this@finalize["res/$value/$resourceFileName.xml"].also { this@finalize["res/$value/$resourceFileName.xml"].also {
it.parentFile?.mkdirs() it.parentFile?.mkdirs()
if (it.createNewFile()) { if (it.createNewFile()) {
@@ -367,7 +367,7 @@ val addResourcesPatch = resourcePatch(
} }
} }
document(targetFile.path).let { document -> document("res/$value/$resourceFileName.xml").let { document ->
// Save the target node here as well // Save the target node here as well
// in order to avoid having to call document.getNode("resources") // in order to avoid having to call document.getNode("resources")

View File

@@ -25,7 +25,7 @@ private val removeCaptureRestrictionResourcePatch = resourcePatch(
} }
private const val EXTENSION_CLASS_DESCRIPTOR_PREFIX = private const val EXTENSION_CLASS_DESCRIPTOR_PREFIX =
"Lapp/revanced/extension/all/screencapture/removerestriction/RemoveScreencaptureRestrictionPatch" "Lapp/revanced/extension/all/screencapture/removerestriction/RemoveScreenCaptureRestrictionPatch"
private const val EXTENSION_CLASS_DESCRIPTOR = "$EXTENSION_CLASS_DESCRIPTOR_PREFIX;" private const val EXTENSION_CLASS_DESCRIPTOR = "$EXTENSION_CLASS_DESCRIPTOR_PREFIX;"
@Suppress("unused") @Suppress("unused")

View File

@@ -1,5 +1,6 @@
package app.revanced.patches.shared.misc.settings package app.revanced.patches.shared.misc.settings
import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.resourcePatch
import app.revanced.patches.all.misc.resources.addResource import app.revanced.patches.all.misc.resources.addResource
import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResources
@@ -12,15 +13,22 @@ import app.revanced.util.getNode
import app.revanced.util.insertFirst import app.revanced.util.insertFirst
import org.w3c.dom.Node import org.w3c.dom.Node
// TODO: Delete this on next major version bump.
@Deprecated("Use non deprecated settings patch function")
fun settingsPatch (
rootPreference: Pair<IntentPreference, String>,
preferences: Set<BasePreference>,
) = settingsPatch(listOf(rootPreference), preferences)
/** /**
* A resource patch that adds settings to a settings fragment. * A resource patch that adds settings to a settings fragment.
* *
* @param rootPreference A pair of an intent preference and the name of the fragment file to add it to. * @param rootPreferences List of intent preferences and the name of the fragment file to add it to.
* If null, no preference will be added. * File names that do not exist are ignored and not processed.
* @param preferences A set of preferences to add to the ReVanced fragment. * @param preferences A set of preferences to add to the ReVanced fragment.
*/ */
fun settingsPatch( fun settingsPatch (
rootPreference: Pair<IntentPreference, String>? = null, rootPreferences: List<Pair<BasePreference, String>>? = null,
preferences: Set<BasePreference>, preferences: Set<BasePreference>,
) = resourcePatch { ) = resourcePatch {
dependsOn(addResourcesPatch) dependsOn(addResourcesPatch)
@@ -46,10 +54,20 @@ fun settingsPatch(
} }
// Add the root preference to an existing fragment if needed. // Add the root preference to an existing fragment if needed.
rootPreference?.let { (intentPreference, fragment) -> rootPreferences?.let {
document("res/xml/$fragment.xml").use { document -> var modified = false
document.getNode("PreferenceScreen").addPreference(intentPreference, true)
it.forEach { (intent, fileName) ->
val preferenceFileName = "res/xml/$fileName.xml"
if (get(preferenceFileName).exists()) {
document(preferenceFileName).use { document ->
document.getNode("PreferenceScreen").addPreference(intent, true)
}
modified = true
}
} }
if (!modified) throw PatchException("No declared preference files exists: $rootPreferences")
} }
// Add all preferences to the ReVanced fragment. // Add all preferences to the ReVanced fragment.

View File

@@ -9,6 +9,8 @@ import org.w3c.dom.Element
* *
* @param key The key of the preference. If null, other parameters must be specified. * @param key The key of the preference. If null, other parameters must be specified.
* @param titleKey The key of the preference title. * @param titleKey The key of the preference title.
* @param icon The preference icon resource name.
* @param layout Layout declaration.
* @param summaryKey The key of the preference summary. * @param summaryKey The key of the preference summary.
* @param tag The tag or full class name of the preference. * @param tag The tag or full class name of the preference.
*/ */
@@ -17,6 +19,8 @@ abstract class BasePreference(
val key: String? = null, val key: String? = null,
val titleKey: String = "${key}_title", val titleKey: String = "${key}_title",
val summaryKey: String? = "${key}_summary", val summaryKey: String? = "${key}_summary",
val icon: String? = null,
val layout: String? = null,
val tag: String val tag: String
) { ) {
/** /**
@@ -33,6 +37,11 @@ abstract class BasePreference(
key?.let { setAttribute("android:key", it) } key?.let { setAttribute("android:key", it) }
setAttribute("android:title", "@string/${titleKey}") setAttribute("android:title", "@string/${titleKey}")
summaryKey?.let { addSummary(it) } summaryKey?.let { addSummary(it) }
icon?.let {
setAttribute("android:icon", it)
setAttribute("app:iconSpaceReserved", "true")
}
layout?.let { setAttribute("android:layout", layout) }
} }
override fun hashCode(): Int { override fun hashCode(): Int {

View File

@@ -24,16 +24,20 @@ abstract class BasePreferenceScreen(
key: String? = null, key: String? = null,
titleKey: String = "${key}_title", titleKey: String = "${key}_title",
private val summaryKey: String? = "${key}_summary", private val summaryKey: String? = "${key}_summary",
icon: String? = null,
layout: String? = null,
preferences: MutableSet<BasePreference> = mutableSetOf(), preferences: MutableSet<BasePreference> = mutableSetOf(),
val categories: MutableSet<Category> = mutableSetOf(), val categories: MutableSet<Category> = mutableSetOf(),
private val sorting: Sorting = Sorting.BY_TITLE, private val sorting: Sorting = Sorting.BY_TITLE,
) : BasePreferenceCollection(key, titleKey, preferences) { ) : BasePreferenceCollection(key, titleKey, icon, layout, preferences) {
override fun transform(): PreferenceScreenPreference { override fun transform(): PreferenceScreenPreference {
return PreferenceScreenPreference( return PreferenceScreenPreference(
key, key,
titleKey, titleKey,
summaryKey, summaryKey,
icon,
layout,
sorting, sorting,
// Screens and preferences are sorted at runtime by extension code, // Screens and preferences are sorted at runtime by extension code,
// so title sorting uses the localized language in use. // so title sorting uses the localized language in use.
@@ -56,12 +60,17 @@ abstract class BasePreferenceScreen(
open inner class Category( open inner class Category(
key: String? = null, key: String? = null,
titleKey: String = "${key}_title", titleKey: String = "${key}_title",
icon: String? = null,
layout: String? = null,
preferences: MutableSet<BasePreference> = mutableSetOf(), preferences: MutableSet<BasePreference> = mutableSetOf(),
) : BasePreferenceCollection(key, titleKey, preferences) { ) : BasePreferenceCollection(key, titleKey, icon, layout, preferences) {
override fun transform(): PreferenceCategory { override fun transform(): PreferenceCategory {
return PreferenceCategory( return PreferenceCategory(
key, key,
titleKey, titleKey,
icon,
layout,
sorting,
preferences = preferences, preferences = preferences,
) )
} }
@@ -82,6 +91,8 @@ abstract class BasePreferenceScreen(
abstract class BasePreferenceCollection( abstract class BasePreferenceCollection(
val key: String? = null, val key: String? = null,
val titleKey: String = "${key}_title", val titleKey: String = "${key}_title",
val icon: String? = null,
val layout: String? = null,
val preferences: MutableSet<BasePreference> = mutableSetOf(), val preferences: MutableSet<BasePreference> = mutableSetOf(),
) { ) {
abstract fun transform(): BasePreference abstract fun transform(): BasePreference

View File

@@ -9,6 +9,8 @@ import org.w3c.dom.Document
* @param key Optional preference key. * @param key Optional preference key.
* @param titleKey The preference title key. * @param titleKey The preference title key.
* @param summaryKey The preference summary key. * @param summaryKey The preference summary key.
* @param icon The preference icon resource name.
* @param layout Layout declaration.
* @param tag The preference tag. * @param tag The preference tag.
* @param intent The intent to open. * @param intent The intent to open.
*/ */
@@ -16,9 +18,11 @@ class IntentPreference(
key: String? = null, key: String? = null,
titleKey: String = "${key}_title", titleKey: String = "${key}_title",
summaryKey: String? = "${key}_summary", summaryKey: String? = "${key}_summary",
icon: String? = null,
layout: String? = null,
tag: String = "Preference", tag: String = "Preference",
val intent: Intent, val intent: Intent,
) : BasePreference(key, titleKey, summaryKey, tag) { ) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) {
override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) =
super.serialize(ownerDocument, resourceCallback).apply { super.serialize(ownerDocument, resourceCallback).apply {

View File

@@ -10,6 +10,8 @@ import org.w3c.dom.Document
* @param key The preference key. If null, other parameters must be specified. * @param key The preference key. If null, other parameters must be specified.
* @param titleKey The preference title key. * @param titleKey The preference title key.
* @param summaryKey The preference summary key. * @param summaryKey The preference summary key.
* @param icon The preference icon resource name.
* @param layout Layout declaration.
* @param tag The preference tag. * @param tag The preference tag.
* @param entriesKey The entries array key. * @param entriesKey The entries array key.
* @param entryValuesKey The entry values array key. * @param entryValuesKey The entry values array key.
@@ -19,10 +21,12 @@ class ListPreference(
key: String? = null, key: String? = null,
titleKey: String = "${key}_title", titleKey: String = "${key}_title",
summaryKey: String? = "${key}_summary", summaryKey: String? = "${key}_summary",
icon: String? = null,
layout: String? = null,
tag: String = "ListPreference", tag: String = "ListPreference",
val entriesKey: String? = "${key}_entries", val entriesKey: String? = "${key}_entries",
val entryValuesKey: String? = "${key}_entry_values" val entryValuesKey: String? = "${key}_entry_values"
) : BasePreference(key, titleKey, summaryKey, tag) { ) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) {
var entries: ArrayResource? = null var entries: ArrayResource? = null
private set private set
var entryValues: ArrayResource? = null var entryValues: ArrayResource? = null

View File

@@ -10,6 +10,8 @@ import org.w3c.dom.Document
* *
* @param key The preference key. * @param key The preference key.
* @param summaryKey The preference summary key. * @param summaryKey The preference summary key.
* @param icon The preference icon resource name.
* @param layout Layout declaration.
* @param tag The tag or full class name of the preference. * @param tag The tag or full class name of the preference.
* @param selectable If the preference is selectable and responds to tap events. * @param selectable If the preference is selectable and responds to tap events.
*/ */
@@ -18,9 +20,11 @@ class NonInteractivePreference(
key: String, key: String,
titleKey: String = "${key}_title", titleKey: String = "${key}_title",
summaryKey: String? = "${key}_summary", summaryKey: String? = "${key}_summary",
icon: String? = null,
layout: String? = null,
tag: String = "Preference", tag: String = "Preference",
val selectable: Boolean = false, val selectable: Boolean = false,
) : BasePreference(key, titleKey, summaryKey, tag) { ) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) {
override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) =
super.serialize(ownerDocument, resourceCallback).apply { super.serialize(ownerDocument, resourceCallback).apply {
setAttribute("android:selectable", selectable.toString()) setAttribute("android:selectable", selectable.toString())

View File

@@ -1,5 +1,6 @@
package app.revanced.patches.shared.misc.settings.preference package app.revanced.patches.shared.misc.settings.preference
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting
import app.revanced.util.resource.BaseResource import app.revanced.util.resource.BaseResource
import org.w3c.dom.Document import org.w3c.dom.Document
@@ -8,6 +9,8 @@ import org.w3c.dom.Document
* *
* @param key The key of the preference. If null, other parameters must be specified. * @param key The key of the preference. If null, other parameters must be specified.
* @param titleKey The key of the preference title. * @param titleKey The key of the preference title.
* @param icon The preference icon resource name.
* @param layout Layout declaration.
* @param tag The tag or full class name of the preference. * @param tag The tag or full class name of the preference.
* @param preferences The preferences in this category. * @param preferences The preferences in this category.
*/ */
@@ -15,9 +18,12 @@ import org.w3c.dom.Document
open class PreferenceCategory( open class PreferenceCategory(
key: String? = null, key: String? = null,
titleKey: String = "${key}_title", titleKey: String = "${key}_title",
icon: String? = null,
layout: String? = null,
sorting: Sorting = Sorting.BY_TITLE,
tag: String = "PreferenceCategory", tag: String = "PreferenceCategory",
val preferences: Set<BasePreference> val preferences: Set<BasePreference>
) : BasePreference(key, titleKey, null, tag) { ) : BasePreference(sorting.appendSortType(key), titleKey, null, icon, layout, tag) {
override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) =
super.serialize(ownerDocument, resourceCallback).apply { super.serialize(ownerDocument, resourceCallback).apply {

View File

@@ -9,6 +9,8 @@ import org.w3c.dom.Document
* @param key The key of the preference. If null, other parameters must be specified. * @param key The key of the preference. If null, other parameters must be specified.
* @param titleKey The key of the preference title. * @param titleKey The key of the preference title.
* @param summaryKey The key of the preference summary. * @param summaryKey The key of the preference summary.
* @param icon The preference icon resource name.
* @param layout Layout declaration.
* @param sorting Sorting to use. If the sorting is not [Sorting.UNSORTED], * @param sorting Sorting to use. If the sorting is not [Sorting.UNSORTED],
* then the key parameter will be modified to include the sort type. * then the key parameter will be modified to include the sort type.
* @param tag The tag or full class name of the preference. * @param tag The tag or full class name of the preference.
@@ -19,6 +21,8 @@ open class PreferenceScreenPreference(
key: String? = null, key: String? = null,
titleKey: String = "${key}_title", titleKey: String = "${key}_title",
summaryKey: String? = "${key}_summary", summaryKey: String? = "${key}_summary",
icon: String? = null,
layout: String? = null,
sorting: Sorting = Sorting.BY_TITLE, sorting: Sorting = Sorting.BY_TITLE,
tag: String = "PreferenceScreen", tag: String = "PreferenceScreen",
val preferences: Set<BasePreference>, val preferences: Set<BasePreference>,
@@ -28,7 +32,7 @@ open class PreferenceScreenPreference(
// or adding new attributes to the attrs.xml file. // or adding new attributes to the attrs.xml file.
// Since the key value is not currently used by the extensions, // Since the key value is not currently used by the extensions,
// for now it's much simpler to modify the key to include the sort parameter. // for now it's much simpler to modify the key to include the sort parameter.
) : BasePreference(if (sorting == Sorting.UNSORTED) key else (key + sorting.keySuffix), titleKey, summaryKey, tag) { ) : BasePreference(sorting.appendSortType(key), titleKey, summaryKey, icon, layout, tag) {
override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) =
super.serialize(ownerDocument, resourceCallback).apply { super.serialize(ownerDocument, resourceCallback).apply {
preferences.forEach { preferences.forEach {
@@ -53,6 +57,16 @@ open class PreferenceScreenPreference(
/** /**
* Unspecified sorting. * Unspecified sorting.
*/ */
UNSORTED("_sort_by_unsorted"), UNSORTED("_sort_by_unsorted");
/**
* @return The key with this sort type appended to to the end,
* or if key is null then null is returned.
*/
fun appendSortType(key: String?): String? {
if (key == null) return null
if (this == UNSORTED) return key
return key + keySuffix
}
} }
} }

View File

@@ -8,6 +8,8 @@ import org.w3c.dom.Document
* *
* @param key The preference key. If null, other parameters must be specified. * @param key The preference key. If null, other parameters must be specified.
* @param titleKey The preference title key. * @param titleKey The preference title key.
* @param icon The preference icon resource name.
* @param layout Layout declaration.
* @param tag The preference tag. * @param tag The preference tag.
* @param summaryOnKey The preference summary-on key. * @param summaryOnKey The preference summary-on key.
* @param summaryOffKey The preference summary-off key. * @param summaryOffKey The preference summary-off key.
@@ -17,9 +19,11 @@ class SwitchPreference(
key: String? = null, key: String? = null,
titleKey: String = "${key}_title", titleKey: String = "${key}_title",
tag: String = "SwitchPreference", tag: String = "SwitchPreference",
icon: String? = null,
layout: String? = null,
val summaryOnKey: String = "${key}_summary_on", val summaryOnKey: String = "${key}_summary_on",
val summaryOffKey: String = "${key}_summary_off" val summaryOffKey: String = "${key}_summary_off"
) : BasePreference(key, titleKey, null, tag) { ) : BasePreference(key, titleKey, null, icon, layout, tag) {
override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) =
super.serialize(ownerDocument, resourceCallback).apply { super.serialize(ownerDocument, resourceCallback).apply {
addSummary(summaryOnKey, SummaryType.ON) addSummary(summaryOnKey, SummaryType.ON)

View File

@@ -9,6 +9,8 @@ import org.w3c.dom.Document
* @param key The preference key. If null, other parameters must be specified. * @param key The preference key. If null, other parameters must be specified.
* @param titleKey The preference title key. * @param titleKey The preference title key.
* @param summaryKey The preference summary key. * @param summaryKey The preference summary key.
* @param icon The preference icon resource name.
* @param layout Layout declaration.
* @param tag The preference tag. * @param tag The preference tag.
* @param inputType The preference input type. * @param inputType The preference input type.
*/ */
@@ -17,9 +19,11 @@ class TextPreference(
key: String? = null, key: String? = null,
titleKey: String = "${key}_title", titleKey: String = "${key}_title",
summaryKey: String? = "${key}_summary", summaryKey: String? = "${key}_summary",
icon: String? = null,
layout: String? = null,
tag: String = "app.revanced.extension.shared.settings.preference.ResettableEditTextPreference", tag: String = "app.revanced.extension.shared.settings.preference.ResettableEditTextPreference",
val inputType: InputType = InputType.TEXT val inputType: InputType = InputType.TEXT
) : BasePreference(key, titleKey, summaryKey, tag) { ) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) {
override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) =
super.serialize(ownerDocument, resourceCallback).apply { super.serialize(ownerDocument, resourceCallback).apply {

View File

@@ -56,8 +56,9 @@ val customThemePatch = resourcePatch(
document("res/values/colors.xml").use { document -> document("res/values/colors.xml").use { document ->
val resourcesNode = document.getElementsByTagName("resources").item(0) as Element val resourcesNode = document.getElementsByTagName("resources").item(0) as Element
for (i in 0 until resourcesNode.childNodes.length) { val childNodes = resourcesNode.childNodes
val node = resourcesNode.childNodes.item(i) as? Element ?: continue for (i in 0 until childNodes.length) {
val node = childNodes.item(i) as? Element ?: continue
node.textContent = node.textContent =
when (node.getAttribute("name")) { when (node.getAttribute("name")) {

View File

@@ -15,7 +15,7 @@ val removeGooglePlayIntegrityCheckPatch = bytecodePatch(
description = "Removes the Google Play Integrity check. With this it's possible to use SwissID on custom ROMS." + 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.", "If the device is rooted, root permissions must be hidden from the app.",
) { ) {
compatibleWith("com.swisssign.swissid.mobile") compatibleWith("com.swisssign.swissid.mobile"("5.2.9"))
execute { execute {
checkIntegrityFingerprint.method.addInstructions( checkIntegrityFingerprint.method.addInstructions(

View File

@@ -3,9 +3,9 @@ package app.revanced.patches.windyapp.misc.unlockpro
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
@Deprecated("This patch no longer works and will be removed in the future.")
@Suppress("unused") @Suppress("unused")
val unlockProPatch = bytecodePatch( val unlockProPatch = bytecodePatch(
name = "Unlock pro",
description = "Unlocks all pro features.", description = "Unlocks all pro features.",
) { ) {
compatibleWith("co.windyapp.android") compatibleWith("co.windyapp.android")

View File

@@ -0,0 +1,25 @@
package app.revanced.patches.youtube.ad.general
import app.revanced.patcher.fingerprint
import app.revanced.util.containsLiteralInstruction
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionReversed
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
internal val fullScreenEngagementAdContainerFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("V")
parameters()
custom { method, _ ->
method.containsLiteralInstruction(fullScreenEngagementAdContainer)
&& indexOfAddListInstruction(method) >= 0
}
}
internal fun indexOfAddListInstruction(method: Method) =
method.indexOfFirstInstructionReversed {
getReference<MethodReference>()?.name == "add"
}

View File

@@ -1,5 +1,7 @@
package app.revanced.patches.youtube.ad.general package app.revanced.patches.youtube.ad.general
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.bytecodePatch
import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.resourcePatch
import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResources
@@ -18,11 +20,16 @@ import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.util.findMutableMethodOf import app.revanced.util.findMutableMethodOf
import app.revanced.util.injectHideViewCall import app.revanced.util.injectHideViewCall
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction31i import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction31i
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
internal var adAttributionId = -1L internal var adAttributionId = -1L
private set private set
internal var fullScreenEngagementAdContainer = -1L
private set
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/components/AdsFilter;"
private val hideAdsResourcePatch = resourcePatch { private val hideAdsResourcePatch = resourcePatch {
dependsOn( dependsOn(
@@ -37,6 +44,7 @@ private val hideAdsResourcePatch = resourcePatch {
PreferenceScreen.ADS.addPreferences( PreferenceScreen.ADS.addPreferences(
SwitchPreference("revanced_hide_general_ads"), SwitchPreference("revanced_hide_general_ads"),
SwitchPreference("revanced_hide_end_screen_store_banner"),
SwitchPreference("revanced_hide_fullscreen_ads"), SwitchPreference("revanced_hide_fullscreen_ads"),
SwitchPreference("revanced_hide_buttoned_ads"), SwitchPreference("revanced_hide_buttoned_ads"),
SwitchPreference("revanced_hide_paid_promotion_label"), SwitchPreference("revanced_hide_paid_promotion_label"),
@@ -52,6 +60,7 @@ private val hideAdsResourcePatch = resourcePatch {
addLithoFilter("Lapp/revanced/extension/youtube/patches/components/AdsFilter;") addLithoFilter("Lapp/revanced/extension/youtube/patches/components/AdsFilter;")
adAttributionId = resourceMappings["id", "ad_attribution"] adAttributionId = resourceMappings["id", "ad_attribution"]
fullScreenEngagementAdContainer = resourceMappings["id", "fullscreen_engagement_ad_container"]
} }
} }
@@ -82,6 +91,23 @@ val hideAdsPatch = bytecodePatch(
) )
execute { execute {
// Hide end screen store banner
fullScreenEngagementAdContainerFingerprint.method.apply {
val addListIndex = indexOfAddListInstruction(this)
val addListInstruction = getInstruction<FiveRegisterInstruction>(addListIndex)
val listRegister = addListInstruction.registerC
val objectRegister = addListInstruction.registerD
replaceInstruction(
addListIndex,
"invoke-static { v$listRegister, v$objectRegister }, $EXTENSION_CLASS_DESCRIPTOR" +
"->hideEndScreenStoreBanner(Ljava/util/List;Ljava/lang/Object;)V"
)
}
// Hide ad views
classes.forEach { classDef -> classes.forEach { classDef ->
classDef.methods.forEach { method -> classDef.methods.forEach { method ->
with(method.implementation) { with(method.implementation) {
@@ -110,7 +136,7 @@ val hideAdsPatch = bytecodePatch(
.injectHideViewCall( .injectHideViewCall(
insertIndex, insertIndex,
viewRegister, viewRegister,
"Lapp/revanced/extension/youtube/patches/components/AdsFilter;", EXTENSION_CLASS_DESCRIPTOR,
"hideAdAttributionView", "hideAdAttributionView",
) )
} }

View File

@@ -24,9 +24,7 @@ internal const val EXTENSION_METHOD_DESCRIPTOR =
val enableSlideToSeekPatch = bytecodePatch( val enableSlideToSeekPatch = bytecodePatch(
name = "Enable slide to seek", name = "Enable slide to seek",
description = "Adds an option to enable slide to seek " + description = "Adds an option to enable slide to seek " +
"instead of playing at 2x speed when pressing and holding in the video player. " + "instead of playing at 2x speed when pressing and holding in the video player."
"Including this patch may cause issues with tapping or double tapping the video player overlay.",
use = false,
) { ) {
dependsOn( dependsOn(
sharedExtensionPatch, sharedExtensionPatch,

View File

@@ -10,8 +10,7 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.shared.misc.settings.preference.TextPreference
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch
import app.revanced.patches.youtube.misc.playservice.is_19_23_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater
import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater
import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.patches.youtube.shared.mainActivityFingerprint import app.revanced.patches.youtube.shared.mainActivityFingerprint
@@ -30,7 +29,7 @@ private val swipeControlsResourcePatch = resourcePatch {
execute { execute {
addResources("youtube", "interaction.swipecontrols.swipeControlsResourcePatch") addResources("youtube", "interaction.swipecontrols.swipeControlsResourcePatch")
if (is_19_25_or_greater) { if (is_19_43_or_greater) {
PreferenceScreen.SWIPE_CONTROLS.addPreferences( PreferenceScreen.SWIPE_CONTROLS.addPreferences(
SwitchPreference("revanced_swipe_change_video") SwitchPreference("revanced_swipe_change_video")
) )
@@ -45,7 +44,7 @@ private val swipeControlsResourcePatch = resourcePatch {
SwitchPreference("revanced_swipe_lowest_value_enable_auto_brightness"), SwitchPreference("revanced_swipe_lowest_value_enable_auto_brightness"),
TextPreference("revanced_swipe_overlay_timeout", inputType = InputType.NUMBER), TextPreference("revanced_swipe_overlay_timeout", inputType = InputType.NUMBER),
TextPreference("revanced_swipe_text_overlay_size", inputType = InputType.NUMBER), TextPreference("revanced_swipe_text_overlay_size", inputType = InputType.NUMBER),
TextPreference("revanced_swipe_overlay_background_alpha", inputType = InputType.NUMBER), TextPreference("revanced_swipe_overlay_background_opacity", inputType = InputType.NUMBER),
TextPreference("revanced_swipe_threshold", inputType = InputType.NUMBER), TextPreference("revanced_swipe_threshold", inputType = InputType.NUMBER),
) )
@@ -114,7 +113,7 @@ val swipeControlsPatch = bytecodePatch(
// region patch to enable/disable swipe to change video. // region patch to enable/disable swipe to change video.
if (is_19_23_or_greater) { if (is_19_43_or_greater) {
swipeChangeVideoFingerprint.method.insertFeatureFlagBooleanOverride( swipeChangeVideoFingerprint.method.insertFeatureFlagBooleanOverride(
SWIPE_CHANGE_VIDEO_FEATURE_FLAG, SWIPE_CHANGE_VIDEO_FEATURE_FLAG,
"$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z" "$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z"

View File

@@ -172,14 +172,16 @@ val changeHeaderPatch = resourcePatch(
// Instead change styles.xml to use the old drawable resources. // Instead change styles.xml to use the old drawable resources.
if (is_19_25_or_greater) { if (is_19_25_or_greater) {
document("res/values/styles.xml").use { document -> document("res/values/styles.xml").use { document ->
val documentChildNodes = document.childNodes
arrayOf( arrayOf(
"CairoLightThemeRingo2Updates" to variants[0], "CairoLightThemeRingo2Updates" to variants[0],
"CairoDarkThemeRingo2Updates" to variants[1] "CairoDarkThemeRingo2Updates" to variants[1]
).forEach { (styleName, theme) -> ).forEach { (styleName, theme) ->
val style = document.childNodes.findElementByAttributeValueOrThrow( val styleNodes = documentChildNodes.findElementByAttributeValueOrThrow(
"name", "name",
styleName, styleName,
) ).childNodes
val drawable = "@drawable/${HEADER_FILE_NAME}_${theme}" val drawable = "@drawable/${HEADER_FILE_NAME}_${theme}"
@@ -187,7 +189,7 @@ val changeHeaderPatch = resourcePatch(
"ytWordmarkHeader", "ytWordmarkHeader",
"ytPremiumWordmarkHeader" "ytPremiumWordmarkHeader"
).forEach { itemName -> ).forEach { itemName ->
style.childNodes.findElementByAttributeValueOrThrow( styleNodes.findElementByAttributeValueOrThrow(
"name", "name",
itemName, itemName,
).textContent = drawable ).textContent = drawable

View File

@@ -65,9 +65,12 @@ val navigationButtonsPatch = bytecodePatch(
) )
if (is_19_25_or_greater) { if (is_19_25_or_greater) {
preferences += SwitchPreference("revanced_disable_translucent_status_bar")
preferences += SwitchPreference("revanced_disable_translucent_navigation_bar_light") preferences += SwitchPreference("revanced_disable_translucent_navigation_bar_light")
preferences += SwitchPreference("revanced_disable_translucent_navigation_bar_dark") preferences += SwitchPreference("revanced_disable_translucent_navigation_bar_dark")
PreferenceScreen.GENERAL_LAYOUT.addPreferences(
SwitchPreference("revanced_disable_translucent_status_bar")
)
} }
PreferenceScreen.GENERAL_LAYOUT.addPreferences( PreferenceScreen.GENERAL_LAYOUT.addPreferences(

View File

@@ -147,6 +147,7 @@ val hideLayoutComponentsPatch = bytecodePatch(
SwitchPreference("revanced_hide_attributes_section"), SwitchPreference("revanced_hide_attributes_section"),
SwitchPreference("revanced_hide_chapters_section"), SwitchPreference("revanced_hide_chapters_section"),
SwitchPreference("revanced_hide_info_cards_section"), SwitchPreference("revanced_hide_info_cards_section"),
SwitchPreference("revanced_hide_how_this_was_made_section"),
SwitchPreference("revanced_hide_key_concepts_section"), SwitchPreference("revanced_hide_key_concepts_section"),
SwitchPreference("revanced_hide_podcast_section"), SwitchPreference("revanced_hide_podcast_section"),
SwitchPreference("revanced_hide_transcript_section"), SwitchPreference("revanced_hide_transcript_section"),

View File

@@ -2,9 +2,12 @@ package app.revanced.patches.youtube.layout.seekbar
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import app.revanced.util.containsLiteralInstruction import app.revanced.util.containsLiteralInstruction
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import app.revanced.util.literal import app.revanced.util.literal
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
internal val fullscreenSeekbarThumbnailsFingerprint = fingerprint { internal val fullscreenSeekbarThumbnailsFingerprint = fingerprint {
returns("Z") returns("Z")
@@ -34,13 +37,17 @@ internal val shortsSeekbarColorFingerprint = fingerprint {
literal { reelTimeBarPlayedColorId } literal { reelTimeBarPlayedColorId }
} }
internal const val PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG = 45617850L internal val playerSeekbarHandleColorFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
parameters("Landroid/content/Context;")
literal { ytStaticBrandRedId }
}
internal val playerSeekbarGradientConfigFingerprint = fingerprint { internal val watchHistoryMenuUseProgressDrawableFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Z") returns("V")
parameters() parameters("L")
literal { PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG } literal { -1712394514 }
} }
internal val lithoLinearGradientFingerprint = fingerprint { internal val lithoLinearGradientFingerprint = fingerprint {
@@ -49,6 +56,49 @@ internal val lithoLinearGradientFingerprint = fingerprint {
parameters("F", "F", "F", "F", "[I", "[F") parameters("F", "F", "F", "F", "[I", "[F")
} }
/**
* 19.49+
*/
internal val playerLinearGradientFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
parameters("I", "I", "I", "I", "Landroid/content/Context;", "I")
returns("Landroid/graphics/LinearGradient;")
opcodes(
Opcode.FILLED_NEW_ARRAY,
Opcode.MOVE_RESULT_OBJECT
)
literal { ytYoutubeMagentaColorId }
}
/**
* 19.46 - 19.47
*/
internal val playerLinearGradientLegacy1946Fingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
parameters("I", "I", "I", "I")
returns("V")
opcodes(
Opcode.FILLED_NEW_ARRAY,
Opcode.MOVE_RESULT_OBJECT
)
custom { method, _ ->
method.name == "setBounds" && method.containsLiteralInstruction(ytYoutubeMagentaColorId)
}
}
/**
* 19.25 - 19.45
*/
internal val playerLinearGradientLegacy1925Fingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
parameters("Landroid/content/Context;")
opcodes(
Opcode.FILLED_NEW_ARRAY,
Opcode.MOVE_RESULT_OBJECT
)
literal { ytYoutubeMagentaColorId }
}
internal const val launchScreenLayoutTypeLotteFeatureFlag = 268507948L internal const val launchScreenLayoutTypeLotteFeatureFlag = 268507948L
internal val launchScreenLayoutTypeFingerprint = fingerprint { internal val launchScreenLayoutTypeFingerprint = fingerprint {
@@ -62,3 +112,52 @@ internal val launchScreenLayoutTypeFingerprint = fingerprint {
&& method.containsLiteralInstruction(launchScreenLayoutTypeLotteFeatureFlag) && method.containsLiteralInstruction(launchScreenLayoutTypeLotteFeatureFlag)
} }
} }
internal const val LOTTIE_ANIMATION_VIEW_CLASS_TYPE = "Lcom/airbnb/lottie/LottieAnimationView;"
internal val lottieAnimationViewSetAnimationIntFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
parameters("I")
returns("V")
custom { methodDef, classDef ->
classDef.type == LOTTIE_ANIMATION_VIEW_CLASS_TYPE && methodDef.indexOfFirstInstruction {
val reference = getReference<MethodReference>()
reference?.definingClass == "Lcom/airbnb/lottie/LottieAnimationView;"
&& reference.name == "isInEditMode"
} >= 0
}
}
internal val lottieAnimationViewSetAnimationStreamFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
parameters("L")
returns("V")
custom { methodDef, classDef ->
classDef.type == LOTTIE_ANIMATION_VIEW_CLASS_TYPE && methodDef.indexOfFirstInstruction {
val reference = getReference<MethodReference>()
reference?.definingClass == "Ljava/util/Set;"
&& reference.name == "add"
} >= 0 && methodDef.containsLiteralInstruction(0)
}
}
internal val lottieCompositionFactoryZipFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
parameters("Landroid/content/Context;", "Ljava/lang/String;", "Ljava/lang/String;")
returns("L")
strings(".zip", ".lottie")
}
/**
* Resolves using class found in [lottieCompositionFactoryZipFingerprint].
*
* [Original method](https://github.com/airbnb/lottie-android/blob/26ad8bab274eac3f93dccccfa0cafc39f7408d13/lottie/src/main/java/com/airbnb/lottie/LottieCompositionFactory.java#L386)
*/
internal val lottieCompositionFactoryFromJsonInputStreamFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
parameters("Ljava/io/InputStream;", "Ljava/lang/String;")
returns("L")
literal { 2 }
}

View File

@@ -3,10 +3,12 @@ package app.revanced.patches.youtube.layout.seekbar
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.get
import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.mapping.resourceMappingPatch
import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.mapping.resourceMappings
@@ -14,21 +16,29 @@ import app.revanced.patches.youtube.layout.theme.lithoColorHookPatch
import app.revanced.patches.youtube.layout.theme.lithoColorOverrideHook import app.revanced.patches.youtube.layout.theme.lithoColorOverrideHook
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater
import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater
import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater
import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint
import app.revanced.util.copyXmlNode import app.revanced.util.copyXmlNode
import app.revanced.util.findElementByAttributeValueOrThrow import app.revanced.util.findElementByAttributeValueOrThrow
import app.revanced.util.findInstructionIndicesReversedOrThrow
import app.revanced.util.getReference import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
import app.revanced.util.inputStreamFromBundledResource import app.revanced.util.inputStreamFromBundledResource
import app.revanced.util.insertFeatureFlagBooleanOverride import app.revanced.util.insertFeatureFlagBooleanOverride
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
import org.w3c.dom.Element import org.w3c.dom.Element
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
import kotlin.use import kotlin.use
@@ -39,6 +49,10 @@ internal var inlineTimeBarColorizedBarPlayedColorDarkId = -1L
private set private set
internal var inlineTimeBarPlayedNotHighlightedColorId = -1L internal var inlineTimeBarPlayedNotHighlightedColorId = -1L
private set private set
internal var ytYoutubeMagentaColorId = -1L
private set
internal var ytStaticBrandRedId = -1L
private set
internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color" internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color"
@@ -83,6 +97,15 @@ private val seekbarColorResourcePatch = resourcePatch {
return@execute return@execute
} }
ytYoutubeMagentaColorId = resourceMappings[
"color",
"yt_youtube_magenta",
]
ytStaticBrandRedId = resourceMappings[
"attr",
"ytStaticBrandRed",
]
// Add attribute and styles for splash screen custom color. // Add attribute and styles for splash screen custom color.
// Using a style is the only way to selectively change just the seekbar fill color. // Using a style is the only way to selectively change just the seekbar fill color.
// //
@@ -102,8 +125,10 @@ private val seekbarColorResourcePatch = resourcePatch {
fun setSplashDrawablePathFillColor(xmlFileNames: Iterable<String>, vararg resourceNames: String) { fun setSplashDrawablePathFillColor(xmlFileNames: Iterable<String>, vararg resourceNames: String) {
xmlFileNames.forEach { xmlFileName -> xmlFileNames.forEach { xmlFileName ->
document(xmlFileName).use { document -> document(xmlFileName).use { document ->
val childNodes = document.childNodes
resourceNames.forEach { elementId -> resourceNames.forEach { elementId ->
val element = document.childNodes.findElementByAttributeValueOrThrow( val element = childNodes.findElementByAttributeValueOrThrow(
"android:name", "android:name",
elementId elementId
) )
@@ -182,28 +207,31 @@ val seekbarColorPatch = bytecodePatch(
sharedExtensionPatch, sharedExtensionPatch,
lithoColorHookPatch, lithoColorHookPatch,
seekbarColorResourcePatch, seekbarColorResourcePatch,
versionCheckPatch
) )
execute { execute {
fun MutableMethod.addColorChangeInstructions(resourceId: Long) { fun MutableMethod.addColorChangeInstructions(resourceId: Long, methodName: String) {
val registerIndex = indexOfFirstLiteralInstructionOrThrow(resourceId) + 2 val index = indexOfFirstLiteralInstructionOrThrow(resourceId)
val colorRegister = getInstruction<OneRegisterInstruction>(registerIndex).registerA val insertIndex = indexOfFirstInstructionOrThrow(index, Opcode.MOVE_RESULT)
val register = getInstruction<OneRegisterInstruction>(insertIndex).registerA
addInstructions( addInstructions(
registerIndex + 1, insertIndex + 1,
"""
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$methodName(I)I
move-result v$register
""" """
invoke-static { v$colorRegister }, $EXTENSION_CLASS_DESCRIPTOR->getVideoPlayerSeekbarColor(I)I
move-result v$colorRegister
""",
) )
} }
playerSeekbarColorFingerprint.method.apply { playerSeekbarColorFingerprint.method.apply {
addColorChangeInstructions(inlineTimeBarColorizedBarPlayedColorDarkId) addColorChangeInstructions(inlineTimeBarColorizedBarPlayedColorDarkId, "getVideoPlayerSeekbarColor")
addColorChangeInstructions(inlineTimeBarPlayedNotHighlightedColorId) addColorChangeInstructions(inlineTimeBarPlayedNotHighlightedColorId, "getVideoPlayerSeekbarColor")
} }
shortsSeekbarColorFingerprint.method.apply { shortsSeekbarColorFingerprint.method.apply {
addColorChangeInstructions(reelTimeBarPlayedColorId) addColorChangeInstructions(reelTimeBarPlayedColorId, "getVideoPlayerSeekbarColor")
} }
setSeekbarClickedColorFingerprint.originalMethod.let { setSeekbarClickedColorFingerprint.originalMethod.let {
@@ -229,20 +257,71 @@ val seekbarColorPatch = bytecodePatch(
// 19.25+ changes // 19.25+ changes
playerSeekbarGradientConfigFingerprint.method.insertFeatureFlagBooleanOverride( playerSeekbarHandleColorFingerprint.method.apply {
PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG, addColorChangeInstructions(ytStaticBrandRedId, "getVideoPlayerSeekbarColor")
"$EXTENSION_CLASS_DESCRIPTOR->playerSeekbarGradientEnabled(Z)Z" }
)
lithoLinearGradientFingerprint.method.addInstruction( // If hiding feed seekbar thumbnails, then turn off the cairo gradient
// of the watch history menu items as they use the same gradient as the
// player and there is no easy way to distinguish which to use a transparent color.
if (is_19_34_or_greater) {
watchHistoryMenuUseProgressDrawableFingerprint.method.apply {
val progressIndex = indexOfFirstInstructionOrThrow {
val reference = getReference<MethodReference>()
reference?.definingClass == "Landroid/widget/ProgressBar;" && reference.name == "setMax"
}
val index = indexOfFirstInstructionOrThrow(progressIndex, Opcode.MOVE_RESULT)
val register = getInstruction<OneRegisterInstruction>(index).registerA
addInstructions(
index + 1,
"""
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->showWatchHistoryProgressDrawable(Z)Z
move-result v$register
"""
)
}
}
lithoLinearGradientFingerprint.method.addInstructions(
0, 0,
"invoke-static/range { p4 .. p5 }, $EXTENSION_CLASS_DESCRIPTOR->setLinearGradient([I[F)V" """
invoke-static/range { p4 .. p5 }, $EXTENSION_CLASS_DESCRIPTOR->getLithoLinearGradient([I[F)[I
move-result-object p4
"""
) )
val playerFingerprint =
if (is_19_49_or_greater) {
playerLinearGradientFingerprint
} else if (is_19_46_or_greater) {
playerLinearGradientLegacy1946Fingerprint
} else {
playerLinearGradientLegacy1925Fingerprint
}
playerFingerprint.let {
it.method.apply {
val index = it.patternMatch!!.endIndex
val register = getInstruction<OneRegisterInstruction>(index).registerA
addInstructions(
index + 1,
"""
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getPlayerLinearGradient([I)[I
move-result-object v$register
"""
)
}
}
// region apply seekbar custom color to splash screen animation. // region apply seekbar custom color to splash screen animation.
// Don't use the lotte splash screen layout if using custom seekbar. if (!is_19_34_or_greater) {
return@execute // 19.25 does not have a cairo launch animation.
}
// Add development hook to force old drawable splash animation.
arrayOf( arrayOf(
launchScreenLayoutTypeFingerprint, launchScreenLayoutTypeFingerprint,
mainActivityOnCreateFingerprint mainActivityOnCreateFingerprint
@@ -253,7 +332,7 @@ val seekbarColorPatch = bytecodePatch(
) )
} }
// Hook the splash animation drawable to set the a seekbar color theme. // Hook the splash animation to set the a seekbar color.
mainActivityOnCreateFingerprint.method.apply { mainActivityOnCreateFingerprint.method.apply {
val drawableIndex = indexOfFirstInstructionOrThrow { val drawableIndex = indexOfFirstInstructionOrThrow {
val reference = getReference<MethodReference>() val reference = getReference<MethodReference>()
@@ -268,6 +347,87 @@ val seekbarColorPatch = bytecodePatch(
"invoke-static { v$drawableRegister }, $EXTENSION_CLASS_DESCRIPTOR->" + "invoke-static { v$drawableRegister }, $EXTENSION_CLASS_DESCRIPTOR->" +
"setSplashAnimationDrawableTheme(Landroid/graphics/drawable/AnimatedVectorDrawable;)V" "setSplashAnimationDrawableTheme(Landroid/graphics/drawable/AnimatedVectorDrawable;)V"
) )
// Replace the Lottie animation view setAnimation(int) call.
val setAnimationIntMethodName = lottieAnimationViewSetAnimationIntFingerprint.originalMethod.name
findInstructionIndicesReversedOrThrow {
val reference = getReference<MethodReference>()
reference?.definingClass == "Lcom/airbnb/lottie/LottieAnimationView;"
&& reference.name == setAnimationIntMethodName
}.forEach { index ->
val instruction = getInstruction<FiveRegisterInstruction>(index)
replaceInstruction(
index,
"invoke-static { v${instruction.registerC}, v${instruction.registerD} }, " +
"$EXTENSION_CLASS_DESCRIPTOR->setSplashAnimationLottie" +
"(Lcom/airbnb/lottie/LottieAnimationView;I)V"
)
}
}
// Add non obfuscated method aliases for `setAnimation(int)`
// and `setAnimation(InputStream, String)` so extension code can call them.
lottieAnimationViewSetAnimationIntFingerprint.classDef.methods.apply {
val addedMethodName = "patch_setAnimation"
val setAnimationIntName = lottieAnimationViewSetAnimationIntFingerprint.originalMethod.name
add(ImmutableMethod(
LOTTIE_ANIMATION_VIEW_CLASS_TYPE,
addedMethodName,
listOf(ImmutableMethodParameter("I", null, null)),
"V",
AccessFlags.PUBLIC.value,
null,
null,
MutableMethodImplementation(2),
).toMutable().apply {
addInstructions(
"""
invoke-virtual { p0, p1 }, Lcom/airbnb/lottie/LottieAnimationView;->$setAnimationIntName(I)V
return-void
"""
)
})
val factoryStreamClass : CharSequence
val factoryStreamName : CharSequence
val factoryStreamReturnType : CharSequence
lottieCompositionFactoryFromJsonInputStreamFingerprint.match(
lottieCompositionFactoryZipFingerprint.originalClassDef
).originalMethod.apply {
factoryStreamClass = definingClass
factoryStreamName = name
factoryStreamReturnType = returnType
}
val setAnimationStreamName = lottieAnimationViewSetAnimationStreamFingerprint
.originalMethod.name
add(ImmutableMethod(
LOTTIE_ANIMATION_VIEW_CLASS_TYPE,
addedMethodName,
listOf(
ImmutableMethodParameter("Ljava/io/InputStream;", null, null),
ImmutableMethodParameter("Ljava/lang/String;", null, null)
),
"V",
AccessFlags.PUBLIC.value,
null,
null,
MutableMethodImplementation(4),
).toMutable().apply {
addInstructions(
"""
invoke-static { p1, p2 }, $factoryStreamClass->$factoryStreamName(Ljava/io/InputStream;Ljava/lang/String;)$factoryStreamReturnType
move-result-object v0
invoke-virtual { p0, v0}, Lcom/airbnb/lottie/LottieAnimationView;->$setAnimationStreamName($factoryStreamReturnType)V
return-void
"""
)
})
} }
// endregion // endregion

View File

@@ -70,12 +70,7 @@ private val sponsorBlockResourcePatch = resourcePatch {
"revanced_sb_logo.xml", "revanced_sb_logo.xml",
"revanced_sb_publish.xml", "revanced_sb_publish.xml",
"revanced_sb_voting.xml", "revanced_sb_voting.xml",
), )
ResourceGroup(
// required resource for back button, because when the base APK is used, this resource will not exist
"drawable-xxxhdpi",
"quantum_ic_skip_next_white_24.png",
),
).forEach { resourceGroup -> ).forEach { resourceGroup ->
copyResources("sponsorblock", resourceGroup) copyResources("sponsorblock", resourceGroup)
} }

View File

@@ -13,6 +13,8 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.shared.misc.settings.preference.TextPreference
import app.revanced.patches.youtube.layout.seekbar.seekbarColorPatch import app.revanced.patches.youtube.layout.seekbar.seekbarColorPatch
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.util.forEachChildElement import app.revanced.util.forEachChildElement
@@ -71,6 +73,7 @@ val themePatch = bytecodePatch(
dependsOn( dependsOn(
lithoColorHookPatch, lithoColorHookPatch,
seekbarColorPatch, seekbarColorPatch,
versionCheckPatch,
resourcePatch { resourcePatch {
dependsOn( dependsOn(
settingsPatch, settingsPatch,
@@ -83,9 +86,15 @@ val themePatch = bytecodePatch(
PreferenceScreen.SEEKBAR.addPreferences( PreferenceScreen.SEEKBAR.addPreferences(
SwitchPreference("revanced_seekbar_custom_color"), SwitchPreference("revanced_seekbar_custom_color"),
TextPreference("revanced_seekbar_custom_color_value", inputType = InputType.TEXT_CAP_CHARACTERS), TextPreference("revanced_seekbar_custom_color_primary", inputType = InputType.TEXT_CAP_CHARACTERS),
) )
if (is_19_25_or_greater) {
PreferenceScreen.SEEKBAR.addPreferences(
TextPreference("revanced_seekbar_custom_color_accent", inputType = InputType.TEXT_CAP_CHARACTERS),
)
}
// Edit theme colors via resources. // Edit theme colors via resources.
document("res/values/colors.xml").use { document -> document("res/values/colors.xml").use { document ->

View File

@@ -1,47 +0,0 @@
package app.revanced.patches.youtube.misc.fix.cairo
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.youtube.misc.backgroundplayback.backgroundPlaybackPatch
import app.revanced.patches.youtube.misc.playservice.is_19_04_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
internal val disableCairoSettingsPatch = bytecodePatch(
description = "Disables Cairo Fragment from being used.",
) {
dependsOn(versionCheckPatch)
execute {
if (!is_19_04_or_greater) {
return@execute
}
/**
* <pre>
* Cairo Fragment was added since YouTube v19.04.38.
*
* Disable this for the following reasons:
* 1. [backgroundPlaybackPatch] does not activate the Minimized playback setting of Cairo Fragment.
* 2. Some patches do not yet support Cairo Fragments (ie: custom Seekbar color).
* 3. Settings preferences added by ReVanced are missing.
*
* Screenshots of the Cairo Fragment:
* <a href="https://github.com/qnblackcat/uYouPlus/issues/1468">uYouPlus#1468</a>.
*/
cairoFragmentConfigFingerprint.method.apply {
val literalIndex = indexOfFirstLiteralInstructionOrThrow(CAIRO_CONFIG_LITERAL_VALUE)
val resultIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.MOVE_RESULT)
val register = getInstruction<OneRegisterInstruction>(resultIndex).registerA
addInstruction(
resultIndex + 1,
"const/16 v$register, 0x0",
)
}
}
}

View File

@@ -1,19 +0,0 @@
package app.revanced.patches.youtube.misc.fix.cairo
import app.revanced.patcher.fingerprint
import app.revanced.util.literal
import com.android.tools.smali.dexlib2.AccessFlags
/**
* Added in YouTube v19.04.38.
*
* When this value is true, Cairo Fragment is used.
* In this case, some of the patches may be broken, so set this value to FALSE.
*/
internal const val CAIRO_CONFIG_LITERAL_VALUE = 45532100L
internal val cairoFragmentConfigFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Z")
literal { CAIRO_CONFIG_LITERAL_VALUE }
}

View File

@@ -76,10 +76,11 @@ val playerControlsResourcePatch = resourcePatch {
"android.support.constraint.ConstraintLayout", "android.support.constraint.ConstraintLayout",
).item(0) ).item(0)
var bottomInsertBeforeNode: Node = bottomTargetDocument.childNodes.findElementByAttributeValue( val bottomTargetDocumentChildNodes = bottomTargetDocument.childNodes
var bottomInsertBeforeNode: Node = bottomTargetDocumentChildNodes.findElementByAttributeValue(
"android:inflatedId", "android:inflatedId",
bottomLastLeftOf, bottomLastLeftOf,
) ?: bottomTargetDocument.childNodes.findElementByAttributeValueOrThrow( ) ?: bottomTargetDocumentChildNodes.findElementByAttributeValueOrThrow(
"android:id", // Older targets use non-inflated id. "android:id", // Older targets use non-inflated id.
bottomLastLeftOf, bottomLastLeftOf,
) )
@@ -143,11 +144,13 @@ val playerControlsResourcePatch = resourcePatch {
} }
finalize { finalize {
val childNodes = bottomTargetDocument.childNodes
arrayOf( arrayOf(
"@id/bottom_end_container", "@id/bottom_end_container",
"@id/multiview_button", "@id/multiview_button",
).forEach { ).forEach {
bottomTargetDocument.childNodes.findElementByAttributeValue( childNodes.findElementByAttributeValue(
"android:id", "android:id",
it, it,
)?.setAttribute("yt:layout_constraintRight_toLeftOf", bottomLastLeftOf) )?.setAttribute("yt:layout_constraintRight_toLeftOf", bottomLastLeftOf)

View File

@@ -41,6 +41,8 @@ var is_19_46_or_greater = false
private set private set
var is_19_47_or_greater = false var is_19_47_or_greater = false
private set private set
var is_19_49_or_greater = false
private set
val versionCheckPatch = resourcePatch( val versionCheckPatch = resourcePatch(
description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.", description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.",
@@ -74,5 +76,6 @@ val versionCheckPatch = resourcePatch(
is_19_43_or_greater = 244405000 <= playStoreServicesVersion is_19_43_or_greater = 244405000 <= playStoreServicesVersion
is_19_46_or_greater = 244705000 <= playStoreServicesVersion is_19_46_or_greater = 244705000 <= playStoreServicesVersion
is_19_47_or_greater = 244799000 <= playStoreServicesVersion is_19_47_or_greater = 244799000 <= playStoreServicesVersion
is_19_49_or_greater = 245005000 <= playStoreServicesVersion
} }
} }

View File

@@ -21,3 +21,14 @@ internal val setThemeFingerprint = fingerprint {
opcodes(Opcode.RETURN_OBJECT) opcodes(Opcode.RETURN_OBJECT)
literal { appearanceStringId } literal { appearanceStringId }
} }
/**
* Added in YouTube v19.04.38.
*/
internal const val CAIRO_CONFIG_LITERAL_VALUE = 45532100L
internal val cairoFragmentConfigFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Z")
literal { CAIRO_CONFIG_LITERAL_VALUE }
}

View File

@@ -18,8 +18,10 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPref
import app.revanced.patches.shared.misc.settings.settingsPatch import app.revanced.patches.shared.misc.settings.settingsPatch
import app.revanced.patches.youtube.misc.check.checkEnvironmentPatch import app.revanced.patches.youtube.misc.check.checkEnvironmentPatch
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.fix.cairo.disableCairoSettingsPatch
import app.revanced.patches.youtube.misc.fix.playbackspeed.fixPlaybackSpeedWhilePlayingPatch import app.revanced.patches.youtube.misc.fix.playbackspeed.fixPlaybackSpeedWhilePlayingPatch
import app.revanced.patches.youtube.misc.playservice.is_19_04_or_greater
import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.util.* import app.revanced.util.*
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
@@ -43,13 +45,28 @@ private val settingsResourcePatch = resourcePatch {
dependsOn( dependsOn(
resourceMappingPatch, resourceMappingPatch,
settingsPatch( settingsPatch(
rootPreference = IntentPreference( listOf(
titleKey = "revanced_settings_title", IntentPreference(
summaryKey = null, titleKey = "revanced_settings_title",
intent = newIntent("revanced_settings_intent"), summaryKey = null,
) to "settings_fragment", intent = newIntent("revanced_settings_intent"),
preferences, ) to "settings_fragment",
), PreferenceCategory(
titleKey = "revanced_settings_title",
layout = "@layout/preference_group_title",
preferences = setOf(
IntentPreference(
titleKey = "revanced_settings_submenu_title",
summaryKey = null,
icon = "@drawable/revanced_settings_icon",
layout = "@layout/preference_with_icon",
intent = newIntent("revanced_settings_intent"),
)
)
) to "settings_fragment_cairo",
),
preferences
)
) )
execute { execute {
@@ -57,6 +74,7 @@ private val settingsResourcePatch = resourcePatch {
appearanceStringId = resourceMappings["string", "app_theme_appearance_dark"] appearanceStringId = resourceMappings["string", "app_theme_appearance_dark"]
arrayOf( arrayOf(
ResourceGroup("drawable", "revanced_settings_icon.xml"),
ResourceGroup("layout", "revanced_settings_with_toolbar.xml"), ResourceGroup("layout", "revanced_settings_with_toolbar.xml"),
).forEach { resourceGroup -> ).forEach { resourceGroup ->
copyResources("settings", resourceGroup) copyResources("settings", resourceGroup)
@@ -79,6 +97,7 @@ private val settingsResourcePatch = resourcePatch {
// Remove horizontal divider from the settings Preferences // Remove horizontal divider from the settings Preferences
// To better match the appearance of the stock YouTube settings. // To better match the appearance of the stock YouTube settings.
document("res/values/styles.xml").use { document -> document("res/values/styles.xml").use { document ->
val childNodes = document.childNodes
arrayOf( arrayOf(
"Theme.YouTube.Settings", "Theme.YouTube.Settings",
@@ -88,7 +107,7 @@ private val settingsResourcePatch = resourcePatch {
listDividerNode.setAttribute("name", "android:listDivider") listDividerNode.setAttribute("name", "android:listDivider")
listDividerNode.appendChild(document.createTextNode("@null")) listDividerNode.appendChild(document.createTextNode("@null"))
document.childNodes.findElementByAttributeValueOrThrow( childNodes.findElementByAttributeValueOrThrow(
"name", "name",
value, value,
).appendChild(listDividerNode) ).appendChild(listDividerNode)
@@ -99,7 +118,6 @@ private val settingsResourcePatch = resourcePatch {
// Some devices freak out if undeclared data is passed to an intent, // Some devices freak out if undeclared data is passed to an intent,
// and this change appears to fix the issue. // and this change appears to fix the issue.
document("AndroidManifest.xml").use { document -> document("AndroidManifest.xml").use { document ->
val licenseElement = document.childNodes.findElementByAttributeValueOrThrow( val licenseElement = document.childNodes.findElementByAttributeValueOrThrow(
"android:name", "android:name",
"com.google.android.libraries.social.licenses.LicenseActivity", "com.google.android.libraries.social.licenses.LicenseActivity",
@@ -123,7 +141,7 @@ val settingsPatch = bytecodePatch(
sharedExtensionPatch, sharedExtensionPatch,
settingsResourcePatch, settingsResourcePatch,
addResourcesPatch, addResourcesPatch,
disableCairoSettingsPatch, versionCheckPatch,
fixPlaybackSpeedWhilePlayingPatch, fixPlaybackSpeedWhilePlayingPatch,
// Currently there is no easy way to make a mandatory patch, // Currently there is no easy way to make a mandatory patch,
// so for now this is a dependent of this patch. // so for now this is a dependent of this patch.
@@ -147,6 +165,12 @@ val settingsPatch = bytecodePatch(
selectable = true, selectable = true,
) )
if (is_19_34_or_greater) {
PreferenceScreen.GENERAL_LAYOUT.addPreferences(
SwitchPreference("revanced_restore_old_settings_menus")
)
}
PreferenceScreen.MISC.addPreferences( PreferenceScreen.MISC.addPreferences(
TextPreference( TextPreference(
key = null, key = null,
@@ -224,6 +248,14 @@ val settingsPatch = bytecodePatch(
methods.add(attachBaseContext) methods.add(attachBaseContext)
} }
// Add setting to force cairo settings fragment on/off.
if (is_19_04_or_greater) {
cairoFragmentConfigFingerprint.method.insertFeatureFlagBooleanOverride(
CAIRO_CONFIG_LITERAL_VALUE,
"$activityHookClassDescriptor->useCairoSettingsFragment(Z)Z"
)
}
} }
finalize { finalize {
@@ -259,17 +291,15 @@ object PreferenceScreen : BasePreferenceScreen() {
key = "revanced_settings_screen_03_feed", key = "revanced_settings_screen_03_feed",
summaryKey = null, summaryKey = null,
) )
val PLAYER = Screen( val GENERAL_LAYOUT = Screen(
key = "revanced_settings_screen_04_player", key = "revanced_settings_screen_04_general",
summaryKey = null, summaryKey = null,
) )
val GENERAL_LAYOUT = Screen( val PLAYER = Screen(
key = "revanced_settings_screen_05_general", key = "revanced_settings_screen_05_player",
summaryKey = null, summaryKey = null,
) )
// Don't sort, as related preferences are scattered apart.
// Can use title sorting after PreferenceCategory support is added.
val SHORTS = Screen( val SHORTS = Screen(
key = "revanced_settings_screen_06_shorts", key = "revanced_settings_screen_06_shorts",
summaryKey = null, summaryKey = null,

View File

@@ -0,0 +1,74 @@
package app.revanced.patches.youtube.video.hdr
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
private const val EXTENSION_CLASS_DESCRIPTOR =
"Lapp/revanced/extension/youtube/patches/DisableHdrPatch;"
@Suppress("unused")
val disableHdrPatch = bytecodePatch(
name = "Disable HDR video",
description = "Adds an option to disable video HDR.",
) {
dependsOn(
sharedExtensionPatch,
settingsPatch,
addResourcesPatch,
)
compatibleWith(
"com.google.android.youtube"(
"18.38.44",
"18.49.37",
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.45.38",
"19.46.42",
"19.47.53",
),
)
execute {
addResources("youtube", "video.hdr.disableHdrPatch")
PreferenceScreen.VIDEO.addPreferences(
SwitchPreference("revanced_disable_hdr_video")
)
hdrCapabilityFingerprint.let {
it.originalMethod.apply {
val stringIndex = it.stringMatches!!.first().index
val navigateIndex = indexOfFirstInstructionOrThrow(stringIndex) {
val reference = getReference<MethodReference>()
reference?.parameterTypes == listOf("I", "Landroid/view/Display;") &&
reference.returnType == "Z"
}
// Modify the HDR lookup method (Method is in the same class as the fingerprint).
navigate(this).to(navigateIndex).stop().addInstructionsWithLabels(
0,
"""
invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->disableHDRVideo()Z
move-result v0
if-nez v0, :useHdr
return v0
:useHdr
nop
"""
)
}
}
}
}

View File

@@ -0,0 +1,12 @@
package app.revanced.patches.youtube.video.hdr
import app.revanced.patcher.fingerprint
import com.android.tools.smali.dexlib2.AccessFlags
internal val hdrCapabilityFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
strings(
"av1_profile_main_10_hdr_10_plus_supported",
"video/av01"
)
}

View File

@@ -0,0 +1,40 @@
package app.revanced.util
import java.io.File
/**
* Comments out the non-standard <app> and <patch> tags.
*
* Previously this was done on Crowdin after pushing.
* But Crowdin preprocessing has randomly failed but still used the unmodified
* strings.xml file, which effectively deletes all patch strings from Crowdin.
*/
internal fun main(args: Array<String>) {
if (args.size != 2) {
throw RuntimeException("Exactly two arguments are required: <input_file> <output_file>")
}
val inputFilePath = args[0]
val inputFile = File(inputFilePath)
if (!inputFile.exists()) {
throw RuntimeException(
"Input file not found: $inputFilePath currentDirectory: " + File(".").canonicalPath
)
}
// Comment out the non-standard tags. Otherwise Crowdin interprets the file
// not as Android but instead a generic xml file where strings are
// identified by xml position and not key.
val content = inputFile.readText()
val tagRegex = """((<app\s+.*>)|(</app>)|(<patch\s+.*>)|(</patch>))""".toRegex()
val modifiedContent = content.replace(tagRegex, """<!-- $1 -->""")
// Write modified content to the output file (creates file if it doesn't exist).
val outputFilePath = args[1]
val outputFile = File(outputFilePath)
outputFile.parentFile?.mkdirs()
outputFile.writeText(modifiedContent)
println("Preprocessed strings.xml to: $outputFilePath")
}

View File

@@ -41,7 +41,10 @@ inline fun Node.forEachChildElement(action: (Element) -> Unit) =
*/ */
fun Node.doRecursively(action: (Node) -> Unit) { fun Node.doRecursively(action: (Node) -> Unit) {
action(this) action(this)
for (i in 0 until this.childNodes.length) this.childNodes.item(i).doRecursively(action) val childNodes = this.childNodes
for (i in 0 until childNodes.length) {
childNodes.item(i).doRecursively(action)
}
} }
fun Node.insertFirst(node: Node) { fun Node.insertFirst(node: Node) {

View File

@@ -24,31 +24,31 @@ class StringResource(
if (value.startsWith('"') && value.endsWith('"')) { if (value.startsWith('"') && value.endsWith('"')) {
// Raw strings allow unescaped single quote but not double quote. // Raw strings allow unescaped single quote but not double quote.
if (!value.substring(1, value.length - 1).contains(Regex("(?<!\\\\)[\"]"))) { if (!value.substring(1, value.length - 1).contains(Regex("(?<!\\\\)[\"]"))) {
return this; return this
} }
} else { } else {
if (value.contains('\n')) { if (value.contains('\n')) {
// Don't throw an exception, otherwise unnoticed mistakes // Don't throw an exception, otherwise unnoticed mistakes
// in Crowdin can cause patching failures. // in Crowdin can cause patching failures.
// Incorrectly escaped strings still work but do not display as intended. // Incorrectly escaped strings still work but do not display as intended.
Logger.getLogger(StringResource.javaClass.name).severe( Logger.getLogger(StringResource.javaClass.name).warning(
"String $name is not raw but contains encoded new line characters: $value") "String $name is not raw but contains encoded new line characters: $value")
} }
if (!value.contains(Regex("(?<!\\\\)['\"]"))) { if (!value.contains(Regex("(?<!\\\\)['\"]"))) {
return this; return this
} }
} }
Logger.getLogger(StringResource.javaClass.name).severe( Logger.getLogger(StringResource.javaClass.name).warning(
"String $name cannot contain unescaped quotes in value: $value") "String $name cannot contain unescaped quotes in value: $value")
return this; return this
} }
// if the string is un-formatted, explicitly add the formatted attribute // if the string is un-formatted, explicitly add the formatted attribute
if (!formatted) setAttribute("formatted", "false") if (!formatted) setAttribute("formatted", "false")
textContent = value.validateAndroidStringEscaping(); textContent = value.validateAndroidStringEscaping()
} }
companion object { companion object {

View File

@@ -145,6 +145,7 @@ Second \"item\" text"</string>
<patch id="layout.returnyoutubedislike.returnYouTubeDislikePatch"> <patch id="layout.returnyoutubedislike.returnYouTubeDislikePatch">
<!-- 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. --> <!-- 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. -->
<!-- Toast shown if the user enables RYD while a video is opened, and then tries to vote for the video. --> <!-- Toast shown if the user enables RYD while a video is opened, and then tries to vote for the video. -->
<!-- Video likes have been set to hidden by the video uploader. -->
<!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' --> <!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' -->
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. --> <!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
</patch> </patch>
@@ -215,6 +216,8 @@ Second \"item\" text"</string>
</patch> </patch>
<patch id="video.speed.remember.rememberPlaybackSpeedPatch"> <patch id="video.speed.remember.rememberPlaybackSpeedPatch">
</patch> </patch>
<patch id="video.hdr.disableHdrPatch">
</patch>
<patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch"> <patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch">
</patch> </patch>
<patch id="interaction.seekbar.enableSlideToSeekPatch"> <patch id="interaction.seekbar.enableSlideToSeekPatch">

View File

@@ -145,6 +145,7 @@ Second \"item\" text"</string>
<patch id="layout.returnyoutubedislike.returnYouTubeDislikePatch"> <patch id="layout.returnyoutubedislike.returnYouTubeDislikePatch">
<!-- 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. --> <!-- 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. -->
<!-- Toast shown if the user enables RYD while a video is opened, and then tries to vote for the video. --> <!-- Toast shown if the user enables RYD while a video is opened, and then tries to vote for the video. -->
<!-- Video likes have been set to hidden by the video uploader. -->
<!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' --> <!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' -->
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. --> <!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
</patch> </patch>
@@ -215,6 +216,8 @@ Second \"item\" text"</string>
</patch> </patch>
<patch id="video.speed.remember.rememberPlaybackSpeedPatch"> <patch id="video.speed.remember.rememberPlaybackSpeedPatch">
</patch> </patch>
<patch id="video.hdr.disableHdrPatch">
</patch>
<patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch"> <patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch">
</patch> </patch>
<patch id="interaction.seekbar.enableSlideToSeekPatch"> <patch id="interaction.seekbar.enableSlideToSeekPatch">

View File

@@ -33,7 +33,7 @@ Second \"item\" text"</string>
<string name="revanced_check_environment_not_near_patch_time_invalid">تاريخ إنشاء APK تالف</string> <string name="revanced_check_environment_not_near_patch_time_invalid">تاريخ إنشاء APK تالف</string>
</patch> </patch>
<patch id="misc.settings.settingsResourcePatch"> <patch id="misc.settings.settingsResourcePatch">
<string name="revanced_settings_title">ReVanced</string> <string name="revanced_settings_submenu_title">الإعدادات</string>
<string name="revanced_settings_confirm_user_dialog_title">هل ترغب في المتابعة؟</string> <string name="revanced_settings_confirm_user_dialog_title">هل ترغب في المتابعة؟</string>
<string name="revanced_settings_reset">إعادة التعيين</string> <string name="revanced_settings_reset">إعادة التعيين</string>
<string name="revanced_settings_restart_title">تحديث وإعادة تشغيل</string> <string name="revanced_settings_restart_title">تحديث وإعادة تشغيل</string>
@@ -133,12 +133,15 @@ Second \"item\" text"</string>
<string name="revanced_settings_screen_01_ads_title">الإعلانات</string> <string name="revanced_settings_screen_01_ads_title">الإعلانات</string>
<string name="revanced_settings_screen_02_alt_thumbnails_title">مُصغَّرات فيديو بديلة</string> <string name="revanced_settings_screen_02_alt_thumbnails_title">مُصغَّرات فيديو بديلة</string>
<string name="revanced_settings_screen_03_feed_title">الموجز</string> <string name="revanced_settings_screen_03_feed_title">الموجز</string>
<string name="revanced_settings_screen_04_player_title">المشغل</string> <string name="revanced_settings_screen_04_general_title">عام</string>
<string name="revanced_settings_screen_05_general_title">التصميم العام</string> <string name="revanced_settings_screen_05_player_title">المشغل</string>
<string name="revanced_settings_screen_07_seekbar_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_08_swipe_controls_title">التحكم عن طريق إيماءة التمرير</string>
<string name="revanced_settings_screen_11_misc_title">إعدادات متنوعة</string> <string name="revanced_settings_screen_11_misc_title">خيارات متنوعة</string>
<string name="revanced_settings_screen_12_video_title">الفيديو</string> <string name="revanced_settings_screen_12_video_title">الفيديو</string>
<string name="revanced_restore_old_settings_menus_title">استعادة قوائم الإعدادات القديمة</string>
<string name="revanced_restore_old_settings_menus_summary_on">يتم عرض قوائم الإعدادات القديمة</string>
<string name="revanced_restore_old_settings_menus_summary_off">لا يتم عرض قوائم الإعدادات القديمة</string>
</patch> </patch>
<patch id="misc.backgroundplayback.backgroundPlaybackPatch"> <patch id="misc.backgroundplayback.backgroundPlaybackPatch">
<string name="revanced_shorts_disable_background_playback_title">تعطيل تشغيل فيديوهات Shorts في الخلفية</string> <string name="revanced_shorts_disable_background_playback_title">تعطيل تشغيل فيديوهات Shorts في الخلفية</string>
@@ -165,9 +168,9 @@ Second \"item\" text"</string>
لن يتم إعلامك بأي أخطاء غير متوقعة."</string> لن يتم إعلامك بأي أخطاء غير متوقعة."</string>
</patch> </patch>
<patch id="layout.hide.general.hideLayoutComponentsPatch"> <patch id="layout.hide.general.hideLayoutComponentsPatch">
<string name="revanced_disable_like_subscribe_glow_title">تعطيل توهج زر أعجبني / اشتراك</string> <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_on">لن يتوهَّج زرّي أعجبني واشتراك عند ذكرهما</string>
<string name="revanced_disable_like_subscribe_glow_summary_off">أعجبني واشتراك سوف يتوهج عند الإشارة</string> <string name="revanced_disable_like_subscribe_glow_summary_off">سيتوهَّج زرّي أعجبني واشتراك عند ذكرهما</string>
<string name="revanced_hide_album_cards_title">إخفاء بطاقات الألبوم</string> <string name="revanced_hide_album_cards_title">إخفاء بطاقات الألبوم</string>
<string name="revanced_hide_album_cards_summary_on">تم إخفاء بطاقات الألبوم</string> <string name="revanced_hide_album_cards_summary_on">تم إخفاء بطاقات الألبوم</string>
<string name="revanced_hide_album_cards_summary_off">يتم عرض بطاقات الألبوم</string> <string name="revanced_hide_album_cards_summary_off">يتم عرض بطاقات الألبوم</string>
@@ -283,6 +286,9 @@ Second \"item\" text"</string>
<string name="revanced_hide_chapters_section_title">إخفاء قسم الفصول</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_on">تم إخفاء قسم الفصول</string>
<string name="revanced_hide_chapters_section_summary_off">يتم عرض قسم الفصول</string> <string name="revanced_hide_chapters_section_summary_off">يتم عرض قسم الفصول</string>
<string name="revanced_hide_how_this_was_made_section_title">إخفاء قسم \"كيف تم إنشاء هذا المحتوى\"</string>
<string name="revanced_hide_how_this_was_made_section_summary_on">تم إخفاء قسم \"كيف تم إنشاء هذا المحتوى\"</string>
<string name="revanced_hide_how_this_was_made_section_summary_off">يتم عرض قسم \"كيف تم إنشاء هذا المحتوى\"</string>
<string name="revanced_hide_podcast_section_title">إخفاء قسم \'استكشاف البودكاست\'</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_on">تم إخفاء قسم \"استكشاف البودكاست\"</string>
<string name="revanced_hide_podcast_section_summary_off">يتم عرض قسم \"استكشاف البودكاست\"</string> <string name="revanced_hide_podcast_section_summary_off">يتم عرض قسم \"استكشاف البودكاست\"</string>
@@ -352,12 +358,12 @@ Second \"item\" text"</string>
<string name="revanced_hide_keyword_content_home_title">إخفاء فيديوهات الصفحة الرئيسية بواسطة الكلمات المفتاحية</string> <string name="revanced_hide_keyword_content_home_title">إخفاء فيديوهات الصفحة الرئيسية بواسطة الكلمات المفتاحية</string>
<string name="revanced_hide_keyword_content_home_summary_on">تتم تصفية الفيديوهات في علامة التبويب \"الصفحة الرئيسية\" حسب الكلمات المفتاحية</string> <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_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_title">إخفاء نتائج البحث عن طريق الكلمات المفتاحية</string>
<string name="revanced_hide_keyword_content_search_summary_on">يتم تصفية نتائج البحث حسب الكلمات المفتاحية</string> <string name="revanced_hide_keyword_content_search_summary_on">يتم تصفية نتائج البحث حسب الكلمات المفتاحية</string>
<string name="revanced_hide_keyword_content_search_summary_off">لا يتم تصفية نتائج البحث حسب الكلمات المفتاحية</string> <string name="revanced_hide_keyword_content_search_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_phrases_title">الكلمات المفتاحية المراد إخفاؤها</string> <string name="revanced_hide_keyword_content_phrases_title">الكلمات المفتاحية المراد إخفاؤها</string>
<!-- For localization it is preferred, but not required, if 'LeBlanc' is replaced with a localized name or a familiar word that has upper case letters in the middle of the word. <!-- For localization it is preferred, but not required, if 'LeBlanc' is replaced with a localized name or a familiar word that has upper case letters in the middle of the word.
This is because keywords can be in any language, and showing an example in the localized script helps convey this. --> This is because keywords can be in any language, and showing an example in the localized script helps convey this. -->
@@ -404,6 +410,9 @@ Second \"item\" text"</string>
<string name="revanced_hide_products_banner_title">إخفاء لافتة لعرض المنتجات</string> <string name="revanced_hide_products_banner_title">إخفاء لافتة لعرض المنتجات</string>
<string name="revanced_hide_products_banner_summary_on">تم إخفاء البانر</string> <string name="revanced_hide_products_banner_summary_on">تم إخفاء البانر</string>
<string name="revanced_hide_products_banner_summary_off">يتم عرض البانر</string> <string name="revanced_hide_products_banner_summary_off">يتم عرض البانر</string>
<string name="revanced_hide_end_screen_store_banner_title">إخفاء لافتة شاشة المتجر النهائية</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">تم إخفاء لافتة المتجر</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">يتم عرض لافتة المتجر</string>
<string name="revanced_hide_player_store_shelf_title">إخفاء رف مشغل التسوق</string> <string name="revanced_hide_player_store_shelf_title">إخفاء رف مشغل التسوق</string>
<string name="revanced_hide_player_store_shelf_summary_on">تم إخفاء رفوف التسوق</string> <string name="revanced_hide_player_store_shelf_summary_on">تم إخفاء رفوف التسوق</string>
<string name="revanced_hide_player_store_shelf_summary_off">يتم عرض رفوف التسوق</string> <string name="revanced_hide_player_store_shelf_summary_off">يتم عرض رفوف التسوق</string>
@@ -497,8 +506,9 @@ Second \"item\" text"</string>
<string name="revanced_swipe_overlay_timeout_summary">مقدار الوقت الذي تظهر فيه واجهة التمرير بعد التغيير بجزء الثانية</string> <string name="revanced_swipe_overlay_timeout_summary">مقدار الوقت الذي تظهر فيه واجهة التمرير بعد التغيير بجزء الثانية</string>
<string name="revanced_swipe_text_overlay_size_title">حجم نص واجهة التمرير</string> <string name="revanced_swipe_text_overlay_size_title">حجم نص واجهة التمرير</string>
<string name="revanced_swipe_text_overlay_size_summary">حجم النص على واجهة التمرير</string> <string name="revanced_swipe_text_overlay_size_summary">حجم النص على واجهة التمرير</string>
<string name="revanced_swipe_overlay_background_alpha_title">شفافية خلفية واجهة التمرير</string> <string name="revanced_swipe_overlay_background_opacity_title">تعتيم خلفية واجهة التمرير السريع</string>
<string name="revanced_swipe_overlay_background_alpha_summary">قيمة شفافية خلفية واجهة التمرير</string> <string name="revanced_swipe_overlay_background_opacity_summary">قيمة التعتيم بين 0-100</string>
<string name="revanced_swipe_overlay_background_opacity_invalid_toast">يجب أن يكون تعتيم التمرير السريع بين 0-100</string>
<string name="revanced_swipe_threshold_title">مقدار حد التمرير</string> <string name="revanced_swipe_threshold_title">مقدار حد التمرير</string>
<string name="revanced_swipe_threshold_summary">الحد الأدنى من التمرير قبل اكتشاف الإيماءة</string> <string name="revanced_swipe_threshold_summary">الحد الأدنى من التمرير قبل اكتشاف الإيماءة</string>
<string name="revanced_swipe_change_video_title">تمكين إيماءة التمرير لتغيير الفيديو</string> <string name="revanced_swipe_change_video_title">تمكين إيماءة التمرير لتغيير الفيديو</string>
@@ -743,7 +753,7 @@ Second \"item\" text"</string>
<string name="revanced_hide_shorts_stickers_title">إخفاء الملصقات</string> <string name="revanced_hide_shorts_stickers_title">إخفاء الملصقات</string>
<string name="revanced_hide_shorts_stickers_summary_on">تم إخفاء الملصقات</string> <string name="revanced_hide_shorts_stickers_summary_on">تم إخفاء الملصقات</string>
<string name="revanced_hide_shorts_stickers_summary_off">يتم عرض الملصقات</string> <string name="revanced_hide_shorts_stickers_summary_off">يتم عرض الملصقات</string>
<string name="revanced_hide_shorts_like_fountain_title">إخفاء فوران أعجبني</string> <string name="revanced_hide_shorts_like_fountain_title">إخفاء التأثير الفوّار لـزر أعجبني</string>
<string name="revanced_hide_shorts_like_fountain_summary_on">تم إخفاء التأثير الفوّار لـزر أعجبني</string> <string name="revanced_hide_shorts_like_fountain_summary_on">تم إخفاء التأثير الفوّار لـزر أعجبني</string>
<string name="revanced_hide_shorts_like_fountain_summary_off">يتم عرض التأثير الفوّار لـزر أعجبني</string> <string name="revanced_hide_shorts_like_fountain_summary_off">يتم عرض التأثير الفوّار لـزر أعجبني</string>
<string name="revanced_hide_shorts_like_button_title">إخفاء زر أعجبني</string> <string name="revanced_hide_shorts_like_button_title">إخفاء زر أعجبني</string>
@@ -825,6 +835,8 @@ Second \"item\" text"</string>
<string name="revanced_ryd_failure_generic">لم يعجبني غير متاح (%s)</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. --> <!-- 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">أعد تحميل الفيديو للتصويت بـ Return YouTube Dislike</string> <string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">أعد تحميل الفيديو للتصويت بـ Return YouTube Dislike</string>
<!-- Video likes have been set to hidden by the video uploader. -->
<string name="revanced_ryd_video_likes_hidden_by_video_owner">مخفي بواسطة المالك</string>
<string name="revanced_ryd_enable_summary_on">يتم عرض لم يعجبني</string> <string name="revanced_ryd_enable_summary_on">يتم عرض لم يعجبني</string>
<string name="revanced_ryd_enable_summary_off">لا يتم عرض لم يعجبني</string> <string name="revanced_ryd_enable_summary_off">لا يتم عرض لم يعجبني</string>
<string name="revanced_ryd_shorts_title">عرض لم يعجني في فيديوهات Shorts</string> <string name="revanced_ryd_shorts_title">عرض لم يعجني في فيديوهات Shorts</string>
@@ -840,6 +852,9 @@ Second \"item\" text"</string>
<string name="revanced_ryd_compact_layout_title">مقاس زر أعجبني</string> <string name="revanced_ryd_compact_layout_title">مقاس زر أعجبني</string>
<string name="revanced_ryd_compact_layout_summary_on">زر أعجبني مصمم لأدنى عرض</string> <string name="revanced_ryd_compact_layout_summary_on">زر أعجبني مصمم لأدنى عرض</string>
<string name="revanced_ryd_compact_layout_summary_off">زر أعجبني مصمم لأفضل مظهر</string> <string name="revanced_ryd_compact_layout_summary_off">زر أعجبني مصمم لأفضل مظهر</string>
<string name="revanced_ryd_estimated_like_title">إظهار الإعجابات المقدرة</string>
<string name="revanced_ryd_estimated_like_summary_on">يتم عرض الإعجابات المقدرة</string>
<string name="revanced_ryd_estimated_like_summary_off">الإعجابات المقدرة مخفية</string>
<string name="revanced_ryd_toast_on_connection_error_title">عرض ملاحظة إذا كان API غير متاح</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_on">يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike</string>
<string name="revanced_ryd_toast_on_connection_error_summary_off">لا يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike</string> <string name="revanced_ryd_toast_on_connection_error_summary_off">لا يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike</string>
@@ -890,6 +905,9 @@ Second \"item\" text"</string>
<string name="revanced_sb_enable_voting">عرض زر التصويت</string> <string name="revanced_sb_enable_voting">عرض زر التصويت</string>
<string name="revanced_sb_enable_voting_sum_on">يتم عرض زر التصويت على المقطع</string> <string name="revanced_sb_enable_voting_sum_on">يتم عرض زر التصويت على المقطع</string>
<string name="revanced_sb_enable_voting_sum_off">لا يتم عرض زر التصويت على المقطع</string> <string name="revanced_sb_enable_voting_sum_off">لا يتم عرض زر التصويت على المقطع</string>
<string name="revanced_sb_square_layout">استخدام تصميم مربع</string>
<string name="revanced_sb_square_layout_sum_on">الأزرار وعناصر التحكم مربعة</string>
<string name="revanced_sb_square_layout_sum_off">الأزرار وعناصر التحكم مستديرة</string>
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title' --> <!-- 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">استخدام زر التخطي المُصَغَّر</string>
<string name="revanced_sb_enable_compact_skip_button_sum_on">زر التخطي مصمم لأدنى عرض</string> <string name="revanced_sb_enable_compact_skip_button_sum_on">زر التخطي مصمم لأدنى عرض</string>
@@ -950,7 +968,7 @@ Second \"item\" text"</string>
<string name="revanced_sb_segments_sponsor">الراعي</string> <string name="revanced_sb_segments_sponsor">الراعي</string>
<string name="revanced_sb_segments_sponsor_sum">الترويج المدفوع الأجر، والإحالات المدفوعة الأجر والإعلانات المباشرة. ليس للترويج الذاتي أو لصراعات مجانية للقضايا/المبدعين/المواقع الإلكترونية/المنتجات التي يحبون الحصول عليها</string> <string name="revanced_sb_segments_sponsor_sum">الترويج المدفوع الأجر، والإحالات المدفوعة الأجر والإعلانات المباشرة. ليس للترويج الذاتي أو لصراعات مجانية للقضايا/المبدعين/المواقع الإلكترونية/المنتجات التي يحبون الحصول عليها</string>
<string name="revanced_sb_segments_selfpromo">ترويج شخصي/غير مدفوع الأجر</string> <string name="revanced_sb_segments_selfpromo">ترويج شخصي/غير مدفوع الأجر</string>
<string name="revanced_sb_segments_selfpromo_sum">شبيهة بـ \"الراعي\" باستثناء ما يتعلق بالإعلانات غير المدفوعة الأجر أو الذاتية. ويشمل ذلك أقسام عن السلع أو التبرعات أو المعلومات المتعلقة بمن تعاونوا مع ناشر المحتوى</string> <string name="revanced_sb_segments_selfpromo_sum">مشابهة لـ \"الراعي\" باستثناء ما يتعلق بالإعلانات غير المدفوعة الأجر أو الذاتية. ويشمل ذلك أقسام عن السلع أو التبرعات أو المعلومات المتعلقة بمن تعاونوا مع ناشر المحتوى</string>
<string name="revanced_sb_segments_interaction">تذكير بالتفاعل (اشتراك)</string> <string name="revanced_sb_segments_interaction">تذكير بالتفاعل (اشتراك)</string>
<string name="revanced_sb_segments_interaction_sum">تذكير قصير للإعجاب أو الاشتراك أو المتابعة في منتصف المحتوى. إذا كانت طويلة أو تتعلق بشيء محدد، فيجب أن تكون خاضعة للترويج الشخصي بدلاً من ذلك</string> <string name="revanced_sb_segments_interaction_sum">تذكير قصير للإعجاب أو الاشتراك أو المتابعة في منتصف المحتوى. إذا كانت طويلة أو تتعلق بشيء محدد، فيجب أن تكون خاضعة للترويج الشخصي بدلاً من ذلك</string>
<string name="revanced_sb_segments_highlight">الأبرز</string> <string name="revanced_sb_segments_highlight">الأبرز</string>
@@ -1106,7 +1124,7 @@ Second \"item\" text"</string>
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 --> 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> <string name="revanced_spoof_app_version_target_title">الهدف من تغيير إصدار التطبيق</string>
<string name="revanced_spoof_app_version_target_entry_1">19.35.36 - استعادة أيقونات مشغل Shorts القديمة</string> <string name="revanced_spoof_app_version_target_entry_1">19.35.36 - استعادة أيقونات مشغل Shorts القديمة</string>
<string name="revanced_spoof_app_version_target_entry_2">19.26.42 - استعادة أيقونات التنقل وشريط الأدوات القديمة</string> <string name="revanced_spoof_app_version_target_entry_2">19.26.42 - استعادة أيقونات التنقل القديمة</string>
<!-- 'RYD' is 'Return YouTube Dislike' --> <!-- 'RYD' is 'Return YouTube Dislike' -->
<string name="revanced_spoof_app_version_target_legacy_entry_1">18.33.40 - استعادة RYD على Shorts بوضع التخفي</string> <string name="revanced_spoof_app_version_target_legacy_entry_1">18.33.40 - استعادة RYD على Shorts بوضع التخفي</string>
<string name="revanced_spoof_app_version_target_legacy_entry_2">18.20.39 - استعادة قائمة سرعة الفيديو العريضة &amp; الجودة</string> <string name="revanced_spoof_app_version_target_legacy_entry_2">18.20.39 - استعادة قائمة سرعة الفيديو العريضة &amp; الجودة</string>
@@ -1116,8 +1134,11 @@ Second \"item\" text"</string>
<patch id="layout.startpage.changeStartPagePatch"> <patch id="layout.startpage.changeStartPagePatch">
<string name="revanced_change_start_page_title">تعيين صفحة البداية</string> <string name="revanced_change_start_page_title">تعيين صفحة البداية</string>
<string name="revanced_change_start_page_entry_default">الافتراضي</string> <string name="revanced_change_start_page_entry_default">الافتراضي</string>
<string name="revanced_change_start_page_entry_all_subscriptions">الاشتراكات كلها</string>
<string name="revanced_change_start_page_entry_browse">تصفح القنوات</string> <string name="revanced_change_start_page_entry_browse">تصفح القنوات</string>
<string name="revanced_change_start_page_entry_courses">الدورات / التعلم</string>
<string name="revanced_change_start_page_entry_explore">استكشف</string> <string name="revanced_change_start_page_entry_explore">استكشف</string>
<string name="revanced_change_start_page_entry_fashion">Fashion &amp; Beauty</string>
<string name="revanced_change_start_page_entry_gaming">ألعاب</string> <string name="revanced_change_start_page_entry_gaming">ألعاب</string>
<string name="revanced_change_start_page_entry_history">السّجل</string> <string name="revanced_change_start_page_entry_history">السّجل</string>
<string name="revanced_change_start_page_entry_library">المكتبة</string> <string name="revanced_change_start_page_entry_library">المكتبة</string>
@@ -1125,11 +1146,17 @@ Second \"item\" text"</string>
<string name="revanced_change_start_page_entry_live">مباشر</string> <string name="revanced_change_start_page_entry_live">مباشر</string>
<string name="revanced_change_start_page_entry_movies">أفلام</string> <string name="revanced_change_start_page_entry_movies">أفلام</string>
<string name="revanced_change_start_page_entry_music">الموسيقى</string> <string name="revanced_change_start_page_entry_music">الموسيقى</string>
<string name="revanced_change_start_page_entry_news">الأخبار</string>
<string name="revanced_change_start_page_entry_notifications">الإشعارات</string>
<string name="revanced_change_start_page_entry_playlists">قائمة التشغيل</string>
<string name="revanced_change_start_page_entry_search">البحث</string> <string name="revanced_change_start_page_entry_search">البحث</string>
<string name="revanced_change_start_page_entry_shopping">تسوق</string>
<string name="revanced_change_start_page_entry_sports">الرياضة</string> <string name="revanced_change_start_page_entry_sports">الرياضة</string>
<string name="revanced_change_start_page_entry_subscriptions">الاشتراكات</string> <string name="revanced_change_start_page_entry_subscriptions">الاشتراكات</string>
<string name="revanced_change_start_page_entry_trending">المحتوى الرائج</string> <string name="revanced_change_start_page_entry_trending">المحتوى الرائج</string>
<string name="revanced_change_start_page_entry_virtual_reality">الوقاع الاتراضي</string>
<string name="revanced_change_start_page_entry_watch_later">شاهد لاحقًا</string> <string name="revanced_change_start_page_entry_watch_later">شاهد لاحقًا</string>
<string name="revanced_change_start_page_entry_your_clips">كليباتك</string>
</patch> </patch>
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch"> <patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
<string name="revanced_disable_resuming_shorts_player_title">تعطيل استئناف مشغل Shorts</string> <string name="revanced_disable_resuming_shorts_player_title">تعطيل استئناف مشغل Shorts</string>
@@ -1210,8 +1237,10 @@ Second \"item\" text"</string>
<string name="revanced_seekbar_custom_color_title">تمكين لون شريط تقدم الفيديو المخصص</string> <string name="revanced_seekbar_custom_color_title">تمكين لون شريط تقدم الفيديو المخصص</string>
<string name="revanced_seekbar_custom_color_summary_on">يتم عرض لون شريط تقدم الفيديو المخصص</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_summary_off">يتم عرض لون شريط تقدم الفيديو الاصلي</string>
<string name="revanced_seekbar_custom_color_value_title">لون شريط تقدم الفيديو المخصص</string> <string name="revanced_seekbar_custom_color_primary_title">لون شريط تقدم الفيديو المخصص</string>
<string name="revanced_seekbar_custom_color_value_summary">لون شريط التقدم</string> <string name="revanced_seekbar_custom_color_primary_summary">لون شريط التقدم</string>
<string name="revanced_seekbar_custom_color_accent_title">لون مميز لشريط التقدم المخصص</string>
<string name="revanced_seekbar_custom_color_accent_summary">اللون المميز لشريط التقدم</string>
<string name="revanced_seekbar_custom_color_invalid">لون شريط التقدم غير صالح</string> <string name="revanced_seekbar_custom_color_invalid">لون شريط التقدم غير صالح</string>
</patch> </patch>
<patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch"> <patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch">
@@ -1341,6 +1370,8 @@ Second \"item\" text"</string>
<string name="revanced_custom_playback_speeds_invalid">يجب أن تكون سرعات التشغيل المخصصة أقل من %s</string> <string name="revanced_custom_playback_speeds_invalid">يجب أن تكون سرعات التشغيل المخصصة أقل من %s</string>
<string name="revanced_custom_playback_speeds_parse_exception">سرعة التشغيل المخصصة غير صالحة</string> <string name="revanced_custom_playback_speeds_parse_exception">سرعة التشغيل المخصصة غير صالحة</string>
<string name="revanced_custom_playback_speeds_auto">تلقائي</string> <string name="revanced_custom_playback_speeds_auto">تلقائي</string>
<string name="revanced_speed_tap_and_hold_title">سرعة النقر مع الاستمرار المخصصة</string>
<string name="revanced_speed_tap_and_hold_summary">سرعة التشغيل بين 0-8</string>
</patch> </patch>
<patch id="video.speed.remember.rememberPlaybackSpeedPatch"> <patch id="video.speed.remember.rememberPlaybackSpeedPatch">
<string name="revanced_remember_playback_speed_last_selected_title">تذكر التغيرات في سرعة التشغيل</string> <string name="revanced_remember_playback_speed_last_selected_title">تذكر التغيرات في سرعة التشغيل</string>
@@ -1349,6 +1380,11 @@ Second \"item\" text"</string>
<string name="revanced_playback_speed_default_title">سرعة التشغيل الافتراضية</string> <string name="revanced_playback_speed_default_title">سرعة التشغيل الافتراضية</string>
<string name="revanced_remember_playback_speed_toast">تغيير السرعة الافتراضية إلى: %s</string> <string name="revanced_remember_playback_speed_toast">تغيير السرعة الافتراضية إلى: %s</string>
</patch> </patch>
<patch id="video.hdr.disableHdrPatch">
<string name="revanced_disable_hdr_video_title">تعطيل فيديو HDR</string>
<string name="revanced_disable_hdr_video_summary_on">تم تعطيل فيديو HDR</string>
<string name="revanced_disable_hdr_video_summary_off">تم تمكين فيديو HDR</string>
</patch>
<patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch"> <patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch">
<string name="revanced_restore_old_video_quality_menu_title">استعادة قائمة جودة الفيديو القديمة</string> <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_on">يتم عرض قائمة جودة الفيديو القديمة</string>
@@ -1386,7 +1422,7 @@ AVC لديه حد أقصى للدقة 1080p، لا يتوفر ترميز الص
• مستوى الصوت الثابت غير متاح • مستوى الصوت الثابت غير متاح
• فرض الصوت الأصلي غير متوفر"</string> • فرض الصوت الأصلي غير متوفر"</string>
<string name="revanced_spoof_video_streams_about_no_av1">• لا يوجد ترميز الفيديو AV1</string> <string name="revanced_spoof_video_streams_about_no_av1">• لا يوجد ترميز الفيديو AV1</string>
<string name="revanced_spoof_video_streams_about_no_hdr">• لا يوجد فيديو HDR</string> <string name="revanced_spoof_video_streams_about_kids_videos">• الفيديوات العربية لا يمكن تشغيل أو في وضع التشغيل أو في حالة الخفية</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">عرض في إحصاءات تقنية</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_title">عرض في إحصاءات تقنية</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">يتم عرض نوع العميل في إحصاءات تقنية</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">يتم عرض نوع العميل في إحصاءات تقنية</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">تم إخفاء نوع العميل في إحصاءات تقنية</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">تم إخفاء نوع العميل في إحصاءات تقنية</string>

View File

@@ -145,6 +145,7 @@ Second \"item\" text"</string>
<patch id="layout.returnyoutubedislike.returnYouTubeDislikePatch"> <patch id="layout.returnyoutubedislike.returnYouTubeDislikePatch">
<!-- 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. --> <!-- 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. -->
<!-- Toast shown if the user enables RYD while a video is opened, and then tries to vote for the video. --> <!-- Toast shown if the user enables RYD while a video is opened, and then tries to vote for the video. -->
<!-- Video likes have been set to hidden by the video uploader. -->
<!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' --> <!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' -->
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. --> <!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
</patch> </patch>
@@ -217,6 +218,8 @@ Second \"item\" text"</string>
</patch> </patch>
<patch id="video.speed.remember.rememberPlaybackSpeedPatch"> <patch id="video.speed.remember.rememberPlaybackSpeedPatch">
</patch> </patch>
<patch id="video.hdr.disableHdrPatch">
</patch>
<patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch"> <patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch">
</patch> </patch>
<patch id="interaction.seekbar.enableSlideToSeekPatch"> <patch id="interaction.seekbar.enableSlideToSeekPatch">

View File

@@ -33,6 +33,7 @@ Second \"item\" text"</string>
<string name="revanced_check_environment_not_near_patch_time_invalid">APK qurulma vaxtı pozulub</string> <string name="revanced_check_environment_not_near_patch_time_invalid">APK qurulma vaxtı pozulub</string>
</patch> </patch>
<patch id="misc.settings.settingsResourcePatch"> <patch id="misc.settings.settingsResourcePatch">
<string name="revanced_settings_submenu_title">Tənzimləmələr</string>
<string name="revanced_settings_confirm_user_dialog_title">Davam etmək istəyirsiniz?</string> <string name="revanced_settings_confirm_user_dialog_title">Davam etmək istəyirsiniz?</string>
<string name="revanced_settings_reset">Sıfırla</string> <string name="revanced_settings_reset">Sıfırla</string>
<string name="revanced_settings_restart_title">Yenilə və yenidən başlat</string> <string name="revanced_settings_restart_title">Yenilə və yenidən başlat</string>
@@ -132,12 +133,15 @@ Davam et düyməsinə toxun və optimallaşdırma dəyişikliklərin qəbul et."
<string name="revanced_settings_screen_01_ads_title">Reklamlar</string> <string name="revanced_settings_screen_01_ads_title">Reklamlar</string>
<string name="revanced_settings_screen_02_alt_thumbnails_title">Seçmə miniatürlər</string> <string name="revanced_settings_screen_02_alt_thumbnails_title">Seçmə miniatürlər</string>
<string name="revanced_settings_screen_03_feed_title">Axın</string> <string name="revanced_settings_screen_03_feed_title">Axın</string>
<string name="revanced_settings_screen_04_player_title">Oynadıcı</string> <string name="revanced_settings_screen_04_general_title">Ümumi</string>
<string name="revanced_settings_screen_05_general_title">Ümumi tərtibat</string> <string name="revanced_settings_screen_05_player_title">Oynadıcı</string>
<string name="revanced_settings_screen_07_seekbar_title">Axtarış çubuğu</string> <string name="revanced_settings_screen_07_seekbar_title">İrəliləyiş cizgisi</string>
<string name="revanced_settings_screen_08_swipe_controls_title">Sürüşdürmə nəzarətçiləri</string> <string name="revanced_settings_screen_08_swipe_controls_title">Sürüşdürmə nəzarətçiləri</string>
<string name="revanced_settings_screen_11_misc_title">Müxtəlif</string> <string name="revanced_settings_screen_11_misc_title">Çoxvariantlı</string>
<string name="revanced_settings_screen_12_video_title">Video</string> <string name="revanced_settings_screen_12_video_title">Video</string>
<string name="revanced_restore_old_settings_menus_title">Köhnə tənzimləmələr bölmələrin bərpa et</string>
<string name="revanced_restore_old_settings_menus_summary_on">Köhnə tənzimləmələr bölmələri göstərilir</string>
<string name="revanced_restore_old_settings_menus_summary_off">Köhnə tənzimləmələr bölmələri göstərilmir</string>
</patch> </patch>
<patch id="misc.backgroundplayback.backgroundPlaybackPatch"> <patch id="misc.backgroundplayback.backgroundPlaybackPatch">
<string name="revanced_shorts_disable_background_playback_title">Shorts arxa plan oynatmasın qapat</string> <string name="revanced_shorts_disable_background_playback_title">Shorts arxa plan oynatmasın qapat</string>
@@ -164,9 +168,9 @@ Davam et düyməsinə toxun və optimallaşdırma dəyişikliklərin qəbul et."
Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string> Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
</patch> </patch>
<patch id="layout.hide.general.hideLayoutComponentsPatch"> <patch id="layout.hide.general.hideLayoutComponentsPatch">
<string name="revanced_disable_like_subscribe_glow_title">Bəyən/abunə ol düymə parıltısın söndür</string> <string name="revanced_disable_like_subscribe_glow_title">Bəyən və Abunə ol düyməsi parıltısın söndür</string>
<string name="revanced_disable_like_subscribe_glow_summary_on">\"Bəyən və abunə ol\" düyməsin klikləyəndə parıldamayacaq</string> <string name="revanced_disable_like_subscribe_glow_summary_on">Bəyən və Abunə ol düyməsinə toxunanda parlamayacaq</string>
<string name="revanced_disable_like_subscribe_glow_summary_off">\"Bəyən və abunə ol\" düyməsinə klikləyəndə parlayacaq</string> <string name="revanced_disable_like_subscribe_glow_summary_off">Bəyən və Abunə ol düyməsinə toxunanda parlayacaq</string>
<string name="revanced_hide_album_cards_title">Albom kartlarını gizlət</string> <string name="revanced_hide_album_cards_title">Albom kartlarını gizlət</string>
<string name="revanced_hide_album_cards_summary_on">Albom kartları gizlidir</string> <string name="revanced_hide_album_cards_summary_on">Albom kartları gizlidir</string>
<string name="revanced_hide_album_cards_summary_off">Albom kartları göstərilir</string> <string name="revanced_hide_album_cards_summary_off">Albom kartları göstərilir</string>
@@ -219,9 +223,9 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
<string name="revanced_hide_chips_shelf_title">Çip bölməsin gizlət</string> <string name="revanced_hide_chips_shelf_title">Çip bölməsin gizlət</string>
<string name="revanced_hide_chips_shelf_summary_on">Çip bölməsi gizlidir</string> <string name="revanced_hide_chips_shelf_summary_on">Çip bölməsi gizlidir</string>
<string name="revanced_hide_chips_shelf_summary_off">Çip bölməsi göstərilir</string> <string name="revanced_hide_chips_shelf_summary_off">Çip bölməsi göstərilir</string>
<string name="revanced_hide_expandable_chip_title">Videoların altında genişlənən çipi gizlət</string> <string name="revanced_hide_expandable_chip_title">Videoların aşağısında açılan kartı gizlət</string>
<string name="revanced_hide_expandable_chip_summary_on">Genişlənən çiplər gizlidir</string> <string name="revanced_hide_expandable_chip_summary_on">ılan kartlar gizlidir</string>
<string name="revanced_hide_expandable_chip_summary_off">Genişlənən çiplər göstərilir</string> <string name="revanced_hide_expandable_chip_summary_off">ılan kartlar görünür</string>
<string name="revanced_hide_community_posts_title">İcma elanların gizlət</string> <string name="revanced_hide_community_posts_title">İcma elanların gizlət</string>
<string name="revanced_hide_community_posts_summary_on">İcma elanları gizlədilib</string> <string name="revanced_hide_community_posts_summary_on">İcma elanları gizlədilib</string>
<string name="revanced_hide_community_posts_summary_off">İcma elanları göstərilir</string> <string name="revanced_hide_community_posts_summary_off">İcma elanları göstərilir</string>
@@ -282,6 +286,9 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
<string name="revanced_hide_chapters_section_title">Bölümlər bölməsini gizlət</string> <string name="revanced_hide_chapters_section_title">Bölümlər bölməsini gizlət</string>
<string name="revanced_hide_chapters_section_summary_on">Bölümlər bölməsi gizlidir</string> <string name="revanced_hide_chapters_section_summary_on">Bölümlər bölməsi gizlidir</string>
<string name="revanced_hide_chapters_section_summary_off">Bölümlər bölməsi göstərilir</string> <string name="revanced_hide_chapters_section_summary_off">Bölümlər bölməsi göstərilir</string>
<string name="revanced_hide_how_this_was_made_section_title">\"Bu məzmun necə hazırlanıb\" bölməsini gizlət</string>
<string name="revanced_hide_how_this_was_made_section_summary_on">\"Bu məzmun necə hazırlanıb\" bölməsi gizlidir</string>
<string name="revanced_hide_how_this_was_made_section_summary_off">\"Bu məzmun necə hazırlanıb\" bölməsi görünür</string>
<string name="revanced_hide_podcast_section_title">\'Podkastı kəşf et\' bölməsini gizlət</string> <string name="revanced_hide_podcast_section_title">\'Podkastı kəşf et\' bölməsini gizlət</string>
<string name="revanced_hide_podcast_section_summary_on">\"Podkastı kəşf et\" bölməsi gizlədilir</string> <string name="revanced_hide_podcast_section_summary_on">\"Podkastı kəşf et\" bölməsi gizlədilir</string>
<string name="revanced_hide_podcast_section_summary_off">\"Podkastı kəşf et\" bölməsi göstərilir</string> <string name="revanced_hide_podcast_section_summary_off">\"Podkastı kəşf et\" bölməsi göstərilir</string>
@@ -324,7 +331,7 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
<string name="revanced_hide_comments_preview_comment_title">Önbaxış şərhin gizlət</string> <string name="revanced_hide_comments_preview_comment_title">Önbaxış şərhin gizlət</string>
<string name="revanced_hide_comments_preview_comment_summary_on">Önbaxış şərhi gizlədilib</string> <string name="revanced_hide_comments_preview_comment_summary_on">Önbaxış şərhi gizlədilib</string>
<string name="revanced_hide_comments_preview_comment_summary_off">Önbaxış şərhi göstərilir</string> <string name="revanced_hide_comments_preview_comment_summary_off">Önbaxış şərhi göstərilir</string>
<string name="revanced_hide_comments_thanks_button_title">Təşəkkürlər düyməsini gizlət</string> <string name="revanced_hide_comments_thanks_button_title">Təşəkkür Düyməsini Gizlət</string>
<string name="revanced_hide_comments_thanks_button_summary_on">Təşəkkür düyməsi gizlidir</string> <string name="revanced_hide_comments_thanks_button_summary_on">Təşəkkür düyməsi gizlidir</string>
<string name="revanced_hide_comments_thanks_button_summary_off">Təşəkkür düyməsi göstərilir</string> <string name="revanced_hide_comments_thanks_button_summary_off">Təşəkkür düyməsi göstərilir</string>
<string name="revanced_hide_comments_timestamp_and_emoji_buttons_title">Vaxt möhürü və emoji düymələrin gizlə</string> <string name="revanced_hide_comments_timestamp_and_emoji_buttons_title">Vaxt möhürü və emoji düymələrin gizlə</string>
@@ -351,12 +358,12 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
<string name="revanced_hide_keyword_content_home_title">Ev videolarını açar sözlərə görə gizlət</string> <string name="revanced_hide_keyword_content_home_title">Ev videolarını açar sözlərə görə gizlət</string>
<string name="revanced_hide_keyword_content_home_summary_on">Ev bölməsindəki videolar açar sözlərlə filtrlənir</string> <string name="revanced_hide_keyword_content_home_summary_on">Ev bölməsindəki videolar açar sözlərlə filtrlənir</string>
<string name="revanced_hide_keyword_content_home_summary_off">Ev bölməsindəki videolar açar sözlərlə filtrlənmir</string> <string name="revanced_hide_keyword_content_home_summary_off">Ev bölməsindəki videolar açar sözlərlə filtrlənmir</string>
<string name="revanced_hide_keyword_content_subscriptions_title">Abunəlik videolarını açar sözlərlə gizlət</string>
<string name="revanced_hide_keyword_content_subscriptions_summary_on">Abunəliklər bölməsindəki videolar açar sözlərlə filtrlənir</string>
<string name="revanced_hide_keyword_content_subscriptions_summary_off">Abunəliklər bölməsindəki videolar açar sözlərlə filtrlənmir</string>
<string name="revanced_hide_keyword_content_search_title">Axtarış nəticələrini açar sözlərlə gizlət</string> <string name="revanced_hide_keyword_content_search_title">Axtarış nəticələrini açar sözlərlə gizlət</string>
<string name="revanced_hide_keyword_content_search_summary_on">Axtarış nəticələri açar sözlərə görə çeşidlənir</string> <string name="revanced_hide_keyword_content_search_summary_on">Axtarış nəticələri açar sözlərə görə çeşidlənir</string>
<string name="revanced_hide_keyword_content_search_summary_off">Axtarış nəticələri açar sözlərə görə çeşidlənmir</string> <string name="revanced_hide_keyword_content_search_summary_off">Axtarış nəticələri açar sözlərə görə çeşidlənmir</string>
<string name="revanced_hide_keyword_content_subscriptions_title">Abunəlik videolarını açar sözlərlə gizlət</string>
<string name="revanced_hide_keyword_content_subscriptions_summary_on">Abunəliklər bölməsindəki videolar açar sözlərlə filtrlənir</string>
<string name="revanced_hide_keyword_content_subscriptions_summary_off">Abunəliklər bölməsindəki videolar açar sözlərlə filtrlənmir</string>
<string name="revanced_hide_keyword_content_phrases_title">Gizlədiləcək açar sözlər</string> <string name="revanced_hide_keyword_content_phrases_title">Gizlədiləcək açar sözlər</string>
<!-- For localization it is preferred, but not required, if 'LeBlanc' is replaced with a localized name or a familiar word that has upper case letters in the middle of the word. <!-- For localization it is preferred, but not required, if 'LeBlanc' is replaced with a localized name or a familiar word that has upper case letters in the middle of the word.
This is because keywords can be in any language, and showing an example in the localized script helps convey this. --> This is because keywords can be in any language, and showing an example in the localized script helps convey this. -->
@@ -403,6 +410,9 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur"</string>
<string name="revanced_hide_products_banner_title">Məhsullara baxma etiketin gizlət</string> <string name="revanced_hide_products_banner_title">Məhsullara baxma etiketin gizlət</string>
<string name="revanced_hide_products_banner_summary_on">Etiket gizlədilib</string> <string name="revanced_hide_products_banner_summary_on">Etiket gizlədilib</string>
<string name="revanced_hide_products_banner_summary_off">Etiket göstərilir</string> <string name="revanced_hide_products_banner_summary_off">Etiket göstərilir</string>
<string name="revanced_hide_end_screen_store_banner_title">Son ekran mağaza etiketini gizlət</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">Mağaza etiketi gizlidir</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">Mağaza etiketi görünür</string>
<string name="revanced_hide_player_store_shelf_title">Oynadıcı alış-veriş bölməsin gizlət</string> <string name="revanced_hide_player_store_shelf_title">Oynadıcı alış-veriş bölməsin gizlət</string>
<string name="revanced_hide_player_store_shelf_summary_on">Alış-veriş rəfi gizlidir</string> <string name="revanced_hide_player_store_shelf_summary_on">Alış-veriş rəfi gizlidir</string>
<string name="revanced_hide_player_store_shelf_summary_off">Alış-veriş rəfi göstərilir</string> <string name="revanced_hide_player_store_shelf_summary_off">Alış-veriş rəfi göstərilir</string>
@@ -468,9 +478,9 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur"</string>
<string name="revanced_disable_precise_seeking_gesture_summary_off">Jest aktivləşdirilib</string> <string name="revanced_disable_precise_seeking_gesture_summary_off">Jest aktivləşdirilib</string>
</patch> </patch>
<patch id="interaction.seekbar.enableSeekbarTappingPatch"> <patch id="interaction.seekbar.enableSeekbarTappingPatch">
<string name="revanced_seekbar_tapping_title">Axtarış çubuğu toxunmasını aktivləşdir</string> <string name="revanced_seekbar_tapping_title">İrəliləmə cizgisi toxunmasını aktivləşdir</string>
<string name="revanced_seekbar_tapping_summary_on">Axtarış çubuğu toxunması aktivdir</string> <string name="revanced_seekbar_tapping_summary_on">İrəliləyiş cizgisi toxunması aktivdir</string>
<string name="revanced_seekbar_tapping_summary_off">Axtarış çubuğu toxunması qapalıdır</string> <string name="revanced_seekbar_tapping_summary_off">İrəliləyiş cizgisi toxunması qapalıdır</string>
</patch> </patch>
<patch id="interaction.swipecontrols.swipeControlsResourcePatch"> <patch id="interaction.swipecontrols.swipeControlsResourcePatch">
<string name="revanced_swipe_brightness_title">Parlaqlıq jestini aktivləşdir</string> <string name="revanced_swipe_brightness_title">Parlaqlıq jestini aktivləşdir</string>
@@ -482,9 +492,9 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur"</string>
<string name="revanced_swipe_press_to_engage_title">Basıb sürüşdürmə jestini aktivləşdir</string> <string name="revanced_swipe_press_to_engage_title">Basıb sürüşdürmə jestini aktivləşdir</string>
<string name="revanced_swipe_press_to_engage_summary_on">Sürüşdürmək üçün basma aktivdir</string> <string name="revanced_swipe_press_to_engage_summary_on">Sürüşdürmək üçün basma aktivdir</string>
<string name="revanced_swipe_press_to_engage_summary_off">Sürüşdürmək üçün basma qeyri-aktivdir</string> <string name="revanced_swipe_press_to_engage_summary_off">Sürüşdürmək üçün basma qeyri-aktivdir</string>
<string name="revanced_swipe_haptic_feedback_title">Toxunuşlu əks-əlaqəni aktivləşdir</string> <string name="revanced_swipe_haptic_feedback_title">Əks-əlaqə reaksiyasını aktivləşdir</string>
<string name="revanced_swipe_haptic_feedback_summary_on">Toxunuşlu əks-əlaqə aktivləşdirilib</string> <string name="revanced_swipe_haptic_feedback_summary_on">Əks-əlaqə reaksiyası aktivləşdirilib</string>
<string name="revanced_swipe_haptic_feedback_summary_off">Toxunuşlu əks-əlaqə qeyri-aktivdir</string> <string name="revanced_swipe_haptic_feedback_summary_off">Əks-əlaqə reaksiyası qeyri-aktivdir</string>
<string name="revanced_swipe_save_and_restore_brightness_title">Parlaqlığı saxla və bərpa et</string> <string name="revanced_swipe_save_and_restore_brightness_title">Parlaqlığı saxla və bərpa et</string>
<string name="revanced_swipe_save_and_restore_brightness_summary_on">Tam ekrana keçərkən və ya çıxarkən parlaqlığı saxla və bərpa et</string> <string name="revanced_swipe_save_and_restore_brightness_summary_on">Tam ekrana keçərkən və ya çıxarkən parlaqlığı saxla və bərpa et</string>
<string name="revanced_swipe_save_and_restore_brightness_summary_off">Tam ekrana keçərkən və ya çıxarkən parlaqlığı saxlama və bərpa etmə</string> <string name="revanced_swipe_save_and_restore_brightness_summary_off">Tam ekrana keçərkən və ya çıxarkən parlaqlığı saxlama və bərpa etmə</string>
@@ -496,8 +506,9 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur"</string>
<string name="revanced_swipe_overlay_timeout_summary">Örtüyün göründüyü millisaniyələrin sayı</string> <string name="revanced_swipe_overlay_timeout_summary">Örtüyün göründüyü millisaniyələrin sayı</string>
<string name="revanced_swipe_text_overlay_size_title">Örtük mətn ölçüsü dəyişdirmə</string> <string name="revanced_swipe_text_overlay_size_title">Örtük mətn ölçüsü dəyişdirmə</string>
<string name="revanced_swipe_text_overlay_size_summary">Sürüşdürmə örtüyü üçün mətn ölçüsü</string> <string name="revanced_swipe_text_overlay_size_summary">Sürüşdürmə örtüyü üçün mətn ölçüsü</string>
<string name="revanced_swipe_overlay_background_alpha_title">Sürüşdürmə arxa plan görünməsi</string> <string name="revanced_swipe_overlay_background_opacity_title">Sürüşdürmə cildi arxa plan qeyri-şəffaflığı</string>
<string name="revanced_swipe_overlay_background_alpha_summary">Sürüşdürmə örtüyü arxa fonunun görünməsi</string> <string name="revanced_swipe_overlay_background_opacity_summary">0-100 arası qeyri-şəffaflıq dəyəri</string>
<string name="revanced_swipe_overlay_background_opacity_invalid_toast">Sürüşmə qeyri-şəffaflığı 0-100 arası olmalıdır</string>
<string name="revanced_swipe_threshold_title">Sürüşdürmə böyüklük həddi</string> <string name="revanced_swipe_threshold_title">Sürüşdürmə böyüklük həddi</string>
<string name="revanced_swipe_threshold_summary">Sürüşdürmənin icra edilməsi üçün son dəyər</string> <string name="revanced_swipe_threshold_summary">Sürüşdürmənin icra edilməsi üçün son dəyər</string>
<string name="revanced_swipe_change_video_title">Videoları ötürmək üçün sürüşdürməni aktiv et</string> <string name="revanced_swipe_change_video_title">Videoları ötürmək üçün sürüşdürməni aktiv et</string>
@@ -611,8 +622,8 @@ Qeyd: Bunu aktivləşdirmə video reklamları da məcburi olaraq gizlədir"</str
<string name="revanced_hide_player_flyout_stable_volume_summary_on">Stabil səs menyusu gizlidir</string> <string name="revanced_hide_player_flyout_stable_volume_summary_on">Stabil səs menyusu gizlidir</string>
<!-- 'Help & feedback' should be translated using the same localized wording YouTube displays for the menu item. --> <!-- 'Help & feedback' should be translated using the same localized wording YouTube displays for the menu item. -->
<string name="revanced_hide_player_flyout_help_title">Kömək və əks əlaqəni gizlət</string> <string name="revanced_hide_player_flyout_help_title">Kömək və əks əlaqəni gizlət</string>
<string name="revanced_hide_player_flyout_help_summary_on">Kömək və əks əlaqə, gizlidir</string> <string name="revanced_hide_player_flyout_help_summary_on">Kömək və əks əlaqə menyusu gizlidir</string>
<string name="revanced_hide_player_flyout_help_summary_off">Kömək və əks əlaqə göstərilir</string> <string name="revanced_hide_player_flyout_help_summary_off">Kömək və əks əlaqə menyusu göstərilir</string>
<!-- 'Playback speed' should be translated using the same localized wording YouTube displays for the menu item. --> <!-- 'Playback speed' should be translated using the same localized wording YouTube displays for the menu item. -->
<string name="revanced_hide_player_flyout_speed_title">\"Oynatma sürəti\"ni gizlət</string> <string name="revanced_hide_player_flyout_speed_title">\"Oynatma sürəti\"ni gizlət</string>
<string name="revanced_hide_player_flyout_speed_summary_on">Oynatma sürəti menyusu gizlidir</string> <string name="revanced_hide_player_flyout_speed_summary_on">Oynatma sürəti menyusu gizlidir</string>
@@ -646,10 +657,10 @@ Qeyd: Bunu aktivləşdirmə video reklamları da məcburi olaraq gizlədir"</str
<string name="revanced_hide_cast_button_summary_on">Yayım düyməsi gizlidir</string> <string name="revanced_hide_cast_button_summary_on">Yayım düyməsi gizlidir</string>
<string name="revanced_hide_cast_button_summary_off">Yayım düyməsi göstərilir</string> <string name="revanced_hide_cast_button_summary_off">Yayım düyməsi göstərilir</string>
<!-- 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' --> <!-- 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">Titrlər düyməsini gizlət</string> <string name="revanced_hide_captions_button_title">Titrlər Düyməsin Gizlət</string>
<string name="revanced_hide_captions_button_summary_on">Titrlər düyməsi gizlidir</string> <string name="revanced_hide_captions_button_summary_on">Titrlər düyməsi gizlidir</string>
<string name="revanced_hide_captions_button_summary_off">Titrlər düyməsi göstərilir</string> <string name="revanced_hide_captions_button_summary_off">Titrlər düyməsi göstərilir</string>
<string name="revanced_hide_autoplay_button_title">Avto-oynatma düyməsini gizlət</string> <string name="revanced_hide_autoplay_button_title">Avtomatik oynatma düyməsini gizlət</string>
<string name="revanced_hide_autoplay_button_summary_on">Avtomatik oynatma düyməsi gizlidir</string> <string name="revanced_hide_autoplay_button_summary_on">Avtomatik oynatma düyməsi gizlidir</string>
<string name="revanced_hide_autoplay_button_summary_off">Avtomatik oynatma düyməsi göstərilir</string> <string name="revanced_hide_autoplay_button_summary_off">Avtomatik oynatma düyməsi göstərilir</string>
</patch> </patch>
@@ -659,7 +670,7 @@ Qeyd: Bunu aktivləşdirmə video reklamları da məcburi olaraq gizlədir"</str
<string name="revanced_hide_endscreen_cards_summary_off">Son ekran kartları göstərilir</string> <string name="revanced_hide_endscreen_cards_summary_off">Son ekran kartları göstərilir</string>
</patch> </patch>
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch"> <patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
<string name="revanced_disable_fullscreen_ambient_mode_title">Tam ekranda ambient rejimin qapat</string> <string name="revanced_disable_fullscreen_ambient_mode_title">Tam ekranda Ambient rejimini qapat</string>
<string name="revanced_disable_fullscreen_ambient_mode_summary_on">Ambient rejimi qeyri-aktiv edilib</string> <string name="revanced_disable_fullscreen_ambient_mode_summary_on">Ambient rejimi qeyri-aktiv edilib</string>
<string name="revanced_disable_fullscreen_ambient_mode_summary_off">Ambient rejimi aktivləşdirildi</string> <string name="revanced_disable_fullscreen_ambient_mode_summary_off">Ambient rejimi aktivləşdirildi</string>
</patch> </patch>
@@ -674,12 +685,12 @@ Qeyd: Bunu aktivləşdirmə video reklamları da məcburi olaraq gizlədir"</str
<string name="revanced_disable_rolling_number_animations_summary_off">Sürüşən say animasiyasııqdır</string> <string name="revanced_disable_rolling_number_animations_summary_off">Sürüşən say animasiyasııqdır</string>
</patch> </patch>
<patch id="layout.hide.seekbar.hideSeekbarPatch"> <patch id="layout.hide.seekbar.hideSeekbarPatch">
<string name="revanced_hide_seekbar_title">Video oynadıcıda axtarış çubuğun gizlə</string> <string name="revanced_hide_seekbar_title">Video oynadıcıda irəliləyiş cizgisin gizlə</string>
<string name="revanced_hide_seekbar_summary_on">Video oynadıcı axtarış çubuğu gizlidir</string> <string name="revanced_hide_seekbar_summary_on">Video oynadıcı irəliləyiş cizgisi gizlidir</string>
<string name="revanced_hide_seekbar_summary_off">Video oynadıcı axtarış çubuğu göstərilir</string> <string name="revanced_hide_seekbar_summary_off">Video oynadıcı irəliləyiş cizgisi göstərilir</string>
<string name="revanced_hide_seekbar_thumbnail_title">Video miniatürlərdə vaxt çubuğun gizlə</string> <string name="revanced_hide_seekbar_thumbnail_title">Video miniatürdə irəliləmə cizgisin gizlə</string>
<string name="revanced_hide_seekbar_thumbnail_summary_on">Miniatür axtarış çubuğu gizlədilib</string> <string name="revanced_hide_seekbar_thumbnail_summary_on">Miniatür irəliləmə cizgisi gizlədilib</string>
<string name="revanced_hide_seekbar_thumbnail_summary_off">Miniatür axtarış çubuğu göstərilir</string> <string name="revanced_hide_seekbar_thumbnail_summary_off">Miniatür irəliləmə cizgisi göstərilir</string>
</patch> </patch>
<patch id="layout.hide.shorts.hideShortsComponentsResourcePatch"> <patch id="layout.hide.shorts.hideShortsComponentsResourcePatch">
<string name="revanced_shorts_player_screen_title">Shorts oynadıcı</string> <string name="revanced_shorts_player_screen_title">Shorts oynadıcı</string>
@@ -699,7 +710,7 @@ Qeyd: Bunu aktivləşdirmə video reklamları da məcburi olaraq gizlədir"</str
<string name="revanced_hide_shorts_history_summary_on">Baxış tarixçəsində gizlidir</string> <string name="revanced_hide_shorts_history_summary_on">Baxış tarixçəsində gizlidir</string>
<string name="revanced_hide_shorts_history_summary_off">Baxış tarixçəsində göstərilib</string> <string name="revanced_hide_shorts_history_summary_off">Baxış tarixçəsində göstərilib</string>
<!-- 'join' should be translated using the same localized wording YouTube displays for the button. --> <!-- 'join' should be translated using the same localized wording YouTube displays for the button. -->
<string name="revanced_hide_shorts_join_button_title">Qoşul düyməsini gizlət</string> <string name="revanced_hide_shorts_join_button_title">Qoşul düyməsin gizlə</string>
<string name="revanced_hide_shorts_join_button_summary_on">Qoşulma düyməsi gizlidir</string> <string name="revanced_hide_shorts_join_button_summary_on">Qoşulma düyməsi gizlidir</string>
<string name="revanced_hide_shorts_join_button_summary_off">Qoşulma düyməsi göstərilir</string> <string name="revanced_hide_shorts_join_button_summary_off">Qoşulma düyməsi göstərilir</string>
<!-- 'subscribe' should be translated using the same localized wording YouTube displays for the button. --> <!-- 'subscribe' should be translated using the same localized wording YouTube displays for the button. -->
@@ -712,25 +723,25 @@ Qeyd: Bunu aktivləşdirmə video reklamları da məcburi olaraq gizlədir"</str
<string name="revanced_hide_shorts_shop_button_title">Mağaza düyməsini gizlət</string> <string name="revanced_hide_shorts_shop_button_title">Mağaza düyməsini gizlət</string>
<string name="revanced_hide_shorts_shop_button_summary_on">Mağaza düyməsi gizlidir</string> <string name="revanced_hide_shorts_shop_button_summary_on">Mağaza düyməsi gizlidir</string>
<string name="revanced_hide_shorts_shop_button_summary_off">Mağaza düyməsi göstərilir</string> <string name="revanced_hide_shorts_shop_button_summary_off">Mağaza düyməsi göstərilir</string>
<string name="revanced_hide_shorts_super_thanks_button_title">Super təşəkkürlər düyməsini gizlət</string> <string name="revanced_hide_shorts_super_thanks_button_title">Super Təşəkkür Al düyməsini gizlət</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Super təşəkkür düyməsi gizlidir</string> <string name="revanced_hide_shorts_super_thanks_button_summary_on">Super Təşəkkür düyməsi gizlidir</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Super təşəkkür düyməsi göstərilir</string> <string name="revanced_hide_shorts_super_thanks_button_summary_off">Super Təşəkkür düyməsi görünəndir</string>
<string name="revanced_hide_shorts_tagged_products_title">Etiketlənmiş məhsulları gizlət</string> <string name="revanced_hide_shorts_tagged_products_title">Etiketlənmiş məhsulları gizlət</string>
<string name="revanced_hide_shorts_tagged_products_summary_on">Etiketlənmiş məhsullar gizlədilir</string> <string name="revanced_hide_shorts_tagged_products_summary_on">Etiketlənmiş məhsullar gizlədilir</string>
<string name="revanced_hide_shorts_tagged_products_summary_off">Etiketlənmiş məhsullar göstərilir</string> <string name="revanced_hide_shorts_tagged_products_summary_off">Etiketlənmiş məhsullar göstərilir</string>
<string name="revanced_hide_shorts_location_label_title">Məkan etiketini gizlət</string> <string name="revanced_hide_shorts_location_label_title">Məkan etiketini gizlət</string>
<string name="revanced_hide_shorts_location_label_summary_on">Məkan etiketi gizlidir</string> <string name="revanced_hide_shorts_location_label_summary_on">Məkan etiketi gizlidir</string>
<string name="revanced_hide_shorts_location_label_summary_off">Məkan etiketi göstərilir</string> <string name="revanced_hide_shorts_location_label_summary_off">Məkan etiketi göstərilir</string>
<string name="revanced_hide_shorts_save_sound_button_title">\"Musiqini saxla\" düyməsini gizlət</string> <string name="revanced_hide_shorts_save_sound_button_title">Musiqini saxla düyməsini gizlət</string>
<string name="revanced_hide_shorts_save_sound_button_summary_on">\"Musiqini saxla\" düyməsi gizlidir</string> <string name="revanced_hide_shorts_save_sound_button_summary_on">\"Musiqini saxla\" düyməsi gizlidir</string>
<string name="revanced_hide_shorts_save_sound_button_summary_off">\"Musiqini saxla\" düyməsi göstərilir</string> <string name="revanced_hide_shorts_save_sound_button_summary_off">\"Musiqini saxla\" düyməsi göstərilir</string>
<string name="revanced_hide_shorts_use_template_button_title">\"Şablonu istifadə et\" düyməsini gizlət</string> <string name="revanced_hide_shorts_use_template_button_title">Şablonu işlət düyməsini gizlət</string>
<string name="revanced_hide_shorts_use_template_button_summary_on">\"Şablonu istifadə et\" düyməsi gizlidir</string> <string name="revanced_hide_shorts_use_template_button_summary_on">\"Şablonu istifadə et\" düyməsi gizlidir</string>
<string name="revanced_hide_shorts_use_template_button_summary_off">\"Şablonu istifadə et\" düyməsi göstərilir</string> <string name="revanced_hide_shorts_use_template_button_summary_off">\"Şablonu istifadə et\" düyməsi göstərilir</string>
<string name="revanced_hide_shorts_upcoming_button_title">\"Yaxınlaşan\" düyməsini gizlət</string> <string name="revanced_hide_shorts_upcoming_button_title">Yaxınlaşan düyməsini gizlət</string>
<string name="revanced_hide_shorts_upcoming_button_summary_on">\"Yaxınlaşan\" düyməsi gizlidir</string> <string name="revanced_hide_shorts_upcoming_button_summary_on">\"Yaxınlaşan\" düyməsi gizlidir</string>
<string name="revanced_hide_shorts_upcoming_button_summary_off">\"Yaxınlaşan\" düyməsi göstərilir</string> <string name="revanced_hide_shorts_upcoming_button_summary_off">\"Yaxınlaşan\" düyməsi göstərilir</string>
<string name="revanced_hide_shorts_green_screen_button_title">\"Yaşıl ekran\" düyməsini gizlət</string> <string name="revanced_hide_shorts_green_screen_button_title">Yaşıl ekran düyməsini gizlət</string>
<string name="revanced_hide_shorts_green_screen_button_summary_on">\"Yaşıl ekran\" düyməsi gizlidir</string> <string name="revanced_hide_shorts_green_screen_button_summary_on">\"Yaşıl ekran\" düyməsi gizlidir</string>
<string name="revanced_hide_shorts_green_screen_button_summary_off">\"Yaşıl ekran\" düyməsi göstərilir</string> <string name="revanced_hide_shorts_green_screen_button_summary_off">\"Yaşıl ekran\" düyməsi göstərilir</string>
<string name="revanced_hide_shorts_hashtag_button_title">Mövzu etiketi düyməsini gizlət</string> <string name="revanced_hide_shorts_hashtag_button_title">Mövzu etiketi düyməsini gizlət</string>
@@ -742,16 +753,16 @@ Qeyd: Bunu aktivləşdirmə video reklamları da məcburi olaraq gizlədir"</str
<string name="revanced_hide_shorts_stickers_title">Stikerləri gizlət</string> <string name="revanced_hide_shorts_stickers_title">Stikerləri gizlət</string>
<string name="revanced_hide_shorts_stickers_summary_on">Stikerlər gizlidir</string> <string name="revanced_hide_shorts_stickers_summary_on">Stikerlər gizlidir</string>
<string name="revanced_hide_shorts_stickers_summary_off">Stikerlər göstərilir</string> <string name="revanced_hide_shorts_stickers_summary_off">Stikerlər göstərilir</string>
<string name="revanced_hide_shorts_like_fountain_title">Bəyən fəvvarəsini gizlət</string> <string name="revanced_hide_shorts_like_fountain_title">Bəyənmə düyməsi fontan animasiyasın gizlət</string>
<string name="revanced_hide_shorts_like_fountain_summary_on">\"Bəyən\" fontan animasiyası gizlidir</string> <string name="revanced_hide_shorts_like_fountain_summary_on">\"Bəyən\" fontan animasiyası gizlidir</string>
<string name="revanced_hide_shorts_like_fountain_summary_off">\"Bəyən\" fontan animasiyası göstərilir</string> <string name="revanced_hide_shorts_like_fountain_summary_off">\"Bəyən\" fontan animasiyası göstərilir</string>
<string name="revanced_hide_shorts_like_button_title">\"Bəyən\" düyməsini gizlət</string> <string name="revanced_hide_shorts_like_button_title">Bəyən düyməsini gizlət</string>
<string name="revanced_hide_shorts_like_button_summary_on">Bəyənmə düyməsi gizlidir</string> <string name="revanced_hide_shorts_like_button_summary_on">Bəyənmə düyməsi gizlidir</string>
<string name="revanced_hide_shorts_like_button_summary_off">Bəyənmə düyməsi göstərilir</string> <string name="revanced_hide_shorts_like_button_summary_off">Bəyənmə düyməsi göstərilir</string>
<string name="revanced_hide_shorts_dislike_button_title">\"Bəyənməmə\" düyməsini gizlət</string> <string name="revanced_hide_shorts_dislike_button_title">Bəyənməmə düyməsini gizlət</string>
<string name="revanced_hide_shorts_dislike_button_summary_on">Bəyənməmə düyməsi gizlidir</string> <string name="revanced_hide_shorts_dislike_button_summary_on">Bəyənməmə düyməsi gizlidir</string>
<string name="revanced_hide_shorts_dislike_button_summary_off">Bəyənməmə düyməsi göstərilir</string> <string name="revanced_hide_shorts_dislike_button_summary_off">Bəyənməmə düyməsi göstərilir</string>
<string name="revanced_hide_shorts_comments_button_title">\"Şərhlər\" düyməsini gizlət</string> <string name="revanced_hide_shorts_comments_button_title">Şərhlər düyməsin gizlət</string>
<string name="revanced_hide_shorts_comments_button_summary_on">Şərhlər düyməsi gizlidir</string> <string name="revanced_hide_shorts_comments_button_summary_on">Şərhlər düyməsi gizlidir</string>
<string name="revanced_hide_shorts_comments_button_summary_off">Şərhlər düyməsi göstərilir</string> <string name="revanced_hide_shorts_comments_button_summary_off">Şərhlər düyməsi göstərilir</string>
<!-- 'remix' should be translated using the same localized wording YouTube displays for the button. --> <!-- 'remix' should be translated using the same localized wording YouTube displays for the button. -->
@@ -824,6 +835,7 @@ Qeyd: Bunu aktivləşdirmə video reklamları da məcburi olaraq gizlədir"</str
<string name="revanced_ryd_failure_generic">Bəyənməmə əlçatmazdır (%s)</string> <string name="revanced_ryd_failure_generic">Bəyənməmə əlçatmazdır (%s)</string>
<!-- Toast shown if the user enables RYD while a video is opened, and then tries to vote for the video. --> <!-- 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">Ryd ilə səsvermə üçün videonu yenidən yüklə</string> <string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Ryd ilə səsvermə üçün videonu yenidən yüklə</string>
<!-- Video likes have been set to hidden by the video uploader. -->
<string name="revanced_ryd_enable_summary_on">Bəyənməmələr göstərilir</string> <string name="revanced_ryd_enable_summary_on">Bəyənməmələr göstərilir</string>
<string name="revanced_ryd_enable_summary_off">Bəyənməmələr göstərilmir</string> <string name="revanced_ryd_enable_summary_off">Bəyənməmələr göstərilmir</string>
<string name="revanced_ryd_shorts_title">\"Shorts\"da bəyənməmə sayını göstər</string> <string name="revanced_ryd_shorts_title">\"Shorts\"da bəyənməmə sayını göstər</string>
@@ -836,7 +848,7 @@ Məhdudiyyət: Bəyənməmələr gizli rejimdə görünmür"</string>
<string name="revanced_ryd_dislike_percentage_summary_on">\"Bəyənməmə\"lər faiz olaraq göstərilir</string> <string name="revanced_ryd_dislike_percentage_summary_on">\"Bəyənməmə\"lər faiz olaraq göstərilir</string>
<string name="revanced_ryd_dislike_percentage_summary_off">\"Bəyənməmə\"lər nömrəylə göstərilir</string> <string name="revanced_ryd_dislike_percentage_summary_off">\"Bəyənməmə\"lər nömrəylə göstərilir</string>
<!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' --> <!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' -->
<string name="revanced_ryd_compact_layout_title">Yığcam bəyən düyməsi</string> <string name="revanced_ryd_compact_layout_title">Yığcam Bəyən Düyməsi</string>
<string name="revanced_ryd_compact_layout_summary_on">Daha kiçik en üçün hazırlanmış Bəyən düyməsi</string> <string name="revanced_ryd_compact_layout_summary_on">Daha kiçik en üçün hazırlanmış Bəyən düyməsi</string>
<string name="revanced_ryd_compact_layout_summary_off">Ən yaxşı görünüş üçün tərtib edilmiş Bəyən düyməsi</string> <string name="revanced_ryd_compact_layout_summary_off">Ən yaxşı görünüş üçün tərtib edilmiş Bəyən düyməsi</string>
<string name="revanced_ryd_toast_on_connection_error_title">API əlçatan deyilsə ani bildiriş göstər</string> <string name="revanced_ryd_toast_on_connection_error_title">API əlçatan deyilsə ani bildiriş göstər</string>
@@ -869,22 +881,22 @@ Məhdudiyyət: Bəyənməmələr gizli rejimdə görünmür"</string>
</patch> </patch>
<patch id="layout.seekbar.seekbarThumbnailsPatch"> <patch id="layout.seekbar.seekbarThumbnailsPatch">
<string name="revanced_seekbar_thumbnails_high_quality_title">Yüksək keyfiyyətli miniatürləri aktivləşdir</string> <string name="revanced_seekbar_thumbnails_high_quality_title">Yüksək keyfiyyətli miniatürləri aktivləşdir</string>
<string name="revanced_seekbar_thumbnails_high_quality_summary_on">Axtarış çubuğu miniatürləri yüksək keyfiyyətlidir</string> <string name="revanced_seekbar_thumbnails_high_quality_summary_on">İrəliləyiş cizgisi miniatürləri yüksək keyfiyyətlidir</string>
<string name="revanced_seekbar_thumbnails_high_quality_summary_off">Axtarış çubuğu miniatürləri orta keyfiyyətlidir</string> <string name="revanced_seekbar_thumbnails_high_quality_summary_off">İrəliləyiş cizgisi miniatürləri orta keyfiyyətlidir</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_on">Tam ekran axtarış çubuğu miniatürləri yüksək keyfiyyətlidir</string> <string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_on">Tam ekran irəliləyiş cizgisi miniatürü yüksək keyfiyyətlidir</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_off">Tam ekran axtarış çubuğu miniatürləri orta keyfiyyətlidir</string> <string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_off">Tam ekran irəliləyiş cizgisi miniatürləri orta keyfiyyətlidir</string>
<string name="revanced_seekbar_thumbnails_high_quality_dialog_message">"Bu, həmçinin axtarış çubuğu miniatürləri olmayan canlı yayımlarda miniatürləri bərpa edəcək. <string name="revanced_seekbar_thumbnails_high_quality_dialog_message">"Bu, həmçinin irəliləyiş cizgisi miniatürləri olmayan canlı yayımlarda miniatürləri bərpa edəcək.
Axtarış çubuğu miniatürləri cari video kimi eyni keyfiyyəti işlədəcək. İrəliləyiş cizgisi miniatürləri cari video kimi eyni keyfiyyəti işlədəcək.
Bu funksiya 720p və ya daha aşağı video keyfiyyəti ilə və çox sürətli internet bağlantısı işlədərkən yaxşı işləyir."</string> Bu funksiya 720p və ya daha aşağı video keyfiyyəti ilə və çox sürətli internet bağlantısı işlədərkən yaxşı işləyir."</string>
<string name="revanced_restore_old_seekbar_thumbnails_title">Köhnə axtarış çubuğu miniatürlərin al</string> <string name="revanced_restore_old_seekbar_thumbnails_title">Köhnə irəliləmə cizgi miniatürün al</string>
<string name="revanced_restore_old_seekbar_thumbnails_summary_on">Axtarış çubuğu miniatürləri axtarış çubuğu üstündə görünəcək</string> <string name="revanced_restore_old_seekbar_thumbnails_summary_on">Axtarış cizgisi miniatürləri axtarış çubuğu üstündə görünəcək</string>
<string name="revanced_restore_old_seekbar_thumbnails_summary_off">Axtarış çubuğu miniatürləri tam ekranda görünəcək</string> <string name="revanced_restore_old_seekbar_thumbnails_summary_off">Axtarış cizgisi miniatürləri tam ekranda görünəcək</string>
</patch> </patch>
<patch id="layout.sponsorblock.sponsorBlockResourcePatch"> <patch id="layout.sponsorblock.sponsorBlockResourcePatch">
<string name="revanced_sb_enable_sb">\"SponsorBlock\"u aktivləşdir</string> <string name="revanced_sb_enable_sb">\"SponsorBlock\"u aktivləşdir</string>
<string name="revanced_sb_enable_sb_sum">SponsorBlock, YouTube videolarının lazımsız hissələrini ötürmək üçün kütlə mənbəli sistemdir</string> <string name="revanced_sb_enable_sb_sum">SponsorBlock YouTube videolarının cansıxıcı hissələrini ötürmək üçün toplu sistemdir</string>
<string name="revanced_sb_appearance_category">Görünüş</string> <string name="revanced_sb_appearance_category">Görünüş</string>
<string name="revanced_sb_enable_voting">Səsvermə düyməsini göstər</string> <string name="revanced_sb_enable_voting">Səsvermə düyməsini göstər</string>
<string name="revanced_sb_enable_voting_sum_on">Bölümə səsvermə düyməsi göstərilir</string> <string name="revanced_sb_enable_voting_sum_on">Bölümə səsvermə düyməsi göstərilir</string>
@@ -949,7 +961,7 @@ Sizin istifadəçi Id-niz parol kimidir və heç vaxt paylaşmaq olmaz.
<string name="revanced_sb_segments_sponsor">Sponsor</string> <string name="revanced_sb_segments_sponsor">Sponsor</string>
<string name="revanced_sb_segments_sponsor_sum">Ödənişli tanıtım, ödənişli yönləndirmələr və birbaşa reklamlar. Öz reklamı və ya bəyəndikləri səbəblərə/yaradıcılara/veb saytlara/məhsullara ödənişsiz çağırışlar etmək üçün deyil</string> <string name="revanced_sb_segments_sponsor_sum">Ödənişli tanıtım, ödənişli yönləndirmələr və birbaşa reklamlar. Öz reklamı və ya bəyəndikləri səbəblərə/yaradıcılara/veb saytlara/məhsullara ödənişsiz çağırışlar etmək üçün deyil</string>
<string name="revanced_sb_segments_selfpromo">Ödənişsiz/Öz reklamı</string> <string name="revanced_sb_segments_selfpromo">Ödənişsiz/Öz reklamı</string>
<string name="revanced_sb_segments_selfpromo_sum">Ödənişsiz və ya öz reklamı istisna olmaqla, \"Sponsor\"a bənzəyir. Mallar, ianələr və ya onların kiminlə əməkdaşlıq etdiyi məzmunda məlumatlar haqqında bölmələr daxildir</string> <string name="revanced_sb_segments_selfpromo_sum">Ödənişsiz və ya öz reklamı istisna olmaqla, Sponsor-a bənzər. Mallar, ianələr və ya onların kiminlə əməkdaşlıq etdiyi məzmunda məlumatlar haqqında bölmələr daxildir</string>
<string name="revanced_sb_segments_interaction">Qarşılıqlı Əlaqə Xatırlatma (Abunə ol)</string> <string name="revanced_sb_segments_interaction">Qarşılıqlı Əlaqə Xatırlatma (Abunə ol)</string>
<string name="revanced_sb_segments_interaction_sum">Məzmun ortasında onları bəyənmək, izləmək və ya abunə olmaq üçün qısa xatırlatma. Əgər uzun və ya xüsusi bir şey haqqındadırsa, bu əvəzində öz reklamı olmalıdır</string> <string name="revanced_sb_segments_interaction_sum">Məzmun ortasında onları bəyənmək, izləmək və ya abunə olmaq üçün qısa xatırlatma. Əgər uzun və ya xüsusi bir şey haqqındadırsa, bu əvəzində öz reklamı olmalıdır</string>
<string name="revanced_sb_segments_highlight">Vurğulama</string> <string name="revanced_sb_segments_highlight">Vurğulama</string>
@@ -998,7 +1010,7 @@ Sizin istifadəçi Id-niz parol kimidir və heç vaxt paylaşmaq olmaz.
<string name="revanced_sb_skip_automatically">Birbaşa ötür</string> <string name="revanced_sb_skip_automatically">Birbaşa ötür</string>
<string name="revanced_sb_skip_automatically_once">Bir dəfə avtomatik ötür</string> <string name="revanced_sb_skip_automatically_once">Bir dəfə avtomatik ötür</string>
<string name="revanced_sb_skip_showbutton">Ötürmə düyməsini göstər</string> <string name="revanced_sb_skip_showbutton">Ötürmə düyməsini göstər</string>
<string name="revanced_sb_skip_seekbaronly">Axtarma çubuğunda göstər</string> <string name="revanced_sb_skip_seekbaronly">İrəliləmə cizgisində göstər</string>
<string name="revanced_sb_skip_ignore">Qapadın</string> <string name="revanced_sb_skip_ignore">Qapadın</string>
<string name="revanced_sb_submit_failed_invalid">Bölüm göndərilmir: %s</string> <string name="revanced_sb_submit_failed_invalid">Bölüm göndərilmir: %s</string>
<string name="revanced_sb_submit_failed_timeout">SponsorBlock müvəqqəti olaraq zəifləyir</string> <string name="revanced_sb_submit_failed_timeout">SponsorBlock müvəqqəti olaraq zəifləyir</string>
@@ -1040,7 +1052,7 @@ ilə
Təqdim etməyə hazırdır?"</string> Təqdim etməyə hazırdır?"</string>
<string name="revanced_sb_new_segment_start_is_before_end">Başlanğıc sondan əvvəl olmalıdır</string> <string name="revanced_sb_new_segment_start_is_before_end">Başlanğıc sondan əvvəl olmalıdır</string>
<string name="revanced_sb_new_segment_mark_locations_first">Əvvəlcə vaxt cizgisində iki yeri doldur</string> <string name="revanced_sb_new_segment_mark_locations_first">Əvvəlcə vaxt cizgisində iki yeri doldur</string>
<string name="revanced_sb_new_segment_preview_segment_first">Bölümü izləyin, rahatlıqla ötürdüyünə əmin olun</string> <string name="revanced_sb_new_segment_preview_segment_first">Bölümü izləyin, düzgün ötürüldüyünə əmin olun</string>
<string name="revanced_sb_new_segment_edit_by_hand_title">Bölüm vaxtına əl ilə düzəliş et</string> <string name="revanced_sb_new_segment_edit_by_hand_title">Bölüm vaxtına əl ilə düzəliş et</string>
<string name="revanced_sb_new_segment_edit_by_hand_content">Bölümün başlanğıc və ya bitiş vaxtlarına düzəliş etmək istəyirsiniz?</string> <string name="revanced_sb_new_segment_edit_by_hand_content">Bölümün başlanğıc və ya bitiş vaxtlarına düzəliş etmək istəyirsiniz?</string>
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Yanlış vaxt verilmişdir</string> <string name="revanced_sb_new_segment_edit_by_hand_parse_error">Yanlış vaxt verilmişdir</string>
@@ -1105,7 +1117,7 @@ Sonradan qapadılarsa, UI səhvlərin önləmək üçün tətbiq məlumatların
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 --> 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">Saxta tətbiq versiyası hədəfi</string> <string name="revanced_spoof_app_version_target_title">Saxta tətbiq versiyası hədəfi</string>
<string name="revanced_spoof_app_version_target_entry_1">19.35.36 - Köhnə Shorts oynadıcı işarələrin bərpa et</string> <string name="revanced_spoof_app_version_target_entry_1">19.35.36 - Köhnə Shorts oynadıcı işarələrin bərpa et</string>
<string name="revanced_spoof_app_version_target_entry_2">19.26.42 - Köhnə fəaliyyət və cihaz cizgisi işarələrin bərpa et</string> <string name="revanced_spoof_app_version_target_entry_2">19.26.42 - Köhnə fəaliyyət simvolların bərpa et</string>
<!-- 'RYD' is 'Return YouTube Dislike' --> <!-- 'RYD' is 'Return YouTube Dislike' -->
<string name="revanced_spoof_app_version_target_legacy_entry_1">18.33.40 - Shorts gizli rejimində RYD-ni bərpa et</string> <string name="revanced_spoof_app_version_target_legacy_entry_1">18.33.40 - Shorts gizli rejimində RYD-ni bərpa et</string>
<string name="revanced_spoof_app_version_target_legacy_entry_2">18.20.39 - Geniş video sürəti &amp; keyfiyyət menyusunu bərpa et</string> <string name="revanced_spoof_app_version_target_legacy_entry_2">18.20.39 - Geniş video sürəti &amp; keyfiyyət menyusunu bərpa et</string>
@@ -1115,8 +1127,11 @@ Sonradan qapadılarsa, UI səhvlərin önləmək üçün tətbiq məlumatların
<patch id="layout.startpage.changeStartPagePatch"> <patch id="layout.startpage.changeStartPagePatch">
<string name="revanced_change_start_page_title">Başlanğıc səhifəsini təyin et</string> <string name="revanced_change_start_page_title">Başlanğıc səhifəsini təyin et</string>
<string name="revanced_change_start_page_entry_default">İlkin</string> <string name="revanced_change_start_page_entry_default">İlkin</string>
<string name="revanced_change_start_page_entry_all_subscriptions">Bütün abunəliklər</string>
<string name="revanced_change_start_page_entry_browse">Kanallara nəzər yetir</string> <string name="revanced_change_start_page_entry_browse">Kanallara nəzər yetir</string>
<string name="revanced_change_start_page_entry_courses">Kurslar / Öyrənmə</string>
<string name="revanced_change_start_page_entry_explore">Kəşf et</string> <string name="revanced_change_start_page_entry_explore">Kəşf et</string>
<string name="revanced_change_start_page_entry_fashion">Dəb və Gözəllik</string>
<string name="revanced_change_start_page_entry_gaming">Oyun</string> <string name="revanced_change_start_page_entry_gaming">Oyun</string>
<string name="revanced_change_start_page_entry_history">Tarixçə</string> <string name="revanced_change_start_page_entry_history">Tarixçə</string>
<string name="revanced_change_start_page_entry_library">Kitabxana</string> <string name="revanced_change_start_page_entry_library">Kitabxana</string>
@@ -1124,11 +1139,17 @@ Sonradan qapadılarsa, UI səhvlərin önləmək üçün tətbiq məlumatların
<string name="revanced_change_start_page_entry_live">Canlı</string> <string name="revanced_change_start_page_entry_live">Canlı</string>
<string name="revanced_change_start_page_entry_movies">Filmlər</string> <string name="revanced_change_start_page_entry_movies">Filmlər</string>
<string name="revanced_change_start_page_entry_music">Musiqi</string> <string name="revanced_change_start_page_entry_music">Musiqi</string>
<string name="revanced_change_start_page_entry_news">Xəbərlər</string>
<string name="revanced_change_start_page_entry_notifications">Bildirişlər</string>
<string name="revanced_change_start_page_entry_playlists">Pleylistlər</string>
<string name="revanced_change_start_page_entry_search">Axtarış</string> <string name="revanced_change_start_page_entry_search">Axtarış</string>
<string name="revanced_change_start_page_entry_shopping">Alış-Veriş</string>
<string name="revanced_change_start_page_entry_sports">İdman</string> <string name="revanced_change_start_page_entry_sports">İdman</string>
<string name="revanced_change_start_page_entry_subscriptions">Abunəliklər</string> <string name="revanced_change_start_page_entry_subscriptions">Abunəliklər</string>
<string name="revanced_change_start_page_entry_trending">Trendlər</string> <string name="revanced_change_start_page_entry_trending">Trendlər</string>
<string name="revanced_change_start_page_entry_virtual_reality">Faktiki Həyat</string>
<string name="revanced_change_start_page_entry_watch_later">Sonra izlə</string> <string name="revanced_change_start_page_entry_watch_later">Sonra izlə</string>
<string name="revanced_change_start_page_entry_your_clips">Klipləriniz</string>
</patch> </patch>
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch"> <patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
<string name="revanced_disable_resuming_shorts_player_title">Shorts oynadıcı başladıcını qapat</string> <string name="revanced_disable_resuming_shorts_player_title">Shorts oynadıcı başladıcını qapat</string>
@@ -1206,12 +1227,14 @@ Genişləndirmək və ya bağlamaq üçün sürüşdür"</string>
<string name="revanced_gradient_loading_screen_summary_off">Yükləmə ekranı, vahid arxa plana malik olacaq</string> <string name="revanced_gradient_loading_screen_summary_off">Yükləmə ekranı, vahid arxa plana malik olacaq</string>
</patch> </patch>
<patch id="layout.theme.themeResourcePatch"> <patch id="layout.theme.themeResourcePatch">
<string name="revanced_seekbar_custom_color_title">Fərdi axtarma çubuğu rəngini aktivləşdir</string> <string name="revanced_seekbar_custom_color_title">Fərdi irəliləmə cizgisi rəngini aktivləşdir</string>
<string name="revanced_seekbar_custom_color_summary_on">Fərdi axtarma çubuğu rəngi göstərilir</string> <string name="revanced_seekbar_custom_color_summary_on">Fərdi irəliləmə cizgisi rəngi göstərilir</string>
<string name="revanced_seekbar_custom_color_summary_off">Orijinal axtarma çubuğu rəngi göstərilir</string> <string name="revanced_seekbar_custom_color_summary_off">Orijinal irəliləmə cizgisi rəngi göstərilir</string>
<string name="revanced_seekbar_custom_color_value_title">Fərdi axtarma çubuğu rəngi</string> <string name="revanced_seekbar_custom_color_primary_title">Fərdi irəliləmə cizgisi rəngi</string>
<string name="revanced_seekbar_custom_color_value_summary">Axtarma çubuğu rəngi</string> <string name="revanced_seekbar_custom_color_primary_summary">İrəliləmə cizgisi rəngi</string>
<string name="revanced_seekbar_custom_color_invalid">Etibarsız axtarış çubuğu rəng dəyəri</string> <string name="revanced_seekbar_custom_color_accent_title">Fərdi irəliləyiş cizgisi vurğu rəngi</string>
<string name="revanced_seekbar_custom_color_accent_summary">İrəliləyiş cizgisi vurğu rəngi</string>
<string name="revanced_seekbar_custom_color_invalid">Etibarsız irəliləmə cizgisi rəng dəyəri</string>
</patch> </patch>
<patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch"> <patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch">
<string name="revanced_bypass_image_region_restrictions_title">Təsvir bölgə məhdudiyyətlərini ötür</string> <string name="revanced_bypass_image_region_restrictions_title">Təsvir bölgə məhdudiyyətlərini ötür</string>
@@ -1233,7 +1256,6 @@ Bunu aktivləşdirmə, bəzi regionlarda əngəllənib silinən şəkilləri dü
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow &amp; Orijinal miniatürlər</string> <string name="revanced_alt_thumbnail_options_entry_2">DeArrow &amp; Orijinal miniatürlər</string>
<string name="revanced_alt_thumbnail_options_entry_3">DeArrow &amp; Kadr çəkilişlər</string> <string name="revanced_alt_thumbnail_options_entry_3">DeArrow &amp; Kadr çəkilişlər</string>
<string name="revanced_alt_thumbnail_options_entry_4">Kadr çəkilişləri</string> <string name="revanced_alt_thumbnail_options_entry_4">Kadr çəkilişləri</string>
<string name="revanced_alt_thumbnail_dearrow_about_title">DeArrow</string>
<string name="revanced_alt_thumbnail_dearrow_about_summary">"DeArrow YouTube videoları üçün izdiham mənbəli miniatürlər təqdim edir. Bu miniatürlər YouTube tərəfindən təqdim edilənlərdən dəfələrlə daha uyğundur. <string name="revanced_alt_thumbnail_dearrow_about_summary">"DeArrow YouTube videoları üçün izdiham mənbəli miniatürlər təqdim edir. Bu miniatürlər YouTube tərəfindən təqdim edilənlərdən dəfələrlə daha uyğundur.
Aktivləşdirilərsə, video URL-lər API alıcısına göndəriləcək və başqa məlumat göndərilməyəcək. Videonun DeArrow miniatürləri yoxdursa, orijinal və ya hələ də çəkilişlər göstərilir. Aktivləşdirilərsə, video URL-lər API alıcısına göndəriləcək və başqa məlumat göndərilməyəcək. Videonun DeArrow miniatürləri yoxdursa, orijinal və ya hələ də çəkilişlər göstərilir.
@@ -1305,9 +1327,9 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər
<string name="revanced_remove_tracking_query_parameter_summary_off">İzləmə sorğusu faktoru bağlantılardan silinmir</string> <string name="revanced_remove_tracking_query_parameter_summary_off">İzləmə sorğusu faktoru bağlantılardan silinmir</string>
</patch> </patch>
<patch id="misc.zoomhaptics.zoomHapticsPatch"> <patch id="misc.zoomhaptics.zoomHapticsPatch">
<string name="revanced_disable_zoom_haptics_title">Yaxınlaşdırma əks-əlaqəsini bağla</string> <string name="revanced_disable_zoom_haptics_title">Yaxınlaşdırma reaksiyasın qapat</string>
<string name="revanced_disable_zoom_haptics_summary_on">Əks-əlaqə bağlandı</string> <string name="revanced_disable_zoom_haptics_summary_on">Reaksiya qapalıdır</string>
<string name="revanced_disable_zoom_haptics_summary_off">Əks-əlaqə aktivdir</string> <string name="revanced_disable_zoom_haptics_summary_off">Reaksiya aktivdir</string>
</patch> </patch>
<patch id="video.audio.forceOriginalAudioPatch"> <patch id="video.audio.forceOriginalAudioPatch">
<string name="revanced_force_original_audio_title">Orijinal səsi tələb et</string> <string name="revanced_force_original_audio_title">Orijinal səsi tələb et</string>
@@ -1333,14 +1355,16 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər
<string name="revanced_playback_speed_dialog_button_summary_off">Düymə göstərilmir</string> <string name="revanced_playback_speed_dialog_button_summary_off">Düymə göstərilmir</string>
</patch> </patch>
<patch id="video.speed.custom.customPlaybackSpeedPatch"> <patch id="video.speed.custom.customPlaybackSpeedPatch">
<string name="revanced_custom_speed_menu_title">Fərdi oynatma sürəti menyusu</string> <string name="revanced_custom_speed_menu_title">Fərdi oynatma sürəti siyahısı</string>
<string name="revanced_custom_speed_menu_summary_on">Fərdi sürət menyusu göstərilir</string> <string name="revanced_custom_speed_menu_summary_on">Fərdi sürət siyahısı göstərilir</string>
<string name="revanced_custom_speed_menu_summary_off">Fərdi sürət menyusu göstərilmir</string> <string name="revanced_custom_speed_menu_summary_off">Fərdi sürət siyahısı göstərilmir</string>
<string name="revanced_custom_playback_speeds_title">Fərdi oynatma sürəti</string> <string name="revanced_custom_playback_speeds_title">Fərdi oynatma sürəti</string>
<string name="revanced_custom_playback_speeds_summary">Fərdi oynatma sürətlərini əlavə et və ya dəyiş</string> <string name="revanced_custom_playback_speeds_summary">Fərdi oynatma sürətlərini əlavə et və ya dəyiş</string>
<string name="revanced_custom_playback_speeds_invalid">Fərdi sürətlər %s dəyərindən az olmalıdır</string> <string name="revanced_custom_playback_speeds_invalid">Fərdi sürətlər %s dəyərindən az olmalıdır</string>
<string name="revanced_custom_playback_speeds_parse_exception">Fərdi oynatma sürətləri etibarsızdır</string> <string name="revanced_custom_playback_speeds_parse_exception">Fərdi oynatma sürətləri etibarsızdır</string>
<string name="revanced_custom_playback_speeds_auto">Avtomatik</string> <string name="revanced_custom_playback_speeds_auto">Avtomatik</string>
<string name="revanced_speed_tap_and_hold_title">Xüsusi toxunma və saxlanılma sürəti</string>
<string name="revanced_speed_tap_and_hold_summary">0-8 arası oynatma sürəti</string>
</patch> </patch>
<patch id="video.speed.remember.rememberPlaybackSpeedPatch"> <patch id="video.speed.remember.rememberPlaybackSpeedPatch">
<string name="revanced_remember_playback_speed_last_selected_title">Oynatma sürəti dəyişikliklərin xatırla</string> <string name="revanced_remember_playback_speed_last_selected_title">Oynatma sürəti dəyişikliklərin xatırla</string>
@@ -1349,10 +1373,15 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər
<string name="revanced_playback_speed_default_title">İlkin oynatma sürəti</string> <string name="revanced_playback_speed_default_title">İlkin oynatma sürəti</string>
<string name="revanced_remember_playback_speed_toast">İlkin sürət %s kimi dəyişdirildi</string> <string name="revanced_remember_playback_speed_toast">İlkin sürət %s kimi dəyişdirildi</string>
</patch> </patch>
<patch id="video.hdr.disableHdrPatch">
<string name="revanced_disable_hdr_video_title">HDR Videonu Qapat</string>
<string name="revanced_disable_hdr_video_summary_on">HDR video qapalıdır</string>
<string name="revanced_disable_hdr_video_summary_off">HDR video aktivdir</string>
</patch>
<patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch"> <patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch">
<string name="revanced_restore_old_video_quality_menu_title">Köhnə video keyfiyyət menusun qaytar</string> <string name="revanced_restore_old_video_quality_menu_title">Köhnə video keyfiyyət menusun qaytar</string>
<string name="revanced_restore_old_video_quality_menu_summary_on">Köhnə video keyfiyyət menyusu göstərilir</string> <string name="revanced_restore_old_video_quality_menu_summary_on">Köhnə video keyfiyyət siyahısı göstərilir</string>
<string name="revanced_restore_old_video_quality_menu_summary_off">Köhnə video keyfiyyət menyusu göstərmir</string> <string name="revanced_restore_old_video_quality_menu_summary_off">Köhnə video keyfiyyət siyahısı görünmür</string>
</patch> </patch>
<patch id="interaction.seekbar.enableSlideToSeekPatch"> <patch id="interaction.seekbar.enableSlideToSeekPatch">
<string name="revanced_slide_to_seek_title">Axtarmaq üçün sürüşdürməni aktiv et</string> <string name="revanced_slide_to_seek_title">Axtarmaq üçün sürüşdürməni aktiv et</string>
@@ -1386,18 +1415,18 @@ AVC maksimum 1080p görüntü imkanına malikdir, Opus audio kodlama olmur və v
• Sabit səs səviyyəsi yoxdur • Sabit səs səviyyəsi yoxdur
• İlkin səsi məcbur etmə mümkün deyil"</string> • İlkin səsi məcbur etmə mümkün deyil"</string>
<string name="revanced_spoof_video_streams_about_no_av1">• AV1 video kodlayıcı yoxdur</string> <string name="revanced_spoof_video_streams_about_no_av1">• AV1 video kodlayıcı yoxdur</string>
<string name="revanced_spoof_video_streams_about_no_hdr">• HDR video yoxdur</string> <string name="revanced_spoof_video_streams_about_kids_videos">• Giriş edilməyəndə və ya gizli rejimdə uşaq videoları oynadıla bilməz</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">İstək üçün Statistikada göstər</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_title">İstək üçün Statistikada göstər</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">Qəbuledici növü Nerdlər üçün statistikada göstərilir</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">Qəbuledici növü İstək üçün statistikada göstərilir</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">Qəbuledici nerd üçün Statistikada gizlidir</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">Qəbuledici nerd üçün Statistikada gizlidir</string>
<string name="revanced_spoof_video_streams_language_title">VR-da ilkin səs yayımı dili</string> <string name="revanced_spoof_video_streams_language_title">VR-da ilkin səs yayımı dili</string>
</patch> </patch>
</app> </app>
<app id="twitch"> <app id="twitch">
<patch id="ad.audio.audioAdsPatch"> <patch id="ad.audio.audioAdsPatch">
<string name="revanced_block_audio_ads_title">Səsli reklamları əngəllə</string> <string name="revanced_block_audio_ads_title">Səs reklamların əngəllə</string>
<string name="revanced_block_audio_ads_summary_on">Səsli reklamlar bloklanıb</string> <string name="revanced_block_audio_ads_summary_on">Səs reklamları bloklanıb</string>
<string name="revanced_block_audio_ads_summary_off">Səsli reklamlar bloklanmayıb</string> <string name="revanced_block_audio_ads_summary_off">Səs reklamları bloklanmayıb</string>
</patch> </patch>
<patch id="ad.embedded.embeddedAdsPatch"> <patch id="ad.embedded.embeddedAdsPatch">
<string name="revanced_embedded_ads_service_unavailable">%s əlçatmazdır, reklamlar göstərilə bilər. Tənzimləmədə reklam əngəlləmə xidmətin dəyişməyə çalışın.</string> <string name="revanced_embedded_ads_service_unavailable">%s əlçatmazdır, reklamlar göstərilə bilər. Tənzimləmədə reklam əngəlləmə xidmətin dəyişməyə çalışın.</string>

View File

@@ -22,8 +22,8 @@ Second \"item\" text"</string>
<resources> <resources>
<app id="shared"> <app id="shared">
<patch id="misc.checks.checkEnvironmentPatch"> <patch id="misc.checks.checkEnvironmentPatch">
<string name="revanced_check_environment_failed_title">\"Правядзенне праверкі асяроддзя не ўдалося\"</string> <string name="revanced_check_environment_failed_title">Праверкі не пройдзены</string>
<string name="revanced_check_environment_dialog_open_official_source_button">\"Адкрыць афіцыйны вэб-сайт\"</string> <string name="revanced_check_environment_dialog_open_official_source_button">Адкрыць афіцыйны вэб-сайт</string>
<string name="revanced_check_environment_dialog_ignore_button">Ігнараваць</string> <string name="revanced_check_environment_dialog_ignore_button">Ігнараваць</string>
<string name="revanced_check_environment_failed_message">&lt;h5&gt;Гэта дадатак відавочна не з\'яўляецца патчам.&lt;/h5&gt;&lt;br&gt;Гэта дадатак можа працаваць няправільна, а таксама можа быць &lt;b&gt;небяспечным або нават небяспечным у выкарыстанні&lt;/b&gt;.&lt;br&gt;&lt;br&gt;Гэтыя праверкі азначаюць, што гэта дадатак было загаддзя перароблена або атрымана ад кагосьці іншага:&lt;br&gt;&lt;br&gt;&lt;small&gt;%1$s&lt;/small&gt;&lt;br&gt;Настойліва рэкамендуецца &lt;b&gt;выдаліць гэты дадатак і перарабіць яго самастойна&lt;/b&gt;, каб пераканацца, што вы выкарыстоўваеце правераны і бяспечны дадатак.&lt;p&gt;&lt;br&gt;Калі ігнараваць, гэта папярэджанне будзе паказана толькі два разы.</string> <string name="revanced_check_environment_failed_message">&lt;h5&gt;Гэта дадатак відавочна не з\'яўляецца патчам.&lt;/h5&gt;&lt;br&gt;Гэта дадатак можа працаваць няправільна, а таксама можа быць &lt;b&gt;небяспечным або нават небяспечным у выкарыстанні&lt;/b&gt;.&lt;br&gt;&lt;br&gt;Гэтыя праверкі азначаюць, што гэта дадатак было загаддзя перароблена або атрымана ад кагосьці іншага:&lt;br&gt;&lt;br&gt;&lt;small&gt;%1$s&lt;/small&gt;&lt;br&gt;Настойліва рэкамендуецца &lt;b&gt;выдаліць гэты дадатак і перарабіць яго самастойна&lt;/b&gt;, каб пераканацца, што вы выкарыстоўваеце правераны і бяспечны дадатак.&lt;p&gt;&lt;br&gt;Калі ігнараваць, гэта папярэджанне будзе паказана толькі два разы.</string>
<string name="revanced_check_environment_not_same_patching_device">Адкарэктавана на іншай прыладзе</string> <string name="revanced_check_environment_not_same_patching_device">Адкарэктавана на іншай прыладзе</string>
@@ -33,7 +33,7 @@ Second \"item\" text"</string>
<string name="revanced_check_environment_not_near_patch_time_invalid">Дата стварэння APK пашкоджана</string> <string name="revanced_check_environment_not_near_patch_time_invalid">Дата стварэння APK пашкоджана</string>
</patch> </patch>
<patch id="misc.settings.settingsResourcePatch"> <patch id="misc.settings.settingsResourcePatch">
<string name="revanced_settings_title">ReVanced</string> <string name="revanced_settings_submenu_title">Налады</string>
<string name="revanced_settings_confirm_user_dialog_title">Вы хочаце працягнуць?</string> <string name="revanced_settings_confirm_user_dialog_title">Вы хочаце працягнуць?</string>
<string name="revanced_settings_reset">Скінуць</string> <string name="revanced_settings_reset">Скінуць</string>
<string name="revanced_settings_restart_title">Абнавіце і перазагрузіце</string> <string name="revanced_settings_restart_title">Абнавіце і перазагрузіце</string>
@@ -133,13 +133,15 @@ Second \"item\" text"</string>
<string name="revanced_settings_screen_01_ads_title">Аб\"явы</string> <string name="revanced_settings_screen_01_ads_title">Аб\"явы</string>
<string name="revanced_settings_screen_02_alt_thumbnails_title">Альтэрнатыўныя мініяцюры</string> <string name="revanced_settings_screen_02_alt_thumbnails_title">Альтэрнатыўныя мініяцюры</string>
<string name="revanced_settings_screen_03_feed_title">Карміць</string> <string name="revanced_settings_screen_03_feed_title">Карміць</string>
<string name="revanced_settings_screen_04_player_title">Гулец</string> <string name="revanced_settings_screen_04_general_title">Агульнае</string>
<string name="revanced_settings_screen_05_general_title">Генеральная планіроўка</string> <string name="revanced_settings_screen_05_player_title">Плэер</string>
<string name="revanced_settings_screen_06_shorts_title">Shorts</string>
<string name="revanced_settings_screen_07_seekbar_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_08_swipe_controls_title">Элементы кіравання пальцам</string>
<string name="revanced_settings_screen_11_misc_title">Рознае</string> <string name="revanced_settings_screen_11_misc_title">Рознае</string>
<string name="revanced_settings_screen_12_video_title">Відэа</string> <string name="revanced_settings_screen_12_video_title">Відэа</string>
<string name="revanced_restore_old_settings_menus_title">Аднавіць старое меню налад</string>
<string name="revanced_restore_old_settings_menus_summary_on">Старыя меню налад паказваюцца</string>
<string name="revanced_restore_old_settings_menus_summary_off">Старыя меню налад не паказваюцца</string>
</patch> </patch>
<patch id="misc.backgroundplayback.backgroundPlaybackPatch"> <patch id="misc.backgroundplayback.backgroundPlaybackPatch">
<string name="revanced_shorts_disable_background_playback_title">Адключыць прайграванне Shorts у фонавым</string> <string name="revanced_shorts_disable_background_playback_title">Адключыць прайграванне Shorts у фонавым</string>
@@ -166,9 +168,9 @@ Second \"item\" text"</string>
Вы не будзеце атрымліваць апавяшчэнні пра нечаканыя падзеі."</string> Вы не будзеце атрымліваць апавяшчэнні пра нечаканыя падзеі."</string>
</patch> </patch>
<patch id="layout.hide.general.hideLayoutComponentsPatch"> <patch id="layout.hide.general.hideLayoutComponentsPatch">
<string name="revanced_disable_like_subscribe_glow_title">Адключыць свячэнне кнопкі \"Падабаецца\" / \"Падпісацца\"</string> <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_on">Кнопкі «Падабаецца» і «Падпісацца» не будуць мігцець пры згадванні</string>
<string name="revanced_disable_like_subscribe_glow_summary_off">Кнопка \"Падабаецца\" і \"Падпісацца\" будуць свяціцца пры згадванні</string> <string name="revanced_disable_like_subscribe_glow_summary_off">Кнопкі «Падабаецца» і «Падпісацца» будуць мігцець пры згадванні</string>
<string name="revanced_hide_album_cards_title">Схаваць карты альбома</string> <string name="revanced_hide_album_cards_title">Схаваць карты альбома</string>
<string name="revanced_hide_album_cards_summary_on">Карткі альбомаў схаваныя</string> <string name="revanced_hide_album_cards_summary_on">Карткі альбомаў схаваныя</string>
<string name="revanced_hide_album_cards_summary_off">Паказваюцца альбомныя карткі</string> <string name="revanced_hide_album_cards_summary_off">Паказваюцца альбомныя карткі</string>
@@ -221,9 +223,9 @@ Second \"item\" text"</string>
<string name="revanced_hide_chips_shelf_title">Схавайце паліцу для чыпсаў</string> <string name="revanced_hide_chips_shelf_title">Схавайце паліцу для чыпсаў</string>
<string name="revanced_hide_chips_shelf_summary_on">Паліца для чыпсаў схаваная</string> <string name="revanced_hide_chips_shelf_summary_on">Паліца для чыпсаў схаваная</string>
<string name="revanced_hide_chips_shelf_summary_off">Паказана паліца для чыпсаў</string> <string name="revanced_hide_chips_shelf_summary_off">Паказана паліца для чыпсаў</string>
<string name="revanced_hide_expandable_chip_title">Схаваць пашыраемы чып пад відэа</string> <string name="revanced_hide_expandable_chip_title">Схаваць пашыраную картку пад відэа</string>
<string name="revanced_hide_expandable_chip_summary_on">Чыпы, якія пашыраюцца, схаваныя</string> <string name="revanced_hide_expandable_chip_summary_on">Пашыраныя карткі схаваныя</string>
<string name="revanced_hide_expandable_chip_summary_off">Паказаны чыпы, якія пашыраюцца</string> <string name="revanced_hide_expandable_chip_summary_off">Пашыраныя карткі паказаныя</string>
<string name="revanced_hide_community_posts_title">Схаваць паведамленні ў супольнасці</string> <string name="revanced_hide_community_posts_title">Схаваць паведамленні ў супольнасці</string>
<string name="revanced_hide_community_posts_summary_on">Паведамленні ў супольнасці схаваны</string> <string name="revanced_hide_community_posts_summary_on">Паведамленні ў супольнасці схаваны</string>
<string name="revanced_hide_community_posts_summary_off">Паказваюцца паведамленні ў супольнасці</string> <string name="revanced_hide_community_posts_summary_off">Паказваюцца паведамленні ў супольнасці</string>
@@ -284,6 +286,9 @@ Second \"item\" text"</string>
<string name="revanced_hide_chapters_section_title">Схаваць раздзел \"Раздзелы\"</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_on">Раздзел раздзелаў схаваны</string>
<string name="revanced_hide_chapters_section_summary_off">Паказваецца раздзел раздзелаў</string> <string name="revanced_hide_chapters_section_summary_off">Паказваецца раздзел раздзелаў</string>
<string name="revanced_hide_how_this_was_made_section_title">Схаваць раздзел «Як быў зроблены гэты кантэнт»</string>
<string name="revanced_hide_how_this_was_made_section_summary_on">Раздзел «Як быў зроблены гэты кантэнт» схаваны</string>
<string name="revanced_hide_how_this_was_made_section_summary_off">Раздзел «Як быў зроблены гэты кантэнт» паказаны</string>
<string name="revanced_hide_podcast_section_title">Схаваць раздзел \"Даследаваць падкаст\"</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_on">Раздзел \"Агляд падкаста\" схаваны</string>
<string name="revanced_hide_podcast_section_summary_off">Паказаны раздзел \"Агляд падкаста\"</string> <string name="revanced_hide_podcast_section_summary_off">Паказаны раздзел \"Агляд падкаста\"</string>
@@ -326,7 +331,7 @@ Second \"item\" text"</string>
<string name="revanced_hide_comments_preview_comment_title">Схаваць каментарый для папярэдняга прагляду</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_on">Каментарый перад праглядам схаваны</string>
<string name="revanced_hide_comments_preview_comment_summary_off">Паказваецца папярэдні прагляд каментарыя</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_title">Схаваць кнопку \"Дзякуй\"\"</string>
<string name="revanced_hide_comments_thanks_button_summary_on">Кнопка падзякі схавана</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_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_title">Схаваць метку часу і кнопкі эмодзі</string>
@@ -353,12 +358,12 @@ Second \"item\" text"</string>
<string name="revanced_hide_keyword_content_home_title">Схаваць хатняе відэа па ключавых словах</string> <string name="revanced_hide_keyword_content_home_title">Схаваць хатняе відэа па ключавых словах</string>
<string name="revanced_hide_keyword_content_home_summary_on">Відэа на ўкладцы \"Галоўная\" фільтруюцца па ключавых словах</string> <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_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_title">Схаваць вынікі пошуку па ключавых словах</string>
<string name="revanced_hide_keyword_content_search_summary_on">Вынікі пошуку фільтруюцца па ключавых словах</string> <string name="revanced_hide_keyword_content_search_summary_on">Вынікі пошуку фільтруюцца па ключавых словах</string>
<string name="revanced_hide_keyword_content_search_summary_off">Вынікі пошуку не фільтруюцца па ключавых словах</string> <string name="revanced_hide_keyword_content_search_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_phrases_title">Ключавыя словы, якія трэба схаваць</string> <string name="revanced_hide_keyword_content_phrases_title">Ключавыя словы, якія трэба схаваць</string>
<!-- For localization it is preferred, but not required, if 'LeBlanc' is replaced with a localized name or a familiar word that has upper case letters in the middle of the word. <!-- For localization it is preferred, but not required, if 'LeBlanc' is replaced with a localized name or a familiar word that has upper case letters in the middle of the word.
This is because keywords can be in any language, and showing an example in the localized script helps convey this. --> This is because keywords can be in any language, and showing an example in the localized script helps convey this. -->
@@ -405,6 +410,9 @@ Second \"item\" text"</string>
<string name="revanced_hide_products_banner_title">Схаваць банер для прагляду прадуктаў</string> <string name="revanced_hide_products_banner_title">Схаваць банер для прагляду прадуктаў</string>
<string name="revanced_hide_products_banner_summary_on">Банэр схаваны</string> <string name="revanced_hide_products_banner_summary_on">Банэр схаваны</string>
<string name="revanced_hide_products_banner_summary_off">Паказваецца банэр</string> <string name="revanced_hide_products_banner_summary_off">Паказваецца банэр</string>
<string name="revanced_hide_end_screen_store_banner_title">Схаваць банер крамы на канчатковым экране</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">Банэр крамы схаваны</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">Банэр крамы паказаны</string>
<string name="revanced_hide_player_store_shelf_title">Схаваць полку крамы прайгравальніка</string> <string name="revanced_hide_player_store_shelf_title">Схаваць полку крамы прайгравальніка</string>
<string name="revanced_hide_player_store_shelf_summary_on">Паліца крамы схавана</string> <string name="revanced_hide_player_store_shelf_summary_on">Паліца крамы схавана</string>
<string name="revanced_hide_player_store_shelf_summary_off">Паліца крамы паказана</string> <string name="revanced_hide_player_store_shelf_summary_off">Паліца крамы паказана</string>
@@ -457,7 +465,7 @@ Second \"item\" text"</string>
<string name="revanced_external_downloader_summary_on">Кнопка загрузкі паказваецца ў плэеры</string> <string name="revanced_external_downloader_summary_on">Кнопка загрузкі паказваецца ў плэеры</string>
<string name="revanced_external_downloader_summary_off">Кнопка загрузкі не адлюстроўваецца ў плэеры</string> <string name="revanced_external_downloader_summary_off">Кнопка загрузкі не адлюстроўваецца ў плэеры</string>
<!-- 'download action button' should be translated using the same wording as the translation of 'revanced_hide_download_button_title' --> <!-- 'download action button' should be translated using the same wording as the translation of 'revanced_hide_download_button_title' -->
<string name="revanced_external_downloader_action_button_title">Перавызначыць кнопку дзеяння спампоўкі</string> <string name="revanced_external_downloader_action_button_title">Перавызначыць кнопку дзеянні спампоўкі</string>
<string name="revanced_external_downloader_action_button_summary_on">Кнопка \"Спампаваць\" адкрывае ваш знешні загрузнік</string> <string name="revanced_external_downloader_action_button_summary_on">Кнопка \"Спампаваць\" адкрывае ваш знешні загрузнік</string>
<string name="revanced_external_downloader_action_button_summary_off">Кнопка \"Спампаваць\" адкрывае ўласную праграму загрузкі ў праграме</string> <string name="revanced_external_downloader_action_button_summary_off">Кнопка \"Спампаваць\" адкрывае ўласную праграму загрузкі ў праграме</string>
<string name="revanced_external_downloader_name_title">Назва пакета загрузніка</string> <string name="revanced_external_downloader_name_title">Назва пакета загрузніка</string>
@@ -498,8 +506,9 @@ Second \"item\" text"</string>
<string name="revanced_swipe_overlay_timeout_summary">Працягласць бачнага накладання ў мілісекундах</string> <string name="revanced_swipe_overlay_timeout_summary">Працягласць бачнага накладання ў мілісекундах</string>
<string name="revanced_swipe_text_overlay_size_title">Памер накладанага тэксту</string> <string name="revanced_swipe_text_overlay_size_title">Памер накладанага тэксту</string>
<string name="revanced_swipe_text_overlay_size_summary">Памер тэксту для накладання пальцам</string> <string name="revanced_swipe_text_overlay_size_summary">Памер тэксту для накладання пальцам</string>
<string name="revanced_swipe_overlay_background_alpha_title">Бачнасць фону пальцам</string> <string name="revanced_swipe_overlay_background_opacity_title">Непразрыстасць фону накладкі пракруткі</string>
<string name="revanced_swipe_overlay_background_alpha_summary">Бачнасць фону накладання пальцам</string> <string name="revanced_swipe_overlay_background_opacity_summary">Значэнне непразрыстасці паміж 0-100</string>
<string name="revanced_swipe_overlay_background_opacity_invalid_toast">Непразрыстасць пракруткі павінна быць паміж 0-100</string>
<string name="revanced_swipe_threshold_title">Парог велічыні пальцам</string> <string name="revanced_swipe_threshold_title">Парог велічыні пальцам</string>
<string name="revanced_swipe_threshold_summary">Велічыня парогавага значэння для правядзення пальцам</string> <string name="revanced_swipe_threshold_summary">Велічыня парогавага значэння для правядзення пальцам</string>
<string name="revanced_swipe_change_video_title">Уключыць зьмену відэа праз правядзенне пальцам</string> <string name="revanced_swipe_change_video_title">Уключыць зьмену відэа праз правядзенне пальцам</string>
@@ -644,14 +653,14 @@ Second \"item\" text"</string>
<string name="revanced_hide_player_previous_next_buttons_title">Схаваць папярэдні &amp; кнопкі наступнага відэа</string> <string name="revanced_hide_player_previous_next_buttons_title">Схаваць папярэдні &amp; кнопкі наступнага відэа</string>
<string name="revanced_hide_player_previous_next_buttons_summary_on">Кнопкі схаваныя</string> <string name="revanced_hide_player_previous_next_buttons_summary_on">Кнопкі схаваныя</string>
<string name="revanced_hide_player_previous_next_buttons_summary_off">Паказваюцца кнопкі</string> <string name="revanced_hide_player_previous_next_buttons_summary_off">Паказваюцца кнопкі</string>
<string name="revanced_hide_cast_button_title">Схаваць кнопку трансляцыі</string> <string name="revanced_hide_cast_button_title">Схаваць кнопку «Трансляцыя»</string>
<string name="revanced_hide_cast_button_summary_on">Кнопка Cast схавана</string> <string name="revanced_hide_cast_button_summary_on">Кнопка Cast схавана</string>
<string name="revanced_hide_cast_button_summary_off">Паказана кнопка Cast</string> <string name="revanced_hide_cast_button_summary_off">Паказана кнопка Cast</string>
<!-- 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' --> <!-- 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_title">Схаваць кнопку «Субцітры»</string>
<string name="revanced_hide_captions_button_summary_on">Кнопка субцітраў схавана</string> <string name="revanced_hide_captions_button_summary_on">Кнопка субцітраў схавана</string>
<string name="revanced_hide_captions_button_summary_off">Паказана кнопка субцітраў</string> <string name="revanced_hide_captions_button_summary_off">Паказана кнопка субцітраў</string>
<string name="revanced_hide_autoplay_button_title">Схаваць кнопку аўтазапуску</string> <string name="revanced_hide_autoplay_button_title">Схаваць кнопку «Аўтапрайграванне»</string>
<string name="revanced_hide_autoplay_button_summary_on">Кнопка аўтазапуску схавана</string> <string name="revanced_hide_autoplay_button_summary_on">Кнопка аўтазапуску схавана</string>
<string name="revanced_hide_autoplay_button_summary_off">Паказана кнопка аўтазапуску</string> <string name="revanced_hide_autoplay_button_summary_off">Паказана кнопка аўтазапуску</string>
</patch> </patch>
@@ -661,7 +670,7 @@ Second \"item\" text"</string>
<string name="revanced_hide_endscreen_cards_summary_off">Паказваюцца карткі канцавога экрана</string> <string name="revanced_hide_endscreen_cards_summary_off">Паказваюцца карткі канцавога экрана</string>
</patch> </patch>
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch"> <patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
<string name="revanced_disable_fullscreen_ambient_mode_title">Адключыць актыўны рэжым у поўнаэкранным рэжыме</string> <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_on">Навакольны рэжым адключаны</string>
<string name="revanced_disable_fullscreen_ambient_mode_summary_off">Неактыўны рэжым уключаны</string> <string name="revanced_disable_fullscreen_ambient_mode_summary_off">Неактыўны рэжым уключаны</string>
</patch> </patch>
@@ -701,38 +710,38 @@ Second \"item\" text"</string>
<string name="revanced_hide_shorts_history_summary_on">Схавана ў гісторыі праглядаў</string> <string name="revanced_hide_shorts_history_summary_on">Схавана ў гісторыі праглядаў</string>
<string name="revanced_hide_shorts_history_summary_off">Паказаны ў гісторыі праглядаў</string> <string name="revanced_hide_shorts_history_summary_off">Паказаны ў гісторыі праглядаў</string>
<!-- 'join' should be translated using the same localized wording YouTube displays for the button. --> <!-- '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_title">Схаваць кнопку «Далучыцца»</string>
<string name="revanced_hide_shorts_join_button_summary_on">Кнопка «Далучыцца» схавана</string> <string name="revanced_hide_shorts_join_button_summary_on">Кнопка «Далучыцца» схавана</string>
<string name="revanced_hide_shorts_join_button_summary_off">Паказана кнопка «Далучыцца»</string> <string name="revanced_hide_shorts_join_button_summary_off">Паказана кнопка «Далучыцца»</string>
<!-- 'subscribe' should be translated using the same localized wording YouTube displays for the button. --> <!-- '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_title">Схаваць кнопку «Падпісацца»</string>
<string name="revanced_hide_shorts_subscribe_button_summary_on">Кнопка \"Падпісацца\" схавана</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_subscribe_button_summary_off">Паказана кнопка «Падпісацца»</string>
<string name="revanced_hide_shorts_paused_overlay_buttons_title">Схаваць прыпыненыя кнопкі накладання</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_on">Прыпыненыя кнопкі накладання схаваны</string>
<string name="revanced_hide_shorts_paused_overlay_buttons_summary_off">Паказваюцца прыпыненыя кнопкі накладання</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_title">Схаваць кнопку «Крама»</string>
<string name="revanced_hide_shorts_shop_button_summary_on">Кнопка крамы схавана</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_shop_button_summary_off">Паказваецца кнопка крамы</string>
<string name="revanced_hide_shorts_super_thanks_button_title">Схаваць кнопку супердзякуй</string> <string name="revanced_hide_shorts_super_thanks_button_title">Схаваць кнопку «Купіць Super Thanks»</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Кнопка супердзякуй схавана</string> <string name="revanced_hide_shorts_super_thanks_button_summary_on">Кнопка Super Thanks схавана</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Паказана кнопка \"Супер дзякуй\"</string> <string name="revanced_hide_shorts_super_thanks_button_summary_off">Кнопка Super Thanks паказана</string>
<string name="revanced_hide_shorts_tagged_products_title">Схаваць пазначаныя прадукты</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_on">Пазначаныя прадукты схаваны</string>
<string name="revanced_hide_shorts_tagged_products_summary_off">Прадукты з тэгамі паказаны</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_title">Схаваць метку месцазнаходжання</string>
<string name="revanced_hide_shorts_location_label_summary_on">Метка месцазнаходжання схавана</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_location_label_summary_off">Паказана метка месцазнаходжання</string>
<string name="revanced_hide_shorts_save_sound_button_title">Схаваць кнопку захавання музыкі</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_on">Кнопка захавання музыкі схавана</string>
<string name="revanced_hide_shorts_save_sound_button_summary_off">Кнопка захавання музыкі паказана</string> <string name="revanced_hide_shorts_save_sound_button_summary_off">Кнопка захавання музыкі паказана</string>
<string name="revanced_hide_shorts_use_template_button_title">Схаваць кнопку выкарыстання шаблону</string> <string name="revanced_hide_shorts_use_template_button_title">Схаваць кнопку «Выкарыстаць шаблон»</string>
<string name="revanced_hide_shorts_use_template_button_summary_on">Кнопка выкарыстання шаблону схавана</string> <string name="revanced_hide_shorts_use_template_button_summary_on">Кнопка выкарыстання шаблону схавана</string>
<string name="revanced_hide_shorts_use_template_button_summary_off">Кнопка выкарыстання шаблону паказана</string> <string name="revanced_hide_shorts_use_template_button_summary_off">Кнопка выкарыстання шаблону паказана</string>
<string name="revanced_hide_shorts_upcoming_button_title">Схаваць кнопку будучых</string> <string name="revanced_hide_shorts_upcoming_button_title">Схаваць кнопку «Наступныя»</string>
<string name="revanced_hide_shorts_upcoming_button_summary_on">Кнопка Будущие ролики скрыта</string> <string name="revanced_hide_shorts_upcoming_button_summary_on">Кнопка Будущие ролики скрыта</string>
<string name="revanced_hide_shorts_upcoming_button_summary_off">Кнопка Будущие ролики отображается</string> <string name="revanced_hide_shorts_upcoming_button_summary_off">Кнопка Будущие ролики отображается</string>
<string name="revanced_hide_shorts_green_screen_button_title">Скрыть кнопку с зелёным экраном Shorts</string> <string name="revanced_hide_shorts_green_screen_button_title">Схаваць кнопку «Зялёны экран»</string>
<string name="revanced_hide_shorts_green_screen_button_summary_on">Кнопка с зелёным экраном Shorts скрыта</string> <string name="revanced_hide_shorts_green_screen_button_summary_on">Кнопка с зелёным экраном Shorts скрыта</string>
<string name="revanced_hide_shorts_green_screen_button_summary_off">Кнопка с зелёным экраном Shorts отображается</string> <string name="revanced_hide_shorts_green_screen_button_summary_off">Кнопка с зелёным экраном Shorts отображается</string>
<string name="revanced_hide_shorts_hashtag_button_title">Скрыть хештег-кнопку Shorts</string> <string name="revanced_hide_shorts_hashtag_button_title">Скрыть хештег-кнопку Shorts</string>
@@ -744,24 +753,24 @@ Second \"item\" text"</string>
<string name="revanced_hide_shorts_stickers_title">Скрыть стикеры</string> <string name="revanced_hide_shorts_stickers_title">Скрыть стикеры</string>
<string name="revanced_hide_shorts_stickers_summary_on">Стикеры Shorts скрыты</string> <string name="revanced_hide_shorts_stickers_summary_on">Стикеры Shorts скрыты</string>
<string name="revanced_hide_shorts_stickers_summary_off">Стикеры Shorts отображаются</string> <string name="revanced_hide_shorts_stickers_summary_off">Стикеры Shorts отображаются</string>
<string name="revanced_hide_shorts_like_fountain_title">Скрыть всплывающее окно с лайками Shorts</string> <string name="revanced_hide_shorts_like_fountain_title">Схаваць анімацыю кнопкі «Падабаецца»</string>
<string name="revanced_hide_shorts_like_fountain_summary_on">Анимация всплывающего окна с лайками Shorts скрыта</string> <string name="revanced_hide_shorts_like_fountain_summary_on">Анимация всплывающего окна с лайками Shorts скрыта</string>
<string name="revanced_hide_shorts_like_fountain_summary_off">Анимация всплывающего окна с лайками Shorts отображается</string> <string name="revanced_hide_shorts_like_fountain_summary_off">Анимация всплывающего окна с лайками Shorts отображается</string>
<string name="revanced_hide_shorts_like_button_title">Схаваць кнопку \"Падабаецца\"</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_on">Кнопка \"Падабаецца\" схавана</string>
<string name="revanced_hide_shorts_like_button_summary_off">Паказана кнопка \"Падабаецца\"</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_title">Схаваць кнопку «Не падабаецца»</string>
<string name="revanced_hide_shorts_dislike_button_summary_on">Кнопка \"Не падабаецца\" схавана</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_dislike_button_summary_off">Паказана кнопка \"Не падабаецца\"</string>
<string name="revanced_hide_shorts_comments_button_title">Кнопка \"Схаваць каментарыі\"</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_on">Кнопка каментарыяў схавана</string>
<string name="revanced_hide_shorts_comments_button_summary_off">Паказана кнопка каментарыяў</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. --> <!-- '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_title">Схаваць кнопку «Рэмікс»</string>
<string name="revanced_hide_shorts_remix_button_summary_on">Кнопка \"Рэмікс\" схавана</string> <string name="revanced_hide_shorts_remix_button_summary_on">Кнопка \"Рэмікс\" схавана</string>
<string name="revanced_hide_shorts_remix_button_summary_off">Паказана кнопка \"Рэмікс\"</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. --> <!-- '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_title">Схаваць кнопку «Падзяліцца»</string>
<string name="revanced_hide_shorts_share_button_summary_on">Кнопка \"Падзяліцца\" схавана</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_share_button_summary_off">Паказана кнопка \"Падзяліцца\"</string>
<string name="revanced_hide_shorts_info_panel_title">Схаваць інфармацыйную панэль</string> <string name="revanced_hide_shorts_info_panel_title">Схаваць інфармацыйную панэль</string>
@@ -826,6 +835,8 @@ Second \"item\" text"</string>
<string name="revanced_ryd_failure_generic">Не падабаецца (%s)</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. --> <!-- 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">Перазагрузіце відэа, каб прагаласаваць з дапамогай функцыі \"Вярнуць не падабаецца YouTube\"</string> <string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Перазагрузіце відэа, каб прагаласаваць з дапамогай функцыі \"Вярнуць не падабаецца YouTube\"</string>
<!-- Video likes have been set to hidden by the video uploader. -->
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Схавана ўладальнікам</string>
<string name="revanced_ryd_enable_summary_on">Дызлайкі паказаны</string> <string name="revanced_ryd_enable_summary_on">Дызлайкі паказаны</string>
<string name="revanced_ryd_enable_summary_off">Дызлайкі не паказваюцца</string> <string name="revanced_ryd_enable_summary_off">Дызлайкі не паказваюцца</string>
<string name="revanced_ryd_shorts_title">Паказвайце \"не падабаецца\" на Shorts</string> <string name="revanced_ryd_shorts_title">Паказвайце \"не падабаецца\" на Shorts</string>
@@ -838,9 +849,12 @@ Second \"item\" text"</string>
<string name="revanced_ryd_dislike_percentage_summary_on">Неўпадабанні паказаны ў працэнтах</string> <string name="revanced_ryd_dislike_percentage_summary_on">Неўпадабанні паказаны ў працэнтах</string>
<string name="revanced_ryd_dislike_percentage_summary_off">Неўпадабанні паказаны ў выглядзе колькасці</string> <string name="revanced_ryd_dislike_percentage_summary_off">Неўпадабанні паказаны ў выглядзе колькасці</string>
<!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' --> <!-- 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_title">Кампактны дызайн кнопак «Падабаецца» і «Не падабаецца»</string>
<string name="revanced_ryd_compact_layout_summary_on">Кнопка \"Падабаецца\" ў стылі мінімальнай шырыні</string> <string name="revanced_ryd_compact_layout_summary_on">Кнопка \"Падабаецца\" ў стылі мінімальнай шырыні</string>
<string name="revanced_ryd_compact_layout_summary_off">Кнопка \"Падабаецца\", аформленая для лепшага выгляду</string> <string name="revanced_ryd_compact_layout_summary_off">Кнопка \"Падабаецца\", аформленая для лепшага выгляду</string>
<string name="revanced_ryd_estimated_like_title">Паказваць прыблізную колькасць падабаек</string>
<string name="revanced_ryd_estimated_like_summary_on">Паказана прыблізная колькасць падабаек</string>
<string name="revanced_ryd_estimated_like_summary_off">Прыблізная колькасць падабаек схавана</string>
<string name="revanced_ryd_toast_on_connection_error_title">Паказаць тост, калі API недаступны</string> <string name="revanced_ryd_toast_on_connection_error_title">Паказаць тост, калі API недаступны</string>
<string name="revanced_ryd_toast_on_connection_error_summary_on">Тост паказваецца, калі функцыя \"Вярнуць не падабаецца YouTube\" недаступная</string> <string name="revanced_ryd_toast_on_connection_error_summary_on">Тост паказваецца, калі функцыя \"Вярнуць не падабаецца YouTube\" недаступная</string>
<string name="revanced_ryd_toast_on_connection_error_summary_off">Тост не паказваецца, калі функцыя \"Вярнуць не падабаецца YouTube\" недаступная</string> <string name="revanced_ryd_toast_on_connection_error_summary_off">Тост не паказваецца, калі функцыя \"Вярнуць не падабаецца YouTube\" недаступная</string>
@@ -886,11 +900,14 @@ Second \"item\" text"</string>
</patch> </patch>
<patch id="layout.sponsorblock.sponsorBlockResourcePatch"> <patch id="layout.sponsorblock.sponsorBlockResourcePatch">
<string name="revanced_sb_enable_sb">Уключыць SponsorBlock</string> <string name="revanced_sb_enable_sb">Уключыць SponsorBlock</string>
<string name="revanced_sb_enable_sb_sum">SponsorBlock - гэта краўдсорсінгавая сістэма для пропуску раздражняльных частак відэа YouTube</string> <string name="revanced_sb_enable_sb_sum">SponsorBlock гэта краўдсорсінгавая сістэма, якая дазваляе прапускаць раздражняльныя фрагменты відэа на YouTube</string>
<string name="revanced_sb_appearance_category">Паглядзіце</string> <string name="revanced_sb_appearance_category">Паглядзіце</string>
<string name="revanced_sb_enable_voting">Паказаць кнопку галасавання</string> <string name="revanced_sb_enable_voting">Паказаць кнопку галасавання</string>
<string name="revanced_sb_enable_voting_sum_on">Паказана кнопка сегментнага галасавання</string> <string name="revanced_sb_enable_voting_sum_on">Паказана кнопка сегментнага галасавання</string>
<string name="revanced_sb_enable_voting_sum_off">Кнопка сегментнага галасавання не паказваецца</string> <string name="revanced_sb_enable_voting_sum_off">Кнопка сегментнага галасавання не паказваецца</string>
<string name="revanced_sb_square_layout">Выкарыстоўваць квадратную схему</string>
<string name="revanced_sb_square_layout_sum_on">Кнопкі і элементы кіравання квадратныя</string>
<string name="revanced_sb_square_layout_sum_off">Кнопкі і элементы кіравання закруглены</string>
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title' --> <!-- 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">Выкарыстоўвайце кнопку кампактнага пропуску</string>
<string name="revanced_sb_enable_compact_skip_button_sum_on">Кнопка \"Прапусціць\" у стылі мінімальнай шырыні</string> <string name="revanced_sb_enable_compact_skip_button_sum_on">Кнопка \"Прапусціць\" у стылі мінімальнай шырыні</string>
@@ -952,7 +969,7 @@ Second \"item\" text"</string>
<string name="revanced_sb_segments_sponsor">Спонсар</string> <string name="revanced_sb_segments_sponsor">Спонсар</string>
<string name="revanced_sb_segments_sponsor_sum">Платнае прасоўванне, платныя рэфералы і прамая рэклама. Не для самарэкламы або бясплатных выкрыкаў справам/стваральнікам/вэб-сайтам/прадуктам, якія ім падабаюцца</string> <string name="revanced_sb_segments_sponsor_sum">Платнае прасоўванне, платныя рэфералы і прамая рэклама. Не для самарэкламы або бясплатных выкрыкаў справам/стваральнікам/вэб-сайтам/прадуктам, якія ім падабаюцца</string>
<string name="revanced_sb_segments_selfpromo">Неаплатнае/самарэклама</string> <string name="revanced_sb_segments_selfpromo">Неаплатнае/самарэклама</string>
<string name="revanced_sb_segments_selfpromo_sum">Падобна \"Спонсару\", за выключэннем неаплатнага або самарэкламы. Уключае раздзелы пра тавары, ахвяраванні або інфармацыю аб тым, з кім яны супрацоўнічалі</string> <string name="revanced_sb_segments_selfpromo_sum">Аналогічна спонсарству, але для неаплачваемай або ўласнай рэкламы. Уключае раздзелы аб таварах, ахвяраваннях або інфармацыі аб тым, з кім яны супрацоўнічалі</string>
<string name="revanced_sb_segments_interaction">Напамін аб узаемадзеянні (падпісацца)</string> <string name="revanced_sb_segments_interaction">Напамін аб узаемадзеянні (падпісацца)</string>
<string name="revanced_sb_segments_interaction_sum">Кароткі напамін паставіць лайкі, падпісацца або падпісацца на іх у сярэдзіне кантэнту. Калі ён доўгі або прысвечаны нечаму канкрэтнаму, ён павінен адпавядаць самарэкламе</string> <string name="revanced_sb_segments_interaction_sum">Кароткі напамін паставіць лайкі, падпісацца або падпісацца на іх у сярэдзіне кантэнту. Калі ён доўгі або прысвечаны нечаму канкрэтнаму, ён павінен адпавядаць самарэкламе</string>
<string name="revanced_sb_segments_highlight">Вылучыць</string> <string name="revanced_sb_segments_highlight">Вылучыць</string>
@@ -1108,6 +1125,7 @@ Second \"item\" text"</string>
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 --> 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> <string name="revanced_spoof_app_version_target_title">Падробка мэтавай версіі праграмы</string>
<string name="revanced_spoof_app_version_target_entry_1">19.35.36 — Восстановить старые значки плеера Shorts</string> <string name="revanced_spoof_app_version_target_entry_1">19.35.36 — Восстановить старые значки плеера Shorts</string>
<string name="revanced_spoof_app_version_target_entry_2">19.26.42 - Аднаўленне старых значкоў навігацыі</string>
<!-- 'RYD' is 'Return YouTube Dislike' --> <!-- 'RYD' is 'Return YouTube Dislike' -->
<string name="revanced_spoof_app_version_target_legacy_entry_1">18.33.40 - Аднаўленне RYD на Shorts у рэжыме інкогніта</string> <string name="revanced_spoof_app_version_target_legacy_entry_1">18.33.40 - Аднаўленне RYD на Shorts у рэжыме інкогніта</string>
<string name="revanced_spoof_app_version_target_legacy_entry_2">18.20.39 - Аднавіць хуткасць шырокага відэа &amp; якаснае меню</string> <string name="revanced_spoof_app_version_target_legacy_entry_2">18.20.39 - Аднавіць хуткасць шырокага відэа &amp; якаснае меню</string>
@@ -1117,8 +1135,11 @@ Second \"item\" text"</string>
<patch id="layout.startpage.changeStartPagePatch"> <patch id="layout.startpage.changeStartPagePatch">
<string name="revanced_change_start_page_title">Усталяваць стартавую старонку</string> <string name="revanced_change_start_page_title">Усталяваць стартавую старонку</string>
<string name="revanced_change_start_page_entry_default">Па змаўчанні</string> <string name="revanced_change_start_page_entry_default">Па змаўчанні</string>
<string name="revanced_change_start_page_entry_all_subscriptions">Усе падпіскі</string>
<string name="revanced_change_start_page_entry_browse">Обзор каналов</string> <string name="revanced_change_start_page_entry_browse">Обзор каналов</string>
<string name="revanced_change_start_page_entry_courses">Курсы / Адукацыя</string>
<string name="revanced_change_start_page_entry_explore">Дасьледуйце</string> <string name="revanced_change_start_page_entry_explore">Дасьледуйце</string>
<string name="revanced_change_start_page_entry_fashion">Мода і прыгажосць</string>
<string name="revanced_change_start_page_entry_gaming">Игры</string> <string name="revanced_change_start_page_entry_gaming">Игры</string>
<string name="revanced_change_start_page_entry_history">Гісторыя</string> <string name="revanced_change_start_page_entry_history">Гісторыя</string>
<string name="revanced_change_start_page_entry_library">Библиотека</string> <string name="revanced_change_start_page_entry_library">Библиотека</string>
@@ -1126,11 +1147,17 @@ Second \"item\" text"</string>
<string name="revanced_change_start_page_entry_live">В прямом эфире</string> <string name="revanced_change_start_page_entry_live">В прямом эфире</string>
<string name="revanced_change_start_page_entry_movies">Фильмы</string> <string name="revanced_change_start_page_entry_movies">Фильмы</string>
<string name="revanced_change_start_page_entry_music">Музыка</string> <string name="revanced_change_start_page_entry_music">Музыка</string>
<string name="revanced_change_start_page_entry_news">Навіны</string>
<string name="revanced_change_start_page_entry_notifications">Апавяшчэнні</string>
<string name="revanced_change_start_page_entry_playlists">Спісы прайгравання</string>
<string name="revanced_change_start_page_entry_search">Пошук</string> <string name="revanced_change_start_page_entry_search">Пошук</string>
<string name="revanced_change_start_page_entry_shopping">Пакупкі</string>
<string name="revanced_change_start_page_entry_sports">Спорт</string> <string name="revanced_change_start_page_entry_sports">Спорт</string>
<string name="revanced_change_start_page_entry_subscriptions">Падпіскі</string> <string name="revanced_change_start_page_entry_subscriptions">Падпіскі</string>
<string name="revanced_change_start_page_entry_trending">У трэндзе</string> <string name="revanced_change_start_page_entry_trending">У трэндзе</string>
<string name="revanced_change_start_page_entry_virtual_reality">Віртуальная рэальнасць</string>
<string name="revanced_change_start_page_entry_watch_later">Посмотреть позже</string> <string name="revanced_change_start_page_entry_watch_later">Посмотреть позже</string>
<string name="revanced_change_start_page_entry_your_clips">Вашыя кліпы</string>
</patch> </patch>
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch"> <patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
<string name="revanced_disable_resuming_shorts_player_title">Адключыць аднаўленне прайгравання Shorts</string> <string name="revanced_disable_resuming_shorts_player_title">Адключыць аднаўленне прайгравання Shorts</string>
@@ -1211,8 +1238,10 @@ Second \"item\" text"</string>
<string name="revanced_seekbar_custom_color_title">Уключыць уласны колер панэлі пошуку</string> <string name="revanced_seekbar_custom_color_title">Уключыць уласны колер панэлі пошуку</string>
<string name="revanced_seekbar_custom_color_summary_on">Паказваецца карыстальніцкі колер панэлі пошуку</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_summary_off">Паказаны зыходны колер панэлі пошуку</string>
<string name="revanced_seekbar_custom_color_value_title">Карыстальніцкі колер панэлі пошуку</string> <string name="revanced_seekbar_custom_color_primary_title">Спецыяльны колер пошуку</string>
<string name="revanced_seekbar_custom_color_value_summary">Колер панэлі пошуку</string> <string name="revanced_seekbar_custom_color_primary_summary">Колер пошуку</string>
<string name="revanced_seekbar_custom_color_accent_title">Спецыяльны акцэнтны колер пошуку</string>
<string name="revanced_seekbar_custom_color_accent_summary">Акцэнтны колер пошуку</string>
<string name="revanced_seekbar_custom_color_invalid">Неверное значение цвета ползунка прогресса</string> <string name="revanced_seekbar_custom_color_invalid">Неверное значение цвета ползунка прогресса</string>
</patch> </patch>
<patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch"> <patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch">
@@ -1342,6 +1371,8 @@ Second \"item\" text"</string>
<string name="revanced_custom_playback_speeds_invalid">Нестандартныя хуткасці павінны быць менш за %s</string> <string name="revanced_custom_playback_speeds_invalid">Нестандартныя хуткасці павінны быць менш за %s</string>
<string name="revanced_custom_playback_speeds_parse_exception">Несапраўдныя нестандартныя хуткасці прайгравання</string> <string name="revanced_custom_playback_speeds_parse_exception">Несапраўдныя нестандартныя хуткасці прайгравання</string>
<string name="revanced_custom_playback_speeds_auto">Аўто</string> <string name="revanced_custom_playback_speeds_auto">Аўто</string>
<string name="revanced_speed_tap_and_hold_title">Уласны хуткасць націску і ўтрымання</string>
<string name="revanced_speed_tap_and_hold_summary">Хуткасць прайгравання між 0-8</string>
</patch> </patch>
<patch id="video.speed.remember.rememberPlaybackSpeedPatch"> <patch id="video.speed.remember.rememberPlaybackSpeedPatch">
<string name="revanced_remember_playback_speed_last_selected_title">Запомніце змены хуткасці прайгравання</string> <string name="revanced_remember_playback_speed_last_selected_title">Запомніце змены хуткасці прайгравання</string>
@@ -1350,6 +1381,11 @@ Second \"item\" text"</string>
<string name="revanced_playback_speed_default_title">Стандартная хуткасць прайгравання</string> <string name="revanced_playback_speed_default_title">Стандартная хуткасць прайгравання</string>
<string name="revanced_remember_playback_speed_toast">Хуткасць па змаўчанні зменена на: %s</string> <string name="revanced_remember_playback_speed_toast">Хуткасць па змаўчанні зменена на: %s</string>
</patch> </patch>
<patch id="video.hdr.disableHdrPatch">
<string name="revanced_disable_hdr_video_title">Адключыць відэа ў фармаце HDR</string>
<string name="revanced_disable_hdr_video_summary_on">Відэа ў фармаце HDR адключана</string>
<string name="revanced_disable_hdr_video_summary_off">Відэа ў фармаце HDR уключана</string>
</patch>
<patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch"> <patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch">
<string name="revanced_restore_old_video_quality_menu_title">Аднавіць старое меню якасці відэа</string> <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_on">Паказана старое меню якасці відэа</string>
@@ -1387,7 +1423,7 @@ AVC мае максімальнае дазвол 1080p, аўдыёкадэк Opu
• Стабільны гук недаступны • Стабільны гук недаступны
• Прымусовае арыгінальнае аўдыё недаступна"</string> • Прымусовае арыгінальнае аўдыё недаступна"</string>
<string name="revanced_spoof_video_streams_about_no_av1">• Няма відэакідавання AV1</string> <string name="revanced_spoof_video_streams_about_no_av1">• Няма відэакідавання AV1</string>
<string name="revanced_spoof_video_streams_about_no_hdr">• Няма відэа HDR</string> <string name="revanced_spoof_video_streams_about_kids_videos">• Дзіцячыя відэа могуць не прайгравацца ў стане выхаду з акаўнта або ў рэжыме інкогніта</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">Паказаць у статыстыцы для спецыялістаў</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_title">Паказаць у статыстыцы для спецыялістаў</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">Тып кліента адлюстроўваецца ў статыстыцы для спецыялістаў</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">Тып кліента адлюстроўваецца ў статыстыцы для спецыялістаў</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">Кліент схаваны ў статыстыцы для спецыялістаў</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">Кліент схаваны ў статыстыцы для спецыялістаў</string>

View File

@@ -33,7 +33,7 @@ Second \"item\" text"</string>
<string name="revanced_check_environment_not_near_patch_time_invalid">Датата на компилация на APK е повредена</string> <string name="revanced_check_environment_not_near_patch_time_invalid">Датата на компилация на APK е повредена</string>
</patch> </patch>
<patch id="misc.settings.settingsResourcePatch"> <patch id="misc.settings.settingsResourcePatch">
<string name="revanced_settings_title">ReVanced</string> <string name="revanced_settings_submenu_title">Настройки</string>
<string name="revanced_settings_confirm_user_dialog_title">Искате ли да продължите?</string> <string name="revanced_settings_confirm_user_dialog_title">Искате ли да продължите?</string>
<string name="revanced_settings_reset">Възстанови</string> <string name="revanced_settings_reset">Възстанови</string>
<string name="revanced_settings_restart_title">Рестартирай и опресни</string> <string name="revanced_settings_restart_title">Рестартирай и опресни</string>
@@ -133,12 +133,15 @@ Second \"item\" text"</string>
<string name="revanced_settings_screen_01_ads_title">Реклами</string> <string name="revanced_settings_screen_01_ads_title">Реклами</string>
<string name="revanced_settings_screen_02_alt_thumbnails_title">Алтернативни миниатюри</string> <string name="revanced_settings_screen_02_alt_thumbnails_title">Алтернативни миниатюри</string>
<string name="revanced_settings_screen_03_feed_title">Поток</string> <string name="revanced_settings_screen_03_feed_title">Поток</string>
<string name="revanced_settings_screen_04_player_title">Плейър</string> <string name="revanced_settings_screen_04_general_title">Общ</string>
<string name="revanced_settings_screen_05_general_title">Общо оформление</string> <string name="revanced_settings_screen_05_player_title">Плеър</string>
<string name="revanced_settings_screen_07_seekbar_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_08_swipe_controls_title">Контроли с плъзгане</string>
<string name="revanced_settings_screen_11_misc_title">Разни</string> <string name="revanced_settings_screen_11_misc_title">Разни</string>
<string name="revanced_settings_screen_12_video_title">Видео</string> <string name="revanced_settings_screen_12_video_title">Видео</string>
<string name="revanced_restore_old_settings_menus_title">Възстановяване на старите менюта за настройки</string>
<string name="revanced_restore_old_settings_menus_summary_on">Старите менюта с настройки се показват</string>
<string name="revanced_restore_old_settings_menus_summary_off">Старите менюта с настройки не се показват</string>
</patch> </patch>
<patch id="misc.backgroundplayback.backgroundPlaybackPatch"> <patch id="misc.backgroundplayback.backgroundPlaybackPatch">
<string name="revanced_shorts_disable_background_playback_title">Възпроизвеждане на Shorts в фонов режим</string> <string name="revanced_shorts_disable_background_playback_title">Възпроизвеждане на Shorts в фонов режим</string>
@@ -165,9 +168,9 @@ Second \"item\" text"</string>
Няма да бъдете уведомени за неочаквани събития."</string> Няма да бъдете уведомени за неочаквани събития."</string>
</patch> </patch>
<patch id="layout.hide.general.hideLayoutComponentsPatch"> <patch id="layout.hide.general.hideLayoutComponentsPatch">
<string name="revanced_disable_like_subscribe_glow_title">Деактивирайте подсветката на бутона Харесвам /Абонамент</string> <string name="revanced_disable_like_subscribe_glow_title">Деактивиране на светенето на бутон Like и Subscribe</string>
<string name="revanced_disable_like_subscribe_glow_summary_on">Бутоните „Харесвам“ и „Абониране“ няма да светят, когато бъдат натиснати</string> <string name="revanced_disable_like_subscribe_glow_summary_on">Бутон Like и Subscribe няма да светят при споменаване</string>
<string name="revanced_disable_like_subscribe_glow_summary_off">Бутоните „Харесвам“ и „Абониране“ ще светят, когато бъдат натиснати</string> <string name="revanced_disable_like_subscribe_glow_summary_off">Бутон Like и Subscribe ще светят при споменаване</string>
<string name="revanced_hide_album_cards_title">\"Карти на албумите\"</string> <string name="revanced_hide_album_cards_title">\"Карти на албумите\"</string>
<string name="revanced_hide_album_cards_summary_on">Албумните карти са скрити</string> <string name="revanced_hide_album_cards_summary_on">Албумните карти са скрити</string>
<string name="revanced_hide_album_cards_summary_off">Албумните карти се показват</string> <string name="revanced_hide_album_cards_summary_off">Албумните карти се показват</string>
@@ -220,9 +223,9 @@ Second \"item\" text"</string>
<string name="revanced_hide_chips_shelf_title">Скриване на филмовите рафтове</string> <string name="revanced_hide_chips_shelf_title">Скриване на филмовите рафтове</string>
<string name="revanced_hide_chips_shelf_summary_on">Рафтът \"Chip\" е скрит</string> <string name="revanced_hide_chips_shelf_summary_on">Рафтът \"Chip\" е скрит</string>
<string name="revanced_hide_chips_shelf_summary_off">Рафтовете със снимки се показват</string> <string name="revanced_hide_chips_shelf_summary_off">Рафтовете със снимки се показват</string>
<string name="revanced_hide_expandable_chip_title">Скриване на показващи се раздели под видеоклипове</string> <string name="revanced_hide_expandable_chip_title">Скрий разширяемата карта под видеоклиповете</string>
<string name="revanced_hide_expandable_chip_summary_on">Падащите менюта са скрити</string> <string name="revanced_hide_expandable_chip_summary_on">Разширяемите карти са скрити</string>
<string name="revanced_hide_expandable_chip_summary_off">Показват се</string> <string name="revanced_hide_expandable_chip_summary_off">Разширяемите карти се показват</string>
<string name="revanced_hide_community_posts_title">Скриване на публикациите от общността</string> <string name="revanced_hide_community_posts_title">Скриване на публикациите от общността</string>
<string name="revanced_hide_community_posts_summary_on">Насоките на общността са скрити</string> <string name="revanced_hide_community_posts_summary_on">Насоките на общността са скрити</string>
<string name="revanced_hide_community_posts_summary_off">Последните публикации са показани</string> <string name="revanced_hide_community_posts_summary_off">Последните публикации са показани</string>
@@ -283,6 +286,9 @@ Second \"item\" text"</string>
<string name="revanced_hide_chapters_section_title">Скриване на секцията с заглавия</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_on">Секцията с заглавия е скрита</string>
<string name="revanced_hide_chapters_section_summary_off">Секцията с заглавия се показва</string> <string name="revanced_hide_chapters_section_summary_off">Секцията с заглавия се показва</string>
<string name="revanced_hide_how_this_was_made_section_title">Скриване на секцията \'Как е създадено това съдържание\'</string>
<string name="revanced_hide_how_this_was_made_section_summary_on">Секцията \'Как е създадено това съдържание\' е скрита</string>
<string name="revanced_hide_how_this_was_made_section_summary_off">Секцията \'Как е създадено това съдържание\' се показва</string>
<string name="revanced_hide_podcast_section_title">Скриване секцията „Разгледайте подкаста“</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_on">\"Разгледайте подкаста\" е скрита</string>
<string name="revanced_hide_podcast_section_summary_off">\"Разгледайте подкаста\" се показва</string> <string name="revanced_hide_podcast_section_summary_off">\"Разгледайте подкаста\" се показва</string>
@@ -325,7 +331,7 @@ Second \"item\" text"</string>
<string name="revanced_hide_comments_preview_comment_title">Преглед на коментари</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_on">Прегледа на коментари е скрит</string>
<string name="revanced_hide_comments_preview_comment_summary_off">Прегледа на коментари се показва</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_title">Скрий бутона за харесване</string>
<string name="revanced_hide_comments_thanks_button_summary_on">Бутона за благодарност е скрит</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_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_title">Бутони в лентата на прогреса и емотикони</string>
@@ -352,12 +358,12 @@ Second \"item\" text"</string>
<string name="revanced_hide_keyword_content_home_title">Скриване на видеоклипове в началната страница с ключови думи</string> <string name="revanced_hide_keyword_content_home_title">Скриване на видеоклипове в началната страница с ключови думи</string>
<string name="revanced_hide_keyword_content_home_summary_on">Видеоклиповете в раздела Начало се филтрират с помощта на ключови думи</string> <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_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_title">Скриване на резултати от търсения с ключови думи</string>
<string name="revanced_hide_keyword_content_search_summary_on">Резултатите от търсенето се филтрират с помощта на ключови думи</string> <string name="revanced_hide_keyword_content_search_summary_on">Резултатите от търсенето се филтрират с помощта на ключови думи</string>
<string name="revanced_hide_keyword_content_search_summary_off">Резултатите от търсенето не се филтрират по ключови думи</string> <string name="revanced_hide_keyword_content_search_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_phrases_title">Ключови думи, които да бъдат скрити</string> <string name="revanced_hide_keyword_content_phrases_title">Ключови думи, които да бъдат скрити</string>
<!-- For localization it is preferred, but not required, if 'LeBlanc' is replaced with a localized name or a familiar word that has upper case letters in the middle of the word. <!-- For localization it is preferred, but not required, if 'LeBlanc' is replaced with a localized name or a familiar word that has upper case letters in the middle of the word.
This is because keywords can be in any language, and showing an example in the localized script helps convey this. --> This is because keywords can be in any language, and showing an example in the localized script helps convey this. -->
@@ -404,6 +410,9 @@ Second \"item\" text"</string>
<string name="revanced_hide_products_banner_title">Скриване на банера за показване на продукти</string> <string name="revanced_hide_products_banner_title">Скриване на банера за показване на продукти</string>
<string name="revanced_hide_products_banner_summary_on">Банерът е скрит</string> <string name="revanced_hide_products_banner_summary_on">Банерът е скрит</string>
<string name="revanced_hide_products_banner_summary_off">Банерът е показан</string> <string name="revanced_hide_products_banner_summary_off">Банерът е показан</string>
<string name="revanced_hide_end_screen_store_banner_title">Скрий банера за реклама в края на екрана</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">Банерът на магазина е скрит</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">Банерът на магазина се показва</string>
<string name="revanced_hide_player_store_shelf_title">Скриване на рафта за пазаруване</string> <string name="revanced_hide_player_store_shelf_title">Скриване на рафта за пазаруване</string>
<string name="revanced_hide_player_store_shelf_summary_on">Рафта за пазаруване е скрит</string> <string name="revanced_hide_player_store_shelf_summary_on">Рафта за пазаруване е скрит</string>
<string name="revanced_hide_player_store_shelf_summary_off">Рафта за пазаруване се показва</string> <string name="revanced_hide_player_store_shelf_summary_off">Рафта за пазаруване се показва</string>
@@ -456,7 +465,7 @@ Second \"item\" text"</string>
<string name="revanced_external_downloader_summary_on">Бутонът за изтегляне е показан в плейъра</string> <string name="revanced_external_downloader_summary_on">Бутонът за изтегляне е показан в плейъра</string>
<string name="revanced_external_downloader_summary_off">Бутонът за изтегляне не е показан в плейъра</string> <string name="revanced_external_downloader_summary_off">Бутонът за изтегляне не е показан в плейъра</string>
<!-- 'download action button' should be translated using the same wording as the translation of 'revanced_hide_download_button_title' --> <!-- 'download action button' should be translated using the same wording as the translation of 'revanced_hide_download_button_title' -->
<string name="revanced_external_downloader_action_button_title">Отмяна на бутона за изтегляне</string> <string name="revanced_external_downloader_action_button_title">Заместване на бутона Download</string>
<string name="revanced_external_downloader_action_button_summary_on">Бутонът за изтегляне отваря избраното от Вас външно приложение за изтегляне</string> <string name="revanced_external_downloader_action_button_summary_on">Бутонът за изтегляне отваря избраното от Вас външно приложение за изтегляне</string>
<string name="revanced_external_downloader_action_button_summary_off">Бутонът за изтегляне отваря вграденото приложение за изтегляне</string> <string name="revanced_external_downloader_action_button_summary_off">Бутонът за изтегляне отваря вграденото приложение за изтегляне</string>
<string name="revanced_external_downloader_name_title">Име на пакета на изтеглящото приложение</string> <string name="revanced_external_downloader_name_title">Име на пакета на изтеглящото приложение</string>
@@ -497,8 +506,9 @@ Second \"item\" text"</string>
<string name="revanced_swipe_overlay_timeout_summary">Време за което плъзгащата контрола е видима.</string> <string name="revanced_swipe_overlay_timeout_summary">Време за което плъзгащата контрола е видима.</string>
<string name="revanced_swipe_text_overlay_size_title">Размер на текста при плъзгане</string> <string name="revanced_swipe_text_overlay_size_title">Размер на текста при плъзгане</string>
<string name="revanced_swipe_text_overlay_size_summary">Размера на текста на плъзгащите контроли</string> <string name="revanced_swipe_text_overlay_size_summary">Размера на текста на плъзгащите контроли</string>
<string name="revanced_swipe_overlay_background_alpha_title">Видимост на фона на плъзгащите контроли</string> <string name="revanced_swipe_overlay_background_opacity_title">Плъзгане на фона на наслагването непрозрачност</string>
<string name="revanced_swipe_overlay_background_alpha_summary">Видимостта на фона на плъзгащите контроли.</string> <string name="revanced_swipe_overlay_background_opacity_summary">Стойност на непрозрачността между 0-100</string>
<string name="revanced_swipe_overlay_background_opacity_invalid_toast">Непрозрачността на плъзгането трябва да е между 0-100</string>
<string name="revanced_swipe_threshold_title">Праг на величината на плъзгане</string> <string name="revanced_swipe_threshold_title">Праг на величината на плъзгане</string>
<string name="revanced_swipe_threshold_summary">Праг преди да се осъществи плъзгането</string> <string name="revanced_swipe_threshold_summary">Праг преди да се осъществи плъзгането</string>
<string name="revanced_swipe_change_video_title">Включване на превключване на видеото чрез плъзване</string> <string name="revanced_swipe_change_video_title">Включване на превключване на видеото чрез плъзване</string>
@@ -643,14 +653,14 @@ Second \"item\" text"</string>
<string name="revanced_hide_player_previous_next_buttons_title">Бутони за Предишно &amp; Следващо видео</string> <string name="revanced_hide_player_previous_next_buttons_title">Бутони за Предишно &amp; Следващо видео</string>
<string name="revanced_hide_player_previous_next_buttons_summary_on">Бутоните са скрити</string> <string name="revanced_hide_player_previous_next_buttons_summary_on">Бутоните са скрити</string>
<string name="revanced_hide_player_previous_next_buttons_summary_off">Бутоните се показват</string> <string name="revanced_hide_player_previous_next_buttons_summary_off">Бутоните се показват</string>
<string name="revanced_hide_cast_button_title">Бутон за предаване на Тв</string> <string name="revanced_hide_cast_button_title">Скриване на бутона Cast</string>
<string name="revanced_hide_cast_button_summary_on">Бутонът за предаване е скрит</string> <string name="revanced_hide_cast_button_summary_on">Бутонът за предаване е скрит</string>
<string name="revanced_hide_cast_button_summary_off">Бутонът за предаване се показва</string> <string name="revanced_hide_cast_button_summary_off">Бутонът за предаване се показва</string>
<!-- 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' --> <!-- 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_title">Скриване на бутона Captions</string>
<string name="revanced_hide_captions_button_summary_on">Бутона за субтити е скрит</string> <string name="revanced_hide_captions_button_summary_on">Бутона за субтити е скрит</string>
<string name="revanced_hide_captions_button_summary_off">Бутона за субтити се показва</string> <string name="revanced_hide_captions_button_summary_off">Бутона за субтити се показва</string>
<string name="revanced_hide_autoplay_button_title">Бутона за авт. изпълнение</string> <string name="revanced_hide_autoplay_button_title">Скриване на бутона Autoplay</string>
<string name="revanced_hide_autoplay_button_summary_on">Бутона за авт. изпълнение е скрит</string> <string name="revanced_hide_autoplay_button_summary_on">Бутона за авт. изпълнение е скрит</string>
<string name="revanced_hide_autoplay_button_summary_off">Бутона за авт. изпълнение се показва</string> <string name="revanced_hide_autoplay_button_summary_off">Бутона за авт. изпълнение се показва</string>
</patch> </patch>
@@ -660,7 +670,7 @@ Second \"item\" text"</string>
<string name="revanced_hide_endscreen_cards_summary_off">Препоръките в края се показват</string> <string name="revanced_hide_endscreen_cards_summary_off">Препоръките в края се показват</string>
</patch> </patch>
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch"> <patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
<string name="revanced_disable_fullscreen_ambient_mode_title">Деактивирайте подсветка около видеото на цял екран</string> <string name="revanced_disable_fullscreen_ambient_mode_title">Деактивиране на Ambient режим в цял екран</string>
<string name="revanced_disable_fullscreen_ambient_mode_summary_on">Подсветката в режим на цял екран е деактивирана</string> <string name="revanced_disable_fullscreen_ambient_mode_summary_on">Подсветката в режим на цял екран е деактивирана</string>
<string name="revanced_disable_fullscreen_ambient_mode_summary_off">Подсветката в режим на цял екран е активирана</string> <string name="revanced_disable_fullscreen_ambient_mode_summary_off">Подсветката в режим на цял екран е активирана</string>
</patch> </patch>
@@ -700,38 +710,38 @@ Second \"item\" text"</string>
<string name="revanced_hide_shorts_history_summary_on">Скрито в историята на гледане</string> <string name="revanced_hide_shorts_history_summary_on">Скрито в историята на гледане</string>
<string name="revanced_hide_shorts_history_summary_off">Показва се в историята на гледане</string> <string name="revanced_hide_shorts_history_summary_off">Показва се в историята на гледане</string>
<!-- 'join' should be translated using the same localized wording YouTube displays for the button. --> <!-- '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_title">Скриване на бутона Join</string>
<string name="revanced_hide_shorts_join_button_summary_on">Бутона за присъединяване е скрит</string> <string name="revanced_hide_shorts_join_button_summary_on">Бутона за присъединяване е скрит</string>
<string name="revanced_hide_shorts_join_button_summary_off">Бутона за присъединяване се показва</string> <string name="revanced_hide_shorts_join_button_summary_off">Бутона за присъединяване се показва</string>
<!-- 'subscribe' should be translated using the same localized wording YouTube displays for the button. --> <!-- '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_title">Скриване на бутона Subscribe</string>
<string name="revanced_hide_shorts_subscribe_button_summary_on">Бутонът „Абониране“ е скрит</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_subscribe_button_summary_off">Бутонът „Абониране“ се показва</string>
<string name="revanced_hide_shorts_paused_overlay_buttons_title">Показване на бутони при пауза</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_on">Бутоните при пауза се скриват</string>
<string name="revanced_hide_shorts_paused_overlay_buttons_summary_off">Бутоните при пауза се показват</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_title">Скриване на бутона Shop</string>
<string name="revanced_hide_shorts_shop_button_summary_on">Бутона за пазаруване е скрит</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_shop_button_summary_off">Бутона за пазаруване се показва</string>
<string name="revanced_hide_shorts_super_thanks_button_title">Бутон \"Специални благодарности\"</string> <string name="revanced_hide_shorts_super_thanks_button_title">Скриване на бутона Buy Super Thanks</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Бутон \"Специални благодарности\" е скрит</string> <string name="revanced_hide_shorts_super_thanks_button_summary_on">Бутон Buy Super Thanks е скрит</string>
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Бутон \"Специални благодарности\" се показва</string> <string name="revanced_hide_shorts_super_thanks_button_summary_off">Бутон Buy Super Thanks се показва</string>
<string name="revanced_hide_shorts_tagged_products_title">Скриване на маркираните продукти</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_on">Скрити</string>
<string name="revanced_hide_shorts_tagged_products_summary_off">Показват се</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_title">Етикет за местоположение</string>
<string name="revanced_hide_shorts_location_label_summary_on">Етикет за местоположение е скрит</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_location_label_summary_off">Етикет за местоположение се показва</string>
<string name="revanced_hide_shorts_save_sound_button_title">Скриване на бутона Запазване на музика</string> <string name="revanced_hide_shorts_save_sound_button_title">Скриване на бутона Save music</string>
<string name="revanced_hide_shorts_save_sound_button_summary_on">Бутонът за запазване на музика е скрит</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_save_sound_button_summary_off">Показан е бутонът за запазване на музика</string>
<string name="revanced_hide_shorts_use_template_button_title">Бутон за \"Използване на шаблон\"</string> <string name="revanced_hide_shorts_use_template_button_title">Скриване на бутона Use template</string>
<string name="revanced_hide_shorts_use_template_button_summary_on">Бутон за \"Използване на шаблон\" е скрит</string> <string name="revanced_hide_shorts_use_template_button_summary_on">Бутон за \"Използване на шаблон\" е скрит</string>
<string name="revanced_hide_shorts_use_template_button_summary_off">Бутон за \"Използване на шаблон\" се показва</string> <string name="revanced_hide_shorts_use_template_button_summary_off">Бутон за \"Използване на шаблон\" се показва</string>
<string name="revanced_hide_shorts_upcoming_button_title">Бутон \"Предстоящи събития\"</string> <string name="revanced_hide_shorts_upcoming_button_title">Скриване на бутона Upcoming</string>
<string name="revanced_hide_shorts_upcoming_button_summary_on">Бутон \"Предстоящи събития\" е скрит</string> <string name="revanced_hide_shorts_upcoming_button_summary_on">Бутон \"Предстоящи събития\" е скрит</string>
<string name="revanced_hide_shorts_upcoming_button_summary_off">Бутон \"Предстоящи събития\" се показва</string> <string name="revanced_hide_shorts_upcoming_button_summary_off">Бутон \"Предстоящи събития\" се показва</string>
<string name="revanced_hide_shorts_green_screen_button_title">Бутон \"Зелен екран\"</string> <string name="revanced_hide_shorts_green_screen_button_title">Скриване на бутона Green screen</string>
<string name="revanced_hide_shorts_green_screen_button_summary_on">Бутон \"Зелен екран\" е скрит</string> <string name="revanced_hide_shorts_green_screen_button_summary_on">Бутон \"Зелен екран\" е скрит</string>
<string name="revanced_hide_shorts_green_screen_button_summary_off">Бутон \"Зелен екран\" се показва</string> <string name="revanced_hide_shorts_green_screen_button_summary_off">Бутон \"Зелен екран\" се показва</string>
<string name="revanced_hide_shorts_hashtag_button_title">Скриване на бутона за хаштаг</string> <string name="revanced_hide_shorts_hashtag_button_title">Скриване на бутона за хаштаг</string>
@@ -743,24 +753,24 @@ Second \"item\" text"</string>
<string name="revanced_hide_shorts_stickers_title">Скриване на стикери</string> <string name="revanced_hide_shorts_stickers_title">Скриване на стикери</string>
<string name="revanced_hide_shorts_stickers_summary_on">Стикерите са скрити</string> <string name="revanced_hide_shorts_stickers_summary_on">Стикерите са скрити</string>
<string name="revanced_hide_shorts_stickers_summary_off">Стикери са показани</string> <string name="revanced_hide_shorts_stickers_summary_off">Стикери са показани</string>
<string name="revanced_hide_shorts_like_fountain_title">Анимация на бутона \"Харесвам\"</string> <string name="revanced_hide_shorts_like_fountain_title">Скриване на анимацията на Like бутона</string>
<string name="revanced_hide_shorts_like_fountain_summary_on">Анимацията на бутона „Харесва ми“ е скрита</string> <string name="revanced_hide_shorts_like_fountain_summary_on">Анимацията на бутона „Харесва ми“ е скрита</string>
<string name="revanced_hide_shorts_like_fountain_summary_off">Анимацията на бутона „Харесва ми“ се показва</string> <string name="revanced_hide_shorts_like_fountain_summary_off">Анимацията на бутона „Харесва ми“ се показва</string>
<string name="revanced_hide_shorts_like_button_title">Скриване на бутона за харесване</string> <string name="revanced_hide_shorts_like_button_title">Скриване на бутона Like</string>
<string name="revanced_hide_shorts_like_button_summary_on">Бутона за харесване е скрит</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_like_button_summary_off">Бутона за харесване се показва</string>
<string name="revanced_hide_shorts_dislike_button_title">Скриване на бутона за нехаресване</string> <string name="revanced_hide_shorts_dislike_button_title">Скриване на бутона Dislike</string>
<string name="revanced_hide_shorts_dislike_button_summary_on">Бутона за нехаресване е скрит</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_dislike_button_summary_off">Бутона за нехаресване се показва</string>
<string name="revanced_hide_shorts_comments_button_title">Скриване на бутона за коментари</string> <string name="revanced_hide_shorts_comments_button_title">Скриване на бутона Comments</string>
<string name="revanced_hide_shorts_comments_button_summary_on">Бутон за коментари е скрит</string> <string name="revanced_hide_shorts_comments_button_summary_on">Бутон за коментари е скрит</string>
<string name="revanced_hide_shorts_comments_button_summary_off">Бутон за коментари се показва</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. --> <!-- '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_title">Скриване на бутона Remix</string>
<string name="revanced_hide_shorts_remix_button_summary_on">Бутона за ремикс е скрит</string> <string name="revanced_hide_shorts_remix_button_summary_on">Бутона за ремикс е скрит</string>
<string name="revanced_hide_shorts_remix_button_summary_off">Бутона за ремикс се показва</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. --> <!-- '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_title">Скриване на бутона Share</string>
<string name="revanced_hide_shorts_share_button_summary_on">Бутона за споделяне е скрит</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_share_button_summary_off">Бутона за споделяне се показва</string>
<string name="revanced_hide_shorts_info_panel_title">Информационни панели</string> <string name="revanced_hide_shorts_info_panel_title">Информационни панели</string>
@@ -825,6 +835,8 @@ Second \"item\" text"</string>
<string name="revanced_ryd_failure_generic">Нехаресванията не са налични (%s)</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. --> <!-- 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_failure_ryd_enabled_while_playing_video_then_user_voted">Презареди видеото за гласуване с ReturnYouTubeDislike</string>
<!-- Video likes have been set to hidden by the video uploader. -->
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Скрито от собственика</string>
<string name="revanced_ryd_enable_summary_on">Нехаресванията се показват</string> <string name="revanced_ryd_enable_summary_on">Нехаресванията се показват</string>
<string name="revanced_ryd_enable_summary_off">Нехаресванията не се показват</string> <string name="revanced_ryd_enable_summary_off">Нехаресванията не се показват</string>
<string name="revanced_ryd_shorts_title">Пок. нехаресвания в кратките клипове</string> <string name="revanced_ryd_shorts_title">Пок. нехаресвания в кратките клипове</string>
@@ -837,9 +849,12 @@ Second \"item\" text"</string>
<string name="revanced_ryd_dislike_percentage_summary_on">Нехаресванията се показват като процент</string> <string name="revanced_ryd_dislike_percentage_summary_on">Нехаресванията се показват като процент</string>
<string name="revanced_ryd_dislike_percentage_summary_off">Нехаресванията се показват като число</string> <string name="revanced_ryd_dislike_percentage_summary_off">Нехаресванията се показват като число</string>
<!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' --> <!-- 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_title">Компактен Like бутон</string>
<string name="revanced_ryd_compact_layout_summary_on">Включен компактен бутон \"Харесва ми\"</string> <string name="revanced_ryd_compact_layout_summary_on">Включен компактен бутон \"Харесва ми\"</string>
<string name="revanced_ryd_compact_layout_summary_off">Най-добър изглед на бутона за харесване</string> <string name="revanced_ryd_compact_layout_summary_off">Най-добър изглед на бутона за харесване</string>
<string name="revanced_ryd_estimated_like_title">Показване на прогнозни харесвания</string>
<string name="revanced_ryd_estimated_like_summary_on">Показват се прогнозни харесвания</string>
<string name="revanced_ryd_estimated_like_summary_off">Прогнозните харесвания са скрити</string>
<string name="revanced_ryd_toast_on_connection_error_title">Показване на известие, ако API не е наличен</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_on">Показва известие, ако Return YouTube Dislike не е наличен</string>
<string name="revanced_ryd_toast_on_connection_error_summary_off">Не се показва известие, ако ReturnYouTube Dislike не е наличен</string> <string name="revanced_ryd_toast_on_connection_error_summary_off">Не се показва известие, ако ReturnYouTube Dislike не е наличен</string>
@@ -885,11 +900,14 @@ Second \"item\" text"</string>
</patch> </patch>
<patch id="layout.sponsorblock.sponsorBlockResourcePatch"> <patch id="layout.sponsorblock.sponsorBlockResourcePatch">
<string name="revanced_sb_enable_sb">Включване на SponsorBlock</string> <string name="revanced_sb_enable_sb">Включване на SponsorBlock</string>
<string name="revanced_sb_enable_sb_sum">SponsorBlock е система за прескачане на досадни части и реклами от видеоклиповете в YouTube</string> <string name="revanced_sb_enable_sb_sum">SponsorBlock е система с отворен код за прескачане на досадни части от видеоклипове в YouTube</string>
<string name="revanced_sb_appearance_category">Външен вид</string> <string name="revanced_sb_appearance_category">Външен вид</string>
<string name="revanced_sb_enable_voting">Бутона за гласуване</string> <string name="revanced_sb_enable_voting">Бутона за гласуване</string>
<string name="revanced_sb_enable_voting_sum_on">Бутона за гласуване на част се показва</string> <string name="revanced_sb_enable_voting_sum_on">Бутона за гласуване на част се показва</string>
<string name="revanced_sb_enable_voting_sum_off">Бутона за гласуване на част е скрит</string> <string name="revanced_sb_enable_voting_sum_off">Бутона за гласуване на част е скрит</string>
<string name="revanced_sb_square_layout">Използване на квадратно оформление</string>
<string name="revanced_sb_square_layout_sum_on">Бутоните и контролите са квадратни</string>
<string name="revanced_sb_square_layout_sum_off">Бутоните и контролите са заоблени</string>
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title' --> <!-- 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">Компактен бутон за пропускане</string>
<string name="revanced_sb_enable_compact_skip_button_sum_on">Мин. ширина на бутона за пропускане</string> <string name="revanced_sb_enable_compact_skip_button_sum_on">Мин. ширина на бутона за пропускане</string>
@@ -950,7 +968,7 @@ Second \"item\" text"</string>
<string name="revanced_sb_segments_sponsor">Спонсори</string> <string name="revanced_sb_segments_sponsor">Спонсори</string>
<string name="revanced_sb_segments_sponsor_sum">Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора</string> <string name="revanced_sb_segments_sponsor_sum">Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора</string>
<string name="revanced_sb_segments_selfpromo">Неплатена/Самореклама</string> <string name="revanced_sb_segments_selfpromo">Неплатена/Самореклама</string>
<string name="revanced_sb_segments_selfpromo_sum">Подобно на „Спонсор“, с изключение на неплатено или самореклама. Включва раздели за стоки, дарения или информация за това с кого са си сътрудничили</string> <string name="revanced_sb_segments_selfpromo_sum">Подобно на Sponsor, но за неплатена или собствена промоция. Включва секции за стоки, дарения или информация за това с кого са си сътрудничили</string>
<string name="revanced_sb_segments_interaction">Напомняне за действие (абониране)</string> <string name="revanced_sb_segments_interaction">Напомняне за действие (абониране)</string>
<string name="revanced_sb_segments_interaction_sum">Кратко напомняне да харесате, абонирате или последвате в средата на съдържанието. Ако е дълго или за нещо конкретно, вместо това трябва да бъде самореклама</string> <string name="revanced_sb_segments_interaction_sum">Кратко напомняне да харесате, абонирате или последвате в средата на съдържанието. Ако е дълго или за нещо конкретно, вместо това трябва да бъде самореклама</string>
<string name="revanced_sb_segments_highlight">Акценти</string> <string name="revanced_sb_segments_highlight">Акценти</string>
@@ -1077,7 +1095,7 @@ Second \"item\" text"</string>
<string name="revanced_sb_about_api_sum">Данните са предоставени от SponsorBlock API. Докоснете тук за повече информация и изтеглияния</string> <string name="revanced_sb_about_api_sum">Данните са предоставени от SponsorBlock API. Докоснете тук за повече информация и изтеглияния</string>
</patch> </patch>
<patch id="layout.formfactor.changeFormFactorPatch"> <patch id="layout.formfactor.changeFormFactorPatch">
<string name="revanced_change_form_factor_title">Форм фактор на оформлението</string> <string name="revanced_change_form_factor_title">Формат на екрана /Таблет, Телфон, .../</string>
<string name="revanced_change_form_factor_entry_1">По подразбиране</string> <string name="revanced_change_form_factor_entry_1">По подразбиране</string>
<string name="revanced_change_form_factor_entry_2">Телефон</string> <string name="revanced_change_form_factor_entry_2">Телефон</string>
<string name="revanced_change_form_factor_entry_3">Таблет</string> <string name="revanced_change_form_factor_entry_3">Таблет</string>
@@ -1106,7 +1124,7 @@ Second \"item\" text"</string>
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 --> 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> <string name="revanced_spoof_app_version_target_title">Подлъгване за версията на</string>
<string name="revanced_spoof_app_version_target_entry_1">19.35.36 - Възстановете старите икони на Shorts в плейъра</string> <string name="revanced_spoof_app_version_target_entry_1">19.35.36 - Възстановете старите икони на Shorts в плейъра</string>
<string name="revanced_spoof_app_version_target_entry_2">19.26.42 - Възстановяване на стари икони на навигацията и лентата с инструменти</string> <string name="revanced_spoof_app_version_target_entry_2">19.26.42 - Възстановяване на старите икони за навигация</string>
<!-- 'RYD' is 'Return YouTube Dislike' --> <!-- 'RYD' is 'Return YouTube Dislike' -->
<string name="revanced_spoof_app_version_target_legacy_entry_1">18.33.40 - Възстановете RYD в режим „инкогнито“ на Shorts</string> <string name="revanced_spoof_app_version_target_legacy_entry_1">18.33.40 - Възстановете RYD в режим „инкогнито“ на Shorts</string>
<string name="revanced_spoof_app_version_target_legacy_entry_2">18.20.39 - Възстановяване на видео скорост &amp; в менюто за качество</string> <string name="revanced_spoof_app_version_target_legacy_entry_2">18.20.39 - Възстановяване на видео скорост &amp; в менюто за качество</string>
@@ -1116,8 +1134,11 @@ Second \"item\" text"</string>
<patch id="layout.startpage.changeStartPagePatch"> <patch id="layout.startpage.changeStartPagePatch">
<string name="revanced_change_start_page_title">Задай начална страница</string> <string name="revanced_change_start_page_title">Задай начална страница</string>
<string name="revanced_change_start_page_entry_default">По подразбиране</string> <string name="revanced_change_start_page_entry_default">По подразбиране</string>
<string name="revanced_change_start_page_entry_all_subscriptions">Всички абонаменти</string>
<string name="revanced_change_start_page_entry_browse">Разглеждане на канала</string> <string name="revanced_change_start_page_entry_browse">Разглеждане на канала</string>
<string name="revanced_change_start_page_entry_courses">Курсове / Учене</string>
<string name="revanced_change_start_page_entry_explore">Разгледайте</string> <string name="revanced_change_start_page_entry_explore">Разгледайте</string>
<string name="revanced_change_start_page_entry_fashion">Мода и Красота</string>
<string name="revanced_change_start_page_entry_gaming">Игри</string> <string name="revanced_change_start_page_entry_gaming">Игри</string>
<string name="revanced_change_start_page_entry_history">История</string> <string name="revanced_change_start_page_entry_history">История</string>
<string name="revanced_change_start_page_entry_library">Библиотека</string> <string name="revanced_change_start_page_entry_library">Библиотека</string>
@@ -1125,11 +1146,17 @@ Second \"item\" text"</string>
<string name="revanced_change_start_page_entry_live">На Живо</string> <string name="revanced_change_start_page_entry_live">На Живо</string>
<string name="revanced_change_start_page_entry_movies">Филми</string> <string name="revanced_change_start_page_entry_movies">Филми</string>
<string name="revanced_change_start_page_entry_music">Музика</string> <string name="revanced_change_start_page_entry_music">Музика</string>
<string name="revanced_change_start_page_entry_news">Новини</string>
<string name="revanced_change_start_page_entry_notifications">Известия</string>
<string name="revanced_change_start_page_entry_playlists">Списъци за възпроизвеждане</string>
<string name="revanced_change_start_page_entry_search">Търсене</string> <string name="revanced_change_start_page_entry_search">Търсене</string>
<string name="revanced_change_start_page_entry_shopping">Пазаруване</string>
<string name="revanced_change_start_page_entry_sports">Спорт</string> <string name="revanced_change_start_page_entry_sports">Спорт</string>
<string name="revanced_change_start_page_entry_subscriptions">Абонаменти</string> <string name="revanced_change_start_page_entry_subscriptions">Абонаменти</string>
<string name="revanced_change_start_page_entry_trending">Популярни</string> <string name="revanced_change_start_page_entry_trending">Популярни</string>
<string name="revanced_change_start_page_entry_virtual_reality">Виртуална реалност</string>
<string name="revanced_change_start_page_entry_watch_later">Гледай по-късно</string> <string name="revanced_change_start_page_entry_watch_later">Гледай по-късно</string>
<string name="revanced_change_start_page_entry_your_clips">Вашите клипове</string>
</patch> </patch>
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch"> <patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
<string name="revanced_disable_resuming_shorts_player_title">Скриване на Shorts плейъра при стартиране</string> <string name="revanced_disable_resuming_shorts_player_title">Скриване на Shorts плейъра при стартиране</string>
@@ -1210,8 +1237,10 @@ Second \"item\" text"</string>
<string name="revanced_seekbar_custom_color_title">Промяна на цвета на индикатора за време</string> <string name="revanced_seekbar_custom_color_title">Промяна на цвета на индикатора за време</string>
<string name="revanced_seekbar_custom_color_summary_on">Показва се персонализиран цвят на лентата за напредък</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_summary_off">Показва се оригиналния цвят на лентата за напредък</string>
<string name="revanced_seekbar_custom_color_value_title">Персонализиран цвят на лентата за напредък</string> <string name="revanced_seekbar_custom_color_primary_title">Цвят на лентата за търсене по избор</string>
<string name="revanced_seekbar_custom_color_value_summary">Цветове на лентата за напредък</string> <string name="revanced_seekbar_custom_color_primary_summary">Цветът на лентата за търсене</string>
<string name="revanced_seekbar_custom_color_accent_title">Цвят на лентата за търсене по избор</string>
<string name="revanced_seekbar_custom_color_accent_summary">Цветът на лентата за търсене</string>
<string name="revanced_seekbar_custom_color_invalid">Невалидна стойност за цвят на лентата на прогреса</string> <string name="revanced_seekbar_custom_color_invalid">Невалидна стойност за цвят на лентата на прогреса</string>
</patch> </patch>
<patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch"> <patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch">
@@ -1341,6 +1370,8 @@ Second \"item\" text"</string>
<string name="revanced_custom_playback_speeds_invalid">Персонализираните скорости трябва да са по-малки от %s</string> <string name="revanced_custom_playback_speeds_invalid">Персонализираните скорости трябва да са по-малки от %s</string>
<string name="revanced_custom_playback_speeds_parse_exception">Невалидни персонализирани скорости на възпроизвеждане</string> <string name="revanced_custom_playback_speeds_parse_exception">Невалидни персонализирани скорости на възпроизвеждане</string>
<string name="revanced_custom_playback_speeds_auto">Авто</string> <string name="revanced_custom_playback_speeds_auto">Авто</string>
<string name="revanced_speed_tap_and_hold_title">Персонализирана скорост при докосване и задържане</string>
<string name="revanced_speed_tap_and_hold_summary">Скорост на възпроизвеждане между 0-8</string>
</patch> </patch>
<patch id="video.speed.remember.rememberPlaybackSpeedPatch"> <patch id="video.speed.remember.rememberPlaybackSpeedPatch">
<string name="revanced_remember_playback_speed_last_selected_title">Запомни промените в скоростта на възпроизвеждане</string> <string name="revanced_remember_playback_speed_last_selected_title">Запомни промените в скоростта на възпроизвеждане</string>
@@ -1349,6 +1380,11 @@ Second \"item\" text"</string>
<string name="revanced_playback_speed_default_title">Скорост на възпроизвеждане по подразбиране</string> <string name="revanced_playback_speed_default_title">Скорост на възпроизвеждане по подразбиране</string>
<string name="revanced_remember_playback_speed_toast">Скоростта по подразбиране е променена на: %s</string> <string name="revanced_remember_playback_speed_toast">Скоростта по подразбиране е променена на: %s</string>
</patch> </patch>
<patch id="video.hdr.disableHdrPatch">
<string name="revanced_disable_hdr_video_title">Деактивиране на HDR видео</string>
<string name="revanced_disable_hdr_video_summary_on">HDR видеото е деактивирано</string>
<string name="revanced_disable_hdr_video_summary_off">HDR видеото е активирано</string>
</patch>
<patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch"> <patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch">
<string name="revanced_restore_old_video_quality_menu_title">Възстановете старото меню за качество на видеото</string> <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_on">Показва се старото меню за видео качество</string>
@@ -1386,7 +1422,7 @@ AVC има максимална резолюция от 1080p, Opus аудио
• Ne e nali4na stabilna glasnost • Ne e nali4na stabilna glasnost
• Ne e nali4na forsirana originalna audio pista"</string> • Ne e nali4na forsirana originalna audio pista"</string>
<string name="revanced_spoof_video_streams_about_no_av1">• Без AV1 видео кодек</string> <string name="revanced_spoof_video_streams_about_no_av1">• Без AV1 видео кодек</string>
<string name="revanced_spoof_video_streams_about_no_hdr">• Без HDR видео</string> <string name="revanced_spoof_video_streams_about_kids_videos">• Детските видеоклипове може да не се възпроизвеждат, когато сте излезли от профила си или в режим \"инкогнито\"</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">Poka6i v Statistiki za nerds</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_title">Poka6i v Statistiki za nerds</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">Tipът na klienta se poka6va v Statistiki za nerds</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">Tipът na klienta se poka6va v Statistiki za nerds</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">Klientът e skriт v Statistiki za nerds</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">Klientът e skriт v Statistiki za nerds</string>

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