mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-25 18:34:07 +01:00
Compare commits
95 Commits
v5.8.0-dev
...
v5.12.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e3110271a7 | ||
|
|
0079eceb87 | ||
|
|
af2a97cb16 | ||
|
|
aeb552e8f2 | ||
|
|
6e936fea42 | ||
|
|
f63769f39f | ||
|
|
1c9ab20a63 | ||
|
|
cdeccad908 | ||
|
|
399889c6fa | ||
|
|
ec77861410 | ||
|
|
b5afc6d827 | ||
|
|
b7ebfddf65 | ||
|
|
2742aca48b | ||
|
|
14ca4d3288 | ||
|
|
a06c0318bf | ||
|
|
7f9f668435 | ||
|
|
76fd33ca54 | ||
|
|
9a653e9c5a | ||
|
|
f81b658fb7 | ||
|
|
7ff39d89d6 | ||
|
|
78ab0ec2bd | ||
|
|
3ab67f1539 | ||
|
|
8652cd613f | ||
|
|
bc8388713c | ||
|
|
d4b2e3be3e | ||
|
|
57c48b7829 | ||
|
|
aaa7523ee4 | ||
|
|
785df4fe69 | ||
|
|
83208eb50d | ||
|
|
9437db11eb | ||
|
|
1843c8bf70 | ||
|
|
778b51fbff | ||
|
|
ee0fdcdf86 | ||
|
|
57cc73d9c4 | ||
|
|
043ebbb6d4 | ||
|
|
d5551923fc | ||
|
|
f844a1cd76 | ||
|
|
a7e3277cc1 | ||
|
|
6fa2deea69 | ||
|
|
dcca2a3697 | ||
|
|
018160fd9c | ||
|
|
680252967e | ||
|
|
e79eba81d9 | ||
|
|
a73db03671 | ||
|
|
055ad04281 | ||
|
|
aaeee4a895 | ||
|
|
654b339f66 | ||
|
|
64cdce28a6 | ||
|
|
d01b9a67c5 | ||
|
|
a72404eeab | ||
|
|
3ff104528e | ||
|
|
76bbd7ed2f | ||
|
|
2fdf0f85c1 | ||
|
|
1d12c4156d | ||
|
|
c43050dce8 | ||
|
|
8104bbd7d7 | ||
|
|
8487888e6b | ||
|
|
6721a284cd | ||
|
|
6cde702854 | ||
|
|
7c8efcaf41 | ||
|
|
350ee02e3b | ||
|
|
df2d070a43 | ||
|
|
8167aaccc8 | ||
|
|
f4989ed0a5 | ||
|
|
8f5a0531bc | ||
|
|
622554de14 | ||
|
|
66e330ffe6 | ||
|
|
2afcd3d63d | ||
|
|
80d7c78cf6 | ||
|
|
d85bcc3c16 | ||
|
|
21368ea696 | ||
|
|
e687d3ed37 | ||
|
|
064b859d39 | ||
|
|
89882ddaf8 | ||
|
|
41881ba161 | ||
|
|
0615990138 | ||
|
|
70532313db | ||
|
|
e5e897de77 | ||
|
|
1e57ce9658 | ||
|
|
fcad0ab5bb | ||
|
|
91471eccf9 | ||
|
|
d559f016c6 | ||
|
|
5a82d26f03 | ||
|
|
e2eae499d9 | ||
|
|
64919d6443 | ||
|
|
c6ffaf86ae | ||
|
|
3ee99b7bf1 | ||
|
|
6f9bf4873f | ||
|
|
29a73089a3 | ||
|
|
74ef1841eb | ||
|
|
0c544d28e3 | ||
|
|
b1e5b99b44 | ||
|
|
7b90baadb5 | ||
|
|
4a6f3c8555 | ||
|
|
e7c6943ca7 |
4
.github/workflows/pull_strings.yml
vendored
4
.github/workflows/pull_strings.yml
vendored
@@ -2,7 +2,7 @@ name: Pull strings
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 */8 * * *"
|
||||
- cron: "0 */6 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
@@ -18,6 +18,7 @@ jobs:
|
||||
with:
|
||||
ref: dev
|
||||
fetch-depth: 0
|
||||
clean: true
|
||||
|
||||
- name: Pull strings
|
||||
uses: crowdin/github-action@v2
|
||||
@@ -25,6 +26,7 @@ jobs:
|
||||
config: crowdin.yml
|
||||
upload_sources: false
|
||||
download_translations: true
|
||||
skip_ref_checkout: true
|
||||
localization_branch_name: feat/translations
|
||||
create_pull_request: false
|
||||
env:
|
||||
|
||||
5
.github/workflows/push_strings.yml
vendored
5
.github/workflows/push_strings.yml
vendored
@@ -18,6 +18,11 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Preprocess strings
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: ./gradlew clean preprocessCrowdinStrings
|
||||
|
||||
- name: Push strings
|
||||
uses: crowdin/github-action@v2
|
||||
with:
|
||||
|
||||
285
CHANGELOG.md
285
CHANGELOG.md
@@ -1,3 +1,288 @@
|
||||
# [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)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **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))
|
||||
|
||||
# [5.9.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.8.2-dev.1...v5.9.0-dev.1) (2025-01-17)
|
||||
|
||||
|
||||
### 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))
|
||||
|
||||
## [5.8.2-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.8.1...v5.8.2-dev.1) (2025-01-09)
|
||||
|
||||
|
||||
### 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))
|
||||
|
||||
## [5.8.1](https://github.com/ReVanced/revanced-patches/compare/v5.8.0...v5.8.1) (2025-01-07)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Spoof video streams:** Add 'Android Creator' ([#4262](https://github.com/ReVanced/revanced-patches/issues/4262)) ([0479dd2](https://github.com/ReVanced/revanced-patches/commit/0479dd265e09b0accdf6ff6b00c8e938dc5b96c7))
|
||||
|
||||
## [5.8.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.8.0...v5.8.1-dev.1) (2025-01-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Spoof video streams:** Add 'Android Creator' ([#4262](https://github.com/ReVanced/revanced-patches/issues/4262)) ([0479dd2](https://github.com/ReVanced/revanced-patches/commit/0479dd265e09b0accdf6ff6b00c8e938dc5b96c7))
|
||||
|
||||
# [5.8.0](https://github.com/ReVanced/revanced-patches/compare/v5.7.2...v5.8.0) (2024-12-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **GmsCore support:** Do not show battery optimization error on Android Automotive devices (Google built-in) ([#4218](https://github.com/ReVanced/revanced-patches/issues/4218)) ([d6e389c](https://github.com/ReVanced/revanced-patches/commit/d6e389cc43bc40724f032b230f70048276349a19))
|
||||
* **YouTube - Exit fullscreen mode:** Exit fullscreen mode of first video opened after cold start ([be5cf2e](https://github.com/ReVanced/revanced-patches/commit/be5cf2e834d87d51b5d3061d46bd7154d6306787))
|
||||
* **YouTube - Force original audio:** If stream spoofing to Android then show a summary text why force audio is not available ([#4220](https://github.com/ReVanced/revanced-patches/issues/4220)) ([029aee8](https://github.com/ReVanced/revanced-patches/commit/029aee8023f096413fc80a2c583b4fe55ecb10ac))
|
||||
* **YouTube - Spoof video streams:** Ignore harmless error toast if hide ads is disabled ([c3423bb](https://github.com/ReVanced/revanced-patches/commit/c3423bb9e531cfa52f6d28e0b98bbe8ab8684c30))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Swipe controls:** Add option to enable/disable fullscreen swipe to next video ([#4222](https://github.com/ReVanced/revanced-patches/issues/4222)) ([119092f](https://github.com/ReVanced/revanced-patches/commit/119092fafa4129849246df15fe8076ed3b491b85))
|
||||
* **YouTube - Hide Shorts components:** Add option to hide Shorts in watch history ([#4214](https://github.com/ReVanced/revanced-patches/issues/4214)) ([19c2742](https://github.com/ReVanced/revanced-patches/commit/19c2742aa367367c77bb50ddad6f8a20fef8ea0a))
|
||||
* **YouTube - Spoof app version:** Add 'Restore old navigation and toolbar icons' ([f84e459](https://github.com/ReVanced/revanced-patches/commit/f84e459d3d54b3001586796ab4e114ebadf09043))
|
||||
* **YouTube:** Add `Change form factor` patch ([#4217](https://github.com/ReVanced/revanced-patches/issues/4217)) ([644ac5b](https://github.com/ReVanced/revanced-patches/commit/644ac5baa68b209a32300149a2efa009b776f9a7))
|
||||
* **YouTube:** Add `Exit fullscreen mode` patch ([#4223](https://github.com/ReVanced/revanced-patches/issues/4223)) ([bb5d03b](https://github.com/ReVanced/revanced-patches/commit/bb5d03bd89a3f932c77e4e9de90174c374933688))
|
||||
* **YouTube:** Add in app option to select a preferred language for ReVanced specific text ([#4231](https://github.com/ReVanced/revanced-patches/issues/4231)) ([3932af3](https://github.com/ReVanced/revanced-patches/commit/3932af397ae89a0b30191cd870bd6cddb7a078db))
|
||||
|
||||
# [5.8.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.8.0-dev.7...v5.8.0-dev.8) (2024-12-28)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube:** Add in app option to select a preferred language for ReVanced specific text ([#4231](https://github.com/ReVanced/revanced-patches/issues/4231)) ([3932af3](https://github.com/ReVanced/revanced-patches/commit/3932af397ae89a0b30191cd870bd6cddb7a078db))
|
||||
|
||||
# [5.8.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.8.0-dev.6...v5.8.0-dev.7) (2024-12-27)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Spoof video streams:** Ignore harmless error toast if hide ads is disabled ([c3423bb](https://github.com/ReVanced/revanced-patches/commit/c3423bb9e531cfa52f6d28e0b98bbe8ab8684c30))
|
||||
|
||||
# [5.8.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.8.0-dev.5...v5.8.0-dev.6) (2024-12-27)
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
android.namespace = "app.revanced.extension"
|
||||
android {
|
||||
namespace = "app.revanced.extension"
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly(libs.annotation)
|
||||
|
||||
@@ -12,7 +12,7 @@ import android.os.Handler;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
/** @noinspection deprecation, unused */
|
||||
@SuppressWarnings({"deprecation", "unused"})
|
||||
public class SpoofWifiPatch {
|
||||
|
||||
// Used to check what the (real or fake) active network is (take a look at `hasTransport`).
|
||||
|
||||
@@ -1,3 +1,16 @@
|
||||
android {
|
||||
namespace = "app.revanced.extension"
|
||||
|
||||
defaultConfig {
|
||||
minSdk = 21
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly(libs.annotation)
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package app.revanced.extension.all.misc.directory.documentsprovider;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
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.
|
||||
*/
|
||||
@SuppressLint("LongLogTag")
|
||||
public class InternalDataDocumentsProvider extends DocumentsProvider {
|
||||
private static final String[] rootColumns =
|
||||
{"root_id", "mime_types", "flags", "icon", "title", "summary", "document_id"};
|
||||
|
||||
@@ -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 {
|
||||
compileOnly(libs.annotation)
|
||||
|
||||
@@ -5,7 +5,8 @@ import android.os.Build;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
public final class RemoveScreencaptureRestrictionPatch {
|
||||
@SuppressWarnings("unused")
|
||||
public final class RemoveScreenCaptureRestrictionPatch {
|
||||
// Member of AudioAttributes.Builder
|
||||
@RequiresApi(api = Build.VERSION_CODES.Q)
|
||||
public static AudioAttributes.Builder setAllowedCapturePolicy(final AudioAttributes.Builder builder, final int capturePolicy) {
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package app.revanced.extension.all.screenshot.removerestriction;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class RemoveScreenshotRestrictionPatch {
|
||||
|
||||
public static void addFlags(Window window, int flags) {
|
||||
|
||||
@@ -4,7 +4,7 @@ plugins {
|
||||
|
||||
android {
|
||||
namespace = "app.revanced.extension"
|
||||
compileSdk = 33
|
||||
compileSdk = 34
|
||||
|
||||
defaultConfig {
|
||||
minSdk = 24
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
// Do not remove. Necessary for the extension plugin to be applied to the project.
|
||||
android {
|
||||
defaultConfig {
|
||||
minSdk = 26
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ plugins {
|
||||
|
||||
android {
|
||||
namespace = "app.revanced.extension"
|
||||
compileSdk = 33
|
||||
compileSdk = 34
|
||||
|
||||
defaultConfig {
|
||||
minSdk = 24
|
||||
|
||||
@@ -40,6 +40,8 @@ import java.util.concurrent.SynchronousQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import app.revanced.extension.shared.settings.AppLanguage;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.shared.settings.BooleanSetting;
|
||||
import app.revanced.extension.shared.settings.preference.ReVancedAboutPreference;
|
||||
|
||||
@@ -360,7 +362,17 @@ public class Utils {
|
||||
}
|
||||
|
||||
public static void setContext(Context appContext) {
|
||||
// Must initially set context as the language settings needs it.
|
||||
context = appContext;
|
||||
|
||||
AppLanguage language = BaseSettings.REVANCED_LANGUAGE.get();
|
||||
if (language != AppLanguage.DEFAULT) {
|
||||
// Create a new context with the desired language.
|
||||
Configuration config = appContext.getResources().getConfiguration();
|
||||
config.setLocale(language.getLocale());
|
||||
context = appContext.createConfigurationContext(config);
|
||||
}
|
||||
|
||||
// In some apps like TikTok, the Setting classes can load in weird orders due to cyclic class dependencies.
|
||||
// Calling the regular printDebug method here can cause a Settings context null pointer exception,
|
||||
// even though the context is already set before the call.
|
||||
@@ -710,8 +722,8 @@ public class Utils {
|
||||
Preference preference = group.getPreference(i);
|
||||
|
||||
final Sort preferenceSort;
|
||||
if (preference instanceof PreferenceGroup) {
|
||||
sortPreferenceGroups((PreferenceGroup) preference);
|
||||
if (preference instanceof PreferenceGroup subGroup) {
|
||||
sortPreferenceGroups(subGroup);
|
||||
preferenceSort = groupSort; // Sort value for groups is for it's content, not itself.
|
||||
} else {
|
||||
// Allow individual preferences to set a key sorting.
|
||||
@@ -765,8 +777,8 @@ public class Utils {
|
||||
return;
|
||||
}
|
||||
|
||||
String deviceLanguage = Utils.getContext().getResources().getConfiguration().locale.getLanguage();
|
||||
if (deviceLanguage.equals("en")) {
|
||||
String revancedLocale = Utils.getContext().getResources().getConfiguration().locale.getLanguage();
|
||||
if (revancedLocale.equals(Locale.ENGLISH.getLanguage())) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -774,8 +786,8 @@ public class Utils {
|
||||
Preference pref = group.getPreference(i);
|
||||
pref.setSingleLineTitle(false);
|
||||
|
||||
if (pref instanceof PreferenceGroup) {
|
||||
setPreferenceTitlesToMultiLineIfNeeded((PreferenceGroup) pref);
|
||||
if (pref instanceof PreferenceGroup subGroup) {
|
||||
setPreferenceTitlesToMultiLineIfNeeded(subGroup);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package app.revanced.extension.shared.spoof;
|
||||
package app.revanced.extension.shared.settings;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public enum AudioStreamLanguage {
|
||||
public enum AppLanguage {
|
||||
/**
|
||||
* The current app language.
|
||||
*/
|
||||
@@ -34,7 +34,7 @@ public enum AudioStreamLanguage {
|
||||
GL,
|
||||
GU,
|
||||
HI,
|
||||
HE, // App uses obsolete 'IW' and 'HE' is modern ISO code.
|
||||
HE, // App uses obsolete 'IW' and not the modern 'HE' ISO code.
|
||||
HR,
|
||||
HU,
|
||||
HY,
|
||||
@@ -87,7 +87,7 @@ public enum AudioStreamLanguage {
|
||||
|
||||
private final String language;
|
||||
|
||||
AudioStreamLanguage() {
|
||||
AppLanguage() {
|
||||
language = name().toLowerCase(Locale.US);
|
||||
}
|
||||
|
||||
@@ -103,4 +103,12 @@ public enum AudioStreamLanguage {
|
||||
|
||||
return language;
|
||||
}
|
||||
|
||||
public Locale getLocale() {
|
||||
if (this == DEFAULT) {
|
||||
return Locale.getDefault();
|
||||
}
|
||||
|
||||
return Locale.forLanguageTag(language);
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,6 @@ import static app.revanced.extension.shared.settings.Setting.parent;
|
||||
import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.AudioStreamLanguageOverrideAvailability;
|
||||
import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.SpoofiOSAvailability;
|
||||
|
||||
import app.revanced.extension.shared.spoof.AudioStreamLanguage;
|
||||
import app.revanced.extension.shared.spoof.ClientType;
|
||||
|
||||
/**
|
||||
@@ -22,8 +21,10 @@ public class BaseSettings {
|
||||
|
||||
public static final IntegerSetting CHECK_ENVIRONMENT_WARNINGS_ISSUED = new IntegerSetting("revanced_check_environment_warnings_issued", 0, true, false);
|
||||
|
||||
public static final EnumSetting<AppLanguage> REVANCED_LANGUAGE = new EnumSetting<>("revanced_language", AppLanguage.DEFAULT, true, "revanced_language_user_dialog_message");
|
||||
|
||||
public static final BooleanSetting SPOOF_VIDEO_STREAMS = new BooleanSetting("revanced_spoof_video_streams", TRUE, true, "revanced_spoof_video_streams_user_dialog_message");
|
||||
public static final EnumSetting<AudioStreamLanguage> SPOOF_VIDEO_STREAMS_LANGUAGE = new EnumSetting<>("revanced_spoof_video_streams_language", AudioStreamLanguage.DEFAULT, new AudioStreamLanguageOverrideAvailability());
|
||||
public static final EnumSetting<AppLanguage> SPOOF_VIDEO_STREAMS_LANGUAGE = new EnumSetting<>("revanced_spoof_video_streams_language", AppLanguage.DEFAULT, new AudioStreamLanguageOverrideAvailability());
|
||||
public static final BooleanSetting SPOOF_STREAMING_DATA_STATS_FOR_NERDS = new BooleanSetting("revanced_spoof_streaming_data_stats_for_nerds", TRUE, parent(SPOOF_VIDEO_STREAMS));
|
||||
public static final BooleanSetting SPOOF_VIDEO_STREAMS_IOS_FORCE_AVC = new BooleanSetting("revanced_spoof_video_streams_ios_force_avc", FALSE, true,
|
||||
"revanced_spoof_video_streams_ios_force_avc_user_dialog_message", new SpoofiOSAvailability());
|
||||
|
||||
@@ -4,6 +4,10 @@ import android.os.Build;
|
||||
|
||||
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;
|
||||
|
||||
public enum ClientType {
|
||||
@@ -11,56 +15,99 @@ public enum ClientType {
|
||||
ANDROID_VR_NO_AUTH(
|
||||
28,
|
||||
"ANDROID_VR",
|
||||
"com.google.android.apps.youtube.vr.oculus",
|
||||
"Oculus",
|
||||
"Quest 3",
|
||||
"Android",
|
||||
"12",
|
||||
"com.google.android.apps.youtube.vr.oculus/1.56.21 (Linux; U; Android 12; GB) gzip",
|
||||
"32", // Android 12.1
|
||||
"1.56.21",
|
||||
// Android 12.1
|
||||
"32",
|
||||
"SQ3A.220605.009.A1",
|
||||
"132.0.6808.3",
|
||||
"1.61.48",
|
||||
false,
|
||||
false,
|
||||
"Android VR No auth"
|
||||
),
|
||||
// Chromecast with Google TV 4K.
|
||||
// https://dumps.tadiphone.dev/dumps/google/kirkwood
|
||||
ANDROID_UNPLUGGED(
|
||||
29,
|
||||
"ANDROID_UNPLUGGED",
|
||||
"com.google.android.apps.youtube.unplugged",
|
||||
"Google",
|
||||
"Google TV Streamer",
|
||||
"Android",
|
||||
"14",
|
||||
"com.google.android.apps.youtube.unplugged/8.49.0 (Linux; U; Android 14; GB) gzip",
|
||||
"34",
|
||||
"UTT3.240625.001.K5",
|
||||
"132.0.6808.3",
|
||||
"8.49.0",
|
||||
true,
|
||||
true,
|
||||
"Android TV"
|
||||
),
|
||||
// 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(
|
||||
14,
|
||||
"ANDROID_CREATOR",
|
||||
"com.google.android.apps.youtube.creator",
|
||||
"Google",
|
||||
"Pixel 9 Pro Fold",
|
||||
"Android",
|
||||
"15",
|
||||
"35",
|
||||
"AP3A.241005.015.A2",
|
||||
"132.0.6779.0",
|
||||
"23.47.101",
|
||||
true,
|
||||
true,
|
||||
"Android Creator"
|
||||
),
|
||||
ANDROID_VR(
|
||||
ANDROID_VR_NO_AUTH.id,
|
||||
ANDROID_VR_NO_AUTH.clientName,
|
||||
ANDROID_VR_NO_AUTH.packageName,
|
||||
ANDROID_VR_NO_AUTH.deviceMake,
|
||||
ANDROID_VR_NO_AUTH.deviceModel,
|
||||
ANDROID_VR_NO_AUTH.osName,
|
||||
ANDROID_VR_NO_AUTH.osVersion,
|
||||
ANDROID_VR_NO_AUTH.userAgent,
|
||||
ANDROID_VR_NO_AUTH.androidSdkVersion,
|
||||
ANDROID_VR_NO_AUTH.buildId,
|
||||
ANDROID_VR_NO_AUTH.cronetVersion,
|
||||
ANDROID_VR_NO_AUTH.clientVersion,
|
||||
ANDROID_VR_NO_AUTH.requiresAuth,
|
||||
true,
|
||||
"Android VR"
|
||||
),
|
||||
IOS_UNPLUGGED(33,
|
||||
IOS_UNPLUGGED(
|
||||
33,
|
||||
"IOS_UNPLUGGED",
|
||||
"com.google.ios.youtubeunplugged",
|
||||
"Apple",
|
||||
forceAVC()
|
||||
? "iPhone12,5" // 11 Pro Max (last device with iOS 13)
|
||||
: "iPhone16,2", // 15 Pro Max
|
||||
// iOS 13 and earlier uses only AVC. 14+ adds VP9 and AV1.
|
||||
// 11 Pro Max (last device with iOS 13)
|
||||
? "iPhone12,5"
|
||||
// 15 Pro Max
|
||||
: "iPhone16,2",
|
||||
"iOS",
|
||||
forceAVC()
|
||||
? "13.7.17H35" // Last release of iOS 13.
|
||||
: "18.1.1.22B91",
|
||||
forceAVC()
|
||||
? "com.google.ios.youtubeunplugged/6.45 (iPhone; U; CPU iOS 13_7 like Mac OS X)"
|
||||
: "com.google.ios.youtubeunplugged/8.33 (iPhone; U; CPU iOS 18_1_1 like Mac OS X)",
|
||||
// iOS 13 and earlier uses only AVC. 14+ adds VP9 and AV1.
|
||||
? "13.7.17H35"
|
||||
: "18.2.22C152",
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
// Version number should be a valid iOS release.
|
||||
// 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()
|
||||
// Some newer versions can also force AVC,
|
||||
// but 6.45 is the last version that supports iOS 13.
|
||||
? "6.45"
|
||||
: "8.33",
|
||||
: "8.49",
|
||||
true,
|
||||
true,
|
||||
forceAVC()
|
||||
? "iOS TV Force AVC"
|
||||
@@ -80,20 +127,35 @@ public enum ClientType {
|
||||
public final String clientName;
|
||||
|
||||
/**
|
||||
* Device model, equivalent to {@link Build#MODEL} (System property: ro.product.model)
|
||||
* App package name.
|
||||
*/
|
||||
public final String deviceModel;
|
||||
|
||||
/**
|
||||
* Device OS version.
|
||||
*/
|
||||
public final String osVersion;
|
||||
private final String packageName;
|
||||
|
||||
/**
|
||||
* Player user-agent.
|
||||
*/
|
||||
public final String userAgent;
|
||||
|
||||
/**
|
||||
* Device model, equivalent to {@link Build#MANUFACTURER} (System property: ro.product.vendor.manufacturer)
|
||||
*/
|
||||
public final String deviceMake;
|
||||
|
||||
/**
|
||||
* Device model, equivalent to {@link Build#MODEL} (System property: ro.product.vendor.model)
|
||||
*/
|
||||
public final String deviceModel;
|
||||
|
||||
/**
|
||||
* Device OS name.
|
||||
*/
|
||||
public final String osName;
|
||||
|
||||
/**
|
||||
* Device OS version.
|
||||
*/
|
||||
public final String osVersion;
|
||||
|
||||
/**
|
||||
* Android SDK version, equivalent to {@link Build.VERSION#SDK} (System property: ro.build.version.sdk)
|
||||
* Field is null if not applicable.
|
||||
@@ -101,39 +163,97 @@ public enum ClientType {
|
||||
@Nullable
|
||||
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.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
public final String friendlyName;
|
||||
|
||||
@SuppressWarnings("ConstantLocale")
|
||||
ClientType(int id,
|
||||
String clientName,
|
||||
String packageName,
|
||||
String deviceMake,
|
||||
String deviceModel,
|
||||
String osName,
|
||||
String osVersion,
|
||||
String userAgent,
|
||||
@Nullable String androidSdkVersion,
|
||||
@Nullable String buildId,
|
||||
@Nullable String cronetVersion,
|
||||
String clientVersion,
|
||||
boolean canLogin,
|
||||
boolean requiresAuth,
|
||||
boolean useAuth,
|
||||
String friendlyName) {
|
||||
this.id = id;
|
||||
this.clientName = clientName;
|
||||
this.packageName = packageName;
|
||||
this.deviceMake = deviceMake;
|
||||
this.deviceModel = deviceModel;
|
||||
this.osName = osName;
|
||||
this.osVersion = osVersion;
|
||||
this.userAgent = userAgent;
|
||||
this.androidSdkVersion = androidSdkVersion;
|
||||
this.buildId = buildId;
|
||||
this.cronetVersion = cronetVersion;
|
||||
this.clientVersion = clientVersion;
|
||||
this.canLogin = canLogin;
|
||||
this.requiresAuth = requiresAuth;
|
||||
this.useAuth = useAuth;
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -77,9 +77,9 @@ public class SpoofVideoStreamsPatch {
|
||||
String path = originalUri.getPath();
|
||||
|
||||
if (path != null && path.contains("initplayback")) {
|
||||
Logger.printDebug(() -> "Blocking 'initplayback' by returning unreachable url");
|
||||
Logger.printDebug(() -> "Blocking 'initplayback' by clearing query");
|
||||
|
||||
return UNREACHABLE_HOST_URI_STRING;
|
||||
return originalUri.buildUpon().clearQuery().build().toString();
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "blockInitPlaybackRequest failure", ex);
|
||||
@@ -115,20 +115,27 @@ public class SpoofVideoStreamsPatch {
|
||||
try {
|
||||
Uri uri = Uri.parse(url);
|
||||
String path = uri.getPath();
|
||||
if (path == null || !path.contains("player")) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 'get_drm_license' has no video id and appears to happen when waiting for a paid video to start.
|
||||
// 'heartbeat' has no video id and appears to be only after playback has started.
|
||||
// 'refresh' has no video id and appears to happen when waiting for a livestream to start.
|
||||
if (path != null && path.contains("player") && !path.contains("heartbeat")
|
||||
&& !path.contains("refresh")) {
|
||||
String id = uri.getQueryParameter("id");
|
||||
if (id == null) {
|
||||
Logger.printException(() -> "Ignoring request that has no video id." +
|
||||
" Url: " + url + " headers: " + requestHeaders);
|
||||
return;
|
||||
}
|
||||
|
||||
StreamingDataRequest.fetchRequest(id, requestHeaders);
|
||||
// 'ad_break' has no video id.
|
||||
if (path.contains("get_drm_license") || path.contains("heartbeat")
|
||||
|| path.contains("refresh") || path.contains("ad_break")) {
|
||||
Logger.printDebug(() -> "Ignoring path: " + path);
|
||||
return;
|
||||
}
|
||||
|
||||
String id = uri.getQueryParameter("id");
|
||||
if (id == null) {
|
||||
Logger.printException(() -> "Ignoring request with no id: " + url);
|
||||
return;
|
||||
}
|
||||
|
||||
StreamingDataRequest.fetchRequest(id, requestHeaders);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "buildRequest failure", ex);
|
||||
}
|
||||
@@ -215,8 +222,8 @@ public class SpoofVideoStreamsPatch {
|
||||
public static final class AudioStreamLanguageOverrideAvailability implements Setting.Availability {
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
return !BaseSettings.SPOOF_VIDEO_STREAMS.get()
|
||||
|| BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.ANDROID_VR_NO_AUTH;
|
||||
return BaseSettings.SPOOF_VIDEO_STREAMS.get()
|
||||
&& BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.ANDROID_VR_NO_AUTH;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,12 +5,12 @@ import org.json.JSONObject;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.util.Locale;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.requests.Requester;
|
||||
import app.revanced.extension.shared.requests.Route;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.shared.spoof.AudioStreamLanguage;
|
||||
import app.revanced.extension.shared.spoof.ClientType;
|
||||
|
||||
final class PlayerRoutes {
|
||||
@@ -31,7 +31,7 @@ final class PlayerRoutes {
|
||||
private PlayerRoutes() {
|
||||
}
|
||||
|
||||
static String createInnertubeBody(ClientType clientType) {
|
||||
static String createInnertubeBody(ClientType clientType, String videoId) {
|
||||
JSONObject innerTubeBody = new JSONObject();
|
||||
|
||||
try {
|
||||
@@ -42,25 +42,28 @@ final class PlayerRoutes {
|
||||
// but if this is a fall over client it will set the language even though
|
||||
// the audio language is not selectable in the UI.
|
||||
ClientType userSelectedClient = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
|
||||
AudioStreamLanguage language = userSelectedClient == ClientType.ANDROID_VR_NO_AUTH
|
||||
? BaseSettings.SPOOF_VIDEO_STREAMS_LANGUAGE.get()
|
||||
: AudioStreamLanguage.DEFAULT;
|
||||
Locale streamLocale = userSelectedClient == ClientType.ANDROID_VR_NO_AUTH
|
||||
? BaseSettings.SPOOF_VIDEO_STREAMS_LANGUAGE.get().getLocale()
|
||||
: Locale.getDefault();
|
||||
|
||||
JSONObject client = new JSONObject();
|
||||
client.put("hl", language.getLanguage());
|
||||
client.put("deviceMake", clientType.deviceMake);
|
||||
client.put("deviceModel", clientType.deviceModel);
|
||||
client.put("clientName", clientType.clientName);
|
||||
client.put("clientVersion", clientType.clientVersion);
|
||||
client.put("deviceModel", clientType.deviceModel);
|
||||
client.put("osName", clientType.osName);
|
||||
client.put("osVersion", clientType.osVersion);
|
||||
if (clientType.androidSdkVersion != null) {
|
||||
client.put("androidSdkVersion", clientType.androidSdkVersion);
|
||||
}
|
||||
client.put("hl", streamLocale.getLanguage());
|
||||
client.put("gl", streamLocale.getCountry());
|
||||
context.put("client", client);
|
||||
|
||||
innerTubeBody.put("context", context);
|
||||
innerTubeBody.put("contentCheckOk", true);
|
||||
innerTubeBody.put("racyCheckOk", true);
|
||||
innerTubeBody.put("videoId", "%s");
|
||||
innerTubeBody.put("videoId", videoId);
|
||||
} catch (JSONException e) {
|
||||
Logger.printException(() -> "Failed to create innerTubeBody", e);
|
||||
}
|
||||
@@ -76,6 +79,9 @@ final class PlayerRoutes {
|
||||
|
||||
connection.setRequestProperty("Content-Type", "application/json");
|
||||
connection.setRequestProperty("User-Agent", clientType.userAgent);
|
||||
// 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.setDoOutput(true);
|
||||
|
||||
@@ -120,7 +120,8 @@ public class StreamingDataRequest {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static HttpURLConnection send(ClientType clientType, String videoId,
|
||||
private static HttpURLConnection send(ClientType clientType,
|
||||
String videoId,
|
||||
Map<String, String> playerHeaders,
|
||||
boolean showErrorToasts) {
|
||||
Objects.requireNonNull(clientType);
|
||||
@@ -128,21 +129,24 @@ public class StreamingDataRequest {
|
||||
Objects.requireNonNull(playerHeaders);
|
||||
|
||||
final long startTime = System.currentTimeMillis();
|
||||
Logger.printDebug(() -> "Fetching video streams for: " + videoId + " using client: " + clientType);
|
||||
|
||||
try {
|
||||
HttpURLConnection connection = PlayerRoutes.getPlayerResponseConnectionFromRoute(GET_STREAMING_DATA, clientType);
|
||||
connection.setConnectTimeout(HTTP_TIMEOUT_MILLISECONDS);
|
||||
connection.setReadTimeout(HTTP_TIMEOUT_MILLISECONDS);
|
||||
|
||||
boolean authHeadersIncludes = false;
|
||||
|
||||
for (String key : REQUEST_HEADER_KEYS) {
|
||||
String value = playerHeaders.get(key);
|
||||
|
||||
if (value != null) {
|
||||
if (key.equals(AUTHORIZATION_HEADER)) {
|
||||
if (!clientType.canLogin) {
|
||||
if (!clientType.useAuth) {
|
||||
Logger.printDebug(() -> "Not including request header: " + key);
|
||||
continue;
|
||||
}
|
||||
authHeadersIncludes = true;
|
||||
}
|
||||
|
||||
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);
|
||||
connection.setFixedLengthStreamingMode(requestBody.length);
|
||||
connection.getOutputStream().write(requestBody);
|
||||
@@ -191,8 +203,8 @@ public class StreamingDataRequest {
|
||||
// gzip encoding doesn't response with content length (-1),
|
||||
// but empty response body does.
|
||||
if (connection.getContentLength() == 0) {
|
||||
if (BaseSettings.DEBUG.get()) {
|
||||
Logger.printException(() -> "Ignoring empty client: " + clientType);
|
||||
if (BaseSettings.DEBUG.get() && BaseSettings.DEBUG_TOAST_ON_ERROR.get()) {
|
||||
Utils.showToastShort("Ignoring empty spoof stream client: " + clientType);
|
||||
}
|
||||
} else {
|
||||
try (InputStream inputStream = new BufferedInputStream(connection.getInputStream());
|
||||
|
||||
@@ -4,7 +4,7 @@ plugins {
|
||||
|
||||
android {
|
||||
namespace = "app.revanced.extension"
|
||||
compileSdk = 33
|
||||
compileSdk = 34
|
||||
|
||||
defaultConfig {
|
||||
minSdk = 24
|
||||
|
||||
@@ -3,3 +3,14 @@ dependencies {
|
||||
compileOnly(project(":extensions:tiktok:stub"))
|
||||
compileOnly(libs.annotation)
|
||||
}
|
||||
|
||||
android {
|
||||
defaultConfig {
|
||||
minSdk = 22
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,9 +21,11 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
||||
protected void syncSettingWithPreference(@NonNull Preference pref,
|
||||
@NonNull Setting<?> setting,
|
||||
boolean applySettingToPreference) {
|
||||
if (pref instanceof RangeValuePreference rangeValuePref) {
|
||||
if (pref instanceof RangeValuePreference) {
|
||||
RangeValuePreference rangeValuePref = (RangeValuePreference) pref;
|
||||
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());
|
||||
} else {
|
||||
super.syncSettingWithPreference(pref, setting, applySettingToPreference);
|
||||
@@ -32,7 +34,7 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
||||
|
||||
@Override
|
||||
protected void initialize() {
|
||||
final var context = getContext();
|
||||
final var context = getActivity();
|
||||
|
||||
// Currently no resources can be compiled for TikTok (fails with aapt error).
|
||||
// So all TikTok Strings are hard coded in the extension.
|
||||
|
||||
@@ -4,14 +4,9 @@ plugins {
|
||||
|
||||
android {
|
||||
namespace = "app.revanced.extension"
|
||||
compileSdk = 33
|
||||
compileSdk = 34
|
||||
|
||||
defaultConfig {
|
||||
minSdk = 24
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
minSdk = 22
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
dependencies {
|
||||
compileOnly(project(":extensions:tumblr:stub"))
|
||||
}
|
||||
|
||||
android {
|
||||
defaultConfig {
|
||||
minSdk = 26
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,14 @@
|
||||
android.namespace = "app.revanced.extension"
|
||||
|
||||
plugins {
|
||||
id(libs.plugins.android.library.get().pluginId)
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "app.revanced.extension"
|
||||
compileSdk = 33
|
||||
compileSdk = 34
|
||||
|
||||
defaultConfig {
|
||||
minSdk = 24
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
minSdk = 26
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,3 +6,14 @@ dependencies {
|
||||
compileOnly(libs.annotation)
|
||||
compileOnly(libs.appcompat)
|
||||
}
|
||||
|
||||
android {
|
||||
defaultConfig {
|
||||
minSdk = 21
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,14 +4,9 @@ plugins {
|
||||
|
||||
android {
|
||||
namespace = "app.revanced.extension"
|
||||
compileSdk = 33
|
||||
compileSdk = 34
|
||||
|
||||
defaultConfig {
|
||||
minSdk = 24
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
minSdk = 21
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
//noinspection GradleDependency
|
||||
android.compileSdk = 33
|
||||
|
||||
dependencies {
|
||||
compileOnly(project(":extensions:shared:library"))
|
||||
compileOnly(project(":extensions:youtube:stub"))
|
||||
compileOnly(libs.annotation)
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdk = 33 // TODO: Update Swipe controls code to allow updating this to the latest sdk.
|
||||
|
||||
defaultConfig {
|
||||
minSdk = 26
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,4 +90,12 @@ public class ThemeHelper {
|
||||
public static int getForegroundColor() {
|
||||
return isDarkTheme() ? getLightThemeColor() : getDarkThemeColor();
|
||||
}
|
||||
|
||||
public static int getToolbarBackgroundColor() {
|
||||
final String colorName = isDarkTheme()
|
||||
? "yt_black3"
|
||||
: "yt_white1";
|
||||
|
||||
return getColorInt(colorName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,21 +23,30 @@ public final class ChangeStartPagePatch {
|
||||
/**
|
||||
* Browse id.
|
||||
*/
|
||||
ALL_SUBSCRIPTIONS("FEchannels", TRUE),
|
||||
BROWSE("FEguide_builder", TRUE),
|
||||
EXPLORE("FEexplore", TRUE),
|
||||
HISTORY("FEhistory", TRUE),
|
||||
LIBRARY("FElibrary", TRUE),
|
||||
MOVIE("FEstorefront", TRUE),
|
||||
NOTIFICATIONS("FEactivity", TRUE),
|
||||
PLAYLISTS("FEplaylist_aggregation", TRUE),
|
||||
SUBSCRIPTIONS("FEsubscriptions", TRUE),
|
||||
TRENDING("FEtrending", TRUE),
|
||||
YOUR_CLIPS("FEclips", TRUE),
|
||||
|
||||
/**
|
||||
* Channel id, this can be used as a browseId.
|
||||
*/
|
||||
COURSES("UCtFRv9O2AHqOZjjynzrv-xg", TRUE),
|
||||
FASHION("UCrpQ4p1Ql_hG8rKXIKM1MOQ", TRUE),
|
||||
GAMING("UCOpNcN46UbXVtpKMrmU4Abg", TRUE),
|
||||
LIVE("UC4R8DWoMoI7CAwX8_LjQHig", TRUE),
|
||||
MUSIC("UC-9-kyTW8ZkZNDHQJ6FgpwQ", TRUE),
|
||||
NEWS("UCYfdidRxbB8Qhf0Nx7ioOYw", TRUE),
|
||||
SHOPPING("UCkYQyvc_i9hXEo4xic9Hh2g", TRUE),
|
||||
SPORTS("UCEgdi0XIXXZ-qJOFPf4JSKw", TRUE),
|
||||
VIRTUAL_REALITY("UCzuqhhs6NWbgTzMuM09WKDQ", TRUE),
|
||||
|
||||
/**
|
||||
* 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),
|
||||
SHORTS("com.google.android.youtube.action.open.shorts", FALSE);
|
||||
|
||||
@Nullable
|
||||
final Boolean isBrowseId;
|
||||
|
||||
@NonNull
|
||||
final String id;
|
||||
|
||||
@Nullable
|
||||
final Boolean isBrowseId;
|
||||
|
||||
StartPage(@NonNull String id, @Nullable Boolean isBrowseId) {
|
||||
this.id = id;
|
||||
this.isBrowseId = isBrowseId;
|
||||
@@ -122,7 +131,7 @@ public final class ChangeStartPagePatch {
|
||||
}
|
||||
appLaunched = true;
|
||||
|
||||
final String intentAction = START_PAGE.id;
|
||||
String intentAction = START_PAGE.id;
|
||||
Logger.printDebug(() -> "Changing intent action to " + intentAction);
|
||||
intent.setAction(intentAction);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,14 +9,23 @@ import app.revanced.extension.shared.settings.BaseSettings;
|
||||
@SuppressWarnings("unused")
|
||||
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.
|
||||
*/
|
||||
public static boolean isBooleanFeatureFlagEnabled(boolean value, long flag) {
|
||||
if (value && BaseSettings.DEBUG.get()) {
|
||||
if (LOG_FEATURE_FLAGS && value) {
|
||||
if (featureFlags.putIfAbsent(flag, true) == null) {
|
||||
Logger.printDebug(() -> "boolean feature is enabled: " + flag);
|
||||
}
|
||||
@@ -29,7 +38,7 @@ public final class EnableDebuggingPatch {
|
||||
* Injection point.
|
||||
*/
|
||||
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) {
|
||||
// Align the log outputs to make post processing easier.
|
||||
Logger.printDebug(() -> " double feature is enabled: " + flag
|
||||
@@ -44,7 +53,7 @@ public final class EnableDebuggingPatch {
|
||||
* Injection point.
|
||||
*/
|
||||
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) {
|
||||
Logger.printDebug(() -> " long feature is enabled: " + flag
|
||||
+ " value: " + value + (defaultValue == 0 ? "" : " default: " + defaultValue));
|
||||
@@ -58,7 +67,7 @@ public final class EnableDebuggingPatch {
|
||||
* Injection point.
|
||||
*/
|
||||
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) {
|
||||
Logger.printDebug(() -> " string feature is enabled: " + flag
|
||||
+ " value: " + value + (defaultValue.isEmpty() ? "" : " default: " + defaultValue));
|
||||
|
||||
@@ -49,7 +49,10 @@ public class ExitFullscreenPatch {
|
||||
Logger.printDebug(() -> "Fullscreen button is null, cannot click");
|
||||
} else {
|
||||
Logger.printDebug(() -> "Clicking fullscreen button");
|
||||
final boolean soundEffectsEnabled = button.isSoundEffectsEnabled();
|
||||
button.setSoundEffectsEnabled(false);
|
||||
button.performClick();
|
||||
button.setSoundEffectsEnabled(soundEffectsEnabled);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import static app.revanced.extension.youtube.returnyoutubedislike.ReturnYouTubeD
|
||||
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.ShapeDrawable;
|
||||
import android.os.Build;
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableString;
|
||||
import android.text.Spanned;
|
||||
@@ -366,9 +365,7 @@ public class ReturnYouTubeDislikePatch {
|
||||
private static final List<WeakReference<TextView>> shortsTextViewRefs = new ArrayList<>();
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -5,10 +5,13 @@ import app.revanced.extension.youtube.settings.Settings;
|
||||
@SuppressWarnings("unused")
|
||||
public class VideoAdsPatch {
|
||||
|
||||
// Used by app.revanced.patches.youtube.ad.general.video.patch.VideoAdsPatch
|
||||
// depends on Whitelist patch (still needs to be written)
|
||||
private static final boolean SHOW_VIDEO_ADS = !Settings.HIDE_VIDEO_ADS.get();
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static boolean shouldShowAds() {
|
||||
return !Settings.HIDE_VIDEO_ADS.get(); // TODO && Whitelist.shouldShowAds();
|
||||
return SHOW_VIDEO_ADS;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -8,10 +8,12 @@ import android.view.View;
|
||||
|
||||
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.Utils;
|
||||
import app.revanced.extension.youtube.StringTrieSearch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public final class AdsFilter extends Filter {
|
||||
@@ -22,6 +24,11 @@ public final class AdsFilter extends Filter {
|
||||
|
||||
// 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 StringFilterGroup playerShoppingShelf;
|
||||
@@ -66,7 +73,9 @@ public final class AdsFilter extends Filter {
|
||||
"full_width_square_image_layout",
|
||||
"video_display_button_group_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(
|
||||
@@ -112,23 +121,24 @@ public final class AdsFilter extends Filter {
|
||||
"expandable_list"
|
||||
);
|
||||
|
||||
channelProfile = new StringFilterGroup(
|
||||
null,
|
||||
"channel_profile.eml"
|
||||
);
|
||||
|
||||
playerShoppingShelf = new StringFilterGroup(
|
||||
null,
|
||||
Settings.HIDE_PLAYER_STORE_SHELF,
|
||||
"horizontal_shelf.eml"
|
||||
);
|
||||
|
||||
playerShoppingShelfBuffer = new ByteArrayFilterGroup(
|
||||
Settings.HIDE_PLAYER_STORE_SHELF,
|
||||
null,
|
||||
"shopping_item_card_list.eml"
|
||||
);
|
||||
|
||||
visitStoreButton = new ByteArrayFilterGroup(
|
||||
channelProfile = new StringFilterGroup(
|
||||
Settings.HIDE_VISIT_STORE_BUTTON,
|
||||
"channel_profile.eml",
|
||||
"page_header.eml"
|
||||
);
|
||||
|
||||
visitStoreButton = new ByteArrayFilterGroup(
|
||||
null,
|
||||
"header_store_button"
|
||||
);
|
||||
|
||||
@@ -172,6 +182,11 @@ public final class AdsFilter extends Filter {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check for the index because of likelihood of false positives.
|
||||
if (matchedGroup == shoppingLinks && contentIndex != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (exceptions.matches(path))
|
||||
return false;
|
||||
|
||||
@@ -188,13 +203,25 @@ public final class AdsFilter extends Filter {
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
|
||||
@@ -45,6 +45,11 @@ final class DescriptionComponentsFilter extends Filter {
|
||||
"transcript_section"
|
||||
);
|
||||
|
||||
final StringFilterGroup howThisWasMadeSection = new StringFilterGroup(
|
||||
Settings.HIDE_HOW_THIS_WAS_MADE_SECTION,
|
||||
"how_this_was_made_section"
|
||||
);
|
||||
|
||||
macroMarkersCarousel = new StringFilterGroup(
|
||||
null,
|
||||
"macro_markers_carousel.eml"
|
||||
@@ -64,6 +69,7 @@ final class DescriptionComponentsFilter extends Filter {
|
||||
addPathCallbacks(
|
||||
attributesSection,
|
||||
infoCardsSection,
|
||||
howThisWasMadeSection,
|
||||
podcastSection,
|
||||
transcriptSection,
|
||||
macroMarkersCarousel
|
||||
|
||||
@@ -80,7 +80,9 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
"images_post_root_slim.eml",
|
||||
"text_post_root_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(
|
||||
@@ -106,7 +108,8 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
inFeedSurvey = new StringFilterGroup(
|
||||
Settings.HIDE_FEED_SURVEY,
|
||||
"in_feed_survey",
|
||||
"slimline_survey"
|
||||
"slimline_survey",
|
||||
"feed_nudge"
|
||||
);
|
||||
|
||||
final var medicalPanel = new StringFilterGroup(
|
||||
|
||||
@@ -32,6 +32,11 @@ public class CustomPlaybackSpeedPatch {
|
||||
*/
|
||||
public static final float PLAYBACK_SPEED_MAXIMUM = 8;
|
||||
|
||||
/**
|
||||
* Tap and hold speed.
|
||||
*/
|
||||
private static final float TAP_AND_HOLD_SPEED;
|
||||
|
||||
/**
|
||||
* Custom playback speeds.
|
||||
*/
|
||||
@@ -48,12 +53,27 @@ public class CustomPlaybackSpeedPatch {
|
||||
private static String[] preferenceListEntries, preferenceListEntryValues;
|
||||
|
||||
static {
|
||||
final float holdSpeed = Settings.SPEED_TAP_AND_HOLD.get();
|
||||
if (holdSpeed > 0 && holdSpeed <= PLAYBACK_SPEED_MAXIMUM) {
|
||||
TAP_AND_HOLD_SPEED = holdSpeed;
|
||||
} else {
|
||||
showInvalidCustomSpeedToast();
|
||||
Settings.SPEED_TAP_AND_HOLD.resetToDefault();
|
||||
TAP_AND_HOLD_SPEED = Settings.SPEED_TAP_AND_HOLD.get();
|
||||
}
|
||||
|
||||
loadCustomSpeeds();
|
||||
}
|
||||
|
||||
private static void resetCustomSpeeds(@NonNull String toastMessage) {
|
||||
Utils.showToastLong(toastMessage);
|
||||
Settings.CUSTOM_PLAYBACK_SPEEDS.resetToDefault();
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static float tapAndHoldSpeed() {
|
||||
return TAP_AND_HOLD_SPEED;
|
||||
}
|
||||
|
||||
private static void showInvalidCustomSpeedToast() {
|
||||
Utils.showToastLong(str("revanced_custom_playback_speeds_invalid", PLAYBACK_SPEED_MAXIMUM));
|
||||
}
|
||||
|
||||
private static void loadCustomSpeeds() {
|
||||
@@ -74,17 +94,18 @@ public class CustomPlaybackSpeedPatch {
|
||||
}
|
||||
|
||||
if (speedFloat >= PLAYBACK_SPEED_MAXIMUM) {
|
||||
resetCustomSpeeds(str("revanced_custom_playback_speeds_invalid", PLAYBACK_SPEED_MAXIMUM));
|
||||
showInvalidCustomSpeedToast();
|
||||
Settings.CUSTOM_PLAYBACK_SPEEDS.resetToDefault();
|
||||
loadCustomSpeeds();
|
||||
return;
|
||||
}
|
||||
|
||||
customPlaybackSpeeds[i] = speedFloat;
|
||||
i++;
|
||||
customPlaybackSpeeds[i++] = speedFloat;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
Logger.printInfo(() -> "parse error", ex);
|
||||
resetCustomSpeeds(str("revanced_custom_playback_speeds_parse_exception"));
|
||||
Utils.showToastLong(str("revanced_custom_playback_speeds_parse_exception"));
|
||||
Settings.CUSTOM_PLAYBACK_SPEEDS.resetToDefault();
|
||||
loadCustomSpeeds();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,11 +6,19 @@ import android.content.res.Resources;
|
||||
import android.graphics.Color;
|
||||
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.Locale;
|
||||
import java.util.Scanner;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@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 HIDE_SEEKBAR_THUMBNAIL_ENABLED = Settings.HIDE_SEEKBAR_THUMBNAIL.get();
|
||||
|
||||
/**
|
||||
* Default color of the litho seekbar.
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* 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.
|
||||
@@ -41,16 +56,21 @@ public final class SeekbarColorPatch {
|
||||
|
||||
/**
|
||||
* 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}.
|
||||
*/
|
||||
private static int seekbarColor = ORIGINAL_SEEKBAR_COLOR;
|
||||
private static int customSeekbarColor = ORIGINAL_SEEKBAR_COLOR;
|
||||
|
||||
/**
|
||||
* Custom seekbar hue, saturation, and brightness values.
|
||||
*/
|
||||
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 {
|
||||
float[] hsv = new float[3];
|
||||
Color.colorToHSV(ORIGINAL_SEEKBAR_COLOR, hsv);
|
||||
@@ -63,37 +83,22 @@ public final class SeekbarColorPatch {
|
||||
|
||||
private static void loadCustomSeekbarColor() {
|
||||
try {
|
||||
seekbarColor = Color.parseColor(Settings.SEEKBAR_CUSTOM_COLOR_VALUE.get());
|
||||
Color.colorToHSV(seekbarColor, customSeekbarColorHSV);
|
||||
customSeekbarColor = Color.parseColor(Settings.SEEKBAR_CUSTOM_COLOR_PRIMARY.get());
|
||||
Color.colorToHSV(customSeekbarColor, customSeekbarColorHSV);
|
||||
|
||||
customSeekbarColorGradient[0] = customSeekbarColor;
|
||||
customSeekbarColorGradient[1] = Color.parseColor(Settings.SEEKBAR_CUSTOM_COLOR_ACCENT.get());
|
||||
} catch (Exception ex) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
public static int getSeekbarColor() {
|
||||
return seekbarColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
return customSeekbarColor;
|
||||
}
|
||||
|
||||
private static int colorChannelTo3Bits(int channel8Bits) {
|
||||
@@ -119,6 +124,17 @@ public final class SeekbarColorPatch {
|
||||
/**
|
||||
* 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) {
|
||||
// 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
|
||||
@@ -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),
|
||||
// a color filter still cannot be selectively applied when the drawable has more than 1 color.
|
||||
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);
|
||||
|
||||
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.
|
||||
*
|
||||
@@ -156,35 +252,61 @@ public final class SeekbarColorPatch {
|
||||
*/
|
||||
public static int getLithoColor(int colorValue) {
|
||||
if (colorValue == ORIGINAL_SEEKBAR_COLOR) {
|
||||
if (Settings.HIDE_SEEKBAR_THUMBNAIL.get()) {
|
||||
return 0x00000000;
|
||||
if (HIDE_SEEKBAR_THUMBNAIL_ENABLED) {
|
||||
return 0x0;
|
||||
}
|
||||
|
||||
return getSeekbarColorValue(ORIGINAL_SEEKBAR_COLOR);
|
||||
return customSeekbarColor;
|
||||
}
|
||||
|
||||
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.
|
||||
*/
|
||||
public static void setLinearGradient(int[] colors, float[] positions) {
|
||||
final boolean hideSeekbar = Settings.HIDE_SEEKBAR_THUMBNAIL.get();
|
||||
public static int[] getPlayerLinearGradient(int[] original) {
|
||||
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,
|
||||
// so must only change if the values are those for the seekbar.
|
||||
if (Arrays.equals(ORIGINAL_SEEKBAR_GRADIENT_COLORS, colors)
|
||||
&& Arrays.equals(ORIGINAL_SEEKBAR_GRADIENT_POSITIONS, positions)) {
|
||||
Arrays.fill(colors, hideSeekbar
|
||||
? 0x00000000
|
||||
: seekbarColor);
|
||||
return;
|
||||
if ((Arrays.equals(FEED_ORIGINAL_SEEKBAR_GRADIENT_COLORS, colors)
|
||||
&& Arrays.equals(FEED_ORIGINAL_SEEKBAR_GRADIENT_POSITIONS, positions))) {
|
||||
return HIDE_SEEKBAR_THUMBNAIL_ENABLED
|
||||
? HIDDEN_SEEKBAR_GRADIENT_COLORS
|
||||
: customSeekbarColorGradient;
|
||||
}
|
||||
|
||||
Logger.printDebug(() -> "Ignoring gradient colors: " + Arrays.toString(colors)
|
||||
Logger.printDebug(() -> "Ignoring gradient colors: " + colorArrayToHex(colors)
|
||||
+ " positions: " + Arrays.toString(positions));
|
||||
}
|
||||
|
||||
return colors;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -198,7 +320,7 @@ public final class SeekbarColorPatch {
|
||||
}
|
||||
|
||||
return colorValue == ORIGINAL_SEEKBAR_COLOR
|
||||
? getSeekbarColorValue(ORIGINAL_SEEKBAR_COLOR)
|
||||
? customSeekbarColor
|
||||
: colorValue;
|
||||
}
|
||||
|
||||
@@ -208,11 +330,9 @@ public final class SeekbarColorPatch {
|
||||
* Overrides color used for the video player seekbar.
|
||||
*/
|
||||
public static int getVideoPlayerSeekbarColor(int originalColor) {
|
||||
if (!SEEKBAR_CUSTOM_COLOR_ENABLED) {
|
||||
return originalColor;
|
||||
}
|
||||
|
||||
return getSeekbarColorValue(originalColor);
|
||||
return SEEKBAR_CUSTOM_COLOR_ENABLED
|
||||
? getSeekbarColorValue(originalColor)
|
||||
: originalColor;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -221,10 +341,6 @@ public final class SeekbarColorPatch {
|
||||
*/
|
||||
private static int getSeekbarColorValue(int originalColor) {
|
||||
try {
|
||||
if (!SEEKBAR_CUSTOM_COLOR_ENABLED || originalColor == seekbarColor) {
|
||||
return originalColor; // nothing to do
|
||||
}
|
||||
|
||||
final int alphaDifference = Color.alpha(originalColor) - Color.alpha(ORIGINAL_SEEKBAR_COLOR);
|
||||
|
||||
// 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[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);
|
||||
Logger.printDebug(() -> String.format("Original color: #%08X replacement color: #%08X",
|
||||
originalColor, replacementColor));
|
||||
|
||||
@@ -346,56 +346,49 @@ public class ReturnYouTubeDislike {
|
||||
}
|
||||
|
||||
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
|
||||
if (dislikeCountFormatter == null) {
|
||||
Locale locale = Objects.requireNonNull(Utils.getContext()).getResources().getConfiguration().locale;
|
||||
dislikeCountFormatter = CompactDecimalFormat.getInstance(locale, CompactDecimalFormat.CompactStyle.SHORT);
|
||||
synchronized (ReturnYouTubeDislike.class) { // number formatter is not thread safe, must synchronize
|
||||
if (dislikeCountFormatter == null) {
|
||||
Locale locale = Objects.requireNonNull(Utils.getContext()).getResources().getConfiguration().locale;
|
||||
dislikeCountFormatter = CompactDecimalFormat.getInstance(locale, CompactDecimalFormat.CompactStyle.SHORT);
|
||||
|
||||
// YouTube disregards locale specific number characters
|
||||
// and instead shows english number characters everywhere.
|
||||
// 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 "۱,۲۳٤"
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||
DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale);
|
||||
symbols.setDigitStrings(DecimalFormatSymbols.getInstance(Locale.ENGLISH).getDigitStrings());
|
||||
dislikeCountFormatter.setDecimalFormatSymbols(symbols);
|
||||
}
|
||||
// YouTube disregards locale specific number characters
|
||||
// and instead shows english number characters everywhere.
|
||||
// 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 "۱,۲۳٤"
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||
DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale);
|
||||
symbols.setDigitStrings(DecimalFormatSymbols.getInstance(Locale.ENGLISH).getDigitStrings());
|
||||
dislikeCountFormatter.setDecimalFormatSymbols(symbols);
|
||||
}
|
||||
return dislikeCountFormatter.format(dislikeCount);
|
||||
}
|
||||
}
|
||||
|
||||
// Will never be reached, as the oldest supported YouTube app requires Android N or greater.
|
||||
return String.valueOf(dislikeCount);
|
||||
return dislikeCountFormatter.format(dislikeCount);
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
if (dislikePercentageFormatter == null) {
|
||||
Locale locale = Objects.requireNonNull(Utils.getContext()).getResources().getConfiguration().locale;
|
||||
dislikePercentageFormatter = NumberFormat.getPercentInstance(locale);
|
||||
synchronized (ReturnYouTubeDislike.class) { // Number formatter is not thread safe, must synchronize.
|
||||
if (dislikePercentageFormatter == null) {
|
||||
Locale locale = Objects.requireNonNull(Utils.getContext()).getResources().getConfiguration().locale;
|
||||
dislikePercentageFormatter = NumberFormat.getPercentInstance(locale);
|
||||
|
||||
// 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
|
||||
&& dislikePercentageFormatter instanceof DecimalFormat) {
|
||||
DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale);
|
||||
symbols.setDigitStrings(DecimalFormatSymbols.getInstance(Locale.ENGLISH).getDigitStrings());
|
||||
((DecimalFormat) dislikePercentageFormatter).setDecimalFormatSymbols(symbols);
|
||||
}
|
||||
// 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
|
||||
&& dislikePercentageFormatter instanceof DecimalFormat) {
|
||||
DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale);
|
||||
symbols.setDigitStrings(DecimalFormatSymbols.getInstance(Locale.ENGLISH).getDigitStrings());
|
||||
((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.
|
||||
return String.valueOf((int) (dislikePercentage * 100));
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -403,15 +396,13 @@ public class ReturnYouTubeDislike {
|
||||
Objects.requireNonNull(videoId);
|
||||
synchronized (fetchCache) {
|
||||
// Remove any expired entries.
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
final long now = System.currentTimeMillis();
|
||||
fetchCache.values().removeIf(value -> {
|
||||
final boolean expired = value.isExpired(now);
|
||||
if (expired)
|
||||
Logger.printDebug(() -> "Removing expired fetch: " + value.videoId);
|
||||
return expired;
|
||||
});
|
||||
}
|
||||
final long now = System.currentTimeMillis();
|
||||
fetchCache.values().removeIf(value -> {
|
||||
final boolean expired = value.isExpired(now);
|
||||
if (expired)
|
||||
Logger.printDebug(() -> "Removing expired fetch: " + value.videoId);
|
||||
return expired;
|
||||
});
|
||||
|
||||
ReturnYouTubeDislike fetch = fetchCache.get(videoId);
|
||||
if (fetch == null) {
|
||||
|
||||
@@ -1,21 +1,30 @@
|
||||
package app.revanced.extension.youtube.settings;
|
||||
|
||||
import static app.revanced.extension.shared.Utils.getResourceIdentifier;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.preference.PreferenceFragment;
|
||||
import android.util.TypedValue;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.TextView;
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.youtube.ThemeHelper;
|
||||
import app.revanced.extension.youtube.settings.preference.ReVancedPreferenceFragment;
|
||||
import app.revanced.extension.youtube.settings.preference.ReturnYouTubeDislikePreferenceFragment;
|
||||
import app.revanced.extension.youtube.settings.preference.SponsorBlockPreferenceFragment;
|
||||
import android.widget.Toolbar;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import static app.revanced.extension.shared.Utils.getChildView;
|
||||
import static app.revanced.extension.shared.Utils.getResourceIdentifier;
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.AppLanguage;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
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.ReturnYouTubeDislikePreferenceFragment;
|
||||
import app.revanced.extension.youtube.settings.preference.SponsorBlockPreferenceFragment;
|
||||
|
||||
/**
|
||||
* Hooks LicenseActivity.
|
||||
@@ -25,17 +34,57 @@ import static app.revanced.extension.shared.Utils.getResourceIdentifier;
|
||||
@SuppressWarnings("unused")
|
||||
public class LicenseActivityHook {
|
||||
|
||||
private static ViewGroup.LayoutParams toolbarLayoutParams;
|
||||
|
||||
public static void setToolbarLayoutParams(Toolbar toolbar) {
|
||||
if (toolbarLayoutParams != null) {
|
||||
toolbar.setLayoutParams(toolbarLayoutParams);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
* Overrides the ReVanced settings language.
|
||||
*/
|
||||
public static Context getAttachBaseContext(Context original) {
|
||||
AppLanguage language = BaseSettings.REVANCED_LANGUAGE.get();
|
||||
if (language == AppLanguage.DEFAULT) {
|
||||
return original;
|
||||
}
|
||||
|
||||
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.
|
||||
* <p>
|
||||
* Hooks LicenseActivity#onCreate in order to inject our own fragment.
|
||||
*/
|
||||
@RequiresApi(api = Build.VERSION_CODES.N)
|
||||
public static void initialize(Activity licenseActivity) {
|
||||
try {
|
||||
ThemeHelper.setActivityTheme(licenseActivity);
|
||||
licenseActivity.setContentView(
|
||||
getResourceIdentifier("revanced_settings_with_toolbar", "layout"));
|
||||
setBackButton(licenseActivity);
|
||||
licenseActivity.setContentView(getResourceIdentifier(
|
||||
"revanced_settings_with_toolbar", "layout"));
|
||||
|
||||
PreferenceFragment fragment;
|
||||
String toolbarTitleResourceName;
|
||||
@@ -58,7 +107,7 @@ public class LicenseActivityHook {
|
||||
return;
|
||||
}
|
||||
|
||||
setToolbarTitle(licenseActivity, toolbarTitleResourceName);
|
||||
createToolbar(licenseActivity, toolbarTitleResourceName);
|
||||
|
||||
//noinspection deprecation
|
||||
licenseActivity.getFragmentManager()
|
||||
@@ -70,28 +119,36 @@ public class LicenseActivityHook {
|
||||
}
|
||||
}
|
||||
|
||||
private static void setToolbarTitle(Activity activity, String toolbarTitleResourceName) {
|
||||
ViewGroup toolbar = activity.findViewById(getToolbarResourceId());
|
||||
TextView toolbarTextView = Objects.requireNonNull(getChildView(toolbar, false,
|
||||
view -> view instanceof TextView));
|
||||
toolbarTextView.setText(getResourceIdentifier(toolbarTitleResourceName, "string"));
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.N)
|
||||
@SuppressLint("UseCompatLoadingForDrawables")
|
||||
private static void setBackButton(Activity activity) {
|
||||
ViewGroup toolbar = activity.findViewById(getToolbarResourceId());
|
||||
ImageButton imageButton = Objects.requireNonNull(getChildView(toolbar, false,
|
||||
view -> view instanceof ImageButton));
|
||||
imageButton.setImageDrawable(ReVancedPreferenceFragment.getBackButtonDrawable());
|
||||
imageButton.setOnClickListener(view -> activity.onBackPressed());
|
||||
}
|
||||
private static void createToolbar(Activity activity, String toolbarTitleResourceName) {
|
||||
// Replace dummy placeholder toolbar.
|
||||
// This is required to fix submenu title alignment issue with Android ASOP 15+
|
||||
ViewGroup toolBarParent = activity.findViewById(
|
||||
getResourceIdentifier("revanced_toolbar_parent", "id"));
|
||||
ViewGroup dummyToolbar = toolBarParent.findViewById(getResourceIdentifier(
|
||||
"revanced_toolbar", "id"));
|
||||
toolbarLayoutParams = dummyToolbar.getLayoutParams();
|
||||
toolBarParent.removeView(dummyToolbar);
|
||||
|
||||
private static int getToolbarResourceId() {
|
||||
final int toolbarResourceId = getResourceIdentifier("revanced_toolbar", "id");
|
||||
if (toolbarResourceId == 0) {
|
||||
throw new IllegalStateException("Could not find back button resource");
|
||||
Toolbar toolbar = new Toolbar(toolBarParent.getContext());
|
||||
toolbar.setBackgroundColor(ThemeHelper.getToolbarBackgroundColor());
|
||||
toolbar.setNavigationIcon(ReVancedPreferenceFragment.getBackButtonDrawable());
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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_ONCE;
|
||||
|
||||
import android.graphics.Color;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.shared.settings.BooleanSetting;
|
||||
@@ -45,11 +47,13 @@ import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings;
|
||||
|
||||
public class Settings extends BaseSettings {
|
||||
// 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 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_MOBILE = new IntegerSetting("revanced_video_quality_default_mobile", -2);
|
||||
// Speed
|
||||
public static final FloatSetting SPEED_TAP_AND_HOLD = new FloatSetting("revanced_speed_tap_and_hold", 2.0f, true);
|
||||
public static final BooleanSetting REMEMBER_PLAYBACK_SPEED_LAST_SELECTED = new BooleanSetting("revanced_remember_playback_speed_last_selected", FALSE);
|
||||
public static final BooleanSetting CUSTOM_SPEED_MENU = new BooleanSetting("revanced_custom_speed_menu", TRUE);
|
||||
public static final FloatSetting PLAYBACK_SPEED_DEFAULT = new FloatSetting("revanced_playback_speed_default", -2.0f);
|
||||
@@ -60,6 +64,7 @@ public class Settings extends BaseSettings {
|
||||
|
||||
// Ads
|
||||
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_GENERAL_ADS = new BooleanSetting("revanced_hide_general_ads", TRUE);
|
||||
public static final BooleanSetting HIDE_GET_PREMIUM = new BooleanSetting("revanced_hide_get_premium", TRUE);
|
||||
@@ -174,6 +179,7 @@ public class Settings extends BaseSettings {
|
||||
// Description
|
||||
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_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_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);
|
||||
@@ -203,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);
|
||||
|
||||
// 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 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);
|
||||
@@ -265,18 +272,19 @@ public class Settings extends BaseSettings {
|
||||
public static final BooleanSetting SHORTS_AUTOPLAY_BACKGROUND = new BooleanSetting("revanced_shorts_autoplay_background", TRUE);
|
||||
|
||||
// Seekbar
|
||||
|
||||
public static final BooleanSetting DISABLE_PRECISE_SEEKING_GESTURE = new BooleanSetting("revanced_disable_precise_seeking_gesture", TRUE);
|
||||
public static final BooleanSetting DISABLE_PRECISE_SEEKING_GESTURE = new BooleanSetting("revanced_disable_precise_seeking_gesture", FALSE);
|
||||
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 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", TRUE);
|
||||
public static final BooleanSetting SEEKBAR_TAPPING = new BooleanSetting("revanced_seekbar_tapping", FALSE);
|
||||
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());
|
||||
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
|
||||
public static final BooleanSetting ANNOUNCEMENTS = new BooleanSetting("revanced_announcements", TRUE);
|
||||
@@ -306,8 +314,9 @@ public class Settings extends BaseSettings {
|
||||
parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME));
|
||||
public static final IntegerSetting SWIPE_MAGNITUDE_THRESHOLD = new IntegerSetting("revanced_swipe_threshold", 30, true,
|
||||
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));
|
||||
private static final IntegerSetting DEPRECATED_SWIPE_OVERLAY_BACKGROUND_ALPHA = new IntegerSetting("revanced_swipe_overlay_background_alpha", 127);
|
||||
|
||||
// Debugging
|
||||
public static final IntegerSetting SWIPE_OVERLAY_TEXT_SIZE = new IntegerSetting("revanced_swipe_text_overlay_size", 22, true,
|
||||
@@ -335,13 +344,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 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_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_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_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 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 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);
|
||||
@@ -404,6 +414,35 @@ public class Settings extends BaseSettings {
|
||||
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
|
||||
|
||||
// region SB import/export callbacks
|
||||
|
||||
@@ -25,9 +25,12 @@ import java.util.List;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.shared.settings.EnumSetting;
|
||||
import app.revanced.extension.shared.settings.preference.AbstractPreferenceFragment;
|
||||
import app.revanced.extension.youtube.ThemeHelper;
|
||||
import app.revanced.extension.youtube.patches.playback.speed.CustomPlaybackSpeedPatch;
|
||||
import app.revanced.extension.youtube.settings.LicenseActivityHook;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
/**
|
||||
@@ -109,15 +112,20 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
||||
CustomPlaybackSpeedPatch.initializeListPreference(playbackPreference);
|
||||
}
|
||||
|
||||
preference = findPreference(Settings.SPOOF_VIDEO_STREAMS_LANGUAGE.key);
|
||||
if (preference instanceof ListPreference languagePreference) {
|
||||
sortListPreferenceByValues(languagePreference, 1);
|
||||
}
|
||||
sortPreferenceListMenu(Settings.SPOOF_VIDEO_STREAMS_LANGUAGE);
|
||||
sortPreferenceListMenu(BaseSettings.REVANCED_LANGUAGE);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "initialize failure", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private void sortPreferenceListMenu(EnumSetting<?> setting) {
|
||||
Preference preference = findPreference(setting.key);
|
||||
if (preference instanceof ListPreference languagePreference) {
|
||||
sortListPreferenceByValues(languagePreference, 1);
|
||||
}
|
||||
}
|
||||
|
||||
private void setPreferenceScreenToolbar(PreferenceScreen parentScreen) {
|
||||
for (int i = 0, preferenceCount = parentScreen.getPreferenceCount(); i < preferenceCount; i++) {
|
||||
Preference childPreference = parentScreen.getPreference(i);
|
||||
@@ -133,9 +141,6 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
||||
.getParent();
|
||||
|
||||
// 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) {
|
||||
rootView.setOnApplyWindowInsetsListener((v, insets) -> {
|
||||
Insets statusInsets = insets.getInsets(WindowInsets.Type.statusBars());
|
||||
@@ -148,13 +153,10 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
||||
toolbar.setTitle(childScreen.getTitle());
|
||||
toolbar.setNavigationIcon(getBackButtonDrawable());
|
||||
toolbar.setNavigationOnClickListener(view -> preferenceScreenDialog.dismiss());
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
final int margin = (int) TypedValue.applyDimension(
|
||||
TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics()
|
||||
);
|
||||
toolbar.setTitleMargin(margin, 0, margin, 0);
|
||||
}
|
||||
final int margin = (int) TypedValue.applyDimension(
|
||||
TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics()
|
||||
);
|
||||
toolbar.setTitleMargin(margin, 0, margin, 0);
|
||||
|
||||
TextView toolbarTextView = Utils.getChildView(toolbar,
|
||||
true, TextView.class::isInstance);
|
||||
@@ -162,6 +164,8 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment {
|
||||
toolbarTextView.setTextColor(ThemeHelper.getForegroundColor());
|
||||
}
|
||||
|
||||
LicenseActivityHook.setToolbarLayoutParams(toolbar);
|
||||
|
||||
rootView.addView(toolbar, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@ import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.preference.*;
|
||||
import android.text.Html;
|
||||
@@ -37,8 +36,9 @@ public class SponsorBlockPreferenceFragment extends PreferenceFragment {
|
||||
private SwitchPreference sbEnabled;
|
||||
private SwitchPreference addNewSegment;
|
||||
private SwitchPreference votingEnabled;
|
||||
private SwitchPreference compactSkipButton;
|
||||
private SwitchPreference autoHideSkipSegmentButton;
|
||||
private SwitchPreference compactSkipButton;
|
||||
private SwitchPreference squareLayout;
|
||||
private SwitchPreference showSkipToast;
|
||||
private SwitchPreference trackSkips;
|
||||
private SwitchPreference showTimeWithoutSegments;
|
||||
@@ -62,7 +62,9 @@ public class SponsorBlockPreferenceFragment extends PreferenceFragment {
|
||||
} else if (!Settings.SB_CREATE_NEW_SEGMENT.get()) {
|
||||
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);
|
||||
|
||||
@@ -72,11 +74,14 @@ public class SponsorBlockPreferenceFragment extends PreferenceFragment {
|
||||
votingEnabled.setChecked(Settings.SB_VOTING_BUTTON.get());
|
||||
votingEnabled.setEnabled(enabled);
|
||||
|
||||
autoHideSkipSegmentButton.setEnabled(enabled);
|
||||
autoHideSkipSegmentButton.setChecked(Settings.SB_AUTO_HIDE_SKIP_BUTTON.get());
|
||||
|
||||
compactSkipButton.setChecked(Settings.SB_COMPACT_SKIP_BUTTON.get());
|
||||
compactSkipButton.setEnabled(enabled);
|
||||
|
||||
autoHideSkipSegmentButton.setChecked(Settings.SB_AUTO_HIDE_SKIP_BUTTON.get());
|
||||
autoHideSkipSegmentButton.setEnabled(enabled);
|
||||
squareLayout.setChecked(Settings.SB_SQUARE_LAYOUT.get());
|
||||
squareLayout.setEnabled(enabled);
|
||||
|
||||
showSkipToast.setChecked(Settings.SB_TOAST_ON_SKIP.get());
|
||||
showSkipToast.setEnabled(enabled);
|
||||
@@ -176,6 +181,17 @@ public class SponsorBlockPreferenceFragment extends PreferenceFragment {
|
||||
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.setTitle(str("revanced_sb_enable_compact_skip_button"));
|
||||
compactSkipButton.setSummaryOn(str("revanced_sb_enable_compact_skip_button_sum_on"));
|
||||
@@ -187,13 +203,13 @@ public class SponsorBlockPreferenceFragment extends PreferenceFragment {
|
||||
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);
|
||||
squareLayout = new SwitchPreference(context);
|
||||
squareLayout.setTitle(str("revanced_sb_square_layout"));
|
||||
squareLayout.setSummaryOn(str("revanced_sb_square_layout_sum_on"));
|
||||
squareLayout.setSummaryOff(str("revanced_sb_square_layout_sum_off"));
|
||||
category.addPreference(squareLayout);
|
||||
squareLayout.setOnPreferenceChangeListener((preference1, newValue) -> {
|
||||
Settings.SB_SQUARE_LAYOUT.save((Boolean) newValue);
|
||||
updateUI();
|
||||
return true;
|
||||
});
|
||||
@@ -393,9 +409,7 @@ public class SponsorBlockPreferenceFragment extends PreferenceFragment {
|
||||
importExport.getEditText().setInputType(InputType.TYPE_CLASS_TEXT
|
||||
| InputType.TYPE_TEXT_FLAG_MULTI_LINE
|
||||
| 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.setOnPreferenceClickListener(preference1 -> {
|
||||
importExport.getEditText().setText(SponsorBlockSettings.exportDesktopSettings());
|
||||
|
||||
@@ -81,7 +81,17 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference {
|
||||
(clientType == ClientType.IOS_UNPLUGGED
|
||||
? "ios_tv"
|
||||
: "android");
|
||||
setTitle(str(key + "_title"));
|
||||
setSummary(str(key + "_summary"));
|
||||
String title = str(key + "_title");
|
||||
String summary = str(key + "_summary");
|
||||
|
||||
// Android VR supports AV1 but all other clients do not.
|
||||
if (clientType != ClientType.ANDROID_VR && clientType != ClientType.ANDROID_VR_NO_AUTH) {
|
||||
summary += '\n' + str("revanced_spoof_video_streams_about_no_av1");
|
||||
}
|
||||
|
||||
summary += '\n' + str("revanced_spoof_video_streams_about_kids_videos");
|
||||
|
||||
setTitle(title);
|
||||
setSummary(summary);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,10 +2,11 @@ package app.revanced.extension.youtube.sponsorblock.ui;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.drawable.GradientDrawable;
|
||||
import android.graphics.drawable.RippleDrawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.TypedValue;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
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.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.getResourceIdentifier;
|
||||
|
||||
public final class NewSegmentLayout extends FrameLayout {
|
||||
private static final ColorStateList rippleColorStateList = new ColorStateList(
|
||||
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 ctaBottomMargin;
|
||||
@@ -47,10 +48,6 @@ public final class NewSegmentLayout extends FrameLayout {
|
||||
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(
|
||||
context,
|
||||
"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
|
||||
private interface ButtonOnClickHandlerFunction {
|
||||
void apply();
|
||||
|
||||
@@ -8,6 +8,7 @@ import static app.revanced.extension.shared.Utils.getResourceIdentifier;
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.RectF;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
@@ -19,11 +20,19 @@ import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController;
|
||||
import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment;
|
||||
|
||||
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 TextView skipSponsorTextView;
|
||||
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
|
||||
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.setColor(getResourceColor("skip_ad_button_background_color")); // color:skip_ad_button_background_color);
|
||||
background.setStyle(Paint.Style.FILL);
|
||||
|
||||
border = new Paint();
|
||||
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.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
|
||||
ctaBottomMargin = getResourceDimensionPixelSize("skip_button_cta_bottom_margin"); // dimen:skip_button_cta_bottom_margin
|
||||
|
||||
updateLayout();
|
||||
|
||||
skipSponsorBtnContainer.setOnClickListener(v -> {
|
||||
// The view controller handles hiding this button, but hide it here as well just in case something goofs.
|
||||
setVisibility(View.GONE);
|
||||
@@ -72,30 +86,56 @@ public class SkipSponsorButton extends FrameLayout {
|
||||
protected final void dispatchDraw(Canvas canvas) {
|
||||
final int left = skipSponsorBtnContainer.getLeft();
|
||||
final int top = skipSponsorBtnContainer.getTop();
|
||||
final int leftPlusWidth = (left + skipSponsorBtnContainer.getWidth());
|
||||
final int topPlusHeight = (top + skipSponsorBtnContainer.getHeight());
|
||||
canvas.drawRect(left, top, leftPlusWidth, topPlusHeight, background);
|
||||
if (!highContrast) {
|
||||
canvas.drawLines(new float[]{
|
||||
leftPlusWidth, top, left, top,
|
||||
left, top, left, topPlusHeight,
|
||||
left, topPlusHeight, leftPlusWidth, topPlusHeight},
|
||||
border);
|
||||
final int right = left + skipSponsorBtnContainer.getWidth();
|
||||
final int bottom = top + skipSponsorBtnContainer.getHeight();
|
||||
|
||||
// Determine corner radius for rounded button
|
||||
float cornerRadius = skipSponsorBtnContainer.getHeight() / 2f;
|
||||
|
||||
if (Settings.SB_SQUARE_LAYOUT.get()) {
|
||||
// Square button.
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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;
|
||||
CharSequence newText = segment.getSkipButtonText();
|
||||
|
||||
//noinspection StringEqualsCharSequence
|
||||
if (newText.equals(skipSponsorTextView.getText())) {
|
||||
return false;
|
||||
return;
|
||||
}
|
||||
skipSponsorTextView.setText(newText);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,8 +19,11 @@ import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
import app.revanced.extension.youtube.shared.PlayerType;
|
||||
import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment;
|
||||
import kotlin.Unit;
|
||||
|
||||
public class SponsorBlockViewController {
|
||||
public static final int ROUNDED_LAYOUT_MARGIN = 12;
|
||||
|
||||
private static WeakReference<RelativeLayout> inlineSponsorOverlayRef = new WeakReference<>(null);
|
||||
private static WeakReference<ViewGroup> youtubeOverlaysLayoutRef = new WeakReference<>(null);
|
||||
private static WeakReference<SkipSponsorButton> skipHighlightButtonRef = new WeakReference<>(null);
|
||||
@@ -36,7 +39,7 @@ public class SponsorBlockViewController {
|
||||
static {
|
||||
PlayerType.getOnChange().addObserver((PlayerType type) -> {
|
||||
playerTypeChanged(type);
|
||||
return null;
|
||||
return Unit.INSTANCE;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -80,12 +83,16 @@ public class SponsorBlockViewController {
|
||||
});
|
||||
youtubeOverlaysLayoutRef = new WeakReference<>(viewGroup);
|
||||
|
||||
skipHighlightButtonRef = new WeakReference<>(
|
||||
Objects.requireNonNull(layout.findViewById(getResourceIdentifier("revanced_sb_skip_highlight_button", "id"))));
|
||||
skipSponsorButtonRef = new WeakReference<>(
|
||||
Objects.requireNonNull(layout.findViewById(getResourceIdentifier("revanced_sb_skip_sponsor_button", "id"))));
|
||||
newSegmentLayoutRef = new WeakReference<>(
|
||||
Objects.requireNonNull(layout.findViewById(getResourceIdentifier("revanced_sb_new_segment_view", "id"))));
|
||||
skipHighlightButtonRef = new WeakReference<>(Objects.requireNonNull(
|
||||
layout.findViewById(getResourceIdentifier("revanced_sb_skip_highlight_button", "id"))));
|
||||
|
||||
skipSponsorButtonRef = new WeakReference<>(Objects.requireNonNull(
|
||||
layout.findViewById(getResourceIdentifier("revanced_sb_skip_sponsor_button", "id"))));
|
||||
|
||||
NewSegmentLayout newSegmentLayout = Objects.requireNonNull(
|
||||
layout.findViewById(getResourceIdentifier("revanced_sb_new_segment_view", "id")));
|
||||
newSegmentLayoutRef = new WeakReference<>(newSegmentLayout);
|
||||
newSegmentLayout.updateLayout();
|
||||
|
||||
newSegmentLayoutVisible = false;
|
||||
skipHighlight = null;
|
||||
@@ -101,6 +108,23 @@ public class SponsorBlockViewController {
|
||||
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) {
|
||||
skipHighlight = Objects.requireNonNull(segment);
|
||||
NewSegmentLayout newSegmentLayout = newSegmentLayoutRef.get();
|
||||
|
||||
@@ -2,6 +2,8 @@ package app.revanced.extension.youtube.swipecontrols
|
||||
|
||||
import android.content.Context
|
||||
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.shared.PlayerType
|
||||
|
||||
@@ -86,7 +88,18 @@ class SwipeControlsConfigurationProvider(
|
||||
* get the background color for text on the overlay, as a color 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
|
||||
|
||||
@@ -4,14 +4,9 @@ plugins {
|
||||
|
||||
android {
|
||||
namespace = "app.revanced.extension"
|
||||
compileSdk = 33
|
||||
compileSdk = 34
|
||||
|
||||
defaultConfig {
|
||||
minSdk = 24
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
||||
org.gradle.parallel = true
|
||||
android.useAndroidX = true
|
||||
kotlin.code.style = official
|
||||
version = 5.8.0-dev.6
|
||||
version = 5.12.0-dev.1
|
||||
|
||||
@@ -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 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 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 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 synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;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 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 final fun getIcon ()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 getTag ()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 fun <init> ()V
|
||||
public fun <init> (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 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/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 getLayout ()Ljava/lang/String;
|
||||
public final fun getPreferences ()Ljava/util/Set;
|
||||
public final fun getTitleKey ()Ljava/lang/String;
|
||||
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 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 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 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/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 getCategories ()Ljava/util/Set;
|
||||
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 fun <init> (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;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 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/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 synthetic fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;
|
||||
public fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/PreferenceCategory;
|
||||
@@ -662,6 +667,7 @@ public class app/revanced/patches/shared/misc/settings/preference/BasePreference
|
||||
|
||||
public final class app/revanced/patches/shared/misc/settings/preference/InputType : java/lang/Enum {
|
||||
public static final field NUMBER Lapp/revanced/patches/shared/misc/settings/preference/InputType;
|
||||
public static final field NUMBER_DECIMAL Lapp/revanced/patches/shared/misc/settings/preference/InputType;
|
||||
public static final field TEXT Lapp/revanced/patches/shared/misc/settings/preference/InputType;
|
||||
public static final field TEXT_CAP_CHARACTERS Lapp/revanced/patches/shared/misc/settings/preference/InputType;
|
||||
public static final field TEXT_MULTI_LINE Lapp/revanced/patches/shared/misc/settings/preference/InputType;
|
||||
@@ -672,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 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 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 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;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 final fun getIntent ()Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;
|
||||
public fun hashCode ()I
|
||||
@@ -693,8 +699,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/ListPref
|
||||
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 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 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 <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;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
||||
public final fun getEntries ()Lapp/revanced/util/resource/ArrayResource;
|
||||
public final fun getEntriesKey ()Ljava/lang/String;
|
||||
public final fun getEntryValues ()Lapp/revanced/util/resource/ArrayResource;
|
||||
@@ -703,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 fun <init> (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 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;Ljava/lang/String;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
||||
public final fun getSelectable ()Z
|
||||
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 fun <init> (Ljava/lang/String;Ljava/lang/String;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 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/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 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 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 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 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;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 fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element;
|
||||
}
|
||||
@@ -727,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_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 final fun appendSortType (Ljava/lang/String;)Ljava/lang/String;
|
||||
public static fun getEntries ()Lkotlin/enums/EnumEntries;
|
||||
public final fun getKeySuffix ()Ljava/lang/String;
|
||||
public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;
|
||||
@@ -745,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 fun <init> ()V
|
||||
public fun <init> (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 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;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
||||
public final fun getSummaryOffKey ()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;
|
||||
@@ -754,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 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 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 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;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 fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element;
|
||||
}
|
||||
@@ -1358,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_46_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 {
|
||||
@@ -1406,6 +1414,10 @@ public final class app/revanced/patches/youtube/video/audio/ForceOriginalAudioPa
|
||||
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 static final fun getVideoInformationPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static final fun userSelectedPlaybackSpeedHook (Ljava/lang/String;Ljava/lang/String;)V
|
||||
@@ -1447,10 +1459,6 @@ public final class app/revanced/patches/youtube/video/speed/button/PlaybackSpeed
|
||||
public static final fun getPlaybackSpeedButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatchKt {
|
||||
public static final fun getSpeedUnavailableId ()J
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/video/videoid/VideoIdPatchKt {
|
||||
public static final fun getVideoIdPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public static final fun hookBackgroundPlayVideoId (Ljava/lang/String;)V
|
||||
|
||||
@@ -21,6 +21,25 @@ dependencies {
|
||||
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 {
|
||||
compilerOptions {
|
||||
freeCompilerArgs = listOf("-Xcontext-receivers")
|
||||
@@ -38,4 +57,4 @@ publishing {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,7 @@ val exportInternalDataDocumentsProviderPatch = resourcePatch(
|
||||
) {
|
||||
dependsOn(
|
||||
bytecodePatch {
|
||||
extendWith("extensions/all/misc/directory/export-internal-data-documents-provider.rve")
|
||||
extendWith("extensions/all/misc/directory/documentsprovider/export-internal-data-documents-provider.rve")
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@@ -359,15 +359,15 @@ val addResourcesPatch = resourcePatch(
|
||||
}
|
||||
|
||||
getOrPut(resourceFileName) {
|
||||
val targetFile = this@finalize["res/$value/$resourceFileName.xml"].also {
|
||||
this@finalize["res/$value/$resourceFileName.xml"].also {
|
||||
it.parentFile?.mkdirs()
|
||||
|
||||
if (it.createNewFile()) {
|
||||
it.writeText("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n</resources>")
|
||||
}
|
||||
}
|
||||
|
||||
document(targetFile.path).let { document ->
|
||||
|
||||
document("res/$value/$resourceFileName.xml").let { document ->
|
||||
|
||||
// Save the target node here as well
|
||||
// in order to avoid having to call document.getNode("resources")
|
||||
|
||||
@@ -25,7 +25,7 @@ private val removeCaptureRestrictionResourcePatch = resourcePatch(
|
||||
}
|
||||
|
||||
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;"
|
||||
|
||||
@Suppress("unused")
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package app.revanced.patches.shared.misc.settings
|
||||
|
||||
import app.revanced.patcher.patch.PatchException
|
||||
import app.revanced.patcher.patch.resourcePatch
|
||||
import app.revanced.patches.all.misc.resources.addResource
|
||||
import app.revanced.patches.all.misc.resources.addResources
|
||||
@@ -12,15 +13,22 @@ import app.revanced.util.getNode
|
||||
import app.revanced.util.insertFirst
|
||||
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.
|
||||
*
|
||||
* @param rootPreference A pair of an intent preference and the name of the fragment file to add it to.
|
||||
* If null, no preference will be added.
|
||||
* @param rootPreferences List of intent preferences and the name of the fragment file to add it to.
|
||||
* File names that do not exist are ignored and not processed.
|
||||
* @param preferences A set of preferences to add to the ReVanced fragment.
|
||||
*/
|
||||
fun settingsPatch(
|
||||
rootPreference: Pair<IntentPreference, String>? = null,
|
||||
fun settingsPatch (
|
||||
rootPreferences: List<Pair<BasePreference, String>>? = null,
|
||||
preferences: Set<BasePreference>,
|
||||
) = resourcePatch {
|
||||
dependsOn(addResourcesPatch)
|
||||
@@ -46,10 +54,20 @@ fun settingsPatch(
|
||||
}
|
||||
|
||||
// Add the root preference to an existing fragment if needed.
|
||||
rootPreference?.let { (intentPreference, fragment) ->
|
||||
document("res/xml/$fragment.xml").use { document ->
|
||||
document.getNode("PreferenceScreen").addPreference(intentPreference, true)
|
||||
rootPreferences?.let {
|
||||
var modified = false
|
||||
|
||||
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.
|
||||
|
||||
@@ -9,6 +9,8 @@ import org.w3c.dom.Element
|
||||
*
|
||||
* @param key The key of the preference. If null, other parameters must be specified.
|
||||
* @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 tag The tag or full class name of the preference.
|
||||
*/
|
||||
@@ -17,6 +19,8 @@ abstract class BasePreference(
|
||||
val key: String? = null,
|
||||
val titleKey: String = "${key}_title",
|
||||
val summaryKey: String? = "${key}_summary",
|
||||
val icon: String? = null,
|
||||
val layout: String? = null,
|
||||
val tag: String
|
||||
) {
|
||||
/**
|
||||
@@ -33,6 +37,11 @@ abstract class BasePreference(
|
||||
key?.let { setAttribute("android:key", it) }
|
||||
setAttribute("android:title", "@string/${titleKey}")
|
||||
summaryKey?.let { addSummary(it) }
|
||||
icon?.let {
|
||||
setAttribute("android:icon", it)
|
||||
setAttribute("app:iconSpaceReserved", "true")
|
||||
}
|
||||
layout?.let { setAttribute("android:layout", layout) }
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
|
||||
@@ -24,16 +24,20 @@ abstract class BasePreferenceScreen(
|
||||
key: String? = null,
|
||||
titleKey: String = "${key}_title",
|
||||
private val summaryKey: String? = "${key}_summary",
|
||||
icon: String? = null,
|
||||
layout: String? = null,
|
||||
preferences: MutableSet<BasePreference> = mutableSetOf(),
|
||||
val categories: MutableSet<Category> = mutableSetOf(),
|
||||
private val sorting: Sorting = Sorting.BY_TITLE,
|
||||
) : BasePreferenceCollection(key, titleKey, preferences) {
|
||||
) : BasePreferenceCollection(key, titleKey, icon, layout, preferences) {
|
||||
|
||||
override fun transform(): PreferenceScreenPreference {
|
||||
return PreferenceScreenPreference(
|
||||
key,
|
||||
titleKey,
|
||||
summaryKey,
|
||||
icon,
|
||||
layout,
|
||||
sorting,
|
||||
// Screens and preferences are sorted at runtime by extension code,
|
||||
// so title sorting uses the localized language in use.
|
||||
@@ -56,12 +60,17 @@ abstract class BasePreferenceScreen(
|
||||
open inner class Category(
|
||||
key: String? = null,
|
||||
titleKey: String = "${key}_title",
|
||||
icon: String? = null,
|
||||
layout: String? = null,
|
||||
preferences: MutableSet<BasePreference> = mutableSetOf(),
|
||||
) : BasePreferenceCollection(key, titleKey, preferences) {
|
||||
) : BasePreferenceCollection(key, titleKey, icon, layout, preferences) {
|
||||
override fun transform(): PreferenceCategory {
|
||||
return PreferenceCategory(
|
||||
key,
|
||||
titleKey,
|
||||
icon,
|
||||
layout,
|
||||
sorting,
|
||||
preferences = preferences,
|
||||
)
|
||||
}
|
||||
@@ -82,6 +91,8 @@ abstract class BasePreferenceScreen(
|
||||
abstract class BasePreferenceCollection(
|
||||
val key: String? = null,
|
||||
val titleKey: String = "${key}_title",
|
||||
val icon: String? = null,
|
||||
val layout: String? = null,
|
||||
val preferences: MutableSet<BasePreference> = mutableSetOf(),
|
||||
) {
|
||||
abstract fun transform(): BasePreference
|
||||
|
||||
@@ -5,4 +5,5 @@ enum class InputType(val type: String) {
|
||||
TEXT_CAP_CHARACTERS("textCapCharacters"),
|
||||
TEXT_MULTI_LINE("textMultiLine"),
|
||||
NUMBER("number"),
|
||||
NUMBER_DECIMAL("numberDecimal"),
|
||||
}
|
||||
@@ -9,6 +9,8 @@ import org.w3c.dom.Document
|
||||
* @param key Optional preference key.
|
||||
* @param titleKey The preference title key.
|
||||
* @param summaryKey The preference summary key.
|
||||
* @param icon The preference icon resource name.
|
||||
* @param layout Layout declaration.
|
||||
* @param tag The preference tag.
|
||||
* @param intent The intent to open.
|
||||
*/
|
||||
@@ -16,9 +18,11 @@ class IntentPreference(
|
||||
key: String? = null,
|
||||
titleKey: String = "${key}_title",
|
||||
summaryKey: String? = "${key}_summary",
|
||||
icon: String? = null,
|
||||
layout: String? = null,
|
||||
tag: String = "Preference",
|
||||
val intent: Intent,
|
||||
) : BasePreference(key, titleKey, summaryKey, tag) {
|
||||
) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) {
|
||||
|
||||
override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) =
|
||||
super.serialize(ownerDocument, resourceCallback).apply {
|
||||
|
||||
@@ -10,6 +10,8 @@ import org.w3c.dom.Document
|
||||
* @param key The preference key. If null, other parameters must be specified.
|
||||
* @param titleKey The preference title key.
|
||||
* @param summaryKey The preference summary key.
|
||||
* @param icon The preference icon resource name.
|
||||
* @param layout Layout declaration.
|
||||
* @param tag The preference tag.
|
||||
* @param entriesKey The entries array key.
|
||||
* @param entryValuesKey The entry values array key.
|
||||
@@ -19,10 +21,12 @@ class ListPreference(
|
||||
key: String? = null,
|
||||
titleKey: String = "${key}_title",
|
||||
summaryKey: String? = "${key}_summary",
|
||||
icon: String? = null,
|
||||
layout: String? = null,
|
||||
tag: String = "ListPreference",
|
||||
val entriesKey: String? = "${key}_entries",
|
||||
val entryValuesKey: String? = "${key}_entry_values"
|
||||
) : BasePreference(key, titleKey, summaryKey, tag) {
|
||||
) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) {
|
||||
var entries: ArrayResource? = null
|
||||
private set
|
||||
var entryValues: ArrayResource? = null
|
||||
|
||||
@@ -10,6 +10,8 @@ import org.w3c.dom.Document
|
||||
*
|
||||
* @param key The preference 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 selectable If the preference is selectable and responds to tap events.
|
||||
*/
|
||||
@@ -18,9 +20,11 @@ class NonInteractivePreference(
|
||||
key: String,
|
||||
titleKey: String = "${key}_title",
|
||||
summaryKey: String? = "${key}_summary",
|
||||
icon: String? = null,
|
||||
layout: String? = null,
|
||||
tag: String = "Preference",
|
||||
val selectable: Boolean = false,
|
||||
) : BasePreference(key, titleKey, summaryKey, tag) {
|
||||
) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) {
|
||||
override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) =
|
||||
super.serialize(ownerDocument, resourceCallback).apply {
|
||||
setAttribute("android:selectable", selectable.toString())
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
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 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 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 preferences The preferences in this category.
|
||||
*/
|
||||
@@ -15,9 +18,12 @@ import org.w3c.dom.Document
|
||||
open class PreferenceCategory(
|
||||
key: String? = null,
|
||||
titleKey: String = "${key}_title",
|
||||
icon: String? = null,
|
||||
layout: String? = null,
|
||||
sorting: Sorting = Sorting.BY_TITLE,
|
||||
tag: String = "PreferenceCategory",
|
||||
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) =
|
||||
super.serialize(ownerDocument, resourceCallback).apply {
|
||||
|
||||
@@ -9,6 +9,8 @@ import org.w3c.dom.Document
|
||||
* @param key The key of the preference. If null, other parameters must be specified.
|
||||
* @param titleKey The key of the preference title.
|
||||
* @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],
|
||||
* then the key parameter will be modified to include the sort type.
|
||||
* @param tag The tag or full class name of the preference.
|
||||
@@ -19,6 +21,8 @@ open class PreferenceScreenPreference(
|
||||
key: String? = null,
|
||||
titleKey: String = "${key}_title",
|
||||
summaryKey: String? = "${key}_summary",
|
||||
icon: String? = null,
|
||||
layout: String? = null,
|
||||
sorting: Sorting = Sorting.BY_TITLE,
|
||||
tag: String = "PreferenceScreen",
|
||||
val preferences: Set<BasePreference>,
|
||||
@@ -28,7 +32,7 @@ open class PreferenceScreenPreference(
|
||||
// or adding new attributes to the attrs.xml file.
|
||||
// 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.
|
||||
) : 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) =
|
||||
super.serialize(ownerDocument, resourceCallback).apply {
|
||||
preferences.forEach {
|
||||
@@ -53,6 +57,16 @@ open class PreferenceScreenPreference(
|
||||
/**
|
||||
* 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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@ import org.w3c.dom.Document
|
||||
*
|
||||
* @param key The preference key. If null, other parameters must be specified.
|
||||
* @param titleKey The preference title key.
|
||||
* @param icon The preference icon resource name.
|
||||
* @param layout Layout declaration.
|
||||
* @param tag The preference tag.
|
||||
* @param summaryOnKey The preference summary-on key.
|
||||
* @param summaryOffKey The preference summary-off key.
|
||||
@@ -17,9 +19,11 @@ class SwitchPreference(
|
||||
key: String? = null,
|
||||
titleKey: String = "${key}_title",
|
||||
tag: String = "SwitchPreference",
|
||||
icon: String? = null,
|
||||
layout: String? = null,
|
||||
val summaryOnKey: String = "${key}_summary_on",
|
||||
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) =
|
||||
super.serialize(ownerDocument, resourceCallback).apply {
|
||||
addSummary(summaryOnKey, SummaryType.ON)
|
||||
|
||||
@@ -9,6 +9,8 @@ import org.w3c.dom.Document
|
||||
* @param key The preference key. If null, other parameters must be specified.
|
||||
* @param titleKey The preference title key.
|
||||
* @param summaryKey The preference summary key.
|
||||
* @param icon The preference icon resource name.
|
||||
* @param layout Layout declaration.
|
||||
* @param tag The preference tag.
|
||||
* @param inputType The preference input type.
|
||||
*/
|
||||
@@ -17,9 +19,11 @@ class TextPreference(
|
||||
key: String? = null,
|
||||
titleKey: String = "${key}_title",
|
||||
summaryKey: String? = "${key}_summary",
|
||||
icon: String? = null,
|
||||
layout: String? = null,
|
||||
tag: String = "app.revanced.extension.shared.settings.preference.ResettableEditTextPreference",
|
||||
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) =
|
||||
super.serialize(ownerDocument, resourceCallback).apply {
|
||||
|
||||
@@ -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." +
|
||||
"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 {
|
||||
checkIntegrityFingerprint.method.addInstructions(
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
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.resourcePatch
|
||||
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.injectHideViewCall
|
||||
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.Instruction35c
|
||||
|
||||
internal var adAttributionId = -1L
|
||||
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 {
|
||||
dependsOn(
|
||||
@@ -37,6 +44,7 @@ private val hideAdsResourcePatch = resourcePatch {
|
||||
|
||||
PreferenceScreen.ADS.addPreferences(
|
||||
SwitchPreference("revanced_hide_general_ads"),
|
||||
SwitchPreference("revanced_hide_end_screen_store_banner"),
|
||||
SwitchPreference("revanced_hide_fullscreen_ads"),
|
||||
SwitchPreference("revanced_hide_buttoned_ads"),
|
||||
SwitchPreference("revanced_hide_paid_promotion_label"),
|
||||
@@ -52,6 +60,7 @@ private val hideAdsResourcePatch = resourcePatch {
|
||||
addLithoFilter("Lapp/revanced/extension/youtube/patches/components/AdsFilter;")
|
||||
|
||||
adAttributionId = resourceMappings["id", "ad_attribution"]
|
||||
fullScreenEngagementAdContainer = resourceMappings["id", "fullscreen_engagement_ad_container"]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,6 +91,23 @@ val hideAdsPatch = bytecodePatch(
|
||||
)
|
||||
|
||||
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 ->
|
||||
classDef.methods.forEach { method ->
|
||||
with(method.implementation) {
|
||||
@@ -110,7 +136,7 @@ val hideAdsPatch = bytecodePatch(
|
||||
.injectHideViewCall(
|
||||
insertIndex,
|
||||
viewRegister,
|
||||
"Lapp/revanced/extension/youtube/patches/components/AdsFilter;",
|
||||
EXTENSION_CLASS_DESCRIPTOR,
|
||||
"hideAdAttributionView",
|
||||
)
|
||||
}
|
||||
|
||||
@@ -24,9 +24,7 @@ internal const val EXTENSION_METHOD_DESCRIPTOR =
|
||||
val enableSlideToSeekPatch = bytecodePatch(
|
||||
name = "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. " +
|
||||
"Including this patch may cause issues with tapping or double tapping the video player overlay.",
|
||||
use = false,
|
||||
"instead of playing at 2x speed when pressing and holding in the video player."
|
||||
) {
|
||||
dependsOn(
|
||||
sharedExtensionPatch,
|
||||
|
||||
@@ -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.youtube.misc.extension.sharedExtensionPatch
|
||||
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_25_or_greater
|
||||
import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater
|
||||
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
||||
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
||||
import app.revanced.patches.youtube.shared.mainActivityFingerprint
|
||||
@@ -30,7 +29,7 @@ private val swipeControlsResourcePatch = resourcePatch {
|
||||
execute {
|
||||
addResources("youtube", "interaction.swipecontrols.swipeControlsResourcePatch")
|
||||
|
||||
if (is_19_25_or_greater) {
|
||||
if (is_19_43_or_greater) {
|
||||
PreferenceScreen.SWIPE_CONTROLS.addPreferences(
|
||||
SwitchPreference("revanced_swipe_change_video")
|
||||
)
|
||||
@@ -45,7 +44,7 @@ private val swipeControlsResourcePatch = resourcePatch {
|
||||
SwitchPreference("revanced_swipe_lowest_value_enable_auto_brightness"),
|
||||
TextPreference("revanced_swipe_overlay_timeout", 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),
|
||||
)
|
||||
|
||||
@@ -114,7 +113,7 @@ val swipeControlsPatch = bytecodePatch(
|
||||
|
||||
// region patch to enable/disable swipe to change video.
|
||||
|
||||
if (is_19_23_or_greater) {
|
||||
if (is_19_43_or_greater) {
|
||||
swipeChangeVideoFingerprint.method.insertFeatureFlagBooleanOverride(
|
||||
SWIPE_CHANGE_VIDEO_FEATURE_FLAG,
|
||||
"$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z"
|
||||
|
||||
@@ -65,9 +65,12 @@ val navigationButtonsPatch = bytecodePatch(
|
||||
)
|
||||
|
||||
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_dark")
|
||||
|
||||
PreferenceScreen.GENERAL_LAYOUT.addPreferences(
|
||||
SwitchPreference("revanced_disable_translucent_status_bar")
|
||||
)
|
||||
}
|
||||
|
||||
PreferenceScreen.GENERAL_LAYOUT.addPreferences(
|
||||
|
||||
@@ -147,6 +147,7 @@ val hideLayoutComponentsPatch = bytecodePatch(
|
||||
SwitchPreference("revanced_hide_attributes_section"),
|
||||
SwitchPreference("revanced_hide_chapters_section"),
|
||||
SwitchPreference("revanced_hide_info_cards_section"),
|
||||
SwitchPreference("revanced_hide_how_this_was_made_section"),
|
||||
SwitchPreference("revanced_hide_key_concepts_section"),
|
||||
SwitchPreference("revanced_hide_podcast_section"),
|
||||
SwitchPreference("revanced_hide_transcript_section"),
|
||||
|
||||
@@ -2,9 +2,12 @@ package app.revanced.patches.youtube.layout.seekbar
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.util.containsLiteralInstruction
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstruction
|
||||
import app.revanced.util.literal
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
internal val fullscreenSeekbarThumbnailsFingerprint = fingerprint {
|
||||
returns("Z")
|
||||
@@ -34,13 +37,17 @@ internal val shortsSeekbarColorFingerprint = fingerprint {
|
||||
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)
|
||||
returns("Z")
|
||||
parameters()
|
||||
literal { PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG }
|
||||
returns("V")
|
||||
parameters("L")
|
||||
literal { -1712394514 }
|
||||
}
|
||||
|
||||
internal val lithoLinearGradientFingerprint = fingerprint {
|
||||
@@ -49,6 +56,49 @@ internal val lithoLinearGradientFingerprint = fingerprint {
|
||||
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 val launchScreenLayoutTypeFingerprint = fingerprint {
|
||||
@@ -62,3 +112,52 @@ internal val launchScreenLayoutTypeFingerprint = fingerprint {
|
||||
&& 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 }
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -3,10 +3,12 @@ package app.revanced.patches.youtube.layout.seekbar
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.patch.PatchException
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patcher.patch.resourcePatch
|
||||
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.resourceMappingPatch
|
||||
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.misc.extension.sharedExtensionPatch
|
||||
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_49_or_greater
|
||||
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
|
||||
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
||||
import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint
|
||||
import app.revanced.util.copyXmlNode
|
||||
import app.revanced.util.findElementByAttributeValueOrThrow
|
||||
import app.revanced.util.findInstructionIndicesReversedOrThrow
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
|
||||
import app.revanced.util.inputStreamFromBundledResource
|
||||
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.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.TwoRegisterInstruction
|
||||
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 java.io.ByteArrayInputStream
|
||||
import kotlin.use
|
||||
@@ -39,6 +49,10 @@ internal var inlineTimeBarColorizedBarPlayedColorDarkId = -1L
|
||||
private set
|
||||
internal var inlineTimeBarPlayedNotHighlightedColorId = -1L
|
||||
private set
|
||||
internal var ytYoutubeMagentaColorId = -1L
|
||||
private set
|
||||
internal var ytStaticBrandRedId = -1L
|
||||
private set
|
||||
|
||||
internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color"
|
||||
|
||||
@@ -83,6 +97,15 @@ private val seekbarColorResourcePatch = resourcePatch {
|
||||
return@execute
|
||||
}
|
||||
|
||||
ytYoutubeMagentaColorId = resourceMappings[
|
||||
"color",
|
||||
"yt_youtube_magenta",
|
||||
]
|
||||
ytStaticBrandRedId = resourceMappings[
|
||||
"attr",
|
||||
"ytStaticBrandRed",
|
||||
]
|
||||
|
||||
// Add attribute and styles for splash screen custom color.
|
||||
// Using a style is the only way to selectively change just the seekbar fill color.
|
||||
//
|
||||
@@ -182,28 +205,31 @@ val seekbarColorPatch = bytecodePatch(
|
||||
sharedExtensionPatch,
|
||||
lithoColorHookPatch,
|
||||
seekbarColorResourcePatch,
|
||||
versionCheckPatch
|
||||
)
|
||||
|
||||
execute {
|
||||
fun MutableMethod.addColorChangeInstructions(resourceId: Long) {
|
||||
val registerIndex = indexOfFirstLiteralInstructionOrThrow(resourceId) + 2
|
||||
val colorRegister = getInstruction<OneRegisterInstruction>(registerIndex).registerA
|
||||
fun MutableMethod.addColorChangeInstructions(resourceId: Long, methodName: String) {
|
||||
val index = indexOfFirstLiteralInstructionOrThrow(resourceId)
|
||||
val insertIndex = indexOfFirstInstructionOrThrow(index, Opcode.MOVE_RESULT)
|
||||
val register = getInstruction<OneRegisterInstruction>(insertIndex).registerA
|
||||
|
||||
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 {
|
||||
addColorChangeInstructions(inlineTimeBarColorizedBarPlayedColorDarkId)
|
||||
addColorChangeInstructions(inlineTimeBarPlayedNotHighlightedColorId)
|
||||
addColorChangeInstructions(inlineTimeBarColorizedBarPlayedColorDarkId, "getVideoPlayerSeekbarColor")
|
||||
addColorChangeInstructions(inlineTimeBarPlayedNotHighlightedColorId, "getVideoPlayerSeekbarColor")
|
||||
}
|
||||
|
||||
shortsSeekbarColorFingerprint.method.apply {
|
||||
addColorChangeInstructions(reelTimeBarPlayedColorId)
|
||||
addColorChangeInstructions(reelTimeBarPlayedColorId, "getVideoPlayerSeekbarColor")
|
||||
}
|
||||
|
||||
setSeekbarClickedColorFingerprint.originalMethod.let {
|
||||
@@ -229,20 +255,71 @@ val seekbarColorPatch = bytecodePatch(
|
||||
|
||||
// 19.25+ changes
|
||||
|
||||
playerSeekbarGradientConfigFingerprint.method.insertFeatureFlagBooleanOverride(
|
||||
PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG,
|
||||
"$EXTENSION_CLASS_DESCRIPTOR->playerSeekbarGradientEnabled(Z)Z"
|
||||
)
|
||||
playerSeekbarHandleColorFingerprint.method.apply {
|
||||
addColorChangeInstructions(ytStaticBrandRedId, "getVideoPlayerSeekbarColor")
|
||||
}
|
||||
|
||||
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,
|
||||
"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.
|
||||
|
||||
// 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(
|
||||
launchScreenLayoutTypeFingerprint,
|
||||
mainActivityOnCreateFingerprint
|
||||
@@ -253,7 +330,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 {
|
||||
val drawableIndex = indexOfFirstInstructionOrThrow {
|
||||
val reference = getReference<MethodReference>()
|
||||
@@ -268,6 +345,87 @@ val seekbarColorPatch = bytecodePatch(
|
||||
"invoke-static { v$drawableRegister }, $EXTENSION_CLASS_DESCRIPTOR->" +
|
||||
"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
|
||||
|
||||
@@ -70,12 +70,7 @@ private val sponsorBlockResourcePatch = resourcePatch {
|
||||
"revanced_sb_logo.xml",
|
||||
"revanced_sb_publish.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 ->
|
||||
copyResources("sponsorblock", resourceGroup)
|
||||
}
|
||||
|
||||
@@ -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.youtube.layout.seekbar.seekbarColorPatch
|
||||
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.settingsPatch
|
||||
import app.revanced.util.forEachChildElement
|
||||
@@ -71,6 +73,7 @@ val themePatch = bytecodePatch(
|
||||
dependsOn(
|
||||
lithoColorHookPatch,
|
||||
seekbarColorPatch,
|
||||
versionCheckPatch,
|
||||
resourcePatch {
|
||||
dependsOn(
|
||||
settingsPatch,
|
||||
@@ -83,9 +86,15 @@ val themePatch = bytecodePatch(
|
||||
|
||||
PreferenceScreen.SEEKBAR.addPreferences(
|
||||
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.
|
||||
document("res/values/colors.xml").use { document ->
|
||||
|
||||
|
||||
@@ -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",
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 }
|
||||
}
|
||||
@@ -41,6 +41,8 @@ var is_19_46_or_greater = false
|
||||
private set
|
||||
var is_19_47_or_greater = false
|
||||
private set
|
||||
var is_19_49_or_greater = false
|
||||
private set
|
||||
|
||||
val versionCheckPatch = resourcePatch(
|
||||
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_46_or_greater = 244705000 <= playStoreServicesVersion
|
||||
is_19_47_or_greater = 244799000 <= playStoreServicesVersion
|
||||
is_19_49_or_greater = 245005000 <= playStoreServicesVersion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,3 +21,14 @@ internal val setThemeFingerprint = fingerprint {
|
||||
opcodes(Opcode.RETURN_OBJECT)
|
||||
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 }
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ 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.resourcePatch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||
import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName
|
||||
import app.revanced.patches.all.misc.resources.addResources
|
||||
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
||||
@@ -17,11 +18,17 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPref
|
||||
import app.revanced.patches.shared.misc.settings.settingsPatch
|
||||
import app.revanced.patches.youtube.misc.check.checkEnvironmentPatch
|
||||
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.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 com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
|
||||
import com.android.tools.smali.dexlib2.util.MethodUtil
|
||||
|
||||
// Used by a fingerprint() from SettingsPatch.
|
||||
@@ -38,13 +45,28 @@ private val settingsResourcePatch = resourcePatch {
|
||||
dependsOn(
|
||||
resourceMappingPatch,
|
||||
settingsPatch(
|
||||
rootPreference = IntentPreference(
|
||||
titleKey = "revanced_settings_title",
|
||||
summaryKey = null,
|
||||
intent = newIntent("revanced_settings_intent"),
|
||||
) to "settings_fragment",
|
||||
preferences,
|
||||
),
|
||||
listOf(
|
||||
IntentPreference(
|
||||
titleKey = "revanced_settings_title",
|
||||
summaryKey = null,
|
||||
intent = newIntent("revanced_settings_intent"),
|
||||
) 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 {
|
||||
@@ -52,6 +74,7 @@ private val settingsResourcePatch = resourcePatch {
|
||||
appearanceStringId = resourceMappings["string", "app_theme_appearance_dark"]
|
||||
|
||||
arrayOf(
|
||||
ResourceGroup("drawable", "revanced_settings_icon.xml"),
|
||||
ResourceGroup("layout", "revanced_settings_with_toolbar.xml"),
|
||||
).forEach { resourceGroup ->
|
||||
copyResources("settings", resourceGroup)
|
||||
@@ -74,7 +97,6 @@ private val settingsResourcePatch = resourcePatch {
|
||||
// Remove horizontal divider from the settings Preferences
|
||||
// To better match the appearance of the stock YouTube settings.
|
||||
document("res/values/styles.xml").use { document ->
|
||||
|
||||
arrayOf(
|
||||
"Theme.YouTube.Settings",
|
||||
"Theme.YouTube.Settings.Dark",
|
||||
@@ -94,7 +116,6 @@ private val settingsResourcePatch = resourcePatch {
|
||||
// Some devices freak out if undeclared data is passed to an intent,
|
||||
// and this change appears to fix the issue.
|
||||
document("AndroidManifest.xml").use { document ->
|
||||
|
||||
val licenseElement = document.childNodes.findElementByAttributeValueOrThrow(
|
||||
"android:name",
|
||||
"com.google.android.libraries.social.licenses.LicenseActivity",
|
||||
@@ -118,7 +139,7 @@ val settingsPatch = bytecodePatch(
|
||||
sharedExtensionPatch,
|
||||
settingsResourcePatch,
|
||||
addResourcesPatch,
|
||||
disableCairoSettingsPatch,
|
||||
versionCheckPatch,
|
||||
fixPlaybackSpeedWhilePlayingPatch,
|
||||
// Currently there is no easy way to make a mandatory patch,
|
||||
// so for now this is a dependent of this patch.
|
||||
@@ -142,6 +163,12 @@ val settingsPatch = bytecodePatch(
|
||||
selectable = true,
|
||||
)
|
||||
|
||||
if (is_19_34_or_greater) {
|
||||
PreferenceScreen.GENERAL_LAYOUT.addPreferences(
|
||||
SwitchPreference("revanced_restore_old_settings_menus")
|
||||
)
|
||||
}
|
||||
|
||||
PreferenceScreen.MISC.addPreferences(
|
||||
TextPreference(
|
||||
key = null,
|
||||
@@ -150,6 +177,10 @@ val settingsPatch = bytecodePatch(
|
||||
inputType = InputType.TEXT_MULTI_LINE,
|
||||
tag = "app.revanced.extension.shared.settings.preference.ImportExportPreference",
|
||||
),
|
||||
ListPreference(
|
||||
key = "revanced_language",
|
||||
summaryKey = null
|
||||
)
|
||||
)
|
||||
|
||||
setThemeFingerprint.method.let { setThemeMethod ->
|
||||
@@ -189,6 +220,40 @@ val settingsPatch = bytecodePatch(
|
||||
licenseActivityOnCreateFingerprint.classDef.apply {
|
||||
methods.removeIf { it.name != "onCreate" && !MethodUtil.isConstructor(it) }
|
||||
}
|
||||
|
||||
// Add context override to force a specific settings language.
|
||||
licenseActivityOnCreateFingerprint.classDef.apply {
|
||||
val attachBaseContext = ImmutableMethod(
|
||||
type,
|
||||
"attachBaseContext",
|
||||
listOf(ImmutableMethodParameter("Landroid/content/Context;", null, null)),
|
||||
"V",
|
||||
AccessFlags.PROTECTED.value,
|
||||
null,
|
||||
null,
|
||||
MutableMethodImplementation(3),
|
||||
).toMutable().apply {
|
||||
addInstructions(
|
||||
"""
|
||||
invoke-static { p1 }, $activityHookClassDescriptor->getAttachBaseContext(Landroid/content/Context;)Landroid/content/Context;
|
||||
move-result-object p1
|
||||
invoke-super { p0, p1 }, $superclass->attachBaseContext(Landroid/content/Context;)V
|
||||
return-void
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
||||
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 {
|
||||
@@ -224,17 +289,15 @@ object PreferenceScreen : BasePreferenceScreen() {
|
||||
key = "revanced_settings_screen_03_feed",
|
||||
summaryKey = null,
|
||||
)
|
||||
val PLAYER = Screen(
|
||||
key = "revanced_settings_screen_04_player",
|
||||
val GENERAL_LAYOUT = Screen(
|
||||
key = "revanced_settings_screen_04_general",
|
||||
summaryKey = null,
|
||||
)
|
||||
val GENERAL_LAYOUT = Screen(
|
||||
key = "revanced_settings_screen_05_general",
|
||||
val PLAYER = Screen(
|
||||
key = "revanced_settings_screen_05_player",
|
||||
summaryKey = null,
|
||||
)
|
||||
|
||||
// Don't sort, as related preferences are scattered apart.
|
||||
// Can use title sorting after PreferenceCategory support is added.
|
||||
val SHORTS = Screen(
|
||||
key = "revanced_settings_screen_06_shorts",
|
||||
summaryKey = null,
|
||||
|
||||
@@ -47,8 +47,11 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch({
|
||||
tag = "app.revanced.extension.youtube.settings.preference.SpoofStreamingDataSideEffectsPreference"
|
||||
),
|
||||
ListPreference(
|
||||
"revanced_spoof_video_streams_language",
|
||||
summaryKey = null
|
||||
key = "revanced_spoof_video_streams_language",
|
||||
summaryKey = null,
|
||||
// Language strings are declared in Setting patch.
|
||||
entriesKey = "revanced_language_entries",
|
||||
entryValuesKey = "revanced_language_entry_values"
|
||||
),
|
||||
SwitchPreference("revanced_spoof_video_streams_ios_force_avc"),
|
||||
SwitchPreference("revanced_spoof_streaming_data_stats_for_nerds"),
|
||||
|
||||
@@ -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
|
||||
"""
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
)
|
||||
}
|
||||
@@ -17,22 +17,26 @@ import app.revanced.patches.shared.misc.mapping.resourceMappings
|
||||
import app.revanced.patches.shared.misc.settings.preference.InputType
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.TextPreference
|
||||
import app.revanced.patches.youtube.interaction.seekbar.disableFastForwardNoticeFingerprint
|
||||
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter
|
||||
import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch
|
||||
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.recyclerviewtree.hook.addRecyclerViewTreeHook
|
||||
import app.revanced.patches.youtube.misc.recyclerviewtree.hook.recyclerViewTreeHookPatch
|
||||
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
||||
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
||||
import app.revanced.util.*
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableField
|
||||
|
||||
var speedUnavailableId = -1L
|
||||
internal set
|
||||
internal var speedUnavailableId = -1L
|
||||
private set
|
||||
|
||||
private val customPlaybackSpeedResourcePatch = resourcePatch {
|
||||
dependsOn(resourceMappingPatch)
|
||||
@@ -61,6 +65,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch(
|
||||
recyclerViewTreeHookPatch,
|
||||
customPlaybackSpeedResourcePatch,
|
||||
addResourcesPatch,
|
||||
versionCheckPatch
|
||||
)
|
||||
|
||||
execute {
|
||||
@@ -71,6 +76,12 @@ internal val customPlaybackSpeedPatch = bytecodePatch(
|
||||
TextPreference("revanced_custom_playback_speeds", inputType = InputType.TEXT_MULTI_LINE),
|
||||
)
|
||||
|
||||
if (is_19_25_or_greater) {
|
||||
PreferenceScreen.VIDEO.addPreferences(
|
||||
TextPreference("revanced_speed_tap_and_hold", inputType = InputType.NUMBER_DECIMAL),
|
||||
)
|
||||
}
|
||||
|
||||
// Replace the speeds float array with custom speeds.
|
||||
speedArrayGeneratorFingerprint.method.apply {
|
||||
val sizeCallIndex = indexOfFirstInstructionOrThrow { getReference<MethodReference>()?.name == "size" }
|
||||
@@ -166,5 +177,27 @@ internal val customPlaybackSpeedPatch = bytecodePatch(
|
||||
addLithoFilter(FILTER_CLASS_DESCRIPTOR)
|
||||
|
||||
// endregion
|
||||
|
||||
|
||||
// region Custom tap and hold 2x speed.
|
||||
|
||||
if (is_19_25_or_greater) {
|
||||
disableFastForwardNoticeFingerprint.method.apply {
|
||||
val index = indexOfFirstInstructionOrThrow {
|
||||
(this as? NarrowLiteralInstruction)?.narrowLiteral == 2.0f.toRawBits()
|
||||
}
|
||||
val register = getInstruction<OneRegisterInstruction>(index).registerA
|
||||
|
||||
addInstructions(
|
||||
index + 1,
|
||||
"""
|
||||
invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->tapAndHoldSpeed()F
|
||||
move-result v$register
|
||||
"""
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -24,31 +24,31 @@ class StringResource(
|
||||
if (value.startsWith('"') && value.endsWith('"')) {
|
||||
// Raw strings allow unescaped single quote but not double quote.
|
||||
if (!value.substring(1, value.length - 1).contains(Regex("(?<!\\\\)[\"]"))) {
|
||||
return this;
|
||||
return this
|
||||
}
|
||||
} else {
|
||||
if (value.contains('\n')) {
|
||||
// Don't throw an exception, otherwise unnoticed mistakes
|
||||
// in Crowdin can cause patching failures.
|
||||
// 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")
|
||||
}
|
||||
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")
|
||||
|
||||
return this;
|
||||
return this
|
||||
}
|
||||
|
||||
// if the string is un-formatted, explicitly add the formatted attribute
|
||||
if (!formatted) setAttribute("formatted", "false")
|
||||
|
||||
textContent = value.validateAndroidStringEscaping();
|
||||
textContent = value.validateAndroidStringEscaping()
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
@@ -215,6 +215,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="video.speed.remember.rememberPlaybackSpeedPatch">
|
||||
</patch>
|
||||
<patch id="video.hdr.disableHdrPatch">
|
||||
</patch>
|
||||
<patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch">
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.enableSlideToSeekPatch">
|
||||
|
||||
@@ -215,6 +215,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="video.speed.remember.rememberPlaybackSpeedPatch">
|
||||
</patch>
|
||||
<patch id="video.hdr.disableHdrPatch">
|
||||
</patch>
|
||||
<patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch">
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.enableSlideToSeekPatch">
|
||||
|
||||
@@ -33,7 +33,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time_invalid">تاريخ إنشاء APK تالف</string>
|
||||
</patch>
|
||||
<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_reset">إعادة التعيين</string>
|
||||
<string name="revanced_settings_restart_title">تحديث وإعادة تشغيل</string>
|
||||
@@ -43,6 +43,62 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">إعادة تعيين إعدادات ReVanced إلى الوضع الافتراضي</string>
|
||||
<string name="revanced_settings_import_success">تم استيراد %d إعدادات</string>
|
||||
<string name="revanced_settings_import_failure_parse">فشل الاستيراد: %s</string>
|
||||
<string name="revanced_language_title">لغة ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"قد تكون الترجمات لبعض اللغات مفقودة أو غير مكتملة.
|
||||
|
||||
لترجمة لغات جديدة، تفضل بزيارة translate.revanced.app"</string>
|
||||
<string name="revanced_language_DEFAULT">لغة التطبيق</string>
|
||||
<string name="revanced_language_AR">العربية</string>
|
||||
<string name="revanced_language_AZ">Azerbaijani</string>
|
||||
<string name="revanced_language_BG">Bulgarian</string>
|
||||
<string name="revanced_language_BN">Bengali</string>
|
||||
<string name="revanced_language_CA">Catalan</string>
|
||||
<string name="revanced_language_CS">Czech</string>
|
||||
<string name="revanced_language_DA">Danish</string>
|
||||
<string name="revanced_language_DE">German</string>
|
||||
<string name="revanced_language_EL">Greek</string>
|
||||
<string name="revanced_language_EN">English</string>
|
||||
<string name="revanced_language_ES">Spanish</string>
|
||||
<string name="revanced_language_ET">Estonian</string>
|
||||
<string name="revanced_language_FA">فارسى</string>
|
||||
<string name="revanced_language_FI">Finnish</string>
|
||||
<string name="revanced_language_FR">French - Français</string>
|
||||
<string name="revanced_language_GU">Gujarati</string>
|
||||
<string name="revanced_language_HI">Hindi</string>
|
||||
<string name="revanced_language_HR">Croatian</string>
|
||||
<string name="revanced_language_HU">Hungarian</string>
|
||||
<string name="revanced_language_ID">Indonesian</string>
|
||||
<string name="revanced_language_IT">Italian</string>
|
||||
<string name="revanced_language_JA">Japanese</string>
|
||||
<string name="revanced_language_KK">Kazakh</string>
|
||||
<string name="revanced_language_KO">Korean</string>
|
||||
<string name="revanced_language_LT">Lithuanian</string>
|
||||
<string name="revanced_language_LV">Latvian</string>
|
||||
<string name="revanced_language_MK">Macedonian</string>
|
||||
<string name="revanced_language_MN">Mongolian</string>
|
||||
<string name="revanced_language_MR">Marathi</string>
|
||||
<string name="revanced_language_MS">Malay</string>
|
||||
<string name="revanced_language_MY">Burmese</string>
|
||||
<string name="revanced_language_NL">Dutch</string>
|
||||
<string name="revanced_language_OR">Odia</string>
|
||||
<string name="revanced_language_PA">Punjabi</string>
|
||||
<string name="revanced_language_PL">Polish</string>
|
||||
<string name="revanced_language_PT">Portugese</string>
|
||||
<string name="revanced_language_RO">Romanian</string>
|
||||
<string name="revanced_language_RU">Russian - Русский</string>
|
||||
<string name="revanced_language_SK">Slovak</string>
|
||||
<string name="revanced_language_SL">Slovene</string>
|
||||
<string name="revanced_language_SR">Serbian</string>
|
||||
<string name="revanced_language_SV">Swedish</string>
|
||||
<string name="revanced_language_SW">Swahili</string>
|
||||
<string name="revanced_language_TA">Tamil</string>
|
||||
<string name="revanced_language_TE">Telugu</string>
|
||||
<string name="revanced_language_TH">Thai</string>
|
||||
<string name="revanced_language_TR">Turkish</string>
|
||||
<string name="revanced_language_UK">Ukrainian</string>
|
||||
<string name="revanced_language_UR">Urdu</string>
|
||||
<string name="revanced_language_VI">Vietnamese</string>
|
||||
<string name="revanced_language_ZH">Chinese</string>
|
||||
<string name="revanced_pref_import_export_title">استيراد / تصدير</string>
|
||||
<string name="revanced_pref_import_export_summary">استيراد / تصدير إعدادات ReVanced</string>
|
||||
<!-- Settings about dialog. -->
|
||||
@@ -77,12 +133,15 @@ Second \"item\" text"</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_03_feed_title">الموجز</string>
|
||||
<string name="revanced_settings_screen_04_player_title">المشغل</string>
|
||||
<string name="revanced_settings_screen_05_general_title">التصميم العام</string>
|
||||
<string name="revanced_settings_screen_04_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_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_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 id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">تعطيل تشغيل فيديوهات Shorts في الخلفية</string>
|
||||
@@ -109,9 +168,9 @@ Second \"item\" text"</string>
|
||||
لن يتم إعلامك بأي أخطاء غير متوقعة."</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.general.hideLayoutComponentsPatch">
|
||||
<string name="revanced_disable_like_subscribe_glow_title">تعطيل توهج زر أعجبني / اشتراك</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_on">لن يتوهج زر أعجبني واشتراك عند ذكره</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_off">أعجبني واشتراك سوف يتوهج عند الإشارة</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_title">تعطيل توهُّج زِرّي أعجبني واشتراك</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_on">لن يتوهَّج زرّي أعجبني واشتراك عند ذكرهما</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_off">سيتوهَّج زرّي أعجبني واشتراك عند ذكرهما</string>
|
||||
<string name="revanced_hide_album_cards_title">إخفاء بطاقات الألبوم</string>
|
||||
<string name="revanced_hide_album_cards_summary_on">تم إخفاء بطاقات الألبوم</string>
|
||||
<string name="revanced_hide_album_cards_summary_off">يتم عرض بطاقات الألبوم</string>
|
||||
@@ -138,12 +197,12 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_join_membership_button_summary_on">تم إخفاء الزر</string>
|
||||
<string name="revanced_hide_join_membership_button_summary_off">يتم عرض الزر</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_for_you_shelf_title">إخفاء رف \"من أجلك\" في صفحة القناة</string>
|
||||
<string name="revanced_hide_for_you_shelf_title">إخفاء رف \"لـك\" في صفحة القناة</string>
|
||||
<string name="revanced_hide_for_you_shelf_summary_on">تم إخفاء الرف</string>
|
||||
<string name="revanced_hide_for_you_shelf_summary_off">يتم عرض الرف</string>
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<string name="revanced_hide_notify_me_button_title">إخفاء زر \'نبهني\'</string>
|
||||
<string name="revanced_hide_notify_me_button_title">إخفاء زر \'تنبيهي\'</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">تم إخفاء الزر</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">يتم عرض الزر</string>
|
||||
<!-- 'People also watch' should be translated using the same localized wording YouTube displays. -->
|
||||
@@ -164,9 +223,9 @@ Second \"item\" text"</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_off">يتم عرض رف الشرائح</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_off">يتم عرض الرقائق القابلة للتوسيع</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_off">يتم عرض الشرائح القابلة للتوسيع</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_off">يتم عرض مشاركات المجتمع</string>
|
||||
@@ -207,8 +266,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_quick_actions_summary_on">تم إخفاء الإجراءات السريعة</string>
|
||||
<string name="revanced_hide_quick_actions_summary_off">يتم عرض الإجراءات السريعة</string>
|
||||
<string name="revanced_hide_related_videos_title">إخفاء الفيديوهات ذات الصلة في الإجراءات السريعة</string>
|
||||
<string name="revanced_hide_related_videos_summary_on">تم إخفاء مقاطع الفيديو ذات الصلة</string>
|
||||
<string name="revanced_hide_related_videos_summary_off">يتم عرض مقاطع الفيديو ذات الصلة</string>
|
||||
<string name="revanced_hide_related_videos_summary_on">تم إخفاء الفيديوهات ذات الصلة</string>
|
||||
<string name="revanced_hide_related_videos_summary_off">يتم عرض الفيديوهات ذات الصلة</string>
|
||||
<string name="revanced_hide_image_shelf_title">إخفاء رفوف الصور في نتائج البحث</string>
|
||||
<string name="revanced_hide_image_shelf_summary_on">تم إخفاء رفوف الصورة</string>
|
||||
<string name="revanced_hide_image_shelf_summary_off">يتم عرض رفوف الصورة</string>
|
||||
@@ -227,6 +286,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_chapters_section_title">إخفاء قسم الفصول</string>
|
||||
<string name="revanced_hide_chapters_section_summary_on">تم إخفاء قسم الفصول</string>
|
||||
<string name="revanced_hide_chapters_section_summary_off">يتم عرض قسم الفصول</string>
|
||||
<string name="revanced_hide_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_summary_on">تم إخفاء قسم \"استكشاف البودكاست\"</string>
|
||||
<string name="revanced_hide_podcast_section_summary_off">يتم عرض قسم \"استكشاف البودكاست\"</string>
|
||||
@@ -242,7 +304,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_description_components_screen_title">وصف الفيديو</string>
|
||||
<string name="revanced_hide_description_components_screen_summary">إخفاء أو عرض مكونات وصف الفيديو</string>
|
||||
<string name="revanced_hide_filter_bar_screen_title">شريط التصفية</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">إخفاء شريط التصفية أو عرضه في الموجز والبحث ومقاطع الفيديو ذات الصلة</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">إخفاء شريط التصفية أو عرضه في الموجز والبحث الفيديوهات ذات الصلة</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">إخفاء في الموجز</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">مخفي في الموجز</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">يعرض في الموجز</string>
|
||||
@@ -293,15 +355,15 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_custom_filter_toast_invalid_syntax">فلتر مخصص غير صالح: %s</string>
|
||||
<string name="revanced_hide_keyword_content_screen_title">إخفاء محتوى الكلمات الرئيسية</string>
|
||||
<string name="revanced_hide_keyword_content_screen_summary">إخفاء فيديوهات البحث والموجز باستخدام فلاتر الكلمات المفتاحية</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_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_home_title">إخفاء فيديوهات الصفحة الرئيسية بواسطة الكلمات المفتاحية</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_search_title">إخفاء نتائج البحث عن طريق الكلمات المفتاحية</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_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>
|
||||
<!-- 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. -->
|
||||
@@ -348,6 +410,9 @@ Second \"item\" text"</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_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_summary_on">تم إخفاء رفوف التسوق</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">يتم عرض رفوف التسوق</string>
|
||||
@@ -441,13 +506,14 @@ Second \"item\" text"</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_summary">حجم النص على واجهة التمرير</string>
|
||||
<string name="revanced_swipe_overlay_background_alpha_title">شفافية خلفية واجهة التمرير</string>
|
||||
<string name="revanced_swipe_overlay_background_alpha_summary">قيمة شفافية خلفية واجهة التمرير</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_title">تعتيم خلفية واجهة التمرير السريع</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_summary">قيمة التعتيم بين 0-100</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_invalid_toast">يجب أن يكون تعتيم التمرير السريع بين 0-100</string>
|
||||
<string name="revanced_swipe_threshold_title">مقدار حد التمرير</string>
|
||||
<string name="revanced_swipe_threshold_summary">الحد الأدنى من التمرير قبل اكتشاف الإيماءة</string>
|
||||
<string name="revanced_swipe_change_video_title">تفعيل السحب لتغيير مقاطع الفيديو</string>
|
||||
<string name="revanced_swipe_change_video_summary_on">سيؤدي التمرير في وضع ملء الشاشة إلى التغيير إلى الفيديو التالي/السابق</string>
|
||||
<string name="revanced_swipe_change_video_summary_off">لن يؤدي التمرير في وضع ملء الشاشة إلى التغيير إلى الفيديو التالي/السابق</string>
|
||||
<string name="revanced_swipe_change_video_title">تمكين إيماءة التمرير لتغيير الفيديو</string>
|
||||
<string name="revanced_swipe_change_video_summary_on">سيؤدي التمرير في وضع ملء الشاشة إلى التغيير للفيديو التالي/السابق</string>
|
||||
<string name="revanced_swipe_change_video_summary_off">لن يؤدي التمرير في وضع ملء الشاشة إلى التغيير للفيديو التالي/السابق</string>
|
||||
</patch>
|
||||
<patch id="layout.autocaptions.autoCaptionsPatch">
|
||||
<string name="revanced_auto_captions_title">تعطيل التَّرْجَمَة التلقائية</string>
|
||||
@@ -519,14 +585,14 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_navigation_button_labels_summary_on">تم إخفاء التسميات</string>
|
||||
<string name="revanced_hide_navigation_button_labels_summary_off">يتم عرض التسميات</string>
|
||||
<string name="revanced_disable_translucent_status_bar_title">تعطيل شريط الحالة الشفاف</string>
|
||||
<string name="revanced_disable_translucent_status_bar_summary_on">شريط الحالة غير معتمة</string>
|
||||
<string name="revanced_disable_translucent_status_bar_summary_off">شريط الحالة غير شفافة أو عميقة</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_title">تعطيل شريط التنقل الشفاف الفاتح</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">شريط التنقل في الوضع الفاتح معتم</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">يكون شريط التنقل في الوضع الفاتح معتمًا أو نصف شفاف</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_dark_title">تعطيل الشريط الداكنة</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_dark_summary_on">شريط التنقل في الوضع الداكن معتم</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_dark_summary_off">شريط التطبيق المصوري الشفاف غير عميقة أو عميقة</string>
|
||||
<string name="revanced_disable_translucent_status_bar_summary_on">شريط الحالة غير شفاف</string>
|
||||
<string name="revanced_disable_translucent_status_bar_summary_off">شريط الحالة معتم أو شفاف</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_title">تعطيل الشريط الشفاف الفاتح</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">شريط التنقل في الوضع الفاتح غير شفاف</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">شريط التنقل في الوضع الفاتح معتم او شفاف</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_dark_title">تعطيل الشريط الشفاف الداكن</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_dark_summary_on">شريط التنقل في الوضع الداكن غير شفاف</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_dark_summary_off">شريط التنقل في الوضع الداكن معتم او شفاف</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.player.flyoutmenupanel.hidePlayerFlyoutMenuPatch">
|
||||
<string name="revanced_hide_player_flyout_title">القائمة المنبثقة</string>
|
||||
@@ -631,18 +697,18 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_shorts_player_screen_summary">إخفاء أو عرض المكونات في مشغل Shorts</string>
|
||||
<!-- 'home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||
<string name="revanced_hide_shorts_home_title">إخفاء Shorts في موجز الصفحة الرئيسية</string>
|
||||
<string name="revanced_hide_shorts_home_summary_on">مخفي في الصفحة الرئيسية ومقاطع الفيديو ذات الصلة</string>
|
||||
<string name="revanced_hide_shorts_home_summary_off">معروض في الصفحة الرئيسية ومقاطع الفيديو ذات الصلة</string>
|
||||
<string name="revanced_hide_shorts_home_summary_on">مخفية في الصفحة الرئيسية والفيديوهات ذات الصلة</string>
|
||||
<string name="revanced_hide_shorts_home_summary_off">تعرض في الصفحة الرئيسية والفيديوهات ذات الصلة</string>
|
||||
<!-- 'subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
|
||||
<string name="revanced_hide_shorts_subscriptions_title">إخفاء Shorts في موجز الاشتراكات</string>
|
||||
<string name="revanced_hide_shorts_subscriptions_summary_on">مخفية في موجز الاشتراكات</string>
|
||||
<string name="revanced_hide_shorts_subscriptions_summary_off">معروضة في موجز الاشتراكات</string>
|
||||
<string name="revanced_hide_shorts_subscriptions_summary_off">تعرض في موجز الاشتراكات</string>
|
||||
<string name="revanced_hide_shorts_search_title">إخفاء Shorts في نتائج البحث</string>
|
||||
<string name="revanced_hide_shorts_search_summary_on">مخفي في نتائج البحث</string>
|
||||
<string name="revanced_hide_shorts_search_summary_off">معروضة في نتائج البحث</string>
|
||||
<string name="revanced_hide_shorts_search_summary_on">مخفية في نتائج البحث</string>
|
||||
<string name="revanced_hide_shorts_search_summary_off">تعرض في نتائج البحث</string>
|
||||
<string name="revanced_hide_shorts_history_title">إخفاء Shorts في سجل المشاهدة</string>
|
||||
<string name="revanced_hide_shorts_history_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. -->
|
||||
<string name="revanced_hide_shorts_join_button_title">إخفاء زر الانضمام</string>
|
||||
<string name="revanced_hide_shorts_join_button_summary_on">تم إخفاء زر الانضمام</string>
|
||||
@@ -687,7 +753,7 @@ Second \"item\" text"</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_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_off">يتم عرض التأثير الفوّار لـزر أعجبني</string>
|
||||
<string name="revanced_hide_shorts_like_button_title">إخفاء زر أعجبني</string>
|
||||
@@ -745,14 +811,14 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_popup_panels_summary_off">يتم عرض لوحات المشغل المنبثقة</string>
|
||||
</patch>
|
||||
<patch id="layout.player.fullscreen.exitFullscreenPatch">
|
||||
<string name="revanced_exit_fullscreen_title">الخروج من وضع ملء الشاشة عند نهاية الفيديو</string>
|
||||
<string name="revanced_exit_fullscreen_title">الخروج من وضع ملء الشاشة عند انتهاء الفيديو</string>
|
||||
<string name="revanced_exit_fullscreen_entry_1">معطل</string>
|
||||
<string name="revanced_exit_fullscreen_entry_2">عمودي</string>
|
||||
<string name="revanced_exit_fullscreen_entry_3">أفقي</string>
|
||||
<string name="revanced_exit_fullscreen_entry_4">عمودي وأفقي</string>
|
||||
<string name="revanced_exit_fullscreen_entry_2">بالطول</string>
|
||||
<string name="revanced_exit_fullscreen_entry_3">بالعرض</string>
|
||||
<string name="revanced_exit_fullscreen_entry_4">بالطول والعرض</string>
|
||||
</patch>
|
||||
<patch id="layout.player.fullscreen.openVideosFullscreen">
|
||||
<string name="revanced_open_videos_fullscreen_portrait_title">فتح مقاطع الفيديو في ملء الشاشة</string>
|
||||
<string name="revanced_open_videos_fullscreen_portrait_title">فتح الفيديوهات في ملء الشاشة</string>
|
||||
<string name="revanced_open_videos_fullscreen_portrait_summary_on">يتم فتح الفيديوهات في وضع ملء الشاشة</string>
|
||||
<string name="revanced_open_videos_fullscreen_portrait_summary_off">لا يتم فتح الفيديوهات في وضع ملء الشاشة</string>
|
||||
</patch>
|
||||
@@ -771,12 +837,12 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">أعد تحميل الفيديو للتصويت بـ Return YouTube Dislike</string>
|
||||
<string name="revanced_ryd_enable_summary_on">يتم عرض لم يعجبني</string>
|
||||
<string name="revanced_ryd_enable_summary_off">لا يتم عرض لم يعجبني</string>
|
||||
<string name="revanced_ryd_shorts_title">عرض لم يعجني في مقاطع Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on">يتم عرض لم يعجني في مقاطع Shorts</string>
|
||||
<string name="revanced_ryd_shorts_title">عرض لم يعجني في فيديوهات Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on">يتم عرض لم يعجني في فيديوهات Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">"إبداءات لم يعجبني التي تظهر على فيديوهات Shorts
|
||||
|
||||
التقييد: قد لا تظهر إبداءات لم يعجبني في وضع التصفح المتخفي"</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">تم إخفاء لم يعجني في مقاطع Shorts</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">تم إخفاء لم يعجني في فيديوهات Shorts</string>
|
||||
<string name="revanced_ryd_dislike_percentage_title">لم يعجبني كــ نسبة مئوية</string>
|
||||
<string name="revanced_ryd_dislike_percentage_summary_on">يعرض عدد لم يعجبني كـ نسبة مئوية</string>
|
||||
<string name="revanced_ryd_dislike_percentage_summary_off">يعرض عدد لم يعجبني كـ رَقَم</string>
|
||||
@@ -829,7 +895,7 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.sponsorblock.sponsorBlockResourcePatch">
|
||||
<string name="revanced_sb_enable_sb">تمكين SponsorBlock</string>
|
||||
<string name="revanced_sb_enable_sb_sum">مانِع الرُعَاة هو نظام جماعي لتخطي الأجزاء المُمِلَّة في مقاطع YouTube</string>
|
||||
<string name="revanced_sb_enable_sb_sum">SponsorBlock مانِع الرُعَاة هو نظام جماعي لتخطي الأجزاء المُمِلَّة في مقاطع YouTube</string>
|
||||
<string name="revanced_sb_appearance_category">المظهر</string>
|
||||
<string name="revanced_sb_enable_voting">عرض زر التصويت</string>
|
||||
<string name="revanced_sb_enable_voting_sum_on">يتم عرض زر التصويت على المقطع</string>
|
||||
@@ -894,7 +960,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_segments_sponsor">الراعي</string>
|
||||
<string name="revanced_sb_segments_sponsor_sum">الترويج المدفوع الأجر، والإحالات المدفوعة الأجر والإعلانات المباشرة. ليس للترويج الذاتي أو لصراعات مجانية للقضايا/المبدعين/المواقع الإلكترونية/المنتجات التي يحبون الحصول عليها</string>
|
||||
<string name="revanced_sb_segments_selfpromo">ترويج شخصي/غير مدفوع الأجر</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">شبيهة بـ \"الراعي\" باستثناء ما يتعلق بالإعلانات غير المدفوعة الأجر أو الذاتية. ويشمل ذلك أقسام عن السلع أو التبرعات أو المعلومات المتعلقة بمن تعاونوا مع ناشر المحتوى</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">مشابهة لـ \"الراعي\" باستثناء ما يتعلق بالإعلانات غير المدفوعة الأجر أو الذاتية. ويشمل ذلك أقسام عن السلع أو التبرعات أو المعلومات المتعلقة بمن تعاونوا مع ناشر المحتوى</string>
|
||||
<string name="revanced_sb_segments_interaction">تذكير بالتفاعل (اشتراك)</string>
|
||||
<string name="revanced_sb_segments_interaction_sum">تذكير قصير للإعجاب أو الاشتراك أو المتابعة في منتصف المحتوى. إذا كانت طويلة أو تتعلق بشيء محدد، فيجب أن تكون خاضعة للترويج الشخصي بدلاً من ذلك</string>
|
||||
<string name="revanced_sb_segments_highlight">الأبرز</string>
|
||||
@@ -908,7 +974,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_segments_filler">خارج الموضوع/النكات</string>
|
||||
<string name="revanced_sb_segments_filler_sum">تم إضافة مشاهد ملتقطة خارج الموضوع أو الفكاهة التي ليست مطلوبة لفهم المحتوى الرئيسي للفيديو. لا تتضمن مقاطع توفر تَعبِير أو تفاصيل الخلفية</string>
|
||||
<string name="revanced_sb_segments_nomusic">الموسيقى: مقطع غير موسيقي</string>
|
||||
<string name="revanced_sb_segments_nomusic_sum">فقط للاستخدام في مقاطع الفيديو الموسيقية. أقسام مقاطع الفيديو الموسيقية بدون موسيقى، والتي لم يتم تغطيتها بالفعل من قبل فئة أخرى</string>
|
||||
<string name="revanced_sb_segments_nomusic_sum">فقط للاستخدام في المقاطع الموسيقية. أقسام المقاطع الموسيقية بدون موسيقى، والتي لم يتم تغطيتها بالفعل من قبل فئة أخرى</string>
|
||||
<string name="revanced_sb_skip_button_compact">تخطي</string>
|
||||
<string name="revanced_sb_skip_button_compact_highlight">الأبرز</string>
|
||||
<string name="revanced_sb_skip_button_sponsor">تخطي الراعي</string>
|
||||
@@ -1023,8 +1089,19 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">شكل نموذج التخطيط</string>
|
||||
<string name="revanced_change_form_factor_entry_1">الافتراضي</string>
|
||||
<string name="revanced_change_form_factor_entry_2">الهاتف</string>
|
||||
<string name="revanced_change_form_factor_entry_3">الكمبيوتر اللوحي</string>
|
||||
<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_4">Automotive</string>
|
||||
<string name="revanced_change_form_factor_user_dialog_message">"تتضمن التغييرات:
|
||||
|
||||
تخطيط الجهاز اللوحي
|
||||
• إخفاء منشورات المجتمع
|
||||
|
||||
تخطيط Automotive
|
||||
• إخفاء قائمة سجل المشاهدة
|
||||
• استعادة علامة التبويب \"استكشاف\"
|
||||
• فتح فيديوهات Shorts في المشغل العادي
|
||||
• تنظيم الخلاصة حسب الموضوعات والقناة"</string>
|
||||
</patch>
|
||||
<patch id="layout.spoofappversion.spoofAppVersionPatch">
|
||||
<string name="revanced_spoof_app_version_title">خِداع إصدار التطبيق</string>
|
||||
@@ -1039,7 +1116,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 -->
|
||||
<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_2">19.26.42 - \"إعادة الرموز القديمة للشريط والأدوات\"</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_2">19.26.42 - استعادة أيقونات التنقل القديمة</string>
|
||||
<!-- '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_2">18.20.39 - استعادة قائمة سرعة الفيديو العريضة & الجودة</string>
|
||||
@@ -1049,8 +1126,11 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.startpage.changeStartPagePatch">
|
||||
<string name="revanced_change_start_page_title">تعيين صفحة البداية</string>
|
||||
<string name="revanced_change_start_page_entry_default">الافتراضي</string>
|
||||
<string name="revanced_change_start_page_entry_all_subscriptions">الاشتراكات كلها</string>
|
||||
<string name="revanced_change_start_page_entry_browse">تصفح القنوات</string>
|
||||
<string name="revanced_change_start_page_entry_courses">الدورات / التعلم</string>
|
||||
<string name="revanced_change_start_page_entry_explore">استكشف</string>
|
||||
<string name="revanced_change_start_page_entry_fashion">Fashion & Beauty</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_library">المكتبة</string>
|
||||
@@ -1058,11 +1138,17 @@ Second \"item\" text"</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_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_shopping">تسوق</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_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_your_clips">كليباتك</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
|
||||
<string name="revanced_disable_resuming_shorts_player_title">تعطيل استئناف مشغل Shorts</string>
|
||||
@@ -1070,10 +1156,10 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_disable_resuming_shorts_player_summary_off">سيتم استئناف تشغيل مشغل Shorts عند بدء تشغيل التطبيق</string>
|
||||
</patch>
|
||||
<patch id="layout.shortsplayer.shortsPlayerTypePatch">
|
||||
<string name="revanced_shorts_player_type_title">فتح مقاطع الـShorts باستخدام</string>
|
||||
<string name="revanced_shorts_player_type_title">فتح فيديوهات Shorts باستخدام</string>
|
||||
<string name="revanced_shorts_player_type_shorts">مشغل Shorts</string>
|
||||
<string name="revanced_shorts_player_type_regular_player">مشغل عادي</string>
|
||||
<string name="revanced_shorts_player_type_regular_player_fullscreen">شاشة كاملة - مشغل عادي</string>
|
||||
<string name="revanced_shorts_player_type_regular_player">المشغل العادي</string>
|
||||
<string name="revanced_shorts_player_type_regular_player_fullscreen">المشغل العادي في وضع ملء الشاشة</string>
|
||||
</patch>
|
||||
<patch id="layout.shortsautoplay.shortsAutoplayPatch">
|
||||
<string name="revanced_shorts_autoplay_title">التشغيل التلقائي لفيديوهات Shorts</string>
|
||||
@@ -1143,8 +1229,10 @@ Second \"item\" text"</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_off">يتم عرض لون شريط تقدم الفيديو الاصلي</string>
|
||||
<string name="revanced_seekbar_custom_color_value_title">لون شريط تقدم الفيديو المخصص</string>
|
||||
<string name="revanced_seekbar_custom_color_value_summary">لون شريط التقدم</string>
|
||||
<string name="revanced_seekbar_custom_color_primary_title">لون شريط تقدم الفيديو المخصص</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>
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch">
|
||||
@@ -1180,7 +1268,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_alt_thumbnail_stills_about_title">لقطات الفيديو الثابتة</string>
|
||||
<string name="revanced_alt_thumbnail_stills_about_summary">يتم التقاط اللقطات الثابتة من بداية/وسط/نهاية كل فيديو. هذه الصور مدمجة في YouTube ولا يتم استخدام أي واجهة برمجة تطبيقات خارجية</string>
|
||||
<string name="revanced_alt_thumbnail_stills_fast_title">استخدم اللقطات الثابتة السريعة</string>
|
||||
<string name="revanced_alt_thumbnail_stills_fast_summary_on">استخدام اللقطات متوسطة الجودة. سيتم تحميل المُصغَّرات بشكل أسرع، ولكن البث المباشر و المقاطع التي لم يتم إصدارها أو القديمة جدًا قد تعرض مُصغَّرات فارغة</string>
|
||||
<string name="revanced_alt_thumbnail_stills_fast_summary_on">استخدام اللقطات متوسطة الجودة. سيتم تحميل المُصغَّرات بشكل أسرع، ولكن البث المباشر و الفيديوهات التي لم يتم إصدارها أو القديمة جدًا قد تعرض مُصغَّرات فارغة</string>
|
||||
<string name="revanced_alt_thumbnail_stills_fast_summary_off">استخدام لقطات الفيديو الثابتة بجودة عالية</string>
|
||||
<string name="revanced_alt_thumbnail_stills_time_title">وقت الفيديو لأخذ اللقطات الثابتة منه</string>
|
||||
<string name="revanced_alt_thumbnail_stills_time_entry_1">بداية الفيديو</string>
|
||||
@@ -1246,13 +1334,13 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_force_original_audio_title">فرض الصوت الأصلي</string>
|
||||
<string name="revanced_force_original_audio_summary_on">استخدام الصوت الأصلي</string>
|
||||
<string name="revanced_force_original_audio_summary_off">استخدام الصوت الافتراضي</string>
|
||||
<string name="revanced_force_original_audio_not_available">لاستخدام هذه الميزة، غيّر تقليد تدفقات البيانات إلى نوع عميل iOS</string>
|
||||
<string name="revanced_force_original_audio_not_available">لاستخدام هذه الميزة، قم بتغيير محاكاة بث المحتوى إلى نوع العميل iOS</string>
|
||||
</patch>
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as revanced_custom_playback_speeds_auto -->
|
||||
<string name="revanced_video_quality_default_entry_1">تلقائي</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_title">تذكر تغييرات جودة الفيديو</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_summary_on">تنطبق تغييرات الجودة على جميع مقاطع الفيديو</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_summary_on">تنطبق تغييرات الجودة على جميع الفيديوهات</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_summary_off">تنطبق تغييرات الجودة على الفيديو الحالي فقط</string>
|
||||
<string name="revanced_video_quality_default_wifi_title">جودة الفيديو الافتراضية على شبكة Wi-Fi</string>
|
||||
<string name="revanced_video_quality_default_mobile_title">جودة الفيديو الافتراضية على شبكة الجوَّال</string>
|
||||
@@ -1274,6 +1362,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_custom_playback_speeds_invalid">يجب أن تكون سرعات التشغيل المخصصة أقل من %s</string>
|
||||
<string name="revanced_custom_playback_speeds_parse_exception">سرعة التشغيل المخصصة غير صالحة</string>
|
||||
<string name="revanced_custom_playback_speeds_auto">تلقائي</string>
|
||||
<string name="revanced_speed_tap_and_hold_title">سرعة النقر مع الاستمرار المخصصة</string>
|
||||
<string name="revanced_speed_tap_and_hold_summary">سرعة التشغيل بين 0-8</string>
|
||||
</patch>
|
||||
<patch id="video.speed.remember.rememberPlaybackSpeedPatch">
|
||||
<string name="revanced_remember_playback_speed_last_selected_title">تذكر التغيرات في سرعة التشغيل</string>
|
||||
@@ -1282,6 +1372,11 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_playback_speed_default_title">سرعة التشغيل الافتراضية</string>
|
||||
<string name="revanced_remember_playback_speed_toast">تغيير السرعة الافتراضية إلى: %s</string>
|
||||
</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">
|
||||
<string name="revanced_restore_old_video_quality_menu_title">استعادة قائمة جودة الفيديو القديمة</string>
|
||||
<string name="revanced_restore_old_video_quality_menu_summary_on">يتم عرض قائمة جودة الفيديو القديمة</string>
|
||||
@@ -1303,77 +1398,27 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">إيقاف تشغيل هذا الإعداد قد يسبب مشاكل في تشغيل الفيديو.</string>
|
||||
<string name="revanced_spoof_video_streams_client_type_title">العميل الافتراضي</string>
|
||||
<!-- 'no auth' means no authentication -->
|
||||
<string name="revanced_spoof_video_streams_client_type_android_vr_no_auth">Android VR (no auth)</string>
|
||||
<string name="revanced_spoof_video_streams_client_type_android_vr_no_auth">Android VR (بدون مصادقة)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_title">فرض iOS AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">يتم إجبار ترميز فيديو على AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">يتم تحديد ترميز فيديو تلقائيًا</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">يتم فرض ترميز فيديو على AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">يتم تحديد ترميز الفيديو تلقائيًا</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">"قد يؤدي تمكين هذا إلى تحسين عمر البطارية وإصلاح تقطيع التشغيل.
|
||||
|
||||
AVC لديه حد أقصى للدقة 1080 بكسل ، لا يتوفر ترميز الصوت Opus ، وسوف يستخدم تشغيل الفيديو بيانات إنترنت أكثر من VP9 أو AV1."</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_tv_title">آثار جانبية لتزييف iOS</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_tv_summary">"• قد لا يتم تشغيل الأفلام أو مقاطع الفيديو المدفوعة
|
||||
AVC لديه حد أقصى للدقة 1080p، لا يتوفر ترميز الصوت Opus، وسوف يستخدم تشغيل الفيديو بيانات إنترنت أكثر من VP9 أو AV1."</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_tv_title">الآثار الجانبية لمحاكاة هوية iOS</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_tv_summary">"• قد لا يتم تشغيل الأفلام أو الفيديوهات المدفوعة
|
||||
• مستوى الصوت الثابت غير متوفر
|
||||
• تنتهي مقاطع الفيديو قبل ثانية واحدة"</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_title">تأثيرات نظام الجهاز الأندرويد</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_summary">"• قائمة قائمة الصوت مفقودة
|
||||
• لا يتوفر بحجم الصوت متاح
|
||||
• تثبيت الصوت الأصلي ليس غير متوافر"</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_off">يتم العميل مخفي في الإحصائيات للنردز</string>
|
||||
<string name="revanced_spoof_video_streams_language_title">لغة البث الإفتراضي القياسي لافتراضي الاهتداري</string>
|
||||
<string name="revanced_spoof_video_streams_language_DEFAULT">لغة التطبيق</string>
|
||||
<string name="revanced_spoof_video_streams_language_AR">العربية</string>
|
||||
<string name="revanced_spoof_video_streams_language_AZ">Azerbaijani</string>
|
||||
<string name="revanced_spoof_video_streams_language_BG">Bulgarian</string>
|
||||
<string name="revanced_spoof_video_streams_language_BN">Bengali</string>
|
||||
<string name="revanced_spoof_video_streams_language_CA">Catalan</string>
|
||||
<string name="revanced_spoof_video_streams_language_CS">Czech</string>
|
||||
<string name="revanced_spoof_video_streams_language_DA">Danish</string>
|
||||
<string name="revanced_spoof_video_streams_language_DE">German</string>
|
||||
<string name="revanced_spoof_video_streams_language_EL">Greek</string>
|
||||
<string name="revanced_spoof_video_streams_language_EN">English</string>
|
||||
<string name="revanced_spoof_video_streams_language_ES">Spanish</string>
|
||||
<string name="revanced_spoof_video_streams_language_ET">Estonian</string>
|
||||
<string name="revanced_spoof_video_streams_language_FA">فارسى</string>
|
||||
<string name="revanced_spoof_video_streams_language_FI">Finnish</string>
|
||||
<string name="revanced_spoof_video_streams_language_FR">French</string>
|
||||
<string name="revanced_spoof_video_streams_language_GU">Gujarati</string>
|
||||
<string name="revanced_spoof_video_streams_language_HI">Hindi</string>
|
||||
<string name="revanced_spoof_video_streams_language_HR">Croatian</string>
|
||||
<string name="revanced_spoof_video_streams_language_HU">Hungarian</string>
|
||||
<string name="revanced_spoof_video_streams_language_ID"> Indonesian</string>
|
||||
<string name="revanced_spoof_video_streams_language_IT">Italian</string>
|
||||
<string name="revanced_spoof_video_streams_language_JA">Japanese</string>
|
||||
<string name="revanced_spoof_video_streams_language_KK">Kazakh</string>
|
||||
<string name="revanced_spoof_video_streams_language_KO">Korean</string>
|
||||
<string name="revanced_spoof_video_streams_language_LT">Lithuanian</string>
|
||||
<string name="revanced_spoof_video_streams_language_LV">Latvian</string>
|
||||
<string name="revanced_spoof_video_streams_language_MK">Macedonian</string>
|
||||
<string name="revanced_spoof_video_streams_language_MN">Mongolian</string>
|
||||
<string name="revanced_spoof_video_streams_language_MR">Marathi</string>
|
||||
<string name="revanced_spoof_video_streams_language_MS">Malay</string>
|
||||
<string name="revanced_spoof_video_streams_language_MY">Burmese</string>
|
||||
<string name="revanced_spoof_video_streams_language_NL">Dutch</string>
|
||||
<string name="revanced_spoof_video_streams_language_OR">Odia</string>
|
||||
<string name="revanced_spoof_video_streams_language_PA">Punjabi</string>
|
||||
<string name="revanced_spoof_video_streams_language_PL">Polish</string>
|
||||
<string name="revanced_spoof_video_streams_language_PT">البرتغالية</string>
|
||||
<string name="revanced_spoof_video_streams_language_RO">Romanian</string>
|
||||
<string name="revanced_spoof_video_streams_language_RU">Russian</string>
|
||||
<string name="revanced_spoof_video_streams_language_SK">Slovak</string>
|
||||
<string name="revanced_spoof_video_streams_language_SL">Slovene</string>
|
||||
<string name="revanced_spoof_video_streams_language_SR">Serbian</string>
|
||||
<string name="revanced_spoof_video_streams_language_SV">Swedish</string>
|
||||
<string name="revanced_spoof_video_streams_language_SW">Swahili</string>
|
||||
<string name="revanced_spoof_video_streams_language_TA">Tamil</string>
|
||||
<string name="revanced_spoof_video_streams_language_TE">Telugu</string>
|
||||
<string name="revanced_spoof_video_streams_language_TH">Thai</string>
|
||||
<string name="revanced_spoof_video_streams_language_TR">Turkish</string>
|
||||
<string name="revanced_spoof_video_streams_language_UK">Ukrainian</string>
|
||||
<string name="revanced_spoof_video_streams_language_UR">Urdu</string>
|
||||
<string name="revanced_spoof_video_streams_language_VI">Vietnamese</string>
|
||||
<string name="revanced_spoof_video_streams_language_ZH">Chinese</string>
|
||||
• تنتهي الفيديوهات قبل ب 1 ثانية"</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_title">الآثار الجانبية لمحاكاة هوية Android</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_summary">"• قائمة المقطع الصوتي مفقودة
|
||||
• مستوى الصوت الثابت غير متاح
|
||||
• فرض الصوت الأصلي غير متوفر"</string>
|
||||
<string name="revanced_spoof_video_streams_about_no_av1">• لا يوجد ترميز الفيديو AV1</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_summary_on">يتم عرض نوع العميل في إحصاءات تقنية</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">تم إخفاء نوع العميل في إحصاءات تقنية</string>
|
||||
<string name="revanced_spoof_video_streams_language_title">لغة البث الصوتي الافتراضية للواقع الافتراضي VR</string>
|
||||
</patch>
|
||||
</app>
|
||||
<app id="twitch">
|
||||
|
||||
@@ -217,6 +217,8 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="video.speed.remember.rememberPlaybackSpeedPatch">
|
||||
</patch>
|
||||
<patch id="video.hdr.disableHdrPatch">
|
||||
</patch>
|
||||
<patch id="video.videoqualitymenu.restoreOldVideoQualityMenuResourcePatch">
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.enableSlideToSeekPatch">
|
||||
|
||||
@@ -33,6 +33,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time_invalid">APK qurulma vaxtı pozulub</string>
|
||||
</patch>
|
||||
<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_reset">Sıfırla</string>
|
||||
<string name="revanced_settings_restart_title">Yenilə və yenidən başlat</string>
|
||||
@@ -42,6 +43,62 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">ReVanced tənzimləmələr standarta təyin edildi</string>
|
||||
<string name="revanced_settings_import_success">%d tənzimləmə idxal edildi</string>
|
||||
<string name="revanced_settings_import_failure_parse">Uğursuz idxal prosesi: %s</string>
|
||||
<string name="revanced_language_title">ReVanced dili</string>
|
||||
<string name="revanced_language_user_dialog_message">"Bəzi dillər üçün tərcümələr əskik və ya səhv ola bilər.
|
||||
|
||||
Yeni dilləri tərcümə etmək üçün translate.revanced.app 'ə daxil olun"</string>
|
||||
<string name="revanced_language_DEFAULT">Tətbiq dili</string>
|
||||
<string name="revanced_language_AR">Ərəbcə</string>
|
||||
<string name="revanced_language_AZ">Azərbaycanca</string>
|
||||
<string name="revanced_language_BG">Bolqarca</string>
|
||||
<string name="revanced_language_BN">Benqalca</string>
|
||||
<string name="revanced_language_CA">Katalan dili</string>
|
||||
<string name="revanced_language_CS">Çexcə</string>
|
||||
<string name="revanced_language_DA">Dan dili</string>
|
||||
<string name="revanced_language_DE">Almanca</string>
|
||||
<string name="revanced_language_EL">Yunanca</string>
|
||||
<string name="revanced_language_EN">İngiliscə</string>
|
||||
<string name="revanced_language_ES">İspanca</string>
|
||||
<string name="revanced_language_ET">Estonca</string>
|
||||
<string name="revanced_language_FA">Farsca</string>
|
||||
<string name="revanced_language_FI">Fincə</string>
|
||||
<string name="revanced_language_FR">Fransızca</string>
|
||||
<string name="revanced_language_GU">Qücərat dili</string>
|
||||
<string name="revanced_language_HI">Hindcə</string>
|
||||
<string name="revanced_language_HR">Xorvatca</string>
|
||||
<string name="revanced_language_HU">Macarca</string>
|
||||
<string name="revanced_language_ID">İndoneziya dili</string>
|
||||
<string name="revanced_language_IT">İtalyanca</string>
|
||||
<string name="revanced_language_JA">Yaponca</string>
|
||||
<string name="revanced_language_KK">Qazax dili</string>
|
||||
<string name="revanced_language_KO">Koreya dili</string>
|
||||
<string name="revanced_language_LT">Litva Dili</string>
|
||||
<string name="revanced_language_LV">Letonca</string>
|
||||
<string name="revanced_language_MK">Makedon Dili</string>
|
||||
<string name="revanced_language_MN">Monqolca</string>
|
||||
<string name="revanced_language_MR">Marathi dili</string>
|
||||
<string name="revanced_language_MS">Malay dili</string>
|
||||
<string name="revanced_language_MY">Birmanca</string>
|
||||
<string name="revanced_language_NL">Hollandca</string>
|
||||
<string name="revanced_language_OR">Oriya dili</string>
|
||||
<string name="revanced_language_PA">Pəncabca</string>
|
||||
<string name="revanced_language_PL">Polyak dili</string>
|
||||
<string name="revanced_language_PT">Portuqal dili</string>
|
||||
<string name="revanced_language_RO">Rumınca</string>
|
||||
<string name="revanced_language_RU">Rusca</string>
|
||||
<string name="revanced_language_SK">Slovak dili</string>
|
||||
<string name="revanced_language_SL">Slovencə</string>
|
||||
<string name="revanced_language_SR">Serbcə</string>
|
||||
<string name="revanced_language_SV">İsveçcə</string>
|
||||
<string name="revanced_language_SW">Suahili dili</string>
|
||||
<string name="revanced_language_TA">Tamilcə</string>
|
||||
<string name="revanced_language_TE">Teluqu dili</string>
|
||||
<string name="revanced_language_TH">Tayca</string>
|
||||
<string name="revanced_language_TR">Türkcə</string>
|
||||
<string name="revanced_language_UK">Ukrayna dili</string>
|
||||
<string name="revanced_language_UR">Urdu dili</string>
|
||||
<string name="revanced_language_VI">Vyetnamca</string>
|
||||
<string name="revanced_language_ZH">Çincə</string>
|
||||
<string name="revanced_pref_import_export_title">İdxal/İxrac et</string>
|
||||
<string name="revanced_pref_import_export_summary">ReVanced tənzimləmələrin idxal/ixrac et</string>
|
||||
<!-- Settings about dialog. -->
|
||||
@@ -76,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_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_04_player_title">Oynadıcı</string>
|
||||
<string name="revanced_settings_screen_05_general_title">Ümumi tərtibat</string>
|
||||
<string name="revanced_settings_screen_07_seekbar_title">Axtarış çubuğu</string>
|
||||
<string name="revanced_settings_screen_04_general_title">Ümumi</string>
|
||||
<string name="revanced_settings_screen_05_player_title">Oynadıcı</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_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_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 id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Shorts arxa plan oynatmasın qapat</string>
|
||||
@@ -108,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>
|
||||
</patch>
|
||||
<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_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_off">\"Bəyən və abunə ol\" düyməsinə klikləyəndə parlayacaq</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ə toxunanda parlamayacaq</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_summary_on">Albom kartları gizlidir</string>
|
||||
<string name="revanced_hide_album_cards_summary_off">Albom kartları göstərilir</string>
|
||||
@@ -163,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_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_expandable_chip_title">Videoların altında genişlənən çipi 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_off">Genişlənən çiplər göstərilir</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">Açılan kartlar gizlidir</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Açı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_summary_on">İcma elanları gizlədilib</string>
|
||||
<string name="revanced_hide_community_posts_summary_off">İcma elanları göstərilir</string>
|
||||
@@ -226,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_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_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_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>
|
||||
@@ -268,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_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_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_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>
|
||||
@@ -295,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_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_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_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_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>
|
||||
<!-- 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. -->
|
||||
@@ -347,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_summary_on">Etiket gizlədilib</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_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>
|
||||
@@ -412,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>
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.enableSeekbarTappingPatch">
|
||||
<string name="revanced_seekbar_tapping_title">Axtarış çubuğu toxunmasını aktivləşdir</string>
|
||||
<string name="revanced_seekbar_tapping_summary_on">Axtarış çubuğu toxunması aktivdir</string>
|
||||
<string name="revanced_seekbar_tapping_summary_off">Axtarış çubuğu toxunması qapalıdır</string>
|
||||
<string name="revanced_seekbar_tapping_title">İrəliləmə cizgisi toxunmasını aktivləşdir</string>
|
||||
<string name="revanced_seekbar_tapping_summary_on">İrəliləyiş cizgisi toxunması aktivdir</string>
|
||||
<string name="revanced_seekbar_tapping_summary_off">İrəliləyiş cizgisi toxunması qapalıdır</string>
|
||||
</patch>
|
||||
<patch id="interaction.swipecontrols.swipeControlsResourcePatch">
|
||||
<string name="revanced_swipe_brightness_title">Parlaqlıq jestini aktivləşdir</string>
|
||||
@@ -426,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_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_haptic_feedback_title">Toxunuşlu əks-əlaqəni 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_off">Toxunuşlu əks-əlaqə qeyri-aktivdir</string>
|
||||
<string name="revanced_swipe_haptic_feedback_title">Əks-əlaqə reaksiyasını aktivləşdir</string>
|
||||
<string name="revanced_swipe_haptic_feedback_summary_on">Əks-əlaqə reaksiyası aktivləşdirilib</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_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>
|
||||
@@ -440,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_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_overlay_background_alpha_title">Sürüşdürmə arxa plan görünməsi</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_title">Sürüşdürmə cildi arxa plan qeyri-şəffaflığı</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_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>
|
||||
@@ -555,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>
|
||||
<!-- '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_summary_on">Kömək və əks əlaqə, 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_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ə menyusu göstərilir</string>
|
||||
<!-- 'Playback speed' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_speed_title">\"Oynatma sürəti\"ni gizlət</string>
|
||||
<string name="revanced_hide_player_flyout_speed_summary_on">Oynatma sürəti menyusu gizlidir</string>
|
||||
@@ -590,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_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' -->
|
||||
<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_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_off">Avtomatik oynatma düyməsi göstərilir</string>
|
||||
</patch>
|
||||
@@ -603,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>
|
||||
</patch>
|
||||
<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_off">Ambient rejimi aktivləşdirildi</string>
|
||||
</patch>
|
||||
@@ -618,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ı açıqdır</string>
|
||||
</patch>
|
||||
<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_summary_on">Video oynadıcı axtarış çubuğu gizlidir</string>
|
||||
<string name="revanced_hide_seekbar_summary_off">Video oynadıcı axtarış çubuğu 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_summary_on">Miniatür axtarış çubuğu 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_title">Video oynadıcıda irəliləyiş cizgisin gizlə</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ı irəliləyiş cizgisi göstərilir</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 irəliləmə cizgisi gizlədilib</string>
|
||||
<string name="revanced_hide_seekbar_thumbnail_summary_off">Miniatür irəliləmə cizgisi göstərilir</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.shorts.hideShortsComponentsResourcePatch">
|
||||
<string name="revanced_shorts_player_screen_title">Shorts oynadıcı</string>
|
||||
@@ -643,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_off">Baxış tarixçəsində göstərilib</string>
|
||||
<!-- '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_off">Qoşulma düyməsi göstərilir</string>
|
||||
<!-- 'subscribe' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
@@ -656,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_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_super_thanks_button_title">Super təşəkkürlər 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_off">Super təşəkkür düyməsi göstərilir</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_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_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_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_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_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_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_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_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>
|
||||
@@ -686,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_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_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_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ənmə 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_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_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_off">Şərhlər düyməsi göstərilir</string>
|
||||
<!-- 'remix' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
@@ -780,7 +847,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_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' -->
|
||||
<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_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>
|
||||
@@ -813,22 +880,22 @@ Məhdudiyyət: Bəyənməmələr gizli rejimdə görünmür"</string>
|
||||
</patch>
|
||||
<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_summary_on">Axtarış çubuğu 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_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_off">Tam ekran axtarış çubuğu 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_summary_on">İrəliləyiş cizgisi miniatürləri yüksək 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 irəliləyiş cizgisi miniatürü yüksək 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 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>
|
||||
<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_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_off">Axtarış çubuğu miniatürləri tam ekranda görünəcək</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ış 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ış cizgisi miniatürləri tam ekranda görünəcək</string>
|
||||
</patch>
|
||||
<patch id="layout.sponsorblock.sponsorBlockResourcePatch">
|
||||
<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_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>
|
||||
@@ -893,7 +960,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_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_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_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>
|
||||
@@ -942,7 +1009,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_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_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_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>
|
||||
@@ -984,7 +1051,7 @@ ilə
|
||||
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_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_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>
|
||||
@@ -1049,7 +1116,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 -->
|
||||
<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_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' -->
|
||||
<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 & keyfiyyət menyusunu bərpa et</string>
|
||||
@@ -1059,8 +1126,11 @@ Sonradan qapadılarsa, UI səhvlərin önləmək üçün tətbiq məlumatların
|
||||
<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_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_courses">Kurslar / Öyrənmə</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_history">Tarixçə</string>
|
||||
<string name="revanced_change_start_page_entry_library">Kitabxana</string>
|
||||
@@ -1068,11 +1138,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_movies">Filmlər</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_shopping">Alış-Veriş</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_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_your_clips">Klipləriniz</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
|
||||
<string name="revanced_disable_resuming_shorts_player_title">Shorts oynadıcı başladıcını qapat</string>
|
||||
@@ -1150,12 +1226,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>
|
||||
</patch>
|
||||
<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_summary_on">Fərdi axtarma çubuğu 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_value_title">Fərdi axtarma çubuğu rəngi</string>
|
||||
<string name="revanced_seekbar_custom_color_value_summary">Axtarma çubuğu 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_title">Fərdi irəliləmə cizgisi rəngini aktivləşdir</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 irəliləmə cizgisi rəngi göstərilir</string>
|
||||
<string name="revanced_seekbar_custom_color_primary_title">Fərdi irəliləmə cizgisi rəngi</string>
|
||||
<string name="revanced_seekbar_custom_color_primary_summary">İrəliləmə cizgisi rəngi</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 id="layout.thumbnails.bypassImageRegionRestrictionsPatch">
|
||||
<string name="revanced_bypass_image_region_restrictions_title">Təsvir bölgə məhdudiyyətlərini ötür</string>
|
||||
@@ -1177,7 +1255,6 @@ Bunu aktivləşdirmə, bəzi regionlarda əngəllənib silinən şəkilləri dü
|
||||
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow & Orijinal miniatürlər</string>
|
||||
<string name="revanced_alt_thumbnail_options_entry_3">DeArrow & Kadr çəkilişlər</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.
|
||||
|
||||
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.
|
||||
@@ -1249,9 +1326,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>
|
||||
</patch>
|
||||
<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_summary_on">Əks-əlaqə bağlandı</string>
|
||||
<string name="revanced_disable_zoom_haptics_summary_off">Əks-əlaqə aktivdir</string>
|
||||
<string name="revanced_disable_zoom_haptics_title">Yaxınlaşdırma reaksiyasın qapat</string>
|
||||
<string name="revanced_disable_zoom_haptics_summary_on">Reaksiya qapalıdır</string>
|
||||
<string name="revanced_disable_zoom_haptics_summary_off">Reaksiya aktivdir</string>
|
||||
</patch>
|
||||
<patch id="video.audio.forceOriginalAudioPatch">
|
||||
<string name="revanced_force_original_audio_title">Orijinal səsi tələb et</string>
|
||||
@@ -1277,14 +1354,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>
|
||||
</patch>
|
||||
<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_summary_on">Fərdi sürət menyusu 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_title">Fərdi oynatma sürəti siyahısı</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 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_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_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_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 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>
|
||||
@@ -1293,10 +1372,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_remember_playback_speed_toast">İlkin sürət %s kimi dəyişdirildi</string>
|
||||
</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">
|
||||
<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_off">Köhnə video keyfiyyət menyusu göstərmir</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 siyahısı görünmür</string>
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.enableSlideToSeekPatch">
|
||||
<string name="revanced_slide_to_seek_title">Axtarmaq üçün sürüşdürməni aktiv et</string>
|
||||
@@ -1329,69 +1413,19 @@ AVC maksimum 1080p görüntü imkanına malikdir, Opus audio kodlama olmur və v
|
||||
<string name="revanced_spoof_video_streams_about_android_summary">"• Səs treki menyusu yoxdur
|
||||
• Sabit səs səviyyəsi yoxdur
|
||||
• İ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_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_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_video_streams_language_title">VR-da ilkin səs yayımı dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_DEFAULT">Tətbiq dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_AR">Ərəbcə</string>
|
||||
<string name="revanced_spoof_video_streams_language_AZ">Azərbaycanca</string>
|
||||
<string name="revanced_spoof_video_streams_language_BG">Bolqarca</string>
|
||||
<string name="revanced_spoof_video_streams_language_BN">Benqalca</string>
|
||||
<string name="revanced_spoof_video_streams_language_CA">Katalanca</string>
|
||||
<string name="revanced_spoof_video_streams_language_CS">Çexcə</string>
|
||||
<string name="revanced_spoof_video_streams_language_DA">Danimarka dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_DE">Almanca</string>
|
||||
<string name="revanced_spoof_video_streams_language_EL">Yunanca</string>
|
||||
<string name="revanced_spoof_video_streams_language_EN">İngiliscə</string>
|
||||
<string name="revanced_spoof_video_streams_language_ES">İspanca</string>
|
||||
<string name="revanced_spoof_video_streams_language_ET">Estonca</string>
|
||||
<string name="revanced_spoof_video_streams_language_FA">Farsca</string>
|
||||
<string name="revanced_spoof_video_streams_language_FI">Fincə</string>
|
||||
<string name="revanced_spoof_video_streams_language_FR">Fransızca</string>
|
||||
<string name="revanced_spoof_video_streams_language_GU">Qücərat dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_HI">Hindcə</string>
|
||||
<string name="revanced_spoof_video_streams_language_HR">Xorvatca</string>
|
||||
<string name="revanced_spoof_video_streams_language_HU">Macarca</string>
|
||||
<string name="revanced_spoof_video_streams_language_ID">İndoneziya dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_IT">İtalyanca</string>
|
||||
<string name="revanced_spoof_video_streams_language_JA">Yaponca</string>
|
||||
<string name="revanced_spoof_video_streams_language_KK">Qazaxca</string>
|
||||
<string name="revanced_spoof_video_streams_language_KO">Koreyaca</string>
|
||||
<string name="revanced_spoof_video_streams_language_LT">Litvaca</string>
|
||||
<string name="revanced_spoof_video_streams_language_LV">Letonca</string>
|
||||
<string name="revanced_spoof_video_streams_language_MK">Makedon Dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_MN">Monqolca</string>
|
||||
<string name="revanced_spoof_video_streams_language_MR">Marathi dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_MS">Malay dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_MY">Birman dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_NL">Hollandca</string>
|
||||
<string name="revanced_spoof_video_streams_language_OR">Oriya dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_PA">Pəncabca</string>
|
||||
<string name="revanced_spoof_video_streams_language_PL">Polyak dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_PT">Portuqal dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_RO">Rumınca</string>
|
||||
<string name="revanced_spoof_video_streams_language_RU">Rusca</string>
|
||||
<string name="revanced_spoof_video_streams_language_SK">Slovak dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_SL">Sloven dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_SR">Serbcə</string>
|
||||
<string name="revanced_spoof_video_streams_language_SV">İsveçcə</string>
|
||||
<string name="revanced_spoof_video_streams_language_SW">Suahili dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_TA">Tamilcə</string>
|
||||
<string name="revanced_spoof_video_streams_language_TE">Teluquca</string>
|
||||
<string name="revanced_spoof_video_streams_language_TH">Tay dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_TR">Türkcə</string>
|
||||
<string name="revanced_spoof_video_streams_language_UK">Ukrayna dili</string>
|
||||
<string name="revanced_spoof_video_streams_language_UR">Urduca</string>
|
||||
<string name="revanced_spoof_video_streams_language_VI">Vyetnamca</string>
|
||||
<string name="revanced_spoof_video_streams_language_ZH">Çincə</string>
|
||||
</patch>
|
||||
</app>
|
||||
<app id="twitch">
|
||||
<patch id="ad.audio.audioAdsPatch">
|
||||
<string name="revanced_block_audio_ads_title">Səsli reklamları əngəllə</string>
|
||||
<string name="revanced_block_audio_ads_summary_on">Səsli reklamlar bloklanıb</string>
|
||||
<string name="revanced_block_audio_ads_summary_off">Səsli reklamlar bloklanmayıb</string>
|
||||
<string name="revanced_block_audio_ads_title">Səs reklamların əngəllə</string>
|
||||
<string name="revanced_block_audio_ads_summary_on">Səs reklamları bloklanıb</string>
|
||||
<string name="revanced_block_audio_ads_summary_off">Səs reklamları bloklanmayıb</string>
|
||||
</patch>
|
||||
<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>
|
||||
|
||||
@@ -22,8 +22,8 @@ Second \"item\" text"</string>
|
||||
<resources>
|
||||
<app id="shared">
|
||||
<patch id="misc.checks.checkEnvironmentPatch">
|
||||
<string name="revanced_check_environment_failed_title">\"Правядзенне праверкі асяроддзя не ўдалося\"</string>
|
||||
<string name="revanced_check_environment_dialog_open_official_source_button">\"Адкрыць афіцыйны вэб-сайт\"</string>
|
||||
<string name="revanced_check_environment_failed_title">Праверкі не пройдзены</string>
|
||||
<string name="revanced_check_environment_dialog_open_official_source_button">Адкрыць афіцыйны вэб-сайт</string>
|
||||
<string name="revanced_check_environment_dialog_ignore_button">Ігнараваць</string>
|
||||
<string name="revanced_check_environment_failed_message"><h5>Гэта дадатак відавочна не з\'яўляецца патчам.</h5><br>Гэта дадатак можа працаваць няправільна, а таксама можа быць <b>небяспечным або нават небяспечным у выкарыстанні</b>.<br><br>Гэтыя праверкі азначаюць, што гэта дадатак было загаддзя перароблена або атрымана ад кагосьці іншага:<br><br><small>%1$s</small><br>Настойліва рэкамендуецца <b>выдаліць гэты дадатак і перарабіць яго самастойна</b>, каб пераканацца, што вы выкарыстоўваеце правераны і бяспечны дадатак.<p><br>Калі ігнараваць, гэта папярэджанне будзе паказана толькі два разы.</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>
|
||||
</patch>
|
||||
<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_reset">Скінуць</string>
|
||||
<string name="revanced_settings_restart_title">Абнавіце і перазагрузіце</string>
|
||||
@@ -43,6 +43,62 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Налады ReVanced скінуты да стандартных</string>
|
||||
<string name="revanced_settings_import_success">Імпартавана %d налад</string>
|
||||
<string name="revanced_settings_import_failure_parse">Памылка імпарту: %s</string>
|
||||
<string name="revanced_language_title">Мова ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Пераклады для некаторых моў могуць быць адсутнымі або няпоўнымі.
|
||||
|
||||
Каб дадаць новыя мовы, наведайце translate.revanced.app"</string>
|
||||
<string name="revanced_language_DEFAULT">Мова праграмы</string>
|
||||
<string name="revanced_language_AR">Арабская</string>
|
||||
<string name="revanced_language_AZ">Азербайджанскі</string>
|
||||
<string name="revanced_language_BG">Балгарская</string>
|
||||
<string name="revanced_language_BN">Бенгальская</string>
|
||||
<string name="revanced_language_CA">Каталонская</string>
|
||||
<string name="revanced_language_CS">Чэшскі</string>
|
||||
<string name="revanced_language_DA">Дацкі</string>
|
||||
<string name="revanced_language_DE">Нямецкі</string>
|
||||
<string name="revanced_language_EL">Грэцкі</string>
|
||||
<string name="revanced_language_EN">Англійская</string>
|
||||
<string name="revanced_language_ES">Іспанская</string>
|
||||
<string name="revanced_language_ET">Эстонская</string>
|
||||
<string name="revanced_language_FA">Персідская</string>
|
||||
<string name="revanced_language_FI">Фінская</string>
|
||||
<string name="revanced_language_FR">Французская</string>
|
||||
<string name="revanced_language_GU">Гуджараці</string>
|
||||
<string name="revanced_language_HI">Хіндзі</string>
|
||||
<string name="revanced_language_HR">Харвацкая</string>
|
||||
<string name="revanced_language_HU">Венгерская</string>
|
||||
<string name="revanced_language_ID">Інданезійская</string>
|
||||
<string name="revanced_language_IT">Італьянская</string>
|
||||
<string name="revanced_language_JA">Японская</string>
|
||||
<string name="revanced_language_KK">Казахская</string>
|
||||
<string name="revanced_language_KO">Карэйская</string>
|
||||
<string name="revanced_language_LT">Літоўская</string>
|
||||
<string name="revanced_language_LV">Латышская</string>
|
||||
<string name="revanced_language_MK">Македонская</string>
|
||||
<string name="revanced_language_MN">Мангольская</string>
|
||||
<string name="revanced_language_MR">Малаялам</string>
|
||||
<string name="revanced_language_MS">Малайская</string>
|
||||
<string name="revanced_language_MY">Бірманская</string>
|
||||
<string name="revanced_language_NL">Нідэрландская</string>
|
||||
<string name="revanced_language_OR">Одыя</string>
|
||||
<string name="revanced_language_PA">Пенджабі</string>
|
||||
<string name="revanced_language_PL">Польская</string>
|
||||
<string name="revanced_language_PT">Партугальская</string>
|
||||
<string name="revanced_language_RO">Румынская</string>
|
||||
<string name="revanced_language_RU">Руская</string>
|
||||
<string name="revanced_language_SK">Славацкая</string>
|
||||
<string name="revanced_language_SL">Славенская</string>
|
||||
<string name="revanced_language_SR">Сербская</string>
|
||||
<string name="revanced_language_SV">Шведская</string>
|
||||
<string name="revanced_language_SW">Суахілі</string>
|
||||
<string name="revanced_language_TA">Тамільская</string>
|
||||
<string name="revanced_language_TE">Тэлугу</string>
|
||||
<string name="revanced_language_TH">Тайская</string>
|
||||
<string name="revanced_language_TR">Турецкая</string>
|
||||
<string name="revanced_language_UK">Украінская</string>
|
||||
<string name="revanced_language_UR">Урду</string>
|
||||
<string name="revanced_language_VI">В\'етнамская</string>
|
||||
<string name="revanced_language_ZH">Кітайская</string>
|
||||
<string name="revanced_pref_import_export_title">Імпарт / Экспарт</string>
|
||||
<string name="revanced_pref_import_export_summary">Імпарт / Экспарт налад ReVanced</string>
|
||||
<!-- Settings about dialog. -->
|
||||
@@ -77,13 +133,15 @@ Second \"item\" text"</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_03_feed_title">Карміць</string>
|
||||
<string name="revanced_settings_screen_04_player_title">Гулец</string>
|
||||
<string name="revanced_settings_screen_05_general_title">Генеральная планіроўка</string>
|
||||
<string name="revanced_settings_screen_06_shorts_title">Shorts</string>
|
||||
<string name="revanced_settings_screen_04_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_08_swipe_controls_title">Элементы кіравання пальцам</string>
|
||||
<string name="revanced_settings_screen_11_misc_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 id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Адключыць прайграванне Shorts у фонавым</string>
|
||||
@@ -110,9 +168,9 @@ Second \"item\" text"</string>
|
||||
Вы не будзеце атрымліваць апавяшчэнні пра нечаканыя падзеі."</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.general.hideLayoutComponentsPatch">
|
||||
<string name="revanced_disable_like_subscribe_glow_title">Адключыць свячэнне кнопкі \"Падабаецца\" / \"Падпісацца\"</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_on">Кнопка \"Падабаецца\" і \"Падпісацца\" не будуць свяціцца пры згадванні</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_off">Кнопка \"Падабаецца\" і \"Падпісацца\" будуць свяціцца пры згадванні</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_title">Адключыць свецянне кнопак «Мне падабаецца» і «Падпісацца»</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_on">Кнопкі «Падабаецца» і «Падпісацца» не будуць мігцець пры згадванні</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_off">Кнопкі «Падабаецца» і «Падпісацца» будуць мігцець пры згадванні</string>
|
||||
<string name="revanced_hide_album_cards_title">Схаваць карты альбома</string>
|
||||
<string name="revanced_hide_album_cards_summary_on">Карткі альбомаў схаваныя</string>
|
||||
<string name="revanced_hide_album_cards_summary_off">Паказваюцца альбомныя карткі</string>
|
||||
@@ -165,9 +223,9 @@ Second \"item\" text"</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_off">Паказана паліца для чыпсаў</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_off">Паказаны чыпы, якія пашыраюцца</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_off">Пашыраныя карткі паказаныя</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_off">Паказваюцца паведамленні ў супольнасці</string>
|
||||
@@ -228,6 +286,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_chapters_section_title">Схаваць раздзел \"Раздзелы\"</string>
|
||||
<string name="revanced_hide_chapters_section_summary_on">Раздзел раздзелаў схаваны</string>
|
||||
<string name="revanced_hide_chapters_section_summary_off">Паказваецца раздзел раздзелаў</string>
|
||||
<string name="revanced_hide_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_summary_on">Раздзел \"Агляд падкаста\" схаваны</string>
|
||||
<string name="revanced_hide_podcast_section_summary_off">Паказаны раздзел \"Агляд падкаста\"</string>
|
||||
@@ -270,7 +331,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Схаваць каментарый для папярэдняга прагляду</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Каментарый перад праглядам схаваны</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Паказваецца папярэдні прагляд каментарыя</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Схаваць кнопку падзякі</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Схаваць кнопку \"Дзякуй\"\"</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Кнопка падзякі схавана</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Паказана кнопка падзякі</string>
|
||||
<string name="revanced_hide_comments_timestamp_and_emoji_buttons_title">Схаваць метку часу і кнопкі эмодзі</string>
|
||||
@@ -297,12 +358,12 @@ Second \"item\" text"</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_off">Відэа на ўкладцы \"Галоўная\" не фільтруюцца па ключавых словах</string>
|
||||
<string name="revanced_hide_keyword_content_subscriptions_title">Схаваць відэа з падпіскі па ключавых словах</string>
|
||||
<string name="revanced_hide_keyword_content_subscriptions_summary_on">Відэа ва ўкладцы «Падпіскі» фільтруюцца па ключавых словах</string>
|
||||
<string name="revanced_hide_keyword_content_subscriptions_summary_off">Відэа ва ўкладцы \"Падпіскі\" не фільтруюцца па ключавых словах</string>
|
||||
<string name="revanced_hide_keyword_content_search_title">Схаваць вынікі пошуку па ключавых словах</string>
|
||||
<string name="revanced_hide_keyword_content_search_summary_on">Вынікі пошуку фільтруюцца па ключавых словах</string>
|
||||
<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>
|
||||
<!-- 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. -->
|
||||
@@ -349,6 +410,9 @@ Second \"item\" text"</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_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_summary_on">Паліца крамы схавана</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Паліца крамы паказана</string>
|
||||
@@ -401,7 +465,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_external_downloader_summary_on">Кнопка загрузкі паказваецца ў плэеры</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' -->
|
||||
<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_off">Кнопка \"Спампаваць\" адкрывае ўласную праграму загрузкі ў праграме</string>
|
||||
<string name="revanced_external_downloader_name_title">Назва пакета загрузніка</string>
|
||||
@@ -442,8 +506,9 @@ Second \"item\" text"</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_summary">Памер тэксту для накладання пальцам</string>
|
||||
<string name="revanced_swipe_overlay_background_alpha_title">Бачнасць фону пальцам</string>
|
||||
<string name="revanced_swipe_overlay_background_alpha_summary">Бачнасць фону накладання пальцам</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_title">Непразрыстасць фону накладкі пракруткі</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_summary">Значэнне непразрыстасці паміж 0-100</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_invalid_toast">Непразрыстасць пракруткі павінна быць паміж 0-100</string>
|
||||
<string name="revanced_swipe_threshold_title">Парог велічыні пальцам</string>
|
||||
<string name="revanced_swipe_threshold_summary">Велічыня парогавага значэння для правядзення пальцам</string>
|
||||
<string name="revanced_swipe_change_video_title">Уключыць зьмену відэа праз правядзенне пальцам</string>
|
||||
@@ -588,14 +653,14 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_title">Схаваць папярэдні & кнопкі наступнага відэа</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_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_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' -->
|
||||
<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_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_off">Паказана кнопка аўтазапуску</string>
|
||||
</patch>
|
||||
@@ -605,7 +670,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Паказваюцца карткі канцавога экрана</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
<string name="revanced_disable_fullscreen_ambient_mode_title">Адключыць актыўны рэжым у поўнаэкранным рэжыме</string>
|
||||
<string name="revanced_disable_fullscreen_ambient_mode_title">Адключыць рэжым навакольнага асяроддзя ў поўнаэкранным рэжыме</string>
|
||||
<string name="revanced_disable_fullscreen_ambient_mode_summary_on">Навакольны рэжым адключаны</string>
|
||||
<string name="revanced_disable_fullscreen_ambient_mode_summary_off">Неактыўны рэжым уключаны</string>
|
||||
</patch>
|
||||
@@ -645,38 +710,38 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_shorts_history_summary_on">Схавана ў гісторыі праглядаў</string>
|
||||
<string name="revanced_hide_shorts_history_summary_off">Паказаны ў гісторыі праглядаў</string>
|
||||
<!-- 'join' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
<string name="revanced_hide_shorts_join_button_title">Схаваць кнопку далучыцца</string>
|
||||
<string name="revanced_hide_shorts_join_button_title">Схаваць кнопку «Далучыцца»</string>
|
||||
<string name="revanced_hide_shorts_join_button_summary_on">Кнопка «Далучыцца» схавана</string>
|
||||
<string name="revanced_hide_shorts_join_button_summary_off">Паказана кнопка «Далучыцца»</string>
|
||||
<!-- 'subscribe' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
<string name="revanced_hide_shorts_subscribe_button_title">Схаваць кнопку падпісацца</string>
|
||||
<string name="revanced_hide_shorts_subscribe_button_title">Схаваць кнопку «Падпісацца»</string>
|
||||
<string name="revanced_hide_shorts_subscribe_button_summary_on">Кнопка \"Падпісацца\" схавана</string>
|
||||
<string name="revanced_hide_shorts_subscribe_button_summary_off">Паказана кнопка «Падпісацца»</string>
|
||||
<string name="revanced_hide_shorts_paused_overlay_buttons_title">Схаваць прыпыненыя кнопкі накладання</string>
|
||||
<string name="revanced_hide_shorts_paused_overlay_buttons_summary_on">Прыпыненыя кнопкі накладання схаваны</string>
|
||||
<string name="revanced_hide_shorts_paused_overlay_buttons_summary_off">Паказваюцца прыпыненыя кнопкі накладання</string>
|
||||
<string name="revanced_hide_shorts_shop_button_title">Схаваць кнопку крамы</string>
|
||||
<string name="revanced_hide_shorts_shop_button_title">Схаваць кнопку «Крама»</string>
|
||||
<string name="revanced_hide_shorts_shop_button_summary_on">Кнопка крамы схавана</string>
|
||||
<string name="revanced_hide_shorts_shop_button_summary_off">Паказваецца кнопка крамы</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_title">Схаваць кнопку супердзякуй</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Кнопка супердзякуй схавана</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Паказана кнопка \"Супер дзякуй\"</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_title">Схаваць кнопку «Купіць Super Thanks»</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Кнопка Super Thanks схавана</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Кнопка Super Thanks паказана</string>
|
||||
<string name="revanced_hide_shorts_tagged_products_title">Схаваць пазначаныя прадукты</string>
|
||||
<string name="revanced_hide_shorts_tagged_products_summary_on">Пазначаныя прадукты схаваны</string>
|
||||
<string name="revanced_hide_shorts_tagged_products_summary_off">Прадукты з тэгамі паказаны</string>
|
||||
<string name="revanced_hide_shorts_location_label_title">Схаваць метку месцазнаходжання</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Метка месцазнаходжання схавана</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Паказана метка месцазнаходжання</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Схаваць кнопку захавання музыкі</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Схаваць кнопку «Захаваць музыку»</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Кнопка захавання музыкі схавана</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Кнопка захавання музыкі паказана</string>
|
||||
<string name="revanced_hide_shorts_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_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_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_off">Кнопка с зелёным экраном Shorts отображается</string>
|
||||
<string name="revanced_hide_shorts_hashtag_button_title">Скрыть хештег-кнопку Shorts</string>
|
||||
@@ -688,24 +753,24 @@ Second \"item\" text"</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_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_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_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_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_off">Паказана кнопка каментарыяў</string>
|
||||
<!-- 'remix' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
<string name="revanced_hide_shorts_remix_button_title">Схаваць кнопку рэмікса</string>
|
||||
<string name="revanced_hide_shorts_remix_button_title">Схаваць кнопку «Рэмікс»</string>
|
||||
<string name="revanced_hide_shorts_remix_button_summary_on">Кнопка \"Рэмікс\" схавана</string>
|
||||
<string name="revanced_hide_shorts_remix_button_summary_off">Паказана кнопка \"Рэмікс\"</string>
|
||||
<!-- 'share' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
<string name="revanced_hide_shorts_share_button_title">Схаваць кнопку абагульвання</string>
|
||||
<string name="revanced_hide_shorts_share_button_title">Схаваць кнопку «Падзяліцца»</string>
|
||||
<string name="revanced_hide_shorts_share_button_summary_on">Кнопка \"Падзяліцца\" схавана</string>
|
||||
<string name="revanced_hide_shorts_share_button_summary_off">Паказана кнопка \"Падзяліцца\"</string>
|
||||
<string name="revanced_hide_shorts_info_panel_title">Схаваць інфармацыйную панэль</string>
|
||||
@@ -782,7 +847,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_dislike_percentage_summary_on">Неўпадабанні паказаны ў працэнтах</string>
|
||||
<string name="revanced_ryd_dislike_percentage_summary_off">Неўпадабанні паказаны ў выглядзе колькасці</string>
|
||||
<!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' -->
|
||||
<string name="revanced_ryd_compact_layout_title">Кампактная кнопка</string>
|
||||
<string name="revanced_ryd_compact_layout_title">Кампактны дызайн кнопак «Падабаецца» і «Не падабаецца»</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_on">Кнопка \"Падабаецца\" ў стылі мінімальнай шырыні</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_off">Кнопка \"Падабаецца\", аформленая для лепшага выгляду</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Паказаць тост, калі API недаступны</string>
|
||||
@@ -830,7 +895,7 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.sponsorblock.sponsorBlockResourcePatch">
|
||||
<string name="revanced_sb_enable_sb">Уключыць SponsorBlock</string>
|
||||
<string name="revanced_sb_enable_sb_sum">SponsorBlock - гэта краўдсорсінгавая сістэма для пропуску раздражняльных частак відэа YouTube</string>
|
||||
<string name="revanced_sb_enable_sb_sum">SponsorBlock — гэта краўдсорсінгавая сістэма, якая дазваляе прапускаць раздражняльныя фрагменты відэа на YouTube</string>
|
||||
<string name="revanced_sb_appearance_category">Паглядзіце</string>
|
||||
<string name="revanced_sb_enable_voting">Паказаць кнопку галасавання</string>
|
||||
<string name="revanced_sb_enable_voting_sum_on">Паказана кнопка сегментнага галасавання</string>
|
||||
@@ -896,7 +961,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_segments_sponsor">Спонсар</string>
|
||||
<string name="revanced_sb_segments_sponsor_sum">Платнае прасоўванне, платныя рэфералы і прамая рэклама. Не для самарэкламы або бясплатных выкрыкаў справам/стваральнікам/вэб-сайтам/прадуктам, якія ім падабаюцца</string>
|
||||
<string name="revanced_sb_segments_selfpromo">Неаплатнае/самарэклама</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">Падобна \"Спонсару\", за выключэннем неаплатнага або самарэкламы. Уключае раздзелы пра тавары, ахвяраванні або інфармацыю аб тым, з кім яны супрацоўнічалі</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">Аналогічна спонсарству, але для неаплачваемай або ўласнай рэкламы. Уключае раздзелы аб таварах, ахвяраваннях або інфармацыі аб тым, з кім яны супрацоўнічалі</string>
|
||||
<string name="revanced_sb_segments_interaction">Напамін аб узаемадзеянні (падпісацца)</string>
|
||||
<string name="revanced_sb_segments_interaction_sum">Кароткі напамін паставіць лайкі, падпісацца або падпісацца на іх у сярэдзіне кантэнту. Калі ён доўгі або прысвечаны нечаму канкрэтнаму, ён павінен адпавядаць самарэкламе</string>
|
||||
<string name="revanced_sb_segments_highlight">Вылучыць</string>
|
||||
@@ -1052,6 +1117,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 -->
|
||||
<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_2">19.26.42 - Аднаўленне старых значкоў навігацыі</string>
|
||||
<!-- '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_2">18.20.39 - Аднавіць хуткасць шырокага відэа & якаснае меню</string>
|
||||
@@ -1061,8 +1127,11 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.startpage.changeStartPagePatch">
|
||||
<string name="revanced_change_start_page_title">Усталяваць стартавую старонку</string>
|
||||
<string name="revanced_change_start_page_entry_default">Па змаўчанні</string>
|
||||
<string name="revanced_change_start_page_entry_all_subscriptions">Усе падпіскі</string>
|
||||
<string name="revanced_change_start_page_entry_browse">Обзор каналов</string>
|
||||
<string name="revanced_change_start_page_entry_courses">Курсы / Адукацыя</string>
|
||||
<string name="revanced_change_start_page_entry_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_history">Гісторыя</string>
|
||||
<string name="revanced_change_start_page_entry_library">Библиотека</string>
|
||||
@@ -1070,11 +1139,17 @@ Second \"item\" text"</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_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_shopping">Пакупкі</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_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_your_clips">Вашыя кліпы</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
|
||||
<string name="revanced_disable_resuming_shorts_player_title">Адключыць аднаўленне прайгравання Shorts</string>
|
||||
@@ -1155,8 +1230,10 @@ Second \"item\" text"</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_off">Паказаны зыходны колер панэлі пошуку</string>
|
||||
<string name="revanced_seekbar_custom_color_value_title">Карыстальніцкі колер панэлі пошуку</string>
|
||||
<string name="revanced_seekbar_custom_color_value_summary">Колер панэлі пошуку</string>
|
||||
<string name="revanced_seekbar_custom_color_primary_title">Спецыяльны колер пошуку</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>
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch">
|
||||
@@ -1286,6 +1363,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_custom_playback_speeds_invalid">Нестандартныя хуткасці павінны быць менш за %s</string>
|
||||
<string name="revanced_custom_playback_speeds_parse_exception">Несапраўдныя нестандартныя хуткасці прайгравання</string>
|
||||
<string name="revanced_custom_playback_speeds_auto">Аўто</string>
|
||||
<string name="revanced_speed_tap_and_hold_title">Уласны хуткасць націску і ўтрымання</string>
|
||||
<string name="revanced_speed_tap_and_hold_summary">Хуткасць прайгравання між 0-8</string>
|
||||
</patch>
|
||||
<patch id="video.speed.remember.rememberPlaybackSpeedPatch">
|
||||
<string name="revanced_remember_playback_speed_last_selected_title">Запомніце змены хуткасці прайгравання</string>
|
||||
@@ -1294,6 +1373,11 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_playback_speed_default_title">Стандартная хуткасць прайгравання</string>
|
||||
<string name="revanced_remember_playback_speed_toast">Хуткасць па змаўчанні зменена на: %s</string>
|
||||
</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">
|
||||
<string name="revanced_restore_old_video_quality_menu_title">Аднавіць старое меню якасці відэа</string>
|
||||
<string name="revanced_restore_old_video_quality_menu_summary_on">Паказана старое меню якасці відэа</string>
|
||||
@@ -1330,62 +1414,12 @@ AVC мае максімальнае дазвол 1080p, аўдыёкадэк Opu
|
||||
<string name="revanced_spoof_video_streams_about_android_summary">"• Меню гукавой дарожкі адсутнічае
|
||||
• Стабільны гук недаступны
|
||||
• Прымусовае арыгінальнае аўдыё недаступна"</string>
|
||||
<string name="revanced_spoof_video_streams_about_no_av1">• Няма відэакідавання AV1</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_summary_on">Тып кліента адлюстроўваецца ў статыстыцы для спецыялістаў</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">Кліент схаваны ў статыстыцы для спецыялістаў</string>
|
||||
<string name="revanced_spoof_video_streams_language_title">Мова гукавой дарожкі па змаўчанні для VR</string>
|
||||
<string name="revanced_spoof_video_streams_language_DEFAULT">Мова праграмы</string>
|
||||
<string name="revanced_spoof_video_streams_language_AR">Арабский</string>
|
||||
<string name="revanced_spoof_video_streams_language_AZ">Азербайджанский</string>
|
||||
<string name="revanced_spoof_video_streams_language_BG">Болгарский</string>
|
||||
<string name="revanced_spoof_video_streams_language_BN">Бенгальский</string>
|
||||
<string name="revanced_spoof_video_streams_language_CA">Каталонский</string>
|
||||
<string name="revanced_spoof_video_streams_language_CS">Чешский</string>
|
||||
<string name="revanced_spoof_video_streams_language_DA">Датский</string>
|
||||
<string name="revanced_spoof_video_streams_language_DE">Немецкий</string>
|
||||
<string name="revanced_spoof_video_streams_language_EL">Греческий</string>
|
||||
<string name="revanced_spoof_video_streams_language_EN">Англійская</string>
|
||||
<string name="revanced_spoof_video_streams_language_ES">Іспанская</string>
|
||||
<string name="revanced_spoof_video_streams_language_ET">Эстонская</string>
|
||||
<string name="revanced_spoof_video_streams_language_FA">Фарсі</string>
|
||||
<string name="revanced_spoof_video_streams_language_FI">Фінская</string>
|
||||
<string name="revanced_spoof_video_streams_language_FR">Французская</string>
|
||||
<string name="revanced_spoof_video_streams_language_GU">Гуяраті</string>
|
||||
<string name="revanced_spoof_video_streams_language_HI">Хянді</string>
|
||||
<string name="revanced_spoof_video_streams_language_HR">Хорватская</string>
|
||||
<string name="revanced_spoof_video_streams_language_HU">Венгерская</string>
|
||||
<string name="revanced_spoof_video_streams_language_ID">Инданезійская</string>
|
||||
<string name="revanced_spoof_video_streams_language_IT">Итальянская</string>
|
||||
<string name="revanced_spoof_video_streams_language_JA">Японская</string>
|
||||
<string name="revanced_spoof_video_streams_language_KK">Казахская</string>
|
||||
<string name="revanced_spoof_video_streams_language_KO">Корэйская</string>
|
||||
<string name="revanced_spoof_video_streams_language_LT">Літоуская</string>
|
||||
<string name="revanced_spoof_video_streams_language_LV">Латышская</string>
|
||||
<string name="revanced_spoof_video_streams_language_MK">Македонская</string>
|
||||
<string name="revanced_spoof_video_streams_language_MN">Монгольская</string>
|
||||
<string name="revanced_spoof_video_streams_language_MR">Маратхі</string>
|
||||
<string name="revanced_spoof_video_streams_language_MS">Малайская</string>
|
||||
<string name="revanced_spoof_video_streams_language_MY">Брыманская</string>
|
||||
<string name="revanced_spoof_video_streams_language_NL">Нідрландский</string>
|
||||
<string name="revanced_spoof_video_streams_language_OR">Орія</string>
|
||||
<string name="revanced_spoof_video_streams_language_PA">Панджабский</string>
|
||||
<string name="revanced_spoof_video_streams_language_PL">Польская</string>
|
||||
<string name="revanced_spoof_video_streams_language_PT">Партугальская</string>
|
||||
<string name="revanced_spoof_video_streams_language_RO">Румынская</string>
|
||||
<string name="revanced_spoof_video_streams_language_RU">Русская</string>
|
||||
<string name="revanced_spoof_video_streams_language_SK">Словацкия</string>
|
||||
<string name="revanced_spoof_video_streams_language_SL">Словенская</string>
|
||||
<string name="revanced_spoof_video_streams_language_SR">Сербская</string>
|
||||
<string name="revanced_spoof_video_streams_language_SV">Швецкая</string>
|
||||
<string name="revanced_spoof_video_streams_language_SW">Суахілі</string>
|
||||
<string name="revanced_spoof_video_streams_language_TA">Тамільская</string>
|
||||
<string name="revanced_spoof_video_streams_language_TE">Тэлугу</string>
|
||||
<string name="revanced_spoof_video_streams_language_TH">Тайская</string>
|
||||
<string name="revanced_spoof_video_streams_language_TR">Турэцкая</string>
|
||||
<string name="revanced_spoof_video_streams_language_UK">Украёнская</string>
|
||||
<string name="revanced_spoof_video_streams_language_UR">Урду</string>
|
||||
<string name="revanced_spoof_video_streams_language_VI">Віетнамская</string>
|
||||
<string name="revanced_spoof_video_streams_language_ZH">Кітайская</string>
|
||||
</patch>
|
||||
</app>
|
||||
<app id="twitch">
|
||||
|
||||
@@ -33,7 +33,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time_invalid">Датата на компилация на APK е повредена</string>
|
||||
</patch>
|
||||
<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_reset">Възстанови</string>
|
||||
<string name="revanced_settings_restart_title">Рестартирай и опресни</string>
|
||||
@@ -43,6 +43,62 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_reset">Настройките на ReVanced бяха нулирани</string>
|
||||
<string name="revanced_settings_import_success">Следните настройки бяха импортирани успешно: %d</string>
|
||||
<string name="revanced_settings_import_failure_parse">Импортирането беше неуспешно: %s</string>
|
||||
<string name="revanced_language_title">Език на ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Преводите на някои езици може да липсват или да са непълни.
|
||||
|
||||
За да преведете нови езици, посетете translate.revanced.app"</string>
|
||||
<string name="revanced_language_DEFAULT">Език на приложението</string>
|
||||
<string name="revanced_language_AR">арабски</string>
|
||||
<string name="revanced_language_AZ">Азербайджански</string>
|
||||
<string name="revanced_language_BG">български</string>
|
||||
<string name="revanced_language_BN">бенгалски</string>
|
||||
<string name="revanced_language_CA">каталонски</string>
|
||||
<string name="revanced_language_CS">Чешки</string>
|
||||
<string name="revanced_language_DA">Датски</string>
|
||||
<string name="revanced_language_DE">Немски</string>
|
||||
<string name="revanced_language_EL">Гръцки</string>
|
||||
<string name="revanced_language_EN">Английски</string>
|
||||
<string name="revanced_language_ES">Испански</string>
|
||||
<string name="revanced_language_ET">Естонски</string>
|
||||
<string name="revanced_language_FA">Персийски</string>
|
||||
<string name="revanced_language_FI">Финландски</string>
|
||||
<string name="revanced_language_FR">Френски</string>
|
||||
<string name="revanced_language_GU">Гуджарати</string>
|
||||
<string name="revanced_language_HI">Хинди</string>
|
||||
<string name="revanced_language_HR">Хърватски</string>
|
||||
<string name="revanced_language_HU">Унгарски</string>
|
||||
<string name="revanced_language_ID">Индонезийски</string>
|
||||
<string name="revanced_language_IT">Италиански</string>
|
||||
<string name="revanced_language_JA">Японски</string>
|
||||
<string name="revanced_language_KK">Казахски</string>
|
||||
<string name="revanced_language_KO">Корейски</string>
|
||||
<string name="revanced_language_LT">Литовски</string>
|
||||
<string name="revanced_language_LV">Латвийски</string>
|
||||
<string name="revanced_language_MK">Македонски</string>
|
||||
<string name="revanced_language_MN">Монголски</string>
|
||||
<string name="revanced_language_MR">Маратхи</string>
|
||||
<string name="revanced_language_MS">Малайски</string>
|
||||
<string name="revanced_language_MY">Бирмански</string>
|
||||
<string name="revanced_language_NL">Холандски</string>
|
||||
<string name="revanced_language_OR">Одия</string>
|
||||
<string name="revanced_language_PA">Пенджаби</string>
|
||||
<string name="revanced_language_PL">Полски</string>
|
||||
<string name="revanced_language_PT">Португалски</string>
|
||||
<string name="revanced_language_RO">Румънски</string>
|
||||
<string name="revanced_language_RU">Руски</string>
|
||||
<string name="revanced_language_SK">Словашки</string>
|
||||
<string name="revanced_language_SL">Словенски</string>
|
||||
<string name="revanced_language_SR">Сръбски</string>
|
||||
<string name="revanced_language_SV">Шведски</string>
|
||||
<string name="revanced_language_SW">Суахили</string>
|
||||
<string name="revanced_language_TA">Тамилски</string>
|
||||
<string name="revanced_language_TE">Телугу</string>
|
||||
<string name="revanced_language_TH">Тайландски</string>
|
||||
<string name="revanced_language_TR">Турски</string>
|
||||
<string name="revanced_language_UK">Украински</string>
|
||||
<string name="revanced_language_UR">Урду</string>
|
||||
<string name="revanced_language_VI">Виетнамски</string>
|
||||
<string name="revanced_language_ZH">Китайски</string>
|
||||
<string name="revanced_pref_import_export_title">Импортиране / Експортиране</string>
|
||||
<string name="revanced_pref_import_export_summary">Импортиране / Експортиране на ReVanced настройките</string>
|
||||
<!-- Settings about dialog. -->
|
||||
@@ -77,12 +133,15 @@ Second \"item\" text"</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_03_feed_title">Поток</string>
|
||||
<string name="revanced_settings_screen_04_player_title">Плейър</string>
|
||||
<string name="revanced_settings_screen_05_general_title">Общо оформление</string>
|
||||
<string name="revanced_settings_screen_04_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_08_swipe_controls_title">Контроли с плъзгане</string>
|
||||
<string name="revanced_settings_screen_11_misc_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 id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Възпроизвеждане на Shorts в фонов режим</string>
|
||||
@@ -109,9 +168,9 @@ Second \"item\" text"</string>
|
||||
Няма да бъдете уведомени за неочаквани събития."</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.general.hideLayoutComponentsPatch">
|
||||
<string name="revanced_disable_like_subscribe_glow_title">Деактивирайте подсветката на бутона Харесвам /Абонамент</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_on">Бутоните „Харесвам“ и „Абониране“ няма да светят, когато бъдат натиснати</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_off">Бутоните „Харесвам“ и „Абониране“ ще светят, когато бъдат натиснати</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_title">Деактивиране на светенето на бутон Like и Subscribe</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_on">Бутон Like и Subscribe няма да светят при споменаване</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_summary_on">Албумните карти са скрити</string>
|
||||
<string name="revanced_hide_album_cards_summary_off">Албумните карти се показват</string>
|
||||
@@ -164,9 +223,9 @@ Second \"item\" text"</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_off">Рафтовете със снимки се показват</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_off">Показват се</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_off">Разширяемите карти се показват</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_off">Последните публикации са показани</string>
|
||||
@@ -227,6 +286,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_chapters_section_title">Скриване на секцията с заглавия</string>
|
||||
<string name="revanced_hide_chapters_section_summary_on">Секцията с заглавия е скрита</string>
|
||||
<string name="revanced_hide_chapters_section_summary_off">Секцията с заглавия се показва</string>
|
||||
<string name="revanced_hide_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_summary_on">\"Разгледайте подкаста\" е скрита</string>
|
||||
<string name="revanced_hide_podcast_section_summary_off">\"Разгледайте подкаста\" се показва</string>
|
||||
@@ -269,7 +331,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">Преглед на коментари</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">Прегледа на коментари е скрит</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">Прегледа на коментари се показва</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Бутон за благодарност</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">Скрий бутона за харесване</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">Бутона за благодарност е скрит</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">Бутона за благодарност се показва</string>
|
||||
<string name="revanced_hide_comments_timestamp_and_emoji_buttons_title">Бутони в лентата на прогреса и емотикони</string>
|
||||
@@ -296,12 +358,12 @@ Second \"item\" text"</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_off">Видеоклиповете в раздела Начало не се филтрират по ключови думи</string>
|
||||
<string name="revanced_hide_keyword_content_subscriptions_title">Скриване на видеоклипове от абонаменти с ключови думи</string>
|
||||
<string name="revanced_hide_keyword_content_subscriptions_summary_on">Видеоклиповете в раздела за абонаменти са са филтрирани с ключови думи</string>
|
||||
<string name="revanced_hide_keyword_content_subscriptions_summary_off">Видеоклиповете в емисията за абонаменти не се филтрират</string>
|
||||
<string name="revanced_hide_keyword_content_search_title">Скриване на резултати от търсения с ключови думи</string>
|
||||
<string name="revanced_hide_keyword_content_search_summary_on">Резултатите от търсенето се филтрират с помощта на ключови думи</string>
|
||||
<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>
|
||||
<!-- 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. -->
|
||||
@@ -348,6 +410,9 @@ Second \"item\" text"</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_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_summary_on">Рафта за пазаруване е скрит</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Рафта за пазаруване се показва</string>
|
||||
@@ -400,7 +465,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_external_downloader_summary_on">Бутонът за изтегляне е показан в плейъра</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' -->
|
||||
<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_off">Бутонът за изтегляне отваря вграденото приложение за изтегляне</string>
|
||||
<string name="revanced_external_downloader_name_title">Име на пакета на изтеглящото приложение</string>
|
||||
@@ -441,8 +506,9 @@ Second \"item\" text"</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_summary">Размера на текста на плъзгащите контроли</string>
|
||||
<string name="revanced_swipe_overlay_background_alpha_title">Видимост на фона на плъзгащите контроли</string>
|
||||
<string name="revanced_swipe_overlay_background_alpha_summary">Видимостта на фона на плъзгащите контроли.</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_title">Плъзгане на фона на наслагването непрозрачност</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_summary">Стойност на непрозрачността между 0-100</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_invalid_toast">Непрозрачността на плъзгането трябва да е между 0-100</string>
|
||||
<string name="revanced_swipe_threshold_title">Праг на величината на плъзгане</string>
|
||||
<string name="revanced_swipe_threshold_summary">Праг преди да се осъществи плъзгането</string>
|
||||
<string name="revanced_swipe_change_video_title">Включване на превключване на видеото чрез плъзване</string>
|
||||
@@ -587,14 +653,14 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_title">Бутони за Предишно & Следващо видео</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_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_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' -->
|
||||
<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_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_off">Бутона за авт. изпълнение се показва</string>
|
||||
</patch>
|
||||
@@ -604,7 +670,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Препоръките в края се показват</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
<string name="revanced_disable_fullscreen_ambient_mode_title">Деактивирайте подсветка около видеото на цял екран</string>
|
||||
<string name="revanced_disable_fullscreen_ambient_mode_title">Деактивиране на Ambient режим в цял екран</string>
|
||||
<string name="revanced_disable_fullscreen_ambient_mode_summary_on">Подсветката в режим на цял екран е деактивирана</string>
|
||||
<string name="revanced_disable_fullscreen_ambient_mode_summary_off">Подсветката в режим на цял екран е активирана</string>
|
||||
</patch>
|
||||
@@ -644,38 +710,38 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_shorts_history_summary_on">Скрито в историята на гледане</string>
|
||||
<string name="revanced_hide_shorts_history_summary_off">Показва се в историята на гледане</string>
|
||||
<!-- 'join' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
<string name="revanced_hide_shorts_join_button_title">Бутон за присъединяване</string>
|
||||
<string name="revanced_hide_shorts_join_button_title">Скриване на бутона Join</string>
|
||||
<string name="revanced_hide_shorts_join_button_summary_on">Бутона за присъединяване е скрит</string>
|
||||
<string name="revanced_hide_shorts_join_button_summary_off">Бутона за присъединяване се показва</string>
|
||||
<!-- 'subscribe' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
<string name="revanced_hide_shorts_subscribe_button_title">Скрийте бутона „Абониране“</string>
|
||||
<string name="revanced_hide_shorts_subscribe_button_title">Скриване на бутона Subscribe</string>
|
||||
<string name="revanced_hide_shorts_subscribe_button_summary_on">Бутонът „Абониране“ е скрит</string>
|
||||
<string name="revanced_hide_shorts_subscribe_button_summary_off">Бутонът „Абониране“ се показва</string>
|
||||
<string name="revanced_hide_shorts_paused_overlay_buttons_title">Показване на бутони при пауза</string>
|
||||
<string name="revanced_hide_shorts_paused_overlay_buttons_summary_on">Бутоните при пауза се скриват</string>
|
||||
<string name="revanced_hide_shorts_paused_overlay_buttons_summary_off">Бутоните при пауза се показват</string>
|
||||
<string name="revanced_hide_shorts_shop_button_title">Скриване на бутона за пазаруване</string>
|
||||
<string name="revanced_hide_shorts_shop_button_title">Скриване на бутона Shop</string>
|
||||
<string name="revanced_hide_shorts_shop_button_summary_on">Бутона за пазаруване е скрит</string>
|
||||
<string name="revanced_hide_shorts_shop_button_summary_off">Бутона за пазаруване се показва</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_title">Бутон \"Специални благодарности\"</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Бутон \"Специални благодарности\" е скрит</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Бутон \"Специални благодарности\" се показва</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_title">Скриване на бутона Buy Super Thanks</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">Бутон Buy Super Thanks се показва</string>
|
||||
<string name="revanced_hide_shorts_tagged_products_title">Скриване на маркираните продукти</string>
|
||||
<string name="revanced_hide_shorts_tagged_products_summary_on">Скрити</string>
|
||||
<string name="revanced_hide_shorts_tagged_products_summary_off">Показват се</string>
|
||||
<string name="revanced_hide_shorts_location_label_title">Етикет за местоположение</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Етикет за местоположение е скрит</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Етикет за местоположение се показва</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Скриване на бутона Запазване на музика</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Скриване на бутона Save music</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_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_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_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_off">Бутон \"Зелен екран\" се показва</string>
|
||||
<string name="revanced_hide_shorts_hashtag_button_title">Скриване на бутона за хаштаг</string>
|
||||
@@ -687,24 +753,24 @@ Second \"item\" text"</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_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_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_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_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_off">Бутон за коментари се показва</string>
|
||||
<!-- 'remix' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
<string name="revanced_hide_shorts_remix_button_title">Бутон за ремикс</string>
|
||||
<string name="revanced_hide_shorts_remix_button_title">Скриване на бутона Remix</string>
|
||||
<string name="revanced_hide_shorts_remix_button_summary_on">Бутона за ремикс е скрит</string>
|
||||
<string name="revanced_hide_shorts_remix_button_summary_off">Бутона за ремикс се показва</string>
|
||||
<!-- 'share' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
<string name="revanced_hide_shorts_share_button_title">Бутон за споделяне</string>
|
||||
<string name="revanced_hide_shorts_share_button_title">Скриване на бутона Share</string>
|
||||
<string name="revanced_hide_shorts_share_button_summary_on">Бутона за споделяне е скрит</string>
|
||||
<string name="revanced_hide_shorts_share_button_summary_off">Бутона за споделяне се показва</string>
|
||||
<string name="revanced_hide_shorts_info_panel_title">Информационни панели</string>
|
||||
@@ -781,7 +847,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_dislike_percentage_summary_on">Нехаресванията се показват като процент</string>
|
||||
<string name="revanced_ryd_dislike_percentage_summary_off">Нехаресванията се показват като число</string>
|
||||
<!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' -->
|
||||
<string name="revanced_ryd_compact_layout_title">Компактен бутон за харесване</string>
|
||||
<string name="revanced_ryd_compact_layout_title">Компактен Like бутон</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_on">Включен компактен бутон \"Харесва ми\"</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_off">Най-добър изглед на бутона за харесване</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Показване на известие, ако API не е наличен</string>
|
||||
@@ -829,7 +895,7 @@ Second \"item\" text"</string>
|
||||
</patch>
|
||||
<patch id="layout.sponsorblock.sponsorBlockResourcePatch">
|
||||
<string name="revanced_sb_enable_sb">Включване на SponsorBlock</string>
|
||||
<string name="revanced_sb_enable_sb_sum">SponsorBlock е система за прескачане на досадни части и реклами от видеоклиповете в YouTube</string>
|
||||
<string name="revanced_sb_enable_sb_sum">SponsorBlock е система с отворен код за прескачане на досадни части от видеоклипове в YouTube</string>
|
||||
<string name="revanced_sb_appearance_category">Външен вид</string>
|
||||
<string name="revanced_sb_enable_voting">Бутона за гласуване</string>
|
||||
<string name="revanced_sb_enable_voting_sum_on">Бутона за гласуване на част се показва</string>
|
||||
@@ -894,7 +960,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_segments_sponsor">Спонсори</string>
|
||||
<string name="revanced_sb_segments_sponsor_sum">Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора</string>
|
||||
<string name="revanced_sb_segments_selfpromo">Неплатена/Самореклама</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">Подобно на „Спонсор“, с изключение на неплатено или самореклама. Включва раздели за стоки, дарения или информация за това с кого са си сътрудничили</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">Подобно на Sponsor, но за неплатена или собствена промоция. Включва секции за стоки, дарения или информация за това с кого са си сътрудничили</string>
|
||||
<string name="revanced_sb_segments_interaction">Напомняне за действие (абониране)</string>
|
||||
<string name="revanced_sb_segments_interaction_sum">Кратко напомняне да харесате, абонирате или последвате в средата на съдържанието. Ако е дълго или за нещо конкретно, вместо това трябва да бъде самореклама</string>
|
||||
<string name="revanced_sb_segments_highlight">Акценти</string>
|
||||
@@ -1021,7 +1087,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_sb_about_api_sum">Данните са предоставени от SponsorBlock API. Докоснете тук за повече информация и изтеглияния</string>
|
||||
</patch>
|
||||
<patch id="layout.formfactor.changeFormFactorPatch">
|
||||
<string name="revanced_change_form_factor_title">Форм фактор на оформлението</string>
|
||||
<string name="revanced_change_form_factor_title">Формат на екрана /Таблет, Телфон, .../</string>
|
||||
<string name="revanced_change_form_factor_entry_1">По подразбиране</string>
|
||||
<string name="revanced_change_form_factor_entry_2">Телефон</string>
|
||||
<string name="revanced_change_form_factor_entry_3">Таблет</string>
|
||||
@@ -1050,7 +1116,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 -->
|
||||
<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_2">19.26.42 - Възстановяване на стари икони на навигацията и лентата с инструменти</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_2">19.26.42 - Възстановяване на старите икони за навигация</string>
|
||||
<!-- '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_2">18.20.39 - Възстановяване на видео скорост & в менюто за качество</string>
|
||||
@@ -1060,8 +1126,11 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.startpage.changeStartPagePatch">
|
||||
<string name="revanced_change_start_page_title">Задай начална страница</string>
|
||||
<string name="revanced_change_start_page_entry_default">По подразбиране</string>
|
||||
<string name="revanced_change_start_page_entry_all_subscriptions">Всички абонаменти</string>
|
||||
<string name="revanced_change_start_page_entry_browse">Разглеждане на канала</string>
|
||||
<string name="revanced_change_start_page_entry_courses">Курсове / Учене</string>
|
||||
<string name="revanced_change_start_page_entry_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_history">История</string>
|
||||
<string name="revanced_change_start_page_entry_library">Библиотека</string>
|
||||
@@ -1069,11 +1138,17 @@ Second \"item\" text"</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_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_shopping">Пазаруване</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_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_your_clips">Вашите клипове</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
|
||||
<string name="revanced_disable_resuming_shorts_player_title">Скриване на Shorts плейъра при стартиране</string>
|
||||
@@ -1154,8 +1229,10 @@ Second \"item\" text"</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_off">Показва се оригиналния цвят на лентата за напредък</string>
|
||||
<string name="revanced_seekbar_custom_color_value_title">Персонализиран цвят на лентата за напредък</string>
|
||||
<string name="revanced_seekbar_custom_color_value_summary">Цветове на лентата за напредък</string>
|
||||
<string name="revanced_seekbar_custom_color_primary_title">Цвят на лентата за търсене по избор</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>
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch">
|
||||
@@ -1285,6 +1362,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_custom_playback_speeds_invalid">Персонализираните скорости трябва да са по-малки от %s</string>
|
||||
<string name="revanced_custom_playback_speeds_parse_exception">Невалидни персонализирани скорости на възпроизвеждане</string>
|
||||
<string name="revanced_custom_playback_speeds_auto">Авто</string>
|
||||
<string name="revanced_speed_tap_and_hold_title">Персонализирана скорост при докосване и задържане</string>
|
||||
<string name="revanced_speed_tap_and_hold_summary">Скорост на възпроизвеждане между 0-8</string>
|
||||
</patch>
|
||||
<patch id="video.speed.remember.rememberPlaybackSpeedPatch">
|
||||
<string name="revanced_remember_playback_speed_last_selected_title">Запомни промените в скоростта на възпроизвеждане</string>
|
||||
@@ -1293,6 +1372,11 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_playback_speed_default_title">Скорост на възпроизвеждане по подразбиране</string>
|
||||
<string name="revanced_remember_playback_speed_toast">Скоростта по подразбиране е променена на: %s</string>
|
||||
</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">
|
||||
<string name="revanced_restore_old_video_quality_menu_title">Възстановете старото меню за качество на видеото</string>
|
||||
<string name="revanced_restore_old_video_quality_menu_summary_on">Показва се старото меню за видео качество</string>
|
||||
@@ -1329,62 +1413,12 @@ AVC има максимална резолюция от 1080p, Opus аудио
|
||||
<string name="revanced_spoof_video_streams_about_android_summary">"• Lipsva menju za audio pisti
|
||||
• Ne e nali4na stabilna glasnost
|
||||
• 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_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_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_video_streams_language_title">Ezik po подразбиране za audio potok v VR</string>
|
||||
<string name="revanced_spoof_video_streams_language_DEFAULT">Език на приложението</string>
|
||||
<string name="revanced_spoof_video_streams_language_AR">Арабски</string>
|
||||
<string name="revanced_spoof_video_streams_language_AZ">Азербайджански</string>
|
||||
<string name="revanced_spoof_video_streams_language_BG">Български</string>
|
||||
<string name="revanced_spoof_video_streams_language_BN">Бенгалски</string>
|
||||
<string name="revanced_spoof_video_streams_language_CA">Каталонски</string>
|
||||
<string name="revanced_spoof_video_streams_language_CS">Чешки</string>
|
||||
<string name="revanced_spoof_video_streams_language_DA">Датски</string>
|
||||
<string name="revanced_spoof_video_streams_language_DE">Немски</string>
|
||||
<string name="revanced_spoof_video_streams_language_EL">Гръцки</string>
|
||||
<string name="revanced_spoof_video_streams_language_EN">Английски</string>
|
||||
<string name="revanced_spoof_video_streams_language_ES">Испански</string>
|
||||
<string name="revanced_spoof_video_streams_language_ET">Естонски</string>
|
||||
<string name="revanced_spoof_video_streams_language_FA">Персийски</string>
|
||||
<string name="revanced_spoof_video_streams_language_FI">Финландски</string>
|
||||
<string name="revanced_spoof_video_streams_language_FR">Френски</string>
|
||||
<string name="revanced_spoof_video_streams_language_GU">Гуджарати</string>
|
||||
<string name="revanced_spoof_video_streams_language_HI">Хинди</string>
|
||||
<string name="revanced_spoof_video_streams_language_HR">Хърватски</string>
|
||||
<string name="revanced_spoof_video_streams_language_HU">Унгарски</string>
|
||||
<string name="revanced_spoof_video_streams_language_ID">Индонезийски</string>
|
||||
<string name="revanced_spoof_video_streams_language_IT">Италиански</string>
|
||||
<string name="revanced_spoof_video_streams_language_JA">Японски</string>
|
||||
<string name="revanced_spoof_video_streams_language_KK">Казахски</string>
|
||||
<string name="revanced_spoof_video_streams_language_KO">Корейски</string>
|
||||
<string name="revanced_spoof_video_streams_language_LT">Литовски</string>
|
||||
<string name="revanced_spoof_video_streams_language_LV">Латвийски</string>
|
||||
<string name="revanced_spoof_video_streams_language_MK">Македонски</string>
|
||||
<string name="revanced_spoof_video_streams_language_MN">Монголски</string>
|
||||
<string name="revanced_spoof_video_streams_language_MR">Маратхи</string>
|
||||
<string name="revanced_spoof_video_streams_language_MS">Малайски</string>
|
||||
<string name="revanced_spoof_video_streams_language_MY">Бирмански</string>
|
||||
<string name="revanced_spoof_video_streams_language_NL">Холандски</string>
|
||||
<string name="revanced_spoof_video_streams_language_OR">Ория</string>
|
||||
<string name="revanced_spoof_video_streams_language_PA">Пенджабски</string>
|
||||
<string name="revanced_spoof_video_streams_language_PL">Полски</string>
|
||||
<string name="revanced_spoof_video_streams_language_PT">Portugalski</string>
|
||||
<string name="revanced_spoof_video_streams_language_RO">Румънски</string>
|
||||
<string name="revanced_spoof_video_streams_language_RU">Руски</string>
|
||||
<string name="revanced_spoof_video_streams_language_SK">Словашки</string>
|
||||
<string name="revanced_spoof_video_streams_language_SL">Словенски</string>
|
||||
<string name="revanced_spoof_video_streams_language_SR">Сръбски</string>
|
||||
<string name="revanced_spoof_video_streams_language_SV">Шведски</string>
|
||||
<string name="revanced_spoof_video_streams_language_SW">Суахили</string>
|
||||
<string name="revanced_spoof_video_streams_language_TA">Тамилски</string>
|
||||
<string name="revanced_spoof_video_streams_language_TE">Телугу</string>
|
||||
<string name="revanced_spoof_video_streams_language_TH">Тайландски</string>
|
||||
<string name="revanced_spoof_video_streams_language_TR">Турски</string>
|
||||
<string name="revanced_spoof_video_streams_language_UK">Украински</string>
|
||||
<string name="revanced_spoof_video_streams_language_UR">Урду</string>
|
||||
<string name="revanced_spoof_video_streams_language_VI">Виетнамски</string>
|
||||
<string name="revanced_spoof_video_streams_language_ZH">Китайски</string>
|
||||
</patch>
|
||||
</app>
|
||||
<app id="twitch">
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user