mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-15 23:33:57 +00:00
Compare commits
94 Commits
v4.11.0-de
...
v4.14.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6544cd5fc6 | ||
|
|
4e323aa206 | ||
|
|
c1cee281ff | ||
|
|
0779f9fc5e | ||
|
|
0ee5cf98ab | ||
|
|
6bb848b991 | ||
|
|
188b66ffe7 | ||
|
|
a276425d83 | ||
|
|
e556c3f692 | ||
|
|
cb30248eab | ||
|
|
c5ce742ab4 | ||
|
|
bdd2f7cb0f | ||
|
|
b7600f448d | ||
|
|
5c4bf7676d | ||
|
|
fcd2f9b4c4 | ||
|
|
aa3487aa92 | ||
|
|
ada642f4a7 | ||
|
|
eac758588a | ||
|
|
5d047eae77 | ||
|
|
ed92bf1be6 | ||
|
|
c6318e890f | ||
|
|
7f3b1c54da | ||
|
|
3d0d94b6c8 | ||
|
|
b84e6afebd | ||
|
|
3eab130276 | ||
|
|
95f8e9b3a9 | ||
|
|
d7be94a193 | ||
|
|
e4e20bec6c | ||
|
|
b8bd63a34c | ||
|
|
8b602ca6be | ||
|
|
87eb83607c | ||
|
|
567121d641 | ||
|
|
45e4f70137 | ||
|
|
f814d87c17 | ||
|
|
d0e92b225e | ||
|
|
c64757f80a | ||
|
|
58b6f1fba0 | ||
|
|
630857ba16 | ||
|
|
82ae367946 | ||
|
|
95a7118dcf | ||
|
|
26449cf7c6 | ||
|
|
e4232b6c74 | ||
|
|
1cf25f9dc9 | ||
|
|
8038bd2e98 | ||
|
|
1e81d0c9f8 | ||
|
|
c48cedaddf | ||
|
|
4085d1f9dc | ||
|
|
eadbf5f459 | ||
|
|
b12b3a73a6 | ||
|
|
572a310589 | ||
|
|
2e8d5c61f8 | ||
|
|
025766bb42 | ||
|
|
e31966159a | ||
|
|
337bdc3d39 | ||
|
|
13ed4a2f39 | ||
|
|
d2afc53c2b | ||
|
|
1fab0ae59a | ||
|
|
5c8c597d19 | ||
|
|
33800801a3 | ||
|
|
62c47665e4 | ||
|
|
7acb6cdc96 | ||
|
|
a5d32c3da3 | ||
|
|
a4b0e76755 | ||
|
|
0a7b2c5ec2 | ||
|
|
eed856d64c | ||
|
|
e8d481397f | ||
|
|
d0eceb3e36 | ||
|
|
8886fc4f54 | ||
|
|
fb4256f17c | ||
|
|
98f9bba7ed | ||
|
|
8e72067dcb | ||
|
|
d87f36e7e2 | ||
|
|
4432fe65df | ||
|
|
8b0d8ee9f4 | ||
|
|
250cc7cbde | ||
|
|
1af65de1f6 | ||
|
|
6e87e3044c | ||
|
|
273af26274 | ||
|
|
2b1b081051 | ||
|
|
f2bf2da9a5 | ||
|
|
15317003b1 | ||
|
|
6c81a5b65f | ||
|
|
9ef51abde7 | ||
|
|
1d31565d47 | ||
|
|
b944fb7bf1 | ||
|
|
dfd46d8e8f | ||
|
|
f64e03a1f6 | ||
|
|
a65970bdc2 | ||
|
|
cfbc4aa6b2 | ||
|
|
b04652890e | ||
|
|
4fe1dbe9e0 | ||
|
|
32acfbaee7 | ||
|
|
d02a490f36 | ||
|
|
f0fb2fa3ba |
2
.github/workflows/pull_strings.yml
vendored
2
.github/workflows/pull_strings.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
||||
ref: dev
|
||||
|
||||
- name: Pull strings
|
||||
uses: crowdin/github-action@v1
|
||||
uses: crowdin/github-action@v2
|
||||
with:
|
||||
config: crowdin.yml
|
||||
download_translations: true
|
||||
|
||||
2
.github/workflows/push_strings.yml
vendored
2
.github/workflows/push_strings.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Push strings
|
||||
uses: crowdin/github-action@v1
|
||||
uses: crowdin/github-action@v2
|
||||
with:
|
||||
config: crowdin.yml
|
||||
upload_sources: true
|
||||
|
||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -42,7 +42,7 @@ jobs:
|
||||
with:
|
||||
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||
passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
||||
fingerprint: ${{ env.GPG_FINGERPRINT }}
|
||||
fingerprint: ${{ vars.GPG_FINGERPRINT }}
|
||||
|
||||
- name: Release
|
||||
env:
|
||||
|
||||
311
CHANGELOG.md
311
CHANGELOG.md
@@ -1,3 +1,314 @@
|
||||
# [4.14.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.14.0-dev.1...v4.14.0-dev.2) (2024-08-24)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Duolingo:** Add `Disable ads` and `Enable debug menu` patch ([#3422](https://github.com/ReVanced/revanced-patches/issues/3422)) ([d0a8599](https://github.com/ReVanced/revanced-patches/commit/d0a8599f76ce653e5d7c98069ad3c58b9ab9c5eb))
|
||||
|
||||
# [4.14.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.4-dev.2...v4.14.0-dev.1) (2024-08-22)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Spoof client:** Allow forcing AVC codec with iOS ([#3570](https://github.com/ReVanced/revanced-patches/issues/3570)) ([1a49d1f](https://github.com/ReVanced/revanced-patches/commit/1a49d1f3c2a343d05d0abc07c143add486246fd0))
|
||||
|
||||
## [4.13.4-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.13.4-dev.1...v4.13.4-dev.2) (2024-08-20)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - SponsorBlock:** Handle if the user enters an invalid number into any SB settings ([37b3dd1](https://github.com/ReVanced/revanced-patches/commit/37b3dd1e789f8bb16fa1b9dd582e39c89dbe730c))
|
||||
|
||||
## [4.13.4-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.3...v4.13.4-dev.1) (2024-08-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **SwissID:** Rename `Remove Google Play Integrity Integrity check` to `Remove Google Play Integrity check` ([#3558](https://github.com/ReVanced/revanced-patches/issues/3558)) ([0f5a771](https://github.com/ReVanced/revanced-patches/commit/0f5a771a5cff5684b4a8fd317f4938fe2cf3cbbe))
|
||||
|
||||
## [4.13.3](https://github.com/ReVanced/revanced-patches/compare/v4.13.2...v4.13.3) (2024-08-15)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube:** Remove translated string that breaks patching ([a48c2db](https://github.com/ReVanced/revanced-patches/commit/a48c2db53d84767c8fd5d569f9ce1c46c2bfd9a1))
|
||||
|
||||
## [4.13.3-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.2...v4.13.3-dev.1) (2024-08-15)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube:** Remove translated string that breaks patching ([a48c2db](https://github.com/ReVanced/revanced-patches/commit/a48c2db53d84767c8fd5d569f9ce1c46c2bfd9a1))
|
||||
|
||||
## [4.13.2](https://github.com/ReVanced/revanced-patches/compare/v4.13.1...v4.13.2) (2024-08-15)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - GmsCore Support:** Fix patch exception by using correct patch offset ([#3543](https://github.com/ReVanced/revanced-patches/issues/3543)) ([b2b8454](https://github.com/ReVanced/revanced-patches/commit/b2b8454aa992bcb217fb03eb4de5532e0a9bd354))
|
||||
|
||||
## [4.13.2-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.1...v4.13.2-dev.1) (2024-08-15)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - GmsCore Support:** Fix patch exception by using correct patch offset ([#3543](https://github.com/ReVanced/revanced-patches/issues/3543)) ([b2b8454](https://github.com/ReVanced/revanced-patches/commit/b2b8454aa992bcb217fb03eb4de5532e0a9bd354))
|
||||
|
||||
## [4.13.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.0...v4.13.1) (2024-08-15)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Check watch history domain name resolution:** Add compatibility field ([6c598f0](https://github.com/ReVanced/revanced-patches/commit/6c598f084ed90ee1318e4c66d8c1751c797b8e3b))
|
||||
|
||||
## [4.13.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.13.0...v4.13.1-dev.1) (2024-08-15)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Check watch history domain name resolution:** Add compatibility field ([6c598f0](https://github.com/ReVanced/revanced-patches/commit/6c598f084ed90ee1318e4c66d8c1751c797b8e3b))
|
||||
|
||||
# [4.13.0](https://github.com/ReVanced/revanced-patches/compare/v4.12.0...v4.13.0) (2024-08-15)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - GmsCore support:** Fix notifications not working by using the correct permissions ([19ddae2](https://github.com/ReVanced/revanced-patches/commit/19ddae2d15e513e18eb1556c468cd94bd197685b))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Google Photos:** Add `Spoof features` patch ([#3459](https://github.com/ReVanced/revanced-patches/issues/3459)) ([7c218cd](https://github.com/ReVanced/revanced-patches/commit/7c218cd168aa72eb99bcb47d12dfa45616e8ad88))
|
||||
* **SCB Easy:** Remove broken `Remove debugging detection` patch ([#3518](https://github.com/ReVanced/revanced-patches/issues/3518)) ([f4e23cb](https://github.com/ReVanced/revanced-patches/commit/f4e23cbb8a24638318d8cee20a1991c51855d9d2))
|
||||
* **YouTube:** Add `Check watch history domain name resolution` patch ([#3537](https://github.com/ReVanced/revanced-patches/issues/3537)) ([2af1425](https://github.com/ReVanced/revanced-patches/commit/2af142525cda07a131335faadd4b3889979fd077))
|
||||
|
||||
# [4.13.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.13.0-dev.1...v4.13.0-dev.2) (2024-08-15)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube:** Add `Check watch history domain name resolution` patch ([#3537](https://github.com/ReVanced/revanced-patches/issues/3537)) ([2af1425](https://github.com/ReVanced/revanced-patches/commit/2af142525cda07a131335faadd4b3889979fd077))
|
||||
|
||||
# [4.13.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.12.1-dev.1...v4.13.0-dev.1) (2024-08-15)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Google Photos:** Add `Spoof features` patch ([#3459](https://github.com/ReVanced/revanced-patches/issues/3459)) ([7c218cd](https://github.com/ReVanced/revanced-patches/commit/7c218cd168aa72eb99bcb47d12dfa45616e8ad88))
|
||||
* **SCB Easy:** Remove broken `Remove debugging detection` patch ([#3518](https://github.com/ReVanced/revanced-patches/issues/3518)) ([f4e23cb](https://github.com/ReVanced/revanced-patches/commit/f4e23cbb8a24638318d8cee20a1991c51855d9d2))
|
||||
|
||||
## [4.12.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.12.0...v4.12.1-dev.1) (2024-08-15)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - GmsCore support:** Fix notifications not working by using the correct permissions ([19ddae2](https://github.com/ReVanced/revanced-patches/commit/19ddae2d15e513e18eb1556c468cd94bd197685b))
|
||||
|
||||
# [4.12.0](https://github.com/ReVanced/revanced-patches/compare/v4.11.0...v4.12.0) (2024-08-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Google Photos - GmsCore support:** Fix by checking first if a method exists before trying to patch it ([acf38ca](https://github.com/ReVanced/revanced-patches/commit/acf38cafae5eb9896b43f3a6cbd808ac273cd081))
|
||||
* **Instagram - Hide ads:** Restore compatibility with latest version by fixing fingerprint ([#3455](https://github.com/ReVanced/revanced-patches/issues/3455)) ([4505fa4](https://github.com/ReVanced/revanced-patches/commit/4505fa4138bb55c8957790239c01b8dda63d6cdd))
|
||||
* **Messenger - Disable switching emoji to sticker:** Constrain to last working version `439.0.0.29.119` ([6207c31](https://github.com/ReVanced/revanced-patches/commit/6207c314c657a1188d1081b0a196a61e49cad83b))
|
||||
* **SoundCloud - Enable offline sync:** Stop crashing by reversing order of patching instructions from last to first to retain indices ([63b6ced](https://github.com/ReVanced/revanced-patches/commit/63b6cede5fa5bcf377ced422da4e861996a41f0d))
|
||||
* **YouTube - Bypass image region restrictions:** Move setting to `Misc` menu ([094ae59](https://github.com/ReVanced/revanced-patches/commit/094ae59fc92663fff6c5d6f5cbece41822a326f9))
|
||||
* **YouTube - Client Spoof:** Restore missing high qualities by spoofing the iOS client user agent ([#3468](https://github.com/ReVanced/revanced-patches/issues/3468)) ([0e6ae5f](https://github.com/ReVanced/revanced-patches/commit/0e6ae5fee752a76604cf9b95f9a76c0cbe5f7dae))
|
||||
* **YouTube - Hide keyword content:** Do not hide flyout menu ([687c9f7](https://github.com/ReVanced/revanced-patches/commit/687c9f7eb03cca5f7b3486f07f2e3453ebc77faf))
|
||||
* **YouTube - SponsorBlock:** Correctly show minute timestamp when creating a new segment ([d74c366](https://github.com/ReVanced/revanced-patches/commit/d74c366dbf5f25c20fbfc5a0157c3c15dda82a16))
|
||||
* **YouTube - SponsorBlock:** Improve create segment manual seek accuracy ([#3491](https://github.com/ReVanced/revanced-patches/issues/3491)) ([1544981](https://github.com/ReVanced/revanced-patches/commit/15449819ff74b636fb2fa6aacd770142c51d2e5d))
|
||||
* **YouTube - Spoof client:** Fix tracking history on brand accounts ([#3480](https://github.com/ReVanced/revanced-patches/issues/3480)) ([69c1f16](https://github.com/ReVanced/revanced-patches/commit/69c1f16f7eb0d5759a44f7f7a09b1757ce8f61dd))
|
||||
* **YouTube - Spoof client:** Restore livestream audio only playback with iOS spoofing ([#3504](https://github.com/ReVanced/revanced-patches/issues/3504)) ([90d3288](https://github.com/ReVanced/revanced-patches/commit/90d32880906787d82c4b9a7a1099b46dff3a0870))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Add `Hide mock location` patch ([#3417](https://github.com/ReVanced/revanced-patches/issues/3417)) ([5f81b40](https://github.com/ReVanced/revanced-patches/commit/5f81b40e7d5567fb5689d08ccc9caeaa267c3143))
|
||||
* Add `Spoof build info` patch ([e7829b4](https://github.com/ReVanced/revanced-patches/commit/e7829b41e782c9feda23b9d6acf48bae277d24d9))
|
||||
* **Boost for Reddit:** Add `Disable ads` patch ([#3474](https://github.com/ReVanced/revanced-patches/issues/3474)) ([b292c20](https://github.com/ReVanced/revanced-patches/commit/b292c200bf4ea5b4f71d96690ac011e7843552f0))
|
||||
* **CandyLink:** Remove non-functional `Unlock pro` patch ([7ae9f8f](https://github.com/ReVanced/revanced-patches/commit/7ae9f8fa0a349b91853e9554f18e564ca6ff887c))
|
||||
* **Expense Manager:** Remove non-functional `Unlock pro` patch ([ebbcac7](https://github.com/ReVanced/revanced-patches/commit/ebbcac74fd8598daebb4be0bd7c430c41333e2d4))
|
||||
* **Google News:** Add `Enable CustomTabs` and `GmsCore support` patch ([#3111](https://github.com/ReVanced/revanced-patches/issues/3111)) ([ad59096](https://github.com/ReVanced/revanced-patches/commit/ad590962275f888b335252ad5bed0f34e959d3c7))
|
||||
* **Google Photos:** Add `GmsCore support` patch ([#3414](https://github.com/ReVanced/revanced-patches/issues/3414)) ([24528e0](https://github.com/ReVanced/revanced-patches/commit/24528e0a6eec17ce0a3c52f8862585933615ad28))
|
||||
* **Instagram:** Remove unnecessary `Hide timeline ads` patch ([5e1d001](https://github.com/ReVanced/revanced-patches/commit/5e1d001056df68e1e2b39f1365215c91bcc9e46b))
|
||||
* **SoundCloud:** Add `Enable offline sync` patch ([#3407](https://github.com/ReVanced/revanced-patches/issues/3407)) ([4de86c6](https://github.com/ReVanced/revanced-patches/commit/4de86c6407376bcd3cc0513a2f0707410b8d7ccd))
|
||||
* **SwissID:** Add `Remove Google Play Integrity Integrity check` patch ([#3478](https://github.com/ReVanced/revanced-patches/issues/3478)) ([60492ae](https://github.com/ReVanced/revanced-patches/commit/60492aea7863e07d8bf1af9380ae9295ca161f3c))
|
||||
* **YouTube - Description components:** Add `Hide 'Key concepts' section` option ([#3495](https://github.com/ReVanced/revanced-patches/issues/3495)) ([d75b645](https://github.com/ReVanced/revanced-patches/commit/d75b64595a7ac26faca4c0ae21923b22f6783975))
|
||||
* **YouTube:** Add `Bypass image region restrictions` patch ([#3442](https://github.com/ReVanced/revanced-patches/issues/3442)) ([765fab2](https://github.com/ReVanced/revanced-patches/commit/765fab2af2769349446cc0f2109343ef3bd8c621))
|
||||
|
||||
# [4.12.0-dev.17](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.16...v4.12.0-dev.17) (2024-08-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Google Photos - GmsCore support:** Fix by checking first if a method exists before trying to patch it ([acf38ca](https://github.com/ReVanced/revanced-patches/commit/acf38cafae5eb9896b43f3a6cbd808ac273cd081))
|
||||
* **Messenger - Disable switching emoji to sticker:** Constrain to last working version `439.0.0.29.119` ([6207c31](https://github.com/ReVanced/revanced-patches/commit/6207c314c657a1188d1081b0a196a61e49cad83b))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **CandyLink:** Remove non-functional `Unlock pro` patch ([7ae9f8f](https://github.com/ReVanced/revanced-patches/commit/7ae9f8fa0a349b91853e9554f18e564ca6ff887c))
|
||||
* **Expense Manager:** Remove non-functional `Unlock pro` patch ([ebbcac7](https://github.com/ReVanced/revanced-patches/commit/ebbcac74fd8598daebb4be0bd7c430c41333e2d4))
|
||||
* **Instagram:** Remove unnecessary `Hide timeline ads` patch ([5e1d001](https://github.com/ReVanced/revanced-patches/commit/5e1d001056df68e1e2b39f1365215c91bcc9e46b))
|
||||
|
||||
# [4.12.0-dev.16](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.15...v4.12.0-dev.16) (2024-08-04)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Spoof client:** Restore livestream audio only playback with iOS spoofing ([#3504](https://github.com/ReVanced/revanced-patches/issues/3504)) ([90d3288](https://github.com/ReVanced/revanced-patches/commit/90d32880906787d82c4b9a7a1099b46dff3a0870))
|
||||
|
||||
# [4.12.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.14...v4.12.0-dev.15) (2024-08-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - SponsorBlock:** Improve create segment manual seek accuracy ([#3491](https://github.com/ReVanced/revanced-patches/issues/3491)) ([1544981](https://github.com/ReVanced/revanced-patches/commit/15449819ff74b636fb2fa6aacd770142c51d2e5d))
|
||||
|
||||
# [4.12.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.13...v4.12.0-dev.14) (2024-08-01)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Description components:** Add `Hide 'Key concepts' section` option ([#3495](https://github.com/ReVanced/revanced-patches/issues/3495)) ([d75b645](https://github.com/ReVanced/revanced-patches/commit/d75b64595a7ac26faca4c0ae21923b22f6783975))
|
||||
|
||||
# [4.12.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.12...v4.12.0-dev.13) (2024-07-31)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Boost for Reddit:** Add `Disable ads` patch ([#3474](https://github.com/ReVanced/revanced-patches/issues/3474)) ([b292c20](https://github.com/ReVanced/revanced-patches/commit/b292c200bf4ea5b4f71d96690ac011e7843552f0))
|
||||
|
||||
# [4.12.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.11...v4.12.0-dev.12) (2024-07-28)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **SwissID:** Add `Remove Google Play Integrity Integrity check` patch ([#3478](https://github.com/ReVanced/revanced-patches/issues/3478)) ([60492ae](https://github.com/ReVanced/revanced-patches/commit/60492aea7863e07d8bf1af9380ae9295ca161f3c))
|
||||
|
||||
# [4.12.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.10...v4.12.0-dev.11) (2024-07-28)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Bypass image region restrictions:** Move setting to `Misc` menu ([094ae59](https://github.com/ReVanced/revanced-patches/commit/094ae59fc92663fff6c5d6f5cbece41822a326f9))
|
||||
|
||||
# [4.12.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.9...v4.12.0-dev.10) (2024-07-28)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Client Spoof:** Restore missing high qualities by spoofing the iOS client user agent ([#3468](https://github.com/ReVanced/revanced-patches/issues/3468)) ([0e6ae5f](https://github.com/ReVanced/revanced-patches/commit/0e6ae5fee752a76604cf9b95f9a76c0cbe5f7dae))
|
||||
|
||||
# [4.12.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.8...v4.12.0-dev.9) (2024-07-28)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Spoof client:** Fix tracking history on brand accounts ([#3480](https://github.com/ReVanced/revanced-patches/issues/3480)) ([69c1f16](https://github.com/ReVanced/revanced-patches/commit/69c1f16f7eb0d5759a44f7f7a09b1757ce8f61dd))
|
||||
|
||||
# [4.12.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.7...v4.12.0-dev.8) (2024-07-26)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - SponsorBlock:** Correctly show minute timestamp when creating a new segment ([d74c366](https://github.com/ReVanced/revanced-patches/commit/d74c366dbf5f25c20fbfc5a0157c3c15dda82a16))
|
||||
|
||||
# [4.12.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.6...v4.12.0-dev.7) (2024-07-24)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **SoundCloud - Enable offline sync:** Stop crashing by reversing order of patching instructions from last to first to retain indices ([63b6ced](https://github.com/ReVanced/revanced-patches/commit/63b6cede5fa5bcf377ced422da4e861996a41f0d))
|
||||
|
||||
# [4.12.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.5...v4.12.0-dev.6) (2024-07-20)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Add `Spoof build info` patch ([e7829b4](https://github.com/ReVanced/revanced-patches/commit/e7829b41e782c9feda23b9d6acf48bae277d24d9))
|
||||
|
||||
# [4.12.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.4...v4.12.0-dev.5) (2024-07-20)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Add `Hide mock location` patch ([#3417](https://github.com/ReVanced/revanced-patches/issues/3417)) ([5f81b40](https://github.com/ReVanced/revanced-patches/commit/5f81b40e7d5567fb5689d08ccc9caeaa267c3143))
|
||||
* **Google Photos:** Add `GmsCore support` patch ([#3414](https://github.com/ReVanced/revanced-patches/issues/3414)) ([24528e0](https://github.com/ReVanced/revanced-patches/commit/24528e0a6eec17ce0a3c52f8862585933615ad28))
|
||||
|
||||
# [4.12.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.3...v4.12.0-dev.4) (2024-07-20)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Google News:** Add `Enable CustomTabs` and `GmsCore support` patch ([#3111](https://github.com/ReVanced/revanced-patches/issues/3111)) ([ad59096](https://github.com/ReVanced/revanced-patches/commit/ad590962275f888b335252ad5bed0f34e959d3c7))
|
||||
|
||||
# [4.12.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.2...v4.12.0-dev.3) (2024-07-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Instagram - Hide ads:** Restore compatibility with latest version by fixing fingerprint ([#3455](https://github.com/ReVanced/revanced-patches/issues/3455)) ([4505fa4](https://github.com/ReVanced/revanced-patches/commit/4505fa4138bb55c8957790239c01b8dda63d6cdd))
|
||||
|
||||
# [4.12.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.12.0-dev.1...v4.12.0-dev.2) (2024-07-15)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube:** Add `Bypass image region restrictions` patch ([#3442](https://github.com/ReVanced/revanced-patches/issues/3442)) ([765fab2](https://github.com/ReVanced/revanced-patches/commit/765fab2af2769349446cc0f2109343ef3bd8c621))
|
||||
|
||||
# [4.12.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.11.1-dev.1...v4.12.0-dev.1) (2024-07-13)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **SoundCloud:** Add `Enable offline sync` patch ([#3407](https://github.com/ReVanced/revanced-patches/issues/3407)) ([4de86c6](https://github.com/ReVanced/revanced-patches/commit/4de86c6407376bcd3cc0513a2f0707410b8d7ccd))
|
||||
|
||||
## [4.11.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.11.0...v4.11.1-dev.1) (2024-07-12)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Hide keyword content:** Do not hide flyout menu ([687c9f7](https://github.com/ReVanced/revanced-patches/commit/687c9f7eb03cca5f7b3486f07f2e3453ebc77faf))
|
||||
|
||||
## [4.11.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.11.0...v4.11.1-dev.1) (2024-07-12)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Hide keyword content:** Do not hide flyout menu ([687c9f7](https://github.com/ReVanced/revanced-patches/commit/687c9f7eb03cca5f7b3486f07f2e3453ebc77faf))
|
||||
|
||||
# [4.11.0](https://github.com/ReVanced/revanced-patches/compare/v4.10.0...v4.11.0) (2024-07-11)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Boost for reddit - Fix missing audio in video downloads:** Replace correct strings ([#3379](https://github.com/ReVanced/revanced-patches/issues/3379)) ([b43db98](https://github.com/ReVanced/revanced-patches/commit/b43db98e8483e2939d8fb9cd02443f24aeaae3c3))
|
||||
* **Windy - Unlock pro:** Revert changing package name ([#3402](https://github.com/ReVanced/revanced-patches/issues/3402)) ([541f1e7](https://github.com/ReVanced/revanced-patches/commit/541f1e702665630a3737f67a4cc0c4f7b4899f8f))
|
||||
* **Windy - Unlock pro:** Use correct package name ([#3397](https://github.com/ReVanced/revanced-patches/issues/3397)) ([1d8459a](https://github.com/ReVanced/revanced-patches/commit/1d8459ac992b12371c41df3c25b6386119770d15))
|
||||
* **YouTube - Hide layout components:** Detect if a keyword filter hides all videos ([#3365](https://github.com/ReVanced/revanced-patches/issues/3365)) ([6aa47ec](https://github.com/ReVanced/revanced-patches/commit/6aa47ec1050cf32158ab608441c0649501184971))
|
||||
* **YouTube - Settings:** Move some settings to different menus, adjust default setting values ([#3415](https://github.com/ReVanced/revanced-patches/issues/3415)) ([7201ac4](https://github.com/ReVanced/revanced-patches/commit/7201ac45c158682413c8584aac7bb37b770fc924))
|
||||
* **YouTube - SponsorBlock:** Skip segments when casting ([#3331](https://github.com/ReVanced/revanced-patches/issues/3331)) ([d9395fd](https://github.com/ReVanced/revanced-patches/commit/d9395fdbca45cf68fbc63469e228eefbd6c2bf2e))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Add `Remove share targets` patch ([#3334](https://github.com/ReVanced/revanced-patches/issues/3334)) ([9414122](https://github.com/ReVanced/revanced-patches/commit/94141228163aee8d051491db51fc1e4c8b86f0e6))
|
||||
* Add translations ([#2963](https://github.com/ReVanced/revanced-patches/issues/2963)) ([69ea6f3](https://github.com/ReVanced/revanced-patches/commit/69ea6f3bc2b5f419320f17c150489dcb9eed76ce))
|
||||
* **Bandcamp:** Add `Remove play limits` patch ([#3366](https://github.com/ReVanced/revanced-patches/issues/3366)) ([ad8d3bb](https://github.com/ReVanced/revanced-patches/commit/ad8d3bb1c86f1324234e890f1171ec4a18e56dd9))
|
||||
* **Instagram:** Add `Hide ads` patch ([#3380](https://github.com/ReVanced/revanced-patches/issues/3380)) ([c6b2f8c](https://github.com/ReVanced/revanced-patches/commit/c6b2f8c0172b4fd142927d9448ed855831c86ae4))
|
||||
* **RAR:** Add `Hide purchase reminder` patch ([#3321](https://github.com/ReVanced/revanced-patches/issues/3321)) ([8fbe7e3](https://github.com/ReVanced/revanced-patches/commit/8fbe7e3d38c43adfa0755bcbe87f8c6b7696da3a))
|
||||
* **Soundcloud:** Add `Hide ads` and `Disable telemetry` patch ([#3386](https://github.com/ReVanced/revanced-patches/issues/3386)) ([3c79f3d](https://github.com/ReVanced/revanced-patches/commit/3c79f3d34d978aead60de19e64d05fbebc1bc73a))
|
||||
* **Stocard:** Add `Hide offers tab` and `Hide story bubbles` patch ([#3359](https://github.com/ReVanced/revanced-patches/issues/3359)) ([fbd0507](https://github.com/ReVanced/revanced-patches/commit/fbd0507ce5cdeb93a1f661aa8097139c61e643a0))
|
||||
|
||||
# [4.11.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v4.11.0-dev.6...v4.11.0-dev.7) (2024-07-10)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Bandcamp:** Add `Remove play limits` patch ([#3366](https://github.com/ReVanced/revanced-patches/issues/3366)) ([ad8d3bb](https://github.com/ReVanced/revanced-patches/commit/ad8d3bb1c86f1324234e890f1171ec4a18e56dd9))
|
||||
|
||||
# [4.11.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v4.11.0-dev.5...v4.11.0-dev.6) (2024-07-10)
|
||||
|
||||
|
||||
|
||||
@@ -22,6 +22,50 @@ public final class app/revanced/patches/all/interaction/gestures/PredictiveBackG
|
||||
public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/all/location/hide/HideMockLocationPatch : app/revanced/patches/all/misc/transformation/BaseTransformInstructionsPatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/all/location/hide/HideMockLocationPatch;
|
||||
public synthetic fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Ljava/lang/Object;
|
||||
public fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Lkotlin/Pair;
|
||||
public synthetic fun transform (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Object;)V
|
||||
public fun transform (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Lkotlin/Pair;)V
|
||||
}
|
||||
|
||||
public abstract class app/revanced/patches/all/misc/build/BaseSpoofBuildInfoPatch : app/revanced/patches/all/misc/transformation/BaseTransformInstructionsPatch {
|
||||
public fun <init> ()V
|
||||
public synthetic fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Ljava/lang/Object;
|
||||
public fun filterMap (Lcom/android/tools/smali/dexlib2/iface/ClassDef;Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/iface/instruction/Instruction;I)Lkotlin/Pair;
|
||||
protected fun getBoard ()Ljava/lang/String;
|
||||
protected fun getBootloader ()Ljava/lang/String;
|
||||
protected fun getBrand ()Ljava/lang/String;
|
||||
protected fun getCpuAbi ()Ljava/lang/String;
|
||||
protected fun getCpuAbi2 ()Ljava/lang/String;
|
||||
protected fun getDevice ()Ljava/lang/String;
|
||||
protected fun getDisplay ()Ljava/lang/String;
|
||||
protected fun getFingerprint ()Ljava/lang/String;
|
||||
protected fun getHardware ()Ljava/lang/String;
|
||||
protected fun getHost ()Ljava/lang/String;
|
||||
protected fun getId ()Ljava/lang/String;
|
||||
protected fun getManufacturer ()Ljava/lang/String;
|
||||
protected fun getModel ()Ljava/lang/String;
|
||||
protected fun getOdmSku ()Ljava/lang/String;
|
||||
protected fun getProduct ()Ljava/lang/String;
|
||||
protected fun getRadio ()Ljava/lang/String;
|
||||
protected fun getSerial ()Ljava/lang/String;
|
||||
protected fun getSku ()Ljava/lang/String;
|
||||
protected fun getSocManufacturer ()Ljava/lang/String;
|
||||
protected fun getSocModel ()Ljava/lang/String;
|
||||
protected fun getTags ()Ljava/lang/String;
|
||||
protected fun getTime ()Ljava/lang/Long;
|
||||
protected fun getType ()Ljava/lang/String;
|
||||
protected fun getUser ()Ljava/lang/String;
|
||||
public synthetic fun transform (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Object;)V
|
||||
public fun transform (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Lkotlin/Pair;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/all/misc/build/SpoofBuildInfoPatch : app/revanced/patches/all/misc/build/BaseSpoofBuildInfoPatch {
|
||||
public fun <init> ()V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/all/misc/debugging/EnableAndroidDebuggingPatch : app/revanced/patcher/patch/ResourcePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/all/misc/debugging/EnableAndroidDebuggingPatch;
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
@@ -181,6 +225,12 @@ public final class app/revanced/patches/backdrops/misc/pro/ProUnlockPatch : app/
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/candylinkvpn/UnlockProPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/candylinkvpn/UnlockProPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
@@ -193,6 +243,18 @@ public final class app/revanced/patches/cieid/restrictions/root/BypassRootChecks
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/duolingo/ad/DisableAdsPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/duolingo/ad/DisableAdsPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/duolingo/debug/EnableDebugMenuPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/duolingo/debug/EnableDebugMenuPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/facebook/ads/story/HideStoryAdsPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/facebook/ads/story/HideStoryAdsPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
@@ -211,6 +273,46 @@ public final class app/revanced/patches/finanzonline/detection/root/RootDetectio
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlenews/customtabs/EnableCustomTabs : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/googlenews/customtabs/EnableCustomTabs;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch : app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportPatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/googlenews/misc/gms/GmsCoreSupportPatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlenews/misc/gms/GmsCoreSupportResourcePatch : app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportResourcePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/googlenews/misc/gms/GmsCoreSupportResourcePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlenews/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/googlenews/misc/integrations/IntegrationsPatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlephotos/features/SpoofFeaturesPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/googlephotos/features/SpoofFeaturesPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlephotos/features/fingerprints/InitializeFeaturesEnumFingerprint : app/revanced/patcher/fingerprint/MethodFingerprint {
|
||||
public static final field INSTANCE Lapp/revanced/patches/googlephotos/features/fingerprints/InitializeFeaturesEnumFingerprint;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatch : app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportPatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportResourcePatch : app/revanced/patches/shared/misc/gms/BaseGmsCoreSupportResourcePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/googlephotos/misc/gms/GmsCoreSupportResourcePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlephotos/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/googlephotos/misc/integrations/IntegrationsPatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
@@ -343,6 +445,12 @@ public final class app/revanced/patches/music/ad/video/HideMusicVideoAds : app/r
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/music/ad/video/HideVideoAds : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/music/ad/video/HideVideoAds;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/music/ad/video/MusicVideoAdsPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/music/ad/video/MusicVideoAdsPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
@@ -604,6 +712,12 @@ public final class app/revanced/patches/reddit/customclients/baconreader/api/Spo
|
||||
public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/BaseSpoofClientPatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/boostforreddit/api/SpoofClientPatch;
|
||||
public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
@@ -1044,6 +1158,12 @@ public final class app/revanced/patches/soundcloud/analytics/DisableTelemetryPat
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/soundcloud/offlinesync/EnableOfflineSyncPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/soundcloud/offlinesync/EnableOfflineSyncPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/spotify/layout/theme/CustomThemePatch : app/revanced/patcher/patch/ResourcePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/spotify/layout/theme/CustomThemePatch;
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
@@ -1092,6 +1212,12 @@ public final class app/revanced/patches/strava/upselling/DisableSubscriptionSugg
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/swissid/integritycheck/RemoveGooglePlayIntegrityCheck : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/swissid/integritycheck/RemoveGooglePlayIntegrityCheck;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/ticktick/misc/themeunlock/UnlockProPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/ticktick/misc/themeunlock/UnlockProPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
@@ -1712,6 +1838,12 @@ public final class app/revanced/patches/youtube/layout/thumbnails/AlternativeThu
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictions : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictions;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/youtube/misc/announcements/AnnouncementsPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
@@ -1778,6 +1910,16 @@ public final class app/revanced/patches/youtube/misc/gms/GmsCoreSupportResourceP
|
||||
public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook;
|
||||
public final fun addImageUrlErrorCallbackHook (Ljava/lang/String;)V
|
||||
public final fun addImageUrlHook (Ljava/lang/String;Z)V
|
||||
public static synthetic fun addImageUrlHook$default (Lapp/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook;Ljava/lang/String;ZILjava/lang/Object;)V
|
||||
public final fun addImageUrlSuccessCallbackHook (Ljava/lang/String;)V
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/youtube/misc/integrations/IntegrationsPatch;
|
||||
}
|
||||
@@ -1990,6 +2132,7 @@ public final class app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPat
|
||||
}
|
||||
|
||||
public final class app/revanced/util/BytecodeUtilsKt {
|
||||
public static final fun alsoResolve (Lapp/revanced/patcher/fingerprint/MethodFingerprint;Lapp/revanced/patcher/data/BytecodeContext;Lapp/revanced/patcher/fingerprint/MethodFingerprint;)Lapp/revanced/patcher/fingerprint/MethodFingerprintResult;
|
||||
public static final fun containsWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)Z
|
||||
public static final fun findMutableMethodOf (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lcom/android/tools/smali/dexlib2/iface/Method;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;
|
||||
public static final fun findOpcodeIndicesReversed (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)Ljava/util/List;
|
||||
@@ -2005,7 +2148,11 @@ public final class app/revanced/util/BytecodeUtilsKt {
|
||||
public static final fun indexOfIdResourceOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I
|
||||
public static final fun injectHideViewCall (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V
|
||||
public static final fun resultOrThrow (Lapp/revanced/patcher/fingerprint/MethodFingerprint;)Lapp/revanced/patcher/fingerprint/MethodFingerprintResult;
|
||||
public static final fun returnEarly (Lapp/revanced/patcher/fingerprint/MethodFingerprint;Z)V
|
||||
public static final fun returnEarly (Ljava/lang/Iterable;Z)V
|
||||
public static final fun returnEarly (Ljava/util/List;Z)V
|
||||
public static synthetic fun returnEarly$default (Lapp/revanced/patcher/fingerprint/MethodFingerprint;ZILjava/lang/Object;)V
|
||||
public static synthetic fun returnEarly$default (Ljava/lang/Iterable;ZILjava/lang/Object;)V
|
||||
public static synthetic fun returnEarly$default (Ljava/util/List;ZILjava/lang/Object;)V
|
||||
public static final fun transformMethods (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lkotlin/jvm/functions/Function1;)V
|
||||
public static final fun traverseClassHierarchy (Lapp/revanced/patcher/data/BytecodeContext;Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lkotlin/jvm/functions/Function1;)V
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
org.gradle.parallel = true
|
||||
org.gradle.caching = true
|
||||
kotlin.code.style = official
|
||||
version = 4.11.0-dev.6
|
||||
version = 4.14.0-dev.2
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
revanced-patcher = "19.3.1"
|
||||
#noinspection GradleDependency
|
||||
smali = "3.0.5" # 3.0.7 breaks binary compatibility. Tracking https://github.com/google/smali/issues/58.
|
||||
guava = "33.1.0-jre"
|
||||
gson = "2.10.1"
|
||||
binary-compatibility-validator = "0.14.0"
|
||||
guava = "33.2.1-jre"
|
||||
gson = "2.11.0"
|
||||
binary-compatibility-validator = "0.15.1"
|
||||
kotlin = "2.0.0"
|
||||
|
||||
[libraries]
|
||||
|
||||
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,7 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
||||
distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
2152
package-lock.json
generated
2152
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,7 @@
|
||||
"@saithodev/semantic-release-backmerge": "^4.0.1",
|
||||
"@semantic-release/changelog": "^6.0.3",
|
||||
"@semantic-release/git": "^10.0.1",
|
||||
"gradle-semantic-release-plugin": "^1.9.1",
|
||||
"semantic-release": "^23.0.8"
|
||||
"gradle-semantic-release-plugin": "^1.9.2",
|
||||
"semantic-release": "^24.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
@file:Suppress("unused")
|
||||
|
||||
package app.revanced.patches.all.location.hide
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patches.all.misc.transformation.BaseTransformInstructionsPatch
|
||||
import app.revanced.patches.all.misc.transformation.IMethodCall
|
||||
import app.revanced.patches.all.misc.transformation.fromMethodReference
|
||||
import app.revanced.util.getReference
|
||||
import com.android.tools.smali.dexlib2.iface.ClassDef
|
||||
import com.android.tools.smali.dexlib2.iface.Method
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.Instruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
@Patch(
|
||||
name = "Hide mock location",
|
||||
description = "Prevents the app from knowing the device location is being mocked by a third party app.",
|
||||
use = false
|
||||
)
|
||||
object HideMockLocationPatch : BaseTransformInstructionsPatch<Pair<Instruction, Int>>() {
|
||||
override fun filterMap(
|
||||
classDef: ClassDef,
|
||||
method: Method,
|
||||
instruction: Instruction,
|
||||
instructionIndex: Int
|
||||
): Pair<Instruction, Int>? {
|
||||
val reference = instruction.getReference<MethodReference>() ?: return null
|
||||
if (fromMethodReference<MethodCall>(reference) == null) return null
|
||||
|
||||
return instruction to instructionIndex
|
||||
}
|
||||
|
||||
override fun transform(mutableMethod: MutableMethod, entry: Pair<Instruction, Int>) {
|
||||
val (instruction, index) = entry
|
||||
instruction as FiveRegisterInstruction
|
||||
|
||||
// Replace return value with a constant `false` boolean.
|
||||
mutableMethod.replaceInstruction(
|
||||
index + 1,
|
||||
"const/4 v${instruction.registerC}, 0x0"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private enum class MethodCall(
|
||||
override val definedClassName: String,
|
||||
override val methodName: String,
|
||||
override val methodParams: Array<String>,
|
||||
override val returnType: String
|
||||
) : IMethodCall {
|
||||
IsMock("Landroid/location/Location;", "isMock", emptyArray(), "Z"),
|
||||
IsFromMockProvider("Landroid/location/Location;", "isFromMockProvider", emptyArray(), "Z")
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
package app.revanced.patches.all.misc.build
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patches.all.misc.transformation.BaseTransformInstructionsPatch
|
||||
import app.revanced.util.getReference
|
||||
import com.android.tools.smali.dexlib2.iface.ClassDef
|
||||
import com.android.tools.smali.dexlib2.iface.Method
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.Instruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
|
||||
abstract class BaseSpoofBuildInfoPatch : BaseTransformInstructionsPatch<Pair<Int, Pair<String, String>>>() {
|
||||
// The build information supported32BitAbis, supported64BitAbis, and supportedAbis are not supported for now,
|
||||
// because initializing an array in transform is a bit more complex.
|
||||
|
||||
protected open val board: String? = null
|
||||
|
||||
protected open val bootloader: String? = null
|
||||
|
||||
protected open val brand: String? = null
|
||||
|
||||
protected open val cpuAbi: String? = null
|
||||
|
||||
protected open val cpuAbi2: String? = null
|
||||
|
||||
protected open val device: String? = null
|
||||
|
||||
protected open val display: String? = null
|
||||
|
||||
protected open val fingerprint: String? = null
|
||||
|
||||
protected open val hardware: String? = null
|
||||
|
||||
protected open val host: String? = null
|
||||
|
||||
protected open val id: String? = null
|
||||
|
||||
protected open val manufacturer: String? = null
|
||||
|
||||
protected open val model: String? = null
|
||||
|
||||
protected open val odmSku: String? = null
|
||||
|
||||
protected open val product: String? = null
|
||||
|
||||
protected open val radio: String? = null
|
||||
|
||||
protected open val serial: String? = null
|
||||
|
||||
protected open val sku: String? = null
|
||||
|
||||
protected open val socManufacturer: String? = null
|
||||
|
||||
protected open val socModel: String? = null
|
||||
|
||||
protected open val tags: String? = null
|
||||
|
||||
protected open val time: Long? = null
|
||||
|
||||
protected open val type: String? = null
|
||||
|
||||
protected open val user: String? = null
|
||||
|
||||
|
||||
// Lazy, so that patch options above are initialized before they are accessed.
|
||||
private val replacements: Map<String, Pair<String, String>> by lazy {
|
||||
buildMap {
|
||||
if (board != null) put("BOARD", "const-string" to "\"$board\"")
|
||||
if (bootloader != null) put("BOOTLOADER", "const-string" to "\"$bootloader\"")
|
||||
if (brand != null) put("BRAND", "const-string" to "\"$brand\"")
|
||||
if (cpuAbi != null) put("CPU_ABI", "const-string" to "\"$cpuAbi\"")
|
||||
if (cpuAbi2 != null) put("CPU_ABI2", "const-string" to "\"$cpuAbi2\"")
|
||||
if (device != null) put("DEVICE", "const-string" to "\"$device\"")
|
||||
if (display != null) put("DISPLAY", "const-string" to "\"$display\"")
|
||||
if (fingerprint != null) put("FINGERPRINT", "const-string" to "\"$fingerprint\"")
|
||||
if (hardware != null) put("HARDWARE", "const-string" to "\"$hardware\"")
|
||||
if (host != null) put("HOST", "const-string" to "\"$host\"")
|
||||
if (id != null) put("ID", "const-string" to "\"$id\"")
|
||||
if (manufacturer != null) put("MANUFACTURER", "const-string" to "\"$manufacturer\"")
|
||||
if (model != null) put("MODEL", "const-string" to "\"$model\"")
|
||||
if (odmSku != null) put("ODM_SKU", "const-string" to "\"$odmSku\"")
|
||||
if (product != null) put("PRODUCT", "const-string" to "\"$product\"")
|
||||
if (radio != null) put("RADIO", "const-string" to "\"$radio\"")
|
||||
if (serial != null) put("SERIAL", "const-string" to "\"$serial\"")
|
||||
if (sku != null) put("SKU", "const-string" to "\"$sku\"")
|
||||
if (socManufacturer != null) put("SOC_MANUFACTURER", "const-string" to "\"$socManufacturer\"")
|
||||
if (socModel != null) put("SOC_MODEL", "const-string" to "\"$socModel\"")
|
||||
if (tags != null) put("TAGS", "const-string" to "\"$tags\"")
|
||||
if (time != null) put("TIME", "const-wide" to "$time")
|
||||
if (type != null) put("TYPE", "const-string" to "\"$type\"")
|
||||
if (user != null) put("USER", "const-string" to "\"$user\"")
|
||||
}
|
||||
}
|
||||
|
||||
override fun filterMap(
|
||||
classDef: ClassDef,
|
||||
method: Method,
|
||||
instruction: Instruction,
|
||||
instructionIndex: Int
|
||||
): Pair<Int, Pair<String, String>>? {
|
||||
val reference = instruction.getReference<FieldReference>() ?: return null
|
||||
if (reference.definingClass != BUILD_CLASS_DESCRIPTOR) return null
|
||||
|
||||
return replacements[reference.name]?.let { instructionIndex to it }
|
||||
}
|
||||
|
||||
override fun transform(mutableMethod: MutableMethod, entry: Pair<Int, Pair<String, String>>) {
|
||||
val (index, replacement) = entry
|
||||
val (opcode, operand) = replacement
|
||||
val register = mutableMethod.getInstruction<OneRegisterInstruction>(index).registerA
|
||||
|
||||
mutableMethod.replaceInstruction(index, "$opcode v$register, $operand")
|
||||
}
|
||||
|
||||
private companion object {
|
||||
private const val BUILD_CLASS_DESCRIPTOR = "Landroid/os/Build;"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,183 @@
|
||||
package app.revanced.patches.all.misc.build
|
||||
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.longPatchOption
|
||||
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption
|
||||
|
||||
@Patch(
|
||||
name = "Spoof build info",
|
||||
description = "Spoof the information about the current build.",
|
||||
use = false
|
||||
)
|
||||
@Suppress("unused")
|
||||
class SpoofBuildInfoPatch : BaseSpoofBuildInfoPatch() {
|
||||
override val board by stringPatchOption(
|
||||
key = "board",
|
||||
default = null,
|
||||
title = "Board",
|
||||
description = "The name of the underlying board, like \"goldfish\"."
|
||||
)
|
||||
|
||||
override val bootloader by stringPatchOption(
|
||||
key = "bootloader",
|
||||
default = null,
|
||||
title = "Bootloader",
|
||||
description = "The system bootloader version number."
|
||||
)
|
||||
|
||||
override val brand by stringPatchOption(
|
||||
key = "brand",
|
||||
default = null,
|
||||
title = "Brand",
|
||||
description = "The consumer-visible brand with which the product/hardware will be associated, if any."
|
||||
)
|
||||
|
||||
override val cpuAbi by stringPatchOption(
|
||||
key = "cpu-abi",
|
||||
default = null,
|
||||
title = "CPU ABI",
|
||||
description = "This field was deprecated in API level 21. Use SUPPORTED_ABIS instead."
|
||||
)
|
||||
|
||||
override val cpuAbi2 by stringPatchOption(
|
||||
key = "cpu-abi-2",
|
||||
default = null,
|
||||
title = "CPU ABI 2",
|
||||
description = "This field was deprecated in API level 21. Use SUPPORTED_ABIS instead."
|
||||
)
|
||||
|
||||
override val device by stringPatchOption(
|
||||
key = "device",
|
||||
default = null,
|
||||
title = "Device",
|
||||
description = "The name of the industrial design."
|
||||
)
|
||||
|
||||
override val display by stringPatchOption(
|
||||
key = "display",
|
||||
default = null,
|
||||
title = "Display",
|
||||
description = "A build ID string meant for displaying to the user."
|
||||
)
|
||||
|
||||
override val fingerprint by stringPatchOption(
|
||||
key = "fingerprint",
|
||||
default = null,
|
||||
title = "Fingerprint",
|
||||
description = "A string that uniquely identifies this build."
|
||||
)
|
||||
|
||||
override val hardware by stringPatchOption(
|
||||
key = "hardware",
|
||||
default = null,
|
||||
title = "Hardware",
|
||||
description = "The name of the hardware (from the kernel command line or /proc)."
|
||||
)
|
||||
|
||||
override val host by stringPatchOption(
|
||||
key = "host",
|
||||
default = null,
|
||||
title = "Host",
|
||||
description = "The host."
|
||||
)
|
||||
|
||||
override val id by stringPatchOption(
|
||||
key = "id",
|
||||
default = null,
|
||||
title = "ID",
|
||||
description = "Either a changelist number, or a label like \"M4-rc20\"."
|
||||
)
|
||||
|
||||
override val manufacturer by stringPatchOption(
|
||||
key = "manufacturer",
|
||||
default = null,
|
||||
title = "Manufacturer",
|
||||
description = "The manufacturer of the product/hardware."
|
||||
)
|
||||
|
||||
override val model by stringPatchOption(
|
||||
key = "model",
|
||||
default = null,
|
||||
title = "Model",
|
||||
description = "The end-user-visible name for the end product."
|
||||
)
|
||||
|
||||
override val odmSku by stringPatchOption(
|
||||
key = "odm-sku",
|
||||
default = null,
|
||||
title = "ODM SKU",
|
||||
description = "The SKU of the device as set by the original design manufacturer (ODM)."
|
||||
)
|
||||
|
||||
override val product by stringPatchOption(
|
||||
key = "product",
|
||||
default = null,
|
||||
title = "Product",
|
||||
description = "The name of the overall product."
|
||||
)
|
||||
|
||||
override val radio by stringPatchOption(
|
||||
key = "radio",
|
||||
default = null,
|
||||
title = "Radio",
|
||||
description = "This field was deprecated in API level 15. " +
|
||||
"The radio firmware version is frequently not available when this class is initialized, " +
|
||||
"leading to a blank or \"unknown\" value for this string. Use getRadioVersion() instead."
|
||||
)
|
||||
|
||||
override val serial by stringPatchOption(
|
||||
key = "serial",
|
||||
default = null,
|
||||
title = "Serial",
|
||||
description = "This field was deprecated in API level 26. Use getSerial() instead."
|
||||
)
|
||||
|
||||
override val sku by stringPatchOption(
|
||||
key = "sku",
|
||||
default = null,
|
||||
title = "SKU",
|
||||
description = "The SKU of the hardware (from the kernel command line)."
|
||||
)
|
||||
|
||||
override val socManufacturer by stringPatchOption(
|
||||
key = "soc-manufacturer",
|
||||
default = null,
|
||||
title = "SOC Manufacturer",
|
||||
description = "The manufacturer of the device's primary system-on-chip."
|
||||
)
|
||||
|
||||
override val socModel by stringPatchOption(
|
||||
key = "soc-model",
|
||||
default = null,
|
||||
title = "SOC Model",
|
||||
description = "The model name of the device's primary system-on-chip."
|
||||
)
|
||||
|
||||
override val tags by stringPatchOption(
|
||||
key = "tags",
|
||||
default = null,
|
||||
title = "Tags",
|
||||
description = "Comma-separated tags describing the build, like \"unsigned,debug\"."
|
||||
)
|
||||
|
||||
override val time by longPatchOption(
|
||||
key = "time",
|
||||
default = null,
|
||||
title = "Time",
|
||||
description = "The time at which the build was produced, given in milliseconds since the UNIX epoch."
|
||||
)
|
||||
|
||||
override val type by stringPatchOption(
|
||||
key = "type",
|
||||
default = null,
|
||||
title = "Type",
|
||||
description = "The type of build, like \"user\" or \"eng\"."
|
||||
)
|
||||
|
||||
override val user by stringPatchOption(
|
||||
key = "user",
|
||||
default = null,
|
||||
title = "User",
|
||||
description = "The user."
|
||||
)
|
||||
}
|
||||
@@ -83,7 +83,7 @@ object AddResourcesPatch : ResourcePatch(), MutableMap<Value, MutableSet<BaseRes
|
||||
"eu-rES" to "eu",
|
||||
"fa-rIR" to "fa",
|
||||
"fi-rFI" to "fi",
|
||||
"tl-rPH" to "tl",
|
||||
"fil-rPH" to "tl",
|
||||
"fr-rFR" to "fr",
|
||||
"gl-rES" to "gl",
|
||||
"gu-rIN" to "gu",
|
||||
@@ -125,6 +125,7 @@ object AddResourcesPatch : ResourcePatch(), MutableMap<Value, MutableSet<BaseRes
|
||||
"sk-rSK" to "sk",
|
||||
"sl-rSI" to "sl",
|
||||
"sq-rAL" to "sq",
|
||||
"sr-rCS" to "b+sr+Latn",
|
||||
"sr-rSP" to "sr",
|
||||
"sv-rSE" to "sv",
|
||||
"sw-rKE" to "sw",
|
||||
@@ -138,7 +139,6 @@ object AddResourcesPatch : ResourcePatch(), MutableMap<Value, MutableSet<BaseRes
|
||||
"uz-rUZ" to "uz",
|
||||
"vi-rVN" to "vi",
|
||||
"zh-rCN" to "zh-rCN",
|
||||
"zh-rHK" to "zh-rHK",
|
||||
"zh-rTW" to "zh-rTW",
|
||||
"zu-rZA" to "zu",
|
||||
)
|
||||
@@ -347,7 +347,10 @@ object AddResourcesPatch : ResourcePatch(), MutableMap<Value, MutableSet<BaseRes
|
||||
val targetFile =
|
||||
context.get("res/$value/$resourceFileName.xml").also {
|
||||
it.parentFile?.mkdirs()
|
||||
it.createNewFile()
|
||||
|
||||
if(it.createNewFile()) {
|
||||
it.writeText("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n</resources>")
|
||||
}
|
||||
}
|
||||
|
||||
context.xmlEditor[targetFile.path].let { editor ->
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package app.revanced.patches.bandcamp.limitations
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.bandcamp.limitations.fingerprints.HandlePlaybackLimitsPatch
|
||||
import app.revanced.util.exception
|
||||
|
||||
@Patch(
|
||||
name = "Remove play limits",
|
||||
description = "Disables purchase nagging and playback limits of not purchased tracks.",
|
||||
compatiblePackages = [CompatiblePackage("com.bandcamp.android")],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object RemovePlayLimitsPatch : BytecodePatch(
|
||||
setOf(HandlePlaybackLimitsPatch),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) =
|
||||
HandlePlaybackLimitsPatch.result?.mutableMethod?.addInstructions(0, "return-void")
|
||||
?: throw HandlePlaybackLimitsPatch.exception
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package app.revanced.patches.bandcamp.limitations.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
internal object HandlePlaybackLimitsPatch : MethodFingerprint(
|
||||
strings = listOf("play limits processing track", "found play_count"),
|
||||
)
|
||||
@@ -1,20 +1,23 @@
|
||||
package app.revanced.patches.candylinkvpn
|
||||
|
||||
import app.revanced.util.exception
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.candylinkvpn.fingerprints.IsPremiumPurchasedFingerprint
|
||||
import app.revanced.util.exception
|
||||
|
||||
@Patch(
|
||||
name = "Unlock pro",
|
||||
compatiblePackages = [CompatiblePackage("com.candylink.openvpn")]
|
||||
compatiblePackages = [CompatiblePackage("com.candylink.openvpn")],
|
||||
)
|
||||
@Deprecated(
|
||||
"This patch does not work anymore and will be removed in the future, " +
|
||||
"because the servers now check the purchase status.",
|
||||
)
|
||||
@Suppress("unused")
|
||||
object UnlockProPatch : BytecodePatch(
|
||||
setOf(IsPremiumPurchasedFingerprint)
|
||||
setOf(IsPremiumPurchasedFingerprint),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
IsPremiumPurchasedFingerprint.result?.mutableMethod?.addInstructions(
|
||||
@@ -22,7 +25,7 @@ object UnlockProPatch : BytecodePatch(
|
||||
"""
|
||||
const/4 v0, 0x1
|
||||
return v0
|
||||
"""
|
||||
""",
|
||||
) ?: throw IsPremiumPurchasedFingerprint.exception
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
package app.revanced.patches.duolingo.ad
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.duolingo.ad.fingerprints.InitializeMonetizationDebugSettingsFingerprint
|
||||
import app.revanced.util.resultOrThrow
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||
|
||||
@Patch(
|
||||
name = "Disable ads",
|
||||
compatiblePackages = [CompatiblePackage("com.duolingo")]
|
||||
)
|
||||
@Suppress("unused")
|
||||
object DisableAdsPatch : BytecodePatch(
|
||||
setOf(InitializeMonetizationDebugSettingsFingerprint)
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
// Couple approaches to remove ads exist:
|
||||
//
|
||||
// MonetizationDebugSettings has a boolean value for "disableAds".
|
||||
// OnboardingState has a getter to check if the user has any "adFreeSessions".
|
||||
// SharedPreferences has a debug boolean value with key "disable_ads", which maps to "DebugCategory.DISABLE_ADS".
|
||||
//
|
||||
// MonetizationDebugSettings seems to be the most general setting to work fine.
|
||||
InitializeMonetizationDebugSettingsFingerprint.resultOrThrow().let {
|
||||
it.mutableMethod.apply {
|
||||
val insertIndex = it.scanResult.patternScanResult!!.startIndex
|
||||
val register = getInstruction<TwoRegisterInstruction>(insertIndex).registerA
|
||||
|
||||
addInstructions(
|
||||
insertIndex,
|
||||
"const/4 v$register, 0x1"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package app.revanced.patches.duolingo.ad.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object InitializeMonetizationDebugSettingsFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
parameters = listOf(
|
||||
"Z", // disableAds
|
||||
"Z", // useDebugBilling
|
||||
"Z", // showManageSubscriptions
|
||||
"Z", // alwaysShowSuperAds
|
||||
"Lcom/duolingo/debug/FamilyQuestOverride;",
|
||||
),
|
||||
opcodes = listOf(
|
||||
Opcode.IPUT_BOOLEAN
|
||||
)
|
||||
)
|
||||
@@ -0,0 +1,35 @@
|
||||
package app.revanced.patches.duolingo.debug
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.duolingo.debug.fingerprints.InitializeBuildConfigProviderFingerprint
|
||||
import app.revanced.util.resultOrThrow
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||
|
||||
@Patch(
|
||||
name = "Enable debug menu",
|
||||
compatiblePackages = [CompatiblePackage("com.duolingo", ["5.158.4"])],
|
||||
use = false
|
||||
)
|
||||
@Suppress("unused")
|
||||
object EnableDebugMenuPatch : BytecodePatch(
|
||||
setOf(InitializeBuildConfigProviderFingerprint)
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
InitializeBuildConfigProviderFingerprint.resultOrThrow().let {
|
||||
it.mutableMethod.apply {
|
||||
val insertIndex = it.scanResult.patternScanResult!!.startIndex
|
||||
val register = getInstruction<TwoRegisterInstruction>(insertIndex).registerA
|
||||
|
||||
addInstructions(
|
||||
insertIndex,
|
||||
"const/4 v$register, 0x1"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package app.revanced.patches.duolingo.debug.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
/**
|
||||
* The `BuildConfigProvider` class has two booleans:
|
||||
*
|
||||
* - `isChina`: (usually) compares "play" with "china"...except for builds in China
|
||||
* - `isDebug`: compares "release" with "debug" <-- we want to force this to `true`
|
||||
*/
|
||||
internal object InitializeBuildConfigProviderFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
strings = listOf(
|
||||
"debug",
|
||||
"release",
|
||||
"china",
|
||||
),
|
||||
opcodes = listOf(
|
||||
Opcode.IPUT_BOOLEAN
|
||||
)
|
||||
)
|
||||
@@ -0,0 +1,32 @@
|
||||
package app.revanced.patches.googlenews.customtabs
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.googlenews.customtabs.fingerprints.LaunchCustomTabFingerprint
|
||||
import app.revanced.util.resultOrThrow
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
|
||||
@Patch(
|
||||
name = "Enable CustomTabs",
|
||||
description = "Enables CustomTabs to open articles in your default browser.",
|
||||
compatiblePackages = [CompatiblePackage("com.google.android.apps.magazines")],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object EnableCustomTabs : BytecodePatch(
|
||||
setOf(LaunchCustomTabFingerprint)
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
LaunchCustomTabFingerprint.resultOrThrow().let { result ->
|
||||
result.mutableMethod.apply {
|
||||
val checkIndex = result.scanResult.patternScanResult!!.endIndex + 1
|
||||
val register = getInstruction<OneRegisterInstruction>(checkIndex).registerA
|
||||
|
||||
replaceInstruction(checkIndex, "const/4 v$register, 0x1")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package app.revanced.patches.googlenews.customtabs.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object LaunchCustomTabFingerprint : MethodFingerprint(
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
opcodes = listOf(
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.CONST_4,
|
||||
Opcode.IPUT,
|
||||
Opcode.CONST_4,
|
||||
Opcode.IPUT_BOOLEAN,
|
||||
),
|
||||
customFingerprint = { _, classDef -> classDef.endsWith("CustomTabsArticleLauncher;") },
|
||||
)
|
||||
@@ -0,0 +1,6 @@
|
||||
package app.revanced.patches.googlenews.misc.gms
|
||||
|
||||
internal object Constants {
|
||||
const val MAGAZINES_PACKAGE_NAME = "com.google.android.apps.magazines"
|
||||
const val REVANCED_MAGAZINES_PACKAGE_NAME = "app.revanced.android.magazines"
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package app.revanced.patches.googlenews.misc.gms
|
||||
|
||||
import app.revanced.patches.googlenews.misc.gms.Constants.MAGAZINES_PACKAGE_NAME
|
||||
import app.revanced.patches.googlenews.misc.gms.Constants.REVANCED_MAGAZINES_PACKAGE_NAME
|
||||
import app.revanced.patches.googlenews.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorGroupIdOption
|
||||
import app.revanced.patches.googlenews.misc.gms.fingerprints.MagazinesActivityOnCreateFingerprint
|
||||
import app.revanced.patches.googlenews.misc.integrations.IntegrationsPatch
|
||||
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch
|
||||
|
||||
@Suppress("unused")
|
||||
object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
||||
fromPackageName = MAGAZINES_PACKAGE_NAME,
|
||||
toPackageName = REVANCED_MAGAZINES_PACKAGE_NAME,
|
||||
primeMethodFingerprint = null,
|
||||
mainActivityOnCreateFingerprint = MagazinesActivityOnCreateFingerprint,
|
||||
integrationsPatchDependency = IntegrationsPatch::class,
|
||||
gmsCoreSupportResourcePatch = GmsCoreSupportResourcePatch,
|
||||
// Remove version constraint,
|
||||
// once https://github.com/ReVanced/revanced-patches/pull/3111#issuecomment-2240877277 is resolved.
|
||||
compatiblePackages = setOf(CompatiblePackage(MAGAZINES_PACKAGE_NAME, setOf("5.108.0.644447823"))),
|
||||
) {
|
||||
override val gmsCoreVendorGroupId by gmsCoreVendorGroupIdOption
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package app.revanced.patches.googlenews.misc.gms
|
||||
|
||||
import app.revanced.patches.googlenews.misc.gms.Constants.MAGAZINES_PACKAGE_NAME
|
||||
import app.revanced.patches.googlenews.misc.gms.Constants.REVANCED_MAGAZINES_PACKAGE_NAME
|
||||
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportResourcePatch
|
||||
|
||||
object GmsCoreSupportResourcePatch : BaseGmsCoreSupportResourcePatch(
|
||||
fromPackageName = MAGAZINES_PACKAGE_NAME,
|
||||
toPackageName = REVANCED_MAGAZINES_PACKAGE_NAME,
|
||||
spoofedPackageSignature = "24bb24c05e47e0aefa68a58a766179d9b613a666",
|
||||
)
|
||||
@@ -0,0 +1,9 @@
|
||||
package app.revanced.patches.googlenews.misc.gms.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
internal object MagazinesActivityOnCreateFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef, classDef ->
|
||||
methodDef.name == "onCreate" && classDef.endsWith("/StartActivity;")
|
||||
},
|
||||
)
|
||||
@@ -0,0 +1,7 @@
|
||||
package app.revanced.patches.googlenews.misc.gms.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
internal object PrimeMethodFingerprint : MethodFingerprint(
|
||||
strings = listOf("com.google.android.GoogleCamera", "com.android.vending"),
|
||||
)
|
||||
@@ -0,0 +1,10 @@
|
||||
package app.revanced.patches.googlenews.misc.integrations
|
||||
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.googlenews.misc.integrations.fingerprints.StartActivityInitFingerprint
|
||||
import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch
|
||||
|
||||
@Patch(requiresIntegrations = true)
|
||||
object IntegrationsPatch : BaseIntegrationsPatch(
|
||||
setOf(StartActivityInitFingerprint),
|
||||
)
|
||||
@@ -0,0 +1,41 @@
|
||||
package app.revanced.patches.googlenews.misc.integrations.fingerprints
|
||||
|
||||
import app.revanced.patches.googlenews.misc.integrations.fingerprints.StartActivityInitFingerprint.getApplicationContextIndex
|
||||
import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
internal object StartActivityInitFingerprint : IntegrationsFingerprint(
|
||||
opcodes = listOf(
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT,
|
||||
Opcode.CONST_4,
|
||||
Opcode.IF_EQZ,
|
||||
Opcode.CONST,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.IPUT_BOOLEAN,
|
||||
Opcode.INVOKE_VIRTUAL, // Calls startActivity.getApplicationContext().
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
),
|
||||
insertIndexResolver = { method ->
|
||||
getApplicationContextIndex = method.indexOfFirstInstructionOrThrow {
|
||||
getReference<MethodReference>()?.name == "getApplicationContext"
|
||||
}
|
||||
|
||||
getApplicationContextIndex + 2 // Below the move-result-object instruction.
|
||||
},
|
||||
contextRegisterResolver = { method ->
|
||||
val moveResultInstruction = method.implementation!!.instructions.elementAt(getApplicationContextIndex + 1)
|
||||
as OneRegisterInstruction
|
||||
moveResultInstruction.registerA
|
||||
},
|
||||
customFingerprint = { methodDef, classDef ->
|
||||
methodDef.name == "onCreate" && classDef.endsWith("/StartActivity;")
|
||||
},
|
||||
) {
|
||||
private var getApplicationContextIndex = -1
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package app.revanced.patches.googlephotos.features
|
||||
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.all.misc.build.BaseSpoofBuildInfoPatch
|
||||
|
||||
@Patch(description = "Spoof build info to Google Pixel XL.")
|
||||
internal class SpoofBuildInfoPatch : BaseSpoofBuildInfoPatch() {
|
||||
override val brand = "google"
|
||||
override val manufacturer = "Google"
|
||||
override val device = "marlin"
|
||||
override val product = "marlin"
|
||||
override val model = "Pixel XL"
|
||||
override val fingerprint = "google/marlin/marlin:10/QP1A.191005.007.A3/5972272:user/release-keys"
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
package app.revanced.patches.googlephotos.features
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringArrayPatchOption
|
||||
import app.revanced.patches.googlephotos.features.fingerprints.InitializeFeaturesEnumFingerprint
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.resultOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.StringReference
|
||||
|
||||
@Patch(
|
||||
name = "Spoof features",
|
||||
description = "Spoofs the device to enable Google Pixel exclusive features, including unlimited storage.",
|
||||
dependencies = [SpoofBuildInfoPatch::class],
|
||||
compatiblePackages = [CompatiblePackage("com.google.android.apps.photos")],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object SpoofFeaturesPatch : BytecodePatch(setOf(InitializeFeaturesEnumFingerprint)) {
|
||||
private val featuresToEnable by stringArrayPatchOption(
|
||||
"featuresToEnable",
|
||||
arrayOf(
|
||||
"com.google.android.apps.photos.NEXUS_PRELOAD",
|
||||
"com.google.android.apps.photos.nexus_preload",
|
||||
),
|
||||
title = "Features to enable",
|
||||
description = "Google Pixel exclusive features to enable. Features up to Pixel XL enable the unlimited storage feature.",
|
||||
required = true,
|
||||
)
|
||||
|
||||
private val featuresToDisable by stringArrayPatchOption(
|
||||
"featuresToDisable",
|
||||
arrayOf(
|
||||
"com.google.android.apps.photos.PIXEL_2017_PRELOAD",
|
||||
"com.google.android.apps.photos.PIXEL_2018_PRELOAD",
|
||||
"com.google.android.apps.photos.PIXEL_2019_MIDYEAR_PRELOAD",
|
||||
"com.google.android.apps.photos.PIXEL_2019_PRELOAD",
|
||||
"com.google.android.feature.PIXEL_2020_MIDYEAR_EXPERIENCE",
|
||||
"com.google.android.feature.PIXEL_2020_EXPERIENCE",
|
||||
"com.google.android.feature.PIXEL_2021_MIDYEAR_EXPERIENCE",
|
||||
"com.google.android.feature.PIXEL_2021_EXPERIENCE",
|
||||
"com.google.android.feature.PIXEL_2022_MIDYEAR_EXPERIENCE",
|
||||
"com.google.android.feature.PIXEL_2022_EXPERIENCE",
|
||||
"com.google.android.feature.PIXEL_2023_MIDYEAR_EXPERIENCE",
|
||||
"com.google.android.feature.PIXEL_2023_EXPERIENCE",
|
||||
"com.google.android.feature.PIXEL_2024_MIDYEAR_EXPERIENCE",
|
||||
"com.google.android.feature.PIXEL_2024_EXPERIENCE",
|
||||
"com.google.android.feature.PIXEL_2025_MIDYEAR_EXPERIENCE",
|
||||
),
|
||||
title = "Features to disable",
|
||||
description = "Google Pixel exclusive features to disable." +
|
||||
"Features after Pixel XL may have to be disabled for unlimited storage depending on the device.",
|
||||
required = true,
|
||||
)
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
val featuresToEnable = featuresToEnable!!.toSet()
|
||||
val featuresToDisable = featuresToDisable!!.toSet()
|
||||
|
||||
InitializeFeaturesEnumFingerprint.resultOrThrow().let { result ->
|
||||
result.mutableMethod.apply {
|
||||
getInstructions().filter { it.opcode == Opcode.CONST_STRING }.forEach {
|
||||
val feature = it.getReference<StringReference>()!!.string
|
||||
|
||||
val spoofedFeature = when (feature) {
|
||||
in featuresToEnable -> "android.hardware.wifi"
|
||||
in featuresToDisable -> "dummy"
|
||||
else -> return@forEach
|
||||
}
|
||||
|
||||
val constStringIndex = it.location.index
|
||||
val constStringRegister = (it as OneRegisterInstruction).registerA
|
||||
|
||||
replaceInstruction(
|
||||
constStringIndex,
|
||||
"const-string v$constStringRegister, \"$spoofedFeature\"",
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package app.revanced.patches.googlephotos.features.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
object InitializeFeaturesEnumFingerprint : MethodFingerprint(
|
||||
strings = listOf("com.google.android.apps.photos.NEXUS_PRELOAD"),
|
||||
)
|
||||
@@ -0,0 +1,6 @@
|
||||
package app.revanced.patches.googlephotos.misc.gms
|
||||
|
||||
internal object Constants {
|
||||
const val PHOTOS_PACKAGE_NAME = "com.google.android.apps.photos"
|
||||
const val REVANCED_PHOTOS_PACKAGE_NAME = "app.revanced.android.photos"
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package app.revanced.patches.googlephotos.misc.gms
|
||||
|
||||
import app.revanced.patches.googlephotos.misc.gms.Constants.PHOTOS_PACKAGE_NAME
|
||||
import app.revanced.patches.googlephotos.misc.gms.Constants.REVANCED_PHOTOS_PACKAGE_NAME
|
||||
import app.revanced.patches.googlephotos.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorGroupIdOption
|
||||
import app.revanced.patches.googlephotos.misc.gms.fingerprints.PhotosActivityOnCreateFingerprint
|
||||
import app.revanced.patches.googlephotos.misc.integrations.IntegrationsPatch
|
||||
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch
|
||||
|
||||
@Suppress("unused")
|
||||
object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
||||
fromPackageName = PHOTOS_PACKAGE_NAME,
|
||||
toPackageName = REVANCED_PHOTOS_PACKAGE_NAME,
|
||||
primeMethodFingerprint = null,
|
||||
mainActivityOnCreateFingerprint = PhotosActivityOnCreateFingerprint,
|
||||
integrationsPatchDependency = IntegrationsPatch::class,
|
||||
gmsCoreSupportResourcePatch = GmsCoreSupportResourcePatch,
|
||||
compatiblePackages = setOf(CompatiblePackage(PHOTOS_PACKAGE_NAME)),
|
||||
) {
|
||||
override val gmsCoreVendorGroupId by gmsCoreVendorGroupIdOption
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package app.revanced.patches.googlephotos.misc.gms
|
||||
|
||||
import app.revanced.patches.googlephotos.misc.gms.Constants.PHOTOS_PACKAGE_NAME
|
||||
import app.revanced.patches.googlephotos.misc.gms.Constants.REVANCED_PHOTOS_PACKAGE_NAME
|
||||
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportResourcePatch
|
||||
|
||||
object GmsCoreSupportResourcePatch : BaseGmsCoreSupportResourcePatch(
|
||||
fromPackageName = PHOTOS_PACKAGE_NAME,
|
||||
toPackageName = REVANCED_PHOTOS_PACKAGE_NAME,
|
||||
spoofedPackageSignature = "24bb24c05e47e0aefa68a58a766179d9b613a600",
|
||||
)
|
||||
@@ -0,0 +1,9 @@
|
||||
package app.revanced.patches.googlephotos.misc.gms.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
internal object PhotosActivityOnCreateFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef, classDef ->
|
||||
methodDef.name == "onCreate" && classDef.endsWith("/HomeActivity;")
|
||||
},
|
||||
)
|
||||
@@ -0,0 +1,10 @@
|
||||
package app.revanced.patches.googlephotos.misc.integrations
|
||||
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.googlephotos.misc.integrations.fingerprints.HomeActivityInitFingerprint
|
||||
import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch
|
||||
|
||||
@Patch(requiresIntegrations = true)
|
||||
object IntegrationsPatch : BaseIntegrationsPatch(
|
||||
setOf(HomeActivityInitFingerprint),
|
||||
)
|
||||
@@ -0,0 +1,37 @@
|
||||
package app.revanced.patches.googlephotos.misc.integrations.fingerprints
|
||||
|
||||
import app.revanced.patches.googlephotos.misc.integrations.fingerprints.HomeActivityInitFingerprint.getApplicationContextIndex
|
||||
import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
internal object HomeActivityInitFingerprint : IntegrationsFingerprint(
|
||||
opcodes = listOf(
|
||||
Opcode.CONST_STRING,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.IF_NEZ,
|
||||
Opcode.INVOKE_VIRTUAL, // Calls getApplicationContext().
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
),
|
||||
insertIndexResolver = { method ->
|
||||
getApplicationContextIndex = method.indexOfFirstInstructionOrThrow {
|
||||
getReference<MethodReference>()?.name == "getApplicationContext"
|
||||
}
|
||||
|
||||
getApplicationContextIndex + 2 // Below the move-result-object instruction.
|
||||
},
|
||||
contextRegisterResolver = { method ->
|
||||
val moveResultInstruction = method.implementation!!.instructions.elementAt(getApplicationContextIndex + 1)
|
||||
as OneRegisterInstruction
|
||||
moveResultInstruction.registerA
|
||||
},
|
||||
customFingerprint = { methodDef, classDef ->
|
||||
methodDef.name == "onCreate" && classDef.endsWith("/HomeActivity;")
|
||||
},
|
||||
) {
|
||||
private var getApplicationContextIndex = -1
|
||||
}
|
||||
@@ -12,15 +12,15 @@ import app.revanced.util.returnEarly
|
||||
@Patch(
|
||||
name = "Remove root detection",
|
||||
description = "Removes the check for root permissions and unlocked bootloader.",
|
||||
compatiblePackages = [CompatiblePackage("at.gv.oe.app")]
|
||||
compatiblePackages = [CompatiblePackage("at.gv.oe.app")],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object RootDetectionPatch : BytecodePatch(
|
||||
setOf(AttestationSupportedCheckFingerprint, BootloaderCheckFingerprint, RootCheckFingerprint)
|
||||
setOf(AttestationSupportedCheckFingerprint, BootloaderCheckFingerprint, RootCheckFingerprint),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) = listOf(
|
||||
override fun execute(context: BytecodeContext) = setOf(
|
||||
AttestationSupportedCheckFingerprint,
|
||||
BootloaderCheckFingerprint,
|
||||
RootCheckFingerprint
|
||||
RootCheckFingerprint,
|
||||
).returnEarly(true)
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import app.revanced.util.exception
|
||||
|
||||
@Patch(
|
||||
name = "Hide ads",
|
||||
description = "Hides ads in stories, discover, profile, etc." +
|
||||
description = "Hides ads in stories, discover, profile, etc. " +
|
||||
"An ad can still appear once when refreshing the home feed.",
|
||||
compatiblePackages = [CompatiblePackage("com.instagram.android")],
|
||||
)
|
||||
|
||||
@@ -2,16 +2,13 @@ package app.revanced.patches.instagram.patches.ad.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object AdInjectorFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
accessFlags = AccessFlags.PRIVATE.value,
|
||||
parameters = listOf("L", "L"),
|
||||
opcodes = listOf(
|
||||
Opcode.IGET,
|
||||
Opcode.INVOKE_INTERFACE,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
strings = listOf(
|
||||
"SponsoredContentController.insertItem",
|
||||
"SponsoredContentController::Delivery",
|
||||
),
|
||||
strings = listOf("SponsoredContentController::Delivery"),
|
||||
)
|
||||
|
||||
@@ -14,9 +14,9 @@ import app.revanced.util.exception
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
|
||||
@Patch(
|
||||
name = "Hide timeline ads",
|
||||
compatiblePackages = [CompatiblePackage("com.instagram.android")],
|
||||
)
|
||||
@Deprecated("This patch is not needed anymore.", replaceWith = ReplaceWith("HideAdsPatch"))
|
||||
@Suppress("unused")
|
||||
object HideTimelineAdsPatch : BytecodePatch(
|
||||
setOf(
|
||||
|
||||
@@ -13,7 +13,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
@Patch(
|
||||
name = "Disable switching emoji to sticker",
|
||||
description = "Disables switching from emoji to sticker search mode in message input field.",
|
||||
compatiblePackages = [CompatiblePackage("com.facebook.orca")],
|
||||
compatiblePackages = [CompatiblePackage("com.facebook.orca", ["439.0.0.29.119"])],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object DisableSwitchingEmojiToStickerPatch : BytecodePatch(
|
||||
|
||||
@@ -8,20 +8,20 @@ import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.moneymanager.fingerprints.UnlockProFingerprint
|
||||
|
||||
@Patch(
|
||||
name = "Unlock pro",
|
||||
compatiblePackages = [CompatiblePackage("com.ithebk.expensemanager")]
|
||||
compatiblePackages = [CompatiblePackage("com.ithebk.expensemanager")],
|
||||
)
|
||||
@Deprecated("This patch is not functional anymore and will be removed in the future.")
|
||||
@Suppress("unused")
|
||||
object UnlockProPatch : BytecodePatch(
|
||||
setOf(UnlockProFingerprint)
|
||||
){
|
||||
setOf(UnlockProFingerprint),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
UnlockProFingerprint.result!!.mutableMethod.addInstructions(
|
||||
UnlockProFingerprint.result!!.mutableMethod.addInstructions(
|
||||
0,
|
||||
"""
|
||||
const/4 v0, 0x1
|
||||
return v0
|
||||
"""
|
||||
""",
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,11 +6,12 @@ import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patches.music.ad.video.fingerprints.ShowMusicVideoAdsParentFingerprint
|
||||
import app.revanced.patches.music.ad.video.fingerprints.ShowVideoAdsParentFingerprint
|
||||
import app.revanced.util.exception
|
||||
|
||||
@Patch(
|
||||
name = "Hide music video ads",
|
||||
name = "Hide video ads",
|
||||
description = "Hides ads that appear while listening to or streaming music videos, podcasts, or songs.",
|
||||
compatiblePackages = [
|
||||
CompatiblePackage(
|
||||
"com.google.android.apps.youtube.music",
|
||||
@@ -25,24 +26,32 @@ import app.revanced.util.exception
|
||||
],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object HideMusicVideoAds : BytecodePatch(
|
||||
setOf(ShowMusicVideoAdsParentFingerprint),
|
||||
object HideVideoAds : BytecodePatch(
|
||||
setOf(ShowVideoAdsParentFingerprint),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
ShowMusicVideoAdsParentFingerprint.result?.let {
|
||||
val showMusicVideoAdsMethod = context
|
||||
ShowVideoAdsParentFingerprint.result?.let {
|
||||
val showVideoAdsMethod = context
|
||||
.toMethodWalker(it.mutableMethod)
|
||||
.nextMethod(it.scanResult.patternScanResult!!.startIndex + 1, true).getMethod() as MutableMethod
|
||||
|
||||
showMusicVideoAdsMethod.addInstruction(0, "const/4 p1, 0x0")
|
||||
} ?: throw ShowMusicVideoAdsParentFingerprint.exception
|
||||
showVideoAdsMethod.addInstruction(0, "const/4 p1, 0x0")
|
||||
} ?: throw ShowVideoAdsParentFingerprint.exception
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated("This patch class has been renamed to HideMusicVideoAds.")
|
||||
@Deprecated("This patch class has been renamed to HideVideoAds.")
|
||||
object HideMusicVideoAds : BytecodePatch(
|
||||
dependencies = setOf(HideVideoAds::class)
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated("This patch class has been renamed to HideVideoAds.")
|
||||
object MusicVideoAdsPatch : BytecodePatch(
|
||||
dependencies = setOf(HideMusicVideoAds::class),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.music.ad.video.fingerprints
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object ShowMusicVideoAdsParentFingerprint : MethodFingerprint(
|
||||
internal object ShowVideoAdsParentFingerprint : MethodFingerprint(
|
||||
opcodes = listOf(
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
@@ -3,7 +3,9 @@ package app.revanced.patches.music.misc.gms
|
||||
import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME
|
||||
import app.revanced.patches.music.misc.gms.Constants.REVANCED_MUSIC_PACKAGE_NAME
|
||||
import app.revanced.patches.music.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorGroupIdOption
|
||||
import app.revanced.patches.music.misc.gms.fingerprints.*
|
||||
import app.revanced.patches.music.misc.gms.fingerprints.CastDynamiteModuleV2Fingerprint
|
||||
import app.revanced.patches.music.misc.gms.fingerprints.MusicActivityOnCreateFingerprint
|
||||
import app.revanced.patches.music.misc.gms.fingerprints.PrimeMethodFingerprint
|
||||
import app.revanced.patches.music.misc.integrations.IntegrationsPatch
|
||||
import app.revanced.patches.shared.fingerprints.CastContextFetchFingerprint
|
||||
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch
|
||||
@@ -14,9 +16,6 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
||||
toPackageName = REVANCED_MUSIC_PACKAGE_NAME,
|
||||
primeMethodFingerprint = PrimeMethodFingerprint,
|
||||
earlyReturnFingerprints = setOf(
|
||||
ServiceCheckFingerprint,
|
||||
GooglePlayUtilityFingerprint,
|
||||
CastDynamiteModuleFingerprint,
|
||||
CastDynamiteModuleV2Fingerprint,
|
||||
CastContextFetchFingerprint,
|
||||
),
|
||||
@@ -32,13 +31,10 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
||||
"7.01.53",
|
||||
"7.02.52",
|
||||
"7.03.52",
|
||||
)
|
||||
)
|
||||
),
|
||||
),
|
||||
),
|
||||
fingerprints = setOf(
|
||||
ServiceCheckFingerprint,
|
||||
GooglePlayUtilityFingerprint,
|
||||
CastDynamiteModuleFingerprint,
|
||||
CastDynamiteModuleV2Fingerprint,
|
||||
CastContextFetchFingerprint,
|
||||
PrimeMethodFingerprint,
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
package app.revanced.patches.music.misc.gms.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal object GooglePlayUtilityFingerprint : MethodFingerprint(
|
||||
"I",
|
||||
AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
listOf("L", "I"),
|
||||
strings = listOf(
|
||||
"This should never happen.",
|
||||
"MetadataValueReader",
|
||||
"GooglePlayServicesUtil",
|
||||
"com.android.vending",
|
||||
"android.hardware.type.embedded"
|
||||
)
|
||||
)
|
||||
@@ -1,12 +0,0 @@
|
||||
package app.revanced.patches.music.misc.gms.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal object ServiceCheckFingerprint : MethodFingerprint(
|
||||
"V",
|
||||
AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
listOf("L", "I"),
|
||||
strings = listOf("Google Play Services not available"),
|
||||
)
|
||||
@@ -11,7 +11,7 @@ import app.revanced.util.exception
|
||||
|
||||
@Patch(
|
||||
name = "Spoof Android device ID",
|
||||
description = "Spoofs the Android device ID used by the app for account authentication." +
|
||||
description = "Spoofs the Android device ID used by the app for account authentication. " +
|
||||
"This can be used to copy the account to another device.",
|
||||
compatiblePackages = [
|
||||
CompatiblePackage(
|
||||
|
||||
@@ -15,5 +15,5 @@ abstract class BaseDisableAdsPatch(
|
||||
compatiblePackages = compatiblePackages,
|
||||
fingerprints = setOf(IsAdsEnabledFingerprint),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) = listOf(IsAdsEnabledFingerprint).returnEarly()
|
||||
override fun execute(context: BytecodeContext) = IsAdsEnabledFingerprint.returnEarly()
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package app.revanced.patches.reddit.customclients.boostforreddit.ads
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patches.reddit.customclients.boostforreddit.ads.fingerprints.*
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.util.resultOrThrow
|
||||
|
||||
@Patch(
|
||||
name = "Disable ads",
|
||||
compatiblePackages = [CompatiblePackage("com.rubenmayayo.reddit")],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object DisableAdsPatch : BytecodePatch(
|
||||
setOf(MaxMediationFingerprint, AdmobMediationFingerprint),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) =
|
||||
arrayOf(MaxMediationFingerprint, AdmobMediationFingerprint).forEach {
|
||||
it.resultOrThrow().mutableMethod.addInstructions(0, "return-void")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package app.revanced.patches.reddit.customclients.boostforreddit.ads.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
internal object AdmobMediationFingerprint : MethodFingerprint(
|
||||
strings = listOf("AdmobMediation: Attempting to initialize SDK")
|
||||
)
|
||||
@@ -0,0 +1,7 @@
|
||||
package app.revanced.patches.reddit.customclients.boostforreddit.ads.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
internal object MaxMediationFingerprint : MethodFingerprint(
|
||||
strings = listOf("MaxMediation: Attempting to initialize SDK")
|
||||
)
|
||||
@@ -22,5 +22,5 @@ object UnlockSubscriptionPatch : BytecodePatch(
|
||||
setOf(StartSubscriptionActivityFingerprint, BillingClientOnServiceConnected),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) =
|
||||
listOf(StartSubscriptionActivityFingerprint, BillingClientOnServiceConnected).returnEarly()
|
||||
setOf(StartSubscriptionActivityFingerprint, BillingClientOnServiceConnected).returnEarly()
|
||||
}
|
||||
|
||||
@@ -10,11 +10,13 @@ import app.revanced.patches.scbeasy.detection.debugging.fingerprints.DebuggingDe
|
||||
|
||||
@Patch(
|
||||
use = false,
|
||||
name = "Remove debugging detection",
|
||||
description = "Removes the USB and wireless debugging checks.",
|
||||
compatiblePackages = [CompatiblePackage("com.scb.phone")]
|
||||
)
|
||||
@Suppress("unused")
|
||||
@Deprecated("This patch no longer work and will be removed in the future " +
|
||||
"due to the complexity of the application.\n" +
|
||||
"See https://github.com/ReVanced/revanced-patches/issues/3517 for more details.")
|
||||
object RemoveDebuggingDetectionPatch : BytecodePatch(
|
||||
setOf(DebuggingDetectionFingerprint)
|
||||
) {
|
||||
|
||||
@@ -11,15 +11,20 @@ import app.revanced.patches.all.misc.packagename.ChangePackageNamePatch
|
||||
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.ACTIONS
|
||||
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.AUTHORITIES
|
||||
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.PERMISSIONS
|
||||
import app.revanced.patches.shared.misc.gms.fingerprints.CastDynamiteModuleFingerprint
|
||||
import app.revanced.patches.shared.misc.gms.fingerprints.GmsCoreSupportFingerprint
|
||||
import app.revanced.patches.shared.misc.gms.fingerprints.GmsCoreSupportFingerprint.GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME
|
||||
import app.revanced.patches.shared.misc.gms.fingerprints.GooglePlayUtilityFingerprint
|
||||
import app.revanced.patches.shared.misc.gms.fingerprints.ServiceCheckFingerprint
|
||||
import app.revanced.util.exception
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstruction
|
||||
import app.revanced.util.returnEarly
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction21c
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
import com.android.tools.smali.dexlib2.iface.reference.StringReference
|
||||
import com.android.tools.smali.dexlib2.immutable.reference.ImmutableStringReference
|
||||
import com.android.tools.smali.dexlib2.util.MethodUtil
|
||||
@@ -42,8 +47,8 @@ import com.android.tools.smali.dexlib2.util.MethodUtil
|
||||
abstract class BaseGmsCoreSupportPatch(
|
||||
private val fromPackageName: String,
|
||||
private val toPackageName: String,
|
||||
private val primeMethodFingerprint: MethodFingerprint,
|
||||
private val earlyReturnFingerprints: Set<MethodFingerprint>,
|
||||
private val primeMethodFingerprint: MethodFingerprint?,
|
||||
private val earlyReturnFingerprints: Set<MethodFingerprint> = setOf(),
|
||||
private val mainActivityOnCreateFingerprint: MethodFingerprint,
|
||||
private val integrationsPatchDependency: PatchClass,
|
||||
gmsCoreSupportResourcePatch: BaseGmsCoreSupportResourcePatch,
|
||||
@@ -62,6 +67,9 @@ abstract class BaseGmsCoreSupportPatch(
|
||||
compatiblePackages = compatiblePackages,
|
||||
fingerprints = setOf(
|
||||
GmsCoreSupportFingerprint,
|
||||
GooglePlayUtilityFingerprint,
|
||||
ServiceCheckFingerprint,
|
||||
CastDynamiteModuleFingerprint,
|
||||
mainActivityOnCreateFingerprint,
|
||||
) + fingerprints,
|
||||
requiresIntegrations = true,
|
||||
@@ -91,17 +99,36 @@ abstract class BaseGmsCoreSupportPatch(
|
||||
}
|
||||
|
||||
// Specific method that needs to be patched.
|
||||
transformPrimeMethod(packageName)
|
||||
primeMethodFingerprint?.let { transformPrimeMethod(packageName) }
|
||||
|
||||
// Return these methods early to prevent the app from crashing.
|
||||
earlyReturnFingerprints.toList().returnEarly()
|
||||
earlyReturnFingerprints.returnEarly()
|
||||
ServiceCheckFingerprint.returnEarly()
|
||||
// Not all apps have CastDynamiteModule, so we need to check if it's present.
|
||||
if (CastDynamiteModuleFingerprint.result != null) {
|
||||
CastDynamiteModuleFingerprint.returnEarly()
|
||||
}
|
||||
// Google Play Utility is not present in all apps, so we need to check if it's present.
|
||||
if (GooglePlayUtilityFingerprint.result != null) {
|
||||
GooglePlayUtilityFingerprint.returnEarly()
|
||||
}
|
||||
|
||||
// Verify GmsCore is installed and whitelisted for power optimizations and background usage.
|
||||
mainActivityOnCreateFingerprint.result?.mutableMethod?.addInstructions(
|
||||
0,
|
||||
"invoke-static/range { p0 .. p0 }, Lapp/revanced/integrations/shared/GmsCoreSupport;->" +
|
||||
"checkGmsCore(Landroid/app/Activity;)V",
|
||||
) ?: throw mainActivityOnCreateFingerprint.exception
|
||||
mainActivityOnCreateFingerprint.result?.mutableMethod?.apply {
|
||||
// Temporary fix for Google photos integration.
|
||||
var setContextIndex = indexOfFirstInstruction {
|
||||
val reference = getReference<MethodReference>() ?: return@indexOfFirstInstruction false
|
||||
|
||||
reference.toString() == "Lapp/revanced/integrations/shared/Utils;->setContext(Landroid/content/Context;)V"
|
||||
}
|
||||
|
||||
// Add after setContext call, because this patch needs the context.
|
||||
addInstructions(
|
||||
if (setContextIndex < 0) 0 else setContextIndex + 1,
|
||||
"invoke-static/range { p0 .. p0 }, Lapp/revanced/integrations/shared/GmsCoreSupport;->" +
|
||||
"checkGmsCore(Landroid/app/Activity;)V",
|
||||
)
|
||||
} ?: throw mainActivityOnCreateFingerprint.exception
|
||||
|
||||
// Change the vendor of GmsCore in ReVanced Integrations.
|
||||
GmsCoreSupportFingerprint.result?.mutableClass?.methods
|
||||
@@ -192,7 +219,7 @@ abstract class BaseGmsCoreSupportPatch(
|
||||
}
|
||||
|
||||
private fun transformPrimeMethod(packageName: String) {
|
||||
primeMethodFingerprint.result?.mutableMethod?.apply {
|
||||
primeMethodFingerprint!!.result?.mutableMethod?.apply {
|
||||
var register = 2
|
||||
|
||||
val index = getInstructions().indexOfFirst {
|
||||
@@ -305,6 +332,7 @@ abstract class BaseGmsCoreSupportPatch(
|
||||
"com.google.android.gms.languageprofile.service.START",
|
||||
"com.google.android.gms.clearcut.service.START",
|
||||
"com.google.android.gms.icing.LIGHTWEIGHT_INDEX_SERVICE",
|
||||
"com.google.android.gms.accountsettings.action.VIEW_SETTINGS",
|
||||
|
||||
// potoken
|
||||
"com.google.android.gms.potokens.service.START",
|
||||
|
||||
@@ -96,27 +96,23 @@ abstract class BaseGmsCoreSupportResourcePatch(
|
||||
private fun ResourceContext.patchManifest() {
|
||||
val packageName = ChangePackageNamePatch.setOrGetFallbackPackageName(toPackageName)
|
||||
|
||||
val manifest = this.get("AndroidManifest.xml").readText()
|
||||
this.get("AndroidManifest.xml").writeText(
|
||||
manifest.replace(
|
||||
"package=\"$fromPackageName",
|
||||
"package=\"$packageName",
|
||||
).replace(
|
||||
"android:authorities=\"$fromPackageName",
|
||||
"android:authorities=\"$packageName",
|
||||
).replace(
|
||||
"$fromPackageName.permission.C2D_MESSAGE",
|
||||
"$packageName.permission.C2D_MESSAGE",
|
||||
).replace(
|
||||
"$fromPackageName.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION",
|
||||
"$packageName.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION",
|
||||
).replace(
|
||||
"com.google.android.c2dm",
|
||||
"$gmsCoreVendorGroupId.android.c2dm",
|
||||
).replace(
|
||||
"</queries>",
|
||||
"<package android:name=\"$gmsCoreVendorGroupId.android.gms\"/></queries>",
|
||||
),
|
||||
val transformations = mapOf(
|
||||
"package=\"$fromPackageName" to "package=\"$packageName",
|
||||
"android:authorities=\"$fromPackageName" to "android:authorities=\"$packageName",
|
||||
"$fromPackageName.permission.C2D_MESSAGE" to "$packageName.permission.C2D_MESSAGE",
|
||||
"$fromPackageName.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" to "$packageName.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION",
|
||||
"com.google.android.c2dm" to "$gmsCoreVendorGroupId.android.c2dm",
|
||||
"com.google.android.libraries.photos.api.mars" to "$gmsCoreVendorGroupId.android.apps.photos.api.mars",
|
||||
"</queries>" to "<package android:name=\"$gmsCoreVendorGroupId.android.gms\"/></queries>",
|
||||
)
|
||||
|
||||
get("AndroidManifest.xml", false).writeText(
|
||||
transformations.entries.fold(get("AndroidManifest.xml", false).readText()) { acc, (from, to) ->
|
||||
acc.replace(
|
||||
from,
|
||||
to,
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.patches.music.misc.gms.fingerprints
|
||||
package app.revanced.patches.shared.misc.gms.fingerprints
|
||||
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.patches.youtube.misc.gms.fingerprints
|
||||
package app.revanced.patches.shared.misc.gms.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
@@ -8,5 +8,5 @@ internal object GooglePlayUtilityFingerprint : MethodFingerprint(
|
||||
returnType = "I",
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
parameters = listOf("L", "I"),
|
||||
strings = listOf("This should never happen.", "MetadataValueReader", "com.google.android.gms")
|
||||
)
|
||||
strings = listOf("This should never happen.", "MetadataValueReader", "com.google.android.gms"),
|
||||
)
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.patches.youtube.misc.gms.fingerprints
|
||||
package app.revanced.patches.shared.misc.gms.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
@@ -8,5 +8,5 @@ internal object ServiceCheckFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
parameters = listOf("L", "I"),
|
||||
strings = listOf("Google Play Services not available", "GooglePlayServices not available due to error ")
|
||||
)
|
||||
strings = listOf("Google Play Services not available")
|
||||
)
|
||||
@@ -10,7 +10,7 @@ import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.smali.ExternalLabel
|
||||
import app.revanced.patches.soundcloud.ad.fingerprints.InterceptFingerprint
|
||||
import app.revanced.patches.soundcloud.ad.fingerprints.FeatureConstructorFingerprint
|
||||
import app.revanced.patches.soundcloud.shared.fingerprints.FeatureConstructorFingerprint
|
||||
import app.revanced.patches.soundcloud.ad.fingerprints.UserConsumerPlanConstructorFingerprint
|
||||
import app.revanced.util.resultOrThrow
|
||||
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
package app.revanced.patches.soundcloud.offlinesync
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.smali.ExternalLabel
|
||||
import app.revanced.patches.soundcloud.offlinesync.fingerprints.DownloadOperationsHeaderVerificationFingerprint
|
||||
import app.revanced.patches.soundcloud.offlinesync.fingerprints.DownloadOperationsURLBuilderFingerprint
|
||||
import app.revanced.patches.soundcloud.shared.fingerprints.FeatureConstructorFingerprint
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.resultOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
|
||||
@Patch(
|
||||
name = "Enable offline sync",
|
||||
compatiblePackages = [CompatiblePackage("com.soundcloud.android")],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object EnableOfflineSyncPatch : BytecodePatch(
|
||||
setOf(
|
||||
FeatureConstructorFingerprint, DownloadOperationsURLBuilderFingerprint,
|
||||
DownloadOperationsHeaderVerificationFingerprint
|
||||
),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
// Enable the feature to allow offline track syncing by modifying the JSON server response.
|
||||
// This method is the constructor of a class representing a "Feature" object parsed from JSON data.
|
||||
// p1 is the name of the feature.
|
||||
// p2 is true if the feature is enabled, false otherwise.
|
||||
FeatureConstructorFingerprint.resultOrThrow().mutableMethod.apply {
|
||||
val afterCheckNotNullIndex = 2
|
||||
|
||||
addInstructionsWithLabels(
|
||||
afterCheckNotNullIndex,
|
||||
"""
|
||||
const-string v0, "offline_sync"
|
||||
invoke-virtual { p1, v0 }, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
|
||||
move-result v0
|
||||
if-eqz v0, :skip
|
||||
const/4 p2, 0x1
|
||||
""",
|
||||
ExternalLabel("skip", getInstruction(afterCheckNotNullIndex)),
|
||||
)
|
||||
}
|
||||
|
||||
// Patch the URL builder to use the HTTPS_STREAM endpoint
|
||||
// instead of the offline sync endpoint to downloading the track.
|
||||
DownloadOperationsURLBuilderFingerprint.resultOrThrow().mutableMethod.apply {
|
||||
val getEndpointsEnumFieldIndex = 1
|
||||
val getEndpointsEnumFieldInstruction = getInstruction<OneRegisterInstruction>(getEndpointsEnumFieldIndex)
|
||||
|
||||
val targetRegister = getEndpointsEnumFieldInstruction.registerA
|
||||
val endpointsType = getEndpointsEnumFieldInstruction.getReference<FieldReference>()!!.type
|
||||
|
||||
replaceInstruction(
|
||||
getEndpointsEnumFieldIndex,
|
||||
"sget-object v$targetRegister, $endpointsType->HTTPS_STREAM:$endpointsType"
|
||||
)
|
||||
}
|
||||
|
||||
// The HTTPS_STREAM endpoint does not return the necessary headers for offline sync.
|
||||
// Mock the headers to prevent the app from crashing by setting them to empty strings.
|
||||
// The headers are all cosmetic and do not affect the functionality of the app.
|
||||
DownloadOperationsHeaderVerificationFingerprint.resultOrThrow().mutableMethod.apply {
|
||||
// The first three null checks need to be patched.
|
||||
getInstructions().asSequence().filter {
|
||||
it.opcode == Opcode.IF_EQZ
|
||||
}.take(3).toList().map { it.location.index }.asReversed().forEach { nullCheckIndex ->
|
||||
val headerStringRegister = getInstruction<OneRegisterInstruction>(nullCheckIndex).registerA
|
||||
|
||||
addInstruction(nullCheckIndex, "const-string v$headerStringRegister, \"\"")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package app.revanced.patches.soundcloud.offlinesync.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object DownloadOperationsHeaderVerificationFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf("L","L"),
|
||||
opcodes = listOf(
|
||||
Opcode.CONST_STRING,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.CONST_STRING
|
||||
),
|
||||
customFingerprint = { _, classDef ->
|
||||
classDef.sourceFile == "DownloadOperations.kt"
|
||||
}
|
||||
)
|
||||
@@ -0,0 +1,20 @@
|
||||
package app.revanced.patches.soundcloud.offlinesync.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object DownloadOperationsURLBuilderFingerprint : MethodFingerprint(
|
||||
returnType = "Ljava/lang/String",
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf("L","L"),
|
||||
opcodes = listOf(
|
||||
Opcode.IGET_OBJECT,
|
||||
Opcode.SGET_OBJECT,
|
||||
Opcode.FILLED_NEW_ARRAY
|
||||
),
|
||||
customFingerprint = { _, classDef ->
|
||||
classDef.sourceFile == "DownloadOperations.kt"
|
||||
}
|
||||
)
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.patches.soundcloud.ad.fingerprints
|
||||
package app.revanced.patches.soundcloud.shared.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
@@ -0,0 +1,37 @@
|
||||
package app.revanced.patches.swissid.integritycheck
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.swissid.integritycheck.fingerprints.CheckIntegrityFingerprint
|
||||
import app.revanced.util.resultOrThrow
|
||||
|
||||
@Patch(
|
||||
name = "Remove Google Play Integrity check",
|
||||
description = "Removes the Google Play Integrity check. With this it's possible to use SwissID on custom ROMS." +
|
||||
"If the device is rooted, root permissions must be hidden from the app.",
|
||||
compatiblePackages = [CompatiblePackage("com.swisssign.swissid.mobile")],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object RemoveGooglePlayIntegrityCheck : BytecodePatch(
|
||||
setOf(CheckIntegrityFingerprint),
|
||||
) {
|
||||
private const val RESULT_METHOD_REFERENCE = " Lcom/swisssign/deviceintegrity/" +
|
||||
"DeviceintegrityPlugin\$onMethodCall\$1;->\$result:" +
|
||||
"Lio/flutter/plugin/common/MethodChannel\$Result;"
|
||||
private const val SUCCESS_METHOD_REFERENCE =
|
||||
"Lio/flutter/plugin/common/MethodChannel\$Result;->success(Ljava/lang/Object;)V"
|
||||
|
||||
override fun execute(context: BytecodeContext) =
|
||||
CheckIntegrityFingerprint.resultOrThrow().mutableMethod.addInstructions(
|
||||
0,
|
||||
"""
|
||||
iget-object p1, p0, $RESULT_METHOD_REFERENCE
|
||||
const-string v0, "VALID"
|
||||
invoke-interface {p1, v0}, $SUCCESS_METHOD_REFERENCE
|
||||
return-void
|
||||
""",
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package app.revanced.patches.swissid.integritycheck.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object CheckIntegrityFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
parameters = listOf("Lcom/swisssign/deviceintegrity/model/DeviceIntegrityResult;"),
|
||||
strings = listOf("it", "result")
|
||||
)
|
||||
@@ -97,6 +97,7 @@ object HideLayoutComponentsPatch : BytecodePatch(
|
||||
SwitchPreference("revanced_hide_attributes_section"),
|
||||
SwitchPreference("revanced_hide_chapters_section"),
|
||||
SwitchPreference("revanced_hide_info_cards_section"),
|
||||
SwitchPreference("revanced_hide_key_concepts_section"),
|
||||
SwitchPreference("revanced_hide_podcast_section"),
|
||||
SwitchPreference("revanced_hide_transcript_section"),
|
||||
),
|
||||
|
||||
@@ -1,36 +1,18 @@
|
||||
package app.revanced.patches.youtube.layout.thumbnails
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
||||
import app.revanced.patches.shared.misc.settings.preference.ListPreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.TextPreference
|
||||
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.MessageDigestImageUrlFingerprint
|
||||
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.MessageDigestImageUrlParentFingerprint
|
||||
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.RequestFingerprint
|
||||
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback.OnFailureFingerprint
|
||||
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback.OnResponseStartedFingerprint
|
||||
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback.OnSucceededFingerprint
|
||||
import app.revanced.patches.youtube.misc.imageurlhook.CronetImageUrlHook
|
||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||
import app.revanced.patches.youtube.misc.navigation.NavigationBarHookPatch
|
||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||
import app.revanced.util.resultOrThrow
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
||||
|
||||
@Patch(
|
||||
name = "Alternative thumbnails",
|
||||
@@ -39,7 +21,8 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
||||
IntegrationsPatch::class,
|
||||
SettingsPatch::class,
|
||||
AddResourcesPatch::class,
|
||||
NavigationBarHookPatch::class
|
||||
NavigationBarHookPatch::class,
|
||||
CronetImageUrlHook::class
|
||||
],
|
||||
compatiblePackages = [
|
||||
CompatiblePackage(
|
||||
@@ -74,65 +57,10 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
||||
],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object AlternativeThumbnailsPatch : BytecodePatch(
|
||||
setOf(
|
||||
MessageDigestImageUrlParentFingerprint,
|
||||
OnResponseStartedFingerprint,
|
||||
RequestFingerprint,
|
||||
),
|
||||
) {
|
||||
object AlternativeThumbnailsPatch : BytecodePatch(emptySet()) {
|
||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/integrations/youtube/patches/AlternativeThumbnailsPatch;"
|
||||
|
||||
private lateinit var loadImageUrlMethod: MutableMethod
|
||||
private var loadImageUrlIndex = 0
|
||||
|
||||
private lateinit var loadImageSuccessCallbackMethod: MutableMethod
|
||||
private var loadImageSuccessCallbackIndex = 0
|
||||
|
||||
private lateinit var loadImageErrorCallbackMethod: MutableMethod
|
||||
private var loadImageErrorCallbackIndex = 0
|
||||
|
||||
/**
|
||||
* @param highPriority If the hook should be called before all other hooks.
|
||||
*/
|
||||
@Suppress("SameParameterValue")
|
||||
private fun addImageUrlHook(targetMethodClass: String, highPriority: Boolean) {
|
||||
loadImageUrlMethod.addInstructions(
|
||||
if (highPriority) 0 else loadImageUrlIndex,
|
||||
"""
|
||||
invoke-static { p1 }, $targetMethodClass->overrideImageURL(Ljava/lang/String;)Ljava/lang/String;
|
||||
move-result-object p1
|
||||
""",
|
||||
)
|
||||
loadImageUrlIndex += 2
|
||||
}
|
||||
|
||||
/**
|
||||
* If a connection completed, which includes normal 200 responses but also includes
|
||||
* status 404 and other error like http responses.
|
||||
*/
|
||||
@Suppress("SameParameterValue")
|
||||
private fun addImageUrlSuccessCallbackHook(targetMethodClass: String) {
|
||||
loadImageSuccessCallbackMethod.addInstruction(
|
||||
loadImageSuccessCallbackIndex++,
|
||||
"invoke-static { p1, p2 }, $targetMethodClass->handleCronetSuccess(" +
|
||||
"Lorg/chromium/net/UrlRequest;Lorg/chromium/net/UrlResponseInfo;)V",
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* If a connection outright failed to complete any connection.
|
||||
*/
|
||||
@Suppress("SameParameterValue")
|
||||
private fun addImageUrlErrorCallbackHook(targetMethodClass: String) {
|
||||
loadImageErrorCallbackMethod.addInstruction(
|
||||
loadImageErrorCallbackIndex++,
|
||||
"invoke-static { p1, p2, p3 }, $targetMethodClass->handleCronetFailure(" +
|
||||
"Lorg/chromium/net/UrlRequest;Lorg/chromium/net/UrlResponseInfo;Ljava/io/IOException;)V",
|
||||
)
|
||||
}
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
AddResourcesPatch(this::class)
|
||||
|
||||
@@ -177,62 +105,8 @@ object AlternativeThumbnailsPatch : BytecodePatch(
|
||||
ListPreference("revanced_alt_thumbnail_stills_time", summaryKey = null)
|
||||
)
|
||||
|
||||
fun MethodFingerprint.alsoResolve(fingerprint: MethodFingerprint) =
|
||||
also { resolve(context, fingerprint.resultOrThrow().classDef) }.resultOrThrow()
|
||||
|
||||
fun MethodFingerprint.resolveAndLetMutableMethod(
|
||||
fingerprint: MethodFingerprint,
|
||||
block: (MutableMethod) -> Unit,
|
||||
) = alsoResolve(fingerprint).also { block(it.mutableMethod) }
|
||||
|
||||
MessageDigestImageUrlFingerprint.resolveAndLetMutableMethod(MessageDigestImageUrlParentFingerprint) {
|
||||
loadImageUrlMethod = it
|
||||
addImageUrlHook(INTEGRATIONS_CLASS_DESCRIPTOR, true)
|
||||
}
|
||||
|
||||
OnSucceededFingerprint.resolveAndLetMutableMethod(OnResponseStartedFingerprint) {
|
||||
loadImageSuccessCallbackMethod = it
|
||||
addImageUrlSuccessCallbackHook(INTEGRATIONS_CLASS_DESCRIPTOR)
|
||||
}
|
||||
|
||||
OnFailureFingerprint.resolveAndLetMutableMethod(OnResponseStartedFingerprint) {
|
||||
loadImageErrorCallbackMethod = it
|
||||
addImageUrlErrorCallbackHook(INTEGRATIONS_CLASS_DESCRIPTOR)
|
||||
}
|
||||
|
||||
// The URL is required for the failure callback hook, but the URL field is obfuscated.
|
||||
// Add a helper get method that returns the URL field.
|
||||
RequestFingerprint.resultOrThrow().apply {
|
||||
// The url is the only string field that is set inside the constructor.
|
||||
val urlFieldInstruction = mutableMethod.getInstructions().first {
|
||||
if (it.opcode != Opcode.IPUT_OBJECT) return@first false
|
||||
|
||||
val reference = (it as ReferenceInstruction).reference as FieldReference
|
||||
reference.type == "Ljava/lang/String;"
|
||||
} as ReferenceInstruction
|
||||
|
||||
val urlFieldName = (urlFieldInstruction.reference as FieldReference).name
|
||||
val definingClass = RequestFingerprint.IMPLEMENTATION_CLASS_NAME
|
||||
val addedMethodName = "getHookedUrl"
|
||||
mutableClass.methods.add(
|
||||
ImmutableMethod(
|
||||
definingClass,
|
||||
addedMethodName,
|
||||
emptyList(),
|
||||
"Ljava/lang/String;",
|
||||
AccessFlags.PUBLIC.value,
|
||||
null,
|
||||
null,
|
||||
MutableMethodImplementation(2),
|
||||
).toMutable().apply {
|
||||
addInstructions(
|
||||
"""
|
||||
iget-object v0, p0, $definingClass->$urlFieldName:Ljava/lang/String;
|
||||
return-object v0
|
||||
""",
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
CronetImageUrlHook.addImageUrlHook(INTEGRATIONS_CLASS_DESCRIPTOR)
|
||||
CronetImageUrlHook.addImageUrlSuccessCallbackHook(INTEGRATIONS_CLASS_DESCRIPTOR)
|
||||
CronetImageUrlHook.addImageUrlErrorCallbackHook(INTEGRATIONS_CLASS_DESCRIPTOR)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
package app.revanced.patches.youtube.layout.thumbnails
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.patches.youtube.misc.imageurlhook.CronetImageUrlHook
|
||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||
|
||||
@Patch(
|
||||
name = "Bypass image region restrictions",
|
||||
description = "Adds an option to use a different host for user avatar and channel images " +
|
||||
"and can fix missing images that are blocked in some countries.",
|
||||
dependencies = [
|
||||
IntegrationsPatch::class,
|
||||
SettingsPatch::class,
|
||||
AddResourcesPatch::class,
|
||||
CronetImageUrlHook::class
|
||||
],
|
||||
compatiblePackages = [
|
||||
CompatiblePackage(
|
||||
"com.google.android.youtube",
|
||||
[
|
||||
"18.32.39",
|
||||
"18.37.36",
|
||||
"18.38.44",
|
||||
"18.43.45",
|
||||
"18.44.41",
|
||||
"18.45.43",
|
||||
"18.48.39",
|
||||
"18.49.37",
|
||||
"19.01.34",
|
||||
"19.02.39",
|
||||
"19.03.36",
|
||||
"19.04.38",
|
||||
"19.05.36",
|
||||
"19.06.39",
|
||||
"19.07.40",
|
||||
"19.08.36",
|
||||
"19.09.38",
|
||||
"19.10.39",
|
||||
"19.11.43",
|
||||
"19.12.41",
|
||||
"19.13.37",
|
||||
"19.14.43",
|
||||
"19.15.36",
|
||||
"19.16.39",
|
||||
]
|
||||
)
|
||||
]
|
||||
)
|
||||
@Suppress("unused")
|
||||
object BypassImageRegionRestrictions : BytecodePatch(emptySet()) {
|
||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/integrations/youtube/patches/BypassImageRegionRestrictionsPatch;"
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
AddResourcesPatch(this::class)
|
||||
|
||||
SettingsPatch.PreferenceScreen.MISC.addPreferences(
|
||||
SwitchPreference("revanced_bypass_image_region_restrictions")
|
||||
)
|
||||
|
||||
// A priority hook is not needed, as the image urls of interest are not modified
|
||||
// by AlternativeThumbnails or any other patch in this repo.
|
||||
CronetImageUrlHook.addImageUrlHook(INTEGRATIONS_CLASS_DESCRIPTOR)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package app.revanced.patches.youtube.misc.dns
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||
import app.revanced.patches.youtube.shared.fingerprints.MainActivityOnCreateFingerprint
|
||||
import app.revanced.util.resultOrThrow
|
||||
|
||||
@Patch(
|
||||
name = "Check watch history domain name resolution",
|
||||
description = "Checks if the device DNS server is preventing user watch history from being saved.",
|
||||
dependencies = [IntegrationsPatch::class],
|
||||
compatiblePackages = [
|
||||
CompatiblePackage(
|
||||
"com.google.android.youtube",
|
||||
[
|
||||
"18.32.39",
|
||||
"18.37.36",
|
||||
"18.38.44",
|
||||
"18.43.45",
|
||||
"18.44.41",
|
||||
"18.45.43",
|
||||
"18.48.39",
|
||||
"18.49.37",
|
||||
"19.01.34",
|
||||
"19.02.39",
|
||||
"19.03.36",
|
||||
"19.04.38",
|
||||
"19.05.36",
|
||||
"19.06.39",
|
||||
"19.07.40",
|
||||
"19.08.36",
|
||||
"19.09.38",
|
||||
"19.10.39",
|
||||
"19.11.43",
|
||||
"19.12.41",
|
||||
"19.13.37",
|
||||
"19.14.43",
|
||||
"19.15.36",
|
||||
"19.16.39",
|
||||
],
|
||||
),
|
||||
],
|
||||
)
|
||||
@Suppress("unused")
|
||||
internal object CheckWatchHistoryDomainNameResolutionPatch : BytecodePatch(
|
||||
setOf(MainActivityOnCreateFingerprint),
|
||||
) {
|
||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/integrations/youtube/patches/CheckWatchHistoryDomainNameResolutionPatch;"
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
AddResourcesPatch(this::class)
|
||||
|
||||
MainActivityOnCreateFingerprint.resultOrThrow().mutableMethod.addInstructions(
|
||||
// FIXME: Insert index must be greater than the insert index used by GmsCoreSupport,
|
||||
// as both patch the same method and GmsCoreSupport check should be first,
|
||||
// but the patch does not depend on GmsCoreSupport, so it should not be possible to enforce this
|
||||
// unless a third patch is added that this patch and GmsCoreSupport depend on to manage
|
||||
// the order of the patches.
|
||||
1,
|
||||
"invoke-static/range { p0 .. p0 }, $INTEGRATIONS_CLASS_DESCRIPTOR->checkDnsResolver(Landroid/app/Activity;)V",
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.PatchException
|
||||
@@ -13,9 +14,13 @@ import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
||||
import app.revanced.patches.shared.misc.settings.preference.ListPreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.patches.youtube.misc.backgroundplayback.BackgroundPlaybackPatch
|
||||
import app.revanced.patches.youtube.misc.fix.playback.fingerprints.*
|
||||
import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch
|
||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
@@ -37,16 +42,21 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
|
||||
SettingsPatch::class,
|
||||
AddResourcesPatch::class,
|
||||
UserAgentClientSpoofPatch::class,
|
||||
// Required since iOS livestream fix partially enables background playback.
|
||||
BackgroundPlaybackPatch::class,
|
||||
PlayerTypeHookPatch::class,
|
||||
],
|
||||
compatiblePackages = [
|
||||
CompatiblePackage(
|
||||
"com.google.android.youtube",
|
||||
[
|
||||
"18.37.36",
|
||||
"18.38.44",
|
||||
"18.43.45",
|
||||
"18.44.41",
|
||||
"18.45.43",
|
||||
// This patch works with these versions,
|
||||
// but the dependent background playback patch does not.
|
||||
// "18.37.36",
|
||||
// "18.38.44",
|
||||
// "18.43.45",
|
||||
// "18.44.41",
|
||||
// "18.45.43",
|
||||
"18.48.39",
|
||||
"18.49.37",
|
||||
"19.01.34",
|
||||
@@ -77,18 +87,29 @@ object SpoofClientPatch : BytecodePatch(
|
||||
SetPlayerRequestClientTypeFingerprint,
|
||||
CreatePlayerRequestBodyFingerprint,
|
||||
CreatePlayerRequestBodyWithModelFingerprint,
|
||||
CreatePlayerRequestBodyWithVersionReleaseFingerprint,
|
||||
|
||||
// Player gesture config.
|
||||
PlayerGestureConfigSyntheticFingerprint,
|
||||
|
||||
// Player speed menu item.
|
||||
CreatePlaybackSpeedMenuItemFingerprint,
|
||||
),
|
||||
|
||||
// Video qualities missing.
|
||||
BuildRequestFingerprint,
|
||||
|
||||
// Livestream audio only background playback.
|
||||
PlayerResponseModelBackgroundAudioPlaybackFingerprint,
|
||||
)
|
||||
) {
|
||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/integrations/youtube/patches/spoof/SpoofClientPatch;"
|
||||
private const val CLIENT_INFO_CLASS_DESCRIPTOR =
|
||||
"Lcom/google/protos/youtube/api/innertube/InnertubeContext\$ClientInfo;"
|
||||
private const val REQUEST_CLASS_DESCRIPTOR =
|
||||
"Lorg/chromium/net/ExperimentalUrlRequest;"
|
||||
private const val REQUEST_BUILDER_CLASS_DESCRIPTOR =
|
||||
"Lorg/chromium/net/ExperimentalUrlRequest\$Builder;"
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
AddResourcesPatch(this::class)
|
||||
@@ -99,9 +120,16 @@ object SpoofClientPatch : BytecodePatch(
|
||||
sorting = PreferenceScreen.Sorting.UNSORTED,
|
||||
preferences = setOf(
|
||||
SwitchPreference("revanced_spoof_client"),
|
||||
SwitchPreference("revanced_spoof_client_use_ios"),
|
||||
),
|
||||
),
|
||||
ListPreference("revanced_spoof_client_type",
|
||||
summaryKey = null,
|
||||
entriesKey = "revanced_spoof_client_type_entries",
|
||||
entryValuesKey = "revanced_spoof_client_type_entry_values"
|
||||
),
|
||||
SwitchPreference("revanced_spoof_client_ios_force_avc"),
|
||||
NonInteractivePreference("revanced_spoof_client_about_android_ios"),
|
||||
NonInteractivePreference("revanced_spoof_client_about_android_vr")
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
// region Block /initplayback requests to fall back to /get_watch requests.
|
||||
@@ -153,7 +181,7 @@ object SpoofClientPatch : BytecodePatch(
|
||||
.getInstructions().find { instruction ->
|
||||
// requestMessage.clientInfo = clientInfoBuilder.build();
|
||||
instruction.opcode == Opcode.IPUT_OBJECT &&
|
||||
instruction.getReference<FieldReference>()?.type == CLIENT_INFO_CLASS_DESCRIPTOR
|
||||
instruction.getReference<FieldReference>()?.type == CLIENT_INFO_CLASS_DESCRIPTOR
|
||||
}?.getReference<FieldReference>() ?: throw PatchException("Could not find clientInfoField")
|
||||
|
||||
// Client info object's client type field.
|
||||
@@ -164,13 +192,15 @@ object SpoofClientPatch : BytecodePatch(
|
||||
// Client info object's client version field.
|
||||
val clientInfoClientVersionField = result.mutableMethod
|
||||
.getInstruction(result.scanResult.stringsScanResult!!.matches.first().index + 1)
|
||||
.getReference<FieldReference>() ?: throw PatchException("Could not find clientInfoClientVersionField")
|
||||
.getReference<FieldReference>()
|
||||
?: throw PatchException("Could not find clientInfoClientVersionField")
|
||||
|
||||
Triple(clientInfoField, clientInfoClientTypeField, clientInfoClientVersionField)
|
||||
}
|
||||
|
||||
val clientInfoClientModelField = CreatePlayerRequestBodyWithModelFingerprint.resultOrThrow().let {
|
||||
val getClientModelIndex = CreatePlayerRequestBodyWithModelFingerprint.indexOfBuildModelInstruction(it.method)
|
||||
val getClientModelIndex =
|
||||
CreatePlayerRequestBodyWithModelFingerprint.indexOfBuildModelInstruction(it.method)
|
||||
|
||||
// The next IPUT_OBJECT instruction after getting the client model is setting the client model field.
|
||||
val index = it.mutableMethod.indexOfFirstInstructionOrThrow(getClientModelIndex) {
|
||||
@@ -181,6 +211,19 @@ object SpoofClientPatch : BytecodePatch(
|
||||
?: throw PatchException("Could not find clientInfoClientModelField")
|
||||
}
|
||||
|
||||
val clientInfoOsVersionField = CreatePlayerRequestBodyWithVersionReleaseFingerprint.resultOrThrow().let {
|
||||
val getOsVersionIndex =
|
||||
CreatePlayerRequestBodyWithVersionReleaseFingerprint.indexOfBuildVersionReleaseInstruction(it.method)
|
||||
|
||||
// The next IPUT_OBJECT instruction after getting the client os version is setting the client os version field.
|
||||
val index = it.mutableMethod.indexOfFirstInstructionOrThrow(getOsVersionIndex) {
|
||||
opcode == Opcode.IPUT_OBJECT
|
||||
}
|
||||
|
||||
it.mutableMethod.getInstruction(index).getReference<FieldReference>()
|
||||
?: throw PatchException("Could not find clientInfoOsVersionField")
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
// region Spoof client type for /player requests.
|
||||
@@ -198,7 +241,7 @@ object SpoofClientPatch : BytecodePatch(
|
||||
addInstruction(
|
||||
checkCastIndex + 1,
|
||||
"invoke-static { v$requestMessageInstanceRegister }," +
|
||||
" ${result.classDef.type}->$setClientInfoMethodName($clientInfoContainerClassName)V",
|
||||
" ${result.classDef.type}->$setClientInfoMethodName($clientInfoContainerClassName)V",
|
||||
)
|
||||
}
|
||||
|
||||
@@ -240,6 +283,12 @@ object SpoofClientPatch : BytecodePatch(
|
||||
invoke-static { v1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->getClientVersion(Ljava/lang/String;)Ljava/lang/String;
|
||||
move-result-object v1
|
||||
iput-object v1, v0, $clientInfoClientVersionField
|
||||
|
||||
# Set client os version to the spoofed value.
|
||||
iget-object v1, v0, $clientInfoOsVersionField
|
||||
invoke-static { v1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->getOsVersion(Ljava/lang/String;)Ljava/lang/String;
|
||||
move-result-object v1
|
||||
iput-object v1, v0, $clientInfoOsVersionField
|
||||
|
||||
:disabled
|
||||
return-void
|
||||
@@ -283,6 +332,23 @@ object SpoofClientPatch : BytecodePatch(
|
||||
|
||||
// endregion
|
||||
|
||||
// region Fix livestream audio only background play if spoofing to iOS.
|
||||
// This force enables audio background playback.
|
||||
|
||||
PlayerResponseModelBackgroundAudioPlaybackFingerprint.resultOrThrow().mutableMethod.addInstructions(
|
||||
0,
|
||||
"""
|
||||
invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->overrideBackgroundAudioPlayback()Z
|
||||
move-result v0
|
||||
if-eqz v0, :do_not_override
|
||||
return v0
|
||||
:do_not_override
|
||||
nop
|
||||
"""
|
||||
)
|
||||
|
||||
// endregion
|
||||
|
||||
// Fix playback speed menu item if spoofing to iOS.
|
||||
|
||||
CreatePlaybackSpeedMenuItemFingerprint.resultOrThrow().let {
|
||||
@@ -291,7 +357,8 @@ object SpoofClientPatch : BytecodePatch(
|
||||
|
||||
it.mutableMethod.apply {
|
||||
// Find the conditional check if the playback speed menu item is not created.
|
||||
val shouldCreateMenuIndex = indexOfFirstInstructionOrThrow(scanResult.endIndex) { opcode == Opcode.IF_EQZ }
|
||||
val shouldCreateMenuIndex =
|
||||
indexOfFirstInstructionOrThrow(scanResult.endIndex) { opcode == Opcode.IF_EQZ }
|
||||
val shouldCreateMenuRegister = getInstruction<OneRegisterInstruction>(shouldCreateMenuIndex).registerA
|
||||
|
||||
addInstructions(
|
||||
@@ -305,5 +372,28 @@ object SpoofClientPatch : BytecodePatch(
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
// region Fix video qualities missing, if spoofing to iOS by overriding the user agent.
|
||||
|
||||
BuildRequestFingerprint.resultOrThrow().let { result ->
|
||||
result.mutableMethod.apply {
|
||||
val buildRequestIndex = getInstructions().lastIndex - 2
|
||||
val requestBuilderRegister = getInstruction<FiveRegisterInstruction>(buildRequestIndex).registerC
|
||||
|
||||
val newRequestBuilderIndex = result.scanResult.patternScanResult!!.endIndex
|
||||
val urlRegister = getInstruction<FiveRegisterInstruction>(newRequestBuilderIndex).registerD
|
||||
|
||||
// Replace "requestBuilder.build(): Request" with "overrideUserAgent(requestBuilder, url): Request".
|
||||
replaceInstruction(
|
||||
buildRequestIndex,
|
||||
"invoke-static { v$requestBuilderRegister, v$urlRegister }, " +
|
||||
"$INTEGRATIONS_CLASS_DESCRIPTOR->" +
|
||||
"overrideUserAgent(${REQUEST_BUILDER_CLASS_DESCRIPTOR}Ljava/lang/String;)" +
|
||||
REQUEST_CLASS_DESCRIPTOR
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package app.revanced.patches.youtube.misc.fix.playback.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object BuildRequestFingerprint : MethodFingerprint(
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
returnType = "Lorg/chromium/net/UrlRequest;",
|
||||
opcodes = listOf(
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.INVOKE_VIRTUAL
|
||||
)
|
||||
)
|
||||
@@ -0,0 +1,31 @@
|
||||
package app.revanced.patches.youtube.misc.fix.playback.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import app.revanced.patches.youtube.misc.fix.playback.fingerprints.CreatePlayerRequestBodyWithVersionReleaseFingerprint.indexOfBuildVersionReleaseInstruction
|
||||
import app.revanced.util.containsWideLiteralInstructionValue
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstruction
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.iface.Method
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
|
||||
internal object CreatePlayerRequestBodyWithVersionReleaseFingerprint : MethodFingerprint(
|
||||
returnType = "L",
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf(),
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.containsWideLiteralInstructionValue(1073741824) &&
|
||||
indexOfBuildVersionReleaseInstruction(methodDef) >= 0
|
||||
},
|
||||
) {
|
||||
fun indexOfBuildVersionReleaseInstruction(methodDef: Method) =
|
||||
methodDef.indexOfFirstInstruction {
|
||||
val reference = getReference<FieldReference>()
|
||||
reference?.definingClass == "Landroid/os/Build\$VERSION;" &&
|
||||
reference.name == "RELEASE" &&
|
||||
reference.type == "Ljava/lang/String;"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
package app.revanced.patches.youtube.misc.fix.playback.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object PlayerResponseModelBackgroundAudioPlaybackFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
parameters = listOf("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;"),
|
||||
opcodes = listOf(
|
||||
Opcode.CONST_4,
|
||||
Opcode.IF_EQZ,
|
||||
Opcode.INVOKE_INTERFACE,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT,
|
||||
Opcode.IF_NEZ,
|
||||
Opcode.GOTO,
|
||||
Opcode.RETURN,
|
||||
null, // Opcode.CONST_4 or Opcode.MOVE
|
||||
Opcode.RETURN,
|
||||
)
|
||||
)
|
||||
@@ -7,7 +7,8 @@ import app.revanced.patches.youtube.misc.fix.playback.SpoofClientPatch
|
||||
import app.revanced.patches.youtube.misc.gms.Constants.REVANCED_YOUTUBE_PACKAGE_NAME
|
||||
import app.revanced.patches.youtube.misc.gms.Constants.YOUTUBE_PACKAGE_NAME
|
||||
import app.revanced.patches.youtube.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorGroupIdOption
|
||||
import app.revanced.patches.youtube.misc.gms.fingerprints.*
|
||||
import app.revanced.patches.youtube.misc.gms.fingerprints.CastDynamiteModuleV2Fingerprint
|
||||
import app.revanced.patches.youtube.misc.gms.fingerprints.PrimeMethodFingerprint
|
||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||
import app.revanced.patches.youtube.shared.fingerprints.MainActivityOnCreateFingerprint
|
||||
|
||||
@@ -17,9 +18,6 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
||||
toPackageName = REVANCED_YOUTUBE_PACKAGE_NAME,
|
||||
primeMethodFingerprint = PrimeMethodFingerprint,
|
||||
earlyReturnFingerprints = setOf(
|
||||
ServiceCheckFingerprint,
|
||||
GooglePlayUtilityFingerprint,
|
||||
CastDynamiteModuleFingerprint,
|
||||
CastDynamiteModuleV2Fingerprint,
|
||||
CastContextFetchFingerprint,
|
||||
),
|
||||
@@ -34,11 +32,12 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
||||
CompatiblePackage(
|
||||
"com.google.android.youtube",
|
||||
setOf(
|
||||
"18.37.36",
|
||||
"18.38.44",
|
||||
"18.43.45",
|
||||
"18.44.41",
|
||||
"18.45.43",
|
||||
// Patch supports these versions but ClientSpoof does not.
|
||||
// "18.37.36",
|
||||
// "18.38.44",
|
||||
// "18.43.45",
|
||||
// "18.44.41",
|
||||
// "18.45.43",
|
||||
"18.48.39",
|
||||
"18.49.37",
|
||||
"19.01.34",
|
||||
@@ -61,9 +60,6 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
||||
),
|
||||
),
|
||||
fingerprints = setOf(
|
||||
ServiceCheckFingerprint,
|
||||
GooglePlayUtilityFingerprint,
|
||||
CastDynamiteModuleFingerprint,
|
||||
CastDynamiteModuleV2Fingerprint,
|
||||
CastContextFetchFingerprint,
|
||||
PrimeMethodFingerprint,
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
package app.revanced.patches.youtube.misc.gms.fingerprints
|
||||
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
internal object CastDynamiteModuleFingerprint : MethodFingerprint(
|
||||
strings = listOf("com.google.android.gms.cast.framework.internal.CastDynamiteModuleImpl")
|
||||
)
|
||||
@@ -0,0 +1,132 @@
|
||||
package app.revanced.patches.youtube.misc.imageurlhook
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.MessageDigestImageUrlFingerprint
|
||||
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.MessageDigestImageUrlParentFingerprint
|
||||
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.RequestFingerprint
|
||||
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.request.callback.OnFailureFingerprint
|
||||
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.request.callback.OnResponseStartedFingerprint
|
||||
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.request.callback.OnSucceededFingerprint
|
||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||
import app.revanced.util.alsoResolve
|
||||
import app.revanced.util.resultOrThrow
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
||||
|
||||
@Patch(
|
||||
description = "Hooks Cronet image urls",
|
||||
dependencies = [
|
||||
IntegrationsPatch::class
|
||||
]
|
||||
)
|
||||
object CronetImageUrlHook : BytecodePatch(
|
||||
setOf(
|
||||
MessageDigestImageUrlParentFingerprint,
|
||||
OnResponseStartedFingerprint,
|
||||
RequestFingerprint
|
||||
)
|
||||
) {
|
||||
private lateinit var loadImageUrlMethod: MutableMethod
|
||||
private var loadImageUrlIndex = 0
|
||||
|
||||
private lateinit var loadImageSuccessCallbackMethod: MutableMethod
|
||||
private var loadImageSuccessCallbackIndex = 0
|
||||
|
||||
private lateinit var loadImageErrorCallbackMethod: MutableMethod
|
||||
private var loadImageErrorCallbackIndex = 0
|
||||
|
||||
/**
|
||||
* @param highPriority If the hook should be called before all other hooks.
|
||||
*/
|
||||
fun addImageUrlHook(targetMethodClass: String, highPriority: Boolean = false) {
|
||||
loadImageUrlMethod.addInstructions(
|
||||
if (highPriority) 0 else loadImageUrlIndex,
|
||||
"""
|
||||
invoke-static { p1 }, $targetMethodClass->overrideImageURL(Ljava/lang/String;)Ljava/lang/String;
|
||||
move-result-object p1
|
||||
""",
|
||||
)
|
||||
loadImageUrlIndex += 2
|
||||
}
|
||||
|
||||
/**
|
||||
* If a connection completed, which includes normal 200 responses but also includes
|
||||
* status 404 and other error like http responses.
|
||||
*/
|
||||
fun addImageUrlSuccessCallbackHook(targetMethodClass: String) {
|
||||
loadImageSuccessCallbackMethod.addInstruction(
|
||||
loadImageSuccessCallbackIndex++,
|
||||
"invoke-static { p1, p2 }, $targetMethodClass->handleCronetSuccess(" +
|
||||
"Lorg/chromium/net/UrlRequest;Lorg/chromium/net/UrlResponseInfo;)V",
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* If a connection outright failed to complete any connection.
|
||||
*/
|
||||
fun addImageUrlErrorCallbackHook(targetMethodClass: String) {
|
||||
loadImageErrorCallbackMethod.addInstruction(
|
||||
loadImageErrorCallbackIndex++,
|
||||
"invoke-static { p1, p2, p3 }, $targetMethodClass->handleCronetFailure(" +
|
||||
"Lorg/chromium/net/UrlRequest;Lorg/chromium/net/UrlResponseInfo;Ljava/io/IOException;)V",
|
||||
)
|
||||
}
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
loadImageUrlMethod = MessageDigestImageUrlFingerprint
|
||||
.alsoResolve(context, MessageDigestImageUrlParentFingerprint).mutableMethod
|
||||
|
||||
loadImageSuccessCallbackMethod = OnSucceededFingerprint
|
||||
.alsoResolve(context, OnResponseStartedFingerprint).mutableMethod
|
||||
|
||||
loadImageErrorCallbackMethod = OnFailureFingerprint
|
||||
.alsoResolve(context, OnResponseStartedFingerprint).mutableMethod
|
||||
|
||||
// The URL is required for the failure callback hook, but the URL field is obfuscated.
|
||||
// Add a helper get method that returns the URL field.
|
||||
RequestFingerprint.resultOrThrow().apply {
|
||||
// The url is the only string field that is set inside the constructor.
|
||||
val urlFieldInstruction = mutableMethod.getInstructions().single {
|
||||
if (it.opcode != Opcode.IPUT_OBJECT) return@single false
|
||||
|
||||
val reference = (it as ReferenceInstruction).reference as FieldReference
|
||||
reference.type == "Ljava/lang/String;"
|
||||
} as ReferenceInstruction
|
||||
|
||||
val urlFieldName = (urlFieldInstruction.reference as FieldReference).name
|
||||
val definingClass = RequestFingerprint.IMPLEMENTATION_CLASS_NAME
|
||||
val addedMethodName = "getHookedUrl"
|
||||
mutableClass.methods.add(
|
||||
ImmutableMethod(
|
||||
definingClass,
|
||||
addedMethodName,
|
||||
emptyList(),
|
||||
"Ljava/lang/String;",
|
||||
AccessFlags.PUBLIC.value,
|
||||
null,
|
||||
null,
|
||||
MutableMethodImplementation(2),
|
||||
).toMutable().apply {
|
||||
addInstructions(
|
||||
"""
|
||||
iget-object v0, p0, $definingClass->$urlFieldName:Ljava/lang/String;
|
||||
return-object v0
|
||||
""",
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.patches.youtube.layout.thumbnails.fingerprints
|
||||
package app.revanced.patches.youtube.misc.imageurlhook.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.patches.youtube.layout.thumbnails.fingerprints
|
||||
package app.revanced.patches.youtube.misc.imageurlhook.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
@@ -1,8 +1,8 @@
|
||||
package app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet
|
||||
package app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.RequestFingerprint.IMPLEMENTATION_CLASS_NAME
|
||||
import app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.RequestFingerprint.IMPLEMENTATION_CLASS_NAME
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal object RequestFingerprint : MethodFingerprint(
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback
|
||||
package app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.request.callback
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback
|
||||
package app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.request.callback
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback
|
||||
package app.revanced.patches.youtube.misc.imageurlhook.fingerprints.cronet.request.callback
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
@@ -7,12 +7,14 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableClass
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||
import app.revanced.patches.youtube.video.information.fingerprints.*
|
||||
import app.revanced.patches.youtube.video.playerresponse.PlayerResponseMethodHookPatch
|
||||
import app.revanced.patches.youtube.video.videoid.VideoIdPatch
|
||||
import app.revanced.util.alsoResolve
|
||||
import app.revanced.util.exception
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
@@ -45,9 +47,11 @@ object VideoInformationPatch : BytecodePatch(
|
||||
)
|
||||
) {
|
||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/VideoInformation;"
|
||||
private const val INTEGRATIONS_PLAYER_INTERFACE = "Lapp/revanced/integrations/youtube/patches/VideoInformation${'$'}PlaybackController;"
|
||||
|
||||
private lateinit var playerInitMethod: MutableMethod
|
||||
private var playerInitInsertIndex = 4
|
||||
private var playerInitInsertIndex = -1
|
||||
private var playerInitInsertRegister = -1
|
||||
|
||||
private lateinit var mdxInitMethod: MutableMethod
|
||||
private var mdxInitInsertIndex = -1
|
||||
@@ -70,42 +74,43 @@ object VideoInformationPatch : BytecodePatch(
|
||||
with(PlayerInitFingerprint.resultOrThrow()) {
|
||||
playerInitMethod = mutableClass.methods.first { MethodUtil.isConstructor(it) }
|
||||
|
||||
// hook the player controller for use through integrations
|
||||
// find the location of the first invoke-direct call and extract the register storing the 'this' object reference.
|
||||
val initThisIndex = playerInitMethod.indexOfFirstInstructionOrThrow {
|
||||
opcode == Opcode.INVOKE_DIRECT && getReference<MethodReference>()?.name == "<init>"
|
||||
}
|
||||
playerInitInsertRegister = playerInitMethod.getInstruction<FiveRegisterInstruction>(initThisIndex).registerC
|
||||
playerInitInsertIndex = initThisIndex + 1
|
||||
|
||||
// Hook the player controller for use through integrations.
|
||||
onCreateHook(INTEGRATIONS_CLASS_DESCRIPTOR, "initialize")
|
||||
|
||||
// seek method
|
||||
val seekFingerprintResultMethod =
|
||||
SeekFingerprint.also { it.resolve(context, classDef) }.resultOrThrow().method
|
||||
SeekFingerprint.alsoResolve(context, PlayerInitFingerprint).method
|
||||
val seekRelativeFingerprintResultMethod =
|
||||
SeekRelativeFingerprint.alsoResolve(context, PlayerInitFingerprint).method
|
||||
|
||||
// create helper method
|
||||
val seekHelperMethod = generateSeekMethodHelper(seekFingerprintResultMethod)
|
||||
|
||||
// add the seekTo method to the class for the integrations to call
|
||||
mutableClass.methods.add(seekHelperMethod)
|
||||
// Create integrations interface methods.
|
||||
addSeekInterfaceMethods(mutableClass, seekFingerprintResultMethod, seekRelativeFingerprintResultMethod)
|
||||
}
|
||||
|
||||
with(MdxPlayerDirectorSetVideoStageFingerprint.resultOrThrow()) {
|
||||
mdxInitMethod = mutableClass.methods.first { MethodUtil.isConstructor(it) }
|
||||
|
||||
// find the location of the first invoke-direct call and extract the register storing the 'this' object reference
|
||||
val initThisIndex = mdxInitMethod.indexOfFirstInstructionOrThrow {
|
||||
opcode == Opcode.INVOKE_DIRECT && getReference<MethodReference>()?.name == "<init>"
|
||||
}
|
||||
mdxInitInsertRegister = mdxInitMethod.getInstruction<FiveRegisterInstruction>(initThisIndex).registerC
|
||||
mdxInitInsertIndex = initThisIndex + 1
|
||||
|
||||
// hook the MDX director for use through integrations
|
||||
// Hook the MDX director for use through integrations.
|
||||
onCreateHookMdx(INTEGRATIONS_CLASS_DESCRIPTOR, "initializeMdx")
|
||||
|
||||
// MDX seek method
|
||||
val mdxSeekFingerprintResultMethod =
|
||||
MdxSeekFingerprint.apply { resolve(context, classDef) }.resultOrThrow().method
|
||||
MdxSeekFingerprint.alsoResolve(context, MdxPlayerDirectorSetVideoStageFingerprint).method
|
||||
val mdxSeekRelativeFingerprintResultMethod =
|
||||
MdxSeekRelativeFingerprint.alsoResolve(context, MdxPlayerDirectorSetVideoStageFingerprint).method
|
||||
|
||||
// create helper method
|
||||
val mdxSeekHelperMethod = generateSeekMethodHelper(mdxSeekFingerprintResultMethod)
|
||||
|
||||
// add the seekTo method to the class for the integrations to call
|
||||
mutableClass.methods.add(mdxSeekHelperMethod)
|
||||
addSeekInterfaceMethods(mutableClass, mdxSeekFingerprintResultMethod, mdxSeekRelativeFingerprintResultMethod)
|
||||
}
|
||||
|
||||
with(CreateVideoPlayerSeekbarFingerprint.result!!) {
|
||||
@@ -173,33 +178,42 @@ object VideoInformationPatch : BytecodePatch(
|
||||
userSelectedPlaybackSpeedHook(INTEGRATIONS_CLASS_DESCRIPTOR, "userSelectedPlaybackSpeed")
|
||||
}
|
||||
|
||||
private fun generateSeekMethodHelper(seekMethod: Method): MutableMethod {
|
||||
private fun addSeekInterfaceMethods(targetClass: MutableClass, seekToMethod: Method, seekToRelativeMethod: Method) {
|
||||
// Add the interface and methods that integrations calls.
|
||||
targetClass.interfaces.add(INTEGRATIONS_PLAYER_INTERFACE)
|
||||
|
||||
// create helper method
|
||||
val generatedMethod = ImmutableMethod(
|
||||
seekMethod.definingClass,
|
||||
"seekTo",
|
||||
listOf(ImmutableMethodParameter("J", null, "time")),
|
||||
"Z",
|
||||
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
null, null,
|
||||
MutableMethodImplementation(4)
|
||||
).toMutable()
|
||||
arrayOf(
|
||||
seekToMethod to "seekTo",
|
||||
seekToRelativeMethod to "seekToRelative"
|
||||
).forEach { (method, name) ->
|
||||
// Add interface method.
|
||||
// Get enum type for the seek helper method.
|
||||
val seekSourceEnumType = method.parameterTypes[1].toString()
|
||||
|
||||
// get enum type for the seek helper method
|
||||
val seekSourceEnumType = seekMethod.parameterTypes[1].toString()
|
||||
val interfaceImplementation = ImmutableMethod(
|
||||
targetClass.type,
|
||||
name,
|
||||
listOf(ImmutableMethodParameter("J", null, "time")),
|
||||
"Z",
|
||||
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
null, null,
|
||||
MutableMethodImplementation(4)
|
||||
).toMutable()
|
||||
|
||||
// insert helper method instructions
|
||||
generatedMethod.addInstructions(
|
||||
0,
|
||||
"""
|
||||
sget-object v0, $seekSourceEnumType->a:$seekSourceEnumType
|
||||
invoke-virtual { p0, p1, p2, v0 }, $seekMethod
|
||||
move-result p1
|
||||
return p1
|
||||
"""
|
||||
)
|
||||
return generatedMethod
|
||||
// Insert helper method instructions.
|
||||
interfaceImplementation.addInstructions(
|
||||
0,
|
||||
"""
|
||||
# first enum (field a) is SEEK_SOURCE_UNKNOWN
|
||||
sget-object v0, $seekSourceEnumType->a:$seekSourceEnumType
|
||||
invoke-virtual { p0, p1, p2, v0 }, $method
|
||||
move-result p1
|
||||
return p1
|
||||
"""
|
||||
)
|
||||
|
||||
targetClass.methods.add(interfaceImplementation)
|
||||
}
|
||||
}
|
||||
|
||||
private fun MutableMethod.insert(insertIndex: Int, register: String, descriptor: String) =
|
||||
@@ -220,8 +234,8 @@ object VideoInformationPatch : BytecodePatch(
|
||||
internal fun onCreateHook(targetMethodClass: String, targetMethodName: String) =
|
||||
playerInitMethod.insert(
|
||||
playerInitInsertIndex++,
|
||||
"v0",
|
||||
"$targetMethodClass->$targetMethodName(Ljava/lang/Object;)V"
|
||||
"v$playerInitInsertRegister",
|
||||
"$targetMethodClass->$targetMethodName($INTEGRATIONS_PLAYER_INTERFACE)V"
|
||||
)
|
||||
|
||||
/**
|
||||
@@ -234,7 +248,7 @@ object VideoInformationPatch : BytecodePatch(
|
||||
mdxInitMethod.insert(
|
||||
mdxInitInsertIndex++,
|
||||
"v$mdxInitInsertRegister",
|
||||
"$targetMethodClass->$targetMethodName(Ljava/lang/Object;)V"
|
||||
"$targetMethodClass->$targetMethodName($INTEGRATIONS_PLAYER_INTERFACE)V"
|
||||
)
|
||||
|
||||
/**
|
||||
|
||||
@@ -5,6 +5,9 @@ import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
/**
|
||||
* Resolves using class found in [MdxPlayerDirectorSetVideoStageFingerprint].
|
||||
*/
|
||||
internal object MdxSeekFingerprint : MethodFingerprint(
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
returnType = "Z",
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package app.revanced.patches.youtube.video.information.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
/**
|
||||
* Resolves using class found in [MdxPlayerDirectorSetVideoStageFingerprint].
|
||||
*/
|
||||
internal object MdxSeekRelativeFingerprint : MethodFingerprint(
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
returnType = "Z",
|
||||
parameters = listOf("J", "L"),
|
||||
opcodes = listOf(
|
||||
Opcode.IGET_OBJECT,
|
||||
Opcode.INVOKE_INTERFACE
|
||||
)
|
||||
)
|
||||
@@ -3,6 +3,9 @@ package app.revanced.patches.youtube.video.information.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
/**
|
||||
* Resolves using class found in [PlayerInitFingerprint].
|
||||
*/
|
||||
internal object SeekFingerprint : MethodFingerprint(
|
||||
strings = listOf("Attempting to seek during an ad")
|
||||
)
|
||||
@@ -0,0 +1,21 @@
|
||||
package app.revanced.patches.youtube.video.information.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
/**
|
||||
* Resolves using class found in [PlayerInitFingerprint].
|
||||
*/
|
||||
internal object SeekRelativeFingerprint : MethodFingerprint(
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
returnType = "Z",
|
||||
parameters = listOf("J", "L"),
|
||||
opcodes = listOf(
|
||||
Opcode.ADD_LONG_2ADDR,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT,
|
||||
Opcode.RETURN
|
||||
)
|
||||
)
|
||||
@@ -114,7 +114,7 @@ fun Method.indexOfFirstWideLiteralInstructionValue(literal: Long) = implementati
|
||||
*
|
||||
* @return the first literal instruction with the value, or throws [PatchException] if not found.
|
||||
*/
|
||||
fun Method.indexOfFirstWideLiteralInstructionValueOrThrow(literal: Long) : Int {
|
||||
fun Method.indexOfFirstWideLiteralInstructionValueOrThrow(literal: Long): Int {
|
||||
val index = indexOfFirstWideLiteralInstructionValue(literal)
|
||||
if (index < 0) throw PatchException("Could not find literal value: $literal")
|
||||
return index
|
||||
@@ -160,7 +160,7 @@ inline fun <reified T : Reference> Instruction.getReference() = (this as? Refere
|
||||
// TODO: delete this on next major release, the overloaded method with an optional start index serves the same purposes.
|
||||
// Method is deprecated, but annotation is commented out otherwise during compilation usage of the replacement is
|
||||
// incorrectly flagged as deprecated.
|
||||
//@Deprecated("Use the overloaded method with an optional start index.", ReplaceWith("indexOfFirstInstruction(predicate)"))
|
||||
// @Deprecated("Use the overloaded method with an optional start index.", ReplaceWith("indexOfFirstInstruction(predicate)"))
|
||||
fun Method.indexOfFirstInstruction(predicate: Instruction.() -> Boolean) = indexOfFirstInstruction(0, predicate)
|
||||
|
||||
/**
|
||||
@@ -211,28 +211,47 @@ fun Method.findOpcodeIndicesReversed(opcode: Opcode): List<Int> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the resolved methods of [MethodFingerprint]s early.
|
||||
* Return the resolved method early.
|
||||
*/
|
||||
fun List<MethodFingerprint>.returnEarly(bool: Boolean = false) {
|
||||
fun MethodFingerprint.returnEarly(bool: Boolean = false) {
|
||||
val const = if (bool) "0x1" else "0x0"
|
||||
this.forEach { fingerprint ->
|
||||
fingerprint.result?.let { result ->
|
||||
val stringInstructions = when (result.method.returnType.first()) {
|
||||
'L' ->
|
||||
"""
|
||||
result?.let { result ->
|
||||
val stringInstructions = when (result.method.returnType.first()) {
|
||||
'L' ->
|
||||
"""
|
||||
const/4 v0, $const
|
||||
return-object v0
|
||||
"""
|
||||
'V' -> "return-void"
|
||||
'I', 'Z' ->
|
||||
"""
|
||||
'V' -> "return-void"
|
||||
'I', 'Z' ->
|
||||
"""
|
||||
const/4 v0, $const
|
||||
return v0
|
||||
"""
|
||||
else -> throw Exception("This case should never happen.")
|
||||
}
|
||||
else -> throw Exception("This case should never happen.")
|
||||
}
|
||||
|
||||
result.mutableMethod.addInstructions(0, stringInstructions)
|
||||
} ?: throw fingerprint.exception
|
||||
}
|
||||
result.mutableMethod.addInstructions(0, stringInstructions)
|
||||
} ?: throw exception
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the resolved methods early.
|
||||
*/
|
||||
fun Iterable<MethodFingerprint>.returnEarly(bool: Boolean = false) = forEach { fingerprint ->
|
||||
fingerprint.returnEarly(bool)
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the resolved methods early.
|
||||
*/
|
||||
@Deprecated("Use the Iterable version")
|
||||
fun List<MethodFingerprint>.returnEarly(bool: Boolean = false) = forEach { fingerprint ->
|
||||
fingerprint.returnEarly(bool)
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves this fingerprint using the classDef of a parent fingerprint.
|
||||
*/
|
||||
fun MethodFingerprint.alsoResolve(context: BytecodeContext, parentFingerprint: MethodFingerprint) =
|
||||
also { resolve(context, parentFingerprint.resultOrThrow().classDef) }.resultOrThrow()
|
||||
|
||||
@@ -171,10 +171,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<patch id="layout.sponsorblock.SponsorBlockResourcePatch">
|
||||
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title' -->
|
||||
<!-- Toast shown if network connection times out. Translations of this should not be longer than the original English or the text can be clipped and not entirely shown. -->
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
</patch>
|
||||
<patch id="layout.spoofappversion.SpoofAppVersionPatch">
|
||||
@@ -198,6 +194,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="layout.theme.ThemeResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.AlternativeThumbnailsPatch">
|
||||
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||
<!-- 'Subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
|
||||
@@ -206,6 +204,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="misc.announcements.AnnouncementsPatch">
|
||||
</patch>
|
||||
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
|
||||
</patch>
|
||||
<patch id="misc.autorepeat.AutoRepeatPatch">
|
||||
</patch>
|
||||
<patch id="misc.dimensions.spoof.SpoofDeviceDimensionsPatch">
|
||||
@@ -216,8 +216,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="misc.links.OpenLinksExternallyPatch">
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
|
||||
</patch>
|
||||
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
|
||||
</patch>
|
||||
<patch id="misc.zoomhaptics.ZoomHapticsPatch">
|
||||
|
||||
@@ -171,10 +171,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<patch id="layout.sponsorblock.SponsorBlockResourcePatch">
|
||||
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title' -->
|
||||
<!-- Toast shown if network connection times out. Translations of this should not be longer than the original English or the text can be clipped and not entirely shown. -->
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
</patch>
|
||||
<patch id="layout.spoofappversion.SpoofAppVersionPatch">
|
||||
@@ -198,6 +194,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="layout.theme.ThemeResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.AlternativeThumbnailsPatch">
|
||||
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||
<!-- 'Subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
|
||||
@@ -206,6 +204,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="misc.announcements.AnnouncementsPatch">
|
||||
</patch>
|
||||
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
|
||||
</patch>
|
||||
<patch id="misc.autorepeat.AutoRepeatPatch">
|
||||
</patch>
|
||||
<patch id="misc.dimensions.spoof.SpoofDeviceDimensionsPatch">
|
||||
@@ -216,8 +216,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="misc.links.OpenLinksExternallyPatch">
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
|
||||
</patch>
|
||||
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
|
||||
</patch>
|
||||
<patch id="misc.zoomhaptics.ZoomHapticsPatch">
|
||||
|
||||
@@ -211,6 +211,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_info_cards_section_title">ØĨØŽŲØ§ØĄ ŲØŗŲ
Ø¨ØˇØ§ŲØ§ØĒ اŲŲ
ØšŲŲŲ
اØĒ</string>
|
||||
<string name="revanced_hide_info_cards_section_summary_on">ØĒŲ
ØĨØŽŲØ§ØĄ ŲØŗŲ
Ø¨ØˇØ§ŲØ§ØĒ اŲŲ
ØšŲŲŲ
اØĒ</string>
|
||||
<string name="revanced_hide_info_cards_section_summary_off">ŲØĒŲ
ØšØąØļ ŲØŗŲ
Ø¨ØˇØ§ŲØ§ØĒ اŲŲ
ØšŲŲŲ
اØĒ</string>
|
||||
<string name="revanced_hide_key_concepts_section_title">ØĨØŽŲØ§ØĄ ŲØŗŲ
\'اŲŲ
ŲØ§ŲŲŲ
Ø§ŲØŖØŗØ§ØŗŲØŠ\'</string>
|
||||
<string name="revanced_hide_key_concepts_section_summary_on">ØĒŲ
ØĨØŽŲØ§ØĄ ŲØŗŲ
\'اŲŲ
ŲØ§ŲŲŲ
Ø§ŲØŖØŗØ§ØŗŲØŠ\'</string>
|
||||
<string name="revanced_hide_key_concepts_section_summary_off">ŲØĒŲ
ØšØąØļ ŲØŗŲ
\'اŲŲ
ŲØ§ŲŲŲ
Ø§ŲØŖØŗØ§ØŗŲØŠ\'</string>
|
||||
<string name="revanced_hide_transcript_section_title">ØĨØŽŲØ§ØĄ ŲØŗŲ
اŲŲØĩ</string>
|
||||
<string name="revanced_hide_transcript_section_summary_on">ØĒŲ
ØĨØŽŲØ§ØĄ ŲØŗŲ
اŲŲØĩ</string>
|
||||
<string name="revanced_hide_transcript_section_summary_off">ŲØĒŲ
ØšØąØļ ŲØŗŲ
اŲŲØĩ</string>
|
||||
@@ -246,7 +249,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_keyword_toast_invalid_common">اŲŲŲŲ
ØŠ اŲŲ
ŲØĒØ§ØŲØŠ ØēŲØą ØĩØ§ŲØØŠ. ŲØ§ ŲŲ
ŲŲ Ø§ØŗØĒ؎داŲ
: \'%s\' ŲØšØ§Ų
Ų ØĒØĩŲŲØŠ</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_keyword_toast_invalid_length">اŲŲŲŲ
ØŠ اŲŲ
ŲØĒØ§ØŲØŠ ØēŲØą ØĩØ§ŲØØŠ. \'%1$s\' ØŖŲŲ Ų
Ų %2$d ØØąŲŲØ§</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">اŲŲŲŲ
ØŠ Ø§ŲØąØĻŲØŗŲØŠ \'$s\' ØŗŲŲ ØĒØŽŲŲ ØŦŲ
ب𠨧ŲŲŲØ¯ŲŲŲØ§ØĒ</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">اŲŲŲŲ
ØŠ Ø§ŲØąØĻŲØŗŲØŠ \'%s\' ØŗŲŲ ØĒØŽŲŲ ØŦŲ
ب𠨧ŲŲŲØ¯ŲŲŲØ§ØĒ</string>
|
||||
</patch>
|
||||
<patch id="ad.general.HideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">ØĨØŽŲØ§ØĄ Ø§ŲØĨØšŲØ§ŲاØĒ Ø§ŲØšØ§Ų
ØŠ</string>
|
||||
@@ -771,6 +774,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_sb_general_skipcount_sum_off">ØĒŲ
ØĒØšØˇŲŲ ØĒØĒبؚ Ų
ØąØ§ØĒ Ø§ŲØĒØŽØˇŲ</string>
|
||||
<string name="revanced_sb_general_min_duration">Ø§ŲØØ¯ Ø§ŲØŖØ¯ŲŲ ŲŲ
د؊ اŲŲ
ŲØˇØš</string>
|
||||
<string name="revanced_sb_general_min_duration_sum">ŲŲ ŲØĒŲ
ØšØąØļ اŲŲ
ŲØ§ØˇØš Ø§ŲØŖŲØĩØą Ų
Ų ŲØ°Ų اŲŲŲŲ
ØŠ (Ø¨Ø§ŲØĢŲØ§ŲŲ) ØŖŲ ØĒØŽØˇŲŲØ§</string>
|
||||
<string name="revanced_sb_general_min_duration_invalid">اŲŲ
د؊ Ø§ŲØ˛Ų
ŲŲØŠ ØēŲØą ØĩØ§ŲØØŠ</string>
|
||||
<string name="revanced_sb_general_uuid">Ų
ØšØąŲ Ø§ŲŲ
ØŗØĒ؎دŲ
اŲŲØąŲد Ø§ŲØŽØ§Øĩ بŲ</string>
|
||||
<string name="revanced_sb_general_uuid_sum">ŲØŦب ØŖŲ ŲØ¨ŲŲ ŲØ°Ø§ ؎اØĩŲØ§. اŲŲ Ų
ØĢŲ ŲŲŲ
ØŠ اŲŲ
ØąŲØą ŲŲØ§ ŲŲØ¨ØēŲ Ų
Ø´Ø§ØąŲØĒŲ Ų
Øš ØŖŲ Ø´ØŽØĩ. ØĨذا ŲØ§Ų Ø´ØŽØĩ Ų
ا ŲŲ
ŲŲ ŲØ°Ø§Ø ŲŲŲ
ŲŲŲ Ø§ŲØĒØØ§Ų Ø´ØŽØĩŲØĒŲ</string>
|
||||
<string name="revanced_sb_general_uuid_invalid">ŲØŦب ØŖŲ ŲŲŲŲ Ų
ØšØąŲ Ø§ŲŲ
ØŗØĒ؎دŲ
Ø§ŲØŽØ§Øĩ 30 ØØąŲŲØ§ ØšŲŲ Ø§ŲØŖŲŲ</string>
|
||||
@@ -864,17 +868,13 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_sb_new_segment_choose_category">ا؎ØĒŲØ§Øą ŲØĻØŠ Ø§ŲŲ
ŲØˇØš</string>
|
||||
<string name="revanced_sb_new_segment_disabled_category">اŲŲØĻØŠ Ų
ØšØˇŲØŠ ŲŲ Ø§ŲØĨؚداداØĒ. ØĒŲ
ŲŲŲ Ø§ŲŲØĻØŠ ŲŲØĨØąØŗØ§Ų.</string>
|
||||
<string name="revanced_sb_new_segment_title">Ų
ŲØˇØš Ų
اŲŲØš ØąŲØšŲا؊ ØŦØ¯ŲØ¯</string>
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<string name="revanced_sb_new_segment_mark_time_as_question">ØĒØšŲŲŲ %1$02d:%2$02d:%3$03d ŲØ¨Ø¯Ø§ŲØŠ ØŖŲ
ŲŲØ§ŲØŠ ŲŲ
ŲØˇØš ØŦØ¯ŲØ¯Ø</string>
|
||||
<string name="revanced_sb_new_segment_mark_time_as_question">ØĒØšŲŲŲ %s ŲØ¨Ø¯Ø§ŲØŠ ØŖŲ ŲŲØ§ŲØŠ ŲŲ
ŲØˇØš ØŦØ¯ŲØ¯Ø</string>
|
||||
<string name="revanced_sb_new_segment_mark_start">Ø§ŲØ¨Ø¯Ø§ŲØŠ</string>
|
||||
<string name="revanced_sb_new_segment_mark_end">اŲŲŲØ§ŲØŠ</string>
|
||||
<string name="revanced_sb_new_segment_now">Ø§ŲØĸŲ</string>
|
||||
<string name="revanced_sb_new_segment_time_start">اŲŲŲØĒ Ø§ŲØ°Ų ŲØ¨Ø¯ØŖ ØšŲØ¯Ų اŲŲ
ŲØˇØš</string>
|
||||
<string name="revanced_sb_new_segment_time_end">اŲŲŲØĒ Ø§ŲØ°Ų ŲŲØĒŲŲ ØšŲØ¯Ų اŲŲ
ŲØˇØš</string>
|
||||
<string name="revanced_sb_new_segment_confirm_title">ŲŲ Ø§ŲØŖŲŲØ§ØĒ ØĩØŲØØŠØ</string>
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<string name="revanced_sb_new_segment_confirm_content">اŲŲ
ŲØˇØš Ų
Ų\n\n%1$s\nto\n%2$s\n\n(%3$s)\n\nReady to ØŦØ§ŲØ˛ ŲŲØĨØąØŗØ§ŲØ</string>
|
||||
<string name="revanced_sb_new_segment_start_is_before_end">ŲØŦب ØŖŲ ØĒŲŲŲ Ø§ŲØ¨Ø¯Ø§ŲØŠ ŲØ¨Ų اŲŲŲØ§ŲØŠ</string>
|
||||
<string name="revanced_sb_new_segment_mark_locations_first">ØļØš ØšŲØ§Ų
ØŠ ØšŲŲ Ų
ŲŲØšŲŲ ŲŲ Ø´ØąŲØˇ اŲŲŲØĒ ØŖŲŲŲØ§</string>
|
||||
@@ -925,7 +925,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_spoof_app_version_target_entry_2">18.20.39 - Ø§ØŗØĒؚاد؊ ØŗØąØšØŠ اŲŲŲØ¯ŲŲ Ø§ŲŲØ§ØŗØšØŠ & ŲØ§ØĻŲ
ØŠ Ø§ŲØŦŲØ¯ØŠ</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_3">18.09.39 - Ø§ØŗØĒؚاد؊ ØšŲØ§Ų
ØŠ ØĒبŲŲØ¨ اŲŲ
ŲØĒØ¨ØŠ</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_4">17.41.37 - Ø§ØŗØĒؚاد؊ ØąŲ ŲØ§ØĻŲ
ØŠ Ø§ŲØĒØ´ØēŲŲ Ø§ŲŲØ¯ŲŲ
</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_5">17.30.34 - Ø§ØŗØĒؚاد؊ ØĒØĩŲ
ŲŲ
ŲØ§ØŦŲØŠ Ø§ŲŲ
ØŗØĒ؎دŲ
اŲŲØ¯ŲŲ
</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_5">17.33.42 - Ø§ØŗØĒؚاد؊ ØĒØĩŲ
ŲŲ
ŲØ§ØŦŲØŠ Ø§ŲŲ
ØŗØĒ؎دŲ
اŲŲØ¯ŲŲ
</string>
|
||||
</patch>
|
||||
<patch id="layout.startpage.ChangeStartPagePatch">
|
||||
<string name="revanced_start_page_title">ØĒØšŲŲŲ ØĩŲØØŠ Ø§ŲØ¨Ø¯Ø§ŲØŠ</string>
|
||||
@@ -990,6 +990,11 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_seekbar_custom_color_value_summary">ŲŲŲ Ø´ØąŲØˇ Ø§ŲØĒŲØ¯Ų
</string>
|
||||
<string name="revanced_seekbar_custom_color_invalid">ŲŲŲ Ø§ŲØ´ØąŲØˇ ØēŲØą ØĩØ§ŲØ. Ø§ØŗØĒ؎داŲ
اŲŲŲŲ
ØŠ Ø§ŲØ§ŲØĒØąØ§ØļŲØŠ.</string>
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
|
||||
<string name="revanced_bypass_image_region_restrictions_title">ØĒØŦØ§ŲØ˛ ŲŲŲØ¯ Ų
ŲØˇŲØŠ Ø§ŲØĩŲØąØŠ</string>
|
||||
<string name="revanced_bypass_image_region_restrictions_summary_on">Ø§ØŗØĒ؎داŲ
Ų
ØļŲŲ Ø§ŲØĩŲØąØŠ yt4.ggpht.com</string>
|
||||
<string name="revanced_bypass_image_region_restrictions_summary_off">Ø§ØŗØĒ؎داŲ
Ų
ØļŲŲ Ø§ŲØĩŲØą Ø§ŲØŖØĩŲŲ\n\nØĒŲ
ŲŲŲ ŲØ°Ø§ ŲŲ
ŲŲ ØĨØĩŲØ§Ø Ø§ŲØĩŲØą Ø§ŲŲ
ŲŲŲØ¯ØŠ Ø§ŲØĒŲ ŲØĒŲ
ØØ¸ØąŲا ŲŲ Ø¨ØšØļ اŲŲ
ŲØ§ØˇŲ</string>
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.AlternativeThumbnailsPatch">
|
||||
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||
<string name="revanced_alt_thumbnail_home_title">ØšŲØ§Ų
ØŠ ØĒبŲŲØ¨ Ø§ŲØĩŲØØŠ Ø§ŲØąØĻŲØŗŲØŠ</string>
|
||||
@@ -1030,6 +1035,11 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_announcements_connection_failed">ŲØ´Ų Ø§ŲØ§ØĒØĩØ§Ų Ø¨Ų
ŲŲØą Ø§ŲØĨØšŲØ§ŲاØĒ</string>
|
||||
<string name="revanced_announcements_dialog_dismiss">ØĒØŦاŲŲ</string>
|
||||
</patch>
|
||||
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
|
||||
<string name="revanced_check_watch_history_domain_name_dialog_title">ØĒØØ°ŲØą</string>
|
||||
<string name="revanced_check_watch_history_domain_name_dialog_message">ŲŲ
ŲØĒŲ
ØŲظ ØŗØŦŲ Ø§ŲŲ
Ø´Ø§ŲØ¯ØŠ Ø§ŲØŽØ§Øĩ بŲ.<br><br>Ų
Ų Ø§ŲŲ
ØąØŦØ ØŖŲ ŲŲŲŲ Ø§ŲØŗØ¨Ø¨ ŲŲ Ø°ŲŲ ŲŲ Ų
Ø§ŲØš ØĨØšŲØ§ŲاØĒ DNS ØŖŲ ŲŲŲŲ Ø§ŲØ´Ø¨ŲØŠ.<br><br>ŲØĨØĩŲØ§Ø ŲØ°Ų اŲŲ
Ø´ŲŲØŠØ ŲŲ
بØĨØļØ§ŲØŠ <b>s.youtube.com</b> ØĨŲŲ Ø§ŲŲØ§ØĻŲ
ØŠ Ø§ŲØ¨ŲØļØ§ØĄ ØŖŲ ŲŲ
بØĨŲŲØ§Ų ØĒØ´ØēŲŲ ØŦŲ
ŲØš ØŖØ¯ŲØ§ØĒ ØØ¸Øą DNS ŲŲŲŲØ§ØĄ Ø§ŲØ¨ØąŲŲØŗŲ.</string>
|
||||
<string name="revanced_check_watch_history_domain_name_dialog_ignore">ŲØ§ ØĒØšØąØļ Ų
ØąØŠ ØŖØŽØąŲ</string>
|
||||
</patch>
|
||||
<patch id="misc.autorepeat.AutoRepeatPatch">
|
||||
<string name="revanced_auto_repeat_title">ØĒŲ
ŲŲŲ Ø§ŲØĒŲØąØ§Øą Ø§ŲØĒŲŲØ§ØĻŲ</string>
|
||||
<string name="revanced_auto_repeat_summary_on">ØĒŲ
ØĒŲ
ŲŲŲ Ø§ŲØĒŲØąØ§Øą Ø§ŲØĒŲŲØ§ØĻŲ</string>
|
||||
@@ -1055,10 +1065,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_external_browser_summary_on">ŲØĒØ Ø§ŲØąŲØ§Ø¨Øˇ ØŽØ§ØąØŦŲŲØ§</string>
|
||||
<string name="revanced_external_browser_summary_off">ŲØĒØ Ø§ŲØąŲØ§Ø¨Øˇ ŲŲ Ø§ŲØĒØˇØ¨ŲŲ</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
|
||||
<string name="revanced_background_playback_title">Ø§ŲØĒØ´ØēŲŲ ŲŲ Ø§ŲØŽŲŲŲØŠ</string>
|
||||
<string name="revanced_background_playback_summary">ŲŲ
ŲŲ Ø§ŲØšØĢŲØą ØšŲŲ ŲØ°Ø§ Ø§ŲØĨؚداد ŲŲ Ø§ŲØĨؚداداØĒ -> Ø§ŲØŽŲŲŲØŠ</string>
|
||||
</patch>
|
||||
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
|
||||
<string name="revanced_remove_tracking_query_parameter_title">ØĨØ˛Ø§ŲØŠ Ų
ØšŲŲ
ØŠ ØĒØĒبؚ Ø§ŲØ§ØŗØĒØšŲØ§Ų
</string>
|
||||
<string name="revanced_remove_tracking_query_parameter_summary_on">ŲØĒŲ
ØĨØ˛Ø§ŲØŠ Ų
ØšŲŲ
ØŠ Ø§ØŗØĒØšŲØ§Ų
Ø§ŲØĒØĒØ¨Øš Ų
Ų Ø§ŲØąŲØ§Ø¨Øˇ</string>
|
||||
@@ -1115,9 +1121,15 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_spoof_client_summary_on">ŲØĒŲ
Ų
ØØ§Ųا؊ Ø§ŲØšŲ
ŲŲ</string>
|
||||
<string name="revanced_spoof_client_summary_off">ŲØ§ ŲØĒŲ
Ų
ØØ§Ųا؊ Ø§ŲØšŲ
ŲŲ\n\nŲØ¯ ŲØ§ ŲØšŲ
Ų ØĒØ´ØēŲŲ Ø§ŲŲŲØ¯ŲŲ</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">ØĨŲŲØ§Ų ØĒØ´ØēŲŲ ŲØ°Ø§ Ø§ŲØĨؚداد ŲØ¯ ŲØŗØ¨Ø¨ Ų
شاŲŲ ŲŲ ØĒØ´ØēŲŲ Ø§ŲŲŲØ¯ŲŲ.</string>
|
||||
<string name="revanced_spoof_client_use_ios_title">Spoof Client to iOS</string>
|
||||
<string name="revanced_spoof_client_use_ios_summary_on">ØĒØĒŲ
ØØ§ŲŲŲØ§ Ų
ØØ§Ųا؊ Ø§ŲØšŲ
ŲŲ ØĨŲŲ iOS\n\nØ§ŲØĸØĢØ§Øą Ø§ŲØŦØ§ŲØ¨ŲØŠ ØĒØ´Ų
Ų:\nâĸ ŲØ§ ŲŲØŦد ŲŲØ¯ŲŲ HDR\nâĸ ŲØ¯ ŲØ§ ŲØšŲ
Ų ØŗØŦŲ Ø§ŲŲ
Ø´Ø§ŲØ¯ØŠ\nâĸ ŲØ¯ ØĒŲŲŲ ØŦŲØ¯ØŠ اŲŲŲØ¯ŲŲ Ø§ŲØŖØšŲŲ Ų
ŲŲŲØ¯ØŠ\nâĸ ŲØ§ ŲŲ
ŲŲ ØĒØ´ØēŲŲ Ø§ŲØ¨ØĢ اŲŲ
Ø¨Ø§Ø´Øą ŲØĩŲØĒ ŲŲØˇ\nâĸ Ø§ŲØ¨ØĢ اŲŲ
Ø¨Ø§Ø´Øą ØēŲØą Ų
ØĒŲŲØą ØšŲŲ Android 8.0</string>
|
||||
<string name="revanced_spoof_client_use_ios_summary_off">ØĒØĒŲ
Ų
ØØ§Ųا؊ Ø§ŲØšŲ
ŲŲ ØØ§ŲŲŲØ§ ØĨŲŲ Android VR\n\nØ§ŲØĸØĢØ§Øą Ø§ŲØŦØ§ŲØ¨ŲØŠ ØĒØ´Ų
Ų:\nâĸ ŲØ§ ŲŲØŦد ŲŲØ¯ŲŲ HDR\nâĸ ŲŲØ¯ŲŲŲØ§ØĒ Ø§ŲØŖØˇŲØ§Ų ŲØ§ ŲØĒŲ
ØĒØ´ØēŲŲŲŲ
\nâĸ Ų
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ø§ŲŲ
ØĒŲŲŲØŠ ŲŲ
ŲŲ ØŖŲ ØĒØŗØĒØŖŲŲ ØšØ´ŲØ§ØĻŲØ§\nâĸ ØŦŲØ¯ØŠ Ų
ŲØŽŲØļØŠ ŲŲ
ØĩØēØąØ§ØĒ Ø´ØąŲØˇ Ø§ŲØĒŲØ¯Ų
\nâĸ Ø˛Øą Ø§ŲØĒŲØ˛ŲŲ Ų
ØŽŲŲ Ø¨Ø´ŲŲ Ø¯Ø§ØĻŲ
\nâĸ Ø¨ØˇØ§ŲØ§ØĒ ŲŲØ§ŲØŠ Ø§ŲØ´Ø§Ø´ØŠ Ų
ØŽŲŲØŠ Ø¨Ø´ŲŲ Ø¯Ø§ØĻŲ
</string>
|
||||
<string name="revanced_spoof_client_type_title">ŲŲØš Spoof Client</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_title">ŲØąØļ AVC iOS (H.264)</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_on">ØĒØąŲ
ŲØ˛ ŲŲØ¯ŲŲ iOS ŲŲ AVC</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_off">ØĒØąŲ
ŲØ˛ ŲŲØ¯ŲŲ iOS ŲŲ AVC ØŖŲ VP9 ØŖŲ AV1</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_user_dialog_message">ŲØ¯ ŲØ¤Ø¯Ų ØĒŲ
ŲŲŲ ŲØ°Ø§ ØĨŲŲ ØĒØØŗŲŲ ØšŲ
Øą Ø§ŲØ¨ØˇØ§ØąŲØŠ ŲØĨØĩŲØ§Ø Ų
Ø´ŲŲØŠ ØĒŲØˇŲØš Ø§ŲØĒØ´ØēŲŲ.\n\nŲØĒŲ
ØĒØš ØĒŲØŗŲŲ AVC Ø¨Ø¯ŲØŠ ŲØĩŲŲ ØĒØ¨ŲØē 1080PØ ŲØŗŲØŗØĒ؎دŲ
ØĒØ´ØēŲŲ Ø§ŲŲŲØ¯ŲŲ Ø§ŲŲ
Ø˛ŲØ¯ Ų
Ų Ø¨ŲØ§ŲاØĒ Ø§ŲØĨŲØĒØąŲØĒ Ų
ŲØ§ØąŲØŠŲ Ø¨ØĒŲØŗŲŲ VP9 ØŖŲ AV1.</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_title">Ø§ŲØĒØŖØĢبਧØĒ Ø§ŲØŦØ§ŲØ¨ŲØŠ ŲŲ
ØØ§Ųا؊ iOS</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_summary">âĸ HDR Ų
دؚŲŲ
ŲŲØˇ Ų
Øš ØĒØąŲ
ŲØ˛ AV1\nâĸ ØŗØŦŲ Ø§ŲŲ
Ø´Ø§ŲØ¯ØŠ ŲØ§ ŲØšŲ
Ų Ų
Øš ØØŗØ§Ø¨ Ø§ŲØšŲاŲ
ØŠ Ø§ŲØĒØŦØ§ØąŲØŠ</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_title">Ø§ŲØĒØŖØĢبਧØĒ Ø§ŲØŦØ§ŲØ¨ŲØŠ ŲŲ
ØØ§Ųا؊ Android VR</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">âĸ ŲØ§ ŲŲØŦد ŲŲØ¯ŲŲ HDR\nâĸ ŲØ§ ŲØĒŲ
ØĒØ´ØēŲŲ Ų
ŲØ§ØˇØš ŲŲØ¯ŲŲ Ø§ŲØŖØˇŲاŲ\nâĸ ŲŲ
ŲŲ Ø§ØŗØĒØĻŲØ§Ų Ų
ŲØ§ØˇØš اŲŲŲØ¯ŲŲ Ø§ŲŲ
ØĒŲŲŲØŠ Ų
Ø¤ŲØĒŲØ§ بشŲŲ ØšØ´ŲØ§ØĻŲ\nâĸ Ų
ØĩØēØąØ§ØĒ Ø´ØąŲØˇ ØĒŲØ¯Ų
ŲŲØ¯ŲŲŲØ§ØĒ Shorts Ų
ŲØŽŲØļØŠ Ø§ŲØŦŲØ¯ØŠ\nâĸ Ø˛Øą ØĨØŦØąØ§ØĄ Ø§ŲØĒŲØ˛ŲŲ Ų
ØŽŲŲ\nâĸ Ø¨ØˇØ§ŲØ§ØĒ شاش؊ اŲŲŲØ§ŲØŠ Ų
ØŽŲŲØŠ</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">Ų
ØØ§Ųا؊ Ų
ØĩØēØąØ§ØĒ Ø§ŲØšŲ
ŲŲ ØēŲØą Ų
ØĒŲŲØąØŠ (Ø§ŲØĒŲØĒ Ų
ŲŲØŠ API)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">Ų
ØØ§Ųا؊ Ų
ØĩØēØąØ§ØĒ Ø§ŲØšŲ
ŲŲ ØēŲØą Ų
ØĒŲŲØąØŠ Ų
Ø¤ŲØĒŲØ§: %s</string>
|
||||
</patch>
|
||||
|
||||
@@ -171,10 +171,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<patch id="layout.sponsorblock.SponsorBlockResourcePatch">
|
||||
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title' -->
|
||||
<!-- Toast shown if network connection times out. Translations of this should not be longer than the original English or the text can be clipped and not entirely shown. -->
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
</patch>
|
||||
<patch id="layout.spoofappversion.SpoofAppVersionPatch">
|
||||
@@ -198,6 +194,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="layout.theme.ThemeResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.AlternativeThumbnailsPatch">
|
||||
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||
<!-- 'Subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
|
||||
@@ -206,6 +204,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="misc.announcements.AnnouncementsPatch">
|
||||
</patch>
|
||||
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
|
||||
</patch>
|
||||
<patch id="misc.autorepeat.AutoRepeatPatch">
|
||||
</patch>
|
||||
<patch id="misc.dimensions.spoof.SpoofDeviceDimensionsPatch">
|
||||
@@ -216,8 +216,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="misc.links.OpenLinksExternallyPatch">
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
|
||||
</patch>
|
||||
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
|
||||
</patch>
|
||||
<patch id="misc.zoomhaptics.ZoomHapticsPatch">
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -211,6 +211,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_info_cards_section_title">ĐĄŅ
аваŅŅ ŅаСдСĐĩĐģ ŅĐŊŅаŅĐŧаŅŅĐšĐŊŅŅ
ĐēаŅŅ</string>
|
||||
<string name="revanced_hide_info_cards_section_summary_on">РаСдСĐĩĐģ ŅĐŊŅаŅĐŧаŅŅĐšĐŊŅŅ
ĐēаŅŅаĐē ŅŅ
аваĐŊŅ</string>
|
||||
<string name="revanced_hide_info_cards_section_summary_off">ĐаĐēаСваĐĩŅŅа ŅаСдСĐĩĐģ ŅĐŊŅаŅĐŧаŅŅĐšĐŊŅŅ
ĐēаŅŅ</string>
|
||||
<string name="revanced_hide_key_concepts_section_title">ĐĄŅ
аваŅŅ ŅаСдСĐĩĐģ ÂĢĐĐģŅŅавŅŅ ĐŋаĐŊŅŅŅŅÂģ</string>
|
||||
<string name="revanced_hide_key_concepts_section_summary_on">РаСдСĐĩĐģ \"ĐĐģŅŅавŅŅ ĐŋаĐŊŅŅŅŅ\" ŅŅ
аваĐŊŅ</string>
|
||||
<string name="revanced_hide_key_concepts_section_summary_off">ĐаĐēаСаĐŊŅ ŅаСдСĐĩĐģ ÂĢĐĐģŅŅавŅŅ ĐŋаĐŊŅŅŅŅÂģ</string>
|
||||
<string name="revanced_hide_transcript_section_title">ĐĄŅ
аваŅŅ ŅаСдСĐĩĐģ ŅŅŅĐŊĐ°ĐŗŅаĐŧŅ</string>
|
||||
<string name="revanced_hide_transcript_section_summary_on">РаСдСĐĩĐģ ŅŅŅĐŊĐ°ĐŗŅаĐŧŅ ŅŅ
аваĐŊŅ</string>
|
||||
<string name="revanced_hide_transcript_section_summary_off">ĐаĐēаСваĐĩŅŅа ŅаСдСĐĩĐģ ŅŅŅĐŊĐ°ĐŗŅаĐŧŅ</string>
|
||||
@@ -246,7 +249,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_keyword_toast_invalid_common">ĐŅĐŋŅавŅĐģŅĐŊаĐĩ ĐēĐģŅŅавОĐĩ ŅĐģОва. ĐĐĩĐŧĐ°ĐŗŅŅĐŧа вŅĐēаŅŅŅŅĐžŅваŅŅ: \"%s\" Ņ ŅĐēаŅŅŅ ŅŅĐģŅŅŅа</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_keyword_toast_invalid_length">ĐŅĐŋŅавŅĐģŅĐŊаĐĩ ĐēĐģŅŅавОĐĩ ŅĐģОва. \"%1$s\" СĐŧŅŅŅаĐĩ ĐŧĐĩĐŊŅ ĐˇĐ° %2$d ŅŅĐŧваĐģаŅ</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">ĐĐģŅŅавОĐĩ ŅĐģОва \"$s\" ŅŅ
аваĐĩ ŅŅĐĩ вŅĐ´Ņа</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">ĐĐģŅŅавОĐĩ ŅĐģОва \"%s\" ŅŅ
аваĐĩ ŅŅĐĩ вŅĐ´Ņа</string>
|
||||
</patch>
|
||||
<patch id="ad.general.HideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">ĐĄŅ
аваŅŅ Đ°ĐŗŅĐģŅĐŊŅŅ ŅŅĐēĐģаĐŧŅ</string>
|
||||
@@ -864,17 +867,13 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_sb_new_segment_choose_category">ĐŅĐąĐĩŅŅŅĐĩ ĐēаŅŅĐŗĐžŅŅŅ ŅĐĩĐŗĐŧĐĩĐŊŅа</string>
|
||||
<string name="revanced_sb_new_segment_disabled_category">ĐаŅŅĐŗĐžŅŅŅ Đ°Đ´ĐēĐģŅŅаĐŊа Ņ ĐŊаĐģадаŅ
. ĐŖĐēĐģŅŅŅŅĐĩ ĐēаŅŅĐŗĐžŅŅŅ Đ´ĐģŅ Đ°Đ´ĐŋŅаŅĐēŅ.</string>
|
||||
<string name="revanced_sb_new_segment_title">ĐĐžĐ˛Ņ ŅĐĩĐŗĐŧĐĩĐŊŅ SponsorBlock</string>
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<string name="revanced_sb_new_segment_mark_time_as_question">ĐŖŅŅаĐģŅваŅŅ %1$02d:%2$02d:%3$03d Ņ ŅĐēаŅŅŅ ĐŋаŅаŅĐēŅ Đ°ĐąĐž ĐēаĐŊŅа ĐŊĐžĐ˛Đ°ĐŗĐ° ŅĐĩĐŗĐŧĐĩĐŊŅа?</string>
|
||||
<string name="revanced_sb_new_segment_mark_time_as_question">ĐŖŅŅаĐģŅваŅŅ %s Ņ ŅĐēаŅŅŅ ĐŋаŅаŅĐēŅ Đ°ĐąĐž ĐēаĐŊŅа ĐŊĐžĐ˛Đ°ĐŗĐ° ŅĐĩĐŗĐŧĐĩĐŊŅа?</string>
|
||||
<string name="revanced_sb_new_segment_mark_start">ĐŋаŅаŅŅ</string>
|
||||
<string name="revanced_sb_new_segment_mark_end">ĐēаĐŊĐĩŅ</string>
|
||||
<string name="revanced_sb_new_segment_now">СаŅаС</string>
|
||||
<string name="revanced_sb_new_segment_time_start">Đ§Đ°Ņ ĐŋаŅаŅĐēŅ ŅĐĩĐŗĐŧĐĩĐŊŅа</string>
|
||||
<string name="revanced_sb_new_segment_time_end">Đ§Đ°Ņ ĐˇĐ°ĐēаĐŊŅŅĐŊĐŊŅ ŅĐĩĐŗĐŧĐĩĐŊŅа</string>
|
||||
<string name="revanced_sb_new_segment_confirm_title">ĐĻŅ ĐŋŅавŅĐģŅĐŊŅ ŅаŅ?</string>
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<string name="revanced_sb_new_segment_confirm_content">ĐĄĐĩĐŗĐŧĐĩĐŊŅ Đ°Đ´\n\n%1$s\nда\n%2$s\n\n(%3$s)\n\nĐаŅĐžĐ˛Ņ Đ°Đ´ĐŋŅавŅŅŅ?</string>
|
||||
<string name="revanced_sb_new_segment_start_is_before_end">ĐаŅŅĐŊаŅŅ ŅŅŅйа ŅаĐŊĐĩĐš Са ĐēаĐŊĐĩŅ</string>
|
||||
<string name="revanced_sb_new_segment_mark_locations_first">ĐĄĐŋаŅаŅĐēŅ Đ°Đ´ĐˇĐŊаŅŅĐĩ два ĐŧĐĩŅŅŅ ĐŊа ĐŋаĐŊŅĐģŅ ŅаŅŅ</string>
|
||||
@@ -990,6 +989,11 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_seekbar_custom_color_value_summary">ĐĐžĐģĐĩŅ ĐŋаĐŊŅĐģŅ ĐŋĐžŅŅĐēŅ</string>
|
||||
<string name="revanced_seekbar_custom_color_invalid">ĐŅĐŋŅавŅĐģŅĐŊаĐĩ СĐŊаŅŅĐŊĐŊĐĩ ĐēĐžĐģĐĩŅŅ ĐŋаĐŊŅĐģŅ ĐŋĐžŅŅĐēŅ. ĐŅĐēаŅŅŅŅĐžŅваĐĩŅŅа СĐŊаŅŅĐŊĐŊĐĩ Đŋа СĐŧаŅŅаĐŊĐŊŅ.</string>
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
|
||||
<string name="revanced_bypass_image_region_restrictions_title">ĐĐąŅŅ
Од айĐŧĐĩĐļаваĐŊĐŊŅŅ ŅŅĐŗŅŅĐŊŅ</string>
|
||||
<string name="revanced_bypass_image_region_restrictions_summary_on">ĐŅĐēаŅŅŅŅаĐŊĐŊĐĩ Ņ
аŅŅа вŅдаŅŅŅĐ°Ņ yt4.ggpht.com</string>
|
||||
<string name="revanced_bypass_image_region_restrictions_summary_off">ĐŅĐēаŅŅŅŅаĐŊĐŊĐĩ аŅŅĐŗŅĐŊаĐģŅĐŊĐ°ĐŗĐ° Ņ
аŅŅа вŅдаŅŅŅаŅ\n\nĐŖĐēĐģŅŅŅĐŊĐŊĐĩ ĐŗŅŅаК ĐžĐŋŅŅŅ ĐŧĐžĐļа вŅĐŋŅавŅŅŅ Đ°Đ´ŅŅŅĐŊŅŅаŅŅŅŅ Đ˛ŅдаŅŅŅŅ, ŅĐēŅŅ ĐˇĐ°ĐąĐģаĐēŅŅаваĐŊŅŅ Ņ ĐŊĐĩĐēаŅĐžŅŅŅ
ŅŅĐŗŅŅĐŊаŅ
</string>
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.AlternativeThumbnailsPatch">
|
||||
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||
<string name="revanced_alt_thumbnail_home_title">ĐаĐģĐžŅĐŊĐ°Ņ ŅĐēĐģадĐēа</string>
|
||||
@@ -1030,6 +1034,10 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_announcements_connection_failed">ĐĐĩ ŅдаĐģĐžŅŅ ĐŋадĐēĐģŅŅŅŅŅа да ĐŋаŅŅаŅŅŅŅĐēа ай\"ŅŅ</string>
|
||||
<string name="revanced_announcements_dialog_dismiss">ŅаŅŅĐģайŅŅŅа</string>
|
||||
</patch>
|
||||
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
|
||||
<string name="revanced_check_watch_history_domain_name_dialog_title">ĐŖĐ˛Đ°ĐŗĐ°</string>
|
||||
<string name="revanced_check_watch_history_domain_name_dialog_ignore">ĐĐžĐģŅŅ ĐŊĐĩ ĐŋаĐēаСваŅŅ</string>
|
||||
</patch>
|
||||
<patch id="misc.autorepeat.AutoRepeatPatch">
|
||||
<string name="revanced_auto_repeat_title">ĐŖĐēĐģŅŅŅŅŅ Đ°ŅŅаĐŧаŅŅŅĐŊŅ ĐŋаŅŅĐžŅ</string>
|
||||
<string name="revanced_auto_repeat_summary_on">ĐŅŅаĐŧаŅŅŅĐŊŅ ĐŋаŅŅĐžŅ ŅĐēĐģŅŅаĐŊŅ</string>
|
||||
@@ -1055,10 +1063,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_external_browser_summary_on">ĐĐ´ĐēŅŅŅŅŅ ŅĐŋаŅŅĐģаĐē СвОĐŊĐēŅ</string>
|
||||
<string name="revanced_external_browser_summary_off">ĐĐ´ĐēŅŅŅŅŅ ŅĐŋаŅŅĐģаĐē Ņ ĐŋŅĐ°ĐŗŅаĐŧĐĩ</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
|
||||
<string name="revanced_background_playback_title">ФОĐŊаваĐĩ ĐŋŅĐ°ĐšĐŗŅаваĐŊĐŊĐĩ</string>
|
||||
<string name="revanced_background_playback_summary">ĐŅŅŅŅ ĐŊаĐģĐ°Đ´Ņ ĐŧĐžĐļĐŊа СĐŊаКŅŅŅ Ņ ĐаĐģадаŅ
-> ФОĐŊ</string>
|
||||
</patch>
|
||||
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
|
||||
<string name="revanced_remove_tracking_query_parameter_title">ĐŅдаĐģŅŅŅ ĐŋаŅаĐŧĐĩŅŅ ĐˇĐ°ĐŋŅŅŅ Đ°Đ´ŅĐžŅваĐŊĐŊŅ</string>
|
||||
<string name="revanced_remove_tracking_query_parameter_summary_on">ĐаŅаĐŧĐĩŅŅ ĐˇĐ°ĐŋŅŅŅ Đ°Đ´ŅĐžŅваĐŊĐŊŅ Đ˛ŅдаĐģĐĩĐŊŅ Ņа ŅĐŋаŅŅĐģаĐē</string>
|
||||
@@ -1115,9 +1119,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_spoof_client_summary_on">ĐĐģŅĐĩĐŊŅ ĐŋадŅОйĐģĐĩĐŊŅ</string>
|
||||
<string name="revanced_spoof_client_summary_off">ĐĐģŅĐĩĐŊŅ ĐŊĐĩ ĐŋадŅОйĐģĐĩĐŊŅ\n\nĐŅĐ°ĐšĐŗŅаваĐŊĐŊĐĩ вŅĐ´Ņа ĐŧĐžĐļа ĐŊĐĩ ĐŋŅаŅаваŅŅ</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">ĐĐ´ĐēĐģŅŅŅĐŊĐŊĐĩ ĐŗŅŅаК ĐŊаĐģĐ°Đ´Ņ ĐŧĐžĐļа вŅĐēĐģŅĐēаŅŅ ĐŋŅайĐģĐĩĐŧŅ Đˇ ĐŋŅĐ°ĐšĐŗŅаваĐŊĐŊĐĩĐŧ вŅĐ´Ņа.</string>
|
||||
<string name="revanced_spoof_client_use_ios_title">ĐадŅОйĐēа ĐēĐģŅĐĩĐŊŅа Đ´ĐģŅ iOS</string>
|
||||
<string name="revanced_spoof_client_use_ios_summary_on">ĐĐģŅĐĩĐŊŅ ĐˇĐ°ŅаС ĐŋадŅОйĐģĐĩĐŊŅ ĐŊа iOS\n\nĐайОŅĐŊŅŅ ŅŅĐĩĐēŅŅ ŅĐēĐģŅŅаŅŅŅ:\nâĸ ĐŅĐŧа HDR-вŅĐ´Ņа\nâĸ ĐŅŅŅĐžŅŅŅ ĐŋŅĐ°ĐŗĐģŅĐ´Đ°Ņ ĐŧĐžĐļа ĐŊĐĩ ĐŋŅаŅаваŅŅ\nâĸ ĐĐžĐļа адŅŅŅĐŊŅŅаŅŅ ĐąĐžĐģŅŅ Đ˛ŅŅĐžĐēĐ°Ņ ŅĐēаŅŅŅ Đ˛ŅĐ´Ņа\nâĸ ĐŅвŅŅ ŅŅаĐŊŅĐģŅŅŅŅ ĐŊĐĩ ĐŧĐžĐŗŅŅŅ ĐŋŅĐ°ĐšĐŗŅаваŅŅа ŅĐžĐģŅĐēŅ ŅĐē аŅĐ´ŅŅ\nâĸ ĐŅĐ˛Đ°Ņ ŅŅаĐŊŅĐģŅŅŅŅ ĐŋаŅĐžĐēŅ ĐŊĐĩдаŅŅŅĐŋĐŊŅŅ ĐŊа Android 8.0</string>
|
||||
<string name="revanced_spoof_client_use_ios_summary_off">ĐĐģŅĐĩĐŊŅ Ņ ŅŅĐŋĐĩŅаŅĐŊŅ ŅĐ°Ņ ĐŋадŅОйĐģĐĩĐŊŅ Đ´ĐģŅ Android VR\n\nĐайОŅĐŊŅŅ ŅŅĐĩĐēŅŅ ŅĐēĐģŅŅаŅŅŅ:\nâĸ ĐŅĐŧа HDR-вŅĐ´Ņа\nâĸ ĐСŅŅŅŅŅŅ Đ˛ŅĐ´Ņа ĐŊĐĩ ĐŋŅĐ°ĐšĐŗŅаваŅŅŅа\nâĸ ĐŅŅĐŋŅĐŊĐĩĐŊŅŅ Đ˛ŅĐ´Ņа ĐŧĐžĐŗŅŅŅ Đ°Đ´ĐŊаŅĐģŅŅŅа вŅĐŋадĐēОвŅĐŧ ŅŅĐŊаĐŧ\nâĸ ĐŅСĐēĐ°Ņ ŅĐēаŅŅŅ ĐŧŅĐŊŅŅŅŅŅ ĐŊа ĐŋаĐŊŅĐģŅ ĐŋĐžŅŅĐēŅ Shorts\nâĸ ĐĐŊĐžĐŋĐēа дСĐĩŅĐŊĐŊŅ ĐĄĐŋаĐŧĐŋаваŅŅ ĐˇĐ°ŅŅŅĐ´Ņ ŅŅ
аваĐŊа\nâĸ ĐаŅŅĐēŅ ĐēаĐŊŅĐ°Đ˛ĐžĐŗĐ° ŅĐēŅаĐŊа СаŅŅŅĐ´Ņ ŅŅ
аваĐŊŅ</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">ĐŅĐŊŅŅŅŅŅŅ ĐēĐģŅĐĩĐŊŅа Spoof ĐŊĐĩдаŅŅŅĐŋĐŊŅŅ (ŅĐ°Ņ ŅаĐēаĐŊĐŊŅ API ŅĐēĐžĐŊŅŅŅŅŅ)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">ĐŅĐŊŅŅŅŅŅŅ ĐēĐģŅĐĩĐŊŅа Spoof ŅаŅОва ĐŊĐĩдаŅŅŅĐŋĐŊŅŅ: %s</string>
|
||||
</patch>
|
||||
@@ -1166,6 +1167,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_twitch_debug_mode_summary_off">Đ ŅĐļŅĐŧ адĐģадĐēŅ Twitch адĐēĐģŅŅаĐŊŅ</string>
|
||||
</patch>
|
||||
<patch id="misc.settings.SettingsPatch">
|
||||
<string name="revanced_settings">ĐаĐģĐ°Đ´Ņ ReVanced</string>
|
||||
<string name="revanced_ads_screen_title">ĐĐą\"ŅвŅ</string>
|
||||
<string name="revanced_ads_screen_summary">ĐаĐģĐ°Đ´Ņ ĐąĐģаĐēŅŅĐžŅĐēŅ ŅŅĐēĐģаĐŧŅ</string>
|
||||
<string name="revanced_chat_screen_title">ЧаŅ</string>
|
||||
|
||||
@@ -45,12 +45,20 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="misc.gms.BaseGmsCoreSupportResourcePatch">
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="gms_core_toast_not_installed_message">GmsCore ĐŊĐĩ Đĩ иĐŊŅŅаĐģиŅаĐŊ. ĐĐŊŅŅаĐģиŅаКŅĐĩ ĐŗĐž.</string>
|
||||
<string name="gms_core_dialog_title">ĐŅĐļĐŊĐž Đĩ Đ´ĐĩĐšŅŅвиĐĩ</string>
|
||||
<string name="gms_core_dialog_not_whitelisted_not_allowed_in_background_message">MicroG GmsCore ĐŊĐĩ ĐŧĐžĐļĐĩ да ŅайОŅи вŅв ŅĐžĐŊОв ŅĐĩĐļиĐŧ.\n\nĐĐžĐģŅ, ŅĐģĐĩдваКŅĐĩ ŅŅĐēОвОдŅŅвОŅĐž \"Don\'t kill my appâ Са ваŅĐ¸Ņ ŅĐĩĐģĐĩŅĐžĐŊ и ĐŋŅиĐģĐžĐļĐĩŅĐĩ иĐŊŅŅŅŅĐēŅииŅĐĩ ĐŊа MicroG.\n\nĐĸОва Đĩ ĐŊĐĩОйŅ
ОдиĐŧĐž, Са да ŅайОŅи ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž.</string>
|
||||
<string name="gms_core_dialog_open_website_text">ĐŅвОŅи ŅаКŅа</string>
|
||||
<string name="gms_core_dialog_not_whitelisted_using_battery_optimizations_message">Đа да иСйĐĩĐŗĐŊĐĩŅĐĩ ĐŋŅОйĐģĐĩĐŧи Đĩ ĐŊĐĩОйŅ
ОдиĐŧĐž да иСĐēĐģŅŅиŅĐĩ ĐžĐŋŅиĐŧиСаŅиŅŅа ĐŊа йаŅĐĩŅиŅŅа Са GmsCore.\n\nĐаŅиŅĐŊĐĩŅĐĩ \"ĐŅОдОĐģĐļи\" и иСĐēŅŅĐĩŅĐĩ ĐžĐŋŅиĐŧиСаŅиŅŅа ĐŊа йаŅĐĩŅиŅŅа.</string>
|
||||
<string name="gms_core_dialog_continue_text">ĐŅОдŅĐģĐļи</string>
|
||||
</patch>
|
||||
</app>
|
||||
<app id="youtube">
|
||||
<patch id="misc.settings.SettingsResourcePatch">
|
||||
<string name="revanced_settings_about_links_body">ĐиĐĩ иСĐŋĐžĐģСваŅĐĩ вĐĩŅŅиŅŅа ĐŊа ReVanced Patches<i>%s</i></string>
|
||||
<string name="revanced_settings_about_links_dev_header">ĐайĐĩĐģĐĩĐļĐēа</string>
|
||||
<string name="revanced_settings_about_links_dev_body">ĐĸаСи вĐĩŅŅĐ¸Ņ Đĩ ĐŋŅĐĩдваŅиŅĐĩĐģĐŊа, ŅаĐēа ŅĐĩ ĐŧĐžĐļĐĩ да ŅŅĐĩŅĐŊĐĩŅĐĩ ĐŊĐĩĐžŅаĐēваĐŊи ĐŋŅОйĐģĐĩĐŧи</string>
|
||||
<string name="revanced_settings_about_links_header">ĐŅиŅиаĐģĐŊи ĐģиĐŊĐēОвĐĩ</string>
|
||||
<string name="revanced_pref_import_export_title">ĐĐŧĐŋĐžŅŅиŅаĐŊĐĩ / ĐĐēŅĐŋĐžŅŅиŅаĐŊĐĩ</string>
|
||||
<string name="revanced_pref_import_export_summary">ĐĐŧĐŋĐžŅŅиŅаĐŊĐĩ / ĐĐēŅĐŋĐžŅŅиŅаĐŊĐĩ ĐŊа ReVanced ĐŊаŅŅŅОКĐēиŅĐĩ</string>
|
||||
</patch>
|
||||
@@ -62,7 +70,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_settings_screen_04_player_title">ĐĐģĐĩĐšŅŅ</string>
|
||||
<string name="revanced_settings_screen_05_general_title">ĐĐąŅĐž ĐžŅĐžŅĐŧĐģĐĩĐŊиĐĩ</string>
|
||||
<string name="revanced_settings_screen_06_shorts_title">Shorts</string>
|
||||
<string name="revanced_settings_screen_07_seekbar_title">Seekbar</string>
|
||||
<string name="revanced_settings_screen_07_seekbar_title">ĐĐĩĐŊŅа Са ĐŋŅĐžĐŗŅĐĩŅ ĐŊа видĐĩĐžŅĐž</string>
|
||||
<string name="revanced_settings_screen_08_swipe_controls_title">ĐĐžĐŊŅŅĐžĐģи Ņ ĐŋĐģŅĐˇĐŗĐ°ĐŊĐĩ</string>
|
||||
<string name="revanced_settings_screen_11_misc_title">РаСĐŊи</string>
|
||||
<string name="revanced_settings_screen_12_video_title">ĐидĐĩĐž</string>
|
||||
@@ -85,28 +93,39 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_debug_toast_on_error_user_dialog_message">ĐĐēĐž иСĐēĐģŅŅиŅĐĩ ŅиŅŅĐĩĐŧĐŊиŅĐĩ ŅŅОйŅĐĩĐŊиŅ, ŅĐĩ ŅĐēŅиĐĩŅĐĩ вŅиŅĐēи ŅвĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ ĐˇĐ° ReVanced ĐŗŅĐĩŅĐēи. \n\nĐŅĐŧа да ĐąŅĐ´ĐĩŅĐĩ ŅвĐĩĐ´ĐžĐŧĐĩĐŊи, аĐēĐž ĐŊаŅŅŅĐŋŅŅ ĐŊĐĩĐžŅаĐēваĐŊи ŅŅйиŅиŅ.</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.general.HideLayoutComponentsPatch">
|
||||
<string name="revanced_disable_like_subscribe_glow_title">ĐĐĩаĐēŅивиŅаКŅĐĩ ĐŋОдŅвĐĩŅĐēаŅа ĐŊа ĐąŅŅĐžĐŊа ĐĨаŅĐĩŅваĐŧ /ĐйОĐŊаĐŧĐĩĐŊŅ</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_on">ĐŅŅĐžĐŊиŅĐĩ âĐĨаŅĐĩŅваĐŧâ и âĐйОĐŊиŅаĐŊĐĩâ ĐŊŅĐŧа да ŅвĐĩŅŅŅ, ĐēĐžĐŗĐ°ŅĐž ĐąŅĐ´Đ°Ņ ĐŊаŅиŅĐŊаŅи</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_off">ĐŅŅĐžĐŊиŅĐĩ âĐĨаŅĐĩŅваĐŧâ и âĐйОĐŊиŅаĐŊĐĩâ ŅĐĩ ŅвĐĩŅŅŅ, ĐēĐžĐŗĐ°ŅĐž ĐąŅĐ´Đ°Ņ ĐŊаŅиŅĐŊаŅи</string>
|
||||
<string name="revanced_hide_gray_separator_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅĐ¸Đ˛Đ¸Ņ ŅаСдĐĩĐģиŅĐĩĐģ</string>
|
||||
<string name="revanced_hide_gray_separator_summary_on">ХивиŅĐĩ ŅаСдĐĩĐģиŅĐĩĐģи Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_gray_separator_summary_off">ХивиŅĐĩ ŅаСдĐĩĐģиŅĐĩĐģи Ņа ĐŋĐžĐēаСаĐŊи</string>
|
||||
<string name="revanced_hide_channel_watermark_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа вОдĐŊĐ¸Ņ ĐˇĐŊаĐē ĐŊа ĐēаĐŊаĐģа</string>
|
||||
<string name="revanced_hide_channel_watermark_summary_on">ĐОдĐŊиŅŅ ĐˇĐŊаĐē Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_channel_watermark_summary_off">ĐОдĐŊиŅŅ ĐˇĐŊаĐē Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
<string name="revanced_hide_horizontal_shelves_title">ĐĨĐžŅиСОĐŊŅаĐģĐŊи ŅĐĩĐēŅии</string>
|
||||
<string name="revanced_hide_horizontal_shelves_summary_on">ĐĨĐžŅиСОĐŊŅаĐģĐŊиŅĐĩ ŅĐĩĐēŅии Ņа ŅĐēŅиŅи:\nâĸ ĐСвŅĐŊŅĐĩĐ´ĐŊи ĐŊОвиĐŊи\nâĸ ĐŅОдŅĐģĐļĐĩŅĐĩ да ĐŗĐģĐĩдаŅĐĩ\nâĸ Đ Đ°ĐˇĐŗĐģĐĩдаКŅĐĩ ĐžŅĐĩ ĐēаĐŊаĐģи\nâĸ ĐаСаŅŅваĐŊĐĩ\nâĸ ĐĐģĐĩдаКŅĐĩ ĐžŅĐŊОвО</string>
|
||||
<string name="revanced_hide_horizontal_shelves_summary_off">ĐĨĐžŅиСОĐŊŅаĐģĐŊи ŅĐĩĐēŅии ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<!-- 'Join' should be translated using the same localized wording YouTube displays.
|
||||
This appears in the video player for certain videos. -->
|
||||
<string name="revanced_hide_join_membership_button_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐąŅŅĐžĐŊа \'ĐŅиŅŅĐĩдиĐŊи ŅĐĩ\'</string>
|
||||
<string name="revanced_hide_join_membership_button_summary_on">ĐŅŅĐžĐŊŅŅ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_join_membership_button_summary_off">ĐŅŅĐžĐŊŅŅ Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_for_you_shelf_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅĐĩĐēŅиŅŅа \'Đа ваŅ\' в ŅŅŅаĐŊиŅаŅа ĐŊа ĐēаĐŊаĐģа</string>
|
||||
<string name="revanced_hide_for_you_shelf_summary_on">РаŅŅŅŅ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_for_you_shelf_summary_off">РаŅŅŅŅ Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<string name="revanced_hide_notify_me_button_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐąŅŅĐžĐŊа \"ĐŖĐ˛ĐĩĐ´ĐžĐŧи ĐŧĐĩ\"</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">ĐŅŅĐžĐŊŅŅ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">ĐŅŅĐžĐŊŅŅ Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
<!-- 'People also watch' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐŋŅĐĩĐŋĐžŅŅĐēиŅĐĩ \'ĐŅŅĐŗĐ¸ Ņ
аŅĐĩŅĐ˛Đ°Ņ ŅŅŅĐž\'</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">ĐŅĐĩĐŋĐžŅŅĐēиŅĐĩ Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">ĐŅĐĩĐŋĐžŅŅĐēиŅĐĩ Ņа ĐŋĐžĐēаСаĐŊи</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐąŅŅĐžĐŊа \"ĐĐžĐēаĐļи ĐžŅĐĩ\"</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">ĐŅŅĐžĐŊŅŅ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">ĐŅŅĐžĐŊŅŅ Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
<string name="revanced_hide_timed_reactions_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа вŅĐĩĐŧĐĩвиŅĐĩ ŅĐĩаĐēŅии</string>
|
||||
@@ -157,6 +176,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_bar_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐģĐĩĐŊŅаŅа ĐŊа ĐēаĐŊаĐģа</string>
|
||||
<string name="revanced_hide_channel_bar_summary_on">ĐĐĩĐŊŅаŅа ĐŊа ĐēаĐŊаĐģа Đĩ ŅĐēŅиŅа</string>
|
||||
<string name="revanced_hide_channel_bar_summary_off">ĐĐĩĐŊŅаŅа ĐŊа ĐēаĐŊаĐģа Đĩ ĐŋĐžĐēаСаĐŊа</string>
|
||||
<string name="revanced_hide_playables_title">ĐĐŗŅи в YouTube</string>
|
||||
<string name="revanced_hide_playables_summary_on">ĐĐŗŅи в YouTube Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_playables_summary_off">ĐĐŗŅиŅĐĩ в YouTube ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<string name="revanced_hide_quick_actions_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐąŅŅСиŅĐĩ Đ´ĐĩĐšŅŅĐ˛Đ¸Ņ Đ˛ ŅĐĩĐļиĐŧ ĐŊа ŅŅĐģ ĐĩĐēŅаĐŊ</string>
|
||||
<string name="revanced_hide_quick_actions_summary_on">ĐŅŅСиŅĐĩ Đ´ĐĩĐšŅŅĐ˛Đ¸Ņ Đ˛ ŅĐĩĐļиĐŧ ĐŊа ŅŅĐģ ĐĩĐēŅаĐŊ Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_quick_actions_summary_off">ĐŅŅСиŅĐĩ Đ´ĐĩĐšŅŅĐ˛Đ¸Ņ Đ˛ ŅĐĩĐļиĐŧ ĐŊа ŅŅĐģ ĐĩĐēŅаĐŊ Ņа ĐŋĐžĐēаСаĐŊи</string>
|
||||
@@ -178,9 +200,22 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_chips_shelf_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅаŅŅа Са ŅиĐŋОвĐĩ</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">РаŅŅŅŅ ĐˇĐ° ŅиĐŋОвĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">РаŅŅŅŅ ĐˇĐ° ŅиĐŋОвĐĩ Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
<string name="revanced_hide_attributes_section_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅĐĩĐēŅиŅŅа Ņ Đ°ŅŅийŅŅи</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">âĐĐžĐŋŅĐģŅŅĐŊи ĐŧĐĩŅŅаâ, âĐĐŗŅиâ и âĐŅСиĐēаâ ĐŋОд ĐžĐŋиŅаĐŊиĐĩŅĐž Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">âĐĐžĐŋŅĐģŅŅĐŊи ĐŧĐĩŅŅаâ, âĐĐŗŅиâ и âĐŅСиĐēаâ ĐŋОд ĐžĐŋиŅаĐŊиĐĩŅĐž ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<string name="revanced_hide_chapters_section_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅĐĩĐēŅиŅŅа Ņ ĐˇĐ°ĐŗĐģавиŅ</string>
|
||||
<string name="revanced_hide_chapters_section_summary_on">ĐĄĐĩĐēŅиŅŅа Ņ ĐˇĐ°ĐŗĐģĐ°Đ˛Đ¸Ņ Đĩ ŅĐēŅиŅа</string>
|
||||
<string name="revanced_hide_chapters_section_summary_off">ĐĄĐĩĐēŅиŅŅа Ņ ĐˇĐ°ĐŗĐģĐ°Đ˛Đ¸Ņ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_podcast_section_title">ĐĄĐēŅиваĐŊĐĩ ŅĐĩĐēŅиŅŅа âĐ Đ°ĐˇĐŗĐģĐĩдаКŅĐĩ ĐŋОдĐēаŅŅаâ</string>
|
||||
<string name="revanced_hide_podcast_section_summary_on">\"Đ Đ°ĐˇĐŗĐģĐĩдаКŅĐĩ ĐŋОдĐēаŅŅа\" Đĩ ŅĐēŅиŅа</string>
|
||||
<string name="revanced_hide_podcast_section_summary_off">\"Đ Đ°ĐˇĐŗĐģĐĩдаКŅĐĩ ĐŋОдĐēаŅŅа\" ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_info_cards_section_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅаСдĐĩĐģа Са иĐŊŅĐžŅĐŧаŅиОĐŊĐŊи ĐēаŅŅи</string>
|
||||
<string name="revanced_hide_info_cards_section_summary_on">РаСдĐĩĐģŅŅ ĐˇĐ° иĐŊŅĐžŅĐŧаŅиОĐŊĐŊи ĐēаŅŅи Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_info_cards_section_summary_off">РаСдĐĩĐģŅŅ ĐˇĐ° иĐŊŅĐžŅĐŧаŅиОĐŊĐŊи ĐēаŅŅи Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
<string name="revanced_hide_key_concepts_section_title">РаСдĐĩĐģ âĐĐģŅŅОви ĐŋĐžĐŊŅŅиŅâ</string>
|
||||
<string name="revanced_hide_key_concepts_section_summary_on">РаСдĐĩĐģ âĐĐģŅŅОви ĐŋĐžĐŊŅŅиŅâ Ņа ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_key_concepts_section_summary_off">РаСдĐĩĐģ âĐĐģŅŅОви ĐŋĐžĐŊŅŅиŅâ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_transcript_section_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅаСдĐĩĐģа Са ŅŅаĐŊŅĐēŅиĐŋŅиŅ</string>
|
||||
<string name="revanced_hide_transcript_section_summary_on">РаСдĐĩĐģŅŅ ĐˇĐ° ŅŅаĐŊŅĐēŅиĐŋŅĐ¸Ņ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_transcript_section_summary_off">РаСдĐĩĐģŅŅ ĐˇĐ° ŅŅаĐŊŅĐēŅиĐŋŅĐ¸Ņ Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
<string name="revanced_hide_description_components_screen_title">ĐĐŋиŅаĐŊиĐĩ ĐŊа видĐĩĐžŅĐž</string>
|
||||
@@ -200,6 +235,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_keyword_content_home_summary_on">ĐидĐĩĐžĐēĐģиĐŋОвĐĩŅĐĩ ĐŊа ĐŊаŅаĐģĐŊĐ¸Ņ ĐĩĐēŅаĐŊ Ņа ŅиĐģŅŅиŅаĐŊи Ņ ĐēĐģŅŅОви Đ´ŅĐŧи</string>
|
||||
<string name="revanced_hide_keyword_content_home_summary_off">ĐидĐĩĐžĐēĐģиĐŋОвĐĩŅĐĩ ĐŊа ĐŊаŅаĐģĐŊĐ¸Ņ ĐĩĐēŅаĐŊ ĐŊĐĩ Ņа ŅиĐģŅŅиŅаĐŊи Ņ ĐēĐģŅŅОви Đ´ŅĐŧи</string>
|
||||
<string name="revanced_hide_keyword_content_subscriptions_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа видĐĩĐžĐēĐģиĐŋОвĐĩ ĐžŅ Đ°ĐąĐžĐŊаĐŧĐĩĐŊŅи Ņ ĐēĐģŅŅОви Đ´ŅĐŧи</string>
|
||||
<string name="revanced_hide_keyword_content_subscriptions_summary_on">ĐидĐĩĐžĐēĐģиĐŋОвĐĩŅĐĩ в ŅаСдĐĩĐģа Са айОĐŊаĐŧĐĩĐŊŅи Ņа Ņа ŅиĐģŅŅиŅаĐŊи Ņ ĐēĐģŅŅОви Đ´ŅĐŧи</string>
|
||||
<string name="revanced_hide_keyword_content_subscriptions_summary_off">ĐидĐĩĐžĐēĐģиĐŋОвĐĩŅĐĩ в ŅаСдĐĩĐģа Са айОĐŊаĐŧĐĩĐŊŅи Ņа Ņа ŅиĐģŅŅиŅаĐŊи Ņ ĐēĐģŅŅОви Đ´ŅĐŧи</string>
|
||||
<string name="revanced_hide_keyword_content_search_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅĐĩСŅĐģŅаŅи ĐžŅ ŅŅŅŅĐĩĐŊĐ¸Ņ Ņ ĐēĐģŅŅОви Đ´ŅĐŧи</string>
|
||||
<string name="revanced_hide_keyword_content_search_summary_on">Đ ĐĩСŅĐģŅаŅиŅĐĩ ĐžŅ ŅŅŅŅĐĩĐŊĐ¸Ņ Ņа ŅиĐģŅŅиŅаĐŊи Ņ ĐēĐģŅŅОви Đ´ŅĐŧи</string>
|
||||
@@ -211,16 +247,24 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_keyword_content_about_title">Đа ŅиĐģŅŅиŅаĐŊĐĩ Ņ ĐēĐģŅŅОви Đ´ŅĐŧи</string>
|
||||
<string name="revanced_hide_keyword_content_about_summary">ĐаŅаĐģĐž/ĐйОĐŊаĐŧĐĩĐŊŅ/Đ ĐĩСŅĐģŅаŅиŅĐĩ ĐžŅ ŅŅŅŅĐĩĐŊĐĩŅĐž ŅĐĩ ŅиĐģŅŅиŅаŅ, Са да ŅĐĩ ŅĐēŅиĐĩ ŅŅĐ´ŅŅĐļаĐŊиĐĩŅĐž, ĐēĐžĐĩŅĐž ŅŅĐžŅвĐĩŅŅŅва ĐŊа ĐēĐģŅŅОвиŅĐĩ ŅŅаСи\n\nĐĐŗŅаĐŊиŅĐĩĐŊиŅ\nâĸ ĐŅĐēОи ĐēŅаŅĐēи видĐĩĐžĐēĐģиĐŋОвĐĩ ĐŧĐžĐļĐĩ да ĐŊĐĩ Ņа ŅĐēŅиŅи\nâĸ ĐŅĐēОи ĐēĐžĐŧĐŋĐžĐŊĐĩĐŊŅи ĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģŅĐēĐ¸Ņ Đ¸ĐŊŅĐĩŅŅĐĩĐšŅ ĐŧĐžĐļĐĩ да ĐŊĐĩ Ņа ŅĐēŅиŅи\nâĸ ĐĸŅŅŅĐĩĐŊĐĩŅĐž ĐŊа ĐēĐģŅŅОва Đ´ŅĐŧа ĐŧĐžĐļĐĩ да ĐŊĐĩ ĐŋĐžĐēаĐļĐĩ ŅĐĩСŅĐģŅаŅи</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_keyword_toast_invalid_common">ĐĐĩваĐģидĐŊа Đ´ŅĐŧа. ĐĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ иСĐŋĐžĐģСва: \'%s\' ĐēаŅĐž ŅиĐģŅŅŅ</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_keyword_toast_invalid_length">ĐĐĩваĐģидĐŊа ĐēĐģŅŅОва Đ´ŅĐŧа. %1$s Đĩ ĐŋĐž-ĐŧаĐģĐēĐž ĐžŅ %2$d СĐŊаĐēа</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">ĐĐģŅŅОваŅа Đ´ŅĐŧа \'%s\' ŅĐĩ ŅĐēŅиĐĩ вŅиŅĐēи видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
|
||||
</patch>
|
||||
<patch id="ad.general.HideAdsResourcePatch">
|
||||
<string name="revanced_hide_general_ads_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ОйŅиŅĐĩ ŅĐĩĐēĐģаĐŧи</string>
|
||||
<string name="revanced_hide_general_ads_summary_on">ĐĐąŅиŅĐĩ ŅĐĩĐēĐģаĐŧи Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_general_ads_summary_off">ĐĐąŅиŅĐĩ ŅĐĩĐēĐģаĐŧи Ņа ĐŋĐžĐēаСаĐŊи</string>
|
||||
<string name="revanced_hide_fullscreen_ads_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅĐĩĐēĐģаĐŧиŅĐĩ в ŅĐĩĐļиĐŧ ĐŊа ŅŅĐģ ĐĩĐēŅаĐŊ</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">Đ ĐĩĐēĐģаĐŧиŅĐĩ ĐŊа ŅŅĐģ ĐĩĐēŅаĐŊ Ņа ŅĐēŅиŅи\n\in ĐĸаСи ŅŅĐŊĐēŅĐ¸Ņ Đĩ Đ´ĐžŅŅŅĐŋĐŊа ŅаĐŧĐž Са ĐŋĐž-ŅŅаŅи ŅŅŅŅОКŅŅва</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Đ ĐĩĐēĐģаĐŧиŅĐĩ в ŅĐĩĐļиĐŧ ĐŊа ŅŅĐģ ĐĩĐēŅаĐŊ Ņа ĐŋĐžĐēаСаĐŊи</string>
|
||||
<string name="revanced_hide_buttoned_ads_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅĐĩĐēĐģаĐŧĐŊи ĐąŅŅĐžĐŊи</string>
|
||||
<string name="revanced_hide_buttoned_ads_summary_on">Đ ĐĩĐēĐģаĐŧиŅĐĩ ĐēаŅĐž ĐąŅŅĐžĐŊ Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_buttoned_ads_summary_off">Đ ĐĩĐēĐģаĐŧиŅĐĩ ĐēаŅĐž ĐąŅŅĐžĐŊ Ņа ĐŋĐžĐēаСаĐŊи</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐŋĐģаŅĐĩĐŊиŅĐĩ ĐŋŅĐžĐŧĐžŅии</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">ĐŅĐžĐŧĐžŅиОĐŊаĐģĐŊиŅĐĩ ĐĩŅиĐēĐĩŅи Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">ĐŅĐžĐŧĐžŅиОĐŊаĐģĐŊиŅĐĩ ĐĩŅиĐēĐĩŅи ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅаĐŧĐžŅĐŋĐžĐŊŅĐžŅиŅаĐŊи ĐēаŅŅи</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_on">ХаĐŧĐžŅĐŋĐžĐŊŅĐžŅиŅаĐŊиŅĐĩ ĐēаŅŅи Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_summary_off">ХаĐŧĐžŅĐŋĐžĐŊŅĐžŅиŅаĐŊиŅĐĩ ĐēаŅŅи Ņа ĐŋĐžĐēаСаĐŊи</string>
|
||||
@@ -231,6 +275,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shopping_links_summary_on">ĐŅŅСĐēиŅĐĩ Са ĐŋаСаŅŅваĐŊĐĩ Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">ĐŅŅСĐēиŅĐĩ Са ĐŋаСаŅŅваĐŊĐĩ Ņа ĐŋĐžĐēаСаĐŊи</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">ĐĄĐēŅиКŅĐĩ ĐąŅŅĐžĐŊа âĐĐžŅĐĩŅĐĩŅĐĩ ĐŧĐ°ĐŗĐ°ĐˇĐ¸ĐŊаâ ĐŊа ŅŅŅаĐŊиŅиŅĐĩ ĐŊа ĐēаĐŊаĐģиŅĐĩ</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">ĐŅŅĐžĐŊŅŅ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_off">ĐŅŅĐžĐŊŅŅ Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
<string name="revanced_hide_web_search_results_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅĐĩСŅĐģŅаŅиŅĐĩ ĐžŅ ŅĐĩĐą ŅŅŅŅĐĩĐŊĐĩŅĐž</string>
|
||||
@@ -240,6 +285,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_merchandise_banners_summary_on">ĐаĐŊĐĩŅиŅĐĩ Са ŅŅĐžĐēи Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_merchandise_banners_summary_off">ĐаĐŊĐĩŅиŅĐĩ Са ŅŅĐžĐēи Ņа ĐŋĐžĐēаСаĐŊи</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">ĐĄĐēŅ. ĐŊа ŅĐĩĐēĐģаĐŧи ĐŊа ŅŅĐģ ĐĩĐēŅаĐŊ, Са ĐŋĐž-ŅŅаŅи ŅŅŅŅОКŅŅва</string>
|
||||
</patch>
|
||||
<patch id="ad.getpremium.HideGetPremiumPatch">
|
||||
<string name="revanced_hide_get_premium_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа YouTube Premium ĐŋŅĐžĐŧĐžŅии</string>
|
||||
@@ -255,14 +301,17 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_share_copy_url_success">URL адŅĐĩŅŅŅ Đĩ ĐēĐžĐŋиŅаĐŊ в ĐēĐģиĐŋйОŅда</string>
|
||||
<string name="revanced_share_copy_url_timestamp_success">URL адŅĐĩŅŅŅ Ņ Đ˛ŅĐĩĐŧĐĩви ĐžŅĐŋĐĩŅаŅŅĐē Đĩ ĐēĐžĐŋиŅаĐŊ</string>
|
||||
<string name="revanced_copy_video_url_title">ĐĐžĐēаСваĐŊĐĩ ĐŊа ĐąŅŅĐžĐŊа Са ĐēĐžĐŋиŅаĐŊĐĩ ĐŊа URL адŅĐĩŅа ĐŊа видĐĩĐžĐēĐģиĐŋа</string>
|
||||
<string name="revanced_copy_video_url_summary_on">ĐĐžĐēаСаĐŊ Đĩ ĐąŅŅĐžĐŊ. ĐĐžĐēĐžŅĐŊĐĩŅĐĩ, Са да ĐēĐžĐŋиŅаŅĐĩ URL ĐŊа видĐĩĐžŅĐž. ĐĐžĐēĐžŅĐŊĐĩŅĐĩ и СадŅŅĐļŅĐĩ, Са да ĐēĐžĐŋиŅаŅĐĩ URL адŅĐĩŅа ĐŊа видĐĩĐžĐēĐģиĐŋа Ņ ĐēĐģĐĩĐšĐŧĐž Са вŅĐĩĐŧĐĩ</string>
|
||||
<string name="revanced_copy_video_url_summary_off">ĐŅŅĐžĐŊŅŅ ĐŊĐĩ Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
<string name="revanced_copy_video_url_timestamp_title">ĐĐžĐēаСваĐŊĐĩ ĐŊа ĐąŅŅĐžĐŊа Са ĐēĐžĐŋиŅаĐŊĐĩ ĐŊа URL адŅĐĩŅа ĐŊа вŅĐĩĐŧĐĩĐ˛Đ¸Ņ ĐžŅĐŋĐĩŅаŅŅĐē ĐŊа видĐĩĐžĐēĐģиĐŋа</string>
|
||||
<string name="revanced_copy_video_url_timestamp_summary_on">ĐĐžĐēаСаĐŊ Đĩ ĐąŅŅĐžĐŊ. ĐĐžĐēĐžŅĐŊĐĩŅĐĩ, Са да ĐēĐžĐŋиŅаŅĐĩ URL адŅĐĩŅа ĐŊа видĐĩĐžĐēĐģиĐŋа Ņ ĐēĐģĐĩĐšĐŧĐž Са вŅĐĩĐŧĐĩ. ĐĐžĐēĐžŅĐŊĐĩŅĐĩ и СадŅŅĐļŅĐĩ, Са да ĐēĐžĐŋиŅаŅĐĩ видĐĩĐžĐēĐģиĐŋ ĐąĐĩС ĐēĐģĐĩĐšĐŧĐž Са вŅĐĩĐŧĐĩ</string>
|
||||
<string name="revanced_copy_video_url_timestamp_summary_off">ĐŅŅĐžĐŊŅŅ ĐŊĐĩ Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
</patch>
|
||||
<patch id="interaction.dialog.RemoveViewerDiscretionDialogPatch">
|
||||
<string name="revanced_remove_viewer_discretion_dialog_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐŋŅОСОŅĐĩŅа Са вŅСŅаŅŅОвО ĐžĐŗŅаĐŊиŅĐĩĐŊиĐĩ</string>
|
||||
<string name="revanced_remove_viewer_discretion_dialog_summary_on">ĐиаĐģĐžĐŗĐžĐ˛Đ¸ŅŅ ĐŋŅОСОŅĐĩŅ ŅĐĩ ĐąŅĐ´Đĩ ĐŋŅĐĩĐŧаŅ
ĐŊаŅ</string>
|
||||
<string name="revanced_remove_viewer_discretion_dialog_summary_off">ĐиаĐģĐžĐŗĐžĐ˛Đ¸ŅŅ ĐŋŅОСОŅĐĩŅ ŅĐĩ ĐąŅĐ´Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
<string name="revanced_remove_viewer_discretion_dialog_user_dialog_message">ĐĸаСи ŅŅĐŊĐēŅĐ¸Ņ ĐŊĐĩ СаОйиĐēаĐģŅ Đ˛ŅСŅаŅŅОвОŅĐž ĐžĐŗŅаĐŊиŅĐĩĐŊиĐĩ. ĐĸŅ ĐŋŅĐžŅŅĐž ĐŋŅиĐĩĐŧа вŅСŅаŅŅОваŅа ĐŗŅаĐŊиŅа авŅĐžĐŧаŅиŅĐŊĐž.</string>
|
||||
</patch>
|
||||
<patch id="interaction.downloads.DownloadsResourcePatch">
|
||||
<string name="revanced_external_downloader_screen_title">ĐŅĐŊŅĐŊи иСŅĐĩĐŗĐģŅĐŊиŅ</string>
|
||||
@@ -276,6 +325,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_external_downloader_action_button_summary_off">ĐŅŅĐžĐŊŅŅ ĐˇĐ° иСŅĐĩĐŗĐģŅĐŊĐĩ ĐžŅваŅŅ Đ˛ĐŗŅадĐĩĐŊĐžŅĐž ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ Са иСŅĐĩĐŗĐģŅĐŊĐĩ</string>
|
||||
<string name="revanced_external_downloader_name_title">ĐĐŧĐĩ ĐŊа ĐŋаĐēĐĩŅа ĐŊа иСŅĐĩĐŗĐģŅŅĐžŅĐž ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩ</string>
|
||||
<string name="revanced_external_downloader_name_summary">ĐĐŧĐĩ ĐŊа ĐŋаĐēĐĩŅа ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž Са иСŅĐĩĐŗĐģŅĐŊĐĩ, ĐēаŅĐž NewPipe иĐģи Seal</string>
|
||||
<string name="revanced_external_downloader_not_installed_warning">%s ĐŊĐĩ Đĩ иĐŊŅŅаĐģиŅаĐŊ. ĐĐŊŅŅаĐģиŅаКŅĐĩ ĐŗĐž.</string>
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.DisablePreciseSeekingGesturePatch">
|
||||
<string name="revanced_disable_precise_seeking_gesture_title">ĐĐĩаĐēŅивиŅаĐŊĐĩ ĐŊа ĐļĐĩŅŅа Са ŅĐžŅĐŊĐž ŅŅŅŅĐĩĐŊĐĩ</string>
|
||||
@@ -303,6 +353,10 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_swipe_save_and_restore_brightness_title">ĐаĐŋаСваĐŊĐĩ и вŅСŅŅаĐŊОвŅваĐŊĐĩ ĐŊа ŅŅĐēĐžŅŅŅа</string>
|
||||
<string name="revanced_swipe_save_and_restore_brightness_summary_on">ĐаĐŋаСваĐŊĐĩ и вŅСŅŅаОвŅваĐŊĐĩ ŅŅĐēĐžŅŅŅа ĐŋŅи вĐēĐģŅŅваĐŊĐĩ иĐģи иСĐēĐģŅŅваĐŊĐĩ ĐŊа ŅŅĐģ ĐĩĐēŅаĐŊ</string>
|
||||
<string name="revanced_swipe_save_and_restore_brightness_summary_off">ĐĐĩ ŅĐĩ СаĐŋаСва иĐģи вŅСŅŅаОвŅва ŅŅĐēĐžŅŅŅа ĐŋŅи вĐēĐģŅŅваĐŊĐĩ иĐģи иСĐēĐģŅŅваĐŊĐĩ ĐŊа ŅŅĐģ ĐĩĐēŅаĐŊ</string>
|
||||
<string name="revanced_swipe_lowest_value_enable_auto_brightness_title">ĐадаваĐŊĐĩ ĐŊа ŅŅĐēĐžŅŅ ŅŅĐĩС ĐŋĐģŅĐˇĐŗĐ°ĐŊĐĩ</string>
|
||||
<string name="revanced_swipe_lowest_value_enable_auto_brightness_summary_on">ĐĐģŅĐˇĐŗĐ°ĐŊĐĩŅĐž ĐŊадОĐģŅ Đ´Đž ĐŊаК-ĐŊиŅĐēаŅа ŅŅОКĐŊĐžŅŅ ĐŊа ĐļĐĩŅŅа Са ŅŅĐēĐžŅŅ, Са да ŅĐĩ аĐēŅивиŅа авŅĐžĐŧаŅиŅĐŊаŅа ŅŅĐēĐžŅŅ</string>
|
||||
<string name="revanced_swipe_lowest_value_enable_auto_brightness_summary_off">ĐĐģŅĐˇĐŗĐ°ĐŊĐĩŅĐž ĐŊадОĐģŅ Đ´Đž ĐŊаК-ĐŊиŅĐēаŅа ŅŅОКĐŊĐžŅŅ ĐŊа ĐļĐĩŅŅа Са ŅŅĐēĐžŅŅ, ĐąĐĩС даŅĐĩ аĐēŅивиŅа авŅĐžĐŧаŅиŅĐŊаŅа ŅŅĐēĐžŅŅ</string>
|
||||
<string name="revanced_swipe_lowest_value_enable_auto_brightness_overlay_text">ĐвŅĐž</string>
|
||||
<string name="revanced_swipe_overlay_timeout_title">ĐадŅŅĐļĐēа ĐŊа ĐŋĐģŅĐˇĐŗĐ°ŅаŅа ĐēĐžĐŊŅŅĐžĐģа</string>
|
||||
<string name="revanced_swipe_overlay_timeout_summary">ĐŅĐĩĐŧĐĩ Са ĐēĐžĐĩŅĐž ĐŋĐģŅĐˇĐŗĐ°ŅаŅа ĐēĐžĐŊŅŅĐžĐģа Đĩ видиĐŧа</string>
|
||||
<string name="revanced_swipe_text_overlay_size_title">РаСĐŧĐĩŅ ĐŊа ŅĐĩĐēŅŅа ĐŋŅи ĐŋĐģŅĐˇĐŗĐ°ĐŊĐĩ</string>
|
||||
@@ -313,196 +367,763 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_swipe_threshold_summary">ĐŅĐ°Đŗ ĐŋŅĐĩди да ŅĐĩ ĐžŅŅŅĐĩŅŅви ĐŋĐģŅĐˇĐŗĐ°ĐŊĐĩŅĐž</string>
|
||||
</patch>
|
||||
<patch id="layout.autocaptions.AutoCaptionsPatch">
|
||||
<string name="revanced_auto_captions_title">ĐвŅĐžĐŧаŅиŅĐŊи ĐĄŅĐąŅиŅŅи</string>
|
||||
<string name="revanced_auto_captions_summary_on">ĐвŅĐžĐŧаŅиŅĐŊиŅĐĩ ĐĄŅĐąŅиŅŅи Ņа Đ´ĐĩаĐēŅивиŅаĐŊи</string>
|
||||
<string name="revanced_auto_captions_summary_off">ĐвŅĐžĐŧаŅиŅĐŊиŅĐĩ ĐĄŅĐąŅиŅŅи Ņа аĐēŅивиŅаĐŊи</string>
|
||||
</patch>
|
||||
<patch id="layout.buttons.action.HideButtonsPatch">
|
||||
<string name="revanced_hide_buttons_screen_title">ĐŅŅĐžĐŊи Са Đ´ĐĩĐšŅŅвиŅ</string>
|
||||
<string name="revanced_hide_buttons_screen_summary">ĐĄĐēŅиваĐŊĐĩ иĐģи ĐŋĐžĐēаСваĐŊĐĩ ĐŊа ĐąŅŅĐžĐŊи ĐŋОд видĐĩĐžŅĐž</string>
|
||||
<string name="revanced_hide_like_dislike_button_title">ĐŅŅĐžĐŊи \"ĐĨаŅĐĩŅваĐŧ\" и \"ĐĐĩ Ņ
аŅĐĩŅваĐŧ\"</string>
|
||||
<string name="revanced_hide_like_dislike_button_summary_on">ĐŅŅĐžĐŊиŅĐĩ \"ĐĨаŅĐĩŅваĐŧ\" и \"ĐĐĩ Ņ
аŅĐĩŅваĐŧ\" Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_like_dislike_button_summary_off">ĐŅŅĐžĐŊиŅĐĩ \"ĐĨаŅĐĩŅваĐŧ\" и \"ĐĐĩ Ņ
аŅĐĩŅваĐŧ\" ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<!-- 'Share' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_share_button_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅĐŋОдĐĩĐģŅĐŊĐĩŅĐž</string>
|
||||
<string name="revanced_hide_share_button_summary_on">ĐŅŅĐžĐŊа Са ŅĐŋОдĐĩĐģŅĐŊĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_share_button_summary_off">ĐŅŅĐžĐŊа Са ŅĐŋОдĐĩĐģŅĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears only on live streams. -->
|
||||
<string name="revanced_hide_report_button_title">ĐŅŅĐžĐŊ Са Đ´ĐžĐēĐģади</string>
|
||||
<string name="revanced_hide_report_button_summary_on">ĐŅŅĐžĐŊа Са Đ´ĐžĐēĐģадваĐŊĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_report_button_summary_off">ĐŅŅĐžĐŊа Са Đ´ĐžĐēĐģадваĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Remix' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_remix_button_title">ĐŅŅĐžĐŊ Са ŅĐĩĐŧиĐēŅ</string>
|
||||
<string name="revanced_hide_remix_button_summary_on">ĐŅŅĐžĐŊа Са ŅĐĩĐŧиĐēŅ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_remix_button_summary_off">ĐŅŅĐžĐŊа Са ŅĐĩĐŧиĐēŅ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Download' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_download_button_title">ĐŅŅĐžĐŊ Са иСŅĐĩĐŗĐģŅĐŊĐĩ</string>
|
||||
<string name="revanced_hide_download_button_summary_on">ĐŅŅĐžĐŊа Са иСŅĐĩĐŗĐģŅĐŊĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_download_button_summary_off">ĐŅŅĐžĐŊа Са иСŅĐĩĐŗĐģŅĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Thanks' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_thanks_button_title">ĐŅŅĐžĐŊ Са ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅĐŊĐžŅŅ</string>
|
||||
<string name="revanced_hide_thanks_button_summary_on">ĐŅŅĐžĐŊа Са ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅĐŊĐžŅŅ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_thanks_button_summary_off">ĐŅŅĐžĐŊа Са ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅĐŊĐžŅŅ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_clip_button_title">ĐŅŅĐžĐŊ Са ŅŅСдаваĐŊĐĩ ĐŊа ĐēĐģиĐŋ</string>
|
||||
<string name="revanced_hide_clip_button_summary_on">ĐŅŅĐžĐŊа Са ĐēĐģиĐŋ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_clip_button_summary_off">ĐŅŅĐžĐŊа Са ĐēĐģиĐŋ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_playlist_button_title">ĐŅŅĐžĐŊ Са ĐаĐŋаСваĐŊĐĩ в ĐŋĐģĐĩĐšĐģиŅŅа</string>
|
||||
<string name="revanced_hide_playlist_button_summary_on">ĐŅŅĐžĐŊŅŅ ĐˇĐ° ĐаĐŋаСваĐŊĐĩ в ĐŋĐģĐĩĐšĐģиŅŅа Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_playlist_button_summary_off">ĐŅŅĐžĐŊŅŅ ĐˇĐ° ĐаĐŋаСваĐŊĐĩ в ĐŋĐģĐĩĐšĐģиŅŅа ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
</patch>
|
||||
<patch id="layout.buttons.autoplay.HideAutoplayButtonPatch">
|
||||
<string name="revanced_hide_autoplay_button_title">ĐŅŅĐžĐŊа Са авŅ. иСĐŋŅĐģĐŊĐĩĐŊиĐĩ</string>
|
||||
<string name="revanced_hide_autoplay_button_summary_on">ĐŅŅĐžĐŊа Са авŅ. иСĐŋŅĐģĐŊĐĩĐŊиĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_autoplay_button_summary_off">ĐŅŅĐžĐŊа Са авŅ. иСĐŋŅĐģĐŊĐĩĐŊиĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
</patch>
|
||||
<patch id="layout.buttons.captions.HideCaptionsButtonPatch">
|
||||
<!-- This button does not display any text, but 'captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title' -->
|
||||
<string name="revanced_hide_captions_button_title">ĐŅŅĐžĐŊа Са ĐĄŅĐąŅиŅŅи</string>
|
||||
<string name="revanced_hide_captions_button_summary_on">ĐŅŅĐžĐŊа Са ŅŅĐąŅиŅи Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_captions_button_summary_off">ĐŅŅĐžĐŊа Са ŅŅĐąŅиŅи ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
</patch>
|
||||
<patch id="layout.buttons.cast.HideCastButtonPatch">
|
||||
<string name="revanced_hide_cast_button_title">ĐŅŅĐžĐŊ Са ĐŋŅĐĩдаваĐŊĐĩ ĐŊа Đĸв</string>
|
||||
<string name="revanced_hide_cast_button_summary_on">ĐŅŅĐžĐŊŅŅ ĐˇĐ° ĐŋŅĐĩдаваĐŊĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_cast_button_summary_off">ĐŅŅĐžĐŊŅŅ ĐˇĐ° ĐŋŅĐĩдаваĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
</patch>
|
||||
<patch id="layout.buttons.navigation.NavigationButtonsPatch">
|
||||
<string name="revanced_navigation_buttons_screen_title">ĐŅŅĐžĐŊи Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°ŅиŅ</string>
|
||||
<string name="revanced_navigation_buttons_screen_summary">ĐĄĐēŅиваĐŊĐĩ иĐģи ĐŋŅĐžĐŧŅĐŊа ĐŊа ĐąŅŅĐžĐŊиŅĐĩ в ĐģĐĩĐŊŅаŅа Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°ŅиŅ</string>
|
||||
<!-- 'Home' should be translated using the same localized wording YouTube displays for the tab. -->
|
||||
<string name="revanced_hide_home_button_title">ĐŅŅĐžĐŊ Са ĐаŅаĐģĐž</string>
|
||||
<string name="revanced_hide_home_button_summary_on">ĐŅŅĐžĐŊа Са ĐŊаŅаĐģĐž Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_home_button_summary_off">ĐŅŅĐžĐŊа Са ĐŊаŅаĐģĐž ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Shorts' should be translated using the same localized wording YouTube displays the tab. -->
|
||||
<string name="revanced_hide_shorts_button_title">ĐŅŅĐžĐŊ Са ĐŅаŅĐēи ĐēĐģиĐŋОвĐĩ</string>
|
||||
<string name="revanced_hide_shorts_button_summary_on">ĐŅŅĐžĐŊа Са ĐēŅаŅĐēи ĐēĐģиĐŋОвĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_button_summary_off">ĐŅŅĐžĐŊа Са ĐēŅаŅĐēи ĐēĐģиĐŋОвĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- The Create button has no display name. Translate normally. -->
|
||||
<string name="revanced_hide_create_button_title">ĐŅŅĐžĐŊ Са ŅŅСдаваĐŊĐĩ ĐŊа ĐēĐģиĐŋ</string>
|
||||
<string name="revanced_hide_create_button_summary_on">ĐŅŅĐžĐŊŅŅ ĐˇĐ° ŅŅСдаваĐŊĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_create_button_summary_off">ĐŅŅĐžĐŊа Са ŅŅСдаваĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays the tab. -->
|
||||
<string name="revanced_hide_subscriptions_button_title">ĐйОĐŊаĐŧĐĩĐŊŅи</string>
|
||||
<string name="revanced_hide_subscriptions_button_summary_on">ĐŅŅĐžĐŊа Са айОĐŊаĐŧĐĩĐŊŅи Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_subscriptions_button_summary_off">ĐŅŅĐžĐŊа Са айОĐŊаĐŧĐĩĐŊŅи ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Notifications' should be translated using the same localized wording YouTube displays the tab. -->
|
||||
<string name="revanced_switch_create_with_notifications_button_title">ĐаĐŧĐĩĐŊĐĩŅĐĩ ĐąŅŅĐžĐŊа âĐĄŅСдаваĐŊĐĩâ Ņ ĐąŅŅĐžĐŊа âĐСвĐĩŅŅиŅâ</string>
|
||||
<string name="revanced_switch_create_with_notifications_button_summary_on">ĐŅŅĐžĐŊŅŅ ĐˇĐ° ŅŅСдаваĐŊĐĩ ŅĐĩ СаĐŧĐĩĐŊŅ Ņ ĐąŅŅĐžĐŊа Са иСвĐĩŅŅиŅ\n\nĐайĐĩĐģĐĩĐļĐēа: ĐĐēŅивиŅаĐŊĐĩŅĐž ĐŊа ŅаСи ĐžĐŋŅĐ¸Ņ ŅŅŅĐž ŅĐēŅива видĐĩĐžŅĐĩĐēĐģаĐŧи</string>
|
||||
<string name="revanced_switch_create_with_notifications_button_summary_off">ĐŅŅĐžĐŊиŅĐĩ \"ĐĄŅСдаваĐŊĐĩ\" и \"ĐСвĐĩŅŅиŅ\" ĐŊĐĩ Ņа ŅаСĐŧĐĩĐŊĐĩĐŊи</string>
|
||||
<string name="revanced_hide_navigation_button_labels_title">ĐĐŧĐĩĐŊа ĐŊа ĐąŅŅĐžĐŊиŅĐĩ ĐŊа ĐģĐĩĐŊŅаŅа Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°ŅиŅ</string>
|
||||
<string name="revanced_hide_navigation_button_labels_summary_on">ĐŅиĐēĐĩŅиŅĐĩ Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_navigation_button_labels_summary_off">ĐŅиĐēĐĩŅиŅĐĩ ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.player.flyoutmenupanel.HidePlayerFlyoutMenuPatch">
|
||||
<string name="revanced_hide_player_flyout_title">ĐадаŅĐž ĐŧĐĩĐŊŅ</string>
|
||||
<string name="revanced_hide_player_flyout_summary">ĐĄĐēŅиваĐŊĐĩ иĐģи ĐŋĐžĐēаСваĐŊĐĩ ĐŊа ĐĩĐģĐĩĐŧĐĩĐŊŅи ĐžŅ ĐŋадаŅĐžŅĐž ĐŧĐĩĐŊŅ ĐŊа ĐŋĐģĐĩĐšŅŅа</string>
|
||||
<!-- 'Captions' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_captions_title">ĐĐĩĐŊŅ \"ĐĄŅĐąŅиŅŅи\"</string>
|
||||
<string name="revanced_hide_player_flyout_captions_summary_on">ĐĐĩĐŊŅŅĐž Са ŅŅĐąŅиŅŅиĐĩ ŅĐēŅиŅĐž</string>
|
||||
<string name="revanced_hide_player_flyout_captions_summary_off">ĐĐĩĐŊŅŅĐž Са ŅŅĐąŅиŅŅиĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Additional settings' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_additional_settings_title">ĐĐĩĐŊŅ \"ĐĐžĐŋŅĐģĐŊиŅĐĩĐģĐŊи ĐŊаŅŅŅОКĐēи\"</string>
|
||||
<string name="revanced_hide_player_flyout_additional_settings_summary_on">ĐĐžĐŋŅĐģĐŊиŅĐĩĐģĐŊиŅĐĩ ĐŊаŅŅŅОКĐēи Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_player_flyout_additional_settings_summary_off">ĐĐžĐŋŅĐģĐŊиŅĐĩĐģĐŊиŅĐĩ ĐŊаŅŅŅОКĐēи ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<!-- 'Loop video' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_loop_video_title">\"ĐОвŅĐžŅĐŊĐž вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩ\"</string>
|
||||
<string name="revanced_hide_player_flyout_loop_video_summary_on">ĐĐĩĐŊŅŅĐž Са ĐŋОвŅĐžŅĐĩĐŊиĐĩ Đĩ ŅĐēŅиŅĐž</string>
|
||||
<string name="revanced_hide_player_flyout_loop_video_summary_off">ĐĐĩĐŊŅŅĐž Са ĐŋОвŅĐžŅĐĩĐŊиĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Ambient mode' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_ambient_mode_title">Ambient mode</string>
|
||||
<string name="revanced_hide_player_flyout_ambient_mode_summary_on">ĐĐĩĐŊŅŅĐž Са ĐžĐēĐžĐģĐĩĐŊ ŅĐĩĐļиĐŧ Đĩ ŅĐēŅиŅĐž</string>
|
||||
<string name="revanced_hide_player_flyout_ambient_mode_summary_off">ĐĐĩĐŊŅŅĐž Са ĐžĐēĐžĐģĐĩĐŊ ŅĐĩĐļиĐŧ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Help & feedback' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_help_title">ĐĐžĐŧĐžŅ & ĐŅСиви</string>
|
||||
<string name="revanced_hide_player_flyout_help_summary_on">ĐĐĩĐŊŅŅĐž & Са ĐŋĐžĐŧĐžŅ Đĩ ŅĐēŅиŅĐž</string>
|
||||
<string name="revanced_hide_player_flyout_help_summary_off">ĐĐĩĐŊŅŅĐž & Са ĐŋĐžĐŧĐžŅ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Playback speed' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_speed_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅĐēĐžŅĐžŅŅŅа ĐŊа вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩ</string>
|
||||
<string name="revanced_hide_player_flyout_speed_summary_on">ĐĐĩĐŊŅŅĐž Са ŅĐēĐžŅĐžŅŅ ĐŊа видĐĩĐžŅĐž Đĩ ŅĐēŅиŅĐž</string>
|
||||
<string name="revanced_hide_player_flyout_speed_summary_off">ĐĐĩĐŊŅŅĐž Са ŅĐēĐžŅĐžŅŅ ĐŊа видĐĩĐžŅĐž ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'More info' should be translated using the same localized wording YouTube displays for the menu item.
|
||||
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||
<string name="revanced_hide_player_flyout_more_info_title">\"ĐĐžĐŋŅĐģĐŊиŅĐĩĐģĐŊа иĐŊŅĐžŅĐŧаŅиŅ\"</string>
|
||||
<string name="revanced_hide_player_flyout_more_info_summary_on">\"ĐĐžĐŋŅĐģĐŊиŅĐĩĐģĐŊа иĐŊŅĐžŅĐŧаŅиŅ\" Đĩ ŅĐēŅиŅа</string>
|
||||
<string name="revanced_hide_player_flyout_more_info_summary_off">\"ĐĐžĐŋŅĐģĐŊиŅĐĩĐģĐŊа иĐŊŅĐžŅĐŧаŅиŅ\" ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_lock_screen_title">\"ĐаĐēĐģŅŅĐĩĐŊ ĐĩĐēŅаĐŊ\"</string>
|
||||
<string name="revanced_hide_player_flyout_lock_screen_summary_on">ĐĐĩĐŊŅŅĐž ĐŊа СаĐēĐģŅŅĐĩĐŊ ĐĩĐēŅаĐŊ Đĩ ŅĐēŅиŅĐž</string>
|
||||
<string name="revanced_hide_player_flyout_lock_screen_summary_off">ĐĐĩĐŊŅŅĐž ĐŊа СаĐēĐģŅŅĐĩĐŊ ĐĩĐēŅаĐŊ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_title">ĐĐˇĐąĐžŅ ĐŊа ĐŅдиО</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">ĐĐĩĐŊŅŅĐž Са Đ¸ĐˇĐąĐžŅ ĐŊа ĐŅдиО Đĩ ŅĐēŅиŅĐž</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">ĐĐĩĐŊŅŅĐž Са Đ¸ĐˇĐąĐžŅ ĐŊа ĐŅдиО ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">ĐĐģĐĩдаКŅĐĩ вŅв VR</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">ĐĐĩĐŊŅŅĐž Са ĐŗĐģĐĩдаĐŊĐĩ в VR Đĩ ŅĐēŅиŅĐž</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_off">ĐĐĩĐŊŅŅĐž Са ĐŗĐģĐĩдаĐŊĐĩ в VR ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
</patch>
|
||||
<patch id="layout.buttons.player.hide.HidePlayerButtonsPatch">
|
||||
<string name="revanced_hide_player_buttons_title">ĐŅŅĐžĐŊи Са ĐŅĐĩдиŅĐŊĐž & ĐĄĐģĐĩдваŅĐž видĐĩĐž</string>
|
||||
<string name="revanced_hide_player_buttons_summary_on">ĐŅŅĐžĐŊиŅĐĩ Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_player_buttons_summary_off">ĐŅŅĐžĐŊиŅĐĩ ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.albumcards.AlbumCardsResourcePatch">
|
||||
<string name="revanced_hide_album_cards_title">\"ĐаŅŅи ĐŊа аĐģĐąŅĐŧиŅĐĩ\"</string>
|
||||
<string name="revanced_hide_album_cards_summary_on">ĐĐģĐąŅĐŧĐŊиŅĐĩ ĐēаŅŅи Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_album_cards_summary_off">ĐĐģĐąŅĐŧĐŊиŅĐĩ ĐēаŅŅи ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.comments.CommentsPatch">
|
||||
<string name="revanced_comments_screen_title">ĐĐžĐŧĐĩĐŊŅаŅи</string>
|
||||
<string name="revanced_comments_screen_summary">ĐĄĐēŅиваĐŊĐĩ иĐģи ĐŋĐžĐēаСваĐŊĐĩ ĐŊа ŅĐĩĐēŅиŅŅа Са ĐēĐžĐŧĐĩĐŊŅаŅи</string>
|
||||
<string name="revanced_hide_comments_by_members_header_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа âĐĐžĐŧĐĩĐŊŅаŅи, ĐŊаĐŋŅавĐĩĐŊи ĐžŅ ŅĐģĐĩĐŊОвĐĩâ</string>
|
||||
<string name="revanced_hide_comments_by_members_header_summary_on">âĐĐžĐŧĐĩĐŊŅаŅи ĐžŅ ŅĐģĐĩĐŊОвĐĩâ Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_comments_by_members_header_summary_off">âĐĐžĐŧĐĩĐŊŅаŅи ĐžŅ ŅĐģĐĩĐŊОвĐĩâ ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<string name="revanced_hide_comments_section_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ŅĐĩĐēŅиŅŅа Ņ ĐēĐžĐŧĐĩĐŊŅаŅи</string>
|
||||
<string name="revanced_hide_comments_section_summary_on">ĐĄĐĩĐēŅиŅŅа Ņ ĐēĐžĐŧĐĩĐŊŅаŅи Đĩ ŅĐēŅиŅа</string>
|
||||
<string name="revanced_hide_comments_section_summary_off">ĐĄĐĩĐēŅиŅŅа Ņ ĐēĐžĐŧĐĩĐŊŅаŅи ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_title">ĐŅŅĐžĐŊ Са ŅŅСдаваĐŊĐĩ ĐŊа Shorts</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_on">ĐŅŅĐžĐŊ Са ŅŅСдаваĐŊĐĩ ĐŊа Shorts Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_comments_create_a_short_button_summary_off">ĐŅŅĐžĐŊ Са ŅŅСдаваĐŊĐĩ ĐŊа Shorts ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_comments_preview_comment_title">ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа ĐēĐžĐŧĐĩĐŊŅаŅи</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_on">ĐŅĐĩĐŗĐģĐĩда ĐŊа ĐēĐžĐŧĐĩĐŊŅаŅи Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_comments_preview_comment_summary_off">ĐŅĐĩĐŗĐģĐĩда ĐŊа ĐēĐžĐŧĐĩĐŊŅаŅи ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_comments_thanks_button_title">ĐŅŅĐžĐŊ Са ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅĐŊĐžŅŅ</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_on">ĐŅŅĐžĐŊа Са ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅĐŊĐžŅŅ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_comments_thanks_button_summary_off">ĐŅŅĐžĐŊа Са ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅĐŊĐžŅŅ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_comments_timestamp_and_emoji_buttons_title">ĐŅŅĐžĐŊи в ĐģĐĩĐŊŅаŅа ĐŊа ĐŋŅĐžĐŗŅĐĩŅа и ĐĩĐŧĐžŅиĐēĐžĐŊи</string>
|
||||
<string name="revanced_hide_comments_timestamp_and_emoji_buttons_summary_on">ĐŅŅĐžĐŊиŅĐĩ Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_comments_timestamp_and_emoji_buttons_summary_off">ĐŅŅĐžĐŊиŅĐĩ ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.crowdfundingbox.CrowdfundingBoxResourcePatch">
|
||||
<string name="revanced_hide_crowdfunding_box_title">ĐаŅиŅĐĩĐģŅĐēа ĐēŅŅиŅ</string>
|
||||
<string name="revanced_hide_crowdfunding_box_summary_on">ĐŅŅиŅŅа Са даŅĐĩĐŊĐ¸Ņ Đĩ ŅĐēŅиŅа</string>
|
||||
<string name="revanced_hide_crowdfunding_box_summary_off">ĐŅŅиŅŅа Са даŅĐĩĐŊĐ¸Ņ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.HideEndscreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐŋŅĐĩĐŋĐžŅŅĐēиŅĐĩ в ĐēŅаŅ</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">ĐŅĐĩĐŋĐžŅŅĐēиŅĐĩ в ĐēŅĐ°Ņ Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">ĐŅĐĩĐŋĐžŅŅĐēиŅĐĩ в ĐēŅĐ°Ņ ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.filterbar.HideFilterBarResourcePatch">
|
||||
<string name="revanced_hide_filter_bar_screen_title">ĐĐĩĐŊŅа Ņ ŅиĐģŅŅи</string>
|
||||
<string name="revanced_hide_filter_bar_screen_summary">ĐĄĐēŅиваĐŊĐĩ иĐģи ĐŋĐžĐēаСваĐŊĐĩ ĐŊа ĐģĐĩĐŊŅаŅа Ņ ĐēаŅĐĩĐŗĐžŅии в ĐĩĐŧиŅиŅŅа, ŅĐĩСŅĐģŅаŅиŅĐĩ ĐžŅ ŅŅŅŅĐĩĐŊĐĩŅĐž и ŅвŅŅСаĐŊиŅĐĩ видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐŗĐžŅĐŊаŅа ĐģĐĩĐŊŅа Ņ ĐēаŅĐĩĐŗĐžŅии в ĐĩĐŧиŅиŅŅа</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">ĐĄĐēŅиŅа</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">ĐĐžĐēаСва ŅĐĩ</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_title">ФиĐģŅŅŅи ĐŊа ŅŅŅŅĐĩĐŊĐĩ</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">ĐаĐŊĐĩĐģŅŅ Ņ ŅиĐģŅŅŅи ĐŊа ŅŅŅŅĐĩĐŊĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">ĐаĐŊĐĩĐģŅŅ Ņ ŅиĐģŅŅŅи ĐŊа ŅŅŅŅĐĩĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_related_videos_title">ĐĄĐēŅиваĐŊĐĩ в ŅŅОдĐŊи видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_on">ĐĄĐēŅиваĐŊĐĩ в ŅŅОдĐŊи видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
|
||||
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_off">ĐĐžĐēаСаĐŊĐž в ŅŅОдĐŊи видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.floatingmicrophone.HideFloatingMicrophoneButtonResourcePatch">
|
||||
<string name="revanced_hide_floating_microphone_button_title">ĐĐģĐ°Đ˛Đ°Ņ ĐąŅŅĐžĐŊ Са ĐŧиĐēŅĐžŅĐžĐŊа</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_on">ĐŅŅĐžĐŊŅŅ ĐŊа ĐŧиĐēŅĐžŅĐžĐŊа Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_off">ĐĐžĐēаСаĐŊ Đĩ ĐąŅŅĐžĐŊ ĐŊа ĐŧиĐēŅĐžŅĐžĐŊа</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.DisableFullscreenAmbientModePatch">
|
||||
<string name="revanced_disable_fullscreen_ambient_mode_title">ĐĐĩаĐēŅивиŅаКŅĐĩ ĐžĐēĐžĐģĐŊĐ¸Ņ ŅĐĩĐļиĐŧ ĐŊа ŅŅĐģ ĐĩĐēŅаĐŊ</string>
|
||||
<string name="revanced_disable_fullscreen_ambient_mode_summary_on">ĐОдŅвĐĩŅĐēаŅа в ŅĐĩĐļиĐŧ ĐŊа ŅŅĐģ ĐĩĐēŅаĐŊ Đĩ Đ´ĐĩаĐēŅивиŅаĐŊа</string>
|
||||
<string name="revanced_disable_fullscreen_ambient_mode_summary_off">ĐОдŅвĐĩŅĐēаŅа в ŅĐĩĐļиĐŧ ĐŊа ŅŅĐģ ĐĩĐēŅаĐŊ Đĩ аĐēŅивиŅаĐŊа</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.infocards.HideInfocardsResourcePatch">
|
||||
<string name="revanced_hide_info_cards_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа иĐŊŅĐž. ĐēаŅŅи</string>
|
||||
<string name="revanced_hide_info_cards_summary_on">ĐĐŊŅĐžŅĐŧаŅиОĐŊĐŊиŅĐĩ ĐēаŅŅи Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_info_cards_summary_off">ĐĐŊŅĐžŅĐŧаŅиОĐŊĐŊиŅĐĩ ĐēаŅŅи ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.rollingnumber.DisableRollingNumberAnimationPatch">
|
||||
<string name="revanced_disable_rolling_number_animations_title">ĐĐŊиĐŧаŅĐ¸Ņ ĐŊа ŅиŅĐģа в ŅĐĩаĐģĐŊĐž вŅĐĩĐŧĐĩ</string>
|
||||
<string name="revanced_disable_rolling_number_animations_summary_on">ĐĐŊиĐŧаŅиŅŅа Đĩ Đ´ĐĩаĐēŅивиŅаĐŊа</string>
|
||||
<string name="revanced_disable_rolling_number_animations_summary_off">ĐĐŊиĐŧаŅиŅŅа Đĩ аĐēŅивиŅаĐŊа</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.seekbar.HideSeekbarPatch">
|
||||
<string name="revanced_hide_seekbar_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐģĐĩĐŊŅа Са вŅĐĩĐŧĐĩ ĐŊа ĐŋĐģĐĩĐšŅŅа</string>
|
||||
<string name="revanced_hide_seekbar_summary_on">ĐĐĩĐŊŅаŅа Са вŅĐĩĐŧĐĩ ĐŊа ĐŋĐģĐĩĐšŅŅа Đĩ ŅĐēŅиŅа</string>
|
||||
<string name="revanced_hide_seekbar_summary_off">ĐĐĩĐŊŅаŅа Са вŅĐĩĐŧĐĩ ĐŊа ĐŋĐģĐĩĐšŅŅа ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_seekbar_thumbnail_title">ĐĄĐēŅ. ĐģĐĩĐŊŅа Са вŅĐĩĐŧĐĩ ĐŋŅи ĐŧиĐŊиаŅŅŅиŅĐĩ</string>
|
||||
<string name="revanced_hide_seekbar_thumbnail_summary_on">ĐĐĩĐŊŅаŅа Са вŅĐĩĐŧĐĩ ĐŋŅи ĐŧиĐŊиаŅŅŅиŅĐĩ Đĩ ŅĐēŅиŅа</string>
|
||||
<string name="revanced_hide_seekbar_thumbnail_summary_off">ĐĐĩĐŊŅаŅа Са вŅĐĩĐŧĐĩ ĐŋŅи ĐŧиĐŊиаŅŅŅиŅĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.shorts.HideShortsComponentsResourcePatch">
|
||||
<!-- 'home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||
<string name="revanced_hide_shorts_home_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа Shorts в ĐŊаŅаĐģĐŊаŅа ĐģĐĩĐŊŅа</string>
|
||||
<string name="revanced_hide_shorts_home_summary_on">Shorts в ĐŊаŅаĐģĐŊаŅа ĐģĐĩĐŊŅа Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_shorts_home_summary_off">Shorts в ĐŊаŅаĐģĐŊаŅа ĐģĐĩĐŊŅа Ņа ĐŋĐžĐēаСаĐŊи</string>
|
||||
<!-- 'subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
|
||||
<string name="revanced_hide_shorts_subscriptions_title">Shorts в ŅаСдĐĩĐģ âĐйОĐŊаĐŧĐĩĐŊŅиâ</string>
|
||||
<string name="revanced_hide_shorts_subscriptions_summary_on">Shorts в ŅаСдĐĩĐģ âĐйОĐŊаĐŧĐĩĐŊŅиâ Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_shorts_subscriptions_summary_off">Shorts в ŅаСдĐĩĐģ âĐйОĐŊаĐŧĐĩĐŊŅиâ ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<string name="revanced_hide_shorts_search_title">Shorts в ŅĐĩСŅĐģŅаŅиŅĐĩ ĐžŅ ŅŅŅŅĐĩĐŊĐĩŅĐž</string>
|
||||
<string name="revanced_hide_shorts_search_summary_on">Shorts в ŅĐĩСŅĐģŅаŅиŅĐĩ ĐžŅ ŅŅŅŅĐĩĐŊĐĩŅĐž Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_shorts_search_summary_off">Shorts в ŅĐĩСŅĐģŅаŅиŅĐĩ ĐžŅ ŅŅŅŅĐĩĐŊĐĩŅĐž ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<!-- 'join' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
<string name="revanced_hide_shorts_join_button_title">ĐŅŅĐžĐŊ Са ĐŋŅиŅŅĐĩдиĐŊŅваĐŊĐĩ</string>
|
||||
<string name="revanced_hide_shorts_join_button_summary_on">ĐŅŅĐžĐŊа Са ĐŋŅиŅŅĐĩдиĐŊŅваĐŊĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_join_button_summary_off">ĐŅŅĐžĐŊа Са ĐŋŅиŅŅĐĩдиĐŊŅваĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'subscribe' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
<string name="revanced_hide_shorts_subscribe_button_title">ĐĄĐēŅиКŅĐĩ ĐąŅŅĐžĐŊа âĐйОĐŊиŅаĐŊĐĩâ</string>
|
||||
<string name="revanced_hide_shorts_subscribe_button_summary_on">ĐŅŅĐžĐŊŅŅ âĐйОĐŊиŅаĐŊĐĩâ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_subscribe_button_summary_off">ĐŅŅĐžĐŊŅŅ âĐйОĐŊиŅаĐŊĐĩâ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_shorts_paused_overlay_buttons_title">ĐĐžĐēаСваĐŊĐĩ ĐŊа ĐąŅŅĐžĐŊи ĐŋŅи ĐŋаŅСа</string>
|
||||
<string name="revanced_hide_shorts_paused_overlay_buttons_summary_on">ĐŅŅĐžĐŊиŅĐĩ ĐŋŅи ĐŋаŅСа ŅĐĩ ŅĐēŅиваŅ</string>
|
||||
<string name="revanced_hide_shorts_paused_overlay_buttons_summary_off">ĐŅŅĐžĐŊиŅĐĩ ĐŋŅи ĐŋаŅСа ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<string name="revanced_hide_shorts_shop_button_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐąŅŅĐžĐŊа Са ĐŋаСаŅŅваĐŊĐĩ</string>
|
||||
<string name="revanced_hide_shorts_shop_button_summary_on">ĐŅŅĐžĐŊа Са ĐŋаСаŅŅваĐŊĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_shop_button_summary_off">ĐŅŅĐžĐŊа Са ĐŋаСаŅŅваĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_title">ĐŅŅĐžĐŊ \"ĐĄĐŋĐĩŅиаĐģĐŊи ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅĐŊĐžŅŅи\"</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_summary_on">ĐŅŅĐžĐŊ \"ĐĄĐŋĐĩŅиаĐģĐŊи ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅĐŊĐžŅŅи\" Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_summary_off">ĐŅŅĐžĐŊ \"ĐĄĐŋĐĩŅиаĐģĐŊи ĐąĐģĐ°ĐŗĐžĐ´Đ°ŅĐŊĐžŅŅи\" ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_shorts_tagged_products_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐŧаŅĐēиŅаĐŊиŅĐĩ ĐŋŅОдŅĐēŅи</string>
|
||||
<string name="revanced_hide_shorts_tagged_products_summary_on">ĐĄĐēŅиŅи</string>
|
||||
<string name="revanced_hide_shorts_tagged_products_summary_off">ĐĐžĐēĐ°ĐˇĐ˛Đ°Ņ ŅĐĩ</string>
|
||||
<string name="revanced_hide_shorts_location_label_title">ĐŅиĐēĐĩŅ ĐˇĐ° ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">ĐŅиĐēĐĩŅ ĐˇĐ° ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">ĐŅиĐēĐĩŅ ĐˇĐ° ĐŧĐĩŅŅĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">ĐŅŅĐžĐŊ Са СаĐŋаСваĐŊĐĩ ĐŊа аŅдиОŅĐž в ĐŋĐģĐĩĐšĐģиŅŅа</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">ĐŅŅĐžĐŊŅŅ ĐˇĐ° ĐаĐŋаСваĐŊĐĩ в ĐŋĐģĐĩĐšĐģиŅŅа Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">ĐŅŅĐžĐŊŅŅ ĐˇĐ° ĐаĐŋаСваĐŊĐĩ в ĐŋĐģĐĩĐšĐģиŅŅа ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐŋŅĐĩĐ´ĐģĐžĐļĐĩĐŊиŅŅа Са ŅŅŅŅĐĩĐŊĐĩ</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">ĐŅĐĩĐ´ĐģĐžĐļĐĩĐŊиŅŅа Са ŅŅŅŅĐĩĐŊĐĩ Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">ĐŅĐĩĐ´ĐģĐžĐļĐĩĐŊиŅŅа Са ŅŅŅŅĐĩĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<string name="revanced_hide_shorts_like_button_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐąŅŅĐžĐŊа Са Ņ
аŅĐĩŅваĐŊĐĩ</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_on">ĐŅŅĐžĐŊа Са Ņ
аŅĐĩŅваĐŊĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_off">ĐŅŅĐžĐŊа Са Ņ
аŅĐĩŅваĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_shorts_dislike_button_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐąŅŅĐžĐŊа Са ĐŊĐĩŅ
аŅĐĩŅваĐŊĐĩ</string>
|
||||
<string name="revanced_hide_shorts_dislike_button_summary_on">ĐŅŅĐžĐŊа Са ĐŊĐĩŅ
аŅĐĩŅваĐŊĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_dislike_button_summary_off">ĐŅŅĐžĐŊа Са ĐŊĐĩŅ
аŅĐĩŅваĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_shorts_comments_button_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐąŅŅĐžĐŊа Са ĐēĐžĐŧĐĩĐŊŅаŅи</string>
|
||||
<string name="revanced_hide_shorts_comments_button_summary_on">ĐŅŅĐžĐŊ Са ĐēĐžĐŧĐĩĐŊŅаŅи Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_comments_button_summary_off">ĐŅŅĐžĐŊ Са ĐēĐžĐŧĐĩĐŊŅаŅи ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'remix' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
<string name="revanced_hide_shorts_remix_button_title">ĐŅŅĐžĐŊ Са ŅĐĩĐŧиĐēŅ</string>
|
||||
<string name="revanced_hide_shorts_remix_button_summary_on">ĐŅŅĐžĐŊа Са ŅĐĩĐŧиĐēŅ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_remix_button_summary_off">ĐŅŅĐžĐŊа Са ŅĐĩĐŧиĐēŅ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<!-- 'share' should be translated using the same localized wording YouTube displays for the button. -->
|
||||
<string name="revanced_hide_shorts_share_button_title">ĐŅŅĐžĐŊ Са ŅĐŋОдĐĩĐģŅĐŊĐĩ</string>
|
||||
<string name="revanced_hide_shorts_share_button_summary_on">ĐŅŅĐžĐŊа Са ŅĐŋОдĐĩĐģŅĐŊĐĩ Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_share_button_summary_off">ĐŅŅĐžĐŊа Са ŅĐŋОдĐĩĐģŅĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_shorts_info_panel_title">ĐĐŊŅĐžŅĐŧаŅиОĐŊĐŊи ĐŋаĐŊĐĩĐģи</string>
|
||||
<string name="revanced_hide_shorts_info_panel_summary_on">ĐĐŊŅĐžŅĐŧаŅиОĐŊĐŊиŅĐĩ ĐŋаĐŊĐĩĐģи Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_shorts_info_panel_summary_off">ĐĐŊŅĐžŅĐŧаŅиОĐŊĐŊиŅĐĩ ĐŋаĐŊĐĩĐģи ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<string name="revanced_hide_shorts_channel_bar_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐģĐĩĐŊŅаŅа ĐŊа ĐēаĐŊаĐģа</string>
|
||||
<string name="revanced_hide_shorts_channel_bar_summary_on">ĐĐĩĐŊŅаŅа ĐŊа ĐēаĐŊаĐģа Đĩ ŅĐēŅиŅа</string>
|
||||
<string name="revanced_hide_shorts_channel_bar_summary_off">ĐĐĩĐŊŅаŅа ĐŊа ĐēаĐŊаĐģа Đĩ ĐŋĐžĐēаСаĐŊа</string>
|
||||
<string name="revanced_hide_shorts_video_title_title">ĐĐ°ĐŗĐģавиĐĩ ĐŊа видĐĩĐžŅĐž</string>
|
||||
<string name="revanced_hide_shorts_video_title_summary_on">ĐĐ°ĐŗĐģавиĐĩŅĐž Đĩ ŅĐēŅиŅĐž</string>
|
||||
<string name="revanced_hide_shorts_video_title_summary_off">ĐĐ°ĐŗĐģавиĐĩŅĐž ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐŧŅСиĐēаĐģĐŊи ĐŧĐĩŅадаĐŊĐŊи</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">ĐĐĩŅадаĐŊĐŊи Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">ĐĐĩŅадаĐŊĐŊи ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐĩŅиĐēĐĩŅ ĐˇĐ° вŅŅСĐēа ĐēŅĐŧ видĐĩĐžĐēĐģиĐŋа</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">ĐŅиĐēĐĩŅŅŅ ĐˇĐ° видĐĩĐž вŅŅСĐēа Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">ĐŅиĐēĐĩŅŅŅ ĐˇĐ° видĐĩĐž вŅŅСĐēа ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_shorts_sound_button_title">ĐĄĐēŅиКŅĐĩ ĐąŅŅĐžĐŊа âĐвŅĐēâ</string>
|
||||
<string name="revanced_hide_shorts_sound_button_summary_on">ĐŅŅĐžĐŊа Са ĐвŅĐē Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_sound_button_summary_off">ĐŅŅĐžĐŊа Са ĐвŅĐē ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_hide_shorts_navigation_bar_title">ĐĄĐēŅиваĐŊĐĩ ĐģĐĩĐŊŅаŅа Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°ŅиŅ</string>
|
||||
<string name="revanced_hide_shorts_navigation_bar_summary_on">ĐĐ°Đ˛Đ¸ĐŗĐ°ŅиОĐŊĐŊаŅа ĐģĐĩĐŊŅа Đĩ ŅĐēŅиŅа</string>
|
||||
<string name="revanced_hide_shorts_navigation_bar_summary_off">ĐĐ°Đ˛Đ¸ĐŗĐ°ŅиОĐŊĐŊаŅа ĐģĐĩĐŊŅа ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.suggestedvideoendscreen.DisableSuggestedVideoEndScreenResourcePatch">
|
||||
<string name="revanced_disable_suggested_video_end_screen_title">ĐŅĐĩĐŋĐžŅŅŅаĐŊи видĐĩĐžĐēĐģиĐŋОвĐĩ в ĐēŅаŅ</string>
|
||||
<string name="revanced_disable_suggested_video_end_screen_summary_on">ĐŅĐĩĐŋĐžŅŅŅаĐŊиŅĐĩ видĐĩĐžĐēĐģиĐŋОвĐĩ в ĐēŅĐ°Ņ Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_disable_suggested_video_end_screen_summary_off">ĐŅĐĩĐŋĐžŅŅŅаĐŊиŅĐĩ видĐĩĐžĐēĐģиĐŋОвĐĩ в ĐēŅĐ°Ņ ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.time.HideTimestampPatch">
|
||||
<string name="revanced_hide_timestamp_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа ĐēĐģĐĩĐšĐŧĐžŅĐž Са вŅĐĩĐŧĐĩ ĐŊа видĐĩĐžĐēĐģиĐŋа</string>
|
||||
<string name="revanced_hide_timestamp_summary_on">ĐĄĐēŅиŅĐž</string>
|
||||
<string name="revanced_hide_timestamp_summary_off">ĐĐžĐēаСва ŅĐĩ</string>
|
||||
</patch>
|
||||
<patch id="layout.panels.popup.PlayerPopupPanelsPatch">
|
||||
<string name="revanced_hide_player_popup_panels_title">ĐСŅĐēаŅаŅи ĐŋаĐŊĐĩĐģи ĐŊа ĐŋĐģĐĩĐšŅŅа</string>
|
||||
<string name="revanced_hide_player_popup_panels_summary_on">ĐСŅĐēаŅаŅиŅĐĩ ĐŋаĐŊĐĩĐģи ĐŊа ĐŋĐģĐĩĐšŅŅа Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_hide_player_popup_panels_summary_off">ĐСŅĐēаŅаŅиŅĐĩ ĐŋаĐŊĐĩĐģи ĐŊа ĐŋĐģĐĩĐšŅŅа ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
</patch>
|
||||
<patch id="layout.player.overlay.CustomPlayerOverlayOpacityResourcePatch">
|
||||
<string name="revanced_player_overlay_opacity_title">ĐŅОСŅаŅĐŊĐžŅŅ ĐŊа ĐŊаŅŅŅОКĐēиŅĐĩ в ĐĐģĐĩаŅа</string>
|
||||
<string name="revanced_player_overlay_opacity_summary">ĐĄŅОКĐŊĐžŅŅ ĐŊа ĐŋŅОСŅаŅĐŊĐžŅŅ ĐŧĐĩĐļĐ´Ņ 0-100, ĐēŅĐ´ĐĩŅĐž 0 Đĩ ĐŋŅОСŅаŅĐŊĐž</string>
|
||||
<string name="revanced_player_overlay_opacity_invalid_toast">ĐŅОСŅаŅĐŊĐžŅŅŅа ĐŊа ĐŧĐĩĐŊŅŅĐž ĐŊа ĐŋĐģĐĩĐšŅŅа ŅŅŅйва да ĐąŅĐ´Đĩ ĐŧĐĩĐļĐ´Ņ 0-100</string>
|
||||
</patch>
|
||||
<patch id="layout.returnyoutubedislike.ReturnYouTubeDislikeResourcePatch">
|
||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">ĐĄĐēŅиŅĐž</string>
|
||||
<!-- Toast shown if network connection times out. Translations of this should not be longer than the original English or the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_ryd_failure_connection_timeout">ĐĐĩŅ
аŅĐĩŅваĐŊиŅŅа вŅĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ Ņа ĐŊаĐģиŅĐŊи (API timed out)</string>
|
||||
<string name="revanced_ryd_failure_connection_status_code">ĐĐĩŅ
аŅĐĩŅваĐŊиŅŅа ĐŊĐĩ Ņа ĐŊаĐģиŅĐŊи (status %d)</string>
|
||||
<string name="revanced_ryd_failure_client_rate_limit_requested">ĐĐĩŅ
аŅĐĩŅваĐŊиŅŅа ĐŊĐĩ Ņа Đ´ĐžŅŅŅĐŋĐŊи (Đ´ĐžŅŅĐ¸ĐŗĐŊĐ°Ņ ĐģиĐŧĐ¸Ņ ĐŊа API)</string>
|
||||
<string name="revanced_ryd_failure_generic">ĐĐĩŅ
аŅĐĩŅваĐŊиŅŅа ĐŊĐĩ Ņа ĐŊаĐģиŅĐŊи (%s)</string>
|
||||
<!-- Toast shown if the user enables RYD while a video is opened, and then tries to vote for the video. -->
|
||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">ĐŅĐĩСаŅĐĩди видĐĩĐžŅĐž Са ĐŗĐģаŅŅваĐŊĐĩ Ņ ReturnYouTubeDislike</string>
|
||||
<string name="revanced_ryd_enable_summary_on">ĐĐĩŅ
аŅĐĩŅваĐŊиŅŅа ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<string name="revanced_ryd_enable_summary_off">ĐĐĩŅ
аŅĐĩŅваĐŊиŅŅа ĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСваŅ</string>
|
||||
<string name="revanced_ryd_shorts_title">ĐĐžĐē. ĐŊĐĩŅ
аŅĐĩŅваĐŊĐ¸Ņ Đ˛ ĐēŅаŅĐēиŅĐĩ ĐēĐģиĐŋОвĐĩ</string>
|
||||
<string name="revanced_ryd_shorts_summary_on">ĐĐĩŅ
аŅĐĩŅваĐŊиŅŅа ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ Đ˛ ĐēŅаŅĐēиŅĐĩ ĐēĐģиĐŋОвĐĩ</string>
|
||||
<string name="revanced_ryd_shorts_summary_on_disclaimer">ĐĐĩŅ
аŅĐĩŅваĐŊиŅ, ĐŋĐžĐēаСаĐŊи в Shorts\n\nĐĐŗŅаĐŊиŅĐĩĐŊиĐĩ: ĐĐĩŅ
аŅĐĩŅваĐŊиŅŅа ĐŧĐžĐļĐĩ да ĐŊĐĩ ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ Đ˛ ŅĐĩĐļиĐŧ âиĐŊĐēĐžĐŗĐŊиŅĐžâ</string>
|
||||
<string name="revanced_ryd_shorts_summary_off">ĐĐĩŅ
аŅĐĩŅваĐŊиŅŅа Ņа ŅĐēŅиŅи в ĐēŅаŅĐēиŅĐĩ ĐēĐģиĐŋОвĐĩ</string>
|
||||
<string name="revanced_ryd_dislike_percentage_title">ĐĐĩŅ
аŅĐĩŅваĐŊĐ¸Ņ ĐēаŅĐž ĐŋŅĐžŅĐĩĐŊŅ</string>
|
||||
<string name="revanced_ryd_dislike_percentage_summary_on">ĐĐĩŅ
аŅĐĩŅваĐŊиŅŅа ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ĐēаŅĐž ĐŋŅĐžŅĐĩĐŊŅ</string>
|
||||
<string name="revanced_ryd_dislike_percentage_summary_off">ĐĐĩŅ
аŅĐĩŅваĐŊиŅŅа ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ĐēаŅĐž ŅиŅĐģĐž</string>
|
||||
<!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' -->
|
||||
<string name="revanced_ryd_compact_layout_title">ĐĐžĐŧĐŋаĐēŅĐĩĐŊ ĐąŅŅĐžĐŊ Са Ņ
аŅĐĩŅваĐŊĐĩ</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_on">ĐĐēĐģŅŅĐĩĐŊ ĐēĐžĐŧĐŋаĐēŅĐĩĐŊ ĐąŅŅĐžĐŊ \"ĐĨаŅĐĩŅва Đŧи\"</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_off">ĐаК-дОйŅŅ Đ¸ĐˇĐŗĐģĐĩĐ´ ĐŊа ĐąŅŅĐžĐŊа Са Ņ
аŅĐĩŅваĐŊĐĩ</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">ĐĐžĐēаСваĐŊĐĩ ĐŊа иСвĐĩŅŅиĐĩ, аĐēĐž API ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">ĐĐžĐēаСва иСвĐĩŅŅиĐĩ, аĐēĐž Return YouTube Dislike ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">ĐĐĩ ŅĐĩ ĐŋĐžĐēаСва иСвĐĩŅŅиĐĩ, аĐēĐž ReturnYouTube Dislike ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ</string>
|
||||
<string name="revanced_ryd_about">ĐŅĐŊĐžŅĐŊĐž</string>
|
||||
<string name="revanced_ryd_attribution_summary">ĐаĐŊĐŊиŅĐĩ Са ĐŊĐĩŅ
аŅĐĩŅваĐŊĐĩ Ņа ĐžŅ Return YouTube Dislike API. ĐĐžĐēĐžŅĐŊĐĩŅĐĩ Са да ĐŊаŅŅиŅĐĩ ĐŋОвĐĩŅĐĩ</string>
|
||||
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||
<string name="revanced_ryd_statistics_category_title">ĐĄŅаŅиŅŅиĐēа Return YouTube Dislike API ĐŊа ŅОва ŅŅŅŅОКŅŅвО</string>
|
||||
<string name="revanced_ryd_statistics_getFetchCallResponseTimeAverage_title">ĐŅĐĩĐŧĐĩ Са ĐžŅĐŗĐžĐ˛ĐžŅ ĐŊа API, ŅŅĐĩĐ´ĐŊĐž</string>
|
||||
<string name="revanced_ryd_statistics_getFetchCallResponseTimeMin_title">ĐŅĐĩĐŧĐĩ Са ĐžŅĐŗĐžĐ˛ĐžŅ ĐŊа API, ĐŧиĐŊиĐŧаĐģĐŊĐž</string>
|
||||
<string name="revanced_ryd_statistics_getFetchCallResponseTimeMax_title">ĐŅĐĩĐŧĐĩ Са ĐžŅĐŗĐžĐ˛ĐžŅ ĐŊа API, ĐŧаĐēŅиĐŧаĐģĐŊĐž</string>
|
||||
<string name="revanced_ryd_statistics_getFetchCallResponseTimeLast_title">ĐŅĐĩĐŧĐĩ Са ĐžŅĐŗĐžĐ˛ĐžŅ ĐŊа API, ĐŋĐžŅĐģĐĩĐ´ĐŊĐž видĐĩĐž</string>
|
||||
<string name="revanced_ryd_statistics_getFetchCallResponseTimeLast_rate_limit_summary">ĐĐĩŅ
аŅĐĩŅваĐŊиŅŅа вŅĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ Ņа ĐŊаĐģиŅĐŊи - в ŅиĐģа Đĩ ĐģиĐŧиŅŅŅ API ĐēĐģиĐĩĐŊŅа</string>
|
||||
<string name="revanced_ryd_statistics_getFetchCallCount_title">API ĐŋĐžĐģŅŅава ĐŗĐģаŅОвĐĩ, ĐąŅОК СаŅвĐēи</string>
|
||||
<string name="revanced_ryd_statistics_getFetchCallCount_zero_summary">ĐĐĩŅŅĐŋĐĩŅĐŊи ĐŧŅĐĩĐļОви СаŅвĐēи</string>
|
||||
<string name="revanced_ryd_statistics_getFetchCallCount_non_zero_summary">%d ĐŧŅĐĩĐļОви СаŅвĐēи</string>
|
||||
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_title">API иСвĐģиŅа ĐŗĐģаŅОвĐĩ, ĐąŅОК иСŅаĐēваĐŊиŅ</string>
|
||||
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_zero_summary">ĐŅĐĩĐļОвиŅĐĩ СаŅвĐēи ĐŊŅĐŧаŅ
а иСŅаĐēваĐŊĐĩ</string>
|
||||
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_non_zero_summary">%d иСŅĐĩŅĐĩ вŅĐĩĐŧĐĩŅĐž Са иСŅаĐēваĐŊĐĩ ĐŊа ĐŧŅĐĩĐļОвиŅĐĩ ĐŋОвиĐēваĐŊиŅ</string>
|
||||
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_title">ĐĐŗŅаĐŊиŅĐĩĐŊĐ¸Ņ ĐŊа ŅĐēĐžŅĐžŅŅŅа ĐŊа API ĐēĐģиĐĩĐŊŅ</string>
|
||||
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_zero_summary">ĐĐŗŅаĐŊиŅĐĩĐŊиŅŅа ĐŊа ŅĐēĐžŅĐžŅŅŅа ĐŊа ĐēĐģиĐĩĐŊŅа ĐŊа Api ĐŊĐĩ Ņа ĐžŅĐēŅиŅи</string>
|
||||
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_non_zero_summary">ĐŅĐēŅиŅи Ņа ĐžĐŗŅаĐŊиŅĐĩĐŊĐ¸Ņ ĐŊа ŅĐēĐžŅĐžŅŅŅа ĐŊа ĐēĐģиĐĩĐŊŅа ĐŊа Api %d ĐŋŅŅи</string>
|
||||
<string name="revanced_ryd_statistics_millisecond_text">%d ĐŧиĐģиŅĐĩĐēŅĐŊди</string>
|
||||
</patch>
|
||||
<patch id="layout.searchbar.WideSearchbarPatch">
|
||||
<string name="revanced_wide_searchbar_title">ШиŅĐžĐēа ĐģĐĩĐŊŅа Са ŅŅŅŅĐĩĐŊĐĩ</string>
|
||||
<string name="revanced_wide_searchbar_summary_on">ШиŅĐžĐēаŅа ĐģĐĩĐŊŅа Са ŅŅŅŅĐĩĐŊĐĩ Đĩ вĐēĐģŅŅĐĩĐŊа</string>
|
||||
<string name="revanced_wide_searchbar_summary_off">ШиŅĐžĐēаŅа ĐģĐĩĐŊŅа Са ŅŅŅŅĐĩĐŊĐĩ Đĩ иСĐēĐģŅŅĐĩĐŊа</string>
|
||||
</patch>
|
||||
<patch id="layout.seekbar.RestoreOldSeekbarThumbnailsPatch">
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_title">ĐĄŅаŅи ĐŧиĐŊиаŅŅŅи ĐŊа вŅĐĩĐŧĐĩваŅа ĐģиĐŊиŅ</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_summary_on">Đад ĐģĐĩĐŊŅаŅа Са вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩ ŅĐĩ ĐŋĐžŅвŅĐ˛Đ°Ņ ĐŧиĐŊиаŅŅŅи</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_summary_off">ĐиĐŊиаŅŅŅиŅĐĩ ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ Đ˛ ŅĐĩĐļиĐŧ ĐŊа ŅŅĐģ ĐĩĐēŅаĐŊ</string>
|
||||
</patch>
|
||||
<patch id="layout.sponsorblock.SponsorBlockResourcePatch">
|
||||
<string name="revanced_sb_enable_sb">ĐĐēĐģŅŅваĐŊĐĩ ĐŊа SponsorBlock</string>
|
||||
<string name="revanced_sb_enable_sb_sum">SponsorBlock Đĩ ŅиŅŅĐĩĐŧа Са ĐŋŅĐĩŅĐēаŅаĐŊĐĩ ĐŊа Đ´ĐžŅадĐŊи ŅаŅŅи и ŅĐĩĐēĐģаĐŧи ĐžŅ Đ˛Đ¸Đ´ĐĩĐžĐēĐģиĐŋОвĐĩŅĐĩ в YouTube</string>
|
||||
<string name="revanced_sb_appearance_category">ĐĐąĐģиĐē</string>
|
||||
<string name="revanced_sb_enable_voting">ĐŅŅĐžĐŊа Са ĐŗĐģаŅŅваĐŊĐĩ</string>
|
||||
<string name="revanced_sb_enable_voting_sum_on">ĐŅŅĐžĐŊа Са ĐŗĐģаŅŅваĐŊĐĩ ĐŊа ŅаŅŅ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_sb_enable_voting_sum_off">ĐŅŅĐžĐŊа Са ĐŗĐģаŅŅваĐŊĐĩ ĐŊа ŅаŅŅ Đĩ ŅĐēŅиŅ</string>
|
||||
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title' -->
|
||||
<string name="revanced_sb_enable_compact_skip_button">ĐĐžĐŧĐŋаĐēŅĐĩĐŊ ĐąŅŅĐžĐŊ Са ĐŋŅĐžĐŋŅŅĐēаĐŊĐĩ</string>
|
||||
<string name="revanced_sb_enable_compact_skip_button_sum_on">ĐиĐŊ. ŅиŅиĐŊа ĐŊа ĐąŅŅĐžĐŊа Са ĐŋŅĐžĐŋŅŅĐēаĐŊĐĩ</string>
|
||||
<string name="revanced_sb_enable_compact_skip_button_sum_off">ĐаК-дОйŅŅ Đ¸ĐˇĐŗĐģĐĩĐ´ ĐŊа ĐąŅŅĐžĐŊа Са ĐŋŅĐžĐŋŅŅĐēаĐŊĐĩ</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">ĐвŅ. ŅĐēŅиваĐŊĐĩ ĐŊа ĐąŅŅĐžĐŊа Са ĐŋŅĐžĐŋŅŅĐēаĐŊĐĩ</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">ĐŅŅĐžĐŊа Са ĐŋŅĐžĐŋŅŅĐēаĐŊĐĩ ŅĐĩ ŅĐēŅива ŅĐģĐĩĐ´ ĐŊŅĐēĐžĐģĐēĐž ŅĐĩĐēŅĐŊди</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">ĐŅŅĐžĐŊа Са ĐŋŅĐžĐŋŅŅĐēаĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва Са ŅŅĐģаŅа ŅаŅŅ</string>
|
||||
<string name="revanced_sb_general_skiptoast">ĐĐžĐēаСв. иСвĐĩŅŅиĐĩ ĐŋŅи авŅĐžĐŧ. ĐŋŅĐžĐŋŅŅĐē. ŅаŅŅ</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">ĐĐžĐēаСваĐŊĐĩ ĐŊа иСвĐĩŅŅиĐĩ ĐŋŅи авŅĐžĐŧаŅиŅĐŊĐž ĐŋŅĐžĐŋŅŅĐŊаŅа ŅаŅŅ. ĐĐžĐēĐžŅĐŊĐĩŅĐĩ ŅŅĐē Са ĐŋŅиĐŧĐĩŅ</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">ĐСвĐĩŅŅиĐĩŅĐž ĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва. ĐĐžĐēĐžŅĐŊĐĩŅĐĩ ŅŅĐē Са ĐŋŅиĐŧĐĩŅ</string>
|
||||
<string name="revanced_sb_general_time_without">ĐĐžĐēаСваĐŊĐĩ ĐŊа Đ´ŅĐģĐļиĐŊаŅа ĐŊа видĐĩĐžŅĐž ĐąĐĩС ŅĐ¸ĐŗĐŧĐĩĐŊŅиŅĐĩ</string>
|
||||
<string name="revanced_sb_general_time_without_sum_on">ĐŅĐģĐļиĐŊаŅа ĐŊа видĐĩĐžŅĐž ĐąĐĩС вŅиŅĐēи ŅаŅŅи ĐŋĐžĐēаСаĐŊа в ŅĐēОйи Đ´Đž ŅŅĐģаŅа Đ´ŅĐģĐļиĐŊа</string>
|
||||
<string name="revanced_sb_general_time_without_sum_off">ĐĻŅĐģаŅа Đ´ŅĐģĐļиĐŊа ĐŊа видĐĩŅĐž ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_sb_create_segment_category">ĐĄŅСдаваĐŊĐĩ ĐŊа ĐŊОви ŅаŅŅи</string>
|
||||
<string name="revanced_sb_enable_create_segment">ĐĐžĐēаСваĐŊĐĩ ĐŊа ĐąŅŅĐžĐŊа Са ĐŊОва ŅаŅŅ</string>
|
||||
<string name="revanced_sb_enable_create_segment_sum_on">ĐŅŅĐžĐŊа ŅŅСдаваĐŊĐĩ Са ĐŊОва ŅаŅŅ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_sb_enable_create_segment_sum_off">ĐŅŅĐžĐŊа ŅŅСдаваĐŊĐĩ Са ĐŊОва ŅаŅŅ ĐŊĐĩ ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
<string name="revanced_sb_general_adjusting">ĐаŅŅŅОКваĐŊĐĩ ŅŅŅĐŋĐēа ĐŊа ĐŊОваŅа ŅаŅŅ</string>
|
||||
<string name="revanced_sb_general_adjusting_sum">ĐиĐģиŅĐĩĐēŅĐŊдиŅĐĩ Ņ ĐēОКŅĐž ŅĐĩ ĐŋŅĐĩĐŧĐĩŅŅĐ˛Đ°Ņ ĐąŅŅĐžĐŊиŅĐĩ Са ĐŊаŅŅŅОКĐēа ĐŋŅи ŅŅСдаваĐŊĐĩ ĐŊа ŅаŅŅ</string>
|
||||
<string name="revanced_sb_general_adjusting_invalid">ĐĄŅОКĐŊĐžŅŅŅа ŅŅŅйва да Đĩ ĐŋĐžĐģĐžĐļиŅĐĩĐģĐŊĐž ŅиŅĐģĐž</string>
|
||||
<string name="revanced_sb_guidelines_preference_title">ĐŅĐĩĐŗĐģĐĩĐ´ ĐŊа ŅŅĐēОвОдĐŊиŅĐĩ ĐģиĐŊии</string>
|
||||
<string name="revanced_sb_guidelines_preference_sum">ĐŖĐēаСаĐŊиŅŅа ŅŅĐ´ŅŅĐļĐ°Ņ ĐŋŅавиĐģа и ŅŅвĐĩŅи Са ŅŅСдаваĐŊĐĩ ĐŊа ĐŊОви ŅаŅŅи</string>
|
||||
<string name="revanced_sb_guidelines_popup_title">ĐĄĐģĐĩдваКŅĐĩ ŅĐēаСаĐŊиŅŅа</string>
|
||||
<string name="revanced_sb_guidelines_popup_content">ĐŅĐžŅĐĩŅĐĩŅĐĩ ŅĐēаСаĐŊиŅŅа ĐŊа SponsorBlock ĐŋŅĐĩди да ŅŅСдадĐĩŅĐĩ ĐŊОви ŅаŅŅи</string>
|
||||
<string name="revanced_sb_guidelines_popup_already_read">ĐĐĩŅĐĩ ĐŋŅĐžŅĐĩŅĐžŅ
</string>
|
||||
<string name="revanced_sb_guidelines_popup_open">ĐĐžĐēаĐļи Đŧи</string>
|
||||
<string name="revanced_sb_general">ĐĐąŅи</string>
|
||||
<string name="revanced_sb_toast_on_connection_error_title">ĐĐžĐēаСваĐŊĐĩ ĐŊа иСвĐĩŅŅиĐĩ, аĐēĐž API ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ</string>
|
||||
<string name="revanced_sb_toast_on_connection_error_summary_on">ĐĐžĐēаСва ŅĐĩ иСвĐĩŅŅиĐĩ, аĐēĐž SponsorBlock ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ</string>
|
||||
<string name="revanced_sb_toast_on_connection_error_summary_off">ĐĐžĐēаСва ŅĐĩ иСвĐĩŅŅиĐĩ, аĐēĐž SponsorBlock ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ</string>
|
||||
<string name="revanced_sb_general_skipcount">ĐŅĐžŅĐģĐĩĐ´. ĐŊа ĐąŅĐžŅ ĐŋŅĐžĐŋŅŅĐēаĐŊиŅ</string>
|
||||
<string name="revanced_sb_general_skipcount_sum_on">ĐĐžĐēаСва в ĐēĐģаŅаŅиŅŅа ĐŊа SponsorBlock ĐēĐžĐģĐēĐž вŅĐĩĐŧĐĩ Đĩ ŅĐŋĐĩŅŅĐĩĐŊĐž. ĐĄŅОйŅĐĩĐŊиĐĩ ŅĐĩ иСĐŋŅаŅа ĐŋŅи вŅŅĐēа ĐŋŅĐžĐŋŅŅĐŊаŅа ŅаŅŅ</string>
|
||||
<string name="revanced_sb_general_skipcount_sum_off">ĐŅĐžŅĐģĐĩĐ´. ĐŊа ĐąŅĐžŅ ĐŋŅĐžĐŋŅŅĐēаĐŊĐ¸Ņ Đĩ иСĐēĐģŅŅĐĩĐŊ</string>
|
||||
<string name="revanced_sb_general_min_duration">ĐиĐŊиĐŧаĐģĐŊа ĐŋŅОдŅĐģĐļиŅĐĩĐģĐŊĐžŅŅ ĐŊа ŅĐĩĐŗĐŧĐĩĐŊŅа</string>
|
||||
<string name="revanced_sb_general_min_duration_sum">ЧаŅŅи, ĐŋĐž-ĐēŅаŅĐēи ĐžŅ ŅаСи ŅŅОКĐŊĐžŅŅ (в ŅĐĩĐēŅĐŊди) ĐŊŅĐŧа да ĐąŅĐ´Đ°Ņ ĐŋŅĐžĐŋŅŅĐēаĐŊи иĐģи ĐŋĐžĐēаСваĐŊи</string>
|
||||
<string name="revanced_sb_general_min_duration_invalid">ĐĐĩваĐģидĐŊа вŅĐĩĐŧĐĩŅŅаĐĩĐŊĐĩ</string>
|
||||
<string name="revanced_sb_general_uuid">ĐаŅиŅŅ ŅĐŊиĐēаĐģĐĩĐŊ ĐŋĐžŅŅĐĩйиŅĐĩĐģŅĐēи id</string>
|
||||
<string name="revanced_sb_general_uuid_sum">ĐĸОва ŅŅŅйва да ŅĐĩ Đ´ŅŅĐļи ŅаКĐŊĐž. ĐĸĐž Đĩ ĐēаŅĐž ĐŋаŅĐžĐģа и ĐŊĐĩ ŅŅŅйва да ŅĐĩ ŅĐŋОдĐĩĐģŅ Ņ ĐŊиĐēĐžĐŗĐž. ĐĐēĐž ĐŊŅĐēОК ĐŗĐž иĐŧа, ŅĐž ŅОК ĐŧĐžĐļĐĩ да ŅĐĩ ĐŋŅĐĩĐ´ŅŅави вĐŧĐĩŅŅĐž ваŅ</string>
|
||||
<string name="revanced_sb_general_uuid_invalid">ĐиŅĐŊиŅŅ Id ŅŅŅйва да Đĩ Ņ Đ´ŅĐģĐļиĐŊа ĐŋĐžĐŊĐĩ 30 СĐŊаĐēа</string>
|
||||
<string name="revanced_sb_general_api_url">ĐŅĐžĐŧŅĐŊа URL ĐŊа API</string>
|
||||
<string name="revanced_sb_general_api_url_sum">ĐĐ´ŅĐĩŅŅŅ, ĐēОКŅĐž SponsorBlock иСĐŋĐžĐģСва Са ŅвŅŅСваĐŊĐĩ ĐēŅĐŧ ŅŅŅвŅŅа</string>
|
||||
<string name="revanced_sb_api_url_reset">ĐŅĐģиŅаĐŊĐĩ URL адŅĐĩŅа ĐŊа API</string>
|
||||
<string name="revanced_sb_api_url_invalid">URL адŅĐĩŅŅŅ Đĩ ĐŊĐĩваĐģидĐĩĐŊ</string>
|
||||
<string name="revanced_sb_api_url_changed">URL адŅĐĩŅŅŅ ĐŊа API Đĩ ĐŋŅĐžĐŧĐĩĐŊĐĩĐŊ</string>
|
||||
<string name="revanced_sb_settings_ie">ĐаŅŅŅОКĐēи Са вĐŊаŅŅĐŊĐĩ и иСĐŊаŅŅĐŊĐĩ</string>
|
||||
<string name="revanced_sb_settings_copy">ĐĐžĐŋиŅаĐŊĐĩ</string>
|
||||
<string name="revanced_sb_settings_ie_sum">ĐаŅаŅа JSON ĐēĐžĐŊŅĐ¸ĐŗŅŅаŅĐ¸Ņ ĐŊа SponsorBlock ĐŧĐžĐļĐĩ да ĐąŅĐ´Đĩ иĐŧĐŋĐžŅŅиŅаĐŊа/ĐĩĐēŅĐŋĐžŅŅиŅаĐŊа в ReVanced и Đ´ŅŅĐŗĐ¸ ĐŋĐģаŅŅĐžŅĐŧи ĐŊа SponsorBlock</string>
|
||||
<string name="revanced_sb_settings_ie_sum_warning">ĐаŅаŅа SponsorBlock JSON ĐēĐžĐŊŅĐ¸ĐŗŅŅаŅĐ¸Ņ ĐēĐžŅŅĐž ĐŧĐžĐļĐĩ да ŅĐĩ иĐŧĐŋĐžŅŅиŅа/ĐĩĐēŅĐŋĐžŅŅиŅа Đ´Đž ReVanced иĐģи Đ´ŅŅĐŗĐ¸ ĐŋĐģаŅŅĐžŅĐŧи ĐŋĐžĐģСваŅи SponsorBlock. ĐĸОва вĐēĐģŅŅва ваŅĐ¸Ņ ĐŋĐžŅŅĐĩйиŅĐĩĐģŅĐēи id. ĐĄĐŋОдĐĩĐģŅĐšŅĐĩ ŅОва ŅаСŅĐŧĐŊĐž</string>
|
||||
<string name="revanced_sb_settings_import_successful">ĐаŅŅŅОКĐēиŅĐĩ Ņа ŅŅĐŋĐĩŅĐŊĐž вŅŅŅаĐŊОвĐĩĐŊи</string>
|
||||
<string name="revanced_sb_settings_import_failed">ĐĐĩŅŅĐŋĐĩŅĐŊĐž иĐŧĐŋĐžŅŅиŅаĐŊĐĩ: %s</string>
|
||||
<string name="revanced_sb_settings_export_failed">ĐĐĩŅŅĐŋĐĩŅĐŊĐž ĐĩĐēŅĐŋĐžŅŅиŅаĐŊĐĩ ĐŊа %s</string>
|
||||
<string name="revanced_sb_settings_revanced_export_user_id_warning">ĐаŅиŅĐĩ ĐŊаŅŅŅОКĐēи ĐŊа SponsorBlock ŅŅĐ´ŅŅĐļĐ°Ņ ĐģиŅĐŊĐž Id.\n\nĐаŅĐĩŅĐž Id Đĩ ĐēаŅĐž ĐŋаŅĐžĐģа и ĐŊĐĩ ŅŅŅйва да ŅĐĩ ŅĐŋОдĐĩĐģŅ Ņ ĐŊиĐēĐžĐŗĐž\n</string>
|
||||
<string name="revanced_sb_settings_revanced_export_user_id_warning_dismiss">ĐĐĩ ĐŋĐžĐēаСваК ĐžŅĐŊОвО</string>
|
||||
<string name="revanced_sb_diff_segments">ĐŅĐžĐŧĐĩĐŊи ĐŋОвĐĩĐ´ĐĩĐŊиĐĩŅĐž ĐŊа ŅĐ¸ĐŗĐŧĐĩĐŊŅа</string>
|
||||
<string name="revanced_sb_segments_sponsor">ĐĄĐŋĐžĐŊŅĐžŅ</string>
|
||||
<string name="revanced_sb_segments_sponsor_sum">ĐĐģаŅĐĩĐŊа ĐŋŅĐžĐŧĐžŅиŅ, ĐŋĐģаŅĐĩĐŊи ĐŋŅĐĩĐŋĐžŅŅĐēи и диŅĐĩĐēŅĐŊи ŅĐĩĐēĐģаĐŧи. ĐĐĩ Са ŅаĐŧĐžŅĐĩĐēĐģаĐŧа иĐģи ĐąĐĩСĐŋĐģаŅĐŊи ĐŋŅĐĩĐŋĐžŅŅĐēи Са ĐēаŅСи/ŅŅСдаŅĐĩĐģи/ŅĐĩĐąŅаКŅОвĐĩ/ĐŋŅОдŅĐēŅи, ĐēОиŅĐž ŅĐĩ Ņ
аŅĐĩŅĐ˛Đ°Ņ ĐŊа авŅĐžŅа</string>
|
||||
<string name="revanced_sb_segments_selfpromo">ĐĐĩĐŋĐģаŅĐĩĐŊа/ХаĐŧĐžŅĐĩĐēĐģаĐŧа</string>
|
||||
<string name="revanced_sb_segments_selfpromo_sum">ĐОдОйĐŊĐž ĐŊа âĐĄĐŋĐžĐŊŅĐžŅâ, Ņ Đ¸ĐˇĐēĐģŅŅĐĩĐŊиĐĩ ĐŊа ĐŊĐĩĐŋĐģаŅĐĩĐŊĐž иĐģи ŅаĐŧĐžŅĐĩĐēĐģаĐŧа. ĐĐēĐģŅŅва ŅаСдĐĩĐģи Са ŅŅĐžĐēи, даŅĐĩĐŊĐ¸Ņ Đ¸Đģи иĐŊŅĐžŅĐŧаŅĐ¸Ņ ĐˇĐ° ŅОва Ņ ĐēĐžĐŗĐž Ņа Ņи ŅŅŅŅŅĐ´ĐŊиŅиĐģи</string>
|
||||
<string name="revanced_sb_segments_interaction">ĐаĐŋĐžĐŧĐŊŅĐŊĐĩ Са Đ´ĐĩĐšŅŅвиĐĩ (айОĐŊиŅаĐŊĐĩ)</string>
|
||||
<string name="revanced_sb_segments_interaction_sum">ĐŅаŅĐēĐž ĐŊаĐŋĐžĐŧĐŊŅĐŊĐĩ да Ņ
аŅĐĩŅаŅĐĩ, айОĐŊиŅаŅĐĩ иĐģи ĐŋĐžŅĐģĐĩдваŅĐĩ в ŅŅĐĩдаŅа ĐŊа ŅŅĐ´ŅŅĐļаĐŊиĐĩŅĐž. ĐĐēĐž Đĩ Đ´ŅĐģĐŗĐž иĐģи Са ĐŊĐĩŅĐž ĐēĐžĐŊĐēŅĐĩŅĐŊĐž, вĐŧĐĩŅŅĐž ŅОва ŅŅŅйва да ĐąŅĐ´Đĩ ŅаĐŧĐžŅĐĩĐēĐģаĐŧа</string>
|
||||
<string name="revanced_sb_segments_highlight">ĐĐēŅĐĩĐŊŅи</string>
|
||||
<string name="revanced_sb_segments_highlight_sum">ЧаŅŅŅа ĐžŅ Đ˛Đ¸Đ´ĐĩĐžŅĐž ĐēĐžŅŅĐž ĐŋОвĐĩŅĐĩŅĐž Ņ
ĐžŅа ŅŅŅŅŅŅ</string>
|
||||
<string name="revanced_sb_segments_intro">ĐаŅСа / ĐаŅаĐģĐŊа аĐŊиĐŧаŅиŅ</string>
|
||||
<string name="revanced_sb_segments_intro_sum">ĐĐŊŅĐĩŅваĐģ ĐąĐĩС ŅĐĩаĐģĐŊĐž ŅŅĐ´ŅŅĐļаĐŊиĐĩ. ĐĐžĐļĐĩ да ĐąŅĐ´Đĩ ĐŋаŅСа, ŅŅаŅиŅĐĩĐŊ ĐēадŅŅ, ĐŋОвŅаŅŅŅа ŅĐĩ аĐŊиĐŧаŅиŅ. ĐĸОва ĐŊĐĩ ŅŅŅйва да ŅĐĩ иСĐŋĐžĐģСва Са ĐŋŅĐĩŅ
Оди, ŅŅĐ´ŅŅĐļаŅи иĐŊŅĐžŅĐŧаŅиŅ</string>
|
||||
<string name="revanced_sb_segments_outro">ĐаŅŅи в ĐēŅаŅ/ĐĐžŅŅĐŊĐĩĐŊиŅ</string>
|
||||
<string name="revanced_sb_segments_outro_sum">ĐĐŊŅĐžŅĐŧаŅĐ¸Ņ Đ¸Đģи ĐēĐžĐŗĐ°ŅĐž ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ĐēŅаКĐŊиŅĐĩ ĐēаŅŅи ĐŊа YouTube. ĐĐĩ Са СаĐēĐģŅŅĐĩĐŊĐ¸Ņ Ņ Đ¸ĐŊŅĐžŅĐŧаŅиŅ</string>
|
||||
<string name="revanced_sb_segments_preview">ĐŅаŅŅĐē ĐŋŅĐĩĐŗĐģĐĩĐ´/ĐйОйŅĐĩĐŊиĐĩ</string>
|
||||
<string name="revanced_sb_segments_preview_sum">ĐĐžĐģĐĩĐēŅĐ¸Ņ ĐžŅ ĐēĐģиĐŋОвĐĩ, ĐēОиŅĐž ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ĐēаĐēвО ĐŋŅĐĩĐ´ŅŅОи в ŅОСи видĐĩĐžĐēĐģиĐŋ иĐģи в Đ´ŅŅĐŗĐ¸ видĐĩĐžĐēĐģиĐŋОвĐĩ ĐžŅ ĐŋĐžŅĐĩдиŅаŅа, ĐēŅĐ´ĐĩŅĐž ŅŅĐģаŅа иĐŊŅĐžŅĐŧаŅĐ¸Ņ ŅĐĩ ĐŋОвŅаŅŅ ĐŋĐž-ĐēŅŅĐŊĐž вŅв видĐĩĐžĐēĐģиĐŋа</string>
|
||||
<string name="revanced_sb_segments_filler">ĐŅĐģĐŊĐĩĐļ/ШĐĩĐŗĐ¸</string>
|
||||
<string name="revanced_sb_segments_filler_sum">ĐĄŅĐĩĐŊи иСвŅĐŊ ŅĐĩĐŧаŅа, дОйавĐĩĐŊи ŅаĐŧĐž Са ĐŋŅĐģĐŊĐĩĐļ иĐģи Ņ
ŅĐŧĐžŅ, ĐēОиŅĐž ĐŊĐĩ Ņа ĐŊĐĩОйŅ
ОдиĐŧи Са ŅаСйиŅаĐŊĐĩŅĐž ĐŊа ĐžŅĐŊОвĐŊĐžŅĐž ŅŅĐ´ŅŅĐļаĐŊиĐĩ ĐŊа видĐĩĐžĐēĐģиĐŋа. ĐĸОва ĐŊĐĩ ŅŅŅйва да вĐēĐģŅŅва ŅĐĩĐŗĐŧĐĩĐŊŅи, ĐŋŅĐĩĐ´ĐžŅŅавŅŅи ĐēĐžĐŊŅĐĩĐēŅŅ Đ¸Đģи ŅĐŋŅавОŅĐŊи даĐŊĐŊи</string>
|
||||
<string name="revanced_sb_segments_nomusic">ĐŅСиĐēа: ЧаŅŅ ĐąĐĩС ĐŧŅСиĐēа</string>
|
||||
<string name="revanced_sb_segments_nomusic_sum">Đа иСĐŋĐžĐģСваĐŊĐĩ ŅаĐŧĐž в ĐŧŅСиĐēаĐģĐŊи видĐĩĐžĐēĐģиĐŋОвĐĩ. ĐĸОва ŅŅŅйва да ŅĐĩ иСĐŋĐžĐģСва ŅаĐŧĐž Са ŅаŅŅи ĐžŅ ĐŧŅСиĐēаĐģĐŊи видĐĩĐžĐēĐģиĐŋОвĐĩ, ĐēОиŅĐž вĐĩŅĐĩ ĐŊĐĩ Ņа ОйŅ
ваĐŊаŅи ĐžŅ Đ´ŅŅĐŗĐ° ĐēаŅĐĩĐŗĐžŅиŅ</string>
|
||||
<string name="revanced_sb_skip_button_compact">ĐŅĐžĐŋŅŅĐŊи</string>
|
||||
<string name="revanced_sb_skip_button_compact_highlight">ĐĐēŅĐĩĐŊŅи</string>
|
||||
<string name="revanced_sb_skip_button_sponsor">ĐŅĐžĐŋŅŅĐŊи ŅĐŋĐžĐŊŅĐžŅ</string>
|
||||
<string name="revanced_sb_skip_button_selfpromo">ĐŅĐžĐŋŅŅĐŊи ĐŋŅĐžĐŧĐžŅиŅ</string>
|
||||
<string name="revanced_sb_skip_button_interaction">ĐŅĐžĐŋŅŅĐŊи ĐŋОдĐēаĐŊваĐŊĐĩ</string>
|
||||
<string name="revanced_sb_skip_button_highlight">ĐŅĐžĐŋŅŅĐŊи Đ´Đž аĐēŅĐĩĐŊŅи</string>
|
||||
<string name="revanced_sb_skip_button_intro_beginning">ĐŅĐžĐŋŅŅĐŊĐĩŅĐĩ вŅвĐĩĐ´ĐĩĐŊиĐĩŅĐž</string>
|
||||
<string name="revanced_sb_skip_button_intro_middle">ĐŅĐžĐŋŅŅĐŊи ĐŋаŅСа</string>
|
||||
<string name="revanced_sb_skip_button_intro_end">ĐŅĐžĐŋŅŅĐŊи ĐŋаŅСа</string>
|
||||
<string name="revanced_sb_skip_button_outro">ĐŅĐžĐŋŅŅĐŊи СаĐēĐģŅŅĐĩĐŊиĐĩ</string>
|
||||
<string name="revanced_sb_skip_button_preview_beginning">ĐŅĐžĐŋŅŅĐŊи ĐŋŅĐĩĐŗĐģĐĩĐ´</string>
|
||||
<string name="revanced_sb_skip_button_preview_middle">ĐŅĐžĐŋŅŅĐŊи ĐŋŅĐĩĐŗĐģĐĩĐ´</string>
|
||||
<string name="revanced_sb_skip_button_preview_end">ĐŅĐžĐŋŅŅĐŊĐĩŅĐĩ ОйОйŅĐĩĐŊиĐĩŅĐž</string>
|
||||
<string name="revanced_sb_skip_button_filler">ĐŅĐžĐŋŅŅĐŊи ĐŋŅĐģĐŊĐĩĐļ</string>
|
||||
<string name="revanced_sb_skip_button_nomusic">ĐŅĐžĐŋŅŅĐŊи ŅаŅŅ ĐąĐĩС ĐŧŅСиĐēа</string>
|
||||
<string name="revanced_sb_skip_button_unsubmitted">ĐŅĐžĐŋŅŅĐēаĐŊĐĩ ĐŊа ŅĐĩĐŗĐŧĐĩĐŊŅ</string>
|
||||
<string name="revanced_sb_skipped_sponsor">ĐŅĐžĐŋŅŅĐŊĐ°Ņ ŅĐŋĐžĐŊŅĐžŅ</string>
|
||||
<string name="revanced_sb_skipped_selfpromo">ĐŅĐžĐŋŅŅĐŊаŅа ŅаĐŧĐžŅĐĩĐēĐģаĐŧа</string>
|
||||
<string name="revanced_sb_skipped_interaction">ĐŅĐžĐŋŅŅĐŊаŅĐž Đ´ĐžŅадĐŊĐž ĐŊаĐŋĐžĐŧĐŊŅĐŊĐĩ</string>
|
||||
<string name="revanced_sb_skipped_highlight">ĐŅĐžĐŋŅŅĐŊаŅĐž Đ´Đž аĐēŅĐĩĐŊŅ</string>
|
||||
<string name="revanced_sb_skipped_intro_beginning">ĐŅĐžĐŋŅŅĐŊаŅĐž вŅвĐĩĐ´ĐĩĐŊиĐĩ</string>
|
||||
<string name="revanced_sb_skipped_intro_middle">ĐŅĐžĐŋŅŅĐŊи ĐŋаŅСи</string>
|
||||
<string name="revanced_sb_skipped_intro_end">ĐŅĐžĐŋŅŅĐŊи ĐŋаŅСи</string>
|
||||
<string name="revanced_sb_skipped_outro">ĐŅĐžĐŋŅŅĐŊаŅĐž СаĐēĐģŅŅĐĩĐŊиĐĩ</string>
|
||||
<string name="revanced_sb_skipped_preview_beginning">ĐŅĐžĐŋŅŅĐŊĐ°Ņ ĐŋŅĐĩĐŗĐģĐĩĐ´</string>
|
||||
<string name="revanced_sb_skipped_preview_middle">ĐŅĐžĐŋŅŅĐŊĐ°Ņ ĐŋŅĐĩĐŗĐģĐĩĐ´</string>
|
||||
<string name="revanced_sb_skipped_preview_end">ĐŅĐžĐŋŅŅĐŊаŅĐž ĐŋОвŅĐžŅĐĩĐŊиĐĩ</string>
|
||||
<string name="revanced_sb_skipped_filler">ĐŅĐžĐŋŅŅĐŊĐ°Ņ ĐŋŅĐģĐŊĐĩĐļ</string>
|
||||
<string name="revanced_sb_skipped_nomusic">ĐŅĐžĐŋŅŅĐŊаŅа ŅаŅŅ ĐąĐĩС ĐŧŅСиĐēа</string>
|
||||
<string name="revanced_sb_skipped_unsubmitted">ĐŅĐžĐŋŅŅĐŊĐ°Ņ ĐŊĐĩиСĐŋŅаŅĐĩĐŊ ŅĐĩĐŗĐŧĐĩĐŊŅ</string>
|
||||
<string name="revanced_sb_skipped_multiple_segments">ĐŅĐžĐŋŅŅĐŊаŅи ĐŧĐŊĐžĐļĐĩŅŅвО ŅаŅŅи</string>
|
||||
<string name="revanced_sb_skip_automatically">Đа ŅĐĩ ĐŋŅĐĩŅĐēаŅа ĐžŅ ŅаĐŧĐž ŅĐĩĐąĐĩ Ņи</string>
|
||||
<string name="revanced_sb_skip_automatically_once">ĐвŅ. ĐŋŅĐžĐŋŅŅĐēаĐŊĐĩ вĐĩĐ´ĐŊŅĐļ</string>
|
||||
<string name="revanced_sb_skip_showbutton">ĐĐžĐēаСваК ĐąŅŅĐžĐŊ Са ĐŋŅĐžĐŋŅŅĐēаĐŊĐĩ</string>
|
||||
<string name="revanced_sb_skip_seekbaronly">ĐĐžĐēаСв. в ĐģĐĩĐŊŅаŅа Са вŅĐĩĐŧĐĩ</string>
|
||||
<string name="revanced_sb_skip_ignore">ĐСĐēĐģŅŅваĐŊĐĩ</string>
|
||||
<string name="revanced_sb_submit_failed_invalid">ĐĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ иСĐŋŅаŅи ŅĐĩĐŗĐŧĐĩĐŊŅ: %s</string>
|
||||
<string name="revanced_sb_submit_failed_timeout">SponsorBlock вŅĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ ŅайОŅи</string>
|
||||
<string name="revanced_sb_submit_failed_unknown_error">ĐĐĩ ĐŧĐžĐŗĐ°Ņ Đ´Đ° ŅĐĩ иСĐŋŅаŅŅŅ ŅĐ¸ĐŗĐŧĐĩĐŊŅи: (ŅŅаŅŅŅ:%1$d %2$s)</string>
|
||||
<string name="revanced_sb_submit_failed_rate_limit">ĐĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ иСĐŋŅаŅи ŅаŅŅŅа.\nĐŅĐžŅŅ Đĩ ĐžĐŗŅаĐŊиŅĐĩĐŊ (ĐĸвŅŅĐ´Đĩ ĐŧĐŊĐžĐŗĐž ĐžŅ ĐĩдиĐŊ и ŅŅŅ ĐŋĐžŅŅĐĩйиŅĐĩĐģ, IP)</string>
|
||||
<string name="revanced_sb_submit_failed_forbidden">ĐĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ иСĐŋŅаŅи ŅаŅŅŅа: %s</string>
|
||||
<string name="revanced_sb_submit_failed_duplicate">ĐĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ иСĐŋŅаŅи ŅаŅŅŅа.\nĐĐĩŅĐĩ ŅŅŅĐĩŅŅвŅва</string>
|
||||
<string name="revanced_sb_submit_succeeded">ЧаŅŅŅа Đĩ иСĐŋŅаŅĐĩĐŊа ŅŅĐŋĐĩŅĐŊĐž</string>
|
||||
<!-- Toast shown if network connection times out. Translations of this should not be longer than the original English or the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_sb_sponsorblock_connection_failure_timeout">SponsorBlock вŅĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ (API timed out)</string>
|
||||
<string name="revanced_sb_sponsorblock_connection_failure_status">SponsorBlock вŅĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ (status %d)</string>
|
||||
<string name="revanced_sb_sponsorblock_connection_failure_generic">SponsorBlock вŅĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ</string>
|
||||
<string name="revanced_sb_vote_failed_timeout">ĐĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ ĐŗĐģаŅŅва Са ŅĐĩĐŗĐŧĐĩĐŊŅ (API timed out)</string>
|
||||
<string name="revanced_sb_vote_failed_unknown_error">ĐĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ ĐŗĐģаŅŅва Са ŅаŅŅиŅĐĩ: (ŅŅаŅŅŅ: %1$d %2$s)</string>
|
||||
<string name="revanced_sb_vote_failed_forbidden">ĐĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ ĐŗĐģаŅŅва Са ŅаŅŅ: %s</string>
|
||||
<string name="revanced_sb_vote_upvote">ĐĐžĐģĐžĐļиŅĐĩĐģĐĩĐŊ вОŅ</string>
|
||||
<string name="revanced_sb_vote_downvote">ĐŅŅиŅаŅĐĩĐģĐĩĐŊ вОŅ</string>
|
||||
<string name="revanced_sb_vote_category">ĐŅĐžĐŧŅĐŊа ĐŊа ĐēаŅĐĩĐŗĐžŅиŅŅа</string>
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<string name="revanced_sb_vote_no_segments">ĐŅĐŧа ŅĐĩĐŗĐŧĐĩĐŊŅи, Са ĐēОиŅĐž да ĐŗĐģаŅŅваŅĐĩ</string>
|
||||
<string name="revanced_sb_new_segment_choose_category">ĐСйĐĩŅĐĩŅĐĩ ĐēаŅĐĩĐŗĐžŅĐ¸Ņ ŅĐĩĐŗĐŧĐĩĐŊŅ</string>
|
||||
<string name="revanced_sb_new_segment_disabled_category">ĐаŅĐĩĐŗĐžŅиŅŅа Đĩ иСĐēĐģ. в ĐŊаŅŅŅОКĐēиŅĐĩ. ĐĐēĐģ. Ņ ĐˇĐ° да ĐŧĐžĐļĐĩŅĐĩ да иСĐŋŅаŅиŅĐĩ.</string>
|
||||
<string name="revanced_sb_new_segment_title">ĐОва ŅаŅŅ Đ˛ SponsorBlock</string>
|
||||
<string name="revanced_sb_new_segment_mark_time_as_question">ĐадаваĐŊĐĩ ĐŊа %s ĐēаŅĐž ĐŊаŅаĐģĐž иĐģи ĐēŅаК ĐŊа ĐŊОв ŅаСдĐĩĐģ?</string>
|
||||
<string name="revanced_sb_new_segment_mark_start">ĐŊаŅаĐģĐž</string>
|
||||
<string name="revanced_sb_new_segment_mark_end">ĐēŅаК</string>
|
||||
<string name="revanced_sb_new_segment_now">ŅĐĩĐŗĐ°</string>
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<string name="revanced_sb_new_segment_time_start">ЧаŅŅŅа СаĐŋĐžŅва ĐžŅ</string>
|
||||
<string name="revanced_sb_new_segment_time_end">ЧаŅŅŅа ŅвŅŅŅва Đ´Đž</string>
|
||||
<string name="revanced_sb_new_segment_confirm_title">ĐŅĐĩĐŧĐĩĐŊаŅа ŅĐžŅĐŊи Đģи Ņа?</string>
|
||||
<string name="revanced_sb_new_segment_confirm_content">ĐĄĐĩĐŗĐŧĐĩĐŊŅŅŅ ĐŋŅОдŅĐģĐļава ĐžŅ\n\n%1$s\nĐ´Đž\n%2$s\n\n(%3$s)\n\nĐĐžŅОв Đģи Đĩ Са иСĐŋŅаŅаĐŊĐĩ?</string>
|
||||
<string name="revanced_sb_new_segment_start_is_before_end">ĐаŅаĐģĐžŅĐž ŅŅŅйва да ĐąŅĐ´Đĩ ĐŋŅĐĩди ĐēŅаŅ</string>
|
||||
<string name="revanced_sb_new_segment_mark_locations_first">ĐŅŅвО ĐŧаŅĐēиŅаКŅĐĩ двĐĩ ĐŧĐĩŅŅа в ĐģĐĩĐŊŅаŅа Са вŅĐĩĐŧĐĩŅĐž</string>
|
||||
<string name="revanced_sb_new_segment_preview_segment_first">ĐŅĐĩĐŗĐģĐĩĐ´ и ĐŋŅОвĐĩŅĐēа ĐŊа ŅаŅŅŅа Са ĐŊĐžŅĐŧаĐģĐŊĐž ĐŋŅĐžĐŋŅŅĐēаĐŊĐĩ</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_title">Đ ŅŅĐŊĐž ŅĐĩдаĐēŅиŅаĐŊĐĩ ĐŊа вŅĐĩĐŧĐĩĐŊаŅа ĐŊа ŅаŅŅŅа</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_content">ĐĐĩĐģаĐĩŅĐĩ Đģи да ŅĐĩдаĐēŅиŅаŅĐĩ вŅĐĩĐŧĐĩĐŊаŅа Са ĐŊаŅаĐģĐž иĐģи ĐēŅаК ĐŊа ŅаŅŅŅа?</string>
|
||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">ĐададĐĩĐŊĐž Đĩ ĐŊĐĩваĐģидĐŊĐž вŅĐĩĐŧĐĩ</string>
|
||||
<string name="revanced_sb_stats">ĐĄŅаŅиŅŅиĐēа</string>
|
||||
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||
<string name="revanced_sb_stats_connection_failure">ĐĄŅаŅиŅŅиĐēаŅа Đĩ вŅаĐŧĐĩĐŊĐŊĐž ĐŊĐĩĐ´ĐžŅŅŅĐŋĐŊа (API ĐŊĐĩ ŅайОŅи)</string>
|
||||
<string name="revanced_sb_stats_loading">ĐаŅĐĩĐļдаĐŊĐĩ...</string>
|
||||
<string name="revanced_sb_stats_sb_disabled">SponsorBlock Đĩ иСĐēĐģŅŅĐĩĐŊĐž</string>
|
||||
<string name="revanced_sb_stats_username">ĐаŅĐĩŅĐž ĐŋĐžŅŅĐĩĐą. иĐŧĐĩ: <b>%s</b></string>
|
||||
<string name="revanced_sb_stats_username_change">ĐĐžĐēĐžŅĐŊĐĩŅĐĩ Са ĐŋŅĐžĐŧŅĐŊа ĐŋĐžŅŅĐĩйиŅĐĩĐģŅĐēĐžŅĐž иĐŧĐĩ</string>
|
||||
<string name="revanced_sb_stats_username_change_unknown_error">ĐĐĩ ĐŧĐžĐļĐĩ да ŅĐĩ ĐŋŅĐžĐŧĐĩĐŊи ĐŋĐžŅŅĐĩĐą. иĐŧĐĩ: ĐĄŅŅŅĐžŅĐŊиĐĩ: %1$d%2$s</string>
|
||||
<string name="revanced_sb_stats_username_changed">ĐĐžŅŅĐĩйиŅĐĩĐģŅĐēĐžŅĐž иĐŧĐĩ Đĩ ŅŅĐŋĐĩŅĐŊĐž ĐŋŅĐžĐŧĐĩĐŊĐĩĐŊĐž</string>
|
||||
<string name="revanced_sb_stats_reputation">Đ ĐĩĐŋŅŅаŅиŅŅа ви Đĩ <b>%.2f</b></string>
|
||||
<string name="revanced_sb_stats_submissions">ĐĄŅСдадОŅ
ŅĐĩ <b>%s</b> ŅаŅŅи</string>
|
||||
<string name="revanced_sb_stats_saved_zero">SponsorBlock ĐēĐģаŅаŅиŅ</string>
|
||||
<string name="revanced_sb_stats_saved">ĐĄĐŋаŅиŅ
ŅĐĩ Ņ
ĐžŅаŅа ĐžŅ <b>%s</b> ŅаŅŅи</string>
|
||||
<string name="revanced_sb_stats_saved_sum_zero">ĐĐžĐēĐžŅĐŊĐĩŅĐĩ Са да видиŅĐĩ ŅŅаŅиŅŅиĐēаŅа и ŅĐĩСи Đ´ĐžĐŋŅиĐŊĐĩŅĐģи ĐŊаК-ĐŧĐŊĐžĐŗĐž</string>
|
||||
<string name="revanced_sb_stats_saved_sum">ĐĸОва Đĩ <b>%s</b> ĐžŅ ĐļивОŅа иĐŧ.<br>ĐŠŅаĐēĐŊĐĩŅĐĩ, Са да видиŅĐĩ ĐēĐģаŅаŅиŅŅа</string>
|
||||
<string name="revanced_sb_stats_self_saved">ĐŅĐžĐŋŅŅĐŊаĐģи ŅŅĐĩ <b>%s</b> ŅаŅŅи</string>
|
||||
<string name="revanced_sb_stats_self_saved_sum">ĐĸОва Đĩ <b>%s</b></string>
|
||||
<string name="revanced_sb_stats_self_saved_reset_title">ĐŅĐģиŅаĐŊĐĩ ĐŊа ĐąŅĐžŅŅа ĐŊа ĐŋŅĐžĐŋŅŅĐŊаŅи ŅаŅŅи?</string>
|
||||
<string name="revanced_sb_stats_saved_hour_format">%1$s ŅаŅОвĐĩ %2$s ĐŧиĐŊŅŅи</string>
|
||||
<string name="revanced_sb_stats_saved_minute_format">%1$s ĐŧиĐŊŅŅи %2$s ŅĐĩĐēŅĐŊди</string>
|
||||
<string name="revanced_sb_stats_saved_second_format">%s ŅĐĩĐēŅĐŊди</string>
|
||||
<string name="revanced_sb_color_dot_label">ĐĻвŅŅ:</string>
|
||||
<string name="revanced_sb_color_changed">ĐĻвĐĩŅŅŅ Đĩ ĐŋŅĐžĐŧĐĩĐŊĐĩĐŊ</string>
|
||||
<string name="revanced_sb_color_reset">ĐŅСŅŅаĐŊОви ŅвĐĩŅа</string>
|
||||
<string name="revanced_sb_color_invalid">ĐĐĩваĐģидĐŊа ŅŅОКĐŊĐžŅŅ ĐˇĐ° ŅвĐĩŅа</string>
|
||||
<string name="revanced_sb_reset_color">ĐŅСŅŅаĐŊОвŅваĐŊĐĩ ĐŊа ŅвŅŅ</string>
|
||||
<string name="revanced_sb_reset">ĐŅĐģиŅаĐŊĐĩ</string>
|
||||
<string name="revanced_sb_about">ĐŅĐŊĐžŅĐŊĐž</string>
|
||||
<string name="revanced_sb_about_api_sum">ĐаĐŊĐŊиŅĐĩ Ņа ĐŋŅĐĩĐ´ĐžŅŅавĐĩĐŊи ĐžŅ SponsorBlock API. ĐĐžĐēĐžŅĐŊĐĩŅĐĩ ŅŅĐē Са ĐŋОвĐĩŅĐĩ иĐŊŅĐžŅĐŧаŅĐ¸Ņ Đ¸ иСŅĐĩĐŗĐģиŅĐŊиŅ</string>
|
||||
</patch>
|
||||
<patch id="layout.spoofappversion.SpoofAppVersionPatch">
|
||||
<string name="revanced_spoof_app_version_title">ĐОдĐģŅĐŗĐ˛Đ°ĐŊĐĩ Са вĐĩŅŅиŅŅа ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž</string>
|
||||
<string name="revanced_spoof_app_version_summary_on">ĐОдĐŋŅавĐĩĐŊа вĐĩŅŅиŅ</string>
|
||||
<string name="revanced_spoof_app_version_summary_off">ĐĐĩ ĐŋОдĐŋŅавĐĩĐŊа вĐĩŅŅиŅ</string>
|
||||
<string name="revanced_spoof_app_version_user_dialog_message">ĐĐĩŅŅиŅŅа ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž YouTube ŅĐĩ ĐąŅĐ´Đĩ ĐŋŅĐžĐŧĐĩĐŊĐĩĐŊа ĐŊа ĐŋĐž-ŅŅаŅа.\n\nĐĸОва ŅĐĩ ĐŋŅĐžĐŧĐĩĐŊи вŅĐŊŅĐŊĐ¸Ņ Đ˛Đ¸Đ´ и ŅŅĐŊĐēŅииŅĐĩ ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž.\n\nĐŊĐž аĐēĐž ĐŋĐž-ĐēŅŅĐŊĐž ŅĐĩ Đ´ĐĩаĐēŅивиŅа, ŅĐĩ ĐŋŅĐĩĐŋĐžŅŅŅва да иСŅиŅŅиŅĐĩ даĐŊĐŊиŅĐĩ ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž, Са да иСйĐĩĐŗĐŊĐĩŅĐĩ ĐŗŅĐĩŅĐēи в ĐŋĐžŅŅĐĩйиŅĐĩĐģŅĐēĐ¸Ņ Đ¸ĐŊŅĐĩŅŅĐĩĐšŅ.</string>
|
||||
<!-- It is ideal, but not required, if the text here appears is alphabetically after the text used for 'revanced_spoof_app_version_title'.
|
||||
This is because the 'General layout' menu uses alphabetic sorting, and it functionally works better if the spoof target selector appears below the 'Spoof app version' UI switch -->
|
||||
<string name="revanced_spoof_app_version_target_title">ĐОдĐģŅĐŗĐ˛Đ°ĐŊĐĩ Са вĐĩŅŅиŅŅа ĐŊа</string>
|
||||
<!-- 'RYD' is 'Return YouTube Dislike' -->
|
||||
<string name="revanced_spoof_app_version_target_entry_1">18.33.40 - ĐŅСŅŅаĐŊОвĐĩŅĐĩ RYD в ŅĐĩĐļиĐŧ âиĐŊĐēĐžĐŗĐŊиŅĐžâ ĐŊа Shorts</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_2">18.20.39 - ĐŅСŅŅаĐŊОвŅваĐŊĐĩ ĐŊа видĐĩĐž ŅĐēĐžŅĐžŅŅ & в ĐŧĐĩĐŊŅŅĐž Са ĐēаŅĐĩŅŅвО</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_3">18.09.39 - ĐŅСŅŅаĐŊОвŅваĐŊĐĩ ĐŊа Ņай \"ĐийĐģиОŅĐĩĐēа\"</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_4">17.41.37 - ĐŅŅŅаĐŊĐĩ ĐŊа ŅĐĩĐēŅиŅŅа Ņ ĐŋĐģĐĩĐšĐģиŅŅа ĐēŅĐŧ ŅŅаŅĐ¸Ņ ŅŅиĐģ</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_5">17.33.42 - ĐŅСŅŅаĐŊОвŅва ŅŅаŅĐ¸Ņ Đ¸ĐˇĐŗĐģĐĩĐ´</string>
|
||||
</patch>
|
||||
<patch id="layout.startpage.ChangeStartPagePatch">
|
||||
<string name="revanced_start_page_title">ĐадаК ĐŊаŅаĐģĐŊа ŅŅŅаĐŊиŅа</string>
|
||||
<string name="revanced_start_page_entry_0">ĐĐž ĐŋОдŅаСйиŅаĐŊĐĩ</string>
|
||||
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||
<string name="revanced_start_page_entry_1">ĐаŅаĐģĐž</string>
|
||||
<string name="revanced_start_page_entry_2">ĐĸŅŅŅĐĩĐŊĐĩ</string>
|
||||
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the subscriptions tab. -->
|
||||
<string name="revanced_start_page_entry_3">ĐйОĐŊаĐŧĐĩĐŊŅи</string>
|
||||
<string name="revanced_start_page_entry_4">Đ Đ°ĐˇĐŗĐģĐĩдаКŅĐĩ</string>
|
||||
<string name="revanced_start_page_entry_5">Shorts</string>
|
||||
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (library) tab. -->
|
||||
<string name="revanced_start_page_entry_6">РаСдĐĩĐģ \"ĐиĐĩ\"</string>
|
||||
<string name="revanced_start_page_entry_7">ĐĨаŅĐĩŅаĐŊи видĐĩа</string>
|
||||
<!-- 'History' should be translated using the same localized wording YouTube displays for the 'history' section in the 'You' tab. -->
|
||||
<string name="revanced_start_page_entry_8">ĐŅŅĐžŅиŅ</string>
|
||||
<string name="revanced_start_page_entry_9">ĐĐžĐŋŅĐģŅŅĐŊи</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.DisableResumingShortsOnStartupPatch">
|
||||
<string name="revanced_disable_resuming_shorts_player_title">ĐĄĐēŅиваĐŊĐĩ ĐŊа Shorts ĐŋĐģĐĩĐšŅŅа ĐŋŅи ŅŅаŅŅиŅаĐŊĐĩ</string>
|
||||
<string name="revanced_disable_resuming_shorts_player_summary_on">Shorts ĐŋĐģĐĩĐšŅŅа ĐŋŅи ŅŅаŅŅиŅаĐŊĐĩ ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž Đĩ ŅĐēŅиŅ</string>
|
||||
<string name="revanced_disable_resuming_shorts_player_summary_off">Shorts ĐŋĐģĐĩĐšŅŅа ĐŋŅи ŅŅаŅŅиŅаĐŊĐĩ ĐŊа ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž ŅĐĩ ĐŋĐžĐēаСва</string>
|
||||
</patch>
|
||||
<patch id="layout.tablet.EnableTabletLayoutPatch">
|
||||
<string name="revanced_tablet_layout_title">ĐĐēĐģŅŅи ŅĐĩĐļиĐŧ Са ŅайĐģĐĩŅ</string>
|
||||
<string name="revanced_tablet_layout_summary_on">Đ ĐĩĐļиĐŧ Са ŅайĐģĐĩŅ Đĩ вĐēĐģ.</string>
|
||||
<string name="revanced_tablet_layout_summary_off">Đ ĐĩĐļиĐŧ Са ŅайĐģĐĩŅ Đĩ иСĐēĐģ.</string>
|
||||
<string name="revanced_tablet_layout_user_dialog_message">ĐŅĐąĐģиĐēаŅииŅĐĩ в ОйŅĐŊĐžŅŅŅа ĐŊĐĩ ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ĐŊа ĐžŅĐžŅĐŧĐģĐĩĐŊĐ¸Ņ ĐˇĐ° ŅайĐģĐĩŅ</string>
|
||||
</patch>
|
||||
<patch id="layout.miniplayer.MiniplayerPatch">
|
||||
<string name="revanced_miniplayer_screen_title">ĐиĐŊиĐŧиСиŅаĐŊ ĐĩĐēŅаĐŊ Са вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩ</string>
|
||||
<string name="revanced_miniplayer_screen_summary">ĐŅĐžĐŧĐĩĐŊĐĩŅĐĩ ŅŅиĐģа ĐŊа ĐŧиĐŊиĐŧиСиŅаĐŊĐ¸Ņ ĐĩĐēŅаĐŊ Са вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩ</string>
|
||||
<string name="revanced_miniplayer_type_title">ĐиĐŊиĐŧиСиŅаĐŊ ŅиĐŋ ĐĩĐēŅаĐŊ Са ĐŗĐģĐĩдаĐŊĐĩ</string>
|
||||
<string name="revanced_miniplayer_type_entry_1">ĐŅĐ¸ĐŗĐ¸ĐŊаĐģ</string>
|
||||
<string name="revanced_miniplayer_type_entry_2">ĐĸĐĩĐģĐĩŅĐžĐŊ</string>
|
||||
<string name="revanced_miniplayer_type_entry_3">ĐĸайĐģĐĩŅ</string>
|
||||
<string name="revanced_miniplayer_type_entry_4">ĐОдĐĩŅĐĩĐŊ 1</string>
|
||||
<string name="revanced_miniplayer_type_entry_5">ĐОдĐĩŅĐĩĐŊ 2</string>
|
||||
<string name="revanced_miniplayer_type_entry_6">ĐОдĐĩŅĐĩĐŊ 3</string>
|
||||
<string name="revanced_miniplayer_hide_expand_close_title">ĐŅŅĐžĐŊи Са ŅаСŅиŅŅваĐŊĐĩ и ŅвиваĐŊĐĩ ĐŊа ĐĩĐēŅаĐŊа</string>
|
||||
<string name="revanced_miniplayer_hide_expand_close_summary_on">ĐĄĐēŅиŅ.\n(ĐŋĐģŅСĐŊĐĩŅĐĩ ĐŧиĐŊиĐŧиСиŅаĐŊĐ¸Ņ ĐĩĐēŅаĐŊ ĐŊа ĐŋĐģĐĩĐšŅŅа, Са да ŅаСŅиŅиŅĐĩ иĐģи СаŅвОŅиŅĐĩ видĐĩĐžĐēĐģиĐŋа)</string>
|
||||
<string name="revanced_miniplayer_hide_expand_close_summary_off">ĐŅŅĐžĐŊи Са ŅаСŅиŅŅваĐŊĐĩ и ŅвиваĐŊĐĩ ĐŊа ĐĩĐēŅаĐŊа Ņа видиĐŧи</string>
|
||||
<string name="revanced_miniplayer_hide_subtext_title">ĐĐēŅаĐŊĐŊи ŅĐĩĐēŅŅОвĐĩ, ĐĩŅиĐēĐĩŅи</string>
|
||||
<string name="revanced_miniplayer_hide_subtext_summary_on">ĐĄĐēŅиŅи</string>
|
||||
<string name="revanced_miniplayer_hide_subtext_summary_off">ĐĐžĐēĐ°ĐˇĐ˛Đ°Ņ ŅĐĩ</string>
|
||||
<string name="revanced_miniplayer_hide_rewind_forward_title">ĐŅŅĐžĐŊи Са ĐŊаĐŋŅĐĩĐ´ и ĐŊаСад</string>
|
||||
<string name="revanced_miniplayer_hide_rewind_forward_summary_on">ĐŅŅĐžĐŊи Са ĐŊаĐŋŅĐĩĐ´ и ĐŊаСад Ņа ŅĐēŅиŅи</string>
|
||||
<string name="revanced_miniplayer_hide_rewind_forward_summary_off">ĐŅŅĐžĐŊи Са ĐŊаĐŋŅĐĩĐ´ и ĐŊаСад Ņа ĐŋĐžĐēаСаĐŊи</string>
|
||||
<string name="revanced_miniplayer_opacity_title">ĐŅОСŅаŅĐŊĐžŅŅ ĐŊа ĐŧĐĩĐŊŅŅаŅа</string>
|
||||
<string name="revanced_miniplayer_opacity_summary">ĐĄŅОКĐŊĐžŅŅ ĐŊа ĐŋŅОСŅаŅĐŊĐžŅŅ ĐŧĐĩĐļĐ´Ņ 0-100, ĐēŅĐ´ĐĩŅĐž 0 Đĩ ĐŋŅОСŅаŅĐŊĐž</string>
|
||||
<string name="revanced_miniplayer_opacity_invalid_toast">ĐŅОСŅаŅĐŊĐžŅŅŅа ĐŊа ĐŧĐĩĐŊŅŅĐž ŅŅŅйва да ĐąŅĐ´Đĩ ĐŧĐĩĐļĐ´Ņ 0-100</string>
|
||||
</patch>
|
||||
<patch id="layout.theme.ThemeBytecodePatch">
|
||||
<string name="revanced_gradient_loading_screen_title">ФОĐŊ ĐŊа ĐĩĐēŅаĐŊа ĐŋŅи СаŅĐĩĐļдаĐŊĐĩ ĐŊа видĐĩĐž</string>
|
||||
<string name="revanced_gradient_loading_screen_summary_on">ĐĐēŅаĐŊŅŅ ĐˇĐ° СаŅĐĩĐļдаĐŊĐĩ ŅĐĩ иĐŧа ĐŗŅадиĐĩĐŊŅĐĩĐŊ ŅĐžĐŊ</string>
|
||||
<string name="revanced_gradient_loading_screen_summary_off">ĐĐēŅаĐŊŅŅ ĐˇĐ° СаŅĐĩĐļдаĐŊĐĩ ŅĐĩ иĐŧа ĐŋĐģŅŅĐĩĐŊ ŅĐžĐŊ</string>
|
||||
</patch>
|
||||
<patch id="layout.theme.ThemeResourcePatch">
|
||||
<string name="revanced_seekbar_custom_color_title">ĐŅĐžĐŧŅĐŊа ĐŊа ŅвĐĩŅа ĐŊа иĐŊдиĐēаŅĐžŅа Са вŅĐĩĐŧĐĩ</string>
|
||||
<string name="revanced_seekbar_custom_color_summary_on">ĐĐžĐēаСва ŅĐĩ ĐŋĐĩŅŅĐžĐŊаĐģиСиŅаĐŊ ŅвŅŅ ĐŊа ĐģĐĩĐŊŅаŅа Са ĐŊаĐŋŅĐĩĐ´ŅĐē</string>
|
||||
<string name="revanced_seekbar_custom_color_summary_off">ĐĐžĐēаСва ŅĐĩ ĐžŅĐ¸ĐŗĐ¸ĐŊаĐģĐŊĐ¸Ņ ŅвŅŅ ĐŊа ĐģĐĩĐŊŅаŅа Са ĐŊаĐŋŅĐĩĐ´ŅĐē</string>
|
||||
<string name="revanced_seekbar_custom_color_value_title">ĐĐĩŅŅĐžĐŊаĐģиСиŅаĐŊ ŅвŅŅ ĐŊа ĐģĐĩĐŊŅаŅа Са ĐŊаĐŋŅĐĩĐ´ŅĐē</string>
|
||||
<string name="revanced_seekbar_custom_color_value_summary">ĐĻвĐĩŅОвĐĩ ĐŊа ĐģĐĩĐŊŅаŅа Са ĐŊаĐŋŅĐĩĐ´ŅĐē</string>
|
||||
<string name="revanced_seekbar_custom_color_invalid">ĐĐĩваĐģидĐŊа ŅŅОКĐŊĐžŅŅ ĐŊа ŅвĐĩŅа. ĐСĐŋĐžĐģСвК ŅŅОКĐŊĐžŅŅ ĐŋĐž ĐŋОдŅаСйиŅаĐŊĐĩ.</string>
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
|
||||
<string name="revanced_bypass_image_region_restrictions_title">ĐŅĐĩŅĐēĐžŅĐĩŅĐĩ СайŅаĐŊаŅа Са СаŅĐĩĐļдаĐŊĐĩ ĐŊа иСОйŅаĐļĐĩĐŊиĐĩ</string>
|
||||
<string name="revanced_bypass_image_region_restrictions_summary_on">ĐĐžĐŧĐĩĐšĐŊŅŅ yt4.ggpht.com ŅĐĩ иСĐŋĐžĐģСва Са СаŅĐĩĐļдаĐŊĐĩ ĐŊа иСОйŅаĐļĐĩĐŊиŅ</string>
|
||||
<string name="revanced_bypass_image_region_restrictions_summary_off">ĐŅĐ¸ĐŗĐ¸ĐŊаĐģĐŊиŅŅ Đ´ĐžĐŧĐĩĐšĐŊ ŅĐĩ иСĐŋĐžĐģСва Са СаŅĐĩĐļдаĐŊĐĩ ĐŊа иСОйŅаĐļĐĩĐŊиŅ\n\nĐĐēŅивиŅаĐŊĐĩŅĐž ĐŊа ŅаСи ĐŊаŅŅŅОКĐēа ĐŧĐžĐļĐĩ да ĐēĐžŅĐ¸ĐŗĐ¸Ņа СаŅĐĩĐļдаĐŊĐĩŅĐž ĐŊа иСОйŅаĐļĐĩĐŊиŅ, ĐēОиŅĐž Ņа ĐąĐģĐžĐēиŅаĐŊи в ĐŊŅĐēОи ŅĐĩĐŗĐ¸ĐžĐŊи</string>
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.AlternativeThumbnailsPatch">
|
||||
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||
<string name="revanced_alt_thumbnail_home_title">РаСдĐĩĐģ ĐаŅаĐģĐž</string>
|
||||
<!-- 'Subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
|
||||
<string name="revanced_alt_thumbnail_subscription_title">РаСдĐĩĐģ ĐйОĐŊаĐŧĐĩĐŊŅи</string>
|
||||
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (library) tab. -->
|
||||
<string name="revanced_alt_thumbnail_library_title">РаСдĐĩĐģ \"ĐиĐĩ\"</string>
|
||||
<string name="revanced_alt_thumbnail_player_title">ĐĐģĐĩĐšĐģиŅŅи, ĐŋŅĐĩĐ´ĐģĐžĐļĐĩĐŊиŅ</string>
|
||||
<string name="revanced_alt_thumbnail_search_title">Đ ĐĩСŅĐģŅаŅи ĐžŅ ŅŅŅŅĐĩĐŊĐĩŅĐž</string>
|
||||
<string name="revanced_alt_thumbnail_options_entry_1">ĐŅĐ¸ĐŗĐ¸ĐŊаĐģĐŊи ĐŧиĐŊиаŅŅŅи</string>
|
||||
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow & ĐžŅĐ¸ĐŗĐ¸ĐŊаĐģĐŊи ĐŧиĐŊиаŅŅŅи</string>
|
||||
<string name="revanced_alt_thumbnail_options_entry_3">DeArrow & ĐĐĩĐŋОдвиĐļĐŊи ĐēадŅи</string>
|
||||
<string name="revanced_alt_thumbnail_options_entry_4">ĐĐĩĐŋОдвиĐļĐŊи ĐēадŅи</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_about_summary">DeArrow ĐŋŅĐĩĐ´ĐžŅŅĐ°Đ˛Ņ ĐŧиĐŊиаŅŅŅи ĐŊа ĐŋŅĐąĐģиĐēаŅа Са видĐĩĐžĐēĐģиĐŋОвĐĩ. ĐĸĐĩСи ĐŧиĐŊиаŅŅŅи ŅĐĩŅŅĐž Ņа ĐŋĐž-ĐŋОдŅ
ОдŅŅи ĐžŅ ŅĐĩСи, ĐŋŅĐĩĐ´ĐžŅŅавĐĩĐŊи ĐžŅ ŅаĐŧĐ¸Ņ YouTube. ĐĐēĐž Đĩ аĐēŅивиŅаĐŊĐž, URL адŅĐĩŅиŅĐĩ ĐŊа видĐĩĐž ŅĐĩ ĐąŅĐ´Đ°Ņ Đ¸ĐˇĐŋŅаŅĐĩĐŊи Đ´Đž API ŅŅŅвŅŅа, ĐąĐĩС да ŅĐĩ иСĐŋŅаŅĐ°Ņ Đ´ŅŅĐŗĐ¸ даĐŊĐŊи. ĐĐēĐž видĐĩĐžĐēĐģиĐŋŅŅ ĐŊŅĐŧа ĐŧиĐŊиаŅŅŅи ĐŊа DeArrow, ŅĐĩ ŅĐĩ ĐŋĐžĐēаĐļĐ°Ņ Đ¸Đģи ĐŊĐĩĐŗĐžĐ˛Đ¸ŅĐĩ ĐžŅĐ¸ĐŗĐ¸ĐŊаĐģĐŊи ĐŧиĐŊиаŅŅŅи, иĐģи СаŅĐŊĐĩŅи ĐēадŅи. ĐŠŅаĐēĐŊĐĩŅĐĩ, Са да ĐŊаŅŅиŅĐĩ ĐŋОвĐĩŅĐĩ Са DeArrow</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_title">ĐĐžĐēаСваĐŊĐĩ ĐŊа иСвĐĩŅŅиĐĩ, аĐēĐž API ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_on">ĐĐžĐēаСва ŅĐĩ иСвĐĩŅŅиĐĩ, аĐēĐž DeArrow ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_off">ĐĐžĐēаСва ŅĐĩ иСвĐĩŅŅиĐĩ, аĐēĐž DeArrow ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_api_url_title">ĐŅаКĐŊа ŅĐžŅĐēа ĐŊа API ĐŊа DeArrow</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_api_url_summary">URL адŅĐĩŅŅŅ ĐŊа ĐēŅаКĐŊаŅа ŅĐžŅĐēа Са ŅŅŅ
ŅаĐŊĐĩĐŊиĐĩ ĐŊа ĐŧиĐŊиаŅŅŅи DeArrow</string>
|
||||
<string name="revanced_alt_thumbnail_stills_about_title">ĐĐĩĐŋОдвиĐļĐŊи ĐŧиĐŊиаŅŅŅи</string>
|
||||
<string name="revanced_alt_thumbnail_stills_about_summary">ĐĐĩĐŋОдвиĐļĐŊиŅĐĩ ŅĐŊиĐŧĐēи ŅĐĩ ĐŋŅавŅŅ ĐžŅ ĐŊаŅаĐģĐžŅĐž / ŅŅĐĩдаŅа / ĐēŅĐ°Ņ ĐŊа вŅĐĩĐēи видĐĩĐžĐēĐģиĐŋ. ĐĸĐĩСи иСОйŅаĐļĐĩĐŊĐ¸Ņ Ņа Đ˛ĐŗŅадĐĩĐŊи в YouTube и ĐŊĐĩ ŅĐĩ иСĐŋĐžĐģСва вŅĐŊŅĐĩĐŊ API</string>
|
||||
<string name="revanced_alt_thumbnail_stills_fast_title">ĐСĐŋĐžĐģСваĐŊĐĩ ĐŊа ĐąŅŅСО СаŅĐŊĐĩĐŧаĐŊĐĩ ĐŊа ĐēадŅи</string>
|
||||
<string name="revanced_alt_thumbnail_stills_fast_summary_on">ĐСĐŋĐžĐģĐˇĐ˛Đ°Ņ ŅĐĩ ĐēадŅи ŅŅŅ ŅŅĐĩĐ´ĐŊĐž ĐēаŅĐĩŅŅвО. ĐиĐŊиаŅŅŅиŅĐĩ ŅĐĩ ŅĐĩ СаŅĐĩĐļĐ´Đ°Ņ ĐŋĐž-ĐąŅŅСО, ĐŊĐž видĐĩĐžĐēĐģиĐŋОвĐĩ ĐŊа ĐļивО, ĐŊĐĩиСдадĐĩĐŊи иĐģи ĐŧĐŊĐžĐŗĐž ŅŅаŅи ĐŧĐžĐļĐĩ да ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ĐŋŅаСĐŊи ĐŧиĐŊиаŅŅŅи</string>
|
||||
<string name="revanced_alt_thumbnail_stills_fast_summary_off">ĐСĐŋĐžĐģСваĐŊĐĩ ĐŊа виŅĐžĐēĐžĐēаŅĐĩŅŅвĐĩĐŊи ŅĐŊиĐŧĐēи</string>
|
||||
<string name="revanced_alt_thumbnail_stills_time_title">ĐŅĐĩĐŧĐĩŅĐž ĐŊа видĐĩĐžĐēĐģиĐŋа, ĐžŅ ĐēОКŅĐž ŅĐĩ ĐąŅĐ´Đ°Ņ Đ˛ĐˇĐĩŅи ĐēадŅиŅĐĩ</string>
|
||||
<string name="revanced_alt_thumbnail_stills_time_entry_1">ĐаŅаĐģĐž ĐŊа видĐĩĐžŅĐž</string>
|
||||
<string name="revanced_alt_thumbnail_stills_time_entry_2">ĐĄŅĐĩдаŅа ĐŊа видĐĩĐžŅĐž</string>
|
||||
<string name="revanced_alt_thumbnail_stills_time_entry_3">ĐŅĐ°Ņ ĐŊа видĐĩĐžŅĐž</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_alt_thumbnail_dearrow_error">DeArrow вŅĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ. (ĐēОд ĐŊа ŅŅŅŅĐžŅĐŊиĐĩŅĐž: %s)</string>
|
||||
<string name="revanced_alt_thumbnail_dearrow_error_generic">DeArrow вŅĐĩĐŧĐĩĐŊĐŊĐž ĐŊĐĩ Đĩ ĐŊаĐģиŅĐĩĐŊ</string>
|
||||
</patch>
|
||||
<patch id="misc.announcements.AnnouncementsPatch">
|
||||
<string name="revanced_announcements_title">ĐĐžĐēаСваĐŊĐĩ ĐŊа ReVanced ŅŅОйŅĐĩĐŊиŅ</string>
|
||||
<string name="revanced_announcements_summary_on">ĐĄŅОйŅĐĩĐŊиŅŅа ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ĐŋŅи ŅŅаŅŅиŅаĐŊĐĩ</string>
|
||||
<string name="revanced_announcements_summary_off">ĐĄŅОйŅĐĩĐŊиŅŅа ĐŊĐĩ ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ĐŋŅи ŅŅаŅŅиŅаĐŊĐĩ</string>
|
||||
<string name="revanced_announcements_enabled_summary">ĐĐžĐēаСваĐŊĐĩ ĐŊа ŅŅОйŅĐĩĐŊĐ¸Ņ ĐŋŅи ŅŅаŅŅиŅаĐŊĐĩ</string>
|
||||
<string name="revanced_announcements_connection_failed">ĐĐĩŅŅĐŋĐĩŅĐŊĐž ŅвŅŅСваĐŊĐĩ Ņ Đ´ĐžŅŅавŅиĐē ĐŊа ŅŅОйŅĐĩĐŊиŅ</string>
|
||||
<string name="revanced_announcements_dialog_dismiss">ĐŅŅ
вŅŅĐģи</string>
|
||||
</patch>
|
||||
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
|
||||
<string name="revanced_check_watch_history_domain_name_dialog_title">ĐŅĐĩĐ´ŅĐŋŅĐĩĐļĐ´ĐĩĐŊиĐĩ</string>
|
||||
<string name="revanced_check_watch_history_domain_name_dialog_message">ĐŅŅĐžŅиŅŅа ви ĐŊа ĐŗĐģĐĩдаĐŊĐĩ ĐŊĐĩ ŅĐĩ СаĐŋаСва.<br><br>ĐĸОва ĐŊаК-вĐĩŅĐžŅŅĐŊĐž Đĩ ĐŋŅиŅиĐŊĐĩĐŊĐž ĐžŅ DNS ĐąĐģĐžĐēиŅĐ°Ņ ŅĐĩĐēĐģаĐŧи иĐģи ĐŧŅĐĩĐļОв ĐŋŅĐžĐēŅи.<br><br>Đа да ĐēĐžŅĐ¸ĐŗĐ¸ŅаŅĐĩ ŅОва, ĐŋĐžŅŅавĐĩŅĐĩ <b>s.youtube в ĐąĐĩĐģĐ¸Ņ ŅĐŋиŅŅĐē.com</b> иĐģи иСĐēĐģŅŅĐĩŅĐĩ вŅиŅĐēи DNS ĐąĐģĐžĐēĐĩŅи и ĐŋŅĐžĐēŅиŅа.</string>
|
||||
<string name="revanced_check_watch_history_domain_name_dialog_ignore">ĐĐĩ ĐŋĐžĐēаСваК ĐžŅĐŊОвО</string>
|
||||
</patch>
|
||||
<patch id="misc.autorepeat.AutoRepeatPatch">
|
||||
<string name="revanced_auto_repeat_title">ĐвŅĐžĐŧаŅиŅĐŊĐž ĐŋОвŅаŅŅĐŊĐĩ ĐŊа ŅĐĩĐēŅŅĐ¸Ņ Đ˛Đ¸Đ´ĐĩĐžĐēĐģиĐŋ</string>
|
||||
<string name="revanced_auto_repeat_summary_on">ĐĐēĐģŅŅĐĩĐŊĐž авŅĐžĐŧаŅиŅĐŊĐž ĐŋОвŅаŅŅĐŊĐĩ ĐŊа ŅĐĩĐēŅŅĐ¸Ņ Đ˛Đ¸Đ´ĐĩĐžĐēĐģиĐŋ</string>
|
||||
<string name="revanced_auto_repeat_summary_off">ĐСĐēĐģŅŅĐĩĐŊĐž авŅĐžĐŧаŅиŅĐŊĐž ĐŋОвŅаŅŅĐŊĐĩ ĐŊа ŅĐĩĐēŅŅĐ¸Ņ Đ˛Đ¸Đ´ĐĩĐžĐēĐģиĐŋ</string>
|
||||
</patch>
|
||||
<patch id="misc.dimensions.spoof.SpoofDeviceDimensionsPatch">
|
||||
<string name="revanced_spoof_device_dimensions_title">ĐŅĐļĐģиви ĐŋаŅаĐŧĐĩŅŅи ĐŊа ŅŅŅŅОКŅŅвОŅĐž</string>
|
||||
<string name="revanced_spoof_device_dimensions_summary_on">ĐОдĐŋŅавĐĩĐŊаŅа ŅĐĩСОĐģŅŅĐ¸Ņ ĐŊа ŅŅŅŅОКŅŅвОŅĐž\n\nĐĐžĐļĐĩ да ŅĐĩ ĐžŅĐēĐģŅŅи ĐŋĐž-виŅĐžĐēĐž ĐēаŅĐĩŅŅвО ĐŊа видĐĩĐžŅĐž, ĐŊĐž ĐŧĐžĐļĐĩ да иСĐŋиŅаŅĐĩ СаŅиŅаĐŊĐĩ ĐŋŅи вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩ ĐŊа видĐĩĐž, ĐŋĐž-ĐģĐžŅ ĐļĐ¸Đ˛ĐžŅ ĐŊа йаŅĐĩŅиŅŅа и ĐŊĐĩиСвĐĩŅŅĐŊи ŅŅŅаĐŊиŅĐŊи ĐĩŅĐĩĐēŅи</string>
|
||||
<string name="revanced_spoof_device_dimensions_summary_off">Đ ĐĩСОĐģŅŅиŅŅа ĐŊа ŅŅŅŅОКŅŅвОŅĐž ĐŊĐĩ Đĩ ĐŋОдĐŋŅавĐĩĐŊа\n\nĐĐēŅивиŅаĐŊĐĩŅĐž ĐŊа ŅОва ĐŊĐĩ ĐŧĐžĐļĐĩ да ĐžŅĐēĐģŅŅи ĐŋĐž-виŅĐžĐēĐž ĐēаŅĐĩŅŅвО ĐŊа видĐĩĐžŅĐž</string>
|
||||
<string name="revanced_spoof_device_dimensions_user_dialog_message">РаСŅĐĩŅаваĐŊĐĩŅĐž ĐŊа ŅОва ĐŧĐžĐļĐĩ да ĐŋŅиŅиĐŊи ĐŋŅĐĩĐēŅŅваĐŊĐĩ ĐŊа вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩŅĐž ĐŊа видĐĩĐž, вĐģĐžŅĐĩĐŊ ĐļĐ¸Đ˛ĐžŅ ĐŊа йаŅĐĩŅиŅŅа и ĐŊĐĩиСвĐĩŅŅĐŊи ŅŅŅаĐŊиŅĐŊи ĐĩŅĐĩĐēŅи.</string>
|
||||
</patch>
|
||||
<patch id="misc.gms.GmsCoreSupportResourcePatch">
|
||||
<string name="microg_settings_title">GmsCore ĐаŅŅŅОКĐēи</string>
|
||||
<string name="microg_settings_summary">ĐаŅŅŅОКĐēи ĐŊа GmsCore</string>
|
||||
</patch>
|
||||
<patch id="misc.links.BypassURLRedirectsPatch">
|
||||
<string name="revanced_bypass_url_redirects_title">ĐаОйиĐēаĐģŅĐŊĐĩ ĐŊа URL ĐŋŅĐĩĐŊаŅĐžŅваĐŊĐĩ</string>
|
||||
<string name="revanced_bypass_url_redirects_summary_on">URL ĐŋŅĐĩĐŊаŅĐžŅваĐŊиŅŅа ŅĐĩ СаОйиĐēаĐģŅŅ</string>
|
||||
<string name="revanced_bypass_url_redirects_summary_off">URL ĐŋŅĐĩĐŊаŅĐžŅваĐŊиŅŅа ĐŊĐĩ ŅĐĩ СаОйиĐēаĐģŅŅ</string>
|
||||
</patch>
|
||||
<patch id="misc.links.OpenLinksExternallyPatch">
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
|
||||
<string name="revanced_external_browser_title">ĐŅваŅŅĐŊĐĩ ĐŊа вŅŅСĐēи в ĐąŅаŅСŅŅа</string>
|
||||
<string name="revanced_external_browser_summary_on">ĐŅваŅŅĐŊĐĩ ĐŊа вŅĐŊŅĐŊи вŅŅСĐēи</string>
|
||||
<string name="revanced_external_browser_summary_off">ĐŅваŅŅĐŊĐĩ ĐŊа вŅŅСĐēи в ĐŋŅиĐģĐžĐļĐĩĐŊиĐĩŅĐž</string>
|
||||
</patch>
|
||||
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
|
||||
<string name="revanced_remove_tracking_query_parameter_title">ĐŅĐĩĐŧаŅ
ĐŊĐĩŅĐĩ ĐŋаŅаĐŧĐĩŅŅŅа ĐŊа СаŅвĐēаŅа Са ĐŋŅĐžŅĐģĐĩĐ´ŅваĐŊĐĩ</string>
|
||||
<string name="revanced_remove_tracking_query_parameter_summary_on">ĐаŅаĐŧĐĩŅŅŅŅŅ ĐŊа СаŅвĐēаŅа Са ĐŋŅĐžŅĐģĐĩĐ´ŅваĐŊĐĩ Đĩ ĐŋŅĐĩĐŧаŅ
ĐŊĐ°Ņ ĐžŅ Đ˛ŅŅСĐēиŅĐĩ</string>
|
||||
<string name="revanced_remove_tracking_query_parameter_summary_off">ĐаŅаĐŧĐĩŅŅŅŅŅ ĐŊа СаŅвĐēаŅа Са ĐŋŅĐžŅĐģĐĩĐ´ŅваĐŊĐĩ ĐŊĐĩ Đĩ ĐŋŅĐĩĐŧаŅ
ĐŊĐ°Ņ ĐžŅ Đ˛ŅŅСĐēиŅĐĩ</string>
|
||||
</patch>
|
||||
<patch id="misc.zoomhaptics.ZoomHapticsPatch">
|
||||
<string name="revanced_disable_zoom_haptics_title">ĐĐĩаĐēŅивиŅаĐŊĐĩ ĐŊа вийŅаŅĐ¸Ņ ĐŋŅи ĐŧаŅайиŅаĐŊĐĩ</string>
|
||||
<string name="revanced_disable_zoom_haptics_summary_on">ĐийŅаŅииŅĐĩ Ņа Đ´ĐĩаĐēŅивиŅаĐŊи</string>
|
||||
<string name="revanced_disable_zoom_haptics_summary_off">ĐийŅаŅииŅĐĩ Ņа аĐēŅивиŅаĐŊи</string>
|
||||
</patch>
|
||||
<patch id="video.quality.RememberVideoQualityPatch">
|
||||
<string name="revanced_video_quality_default_entry_1">ĐвŅĐžĐŧаŅиŅĐŊĐž ĐēаŅĐĩŅŅвО</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_title">ĐаĐŋĐžĐŧĐŊи ĐŋŅĐžĐŧĐĩĐŊиŅĐĩ в ĐēаŅĐĩŅŅвОŅĐž ĐŊа видĐĩĐžŅĐž</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_summary_on">ĐŅĐžĐŧĐĩĐŊиŅĐĩ в ĐēаŅĐĩŅŅвОŅĐž ŅĐĩ ĐžŅĐŊаŅŅŅ ĐˇĐ° вŅиŅĐēи видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_summary_off">ĐŅĐžĐŧĐĩĐŊиŅĐĩ в ĐēаŅĐĩŅŅвОŅĐž ŅĐĩ ĐžŅĐŊаŅŅŅ ŅаĐŧĐž Са ŅĐĩĐēŅŅĐ¸Ņ Đ˛Đ¸Đ´ĐĩĐžĐēĐģиĐŋ</string>
|
||||
<string name="revanced_video_quality_default_wifi_title">ĐŅĐĩĐ´ĐŋĐžŅиŅаĐŊĐž ĐēаŅĐĩŅŅвО ĐŋŅи Wi-Fi</string>
|
||||
<string name="revanced_video_quality_default_mobile_title">ĐŅĐĩĐ´ĐŋĐžŅиŅаĐŊĐž ĐēаŅĐĩŅŅвО ĐŋŅи ĐŧОйиĐģĐŊи даĐŊĐŊи</string>
|
||||
<string name="revanced_remember_video_quality_mobile">ĐŧОйиĐģĐŊи даĐŊĐŊи</string>
|
||||
<string name="revanced_remember_video_quality_wifi">wi-fi</string>
|
||||
<string name="revanced_remember_video_quality_toast">ĐŅĐžĐŧĐĩĐŊĐĩĐŊĐž ŅŅаĐŊдаŅŅĐŊĐž %1$s ĐēаŅĐĩŅŅвО ĐŊа: %2$s</string>
|
||||
</patch>
|
||||
<patch id="video.speed.button.PlaybackSpeedButtonPatch">
|
||||
<string name="revanced_playback_speed_dialog_button_title">ĐĐžĐēаСваĐŊĐĩ ĐąŅŅĐžĐŊ Са ŅĐēĐžŅĐžŅŅ</string>
|
||||
<string name="revanced_playback_speed_dialog_button_summary_on">ĐŅŅĐžĐŊŅŅ Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
<string name="revanced_playback_speed_dialog_button_summary_off">ĐŅŅĐžĐŊŅŅ ĐŊĐĩ Đĩ ĐŋĐžĐēаСаĐŊ</string>
|
||||
</patch>
|
||||
<patch id="video.speed.custom.CustomPlaybackSpeedPatch">
|
||||
<string name="revanced_custom_playback_speeds_title">ĐĐĩŅŅĐžĐŊаĐģиСиŅаĐŊи ŅĐēĐžŅĐžŅŅи ĐŊа вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩ</string>
|
||||
<string name="revanced_custom_playback_speeds_summary">ĐОйавĐĩŅĐĩ иĐģи ĐŋŅĐžĐŧĐĩĐŊĐĩŅĐĩ ĐŊаĐģиŅĐŊиŅĐĩ ŅĐēĐžŅĐžŅŅи ĐŊа вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩ</string>
|
||||
<string name="revanced_custom_playback_speeds_invalid">ĐĐĩŅŅĐžĐŊаĐģĐŊаŅа ŅĐēĐžŅĐžŅŅ ŅŅŅйва да Đĩ ĐŋĐž-ĐŧаĐģĐēа ĐžŅ %s. ĐСĐŋĐžĐģСваĐŊĐĩ ĐŊа ŅŅОКĐŊĐžŅŅи ĐŋĐž ĐŋОдŅаСйиŅаĐŊĐĩ.</string>
|
||||
<string name="revanced_custom_playback_speeds_parse_exception">ĐĐĩваĐģидĐŊи ĐŋĐĩŅŅĐžĐŊаĐģиСиŅаĐŊи ŅĐēĐžŅĐžŅŅи ĐŊа вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩ. ĐСĐŋĐžĐģСваĐŊĐĩ ĐŊа ŅŅОКĐŊĐžŅŅи ĐŋĐž ĐŋОдŅаСйиŅаĐŊĐĩ.</string>
|
||||
</patch>
|
||||
<patch id="video.speed.remember.RememberPlaybackSpeedPatch">
|
||||
<string name="revanced_remember_playback_speed_last_selected_title">ĐаĐŋĐžĐŧĐŊи ĐŋŅĐžĐŧĐĩĐŊиŅĐĩ в ŅĐēĐžŅĐžŅŅŅа ĐŊа вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩ</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_summary_on">ĐŅĐžĐŧĐĩĐŊиŅĐĩ в ŅĐēĐžŅĐžŅŅŅа ĐŊа вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩ ŅĐĩ ĐžŅĐŊаŅŅŅ ĐˇĐ° вŅиŅĐēи видĐĩĐžĐēĐģиĐŋОвĐĩ</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_summary_off">ĐŅĐžĐŧĐĩĐŊиŅĐĩ в ŅĐēĐžŅĐžŅŅŅа ĐŊа вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩ ŅĐĩ ĐžŅĐŊаŅŅŅ ŅаĐŧĐž Са ŅĐĩĐēŅŅĐ¸Ņ Đ˛Đ¸Đ´ĐĩĐžĐēĐģиĐŋ</string>
|
||||
<string name="revanced_playback_speed_default_title">ĐĄĐēĐžŅĐžŅŅ ĐŊа вŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩ ĐŋĐž ĐŋОдŅаСйиŅаĐŊĐĩ</string>
|
||||
<string name="revanced_remember_playback_speed_toast">ĐĄĐēĐžŅĐžŅŅŅа ĐŋĐž ĐŋОдŅаСйиŅаĐŊĐĩ Đĩ ĐŋŅĐžĐŧĐĩĐŊĐĩĐŊа ĐŊа: %s</string>
|
||||
</patch>
|
||||
<patch id="video.videoqualitymenu.RestoreOldVideoQualityMenuResourcePatch">
|
||||
<string name="revanced_restore_old_video_quality_menu_title">ĐŅСŅŅаĐŊОвĐĩŅĐĩ ŅŅаŅĐžŅĐž ĐŧĐĩĐŊŅ ĐˇĐ° ĐēаŅĐĩŅŅвО ĐŊа видĐĩĐžŅĐž</string>
|
||||
<string name="revanced_restore_old_video_quality_menu_summary_on">ĐĐžĐēаСва ŅĐĩ ŅŅаŅĐžŅĐž ĐŧĐĩĐŊŅ ĐˇĐ° видĐĩĐž ĐēаŅĐĩŅŅвО</string>
|
||||
<string name="revanced_restore_old_video_quality_menu_summary_off">ĐĄŅаŅĐžŅĐž ĐŧĐĩĐŊŅ ĐˇĐ° видĐĩĐž ĐēаŅĐĩŅŅвО Đĩ ŅĐēŅиŅĐž</string>
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.EnableSlideToSeekPatch">
|
||||
<string name="revanced_slide_to_seek_title">ĐĐēŅивиŅаĐŊĐĩ ĐŊа ŅĐģаКд Са ĐŋŅĐĩвŅŅŅаĐŊĐĩ</string>
|
||||
<string name="revanced_slide_to_seek_summary_on">ĐĄĐģаКд Са ĐŋŅĐĩвŅŅŅаĐŊĐĩ Đĩ аĐēŅивиŅаĐŊ</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">ĐĄĐģаКд Са ĐŋŅĐĩвŅŅŅаĐŊĐĩ Đĩ Đ´ĐĩаĐēŅивиŅаĐŊ</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_title">ĐОдĐŧŅĐŊа ĐŊа вĐĩŅŅиŅŅа (ĐŊа ĐēĐģиĐĩĐŊŅа)</string>
|
||||
<string name="revanced_spoof_client_screen_summary">ĐОдĐŧŅĐŊа ĐŊа вĐĩŅŅиŅŅа, Са да ĐŋŅĐĩĐ´ĐžŅвŅаŅиŅĐĩ ĐŋŅОйĐģĐĩĐŧи Ņ Đ˛ŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩŅĐž ĐŊа видĐĩĐž</string>
|
||||
<string name="revanced_spoof_client_title">ĐОдĐŧŅĐŊа ĐŊа вĐĩŅŅиŅŅа (ĐŊа ĐēĐģиĐĩĐŊŅа)</string>
|
||||
<string name="revanced_spoof_client_summary_on">ĐĐĩŅŅиŅŅа Đĩ ĐŋОдĐŧĐĩĐŊĐĩĐŊа</string>
|
||||
<string name="revanced_spoof_client_summary_off">ĐĐģиĐĩĐŊŅŅŅ ĐŊĐĩ Đĩ ĐŋОдĐŋŅавĐĩĐŊ.\n\nĐŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩŅĐž ĐŊа видĐĩĐž ĐŧĐžĐļĐĩ да ĐŊĐĩ ŅайОŅи</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">ĐĐĩаĐēŅивиŅаĐŊĐĩŅĐž ĐŊа ŅаСи ĐŊаŅŅŅОКĐēа ŅĐĩ дОвĐĩĐ´Đĩ Đ´Đž ĐŋŅОйĐģĐĩĐŧи Ņ Đ˛ŅСĐŋŅОиСвĐĩĐļдаĐŊĐĩŅĐž ĐŊа видĐĩĐž.</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">âĸ ĐŅĐŧа HDR видĐĩĐž\nâĸ ĐĐĩŅŅĐēиŅĐĩ видĐĩĐžĐēĐģиĐŋОвĐĩ ĐŊĐĩ ŅĐĩ вŅСĐŋŅОиСвĐĩĐļдаŅ\nâĸ ĐĐžŅŅавĐĩĐŊиŅĐĩ ĐŊа ĐŋаŅСа видĐĩĐžĐēĐģиĐŋОвĐĩ ĐŧĐžĐŗĐ°Ņ ĐŋŅОиСвОĐģĐŊĐž да ŅĐĩ вŅСОйĐŊОвŅŅ\nâĸ ĐиŅĐēĐžĐēаŅĐĩŅŅвĐĩĐŊи ĐŧиĐŊиаŅŅŅи ĐŊа ĐģĐĩĐŊŅаŅа Са ŅŅŅŅĐĩĐŊĐĩ ĐŊа Shorts\nâĸ ĐŅŅĐžĐŊ Са Đ´ĐĩĐšŅŅвиĐĩ Са иСŅĐĩĐŗĐģŅĐŊĐĩ Đĩ ŅĐēŅиŅĐž\nâĸ ĐаŅŅиŅĐĩ ĐŊа ĐēŅаКĐŊĐ¸Ņ ĐĩĐēŅаĐŊ Ņа ŅĐēŅиŅи</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
@@ -513,22 +1134,53 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</app>
|
||||
<app id="twitch">
|
||||
<patch id="ad.audio.AudioAdsPatch">
|
||||
<string name="revanced_block_audio_ads_title">ĐŅдиО ŅĐĩĐēĐģаĐŧи</string>
|
||||
<string name="revanced_block_audio_ads_summary_on">ĐŅдиО ŅĐĩĐēĐģаĐŧаŅа Đĩ ĐąĐģĐžĐēиŅаĐŊа</string>
|
||||
<string name="revanced_block_audio_ads_summary_off">ĐŅдиО ŅĐĩĐēĐģаĐŧаŅа Đĩ ŅаСйĐģĐžĐēиŅаĐŊа</string>
|
||||
</patch>
|
||||
<patch id="ad.embedded.EmbeddedAdsPatch">
|
||||
<string name="revanced_embedded_ads_service_unavailable">%s Đĩ ĐŊĐĩĐ´ĐžŅŅŅĐŋĐĩĐŊ. ĐĐžĐļĐĩ да ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ŅĐĩĐēĐģаĐŧи. ĐĐŋиŅаКŅĐĩ Đ´ŅŅĐŗĐ° ŅŅĐģŅĐŗĐ° Са ĐąĐģĐžĐēиŅаĐŊĐĩ ĐŊа ŅĐĩĐēĐģаĐŧи.</string>
|
||||
<string name="revanced_embedded_ads_service_failed">%s ŅŅŅвŅŅŅŅ Đ˛ŅŅĐŊа ĐŗŅĐĩŅĐēа. ĐĐžĐļĐĩ да ŅĐĩ ĐŋĐžĐēĐ°ĐˇĐ˛Đ°Ņ ŅĐĩĐēĐģаĐŧи. ĐĐŋиŅаКŅĐĩ да ĐŋŅĐĩвĐēĐģŅŅиŅĐĩ Đ´ŅŅĐŗĐ° ŅŅĐģŅĐŗĐ° Са ĐąĐģĐžĐēиŅаĐŊĐĩ ĐŊа ŅĐĩĐēĐģаĐŧи.</string>
|
||||
<string name="revanced_block_embedded_ads_title">ĐĐģĐžĐēиŅаĐŊĐĩ ĐŊа Đ˛ĐŗŅадĐĩĐŊи видĐĩĐžŅĐĩĐēĐģаĐŧи</string>
|
||||
<string name="revanced_block_embedded_ads_entry_1">ĐĐĩаĐēŅивиŅаĐŊĐž</string>
|
||||
<string name="revanced_block_embedded_ads_entry_2">Luminous ĐŋŅĐžĐēŅи</string>
|
||||
<string name="revanced_block_embedded_ads_entry_3">PurpleAdBlock ĐŋŅĐžĐēŅи</string>
|
||||
</patch>
|
||||
<patch id="ad.video.VideoAdsPatch">
|
||||
<string name="revanced_block_video_ads_title">ĐидĐĩĐž ŅĐĩĐēĐģаĐŧи</string>
|
||||
<string name="revanced_block_video_ads_summary_on">ĐидĐĩĐž ŅĐĩĐēĐģаĐŧаŅа Đĩ ĐąĐģĐžĐēиŅаĐŊа</string>
|
||||
<string name="revanced_block_video_ads_summary_off">ĐидĐĩĐž ŅĐĩĐēĐģаĐŧаŅа Đĩ ŅаСйĐģĐžĐēиŅаĐŊа</string>
|
||||
</patch>
|
||||
<patch id="chat.antidelete.ShowDeletedMessagesPatch">
|
||||
<string name="revanced_deleted_msg">ŅŅОйŅĐĩĐŊиĐĩŅĐž Đĩ иСŅŅиŅĐž</string>
|
||||
<string name="revanced_show_deleted_messages_title">ĐĐžĐēаĐļи иСŅŅиŅиŅĐĩ ŅŅОйŅĐĩĐŊиŅ</string>
|
||||
<string name="revanced_show_deleted_messages_entry_1">ĐĐĩ ĐŋĐžĐēаСваК иСŅŅиŅиŅĐĩ ŅŅОйŅĐĩĐŊиŅ</string>
|
||||
<string name="revanced_show_deleted_messages_entry_2">ĐĄĐēŅиКŅĐĩ иСŅŅиŅиŅĐĩ ŅŅОйŅĐĩĐŊĐ¸Ņ ĐˇĐ°Đ´ ŅĐŋОКĐģĐĩŅ</string>
|
||||
<string name="revanced_show_deleted_messages_entry_3">ĐĐžĐēаСваĐŊĐĩ ĐŊа иСŅŅиŅиŅĐĩ ŅŅОйŅĐĩĐŊĐ¸Ņ ĐēаŅĐž СаŅĐĩŅĐēĐŊĐ°Ņ ŅĐĩĐēŅŅ</string>
|
||||
</patch>
|
||||
<patch id="chat.autoclaim.AutoClaimChannelPointsPatch">
|
||||
<string name="revanced_auto_claim_channel_points_title">ĐвŅĐžĐŧаŅиŅĐŊĐž иСиŅĐēваĐŊĐĩ ĐŊа Channel Points</string>
|
||||
<string name="revanced_auto_claim_channel_points_summary_on">ĐвŅĐžĐŧаŅиŅĐŊĐž иСиŅĐēваĐŊĐĩ ĐŊа Channel Points</string>
|
||||
<string name="revanced_auto_claim_channel_points_summary_off">Channel Points в ĐēаĐŊаĐģа ĐŊĐĩ ŅĐĩ иСиŅĐēĐ˛Đ°Ņ Đ°Đ˛ŅĐžĐŧаŅиŅĐŊĐž</string>
|
||||
</patch>
|
||||
<patch id="debug.DebugModePatch">
|
||||
<!-- Twitch specific internal debug mode, and not the same as 'revanced_debug_title' -->
|
||||
<string name="revanced_twitch_debug_mode_title">ĐĐēŅивиŅаКŅĐĩ ŅĐĩĐļиĐŧа Са ĐžŅŅŅŅаĐŊŅваĐŊĐĩ ĐŊа ĐŗŅĐĩŅĐēи в Twitch</string>
|
||||
<string name="revanced_twitch_debug_mode_summary_on">Đ ĐĩĐļиĐŧŅŅ ĐˇĐ° ĐžŅŅŅŅаĐŊŅваĐŊĐĩ ĐŊа ĐŗŅĐĩŅĐēи в Twitch Đĩ аĐēŅивиŅаĐŊ (ĐŊĐĩ ŅĐĩ ĐŋŅĐĩĐŋĐžŅŅŅва)</string>
|
||||
<string name="revanced_twitch_debug_mode_summary_off">Đ ĐĩĐļиĐŧŅŅ ĐˇĐ° ĐžŅŅŅŅаĐŊŅваĐŊĐĩ ĐŊа ĐŗŅĐĩŅĐēи в Twitch Đĩ Đ´ĐĩаĐēŅивиŅаĐŊ</string>
|
||||
</patch>
|
||||
<patch id="misc.settings.SettingsPatch">
|
||||
<string name="revanced_settings">ĐаŅŅŅОКĐēи ĐŊа ReVanced</string>
|
||||
<string name="revanced_ads_screen_title">Đ ĐĩĐēĐģаĐŧи</string>
|
||||
<string name="revanced_ads_screen_summary">ĐаŅŅŅОКĐēи Са ĐąĐģĐžĐēиŅаĐŊĐĩ ĐŊа ŅĐĩĐēĐģаĐŧи</string>
|
||||
<string name="revanced_chat_screen_title">ЧаŅОвĐĩ</string>
|
||||
<string name="revanced_chat_screen_summary">ĐаŅŅŅОКĐēи ĐŊа ŅаŅа</string>
|
||||
<string name="revanced_misc_screen_title">РаСĐŊи</string>
|
||||
<string name="revanced_misc_screen_summary">ĐĐžĐŋŅĐģĐŊиŅĐĩĐģĐŊи ĐŊаŅŅŅОКĐēи</string>
|
||||
<string name="revanced_general_category_title">ĐŅĐŊОвĐŊи ĐŊаŅŅŅОКĐēи</string>
|
||||
<string name="revanced_other_category_title">ĐŅŅĐŗĐ¸ ĐŊаŅŅŅОКĐēи</string>
|
||||
<string name="revanced_client_ads_category_title">ĐĐģиĐĩĐŊŅŅĐēа ŅĐĩĐēĐģаĐŧа</string>
|
||||
<string name="revanced_surestream_ads_category_title">ĐĄŅŅваŅĐŊа ŅĐĩĐēĐģаĐŧа</string>
|
||||
<string name="revanced_twitch_debug_title">ĐĐŊĐĩвĐŊиĐē ĐŊа ĐžŅŅŅŅаĐŊŅваĐŊĐĩŅĐž ĐŊа ĐŗŅĐĩŅĐēи</string>
|
||||
<string name="revanced_twitch_debug_summary_on">ĐĐŊĐĩвĐŊиĐēŅŅ ĐˇĐ° ĐžŅŅŅаĐŊŅваĐŊĐĩ ĐŊа ĐŗŅĐĩŅĐēи Đĩ аĐēŅивиŅаĐŊ</string>
|
||||
<string name="revanced_twitch_debug_summary_off">ĐĐŊĐĩвĐŊиĐēŅŅ ĐˇĐ° ĐžŅŅŅаĐŊŅваĐŊĐĩ ĐŊа ĐŗŅĐĩŅĐēи Đĩ Đ´ĐĩаĐēŅивиŅаĐŊ</string>
|
||||
|
||||
@@ -69,7 +69,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_settings_screen_03_feed_title">āĻĢāĻŋāĻĄ</string>
|
||||
<string name="revanced_settings_screen_04_player_title">āĻĒā§āϞā§ā§āĻžāϰ</string>
|
||||
<string name="revanced_settings_screen_05_general_title">āϏāĻžāϧāĻžāϰāĻŖ āϞā§-āĻāĻāĻ</string>
|
||||
<string name="revanced_settings_screen_06_shorts_title">āĻļāϰā§āĻāϏ</string>
|
||||
<string name="revanced_settings_screen_07_seekbar_title">āϏāĻŋāĻāĻŦāĻžāϰ</string>
|
||||
<string name="revanced_settings_screen_08_swipe_controls_title">āϏā§āϝāĻŧāĻžāĻāĻĒ āĻāύā§āĻā§āϰā§āϞ</string>
|
||||
<string name="revanced_settings_screen_11_misc_title">āĻŦāĻŋāĻŦāĻŋāϧ</string>
|
||||
@@ -202,6 +201,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_chips_shelf_summary_off">āĻāĻŋāĻĒ āĻļā§āϞāĻĒ āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻšā§ā§āĻā§</string>
|
||||
<string name="revanced_hide_attributes_section_title">āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻŦāĻŋāĻāĻžāĻ āϞā§āĻāĻžāύ</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">\'āĻŦā§āĻļāĻŋāώā§āĻā§āϝāϝā§āĻā§āϤ āϏā§āĻĨāĻžāύ\', āĻā§āĻŽ āĻāĻŦāĻ āϏāĻā§āĻā§āϤ āĻŦāĻŋāĻāĻžāĻāĻā§āϞāĻŋ āϞā§āĻāĻžāύ⧠āĻāĻā§</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">\'āĻŦā§āĻļāĻŋāώā§āĻā§āϝāϝā§āĻā§āϤ āϏā§āĻĨāĻžāύ\', āĻā§āĻŽ āĻāĻŦāĻ āϏāĻā§āĻā§āϤ āĻŦāĻŋāĻāĻžāĻāĻā§āϞāĻŋ āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻšā§ā§āĻā§</string>
|
||||
<string name="revanced_hide_info_cards_section_title">āϤāĻĨā§āϝ āĻāĻžāϰā§āĻĄ āϏā§āĻāĻļāύ āϞā§āĻāĻžāύ</string>
|
||||
<string name="revanced_hide_info_cards_section_summary_on">āϤāĻĨā§āϝ āĻāĻžāϰā§āĻĄ āϏā§āĻāĻļāύ āϞā§āĻāĻŋā§ā§ āϰā§ā§āĻā§</string>
|
||||
<string name="revanced_hide_info_cards_section_summary_off">āϤāĻĨā§āϝ āĻāĻžāϰā§āĻĄ āϏā§āĻāĻļāύ āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻšā§ā§āĻā§</string>
|
||||
@@ -793,17 +793,12 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_sb_new_segment_choose_category">āϏā§āĻāĻŽā§āύā§āĻā§āϰ āĻŦāĻŋāĻāĻžāĻ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύ</string>
|
||||
<string name="revanced_sb_new_segment_disabled_category">āϏā§āĻāĻŋāĻ āĻĨā§āĻā§ āĻŦāĻŋāĻāĻžāĻ āύāĻŋāϏā§āĻā§āϰāĻŋā§ āĻāϰāĻž āĻšā§ā§āĻā§āĨ¤ āĻāĻŽāĻž āĻĻāĻŋāϤ⧠āĻŦāĻŋāĻāĻžāĻ āϏāĻā§āϰāĻŋā§ āĻāϰā§āύāĨ¤</string>
|
||||
<string name="revanced_sb_new_segment_title">āύāϤā§āύ āϏā§āĻĒāύā§āϏāϰāĻŦā§āϞāĻ āϏā§āĻāĻŽā§āύā§āĻ</string>
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<string name="revanced_sb_new_segment_mark_time_as_question">āĻāĻāĻāĻŋ āύāϤā§āύ āϏā§āĻāĻŽā§āύā§āĻā§āϰ āĻļā§āϰ⧠āĻŦāĻž āĻļā§āώ āĻšāĻŋāϏāĻžāĻŦā§ %1$02d:%2$02d:%3$03d āϏā§āĻ āĻāϰāĻŦā§āύ?</string>
|
||||
<string name="revanced_sb_new_segment_mark_start">āĻļā§āϰā§</string>
|
||||
<string name="revanced_sb_new_segment_mark_end">āĻļā§āώ</string>
|
||||
<string name="revanced_sb_new_segment_now">āĻāĻāύ</string>
|
||||
<string name="revanced_sb_new_segment_time_start">āϏā§āĻāĻŽā§āύā§āĻāĻāĻŋ āĻļā§āϰ⧠āĻšāĻāϝāĻŧāĻžāϰ āϏāĻŽāϝāĻŧ</string>
|
||||
<string name="revanced_sb_new_segment_time_end">āϏā§āĻāĻŽā§āύā§āĻāĻāĻŋ āĻļā§āώ āĻšāĻāϝāĻŧāĻžāϰ āϏāĻŽāϝāĻŧ</string>
|
||||
<string name="revanced_sb_new_segment_confirm_title">āϏāĻŽāϝāĻŧāĻāĻžāϞ āĻāĻŋ āϏāĻ āĻŋāĻ?</string>
|
||||
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||
<string name="revanced_sb_new_segment_confirm_content">āϏā§āĻāĻŽā§āύā§āĻ āϏāĻŽā§āĻāĻžāϞ\n\n%1$s\nāĻĨā§āĻā§\n%2$s\n\n(%3$s)\n\nāĻāĻŽāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻĒā§āϰāϏā§āϤā§āϤ?</string>
|
||||
<string name="revanced_sb_new_segment_start_is_before_end">āĻļā§āϰ⧠āĻ
āĻŦāĻļā§āϝāĻ āĻļā§āώā§āϰ āĻāĻā§ āĻšāϤ⧠āĻšāĻŦā§</string>
|
||||
<string name="revanced_sb_new_segment_mark_locations_first">āĻāĻā§ āϏāĻŽā§ āĻŦāĻžāϰ⧠āĻĻā§āĻāĻŋ āĻ
āĻŦāϏā§āĻĨāĻžāύ āĻāĻŋāĻšā§āύāĻŋāϤ āĻāϰā§āύ</string>
|
||||
@@ -851,10 +846,10 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_spoof_app_version_target_title">āϏā§āĻĒā§āĻĢ āĻ
ā§āϝāĻžāĻĒ āϏāĻāϏā§āĻāϰāĻŖ āϞāĻā§āώā§āϝ</string>
|
||||
<!-- 'RYD' is 'Return YouTube Dislike' -->
|
||||
<string name="revanced_spoof_app_version_target_entry_1">18.33.40 - āĻāĻĻā§āĻŽāĻŦā§āĻļāĻŋ āĻŽā§āĻĄā§ RYD āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰā§</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_2">ā§§ā§Ž.⧍ā§Ļ.ā§Šā§¯ - āĻĒā§āϰāĻļā§āĻŦāϏā§āϤ āĻāĻŋāĻĄāĻŋāĻ āϏā§āĻĒāĻŋāĻĄ āĻāĻŦāĻ āĻā§āĻŖāĻŽāĻžāύ āĻŽā§āύ⧠āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰā§</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_3">ā§§ā§Ž.ā§Ļ⧝.ā§Šā§¯ - āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻā§āϝāĻžāĻĒ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰā§</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_4">ā§§ā§.ā§Ēā§§.ā§Šā§¯ - āĻĒā§āϰā§āύ⧠āĻĒā§āϞā§āϞāĻŋāϏā§āĻ āĻļā§āϞāĻĢ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰā§</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_5">ā§§ā§.ā§Šā§Š.ā§Ē⧍ - āĻĒā§āϰā§āύ⧠UI āϞā§āĻāĻāĻ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰā§</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_2">18.20.39 - āĻĒā§āϰāĻļā§āĻŦāϏā§āϤ āĻāĻŋāĻĄāĻŋāĻ āϏā§āĻĒāĻŋāĻĄ āĻāĻŦāĻ āĻā§āĻŖāĻŽāĻžāύ āĻŽā§āύ⧠āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰā§</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_3">18.09.39 - āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻā§āϝāĻžāĻĒ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰā§</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_4">17.41.37 - āĻĒā§āϰā§āύ⧠āĻĒā§āϞā§āϞāĻŋāϏā§āĻ āĻļā§āϞāĻĢ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰā§</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_5">17.33.42 - āĻĒā§āϰā§āύ⧠UI āϞā§āĻāĻāĻ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰā§</string>
|
||||
</patch>
|
||||
<patch id="layout.startpage.ChangeStartPagePatch">
|
||||
<string name="revanced_start_page_title">āĻļā§āϰā§āϰ āĻĒā§āώā§āĻ āĻž āϏā§āĻ āĻāϰā§āύ</string>
|
||||
@@ -920,6 +915,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_seekbar_custom_color_value_summary">āϏāĻŋāĻāĻŦāĻžāϰā§āϰ āϰāĻ</string>
|
||||
<string name="revanced_seekbar_custom_color_invalid">āϏāĻŋāĻāĻŦāĻžāϰ⧠āĻā§āϞ āϰāĻ āĻĻā§ā§āĻž āĻšā§ā§āĻā§āĨ¤ āĻŽā§āϞ āϰāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻā§āĨ¤</string>
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.BypassImageRegionRestrictions">
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.AlternativeThumbnailsPatch">
|
||||
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||
<string name="revanced_alt_thumbnail_home_title">āĻšā§āĻŽ āĻā§āϝāĻžāĻŦ</string>
|
||||
@@ -960,6 +957,10 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_announcements_connection_failed">āĻā§āώāύāĻžāĻĻāĻžāϤāĻžāϰ āϏāĻžāĻĨā§ āϏāĻŽā§āĻĒāϰā§āĻ āϏā§āĻĨāĻžāĻĒāύ āĻŦā§āϝāϰā§āĻĨ āĻšā§ā§āĻā§</string>
|
||||
<string name="revanced_announcements_dialog_dismiss">āĻŦāĻžāϤāĻŋāϞ āĻāϰā§āύ</string>
|
||||
</patch>
|
||||
<patch id="misc.dns.CheckWatchHistoryDomainNameResolutionPatch">
|
||||
<string name="revanced_check_watch_history_domain_name_dialog_title">āϏāϤāϰā§āĻā§āĻāϰāĻŖ</string>
|
||||
<string name="revanced_check_watch_history_domain_name_dialog_ignore">āĻāĻŦāĻžāϰ āĻĻā§āĻāĻžāĻŦā§āύ āύāĻž</string>
|
||||
</patch>
|
||||
<patch id="misc.autorepeat.AutoRepeatPatch">
|
||||
<string name="revanced_auto_repeat_title">āϏā§āĻŦā§āĻāĻā§āϰāĻŋā§āĻāĻžāĻŦā§-āĻāĻŦāĻžāϰ āĻĻā§āĻāĻžāύ⧠āϏāĻā§āϰāĻŋā§ āĻāϰā§āύ</string>
|
||||
<string name="revanced_auto_repeat_summary_on">āϏā§āĻŦā§āĻāĻā§āϰāĻŋā§āĻāĻžāĻŦā§-āĻāĻŦāĻžāϰ āĻĻā§āĻāĻžāύ⧠āϏāĻā§āϰāĻŋā§ āĻšā§ā§āĻā§</string>
|
||||
@@ -985,10 +986,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_external_browser_summary_on">āϞāĻŋāĻāĻ āĻŦāĻžāĻšāĻŋāϰ⧠āĻā§āϞā§āύ</string>
|
||||
<string name="revanced_external_browser_summary_off">āĻ
ā§āϝāĻžāĻĒā§āϰ āĻŽāϧā§āϝ⧠āϞāĻŋāĻāĻ āĻā§āϞāĻā§</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
|
||||
<string name="revanced_background_playback_title">āĻŦā§āϝāĻžāĻāĻā§āϰāĻžāĻāύā§āĻĄ āĻĒā§āϞā§āĻŦā§āϝāĻžāĻ</string>
|
||||
<string name="revanced_background_playback_summary">āĻāĻ āϏā§āĻāĻŋāĻāĻāĻŋ āĻĒāĻžāĻā§āĻž āϝāĻžāĻŦā§ āϏā§āĻāĻŋāĻ -> āĻŦā§āϝāĻžāĻāĻā§āϰāĻžāĻāύā§āĻĄ -āĻ</string>
|
||||
</patch>
|
||||
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
|
||||
<string name="revanced_remove_tracking_query_parameter_title">āĻā§āϰā§āϝāĻžāĻāĻŋāĻ āĻāϰāĻžāϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻŽā§āĻā§āύ</string>
|
||||
<string name="revanced_remove_tracking_query_parameter_summary_on">āϞāĻŋāĻāĻ āĻĨā§āĻā§ āĻā§āϰā§āϝāĻžāĻāĻŋāĻ āĻāϰāĻžāϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻŽā§āĻā§ āĻĢā§āϞāĻž āĻšā§ā§āĻā§</string>
|
||||
@@ -1045,9 +1042,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_spoof_client_summary_on">āĻā§āϞāĻžā§ā§āύā§āĻ āϏā§āĻĒā§āĻĢ āĻāϰāĻž āĻšā§ā§āĻā§</string>
|
||||
<string name="revanced_spoof_client_summary_off">āĻā§āϞāĻžā§ā§āύā§āĻ āϏā§āĻĒā§āĻĢ āĻāϰāĻž āĻšā§āύāĻŋ\n\nāĻāĻŋāĻĄāĻŋāĻ āĻĒā§āϞā§āĻŦā§āϝāĻžāĻ āĻ āĻŋāĻāĻŽāϤ⧠āĻāĻžāĻ āύāĻžāĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">āĻāĻ āϏā§āĻāĻŋāĻāĻāĻŋ āĻŦāύā§āϧ āĻāϰāĻžāϰ āĻĢāϞ⧠āĻāĻŋāĻĄāĻŋāĻ āĻĒā§āϞā§āĻŦā§āϝāĻžāĻ āϤā§āϰā§āĻāĻŋ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤</string>
|
||||
<string name="revanced_spoof_client_use_ios_title">āĻā§āϞāĻžā§ā§āύā§āĻ iOS āĻ āϏā§āĻĒā§āĻĢ āĻāϰā§āύ</string>
|
||||
<string name="revanced_spoof_client_use_ios_summary_on">āĻā§āϞāĻžā§ā§āύā§āĻ āĻāĻāύ iOS āĻ āϏā§āĻĒā§āĻĢ āĻāϰāĻž āĻšā§ā§āĻā§\n\nāĻĒāĻžāϰā§āĻļā§āĻŦāĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋā§āĻž āϰā§ā§āĻā§:\nâĸ āĻā§āύ āĻāĻāĻāĻŋāĻĄāĻŋāĻāϰ āĻāĻŋāĻĄāĻŋāĻ āύā§āĻ\nâĸ āĻāĻŋāĻĄāĻŋāĻ āĻāϤāĻŋāĻšāĻžāϏ āĻāĻžāĻ āύāĻžāĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§\nâĸ āĻāĻā§āĻ āĻāĻŋāĻĄāĻŋāĻ āĻā§āĻŖāĻŽāĻžāύ āĻ
āύā§āĻĒāϏā§āĻĨāĻŋāϤ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§\nâĸāĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻ
āĻĄāĻŋāĻāϤ⧠āϞāĻžāĻāĻ āϏā§āĻā§āϰāĻŋāĻŽ āĻāϞāĻŦā§ āύāĻž\nâĸ āĻ
ā§āϝāĻžāύā§āĻĄā§āϰā§ā§āĻ ā§Ž āϏāĻāϏā§āĻāϰāĻŖā§ āϞāĻžāĻāĻ āϏā§āĻā§āϰāĻŋāĻŽ āĻāĻĒāϞāĻā§āϝ āύā§</string>
|
||||
<string name="revanced_spoof_client_use_ios_summary_off">āĻā§āϞāĻžāϝāĻŧā§āύā§āĻāĻā§ āĻŦāϰā§āϤāĻŽāĻžāύ⧠Android VR-āĻāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāϤāĻžāϰāĻŖāĻž āĻāϰāĻž āĻšāϝāĻŧā§āĻā§\n\nāϏāĻžāĻāĻĄ āĻāĻĢā§āĻā§āĻāĻā§āϞāĻŋāϰ āĻŽāϧā§āϝ⧠āϰāϝāĻŧā§āĻā§:\nâĸ āĻā§āύāĻ HDR āĻāĻŋāĻĄāĻŋāĻ āύā§āĻ\nâĸ āĻŦāĻžāĻā§āĻāĻžāĻĻā§āϰ āĻāĻŋāĻĄāĻŋāĻ āĻĒā§āϞā§āĻŦā§āϝāĻžāĻ āĻšāϝāĻŧ āύāĻž\nâĸ āĻŦāĻŋāϰāϤāĻŋ āĻĻā§āĻāϝāĻŧāĻž āĻāĻŋāĻĄāĻŋāĻāĻā§āϞāĻŋ āĻāϞā§āĻŽā§āϞā§āĻāĻžāĻŦā§ āĻāĻŦāĻžāϰ āĻļā§āϰ⧠āĻšāϤ⧠āĻĒāĻžāϰā§\nâĸ āύāĻŋāĻŽā§āύāĻŽāĻžāύā§āϰ āĻļāϰā§āĻāϏ āϏāĻŋāĻāĻŦāĻžāϰ āĻĨāĻžāĻŽā§āĻŦāύā§āϞ\nâĸ āĻĄāĻžāĻāύāϞā§āĻĄ āĻ
ā§āϝāĻžāĻāĻļāύ āĻŦā§āϤāĻžāĻŽ āϏāĻŦāϏāĻŽāϝāĻŧ āϞā§āĻāĻžāύ⧠āĻĨāĻžāĻā§\nâĸ āĻļā§āώ āϏā§āĻā§āϰāĻŋāύ āĻāĻžāϰā§āĻĄ āϏāĻŦāϏāĻŽāϝāĻŧ āϞā§āĻāĻžāύ⧠āĻĨāĻžāĻā§</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">āĻā§āϞāĻžā§ā§āύā§āĻ āϏā§āĻĒā§āĻĢ āĻĨāĻžāĻŽā§āĻŦāύā§āĻāϞ āϏāĻžāĻŽā§āĻŋāĻāĻāĻžāĻŦā§ āĻāĻĒāϞāĻā§āϝ āύ⧠(API āϏāĻŽā§ āĻļā§āώ āĻšā§ā§āĻā§)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">āϏā§āĻĒā§āĻĢ āĻā§āϞāĻžā§ā§āύā§āĻ āĻĨāĻžāĻŽā§āĻŦāύā§āĻāϞ āϏāĻžāĻŽā§āĻŋāĻāĻāĻžāĻŦā§ āĻāĻĒāϞāĻā§āϝ āύā§: %s</string>
|
||||
</patch>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user