Compare commits

...

138 commits

Author SHA1 Message Date
GitHub Actions
bb71f4bfd6 updated submodules 2024-10-09 00:51:11 +00:00
GitHub Actions
130ee40335 updated submodules 2024-10-08 00:51:33 +00:00
GitHub Actions
791376c8f8 updated submodules 2024-10-07 00:53:22 +00:00
GitHub Actions
96f960132a updated submodules 2024-10-06 00:55:49 +00:00
GitHub Actions
32b0961b74 updated submodules 2024-10-05 00:51:08 +00:00
GitHub Actions
227714a4f7 updated submodules 2024-10-04 00:51:41 +00:00
GitHub Actions
13a4642894 updated submodules 2024-10-03 00:51:35 +00:00
GitHub Actions
3afdd8a16e updated submodules 2024-10-02 00:51:28 +00:00
GitHub Actions
aa8c4018f7 updated submodules 2024-10-01 00:56:52 +00:00
GitHub Actions
ed2efc7876 updated submodules 2024-09-30 00:53:43 +00:00
GitHub Actions
dd8495b40e updated submodules 2024-09-28 00:50:55 +00:00
GitHub Actions
98058daa0f updated submodules 2024-09-27 00:51:50 +00:00
GitHub Actions
e4082c491e updated submodules 2024-09-26 00:50:55 +00:00
GitHub Actions
03c5b12a3b updated submodules 2024-09-25 00:52:17 +00:00
GitHub Actions
5fbb9ebada updated submodules 2024-09-24 00:51:32 +00:00
Balackburn
df888c2b55
Update README.md 2024-09-23 14:01:52 +02:00
GitHub Actions
23fe341199 updated submodules 2024-09-23 00:51:46 +00:00
GitHub Actions
111ee9fb75 updated submodules 2024-09-22 00:54:58 +00:00
GitHub Actions
04b91e6502 updated submodules 2024-09-21 00:48:32 +00:00
GitHub Actions
39807ec54d updated submodules 2024-09-20 00:50:24 +00:00
GitHub Actions
730140360b updated submodules 2024-09-19 00:49:42 +00:00
GitHub Actions
6696128300 updated submodules 2024-09-18 00:48:45 +00:00
Sunwoo Jung
1c23b5cb0e
Add Korean localization (#435) 2024-09-17 16:05:38 +02:00
GitHub Actions
8b1eb37b13 updated submodules 2024-09-17 00:40:04 +00:00
GitHub Actions
8135fc4e0f updated submodules 2024-09-16 00:52:36 +00:00
GitHub Actions
abe20ade53 updated submodules 2024-09-15 00:55:06 +00:00
arichornlover
1d7c7c9b22
Update .gitignore 2024-09-14 01:46:41 -05:00
GitHub Actions
3e5f3bbe85 updated submodules 2024-09-14 00:47:36 +00:00
GitHub Actions
d52a485d61 updated submodules 2024-09-13 00:48:21 +00:00
arichornlover
3d54ed60ef
LowContrastMode v1.6.0 2024-09-11 19:57:54 -05:00
GitHub Actions
83f5cfdc01 updated submodules 2024-09-12 00:48:42 +00:00
GitHub Actions
268d31de36 updated submodules 2024-09-11 00:48:07 +00:00
Cregin
6a50764aa9
Update Localizable.strings (#422) 2024-09-10 17:41:52 +02:00
GitHub Actions
9f80f6d386 updated submodules 2024-09-10 00:48:40 +00:00
Cregin
192010ed09
Create Localizable.strings (#420)
Added Simplified Chinese support
2024-09-09 11:43:43 +02:00
GitHub Actions
7f254511c9 updated submodules 2024-09-09 00:51:05 +00:00
GitHub Actions
e1d0560cf2 updated submodules 2024-09-08 00:52:57 +00:00
arichornlover
5eb16b09b2
Remove Code related to disabling YTLite Popup
I am removing it to respect the developer’s choice, no one should hate me for doing this decision of but I really don’t want to disrespect the creator of YTLite.
I’m one of the “YTLitePlus Devs” and I am not the one who wanted the Popup to be hidden. It was a bad idea from the start and I should’ve removed this sooner when I saw it. Anyways have a good day everyone.

- arichornlover
2024-09-07 15:12:26 -05:00
gototheskinny
376191c3a4
tr loc update (#413) 2024-09-07 14:04:15 +02:00
GitHub Actions
361e62aad3 updated submodules 2024-09-07 00:46:55 +00:00
GitHub Actions
c2f2a1f9eb updated submodules 2024-09-06 00:47:28 +00:00
GitHub Actions
3939a29d0b updated submodules 2024-09-05 00:47:45 +00:00
GitHub Actions
c82171f6e4 updated submodules 2024-09-04 00:47:53 +00:00
GitHub Actions
1de1ccb1ae updated submodules 2024-09-03 18:35:23 +00:00
GitHub Actions
827ff03bfb updated submodules 2024-09-03 18:17:26 +00:00
Bryce Hackel
ebf3edcc49
Merge pull request #396 from bhackel/v5
V5
2024-09-02 21:53:43 -07:00
Bryce Hackel
55494e2e91
coding on my phone 2024-09-02 20:27:38 -07:00
Bryce Hackel
7674805f75
ee 2024-09-02 19:34:12 -07:00
GitHub Actions
5b554ecc0a updated submodules 2024-09-03 00:47:07 +00:00
Bryce Hackel
d6c995b1be
Improve hiding warning 2024-09-02 15:24:27 -07:00
Bryce Hackel
df0be8c66e
Change hiding method 2024-09-01 19:45:54 -07:00
Bryce Hackel
9d62ce75ce
Fix bugs 2024-09-01 19:10:38 -07:00
GitHub Actions
e66f68ebc6 updated submodules 2024-09-02 00:49:42 +00:00
Bryce Hackel
c73cd63db4
Cancel gesture after 1 second of inactivity 2024-09-01 13:10:59 -07:00
Bryce Hackel
d4f8a41ff2
Fix smoothing for player gestures 2024-09-01 13:10:51 -07:00
Bryce Hackel
861a9fd30b
Remove OLED live chat fix 2024-09-01 12:27:07 -07:00
Bryce Hackel
a3ac8e9735
Default disable iSponsorBlock 2024-09-01 11:19:09 -07:00
Bryce Hackel
810aca2f16
Disable warning popup 2024-09-01 11:18:48 -07:00
ChuTuanVu
2134ae02d2
Update Vietnamese localization (#392) 2024-09-01 18:41:20 +02:00
DeciBelioS
d9a9ef5563
Update Localizable.strings Spanish (#391) 2024-09-01 18:41:09 +02:00
GitHub Actions
0d87774cd7 updated submodules 2024-09-01 00:56:34 +00:00
GitHub Actions
108deb8d6b updated submodules 2024-08-31 00:47:00 +00:00
Victor Alves
197f31edf4
Update Portuguese Localization (#389)
* Update Portuguese Localization

* Update Portuguese Localization

* Update Portuguese localization

* Update Portuguese Localization
2024-08-30 20:44:40 +02:00
GitHub Actions
b5a45c15ac updated submodules 2024-08-30 00:47:31 +00:00
GitHub Actions
4a92378939 updated submodules 2024-08-29 00:47:16 +00:00
GitHub Actions
f17bb793d4 updated submodules 2024-08-28 00:46:43 +00:00
Bryce Hackel
64bd324ec2
Merge pull request #380 from bhackel/update-settings-export
Update settings export
2024-08-26 23:33:40 -07:00
Bryce Hackel
5fb849297a
Fix bug with reminder again 2024-08-26 23:12:24 -07:00
Bryce Hackel
09721d4b3a
Fix reminder popups 2024-08-26 21:41:19 -07:00
GitHub Actions
a46b3b4e20 updated submodules 2024-08-27 00:46:19 +00:00
Bryce Hackel
5741d7c900
Fix black tinting in light mode 2024-08-26 12:40:39 -07:00
Bryce Hackel
969efaaf4d
Revert default Player Button, reduce image size 2024-08-26 12:36:26 -07:00
Bryce Hackel
6996c0ed66
Add keys, fix toasts 2024-08-26 12:33:02 -07:00
Bryce Hackel
5095267b4c
Merge branch 'main' into update-settings-export 2024-08-26 01:17:35 -07:00
Bryce Hackel
53e42e1dd4
Merge pull request #377 from bhackel/gesture-improvement
Gesture improvement
2024-08-26 01:12:43 -07:00
Bryce Hackel
9b83103e92
Merge branch 'main' into gesture-improvement 2024-08-26 00:55:52 -07:00
Bryce Hackel
963b9d5fd3
Ignore fine scrubber gesture overlap 2024-08-26 00:43:56 -07:00
Bryce Hackel
573c2d2f43
Add setting for haptic feedback 2024-08-26 00:06:39 -07:00
Bryce Hackel
268568b106
Improve audio smoothness visuals 2024-08-26 00:06:18 -07:00
Bryce Hackel
235e2966bc
Fix bugs, only allow one seek gesture 2024-08-25 23:10:49 -07:00
Bryce Hackel
8118240125
Merge pull request #376 from bhackel/update-video-player
Update video player
2024-08-25 22:16:12 -07:00
Bryce Hackel
d4add482d7
Merge branch 'main' into update-video-player 2024-08-25 22:15:00 -07:00
Bryce Hackel
6aa1f62140
Add smoothing, improve seek, adjust sensitivity 2024-08-25 21:58:18 -07:00
GitHub Actions
c82b31d181 updated submodules 2024-08-26 00:46:08 +00:00
Bryce Hackel
fa922a1acd
Add player button in navbar 2024-08-25 17:39:12 -07:00
Bryce Hackel
aa5300f54f
Refactor, update seek implementation, improve speed 2024-08-25 17:31:11 -07:00
Bryce Hackel
2097308a83
Improve localizations, fix bugs 2024-08-25 12:03:43 -07:00
Bryce Hackel
3795d543ad
Update LICENSE 2024-08-25 11:51:34 -07:00
arichornlover
7083d30d9c
Update Localizable.strings 2024-08-24 21:36:44 -05:00
arichornlover
a8c21a202a
Update English localization 2024-08-24 21:06:34 -05:00
arichornlover
cba079cefa
Update template localization 2024-08-24 21:06:02 -05:00
Bryce Hackel
7d75eac440
Merge pull request #373 from bhackel/fix-settings-crash
Fix settings crash
2024-08-24 16:49:58 -07:00
Bryce Hackel
6e9ec38c4a
Add reminder for YouTube Plus 2024-08-24 16:38:20 -07:00
Bryce Hackel
312f84eb78
Merge branch 'main' into fix-settings-crash 2024-08-24 16:34:16 -07:00
GitHub Actions
525f10dcda updated submodules 2024-08-24 00:43:58 +00:00
GitHub Actions
2e6f678f34 updated submodules 2024-08-23 00:44:53 +00:00
Bryce Hackel
beeb9eb19f
Add default value ignore 2024-08-21 22:46:32 -07:00
Bryce Hackel
0d72c03167
Add keys to Copy Settings 2024-08-21 22:23:02 -07:00
Bryce Hackel
8eed3ce8bc
Fix playback in feeds on iPad 2024-08-21 21:01:27 -07:00
Bryce Hackel
3f24f6440f
Merge pull request #370 from bhackel/revert-miniplayer
Revert bigytminiplayer
2024-08-21 20:58:53 -07:00
Bryce Hackel
c0a2ec26ed
Revert bigytminiplayer 2024-08-21 20:34:37 -07:00
GitHub Actions
7797875a87 updated submodules 2024-08-22 00:46:07 +00:00
GitHub Actions
4f890f4e0d updated submodules 2024-08-21 00:44:32 +00:00
Bryce Hackel
2ece340746
Merge pull request #358 from bhackel/gestures
Gestures and Loop
2024-08-20 00:52:28 -07:00
Bryce Hackel
ca84635cf4
Merge branch 'main' into gestures 2024-08-20 00:40:52 -07:00
Bryce Hackel
5066716f7f
Localizations for Gestures 2024-08-20 00:24:56 -07:00
Bryce Hackel
bed87298f6
Update Submodule 2024-08-19 23:42:02 -07:00
GitHub Actions
87d7b576dd updated submodules 2024-08-20 00:53:21 +00:00
GitHub Actions
f652976a53 updated submodules 2024-08-20 00:44:56 +00:00
Bryce Hackel
44d6ffe781
Create LICENSE 2024-08-19 14:08:08 -07:00
Bryce Hackel
023fafae15
Added YouLoop submodule to Tweaks/ folder 2024-08-18 18:17:32 -07:00
GitHub Actions
4c5e2ee0e8 updated submodules 2024-08-18 00:49:27 +00:00
GitHub Actions
de89f7aca8 updated submodules 2024-08-17 00:43:19 +00:00
Bryce Hackel
36f9da844b
Add disable option 2024-08-16 09:58:32 -07:00
Bryce Hackel
e63bc374cf
Fix defaults and text descriptions 2024-08-16 09:21:19 -07:00
Bryce Hackel
067ad5a373
Merge pull request #345 from bhackel/video-player
Basic Video player
2024-08-16 01:40:45 -07:00
Bryce Hackel
6e8bbcb49e
Add localization 2024-08-16 01:34:51 -07:00
Bryce Hackel
e21e026c30
Fix compile 2024-08-16 00:54:07 -07:00
Bryce Hackel
1647358a9e
Merge branch 'main' into video-player 2024-08-16 00:35:06 -07:00
Bryce Hackel
feaaa07e9e
Revert "Prototype 2"
This reverts commit 8f578bb741.
2024-08-16 00:33:37 -07:00
Bryce Hackel
f434239419
Merge branch 'main' into gestures 2024-08-16 00:26:24 -07:00
Bryce Hackel
e62699749d
Sensitivity and Deadzone settings 2024-08-16 00:25:24 -07:00
Bryce Hackel
4602b74e6f
Add deadzone 2024-08-15 23:24:07 -07:00
Bryce Hackel
6854f91c1e
Implement gesture selection 2024-08-15 19:48:41 -07:00
GitHub Actions
b081d5b52e updated submodules 2024-08-16 00:44:28 +00:00
Bryce Hackel
8ed3d97d2d
Gesture refactor for settings 2024-08-15 00:01:53 -07:00
Bryce Hackel
e92ada8427
Gesture settings 2024-08-14 23:16:49 -07:00
Bryce Hackel
8f578bb741
Prototype 2 2024-08-14 18:28:42 -07:00
GitHub Actions
2d82e0b532 updated submodules 2024-08-15 00:43:33 +00:00
Bryce Hackel
b963c807bb
Video player prototype 2024-08-14 09:23:15 -07:00
Bryce Hackel
10882e5d61
Merge branch 'main' into gestures 2024-08-14 09:00:51 -07:00
Bryce Hackel
4ed8e94880
Merge branch 'main' into gestures 2024-08-13 23:41:37 -07:00
Bryce Hackel
b588b7f6d0
Attempt seek gesture 2024-08-13 22:51:30 -07:00
GitHub Actions
9aa33a676d updated submodules 2024-08-14 00:53:53 +00:00
Bryce Hackel
64c712d630
Attempt brightness and volume gestures 2024-08-09 16:51:12 -07:00
Bryce Hackel
91290efdfe
Allow other gestures 2024-08-09 15:39:52 -07:00
Bryce Hackel
d4679b8414
Attempt Volume Sliding 2024-08-07 10:59:10 -07:00
Bryce Hackel
df3d09e81d
Gesture test using YTHFS code 2024-08-06 23:09:19 -07:00
45 changed files with 2765 additions and 551 deletions

6
.gitignore vendored
View file

@ -2,6 +2,6 @@
.theos/
packages/
tmp/
Tweaks/Cercube/*
!Tweaks/Cercube/.gitkeep
Resources/
Tweaks/YTLite/*
!Tweaks/YTLite/.gitkeep
Resources/

3
.gitmodules vendored
View file

@ -55,3 +55,6 @@
[submodule "Tweaks/YouTimeStamp"]
path = Tweaks/YouTimeStamp
url = https://github.com/arichornloverALT/YouTimeStamp.git
[submodule "Tweaks/YouLoop"]
path = Tweaks/YouLoop
url = https://github.com/bhackel/YouLoop

674
LICENSE Normal file
View file

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

View file

@ -15,7 +15,7 @@ EXTRA_CFLAGS := $(addprefix -I,$(shell find Tweaks/FLEX -name '*.h' -exec dirnam
# Allow YouTubeHeader to be accessible using #include <...>
export ADDITIONAL_CFLAGS = -I$(THEOS_PROJECT_DIR)/Tweaks
YTLitePlus_INJECT_DYLIBS = Tweaks/YTLite/var/jb/Library/MobileSubstrate/DynamicLibraries/YTLite.dylib .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YTABConfig.dylib .theos/obj/YouMute.dylib .theos/obj/DontEatMyContent.dylib .theos/obj/YTHoldForSpeed.dylib .theos/obj/YTVideoOverlay.dylib .theos/obj/YouGroupSettings.dylib .theos/obj/YouQuality.dylib .theos/obj/YouTimeStamp.dylib
YTLitePlus_INJECT_DYLIBS = Tweaks/YTLite/var/jb/Library/MobileSubstrate/DynamicLibraries/YTLite.dylib .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YTABConfig.dylib .theos/obj/YouMute.dylib .theos/obj/DontEatMyContent.dylib .theos/obj/YTHoldForSpeed.dylib .theos/obj/YTVideoOverlay.dylib .theos/obj/YouGroupSettings.dylib .theos/obj/YouQuality.dylib .theos/obj/YouTimeStamp.dylib .theos/obj/YouLoop.dylib
YTLitePlus_FILES = YTLitePlus.xm $(shell find Source -name '*.xm' -o -name '*.x' -o -name '*.m') $(shell find Tweaks/FLEX -type f \( -iname \*.c -o -iname \*.m -o -iname \*.mm \))
YTLitePlus_IPA = ./tmp/Payload/YouTube.app
YTLitePlus_CFLAGS = -fobjc-arc -Wno-deprecated-declarations -Wno-unsupported-availability-guard -Wno-unused-but-set-variable -DTWEAK_VERSION=$(PACKAGE_VERSION) $(EXTRA_CFLAGS)
@ -23,11 +23,11 @@ YTLitePlus_FRAMEWORKS = UIKit Security
include $(THEOS)/makefiles/common.mk
include $(THEOS_MAKE_PATH)/tweak.mk
SUBPROJECTS += Tweaks/Alderis Tweaks/iSponsorBlock Tweaks/YTUHD Tweaks/YouPiP Tweaks/Return-YouTube-Dislikes Tweaks/YTABConfig Tweaks/YouMute Tweaks/DontEatMyContent Tweaks/YTHoldForSpeed Tweaks/YTVideoOverlay Tweaks/YouQuality Tweaks/YouTimeStamp Tweaks/YouGroupSettings
SUBPROJECTS += Tweaks/Alderis Tweaks/iSponsorBlock Tweaks/YTUHD Tweaks/YouPiP Tweaks/Return-YouTube-Dislikes Tweaks/YTABConfig Tweaks/YouMute Tweaks/DontEatMyContent Tweaks/YTHoldForSpeed Tweaks/YTVideoOverlay Tweaks/YouQuality Tweaks/YouTimeStamp Tweaks/YouGroupSettings Tweaks/YouLoop
include $(THEOS_MAKE_PATH)/aggregate.mk
YTLITE_PATH = Tweaks/YTLite
YTLITE_VERSION := $(shell wget -qO- "https://github.com/dayanch96/YTLite/releases/latest" | grep -o -E '/tag/v[^"]+' | head -n 1 | sed 's/\/tag\/v//')
YTLITE_VERSION := 5.0.1
YTLITE_DEB = $(YTLITE_PATH)/com.dvntm.ytlite_$(YTLITE_VERSION)_iphoneos-arm64.deb
YTLITE_DYLIB = $(YTLITE_PATH)/var/jb/Library/MobileSubstrate/DynamicLibraries/YTLite.dylib
YTLITE_BUNDLE = $(YTLITE_PATH)/var/jb/Library/Application\ Support/YTLite.bundle
@ -46,6 +46,7 @@ before-package::
@cp -R Tweaks/YTVideoOverlay/layout/Library/Application\ Support/YTVideoOverlay.bundle Resources/
@cp -R Tweaks/YouQuality/layout/Library/Application\ Support/YouQuality.bundle Resources/
@cp -R Tweaks/YouTimeStamp/layout/Library/Application\ Support/YouTimeStamp.bundle Resources/
@cp -R Tweaks/YouLoop/layout/Library/Application\ Support/YouLoop.bundle Resources/
@cp -R lang/YTLitePlus.bundle Resources/
@echo -e "==> \033[1mChanging the installation path of dylibs...\033[0m"
@ldid -r .theos/obj/iSponsorBlock.dylib && install_name_tool -change /usr/lib/libcolorpicker.dylib @rpath/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib

View file

@ -9,9 +9,8 @@
![GitHub issues](https://img.shields.io/github/issues-raw/Balackburn/YTLitePlus?style=flat&labelColor=%23000000&color=%23000000)
[![Platform](https://img.shields.io/badge/Platform-iOS%20%7C%20iPadOS%2014.0%2B-black?labelColor=black&style=flat)](https://developer.apple.com/iphone/index.action)
![Release](https://img.shields.io/github/downloads/Balackburn/YTLitePlus/total?color=black&labelColor=black&style=flat)
<a href="https://github.com/Balackburn/YTLitePlus/commit"><img src="https://custom-icon-badges.demolab.com/github/last-commit/Balackburn/YTLitePlus?style=flat&color=black&labelColor=black&logo=history&logoColor=white&label=Last commit" alt="Badge"></img></a>
<a href="https://github.com/Balackburn/YTLitePlus/releases/latest"><img src="https://custom-icon-badges.demolab.com/github/v/release/Balackburn/YTLitePlus?labelColor=black&style=flat&color=black&label=Latest%20release" alt="Badge"></img></a>
<a href="https://github.com/YTLitePlus/YTLitePlus/commit"><img src="https://custom-icon-badges.demolab.com/github/last-commit/Balackburn/YTLitePlus?style=flat&color=black&labelColor=black&logo=history&logoColor=white&label=Last commit" alt="Badge"></img></a>
<a href="https://github.com/YTLitePlus/YTLitePlus/releases/latest"><img src="https://custom-icon-badges.demolab.com/github/v/release/Balackburn/YTLitePlus?labelColor=black&style=flat&color=black&label=Latest%20release" alt="Badge"></img></a>
# Table of Contents
<a href="#credits"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Buttons/TableOfContents/Credits.png" width="170"></a>

View file

@ -1,9 +1,6 @@
#import "../YTLitePlus.h"
//
static BOOL IsEnabled(NSString *key) {
return [[NSUserDefaults standardUserDefaults] boolForKey:key];
}
// Low Contrast Mode
static int contrastMode() {
return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcm"];
}
@ -16,7 +13,7 @@ static BOOL customContrastMode() {
UIColor *lcmHexColor;
%group gLowContrastMode // Low Contrast Mode v1.4.3 (Compatible with only YouTube v16.46.5-v17.38.10)
%group gLowContrastMode // Low Contrast Mode v1.6.0 (Compatible with only YouTube v16.46.5-v17.38.10)
%hook UIColor
+ (UIColor *)whiteColor { // Dark Theme Color
return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00];
@ -42,32 +39,53 @@ UIColor *lcmHexColor;
%end
%hook YTCommonColorPalette
- (UIColor *)textPrimary {
NSLog(@"LowContrastMode: textPrimary called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)textSecondary {
NSLog(@"LowContrastMode: textSecondary called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)overlayTextPrimary {
NSLog(@"LowContrastMode: overlayTextPrimary called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)overlayTextSecondary {
NSLog(@"LowContrastMode: overlayTextSecondary called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)iconActive {
NSLog(@"LowContrastMode: iconActive called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)iconActiveOther {
NSLog(@"LowContrastMode: iconActiveOther called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)brandIconActive {
NSLog(@"LowContrastMode: brandIconActive called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)staticBrandWhite {
NSLog(@"LowContrastMode: staticBrandWhite called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)overlayIconActiveOther {
NSLog(@"LowContrastMode: overlayIconActiveOther called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)overlayIconInactive {
NSLog(@"LowContrastMode: overlayIconInactive called");
return self.pageStyle == 1 ? [[UIColor whiteColor] colorWithAlphaComponent:0.7] : %orig;
}
- (UIColor *)overlayIconDisabled {
NSLog(@"LowContrastMode: overlayIconDisabled called");
return self.pageStyle == 1 ? [[UIColor whiteColor] colorWithAlphaComponent:0.3] : %orig;
}
- (UIColor *)overlayFilledButtonActive {
NSLog(@"LowContrastMode: overlayFilledButtonActive called");
return self.pageStyle == 1 ? [[UIColor whiteColor] colorWithAlphaComponent:0.2] : %orig;
}
%end
%hook YTColor
+ (UIColor *)white2 {

View file

@ -5,6 +5,7 @@
#import "../Tweaks/YouTubeHeader/YTSettingsSectionItemManager.h"
#import "../Tweaks/YouTubeHeader/YTUIUtils.h"
#import "../Tweaks/YouTubeHeader/YTSettingsPickerViewController.h"
#import "SettingsKeys.h"
// #import "AppIconOptionsController.h"
// Basic switch item
@ -32,12 +33,6 @@
settingItemId:0]
*/
static BOOL IsEnabled(NSString *key) {
return [[NSUserDefaults standardUserDefaults] boolForKey:key];
}
static int GetSelection(NSString *key) {
return [[NSUserDefaults standardUserDefaults] integerForKey:key];
}
static int contrastMode() {
return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcm"];
}
@ -51,17 +46,6 @@ static int appVersionSpoofer() {
extern NSBundle *YTLitePlusBundle();
// Keys for "Copy Settings" button (for: YTLitePlus)
NSArray *copyKeys = @[
/* MAIN Controls Keys 1/2 */ @"enableShareButton_enabled", @"enableSaveToButton_enabled", @"hideVideoPlayerShadowOverlayButtons_enabled", @"hideRightPanel_enabled", @"hideHeatwaves_enabled", @"disableAmbientModePortrait_enabled",
/* MAIN Controls Keys 2/2 */ @"disableAmbientModeFullscreen_enabled", @"fullscreenToTheRight_enabled", @"seekAnywhere_enabled", @"YTTapToSeek_enabled", @"disablePullToFull_enabled", @"alwaysShowRemainingTime_enabled", @"disableRemainingTime_enabled", @"disableEngagementOverlay_enabled",
/* MAIN App Overlay Keys 1/2 */ @"disableAccountSection_enabled", @"disableAutoplaySection_enabled", @"disableTryNewFeaturesSection_enabled", @"disableVideoQualityPreferencesSection_enabled", @"disableNotificationsSection_enabled",
/* MAIN App Overlay Keys 2/2 */ @"disableManageAllHistorySection_enabled", @"disableYourDataInYouTubeSection_enabled", @"disablePrivacySection_enabled", @"disableLiveChatSection_enabled",
/* MAIN Playback Keys */ @"inline_muted_playback_enabled",
/* MAIN Misc Keys */ @"newSettingsUI_enabled", @"ytStartupAnimation_enabled", @"ytNoModernUI_enabled", @"iPadLayout_enabled", @"iPhoneLayout_enabled", @"castConfirm_enabled", @"bigYTMiniPlayer_enabled", @"hideCastButton_enabled", @"hideSponsorBlockButton_enabled", @"hideHomeTab_enabled", @"fixCasting_enabled", @"flex_enabled", @"enableVersionSpoofer_enabled",
/* TWEAK YTUHD Keys */ @"EnableVP9", @"AllVP9"
];
// Add both YTLite and YTLitePlus to YouGroupSettings
static const NSInteger YTLitePlusSection = 788;
static const NSInteger YTLiteSection = 789;
@ -80,7 +64,7 @@ static const NSInteger YTLiteSection = 789;
%end
// Settings
// Add YTLitePlus to the settings list
%hook YTAppSettingsPresentationData
+ (NSArray *)settingsCategoryOrder {
NSArray *order = %orig;
@ -108,29 +92,35 @@ static const NSInteger YTLiteSection = 789;
Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem);
YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"];
// Add item for going to the YTLitePlus GitHub page
YTSettingsSectionItem *main = [%c(YTSettingsSectionItem)
itemWithTitle:[NSString stringWithFormat:LOC(@"VERSION"), @(OS_STRINGIFY(TWEAK_VERSION))]
titleDescription:LOC(@"VERSION_CHECK")
accessibilityIdentifier:nil
detailTextBlock:nil
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/YTLitePlus/YTLitePlus/releases/latest"]];
}];
itemWithTitle:[NSString stringWithFormat:LOC(@"VERSION"), @(OS_STRINGIFY(TWEAK_VERSION))]
titleDescription:LOC(@"VERSION_CHECK")
accessibilityIdentifier:nil
detailTextBlock:nil
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/YTLitePlus/YTLitePlus/releases/latest"]];
}];
[sectionItems addObject:main];
# pragma mark - Copy and Paste Settings
YTSettingsSectionItem *copySettings = [%c(YTSettingsSectionItem)
itemWithTitle:LOC(@"COPY_SETTINGS")
titleDescription:IS_ENABLED(@"switchCopyandPasteFunctionality_enabled") ? LOC(@"COPY_SETTINGS_DESC_2") : LOC(@"COPY_SETTINGS_DESC")
itemWithTitle:IS_ENABLED(@"switchCopyandPasteFunctionality_enabled") ? LOC(@"EXPORT_SETTINGS") : LOC(@"COPY_SETTINGS")
titleDescription:IS_ENABLED(@"switchCopyandPasteFunctionality_enabled") ? LOC(@"EXPORT_SETTINGS_DESC") : LOC(@"COPY_SETTINGS_DESC")
accessibilityIdentifier:nil
detailTextBlock:nil
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
if (IS_ENABLED(@"switchCopyandPasteFunctionality_enabled")) {
// Export Settings functionality
NSURL *tempFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"exported_settings.txt"]];
NSURL *tempFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"YTLitePlusSettings.txt"]];
NSMutableString *settingsString = [NSMutableString string];
for (NSString *key in copyKeys) {
for (NSString *key in NSUserDefaultsCopyKeys) {
id value = [[NSUserDefaults standardUserDefaults] objectForKey:key];
if (value) {
id defaultValue = NSUserDefaultsCopyKeysDefaults[key];
// Only include the setting if it is different from the default value
// If no default value is found, include it by default
if (value && (!defaultValue || ![value isEqual:defaultValue])) {
[settingsString appendFormat:@"%@: %@\n", key, value];
}
}
@ -143,23 +133,41 @@ static const NSInteger YTLiteSection = 789;
// Copy Settings functionality (DEFAULT - Copies to Clipboard)
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableString *settingsString = [NSMutableString string];
for (NSString *key in copyKeys) {
if ([userDefaults objectForKey:key]) {
NSString *value = [userDefaults objectForKey:key];
for (NSString *key in NSUserDefaultsCopyKeys) {
id value = [userDefaults objectForKey:key];
id defaultValue = NSUserDefaultsCopyKeysDefaults[key];
// Only include the setting if it is different from the default value
// If no default value is found, include it by default
if (value && (!defaultValue || ![value isEqual:defaultValue])) {
[settingsString appendFormat:@"%@: %@\n", key, value];
}
}
[[UIPasteboard generalPasteboard] setString:settingsString];
// Show a confirmation message or perform some other action here
[[%c(GOOHUDManagerInternal) sharedInstance] showMessageMainThread:[%c(YTHUDMessage) messageWithText:@"Settings copied"]];
// Show an option to export YouTube Plus settings
UIAlertController *exportAlert = [UIAlertController alertControllerWithTitle:@"Export Settings"
message:@"Note: This feature cannot save iSponsorBlock and most YouTube settings.\n\nWould you like to also export your YouTube Plus Settings?"
preferredStyle:UIAlertControllerStyleAlert];
[exportAlert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]];
[exportAlert addAction:[UIAlertAction actionWithTitle:@"Export" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
// Export YouTube Plus Settings functionality
[%c(YTLUserDefaults) exportYtlSettings];
}]];
// Present the alert from the root view controller
[settingsViewController presentViewController:exportAlert animated:YES completion:nil];
}
return YES;
}
];
[sectionItems addObject:copySettings];
YTSettingsSectionItem *pasteSettings = [%c(YTSettingsSectionItem)
itemWithTitle:LOC(@"PASTE_SETTINGS")
titleDescription:IS_ENABLED(@"switchCopyandPasteFunctionality_enabled") ? LOC(@"PASTE_SETTINGS_DESC_2") : LOC(@"PASTE_SETTINGS_DESC")
itemWithTitle:IS_ENABLED(@"switchCopyandPasteFunctionality_enabled") ? LOC(@"IMPORT_SETTINGS") : LOC(@"PASTE_SETTINGS")
titleDescription:IS_ENABLED(@"switchCopyandPasteFunctionality_enabled") ? LOC(@"IMPORT_SETTINGS_DESC") : LOC(@"PASTE_SETTINGS_DESC")
accessibilityIdentifier:nil
detailTextBlock:nil
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
@ -169,7 +177,6 @@ static const NSInteger YTLiteSection = 789;
documentPicker.delegate = (id<UIDocumentPickerDelegate>)self;
documentPicker.allowsMultipleSelection = NO;
[settingsViewController presentViewController:documentPicker animated:YES completion:nil];
return YES;
} else {
// Paste Settings functionality (DEFAULT - Pastes from Clipboard)
UIAlertController *confirmPasteAlert = [UIAlertController alertControllerWithTitle:LOC(@"PASTE_SETTINGS_ALERT") message:nil preferredStyle:UIAlertControllerStyleAlert];
@ -185,13 +192,21 @@ static const NSInteger YTLiteSection = 789;
NSString *value = components[1];
[[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
}
}
}
[settingsViewController reloadData];
// Show a confirmation message or perform some other action here
// Show a confirmation toast
[[%c(GOOHUDManagerInternal) sharedInstance] showMessageMainThread:[%c(YTHUDMessage) messageWithText:@"Settings applied"]];
// Show a reminder to import YouTube Plus settings as well
UIAlertController *reminderAlert = [UIAlertController alertControllerWithTitle:@"Reminder"
message:@"Remember to import your YouTube Plus settings as well"
preferredStyle:UIAlertControllerStyleAlert];
[reminderAlert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]];
[settingsViewController presentViewController:reminderAlert animated:YES completion:nil];
}
}]];
[settingsViewController presentViewController:confirmPasteAlert animated:YES completion:nil];
}
return YES;
}
];
@ -212,6 +227,181 @@ static const NSInteger YTLiteSection = 789;
[sectionItems addObject:appIcon];
*/
# pragma mark - Player Gestures - @bhackel
// Helper to get the selected gesture mode
static NSString* (^sectionGestureSelectedModeToString)(GestureMode) = ^(GestureMode sectionIndex) {
switch (sectionIndex) {
case GestureModeVolume:
return LOC(@"VOLUME");
case GestureModeBrightness:
return LOC(@"BRIGHTNESS");
case GestureModeSeek:
return LOC(@"SEEK");
case GestureModeDisabled:
return LOC(@"DISABLED");
default:
return @"Invalid index - Report bug";
}
};
// Helper to generate checkmark setting items for selecting gesture modes
static YTSettingsSectionItem* (^gestureCheckmarkSettingItem)(NSInteger, NSString *) = ^(NSInteger idx, NSString *key) {
return [YTSettingsSectionItemClass
checkmarkItemWithTitle:sectionGestureSelectedModeToString(idx)
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setInteger:idx forKey:key];
[settingsViewController reloadData];
return YES;
}
];
};
// Helper to generate a section item for selecting a gesture mode
YTSettingsSectionItem *(^createSectionGestureSelector)(NSString *, NSString *) = ^YTSettingsSectionItem *(NSString *sectionLabel, NSString *sectionKey) {
return [YTSettingsSectionItemClass itemWithTitle:LOC(sectionLabel)
accessibilityIdentifier:nil
detailTextBlock:^NSString *() {
return sectionGestureSelectedModeToString(GetInteger(sectionKey));
}
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[
gestureCheckmarkSettingItem(0, sectionKey), // Volume
gestureCheckmarkSettingItem(1, sectionKey), // Brightness
gestureCheckmarkSettingItem(2, sectionKey), // Seek
gestureCheckmarkSettingItem(3, sectionKey) // Disabled
];
// Present picker when selecting this settings item
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc]
initWithNavTitle:LOC(sectionLabel)
pickerSectionTitle:nil
rows:rows
selectedItemIndex:GetInteger(sectionKey)
parentResponder:[self parentResponder]
];
[settingsViewController pushViewController:picker];
return YES;
}
];
};
// Configuration picker for deadzone to pick from 0 to 100 pixels with interval of 10
NSMutableArray<NSNumber *> *deadzoneValues = [NSMutableArray array];
for (CGFloat value = 0; value <= 100; value += 10) {
[deadzoneValues addObject:@(value)];
}
YTSettingsSectionItem *deadzonePicker = [YTSettingsSectionItemClass
itemWithTitle:LOC(@"DEADZONE")
titleDescription:LOC(@"DEADZONE_DESC")
accessibilityIdentifier:nil
detailTextBlock:^NSString *() {
return [NSString stringWithFormat:@"%ld px", (long)GetFloat(@"playerGesturesDeadzone")];
}
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
// Generate rows for deadzone picker using the predefined array
NSMutableArray <YTSettingsSectionItem *> *deadzoneRows = [NSMutableArray array];
for (NSNumber *deadzoneValue in deadzoneValues) {
CGFloat deadzone = [deadzoneValue floatValue];
[deadzoneRows addObject:[YTSettingsSectionItemClass
checkmarkItemWithTitle:[NSString stringWithFormat:@"%ld px", (long)deadzone]
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setFloat:deadzone forKey:@"playerGesturesDeadzone"];
[settingsViewController reloadData];
return YES;
}
]];
}
// Determine the index of the currently selected deadzone
CGFloat currentDeadzone = GetFloat(@"playerGesturesDeadzone");
NSUInteger selectedIndex = [deadzoneValues indexOfObject:@(currentDeadzone)];
if (selectedIndex == NSNotFound) {
selectedIndex = 0; // Default to the first item if the current deadzone is not found
}
// Present deadzone picker when selecting this settings item
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc]
initWithNavTitle:LOC(@"DEADZONE")
pickerSectionTitle:nil
rows:deadzoneRows
selectedItemIndex:selectedIndex
parentResponder:[self parentResponder]
];
[settingsViewController pushViewController:picker];
return YES;
}
];
// Configuration picker for sensitivity to pick from 0.5 to 2.0 with interval of 0.1
NSMutableArray<NSNumber *> *sensitivityValues = [NSMutableArray array];
for (CGFloat value = 0.5; value <= 2.0; value += 0.1) {
[sensitivityValues addObject:@(value)];
}
YTSettingsSectionItem *sensitivityPicker = [YTSettingsSectionItemClass
itemWithTitle:LOC(@"SENSITIVITY")
titleDescription:LOC(@"SENSITIVITY_DESC")
accessibilityIdentifier:nil
detailTextBlock:^NSString *() {
return [NSString stringWithFormat:@"%.1f", GetFloat(@"playerGesturesSensitivity")];
}
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
// Generate rows for sensitivity picker using the predefined array
NSMutableArray <YTSettingsSectionItem *> *sensitivityRows = [NSMutableArray array];
for (NSNumber *sensitivityValue in sensitivityValues) {
CGFloat sensitivity = [sensitivityValue floatValue];
[sensitivityRows addObject:[YTSettingsSectionItemClass
checkmarkItemWithTitle:[NSString stringWithFormat:@"%.1f", sensitivity]
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setFloat:sensitivity forKey:@"playerGesturesSensitivity"];
[settingsViewController reloadData];
return YES;
}
]];
}
// Determine the index of the currently selected sensitivity
CGFloat currentSensitivity = GetFloat(@"playerGesturesSensitivity");
NSUInteger selectedIndex = [sensitivityValues indexOfObject:@(currentSensitivity)];
if (selectedIndex == NSNotFound) {
selectedIndex = 0; // Default to the first item if the current sensitivity is not found
}
// Present sensitivity picker
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc]
initWithNavTitle:LOC(@"SENSITIVITY")
pickerSectionTitle:nil
rows:sensitivityRows
selectedItemIndex:selectedIndex
parentResponder:[self parentResponder]
];
[settingsViewController pushViewController:picker];
return YES;
}
];
// Create and add items to the high level gestures menu
YTSettingsSectionItem *playerGesturesGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"PLAYER_GESTURES_TITLE") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[
// Description header item
[YTSettingsSectionItemClass
itemWithTitle:nil
titleDescription:LOC(@"PLAYER_GESTURES_DESC")
accessibilityIdentifier:nil
detailTextBlock:nil
selectBlock:nil
],
// Toggle for enabling gestures
BASIC_SWITCH(LOC(@"PLAYER_GESTURES_TOGGLE"), nil, @"playerGestures_enabled"),
// Pickers for each gesture section
createSectionGestureSelector(@"TOP_SECTION", @"playerGestureTopSelection"),
createSectionGestureSelector(@"MIDDLE_SECTION", @"playerGestureMiddleSelection"),
createSectionGestureSelector(@"BOTTOM_SECTION", @"playerGestureBottomSelection"),
// Pickers for configuration settings
deadzonePicker,
sensitivityPicker,
// Toggle for haptic feedback
BASIC_SWITCH(LOC(@"PLAYER_GESTURES_HAPTIC_FEEDBACK"), nil, @"playerGesturesHapticFeedback_enabled"),
];
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"PLAYER_GESTURES_TITLE") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
[settingsViewController pushViewController:picker];
return YES;
}];
[sectionItems addObject:playerGesturesGroup];
# pragma mark - Video Controls Overlay Options
YTSettingsSectionItem *videoControlOverlayGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"VIDEO_CONTROLS_OVERLAY_OPTIONS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[
@ -366,7 +556,7 @@ static const NSInteger YTLiteSection = 789;
YTSettingsSectionItem *themeGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"THEME_OPTIONS")
accessibilityIdentifier:nil
detailTextBlock:^NSString *() {
switch (GetSelection(@"appTheme")) {
switch (GetInteger(@"appTheme")) {
case 1:
return LOC(@"OLD_DARK_THEME");
case 0:
@ -390,7 +580,7 @@ static const NSInteger YTLiteSection = 789;
BASIC_SWITCH(LOC(@"LOW_CONTRAST_MODE"), LOC(@"LOW_CONTRAST_MODE_DESC"), @"lowContrastMode_enabled"),
lowContrastModeSection
];
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"THEME_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:GetSelection(@"appTheme") parentResponder:[self parentResponder]];
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"THEME_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:GetInteger(@"appTheme") parentResponder:[self parentResponder]];
[settingsViewController pushViewController:picker];
return YES;
}];
@ -402,7 +592,8 @@ static const NSInteger YTLiteSection = 789;
YTSettingsSectionItem *playbackInFeedsGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"PLAYBACK_IN_FEEDS")
accessibilityIdentifier:nil
detailTextBlock:^NSString *() {
switch (GetSelection(@"inline_muted_playback_enabled")) {
// The specific values were gathered by checking the value for each setting
switch (GetInteger(@"inline_muted_playback_enabled")) {
case 3:
return LOC(@"PLAYBACK_IN_FEEDS_WIFI_ONLY");
case 1:
@ -431,9 +622,14 @@ static const NSInteger YTLiteSection = 789;
}],
];
// It seems values greater than 3 act the same as Always On (Index 1)
int (^getInlineSelection)() = ^int() {
int selection = GetSelection(@"inline_muted_playback_enabled") - 1;
return selection > 3 ? 1 : selection;
// Convert the stored value to an index for a picker (0 to 2)
NSInteger (^getInlineSelection)(void) = ^NSInteger(void) {
NSInteger selection = GetInteger(@"inline_muted_playback_enabled") - 1;
// Check if selection is within the valid bounds [0, 1, 2]
if (selection < 0 || selection > 2) {
return 1;
}
return selection;
};
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"PLAYBACK_IN_FEEDS") pickerSectionTitle:nil rows:rows selectedItemIndex:getInlineSelection() parentResponder:[self parentResponder]];
[settingsViewController pushViewController:picker];
@ -453,6 +649,7 @@ static const NSInteger YTLiteSection = 789;
BASIC_SWITCH(LOC(@"CAST_CONFIRM"), LOC(@"CAST_CONFIRM_DESC"), @"castConfirm_enabled"),
BASIC_SWITCH(LOC(@"NEW_MINIPLAYER_STYLE"), LOC(@"NEW_MINIPLAYER_STYLE_DESC"), @"bigYTMiniPlayer_enabled"),
BASIC_SWITCH(LOC(@"HIDE_CAST_BUTTON"), LOC(@"HIDE_CAST_BUTTON_DESC"), @"hideCastButton_enabled"),
BASIC_SWITCH(LOC(@"VIDEO_PLAYER_BUTTON"), LOC(@"VIDEO_PLAYER_BUTTON_DESC"), @"videoPlayerButton_enabled"),
BASIC_SWITCH(LOC(@"HIDE_SPONSORBLOCK_BUTTON"), LOC(@"HIDE_SPONSORBLOCK_BUTTON_DESC"), @"hideSponsorBlockButton_enabled"),
BASIC_SWITCH(LOC(@"HIDE_HOME_TAB"), LOC(@"HIDE_HOME_TAB_DESC"), @"hideHomeTab_enabled"),
BASIC_SWITCH(LOC(@"FIX_CASTING"), LOC(@"FIX_CASTING_DESC"), @"fixCasting_enabled"),
@ -479,4 +676,59 @@ static const NSInteger YTLiteSection = 789;
}
%orig;
}
// Implement the delegate method for document picker
%new
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
if (urls.count > 0) {
NSURL *pickedURL = [urls firstObject];
NSError *error;
// Check which mode the document picker is in
if (controller.documentPickerMode == UIDocumentPickerModeImport) {
// Import mode: Handle the import of settings from a text file
NSString *fileType = [pickedURL resourceValuesForKeys:@[NSURLTypeIdentifierKey] error:&error][NSURLTypeIdentifierKey];
if (UTTypeConformsTo((__bridge CFStringRef)fileType, kUTTypePlainText)) {
NSString *fileContents = [NSString stringWithContentsOfURL:pickedURL encoding:NSUTF8StringEncoding error:nil];
NSArray *lines = [fileContents componentsSeparatedByString:@"\n"];
for (NSString *line in lines) {
NSArray *components = [line componentsSeparatedByString:@": "];
if (components.count == 2) {
NSString *key = components[0];
NSString *value = components[1];
[[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
}
}
// Reload settings view after importing
YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"];
[settingsViewController reloadData];
// Show a confirmation message or perform some other action here
[[%c(GOOHUDManagerInternal) sharedInstance] showMessageMainThread:[%c(YTHUDMessage) messageWithText:@"Settings applied"]];
// Show a reminder to import YouTube Plus settings as well
UIAlertController *reminderAlert = [UIAlertController alertControllerWithTitle:@"Reminder"
message:@"Remember to import your YouTube Plus settings as well"
preferredStyle:UIAlertControllerStyleAlert];
[reminderAlert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]];
[settingsViewController presentViewController:reminderAlert animated:YES completion:nil];
}
} else if (controller.documentPickerMode == UIDocumentPickerModeExportToService || controller.documentPickerMode == UIDocumentPickerModeMoveToService) {
[[%c(GOOHUDManagerInternal) sharedInstance] showMessageMainThread:[%c(YTHUDMessage) messageWithText:@"Settings saved"]];
// Export mode: Display a reminder to save YouTube Plus settings
UIAlertController *exportAlert = [UIAlertController alertControllerWithTitle:@"Export Settings"
message:@"Note: This feature cannot save iSponsorBlock and most YouTube settings.\n\nWould you like to also export your YouTube Plus Settings?"
preferredStyle:UIAlertControllerStyleAlert];
[exportAlert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]];
[exportAlert addAction:[UIAlertAction actionWithTitle:@"Export" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
// Export YouTube Plus Settings functionality
[%c(YTLUserDefaults) exportYtlSettings];
}]];
YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"];
// Present the alert from the root view controller
[settingsViewController presentViewController:exportAlert animated:YES completion:nil];
}
}
}
%end

55
Source/SettingsKeys.h Normal file
View file

@ -0,0 +1,55 @@
#import "../YTLitePlus.h"
// Keys for "Copy Settings" button (for: YTLitePlus)
// In alphabetical order for tweaks after YTLitePlus
NSArray *NSUserDefaultsCopyKeys = @[
// YTLitePlus - gathered using get_keys.py
@"YTTapToSeek_enabled", @"alwaysShowRemainingTime_enabled", @"bigYTMiniPlayer_enabled", @"castConfirm_enabled",
@"disableAccountSection_enabled", @"disableAmbientModeFullscreen_enabled",
@"disableAmbientModePortrait_enabled", @"disableAutoplaySection_enabled", @"disableCollapseButton_enabled",
@"disableEngagementOverlay_enabled", @"disableLiveChatSection_enabled",
@"disableManageAllHistorySection_enabled", @"disableNotificationsSection_enabled",
@"disablePrivacySection_enabled", @"disablePullToFull_enabled", @"disableRemainingTime_enabled",
@"disableTryNewFeaturesSection_enabled", @"disableVideoQualityPreferencesSection_enabled",
@"disableYourDataInYouTubeSection_enabled", @"enableSaveToButton_enabled", @"enableShareButton_enabled",
@"enableVersionSpoofer_enabled", @"fixCasting_enabled", @"flex_enabled", @"fullscreenToTheRight_enabled",
@"hideAutoplayMiniPreview_enabled", @"hideCastButton_enabled", @"hideHUD_enabled", @"hideHeatwaves_enabled",
@"hideHomeTab_enabled", @"hidePreviewCommentSection_enabled", @"hideRightPanel_enabled",
@"hideSpeedToast_enabled", @"hideSponsorBlockButton_enabled", @"hideVideoPlayerShadowOverlayButtons_enabled",
@"iPadLayout_enabled", @"iPhoneLayout_enabled", @"inline_muted_playback_enabled", @"lowContrastMode_enabled",
@"newSettingsUI_enabled", @"oledKeyBoard_enabled", @"playerGesturesHapticFeedback_enabled",
@"playerGestures_enabled", @"seekAnywhere_enabled", @"switchCopyandPasteFunctionality_enabled",
@"videoPlayerButton_enabled", @"ytNoModernUI_enabled", @"ytStartupAnimation_enabled",
// DEMC - https://github.com/therealFoxster/DontEatMyContent/blob/master/Tweak.h
@"DEMC_enabled", @"DEMC_colorViewsEnabled", @"DEMC_safeAreaConstant", @"DEMC_disableAmbientMode",
@"DEMC_limitZoomToFill", @"DEMC_enableForAllVideos",
// iSponsorBlock cannot be exported using this method - it is also being removed in v5
// Return-YouTube-Dislike - https://github.com/PoomSmart/Return-YouTube-Dislikes/blob/main/TweakSettings.h
@"RYD-ENABLED", @"RYD-VOTE-SUBMISSION", @"RYD-EXACT-LIKE-NUMBER", @"RYD-EXACT-NUMBER",
// All YTVideoOverlay Tweaks - https://github.com/PoomSmart/YTVideoOverlay/blob/0fc6d29d1aa9e75f8c13d675daec9365f753d45e/Tweak.x#L28C1-L41C84
@"YTVideoOverlay-YouLoop-Enabled", @"YTVideoOverlay-YouTimeStamp-Enabled", @"YTVideoOverlay-YouMute-Enabled",
@"YTVideoOverlay-YouQuality-Enabled", @"YTVideoOverlay-YouLoop-Position", @"YTVideoOverlay-YouTimeStamp-Position",
@"YTVideoOverlay-YouMute-Position", @"YTVideoOverlay-YouQuality-Position",
// YouPiP - https://github.com/PoomSmart/YouPiP/blob/main/Header.h
@"YouPiPPosition", @"CompatibilityModeKey", @"PiPActivationMethodKey", @"PiPActivationMethod2Key",
@"NoMiniPlayerPiPKey", @"NonBackgroundableKey",
// YTABConfig cannot be reasonably exported using this method
// YTHoldForSpeed will be removed in v5
// YouTube Plus / YTLite cannot be exported using this method
// YTUHD - https://github.com/PoomSmart/YTUHD/blob/master/Header.h
@"EnableVP9", @"AllVP9",
// Useful YouTube Keys
@"inline_muted_playback_enabled",
];
// Some default values to ignore when exporting settings
NSDictionary *NSUserDefaultsCopyKeysDefaults = @{
@"fixCasting_enabled": @1,
@"inline_muted_playback_enabled": @5,
@"newSettingsUI_enabled": @1,
@"DEMC_safeAreaConstant": @21.5,
@"RYD-ENABLED": @1,
@"RYD-VOTE-SUBMISSION": @1,
// Duplicate keys are not allowed in NSDictionary. If present, only the last one will be kept.
};

View file

@ -1,8 +1,5 @@
#import "../YTLitePlus.h"
static BOOL IsEnabled(NSString *key) {
return [[NSUserDefaults standardUserDefaults] boolForKey:key];
}
static BOOL isDarkMode() {
return ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1);
}

View file

@ -1,9 +1,6 @@
#import "../YTLitePlus.h"
//
static BOOL IsEnabled(NSString *key) {
return [[NSUserDefaults standardUserDefaults] boolForKey:key];
}
static int appVersionSpoofer() {
return [[NSUserDefaults standardUserDefaults] integerForKey:@"versionSpoofer"];
}

100
Source/get_keys.py Normal file
View file

@ -0,0 +1,100 @@
import re
import os
def extract_values_from_file(file_path):
"""
Extracts keys that match the pattern @\"<some_text>_enabled\" from the given file.
Args:
file_path (str): The path to the file to be searched.
Returns:
list: A list of matching keys found in the file.
"""
# Define the regex pattern to match the strings that resemble the given examples
pattern = r'@\"[a-zA-Z0-9_]+_enabled\"'
matches = []
try:
# Read the content of the file
with open(file_path, 'r') as file:
file_content = file.read()
# Find all matches
matches = re.findall(pattern, file_content)
except Exception as e:
print(f"Error reading {file_path}: {e}")
return matches
def format_output(keys):
"""
Formats the keys with indentation and line breaks if the segment exceeds 120 characters (116 excluding indentation).
Args:
keys (list): The list of keys to be formatted.
Returns:
str: A formatted string with the keys.
"""
indent = " " * 4
line_length_limit = 116 # Limit excluding indentation
current_line = indent
formatted_output = ""
for key in keys:
# Check if adding the next key would exceed the line length limit
if len(current_line) + len(key) + 2 > line_length_limit: # +2 accounts for the comma and space
# Add the current line to the formatted output and start a new line
formatted_output += current_line.rstrip(", ") + ",\n"
current_line = indent # Start a new indented line
# Add the key to the current line
current_line += key + ", "
# Add the last line to the output
formatted_output += current_line.rstrip(", ") # Remove trailing comma and space from the final line
return formatted_output
def find_and_extract_keys():
"""
Recursively searches for .xm and .h files in the parent directory and extracts keys
that match the pattern @\"<some_text>_enabled\". The matching keys are then printed
with indentation and line breaks if the line exceeds 120 characters.
Ignores SettingsKeys.h
Usage:
1. Place this script in the desired directory.
2. Run the script with the command: python extract_keys.py
3. The script will search for all .xm and .h files in the parent directory and
print any matching keys it finds.
Note:
- The script searches the directory where it is located (the parent directory).
- It only looks for files with extensions .xm and .h.
"""
# Get the parent directory
parent_directory = os.path.dirname(os.path.abspath(__file__))
# Store the found keys
found_keys = set() # Use a set to automatically remove duplicates
# Walk through the parent directory and find all .xm and .h files
for root, dirs, files in os.walk(parent_directory):
for file in files:
if file.endswith(('.xm', '.h')):
# Skip SettingsKeys.h
if file == "SettingsKeys.h":
continue
file_path = os.path.join(root, file)
found_keys.update(extract_values_from_file(file_path))
# Print the found keys with formatting
if found_keys:
sorted_keys = sorted(found_keys)
print(format_output(sorted_keys))
else:
print("No keys found.")
if __name__ == "__main__":
find_and_extract_keys()

@ -1 +1 @@
Subproject commit 2aa3086244d296cfb3c8e782ef09c76316452a9d
Subproject commit 15b061bf414cf29fd0d4e0e124e9e2ccb99326b0

@ -1 +1 @@
Subproject commit 92365118eddecd4b4fecf26aca0c1faa5395d322
Subproject commit 6cae20899a26a0f007d19aadf386a8bae9861aeb

@ -1 +1 @@
Subproject commit 8c163a80a47aa265df3ee2cd55066979617c97e0
Subproject commit 95fdebbb772c8cbcab2093afe10136d9890524ae

@ -1 +1 @@
Subproject commit 0f4c6b7f5960308161c870d9aab30905fe8145cc
Subproject commit 8578263c9f7caf7a22bd9364648e218974ee543c

@ -1 +1 @@
Subproject commit 184f67837f48b3efd3c35ac88eb0d56f5e735d36
Subproject commit a22ef4deb929c6622069290bb340d21b280f300e

@ -1 +1 @@
Subproject commit a64276723da57312c6a8e24bf73060810f64604a
Subproject commit 436024cb4921775b32d514b8c58d8dbcec2bc066

@ -1 +1 @@
Subproject commit 17c2035ea9c8334f2d9154f114b6590928e93521
Subproject commit 02a5c915a7f4183307812a94759d73f25e7fdba6

1
Tweaks/YouLoop Submodule

@ -0,0 +1 @@
Subproject commit 58f76b1271c1ec05d6513e054f46e4080780a0d9

@ -1 +1 @@
Subproject commit 4cd5d01d3c6a1c7c1725c89208a5cc8cedad962f
Subproject commit e89ffe8be85564fe2bfc04345a186c4a02ef456a

@ -1 +1 @@
Subproject commit 171f681e235a1f7176cde31a95e6454fc00418c3
Subproject commit 794171d7785bc7f974e278b39ce6e82eb5693273

@ -1 +1 @@
Subproject commit e3b2c4429099699b5a508bd2aa1c074efb34d866
Subproject commit b4e1bc798149d68029c89510948600be2986968b

@ -1 +1 @@
Subproject commit b9f46b822ec0d29bf22f80abde5c1e0036ec59fc
Subproject commit 6690ab42d855ea19d9a24cd99b0375910ea772ca

View file

@ -6,6 +6,10 @@
#import <sys/utsname.h>
#import <substrate.h>
#import <rootless.h>
#import <MediaPlayer/MediaPlayer.h>
#import <AVFoundation/AVFoundation.h>
#import <AVKit/AVKit.h> // For AVPlayer and AVPlayerViewController
#import <MobileCoreServices/MobileCoreServices.h> // For kUTTypeMovie and kUTTypeVideo
#import "Tweaks/FLEX/FLEX.h"
#import "Tweaks/YouTubeHeader/YTAppDelegate.h"
@ -40,6 +44,11 @@
#import "Tweaks/YouTubeHeader/YTPlayerBarController.h"
#import "Tweaks/YouTubeHeader/YTResponder.h"
#import "Tweaks/YouTubeHeader/YTMainAppControlsOverlayView.h"
#import "Tweaks/YouTubeHeader/YTMultiSizeViewController.h"
#import "Tweaks/YouTubeHeader/YTWatchLayerViewController.h"
#import "Tweaks/YouTubeHeader/YTPageStyleController.h"
#import "Tweaks/YouTubeHeader/YTRightNavigationButtons.h"
#import "Tweaks/YouTubeHeader/YTInlinePlayerBarView.h"
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
#define YT_BUNDLE_ID @"com.google.ios.youtube"
@ -48,6 +57,30 @@
#define IS_ENABLED(k) [[NSUserDefaults standardUserDefaults] boolForKey:k]
#define APP_THEME_IDX [[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"]
// Avoid issues with multiple includes of this file
#pragma once
// Helper methods for key retrieval
#define IsEnabled(key) [[NSUserDefaults standardUserDefaults] boolForKey:key]
#define GetInteger(key) [[NSUserDefaults standardUserDefaults] integerForKey:key] // NSInteger type
#define GetFloat(key) [[NSUserDefaults standardUserDefaults] floatForKey:key] // float type
// Player Gesture selected mode enum
typedef NS_ENUM(NSUInteger, GestureMode) {
GestureModeVolume,
GestureModeBrightness,
GestureModeSeek,
GestureModeDisabled
};
// Gesture Section Enum
typedef NS_ENUM(NSUInteger, GestureSection) {
GestureSectionTop,
GestureSectionMiddle,
GestureSectionBottom,
GestureSectionInvalid
};
// YTSpeed
@interface YTVarispeedSwitchControllerOption : NSObject
- (id)initWithTitle:(id)title rate:(float)rate;
@ -97,12 +130,17 @@
@property (nonatomic, assign, readwrite) BOOL enableSnapToChapter;
@end
// Hide YouTube Plus incompatibility warning popup - @bhackel
@interface HelperVC : UIViewController
@end
// Hide Autoplay Mini Preview - @bhackel
@interface YTAutonavPreviewView : UIView
@end
// OLED Live Chat - @bhackel
@interface YTLUserDefaults : NSUserDefaults
+ (void)exportYtlSettings;
@end
// Hide Home Tab - @bhackel
@ -122,6 +160,35 @@
@property id <YTResponder> parentResponder;
@end
// Player Gestures - @bhackel
@interface YTFineScrubberFilmstripView : UIView
@end
@interface YTFineScrubberFilmstripCollectionView : UICollectionView
@end
@interface YTPlayerViewController (YTLitePlus) <UIGestureRecognizerDelegate>
@property (nonatomic, retain) UIPanGestureRecognizer *YTLitePlusPanGesture;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
@end
@interface YTWatchFullscreenViewController : YTMultiSizeViewController
@end
@interface MPVolumeController : NSObject
@property (nonatomic, assign, readwrite) float volumeValue;
@end
@interface YTPlayerBarController (YTLitePlus)
- (void)didScrub:(UIPanGestureRecognizer *)gestureRecognizer;
- (void)startScrubbing;
- (void)didScrubToPoint:(CGPoint)point;
- (void)endScrubbingForSeekSource:(int)seekSource;
@end
@interface YTMainAppVideoPlayerOverlayViewController (YTLitePlus)
@property (nonatomic, strong, readwrite) YTPlayerBarController *playerBarController;
@end
@interface YTInlinePlayerBarContainerView (YTLitePlus)
@property UIPanGestureRecognizer *scrubGestureRecognizer;
@property (nonatomic, strong, readwrite) YTFineScrubberFilmstripView *fineScrubberFilmstrip;
- (CGFloat)scrubXForScrubRange:(CGFloat)scrubRange;
@end
// Hide Collapse Button - @arichornlover
@interface YTMainAppControlsOverlayView (YTLitePlus)
@property (nonatomic, assign, readwrite) YTQTMButton *watchCollapseButton;
@ -131,9 +198,10 @@
@interface MDCButton : UIButton
@end
@interface YTRightNavigationButtons : UIView
@interface YTRightNavigationButtons (YTLitePlus)
@property YTQTMButton *notificationButton;
@property YTQTMButton *sponsorBlockButton;
@property YTQTMButton *videoPlayerButton;
@end
// BigYTMiniPlayer

View file

@ -33,11 +33,6 @@ static NSString *accessGroupID() {
return accessGroup;
}
//
static BOOL IsEnabled(NSString *key) {
return [[NSUserDefaults standardUserDefaults] boolForKey:key];
}
# pragma mark - Tweaks
// Activate FLEX
@ -115,12 +110,8 @@ BOOL isSelf() {
}
%end
# pragma mark - Hide SponsorBlock Button
// Hide SponsorBlock Button in navigation bar
%hook YTRightNavigationButtons
- (void)didMoveToWindow {
%orig;
}
- (void)layoutSubviews {
%orig;
if (IsEnabled(@"hideSponsorBlockButton_enabled")) {
@ -179,7 +170,6 @@ BOOL isSelf() {
%end
%end
// A/B flags
%hook YTColdConfig
- (BOOL)respectDeviceCaptionSetting { return NO; } // YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html
@ -583,16 +573,6 @@ BOOL isTabSelected = NO;
[self setNeedsLayout];
[self removeFromSuperview];
}
// Live chat OLED dark mode - @bhackel
CGFloat alpha;
if ([[%c(YTLUserDefaults) standardUserDefaults] boolForKey:@"oledTheme"] // YTLite OLED Theme
&& [self.accessibilityIdentifier isEqualToString:@"eml.live_chat_text_message"] // Live chat text message
&& [self.backgroundColor getWhite:nil alpha:&alpha] // Check if color is grayscale and get alpha
&& alpha != 0.0) // Ignore shorts live chat
{
self.backgroundColor = [UIColor blackColor];
}
}
%end
@ -645,7 +625,366 @@ BOOL isTabSelected = NO;
}
%end
/*
// Gestures - @bhackel
%group gPlayerGestures
%hook YTWatchLayerViewController
// invoked when the player view controller is either created or destroyed
- (void)watchController:(YTWatchController *)watchController didSetPlayerViewController:(YTPlayerViewController *)playerViewController {
if (playerViewController) {
// check to see if the pan gesture is already created
if (!playerViewController.YTLitePlusPanGesture) {
playerViewController.YTLitePlusPanGesture = [[UIPanGestureRecognizer alloc] initWithTarget:playerViewController
action:@selector(YTLitePlusHandlePanGesture:)];
playerViewController.YTLitePlusPanGesture.delegate = playerViewController;
[playerViewController.playerView addGestureRecognizer:playerViewController.YTLitePlusPanGesture];
}
}
%orig;
}
%end
%hook YTPlayerViewController
// the pan gesture that will be created and added to the player view
%property (nonatomic, retain) UIPanGestureRecognizer *YTLitePlusPanGesture;
/**
* This method is called when the pan gesture is started, changed, or ended. It handles
* 12 different possible cases depending on the configuration: 3 zones with 4 choices
* for each zone. The zones are horizontal sections that divide the player into
* 3 equal parts. The choices are volume, brightness, seek, and disabled.
* There is also a deadzone that can be configured in the settings.
* There are 4 logical states: initial, changed in deadzone, changed, end.
*/
%new
- (void)YTLitePlusHandlePanGesture:(UIPanGestureRecognizer *)panGestureRecognizer {
// Haptic feedback generator
static UIImpactFeedbackGenerator *feedbackGenerator;
// Variables for storing initial values to be adjusted
static float initialVolume;
static float initialBrightness;
static CGFloat initialTime;
// Flag to determine if the pan gesture is valid
static BOOL isValidHorizontalPan = NO;
// Variable to store the section of the screen the gesture is in
static GestureSection gestureSection = GestureSectionInvalid;
// Variable to track the start location of the whole pan gesture
static CGPoint startLocation;
// Variable to track the X translation when exiting the deadzone
static CGFloat deadzoneStartingXTranslation;
// Variable to track the X translation of the pan gesture after exiting the deadzone
static CGFloat adjustedTranslationX;
// Variable used to smooth out the X translation
static CGFloat smoothedTranslationX = 0;
// Constant for the filter constant to change responsiveness
// static const CGFloat filterConstant = 0.1;
// Constant for the deadzone radius that can be changed in the settings
static CGFloat deadzoneRadius = (CGFloat)GetFloat(@"playerGesturesDeadzone");
// Constant for the sensitivity factor that can be changed in the settings
static CGFloat sensitivityFactor = (CGFloat)GetFloat(@"playerGesturesSensitivity");
// Objects for modifying the system volume
static MPVolumeView *volumeView;
static UISlider *volumeViewSlider;
// Get objects that should only be initialized once
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
volumeView = [[MPVolumeView alloc] init];
for (UIView *view in volumeView.subviews) {
if ([view isKindOfClass:[UISlider class]]) {
volumeViewSlider = (UISlider *)view;
break;
}
}
feedbackGenerator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium];
});
// Get objects used to seek nicely in the video player
static YTMainAppVideoPlayerOverlayViewController *mainVideoPlayerController = (YTMainAppVideoPlayerOverlayViewController *)self.childViewControllers.firstObject;
static YTPlayerBarController *playerBarController = mainVideoPlayerController.playerBarController;
static YTInlinePlayerBarContainerView *playerBar = playerBarController.playerBar;
/***** Helper functions for adjusting player state *****/
// Helper function to adjust brightness
void (^adjustBrightness)(CGFloat, CGFloat) = ^(CGFloat translationX, CGFloat initialBrightness) {
float brightnessSensitivityFactor = 3;
float newBrightness = initialBrightness + ((translationX / 1000.0) * sensitivityFactor * brightnessSensitivityFactor);
newBrightness = fmaxf(fminf(newBrightness, 1.0), 0.0);
[[UIScreen mainScreen] setBrightness:newBrightness];
};
// Helper function to adjust volume
void (^adjustVolume)(CGFloat, CGFloat) = ^(CGFloat translationX, CGFloat initialVolume) {
float volumeSensitivityFactor = 3.0;
float newVolume = initialVolume + ((translationX / 1000.0) * sensitivityFactor * volumeSensitivityFactor);
newVolume = fmaxf(fminf(newVolume, 1.0), 0.0);
// Improve smoothness - ignore if the volume is within 0.01 of the current volume
CGFloat currentVolume = [[AVAudioSession sharedInstance] outputVolume];
if (fabs(newVolume - currentVolume) < 0.01 && currentVolume > 0.01 && currentVolume < 0.99) {
return;
}
// https://stackoverflow.com/questions/50737943/how-to-change-volume-programmatically-on-ios-11-4
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
volumeViewSlider.value = newVolume;
});
};
// Helper function to adjust seek time
void (^adjustSeek)(CGFloat, CGFloat) = ^(CGFloat translationX, CGFloat initialTime) {
// Get the location in view for the current video time
CGFloat totalTime = self.currentVideoTotalMediaTime;
CGFloat videoFraction = initialTime / totalTime;
CGFloat initialTimeXPosition = [playerBar scrubXForScrubRange:videoFraction];
// Calculate the new seek X position
CGFloat sensitivityFactor = 1; // Adjust this value to make seeking more/less sensitive
CGFloat newSeekXPosition = initialTimeXPosition + translationX * sensitivityFactor;
// Create a CGPoint using this new X position
CGPoint newSeekPoint = CGPointMake(newSeekXPosition, 0);
// Send this to a seek method in the player bar controller
[playerBarController didScrubToPoint:newSeekPoint];
};
// Helper function to smooth out the X translation
// CGFloat (^applyLowPassFilter)(CGFloat) = ^(CGFloat newTranslation) {
// smoothedTranslationX = filterConstant * newTranslation + (1 - filterConstant) * smoothedTranslationX;
// return smoothedTranslationX;
// };
/***** Helper functions for running the selected gesture *****/
// Helper function to run any setup for the selected gesture mode
void (^runSelectedGestureSetup)(NSString*) = ^(NSString *sectionKey) {
// Determine the selected gesture mode using the section key
GestureMode selectedGestureMode = (GestureMode)GetInteger(sectionKey);
// Handle the setup based on the selected mode
switch (selectedGestureMode) {
case GestureModeVolume:
initialVolume = [[AVAudioSession sharedInstance] outputVolume];
break;
case GestureModeBrightness:
initialBrightness = [UIScreen mainScreen].brightness;
break;
case GestureModeSeek:
initialTime = self.currentVideoMediaTime;
// Start a seek action
[playerBarController startScrubbing];
break;
case GestureModeDisabled:
// Do nothing if the gesture is disabled
break;
default:
// Show an alert if the gesture mode is invalid
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Invalid Gesture Mode" message:@"Please report this bug." preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
break;
}
};
// Helper function to run the selected gesture action when the gesture changes
void (^runSelectedGestureChanged)(NSString*) = ^(NSString *sectionKey) {
// Determine the selected gesture mode using the section key
GestureMode selectedGestureMode = (GestureMode)GetInteger(sectionKey);
// Handle the gesture action based on the selected mode
switch (selectedGestureMode) {
case GestureModeVolume:
adjustVolume(adjustedTranslationX, initialVolume);
break;
case GestureModeBrightness:
adjustBrightness(adjustedTranslationX, initialBrightness);
break;
case GestureModeSeek:
adjustSeek(adjustedTranslationX, initialTime);
break;
case GestureModeDisabled:
// Do nothing if the gesture is disabled
break;
default:
// Show an alert if the gesture mode is invalid
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Invalid Gesture Mode" message:@"Please report this bug." preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
break;
}
};
// Helper function to run the selected gesture action when the gesture ends
void (^runSelectedGestureEnded)(NSString*) = ^(NSString *sectionKey) {
// Determine the selected gesture mode using the section key
GestureMode selectedGestureMode = (GestureMode)GetInteger(sectionKey);
// Handle the gesture action based on the selected mode
switch (selectedGestureMode) {
case GestureModeVolume:
break;
case GestureModeBrightness:
break;
case GestureModeSeek:
[playerBarController endScrubbingForSeekSource:0];
break;
case GestureModeDisabled:
break;
default:
// Show an alert if the gesture mode is invalid
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Invalid Gesture Mode" message:@"Please report this bug." preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
break;
}
};
/***** End of Helper functions *****/
// Handle gesture based on current gesture state
if (panGestureRecognizer.state == UIGestureRecognizerStateBegan) {
// Get the gesture's start position
startLocation = [panGestureRecognizer locationInView:self.view];
CGFloat viewHeight = self.view.bounds.size.height;
// Determine the section based on the start position by dividing the view into thirds
if (startLocation.y <= viewHeight / 3.0) {
gestureSection = GestureSectionTop;
} else if (startLocation.y <= 2 * viewHeight / 3.0) {
gestureSection = GestureSectionMiddle;
} else if (startLocation.y <= viewHeight) {
gestureSection = GestureSectionBottom;
} else {
gestureSection = GestureSectionInvalid;
}
// Cancel the gesture if the chosen mode for this section is disabled
if ( ((gestureSection == GestureSectionTop) && (GetInteger(@"playerGestureTopSelection") == GestureModeDisabled))
|| ((gestureSection == GestureSectionMiddle) && (GetInteger(@"playerGestureMiddleSelection") == GestureModeDisabled))
|| ((gestureSection == GestureSectionBottom) && (GetInteger(@"playerGestureBottomSelection") == GestureModeDisabled))) {
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
return;
}
// Deactive the activity flag
isValidHorizontalPan = NO;
// Cancel this gesture if it has not activated after 1 second
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (!isValidHorizontalPan && panGestureRecognizer.state != UIGestureRecognizerStateEnded) {
// Cancel the gesture by setting its state to UIGestureRecognizerStateCancelled
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
}
});
}
// Handle changed gesture state by activating the gesture once it has exited the deadzone,
// and then adjusting the player based on the selected gesture mode
if (panGestureRecognizer.state == UIGestureRecognizerStateChanged) {
// Determine if the gesture is predominantly horizontal
CGPoint translation = [panGestureRecognizer translationInView:self.view];
if (!isValidHorizontalPan) {
if (fabs(translation.x) > fabs(translation.y)) {
// Check if the touch has moved outside the deadzone
CGFloat distanceFromStart = hypot(translation.x, translation.y);
if (distanceFromStart < deadzoneRadius) {
// If within the deadzone, don't activate the pan gesture
return;
}
// If outside the deadzone, activate the pan gesture and store the initial values
isValidHorizontalPan = YES;
deadzoneStartingXTranslation = translation.x;
adjustedTranslationX = 0;
smoothedTranslationX = 0;
// Run the setup for the selected gesture mode
switch (gestureSection) {
case GestureSectionTop:
runSelectedGestureSetup(@"playerGestureTopSelection");
break;
case GestureSectionMiddle:
runSelectedGestureSetup(@"playerGestureMiddleSelection");
break;
case GestureSectionBottom:
runSelectedGestureSetup(@"playerGestureBottomSelection");
break;
default:
// If the section is invalid, cancel the gesture
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
break;
}
// Provide haptic feedback to indicate a gesture start
if (IS_ENABLED(@"playerGesturesHapticFeedback_enabled")) {
[feedbackGenerator prepare];
[feedbackGenerator impactOccurred];
}
} else {
// Cancel the gesture if the translation is not horizontal
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
return;
}
}
// Handle the gesture based on the identified section
if (isValidHorizontalPan) {
// Adjust the X translation based on the value hit after exiting the deadzone
adjustedTranslationX = translation.x - deadzoneStartingXTranslation;
// Smooth the translation value
// adjustedTranslationX = applyLowPassFilter(adjustedTranslationX);
// Pass the adjusted translation to the selected gesture
switch (gestureSection) {
case GestureSectionTop:
runSelectedGestureChanged(@"playerGestureTopSelection");
break;
case GestureSectionMiddle:
runSelectedGestureChanged(@"playerGestureMiddleSelection");
break;
case GestureSectionBottom:
runSelectedGestureChanged(@"playerGestureBottomSelection");
break;
default:
// If the section is invalid, cancel the gesture
panGestureRecognizer.state = UIGestureRecognizerStateCancelled;
break;
}
}
}
// Handle the gesture end state by running the selected gesture mode's end action
if (panGestureRecognizer.state == UIGestureRecognizerStateEnded && isValidHorizontalPan) {
switch (gestureSection) {
case GestureSectionTop:
runSelectedGestureEnded(@"playerGestureTopSelection");
break;
case GestureSectionMiddle:
runSelectedGestureEnded(@"playerGestureMiddleSelection");
break;
case GestureSectionBottom:
runSelectedGestureEnded(@"playerGestureBottomSelection");
break;
default:
break;
}
// Provide haptic feedback upon successful gesture recognition
// [feedbackGenerator prepare];
// [feedbackGenerator impactOccurred];
}
}
// allow the pan gesture to be recognized simultaneously with other gestures
%new
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
// Do not allow this gesture to activate with the normal seek bar gesture
YTMainAppVideoPlayerOverlayViewController *mainVideoPlayerController = (YTMainAppVideoPlayerOverlayViewController *)self.childViewControllers.firstObject;
YTPlayerBarController *playerBarController = mainVideoPlayerController.playerBarController;
YTInlinePlayerBarContainerView *playerBar = playerBarController.playerBar;
if (otherGestureRecognizer == playerBar.scrubGestureRecognizer) {
return NO;
}
// Do not allow this gesture to activate with the fine scrubber gesture
YTFineScrubberFilmstripView *fineScrubberFilmstrip = playerBar.fineScrubberFilmstrip;
if (!fineScrubberFilmstrip) {
return YES;
}
YTFineScrubberFilmstripCollectionView *filmstripCollectionView = [fineScrubberFilmstrip valueForKey:@"_filmstripCollectionView"];
if (filmstripCollectionView && otherGestureRecognizer == filmstripCollectionView.panGestureRecognizer) {
return NO;
}
}
return YES;
}
%end
%end
// BigYTMiniPlayer: https://github.com/Galactic-Dev/BigYTMiniPlayer
%group Main
%hook YTWatchMiniBarView
@ -670,19 +1009,100 @@ BOOL isTabSelected = NO;
}
%end
%end
*/
// New Big YT Mini Player - @bhackel
%hook YTColdConfig
- (BOOL)enableIosFloatingMiniplayer {
// Modify if not on iPad
return (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad) ? IsEnabled(@"bigYTMiniPlayer_enabled") : %orig;
// Video player button in the navigation bar - @bhackel
// This code is based on the iSponsorBlock button code
%group gVideoPlayerButton
NSInteger pageStyle = 0;
%hook YTRightNavigationButtons
%property (retain, nonatomic) YTQTMButton *videoPlayerButton;
- (NSMutableArray *)buttons {
NSMutableArray *retVal = %orig.mutableCopy;
[self.videoPlayerButton removeFromSuperview];
[self addSubview:self.videoPlayerButton];
if (!self.videoPlayerButton || pageStyle != [%c(YTPageStyleController) pageStyle]) {
self.videoPlayerButton = [%c(YTQTMButton) iconButton];
[self.videoPlayerButton enableNewTouchFeedback];
self.videoPlayerButton.frame = CGRectMake(0, 0, 40, 40);
if ([%c(YTPageStyleController) pageStyle]) { //dark mode
[self.videoPlayerButton setImage:[UIImage imageWithContentsOfFile:[tweakBundle pathForResource:@"YTLitePlusColored-128" ofType:@"png"]] forState:UIControlStateNormal];
}
else { // light mode
[self.videoPlayerButton setImage:[UIImage imageWithContentsOfFile:[tweakBundle pathForResource:@"YTLitePlusColored-128" ofType:@"png"]] forState:UIControlStateNormal];
// UIImage *image = [UIImage imageWithContentsOfFile:[tweakBundle pathForResource:@"YTLitePlusColored-128" ofType:@"png"]];
// image = [image imageWithTintColor:UIColor.blackColor renderingMode:UIImageRenderingModeAlwaysTemplate];
// [self.videoPlayerButton setImage:image forState:UIControlStateNormal];
// [self.videoPlayerButton setTintColor:UIColor.blackColor];
}
pageStyle = [%c(YTPageStyleController) pageStyle];
[self.videoPlayerButton addTarget:self action:@selector(videoPlayerButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
[retVal insertObject:self.videoPlayerButton atIndex:0];
}
return retVal;
}
- (BOOL)enableIosFloatingMiniplayerRepositioning {
return (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad) ? IsEnabled(@"bigYTMiniPlayer_enabled") : %orig;
- (NSMutableArray *)visibleButtons {
NSMutableArray *retVal = %orig.mutableCopy;
// fixes button overlapping yt logo on smaller devices
[self setLeadingPadding:-10];
if (self.videoPlayerButton) {
[self.videoPlayerButton removeFromSuperview];
[self addSubview:self.videoPlayerButton];
[retVal insertObject:self.videoPlayerButton atIndex:0];
}
return retVal;
}
- (BOOL)enableIosFloatingMiniplayerResizing {
return (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad) ? IsEnabled(@"bigYTMiniPlayer_enabled") : %orig;
// Method to handle the video player button press by showing a document picker
%new
- (void)videoPlayerButtonPressed:(UIButton *)sender {
// Traversing the responder chain to find the nearest UIViewController
UIResponder *responder = sender;
UIViewController *settingsViewController = nil;
while (responder) {
if ([responder isKindOfClass:[UIViewController class]]) {
settingsViewController = (UIViewController *)responder;
break;
}
responder = responder.nextResponder;
}
if (settingsViewController) {
// Present the video picker
UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[(NSString *)kUTTypeMovie, (NSString *)kUTTypeVideo] inMode:UIDocumentPickerModeImport];
documentPicker.delegate = (id<UIDocumentPickerDelegate>)self;
documentPicker.allowsMultipleSelection = NO;
[settingsViewController presentViewController:documentPicker animated:YES completion:nil];
} else {
NSLog(@"No view controller found for the sender button.");
}
}
// Delegate method to handle the picked video by showing the apple player
%new
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
NSURL *pickedURL = [urls firstObject];
if (pickedURL) {
// Use AVPlayerViewController to play the video
AVPlayer *player = [AVPlayer playerWithURL:pickedURL];
AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init];
playerViewController.player = player;
// Get the root view controller
UIViewController *presentingViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
// Present the Video Player
if (presentingViewController) {
[presentingViewController presentViewController:playerViewController animated:YES completion:^{
[player play];
}];
} else {
// Handle case where no view controller was found
NSLog(@"Error: No view controller found to present AVPlayerViewController.");
}
}
}
%end
%end
// App Settings Overlay Options
@ -807,6 +1227,8 @@ BOOL isTabSelected = NO;
%init;
// Access YouGroupSettings methods
dlopen([[NSString stringWithFormat:@"%@/Frameworks/YouGroupSettings.dylib", [[NSBundle mainBundle] bundlePath]] UTF8String], RTLD_LAZY);
// Access YouTube Plus methods
dlopen([[NSString stringWithFormat:@"%@/Frameworks/YTLite.dylib", [[NSBundle mainBundle] bundlePath]] UTF8String], RTLD_LAZY);
if (IsEnabled(@"hideCastButton_enabled")) {
%init(gHideCastButton);
@ -817,9 +1239,9 @@ BOOL isTabSelected = NO;
if (IsEnabled(@"iPhoneLayout_enabled")) {
%init(giPhoneLayout);
}
// if (IsEnabled(@"bigYTMiniPlayer_enabled") && (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad)) {
// %init(Main);
// }
if (IsEnabled(@"bigYTMiniPlayer_enabled") && (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad)) {
%init(Main);
}
if (IsEnabled(@"hideVideoPlayerShadowOverlayButtons_enabled")) {
%init(gHideVideoPlayerShadowOverlayButtons);
}
@ -874,19 +1296,35 @@ BOOL isTabSelected = NO;
if (IsEnabled(@"disableEngagementOverlay_enabled")) {
%init(gDisableEngagementOverlay);
}
if (IsEnabled(@"playerGestures_enabled")) {
%init(gPlayerGestures);
}
if (IsEnabled(@"videoPlayerButton_enabled")) {
%init(gVideoPlayerButton);
}
// Change the default value of some options
NSArray *allKeys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys];
if (![allKeys containsObject:@"RYD-ENABLED"]) {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"RYD-ENABLED"];
}
if (![allKeys containsObject:@"YouPiPEnabled"]) {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"YouPiPEnabled"];
}
if (![allKeys containsObject:@"newSettingsUI_enabled"]) {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"newSettingsUI_enabled"];
}
if (![allKeys containsObject:@"fixCasting_enabled"]) {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"fixCasting_enabled"];
if (![allKeys containsObject:@"YTLPDidPerformFirstRunSetup"]) {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"YTLPDidPerformFirstRunSetup"];
// Set iSponsorBlock to default disabled
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *settingsPath = [documentsDirectory stringByAppendingPathComponent:@"iSponsorBlock.plist"];
NSMutableDictionary *settings = [NSMutableDictionary dictionary];
[settings setObject:@(NO) forKey:@"enabled"];
[settings writeToFile:settingsPath atomically:YES];
// Set miscellaneous YTLitePlus features to enabled
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"RYD-ENABLED"];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"YouPiPEnabled"];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"newSettingsUI_enabled"];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"fixCasting_enabled"];
// Default gestures as volume, brightness, seek
[[NSUserDefaults standardUserDefaults] setInteger:GestureModeVolume forKey:@"playerGestureTopSelection"];
[[NSUserDefaults standardUserDefaults] setInteger:GestureModeBrightness forKey:@"playerGestureMiddleSelection"];
[[NSUserDefaults standardUserDefaults] setInteger:GestureModeSeek forKey:@"playerGestureBottomSelection"];
// Default gestures options
[[NSUserDefaults standardUserDefaults] setFloat:20.0 forKey:@"playerGesturesDeadzone"];
[[NSUserDefaults standardUserDefaults] setFloat:1.0 forKey:@"playerGesturesSensitivity"];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"playerGesturesHapticFeedback_enabled"];
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -6,6 +6,7 @@
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
"PASTE_SETTINGS" = "Paste Settings";
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
"EXPORT_SETTINGS" = "Export Settings";
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
"IMPORT_SETTINGS" = "Import Settings";
@ -13,6 +14,26 @@
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
"VIDEO_PLAYER" = "Video Player (Beta)";
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
"VOLUME" = "Volume";
"BRIGHTNESS" = "Brightness";
"SEEK" = "Seek";
"DISABLED" = "Disabled";
"DEADZONE" = "Deadzone";
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
"SENSITIVITY" = "Sensitivity";
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
"PLAYER_GESTURES_TITLE" = "Player Gestures";
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
"TOP_SECTION" = "Top Section";
"MIDDLE_SECTION" = "Middle Section";
"BOTTOM_SECTION" = "Bottom Section";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "خيارات تراكب ضوابط الفيديو";
@ -144,6 +165,9 @@
"HIDE_CAST_BUTTON" = "زر "إخفاء الإرسال" ;
"HIDE_CAST_BUTTON_DESC" = "مطلوب إعادة تشغيل التطبيق";
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
"HIDE_SPONSORBLOCK_BUTTON" = "Hide iSponsorBlock button in the Navigation bar";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";

View file

@ -6,6 +6,7 @@
"COPY_SETTINGS_DESC" = "Копиране на всички текущи настройки в клипборда";
"PASTE_SETTINGS" = "Поставяне на настройки";
"PASTE_SETTINGS_DESC" = "Поставяне на настройки от клипборда и прилагане";
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
"EXPORT_SETTINGS" = "Експортиране на настройки";
"EXPORT_SETTINGS_DESC" = "Експортиране на всички текущи настройки в .txt файл";
"IMPORT_SETTINGS" = "Импортиране на настройки";
@ -13,6 +14,26 @@
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Заменете бутоните 'Копиране на настройки' и 'Поставяне на настройки'";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Заменете бутоните с 'Експортиране на настройки' и 'Импортиране на настройки'";
"VIDEO_PLAYER" = "Video Player (Beta)";
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
"VOLUME" = "Volume";
"BRIGHTNESS" = "Brightness";
"SEEK" = "Seek";
"DISABLED" = "Disabled";
"DEADZONE" = "Deadzone";
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
"SENSITIVITY" = "Sensitivity";
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
"PLAYER_GESTURES_TITLE" = "Player Gestures";
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
"TOP_SECTION" = "Top Section";
"MIDDLE_SECTION" = "Middle Section";
"BOTTOM_SECTION" = "Bottom Section";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Опции за контрол на видеото";
@ -144,6 +165,9 @@
"HIDE_CAST_BUTTON" = "Скрийте бутона за стрийминг";
"HIDE_CAST_BUTTON_DESC" = "Необходим е рестарт на приложението.";
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
"HIDE_SPONSORBLOCK_BUTTON" = "Скрийте бутона за iSponsorBlock в навигационната лента";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";

View file

@ -6,6 +6,7 @@
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
"PASTE_SETTINGS" = "Paste Settings";
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
"EXPORT_SETTINGS" = "Export Settings";
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
"IMPORT_SETTINGS" = "Import Settings";
@ -13,6 +14,26 @@
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
"VIDEO_PLAYER" = "Video Player (Beta)";
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
"VOLUME" = "Volume";
"BRIGHTNESS" = "Brightness";
"SEEK" = "Seek";
"DISABLED" = "Disabled";
"DEADZONE" = "Deadzone";
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
"SENSITIVITY" = "Sensitivity";
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
"PLAYER_GESTURES_TITLE" = "Player Gestures";
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
"TOP_SECTION" = "Top Section";
"MIDDLE_SECTION" = "Middle Section";
"BOTTOM_SECTION" = "Bottom Section";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Overlay-Optionen für Videosteuerungen";
@ -144,6 +165,9 @@
"HIDE_CAST_BUTTON" = "Cast button verstecken";
"HIDE_CAST_BUTTON_DESC" = "Google-Cast Button verstecken. Ein Neustart der App ist erforderlich.";
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
"HIDE_SPONSORBLOCK_BUTTON" = "iSponsorBlock ausblenden";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "Blende die iSponsorBlock-Schaltfläche in der Navigationsleiste aus";

View file

@ -2,16 +2,37 @@
"VERSION" = "YTLitePlus's version: %@";
"VERSION_CHECK" = "Tap to check for update!";
"COPY_SETTINGS" = "Copy Settings";
"COPY_SETTINGS" = "Copy settings";
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
"PASTE_SETTINGS" = "Paste Settings";
"PASTE_SETTINGS" = "Paste settings";
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
"EXPORT_SETTINGS" = "Export Settings";
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
"EXPORT_SETTINGS" = "Export settings";
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
"IMPORT_SETTINGS" = "Import Settings";
"IMPORT_SETTINGS" = "Import settings";
"IMPORT_SETTINGS_DESC" = "Press to import settings (.txt)";
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy settings' & 'Paste settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export settings' and 'Import settings'";
"VIDEO_PLAYER" = "Video Player (Beta)";
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
"VOLUME" = "Volume";
"BRIGHTNESS" = "Brightness";
"SEEK" = "Seek";
"DISABLED" = "Disabled";
"DEADZONE" = "Deadzone";
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
"SENSITIVITY" = "Sensitivity";
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
"PLAYER_GESTURES_TITLE" = "Player Gestures";
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
"TOP_SECTION" = "Top Section";
"MIDDLE_SECTION" = "Middle Section";
"BOTTOM_SECTION" = "Bottom Section";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options";
@ -122,8 +143,8 @@
"ENABLE_YT_STARTUP_ANIMATION" = "Enable YouTube startup animation";
"ENABLE_YT_STARTUP_ANIMATION_DESC" = "";
"HIDE_MODERN_INTERFACE" = "Hide Modern Interface (YTNoModernUI)";
"HIDE_MODERN_INTERFACE_DESC" = "Toggle this on to hide any Modern Element added by YouTube. Removes Ambient Mode, Rounded Design & More. App restart is required.";
"HIDE_MODERN_INTERFACE" = "Disable Modern YouTube Interface (YTNoModernUI)";
"HIDE_MODERN_INTERFACE_DESC" = "This reverts the YouTube app to go back to a more traditional design from v17.38.10. This also removes some rounded elements, ambient mode, and other modern features. App restart is required.";
"IPAD_LAYOUT" = "iPad Layout";
"IPAD_LAYOUT_DESC" = "only use this if you want to have the iPad Layout on your current iPhone/iPod. App restart is required.";
@ -144,6 +165,9 @@
"HIDE_CAST_BUTTON" = "Hide Cast button";
"HIDE_CAST_BUTTON_DESC" = "App restart is required.";
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
"HIDE_SPONSORBLOCK_BUTTON" = "Hide iSponsorBlock button in the Navigation bar";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";

View file

@ -2,16 +2,37 @@
"VERSION" = "Versión de YTLitePlus: %@";
"VERSION_CHECK" = "Pulse para comprobar si hay actualizaciones.";
"COPY_SETTINGS" = "Copy Settings";
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
"PASTE_SETTINGS" = "Paste Settings";
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
"EXPORT_SETTINGS" = "Export Settings";
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
"IMPORT_SETTINGS" = "Import Settings";
"IMPORT_SETTINGS_DESC" = "Press to import settings (.txt)";
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
"COPY_SETTINGS" = "Copiar Configuraciones";
"COPY_SETTINGS_DESC" = "Copiar todas las configuraciones actuales al portapapeles";
"PASTE_SETTINGS" = "Pegar Configuraciones";
"PASTE_SETTINGS_DESC" = "Pegar configuraciones desde el portapapeles y aplicar";
"PASTE_SETTINGS_ALERT" = "¿Aplicar configuraciones desde el portapapeles?";
"EXPORT_SETTINGS" = "Exportar Configuraciones";
"EXPORT_SETTINGS_DESC" = "Exportar todas las configuraciones actuales a un archivo .txt";
"IMPORT_SETTINGS" = "Importar Configuraciones";
"IMPORT_SETTINGS_DESC" = "Presiona para importar configuraciones (.txt)";
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Reemplazar Botones de 'Copiar Configuraciones' y 'Pegar Configuraciones'";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Reemplaza los botones con 'Exportar Configuraciones' e 'Importar Configuraciones'";
"VIDEO_PLAYER" = "Reproductor de vídeo (Beta)";
"VIDEO_PLAYER_DESC" = "Abrir un vídeo descargado en el reproductor de Apple";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Habilitar Gestos del Reproductor";
"VOLUME" = "Volumen";
"BRIGHTNESS" = "Brillo";
"SEEK" = "Buscar";
"DISABLED" = "Deshabilitado";
"DEADZONE" = "Zona Muerta";
"DEADZONE_DESC" = "Distancia mínima a mover antes de que se reconozca un gesto";
"SENSITIVITY" = "Sensibilidad";
"SENSITIVITY_DESC" = "Multiplicador en gestos de volumen y brillo";
"PLAYER_GESTURES_TITLE" = "Gestos del Reproductor";
"PLAYER_GESTURES_DESC" = "Configura los gestos de desplazamiento horizontal para el reproductor";
"TOP_SECTION" = "Sección Superior";
"MIDDLE_SECTION" = "Sección Media";
"BOTTOM_SECTION" = "Sección Inferior";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Habilitar Retroalimentación Háptica";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opciones de superposición de controles de vídeo";
@ -58,20 +79,20 @@
"DISABLE_ENGAGEMENT_OVERLAY" = "Desactivar la superposición de compromiso a pantalla completa";
"DISABLE_ENGAGEMENT_OVERLAY_DESC" = "Desactivar el gesto de deslizar hacia arriba y la lista de vídeos sugeridos en pantalla completa";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Hide Comment previews under player";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Hide comment spoiler in comments button";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Ocultar vistas previas de comentarios debajo del reproductor";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Ocultar spoilers de comentarios en el botón de comentarios";
"HIDE_AUTOPLAY_MINI_PREVIEW" = "Hide autoplay mini preview";
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "Hide the small suggested video box near the title in fullscreen";
"HIDE_AUTOPLAY_MINI_PREVIEW" = "Ocultar mini vista previa de reproducción automática";
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "Ocultar la pequeña caja de vídeo sugerido cerca del título en pantalla completa";
"HIDE_HUD_MESSAGES" = "Ocultar mensajes HUD";
"HIDE_HUD_MESSAGES_DESC" = "Ejemplo: CC está activado/desactivado, Vídeo en bucle está activado,...";
"HIDE_HUD_MESSAGES_DESC" = "Ejemplo: CC está activado/desactivado, vídeo en bucle está activado,...";
"HIDE_COLLAPSE_BUTTON" = "Hide Collapse Button";
"HIDE_COLLAPSE_BUTTON_DESC" = "Hides the Arrow Collapse Button that was shown in the Top Left of the Video Player.";
"HIDE_COLLAPSE_BUTTON" = "Ocultar botón de colapso";
"HIDE_COLLAPSE_BUTTON_DESC" = "Oculta el botón de colapso en forma de flecha que se mostraba en la parte superior izquierda del reproductor de vídeo.";
"HIDE_SPEED_TOAST" = "Hide Speed Toast";
"HIDE_SPEED_TOAST_DESC" = "Hide the 2X Speed popup when holding the player";
"HIDE_SPEED_TOAST" = "Ocultar notificación de velocidad";
"HIDE_SPEED_TOAST_DESC" = "Oculta la notificación de velocidad 2X cuando se mantiene presionado el reproductor";
// App settings overlay options
"APP_SETTINGS_OVERLAY_OPTIONS" = "Opciones de superposición de los ajustes de la aplicación";
@ -144,6 +165,9 @@
"HIDE_CAST_BUTTON" = "Ocultar botón Emitir";
"HIDE_CAST_BUTTON_DESC" = "Es necesario reiniciar la aplicación";
"VIDEO_PLAYER_BUTTON" = "Botón del reproductor de vídeo";
"VIDEO_PLAYER_BUTTON_DESC" = "Mostrar un botón en la barra de navegación para abrir vídeo descargados en el reproductor de Apple";
"HIDE_SPONSORBLOCK_BUTTON" = "Ocultar el botón iSponsorBlock en la barra de navegación";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";

View file

@ -6,6 +6,7 @@
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
"PASTE_SETTINGS" = "Paste Settings";
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
"EXPORT_SETTINGS" = "Export Settings";
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
"IMPORT_SETTINGS" = "Import Settings";
@ -13,6 +14,26 @@
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
"VIDEO_PLAYER" = "Video Player (Beta)";
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
"VOLUME" = "Volume";
"BRIGHTNESS" = "Brightness";
"SEEK" = "Seek";
"DISABLED" = "Disabled";
"DEADZONE" = "Deadzone";
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
"SENSITIVITY" = "Sensitivity";
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
"PLAYER_GESTURES_TITLE" = "Player Gestures";
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
"TOP_SECTION" = "Top Section";
"MIDDLE_SECTION" = "Middle Section";
"BOTTOM_SECTION" = "Bottom Section";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Options de l'overlay des contrôles vidéo";
@ -147,6 +168,9 @@
"HIDE_CAST_BUTTON" = "Masquer le bouton Cast";
"HIDE_CAST_BUTTON_DESC" = "Un redémarrage de l'application est requis.";
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
"HIDE_SPONSORBLOCK_BUTTON" = "Masquer le bouton iSponsorBlock dans la barre de navigation";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";

View file

@ -6,6 +6,7 @@
"COPY_SETTINGS_DESC" = "現在のすべての設定をクリップボードにコピーします";
"PASTE_SETTINGS" = "設定を貼り付け";
"PASTE_SETTINGS_DESC" = "クリップボードから設定を貼り付けて適用します";
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
"EXPORT_SETTINGS" = "Export Settings";
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
"IMPORT_SETTINGS" = "Import Settings";
@ -13,6 +14,26 @@
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
"VIDEO_PLAYER" = "Video Player (Beta)";
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
"VOLUME" = "Volume";
"BRIGHTNESS" = "Brightness";
"SEEK" = "Seek";
"DISABLED" = "Disabled";
"DEADZONE" = "Deadzone";
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
"SENSITIVITY" = "Sensitivity";
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
"PLAYER_GESTURES_TITLE" = "Player Gestures";
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
"TOP_SECTION" = "Top Section";
"MIDDLE_SECTION" = "Middle Section";
"BOTTOM_SECTION" = "Bottom Section";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "動画コントロールオーバーレイの設定";
@ -144,6 +165,9 @@
"HIDE_CAST_BUTTON" = "キャストボタンを非表示";
"HIDE_CAST_BUTTON_DESC" = "アプリの再起動が必要です。";
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
"HIDE_SPONSORBLOCK_BUTTON" = "ナビゲーションバーのiSponsorBlockボタンを非表示";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";

View file

@ -0,0 +1,190 @@
// Settings
"VERSION" = "YTLitePlus 버전: %@";
"VERSION_CHECK" = "업데이트를 확인하려면 탭하세요!";
"COPY_SETTINGS" = "설정 복사";
"COPY_SETTINGS_DESC" = "현재 설정을 모두 클립보드에 복사합니다";
"PASTE_SETTINGS" = "설정 붙여넣기";
"PASTE_SETTINGS_DESC" = "클립보드에서 설정을 붙여넣고 적용합니다";
"PASTE_SETTINGS_ALERT" = "클립보드에서 설정을 적용할까요?";
"EXPORT_SETTINGS" = "설정 내보내기";
"EXPORT_SETTINGS_DESC" = "현재 설정을 .txt 파일로 내보냅니다";
"IMPORT_SETTINGS" = "설정 가져오기";
"IMPORT_SETTINGS_DESC" = "설정(.txt)을 가져오려면 누르세요";
"REPLACE_COPY_AND_PASTE_BUTTONS" = "'설정 복사' & '설정 붙여넣기' 버튼 교체";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "버튼을 '설정 내보내기'와 '설정 가져오기'로 교체합니다";
"VIDEO_PLAYER" = "동영상 플레이어 (베타)";
"VIDEO_PLAYER_DESC" = "다운로드한 동영상을 Apple 기본 플레이어에서 재생하기";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "플레이어 제스처 활성화";
"VOLUME" = "음량";
"BRIGHTNESS" = "밝기";
"SEEK" = "탐색";
"DISABLED" = "비활성화됨";
"DEADZONE" = "데드존";
"DEADZONE_DESC" = "제스처 인식을 위한 최소 이동 거리";
"SENSITIVITY" = "민감도";
"SENSITIVITY_DESC" = "음량 및 밝기 제스처의 민감도 조정";
"PLAYER_GESTURES_TITLE" = "플레이어 제스처";
"PLAYER_GESTURES_DESC" = "플레이어 좌우 스와이프 제스처 설정";
"TOP_SECTION" = "상단";
"MIDDLE_SECTION" = "중앙";
"BOTTOM_SECTION" = "하단";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "햅틱 피드백 활성화";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "동영상 컨트롤 오버레이";
"ENABLE_SHARE_BUTTON" = "공유 버튼 활성화";
"ENABLE_SHARE_BUTTON_DESC" = "동영상 컨트롤 오버레이에 공유 버튼 활성화";
"ENABLE_SAVE_TO_PLAYLIST_BUTTON" = "'저장' 버튼 활성화";
"ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC" = "동영상 컨트롤 오버레이에 '저장' 버튼 활성화";
"HIDE_SHADOW_OVERLAY_BUTTONS" = "그림자 오버레이 버튼 숨기기";
"HIDE_SHADOW_OVERLAY_BUTTONS_DESC" = "재생/일시정지, 이전, 다음, 앞으로/뒤로 버튼의 그림자 오버레이를 숨깁니다.";
"HIDE_RIGHT_PANEL" = "전체화면 모드에서 오른쪽 패널 숨기기";
"HIDE_RIGHT_PANEL_DESC" = "앱 재시작이 필요합니다.";
"HIDE_HEATWAVES" = "히트 웨이브 숨기기";
"HIDE_HEATWAVES_DESC" = "동영상 플레이어에서 히트 웨이브를 숨깁니다. 앱 재시작이 필요합니다.";
"DISABLE_AMBIENT_PORTRAIT" = "앰비언트 모드 비활성화 (세로)";
"DISABLE_AMBIENT_PORTRAIT_DESC" = "동영상 제목 주변의 조명 효과를 비활성화합니다.";
"DISABLE_AMBIENT_FULLSCREEN" = "앰비언트 모드 비활성화 (전체화면)";
"DISABLE_AMBIENT_FULLSCREEN_DESC" = "동영상 주변의 조명 효과를 비활성화합니다.";
"FULLSCREEN_TO_THE_RIGHT" = "오른쪽으로 전체화면 전환";
"FULLSCREEN_TO_THE_RIGHT_DESC" = "항상 기기 하단이 오른쪽에 있는 전체화면으로 전환합니다.";
"SEEK_ANYWHERE" = "아무 곳에서나 밀어서 탐색";
"SEEK_ANYWHERE_DESC" = "동영상에서 드래그하여 탐색합니다. You must disable YTLite - Hold to speed";
"ENABLE_TAP_TO_SEEK" = "탭해서 탐색 활성화";
"ENABLE_TAP_TO_SEEK_DESC" = "재생 바에서 한 번만 탭해서 원하는 위치로 이동합니다.";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE" = "확대하여 전체화면 비활성화";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE_DESC" = "확대하여 세로 전체화면으로 전환하는 제스처를 비활성화합니다. 가로 동영상에만 적용됩니다.";
"ALWAYS_USE_REMAINING_TIME" = "항상 남은 시간 표시";
"ALWAYS_USE_REMAINING_TIME_DESC" = "재생 바에서 남은 시간을 기본 설정으로 표시하도록 변경합니다.";
"DISABLE_TOGGLE_TIME_REMAINING" = "남은 시간 토글 비활성화";
"DISABLE_TOGGLE_TIME_REMAINING_DESC" = "경과 시간과 남은 시간을 변경하는 기능을 비활성화합니다. 항상 남은 시간을 표시하는 다른 설정과 함께 사용하세요.";
"DISABLE_ENGAGEMENT_OVERLAY" = "전체화면 오버레이 비활성화";
"DISABLE_ENGAGEMENT_OVERLAY_DESC" = "전체화면에서 위로 스와이프 제스처와 추천 동영상 목록을 비활성화합니다.";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "플레이어 하단 댓글 미리보기 숨기기";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "댓글 구역에서 댓글 미리보기를 숨깁니다.";
"HIDE_AUTOPLAY_MINI_PREVIEW" = "자동 재생 미리보기 숨기기";
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "전체화면에서 제목 근처의 추천 동영상 상자를 숨깁니다.";
"HIDE_HUD_MESSAGES" = "HUD 메세지 숨기기";
"HIDE_HUD_MESSAGES_DESC" = "특정 동작 시 표시되는 메시지를 숨깁니다. (예: 자막 켜짐/꺼짐)";
"HIDE_COLLAPSE_BUTTON" = "축소 버튼 숨기기";
"HIDE_COLLAPSE_BUTTON_DESC" = "동영상 플레이어 왼쪽 상단에 표시된 화살표 축소 버튼을 숨깁니다.";
"HIDE_SPEED_TOAST" = "재생 속도 팝업 숨기기";
"HIDE_SPEED_TOAST_DESC" = "플레이어를 홀드할 때 나타나는 2배속 팝업을 숨깁니다.";
// App settings overlay options
"APP_SETTINGS_OVERLAY_OPTIONS" = "설정 오버레이";
"HIDE_ACCOUNT_SECTION" = "\"계정 전환\" 숨기기";
"HIDE_AUTOPLAY_SECTION" = "\"자동 재생\" 숨기기";
"HIDE_TRYNEWFEATURES_SECTION" = "\"새 실험 기능 사용해보기\" 숨기기";
"HIDE_VIDEOQUALITYPREFERENCES_SECTION" = "\"동영상 화질 환경설정\" 숨기기";
"HIDE_NOTIFICATIONS_SECTION" = "\"알림\" 숨기기";
"HIDE_MANAGEALLHISTORY_SECTION" = "\"전체 기록 관리\" 숨기기";
"HIDE_YOURDATAINYOUTUBE_SECTION" = "\"YouTube의 내 데이터\" 숨기기";
"HIDE_PRIVACY_SECTION" = "\"공개 설정\" 숨기기";
"HIDE_LIVECHAT_SECTION" = "\"실시간 채팅\" 숨기기";
// Theme
"THEME_OPTIONS" = "어두운 테마 설정";
"OLED_DARK_THEME" = "OLED 다크 테마";
"OLED_DARK_THEME_2" = "OLED 다크 테마";
"OLED_DARK_THEME_DESC" = "진정한 다크 테마입니다. 일부 상황에서는 올바르게 작동하지 않을 수 있습니다. 이 옵션을 켜거나 끈 후에는 앱을 재시작해야 합니다.";
"OLD_DARK_THEME" = "구형 어두운 테마";
"OLD_DARK_THEME_DESC" = "예전 유튜브의 어두운 테마(회색 테마). 앱 재시작이 필요합니다.";
"DEFAULT_THEME" = "기본";
"DEFAULT_THEME_DESC" = "유튜브의 기본 어두운 테마입니다. 앱 재시작이 필요합니다.";
"OLED_KEYBOARD" = "OLED 키보드";
"OLED_KEYBOARD_DESC" = "일부 상황에서 올바르게 작동하지 않을 수 있습니다. 앱 재시작이 필요합니다.";
"LOW_CONTRAST_MODE" = "저대비 모드";
"LOW_CONTRAST_MODE_DESC" = "텍스트와 버튼의 대비를 낮춥니다. 예전 유튜브 인터페이스처럼 보일 수 있습니다. 앱 재시작이 필요합니다.";
"LCM_SELECTOR" = "저대비 모드 선택";
"DEFAULT_LOWCONTRASTMODE" = "(기본) 저대비 모드";
"CUSTOM_LOWCONTRASTMODE" = "(사용자 지정 색상) 저대비 모드";
// Miscellaneous
"MISCELLANEOUS" = "기타";
"PLAYBACK_IN_FEEDS" = "피드에서 재생";
"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "항상 사용";
"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Wi-Fi 전용";
"PLAYBACK_IN_FEEDS_OFF" = "사용 안함";
"NEW_SETTINGS_UI" = "새로운 설정 UI";
"NEW_SETTINGS_UI_DESC" = "새로운 그룹화된 설정 UI를 사용합니다. 일부 설정이 숨겨질 수 있습니다.";
"ENABLE_YT_STARTUP_ANIMATION" = "유튜브 시작 애니메이션 활성화";
"ENABLE_YT_STARTUP_ANIMATION_DESC" = "";
"HIDE_MODERN_INTERFACE" = "새로운 인터페이스 비활성화 (YTNoModernUI)";
"HIDE_MODERN_INTERFACE_DESC" = "17.38.10 이전의 전통적인 디자인으로 되돌립니다. 일부 둥근 요소, 앰비언트 모드 및 새로운 기능도 제거됩니다. 앱 재시작이 필요합니다.";
"IPAD_LAYOUT" = "iPad 레이아웃";
"IPAD_LAYOUT_DESC" = "iPhone/iPod에서 iPad 레이아웃을 사용하려면 이 옵션을 켜세요. 앱 재시작이 필요합니다.";
"IPHONE_LAYOUT" = "iPhone 레이아웃";
"IPHONE_LAYOUT_DESC" = "iPad에서 iPhone 레이아웃을 사용하려면 이 옵션을 켜세요. 앱 재시작이 필요합니다.";
"CAST_CONFIRM" = "TV로 시청하기 전 확인 (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "실수로 TV에 영상을 띄우지 않도록 시청 전에 확인 메세지를 표시합니다.";
"CASTING" = "TV로 시청하기";
"MSG_ARE_YOU_SURE" = "TV로 시청하시겠습니까?";
"MSG_YES" = "확인";
"MSG_CANCEL" = "취소";
"NEW_MINIPLAYER_STYLE" = "새로운 미니 플레이어 스타일 (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "앱 재시작이 필요합니다.";
"HIDE_CAST_BUTTON" = "TV로 시청하기 버튼 숨기기";
"HIDE_CAST_BUTTON_DESC" = "앱 재시작이 필요합니다.";
"VIDEO_PLAYER_BUTTON" = "동영상 플레이어 버튼";
"VIDEO_PLAYER_BUTTON_DESC" = "다운로드한 동영상를 Apple 기본 플레이어에서 열 수 있는 버튼을 네비게이션 바에 표시합니다.";
"HIDE_SPONSORBLOCK_BUTTON" = "네비게이션 바에서 iSponsorBlock 버튼 숨기기";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
"HIDE_HOME_TAB" = "홈 탭 숨기기";
"HIDE_HOME_TAB_DESC" = "모든 탭을 숨길 때는 주의하세요";
"FIX_CASTING" = "TV로 시청하기 수정";
"FIX_CASTING_DESC" = "일부 AB 플래그를 변경하여 TV로 시청하기 문제를 해결합니다.";
"ENABLE_FLEX" = "FLEX 활성화";
"ENABLE_FLEX_DESC" = "디버깅을 위해 FLEX를 활성화합니다(권장하지 않음). 이 동작에 대해 잘 아는 경우에만 사용하세요.";
// Version Spoofer
"APP_VERSION_SPOOFER_LITE" = "앱 버전 변조 활성화 (Lite)";
"APP_VERSION_SPOOFER_LITE_DESC" = "버전 변조(Lite)를 사용하려면 이 옵션을 켜고 아래에서 원하는 버전을 선택하세요. 앱 재시작이 필요합니다.";
"VERSION_SPOOFER_TITLE" = "버전 변조 선택";
// Other Localization
"APP_RESTART_DESC" = "앱 재시작이 필요합니다.";
"CHANGE_APP_ICON" = "앱 아이콘 변경";

View file

@ -1,167 +1,191 @@
// Settings
"VERSION" = "Versão do YTLitePlus: %@";
"VERSION_CHECK" = "Toque para verificar se há atualização!";
"COPY_SETTINGS" = "Copiar Configurações";
"COPY_SETTINGS_DESC" = "Copia todas as configurações atuais para a área de transferência";
"PASTE_SETTINGS" = "Colar Configurações";
"PASTE_SETTINGS_DESC" = "Cola as configurações da área de transferência e aplica";
"EXPORT_SETTINGS" = "Exportar Configurações";
"EXPORT_SETTINGS_DESC" = "Exporta todas as configurações atuais para um arquivo .txt";
"IMPORT_SETTINGS" = "Importar Configurações";
"IMPORT_SETTINGS_DESC" = "Pressione para importar as configurações (.txt)";
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Substituir os Botões 'Copiar Configurações' e 'Colar Configurações'";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Substitui os Botões 'Exportar Configurações' e 'Importar Configurações'";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opções de Sobreposição de Controles de Vídeo";
"ENABLE_SHARE_BUTTON" = "Ativar o botão 'Compartilhar'";
"ENABLE_SHARE_BUTTON_DESC" = "Ativa o botão Compartilhar na sobreposição de controles de vídeo.";
"ENABLE_SAVE_TO_PLAYLIST_BUTTON" = "Ativar o botão 'Salvar'";
"ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC" = "Ativa o botão 'Salvar' na sobreposição de controles de vídeo.";
"HIDE_SHADOW_OVERLAY_BUTTONS" = "Ocultar Sombras nos Botões de Sobreposição";
"HIDE_SHADOW_OVERLAY_BUTTONS_DESC" = "Oculta as sombras nos botões de sobreposição Reproduzir/Pausar, Anterior, Próximo, Avançar e Retroceder.";
"HIDE_RIGHT_PANEL" = "Ocultar o painel direito no modo de tela cheia";
"HIDE_RIGHT_PANEL_DESC" = "A reinicialização do app é necessária.";
"HIDE_HEATWAVES" = "Ocultar Ondas de calor";
"HIDE_HEATWAVES_DESC" = "Oculta as Ondas de calor no player de vídeo. A reinicialização do app é necessária.";
"DISABLE_AMBIENT_PORTRAIT" = "Desativar Iluminação cinematográfica (Retrato)";
"DISABLE_AMBIENT_PORTRAIT_DESC" = "Desativa a iluminação ao redor do título do vídeo";
"DISABLE_AMBIENT_FULLSCREEN" = "Desativar Iluminação cinematográfica (Tela cheia)";
"DISABLE_AMBIENT_FULLSCREEN_DESC" = "Desativa a iluminação ao redor do player de vídeo";
"FULLSCREEN_TO_THE_RIGHT" = "Tela cheia para a direita";
"FULLSCREEN_TO_THE_RIGHT_DESC" = "Sempre entre em tela cheia com o botão home no lado direito.";
"SEEK_ANYWHERE" = "Gesto de Busca em qualquer lugar";
"SEEK_ANYWHERE_DESC" = "Segure e arraste o player de vídeo para buscar. Você deve desativar o YTLite - Segurar para velocidade (Hold for speed)";
"ENABLE_TAP_TO_SEEK" = "Ativar Toque para Buscar";
"ENABLE_TAP_TO_SEEK_DESC" = "Vá para qualquer lugar em um vídeo tocando uma vez na barra de busca";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE" = "Desativar gesto de puxar para tela cheia";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE_DESC" = "Desativa o gesto de arrastar para entrar em tela cheia vertical. Aplica-se apenas a vídeos em paisagem.";
"ALWAYS_USE_REMAINING_TIME" = "Sempre usar o tempo restante";
"ALWAYS_USE_REMAINING_TIME_DESC" = "Altera o padrão para mostrar o tempo restante na barra do player.";
"DISABLE_TOGGLE_TIME_REMAINING" = "Desativar alternar tempo restante";
"DISABLE_TOGGLE_TIME_REMAINING_DESC" = "Desativa a alteração do tempo decorrido para o tempo restante. Use com outra configuração para mostrar sempre o tempo restante.";
"DISABLE_ENGAGEMENT_OVERLAY" = "Desativar sobreposição de engajamento em tela cheia";
"DISABLE_ENGAGEMENT_OVERLAY_DESC" = "Desativa o gesto de deslizar para cima e a lista de vídeos sugeridos em tela cheia";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Ocultar Visualizações de comentários sob o player";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Oculta a Prévia de comentário no botão de comentários";
"HIDE_AUTOPLAY_MINI_PREVIEW" = "Ocultar mini visualização de reprodução automática";
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "Oculta a pequena caixa de vídeo sugerida perto do título em tela cheia";
"HIDE_HUD_MESSAGES" = "Ocultar Mensagens do HUD";
"HIDE_HUD_MESSAGES_DESC" = "Exemplo: Legendas/CC ativadas/desativadas, A repetição do vídeo está ativada,...";
"HIDE_COLLAPSE_BUTTON" = "Ocultar Botão de Recolhimento";
"HIDE_COLLAPSE_BUTTON_DESC" = "Oculta o botão de seta para recolher que era exibido no canto superior esquerdo do player de vídeo.";
"HIDE_SPEED_TOAST" = "Ocultar Toast de Velocidade";
"HIDE_SPEED_TOAST_DESC" = "Ocultar o popup de Velocidade 2X ao segurar o player";
// App settings overlay options
"APP_SETTINGS_OVERLAY_OPTIONS" = "Configurações do Aplicativo";
"HIDE_ACCOUNT_SECTION" = "Ocultar a sessão \"Conta\"";
"HIDE_AUTOPLAY_SECTION" = "Ocultar a sessão \"Reprodução automática\"";
"HIDE_TRYNEWFEATURES_SECTION" = "Ocultar a sessão \"Experimente novos recursos\"";
"HIDE_VIDEOQUALITYPREFERENCES_SECTION" = "Ocultar a sessão \"Preferências de qualidade de vídeo\"";
"HIDE_NOTIFICATIONS_SECTION" = "Ocultar a sessão \"Notificações\"";
"HIDE_MANAGEALLHISTORY_SECTION" = "Ocultar a sessão \"Gerencie todo o histórico\"";
"HIDE_YOURDATAINYOUTUBE_SECTION" = "Ocultar a sessão \"Seus dados no YouTube\"";
"HIDE_PRIVACY_SECTION" = "Ocultar a sessão \"Privacidade\"";
"HIDE_LIVECHAT_SECTION" = "Ocultar a sessão \"Chat ao vivo\"";
// Theme
"THEME_OPTIONS" = "Opções de Temas";
"OLED_DARK_THEME" = "Modo escuro OLED";
"OLED_DARK_THEME_2" = "Modo escuro OLED";
"OLED_DARK_THEME_DESC" = "Verdadeiro tema escuro. Pode não funcionar corretamente em alguns casos. App restart is required after you enable/disable this option.";
"OLD_DARK_THEME" = "Antigo tema escuro";
"OLD_DARK_THEME_DESC" = "Tema escuro do YouTube antigo (tema cinza). A reinicialização do app é necessária.";
"DEFAULT_THEME" = "Padrão";
"DEFAULT_THEME_DESC" = "Tema escuro padrão do YouTube. A reinicialização do app é necessária.";
"OLED_KEYBOARD" = "Teclado OLED";
"OLED_KEYBOARD_DESC" = "Pode não funcionar corretamente em alguns casos. A reinicialização do app é necessária.";
"LOW_CONTRAST_MODE" = "Modo de Baixo Contraste";
"LOW_CONTRAST_MODE_DESC" = "Esta opção terá baixo contraste dos textos e botões, assim como era a antiga interface do YouTube. A reinicialização do app é necessária.";
"LCM_SELECTOR" = "Seleção do modo de baixo contraste";
"DEFAULT_LOWCONTRASTMODE" = "(Padrão) LowContrastMode";
"CUSTOM_LOWCONTRASTMODE" = "(Cor Personalizada) LowContrastMode";
// Miscellaneous
"MISCELLANEOUS" = "Diversos";
"PLAYBACK_IN_FEEDS" = "Reprodução nos feeds";
"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Sempre ativada";
"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Somente Wi-Fi";
"PLAYBACK_IN_FEEDS_OFF" = "Desativada";
"NEW_SETTINGS_UI" = "Nova Interface de Configurações";
"NEW_SETTINGS_UI_DESC" = "Usa a nova Interface de configurações agrupadas. Pode ocultar algumas configurações";
"ENABLE_YT_STARTUP_ANIMATION" = "Ative a animação de inicialização do YouTube";
"ENABLE_YT_STARTUP_ANIMATION_DESC" = "";
"HIDE_MODERN_INTERFACE" = "Ocultar Interface Moderna (YTNoModernUI)";
"HIDE_MODERN_INTERFACE_DESC" = "Ative esta opção para ocultar qualquer elemento moderno adicionado pelo YouTube. Remove a iluminação cinematogrática, design arredondado e muito mais. A reinicialização do app é necessária.";
"IPAD_LAYOUT" = "Layout do iPad";
"IPAD_LAYOUT_DESC" = "Use isso apenas se quiser ter o layout do iPad no seu iPhone/iPod atual. A reinicialização do app é necessária.";
"IPHONE_LAYOUT" = "Layout do iPhone";
"IPHONE_LAYOUT_DESC" = "Use isso apenas se quiser ter o layout do iPhone no seu iPad atual. A reinicialização do app é necessária.";
"CAST_CONFIRM" = "Alerta de confirmação antes de transmitir (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Mostra um alerta de confirmação antes da transmissão para evitar o sequestro acidental da TV.";
"CASTING" = "Transmissão";
"MSG_ARE_YOU_SURE" = "Tem certeza de que deseja começar a transmitir?";
"MSG_YES" = "Sim";
"MSG_CANCEL" = "Cancelar";
"NEW_MINIPLAYER_STYLE" = "Novo estilo de barra de miniplayer (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "A reinicialização do app é necessária.";
"HIDE_CAST_BUTTON" = "Ocultar o botão Transmitir";
"HIDE_CAST_BUTTON_DESC" = "A reinicialização do app é necessária.";
"HIDE_SPONSORBLOCK_BUTTON" = "Ocultar o botão iSponsorBlock na barra de navegação";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
"HIDE_HOME_TAB" = "Ocultar guia Início";
"HIDE_HOME_TAB_DESC" = "Tenha cuidado ao ocultar todas as guias";
"FIX_CASTING" = "Corrigir Transmissão";
"FIX_CASTING_DESC" = "Altera alguns sinalizadores AB para corrigir a transmissão";
"ENABLE_FLEX" = "Ativar FLEX";
"ENABLE_FLEX_DESC" = "Ativa o FLEX para depuração (não recomendado). Deixe isso desligado, a menos que você saiba o que está fazendo.";
// Version Spoofer
"APP_VERSION_SPOOFER_LITE" = "Ativar Falsificação da Versão do App (Lite)";
"APP_VERSION_SPOOFER_LITE_DESC" = "Ative isto para usar a Falsificação de Versão (Lite) e selecione sua versão preferida abaixo. A reinicialização do app é necessária.";
"VERSION_SPOOFER_TITLE" = "Selecionar Versão Falsa";
// Other Localization
"APP_RESTART_DESC" = "A reinicialização do app é necessária.";
"CHANGE_APP_ICON" = "Mudar o Ícone do Aplicativo";
// Settings
"VERSION" = "Versão do YTLitePlus: %@";
"VERSION_CHECK" = "Toque para verificar se há atualização!";
"COPY_SETTINGS" = "Copiar Configurações";
"COPY_SETTINGS_DESC" = "Copia todas as configurações atuais para a área de transferência";
"PASTE_SETTINGS" = "Colar Configurações";
"PASTE_SETTINGS_DESC" = "Cola as configurações da área de transferência e aplica";
"PASTE_SETTINGS_ALERT" = "Aplicar configurações da área de transferência?";
"EXPORT_SETTINGS" = "Exportar Configurações";
"EXPORT_SETTINGS_DESC" = "Exporta todas as configurações atuais para um arquivo .txt";
"IMPORT_SETTINGS" = "Importar Configurações";
"IMPORT_SETTINGS_DESC" = "Pressione para importar as configurações (.txt)";
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Substituir os Botões 'Copiar Configurações' e 'Colar Configurações'";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Substitui os Botões 'Exportar Configurações' e 'Importar Configurações'";
"VIDEO_PLAYER" = "Reprodutor de Vídeo (Beta)";
"VIDEO_PLAYER_DESC" = "Abra um vídeo baixado no Reprodutor de video da Apple";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Habilitar Gestos no Reprodutor de video";
"VOLUME" = "Volume";
"BRIGHTNESS" = "Brilho";
"SEEK" = "Busca";
"DISABLED" = "Desabilitado";
"DEADZONE" = "Zona morta";
"DEADZONE_DESC" = "Distância mínima a percorrer antes de um gesto ser reconhecido";
"SENSITIVITY" = "Sensibilidade";
"SENSITIVITY_DESC" = "Multiplicador em gestos de volume e brilho";
"PLAYER_GESTURES_TITLE" = "Gestos do Reprodutor de video";
"PLAYER_GESTURES_DESC" = "Configurar gestos panorâmicos horizontal para o player";
"TOP_SECTION" = "Seção Superior";
"MIDDLE_SECTION" = "Seção do Meio";
"BOTTOM_SECTION" = "Seção Inferior";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Habilitar Feedback Tátil";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opções de Sobreposição de Controles de Vídeo";
"ENABLE_SHARE_BUTTON" = "Ativar o botão 'Compartilhar'";
"ENABLE_SHARE_BUTTON_DESC" = "Ativa o botão Compartilhar na sobreposição de controles de vídeo.";
"ENABLE_SAVE_TO_PLAYLIST_BUTTON" = "Ativar o botão 'Salvar'";
"ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC" = "Ativa o botão 'Salvar' na sobreposição de controles de vídeo.";
"HIDE_SHADOW_OVERLAY_BUTTONS" = "Ocultar Sombras nos Botões de Sobreposição";
"HIDE_SHADOW_OVERLAY_BUTTONS_DESC" = "Oculta as sombras nos botões de sobreposição Reproduzir/Pausar, Anterior, Próximo, Avançar e Retroceder.";
"HIDE_RIGHT_PANEL" = "Ocultar o painel direito no modo de tela cheia";
"HIDE_RIGHT_PANEL_DESC" = "A reinicialização do app é necessária.";
"HIDE_HEATWAVES" = "Ocultar Ondas de calor";
"HIDE_HEATWAVES_DESC" = "Oculta as Ondas de calor no player de vídeo. A reinicialização do app é necessária.";
"DISABLE_AMBIENT_PORTRAIT" = "Desativar Iluminação cinematográfica (Retrato)";
"DISABLE_AMBIENT_PORTRAIT_DESC" = "Desativa a iluminação ao redor do título do vídeo";
"DISABLE_AMBIENT_FULLSCREEN" = "Desativar Iluminação cinematográfica (Tela cheia)";
"DISABLE_AMBIENT_FULLSCREEN_DESC" = "Desativa a iluminação ao redor do player de vídeo";
"FULLSCREEN_TO_THE_RIGHT" = "Tela cheia para a direita";
"FULLSCREEN_TO_THE_RIGHT_DESC" = "Sempre entre em tela cheia com o botão home no lado direito.";
"SEEK_ANYWHERE" = "Gesto de Busca em qualquer lugar";
"SEEK_ANYWHERE_DESC" = "Segure e arraste o player de vídeo para buscar. Você deve desativar o YTLite - Segurar para velocidade (Hold for speed)";
"ENABLE_TAP_TO_SEEK" = "Ativar Toque para Buscar";
"ENABLE_TAP_TO_SEEK_DESC" = "Vá para qualquer lugar em um vídeo tocando uma vez na barra de busca";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE" = "Desativar gesto de puxar para tela cheia";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE_DESC" = "Desativa o gesto de arrastar para entrar em tela cheia vertical. Aplica-se apenas a vídeos em paisagem.";
"ALWAYS_USE_REMAINING_TIME" = "Sempre usar o tempo restante";
"ALWAYS_USE_REMAINING_TIME_DESC" = "Altera o padrão para mostrar o tempo restante na barra do player.";
"DISABLE_TOGGLE_TIME_REMAINING" = "Desativar alternar tempo restante";
"DISABLE_TOGGLE_TIME_REMAINING_DESC" = "Desativa a alteração do tempo decorrido para o tempo restante. Use com outra configuração para mostrar sempre o tempo restante.";
"DISABLE_ENGAGEMENT_OVERLAY" = "Desativar sobreposição de engajamento em tela cheia";
"DISABLE_ENGAGEMENT_OVERLAY_DESC" = "Desativa o gesto de deslizar para cima e a lista de vídeos sugeridos em tela cheia";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Ocultar Visualizações de comentários sob o player";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Oculta a Prévia de comentário no botão de comentários";
"HIDE_AUTOPLAY_MINI_PREVIEW" = "Ocultar mini visualização de reprodução automática";
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "Oculta a pequena caixa de vídeo sugerida perto do título em tela cheia";
"HIDE_HUD_MESSAGES" = "Ocultar Mensagens do HUD";
"HIDE_HUD_MESSAGES_DESC" = "Exemplo: Legendas/CC ativadas/desativadas, A repetição do vídeo está ativada,...";
"HIDE_COLLAPSE_BUTTON" = "Ocultar Botão de Recolhimento";
"HIDE_COLLAPSE_BUTTON_DESC" = "Oculta o botão de seta para recolher que era exibido no canto superior esquerdo do player de vídeo.";
"HIDE_SPEED_TOAST" = "Ocultar Toast de Velocidade";
"HIDE_SPEED_TOAST_DESC" = "Ocultar o popup de Velocidade 2X ao segurar o player";
// App settings overlay options
"APP_SETTINGS_OVERLAY_OPTIONS" = "Configurações do Aplicativo";
"HIDE_ACCOUNT_SECTION" = "Ocultar a sessão \"Conta\"";
"HIDE_AUTOPLAY_SECTION" = "Ocultar a sessão \"Reprodução automática\"";
"HIDE_TRYNEWFEATURES_SECTION" = "Ocultar a sessão \"Experimente novos recursos\"";
"HIDE_VIDEOQUALITYPREFERENCES_SECTION" = "Ocultar a sessão \"Preferências de qualidade de vídeo\"";
"HIDE_NOTIFICATIONS_SECTION" = "Ocultar a sessão \"Notificações\"";
"HIDE_MANAGEALLHISTORY_SECTION" = "Ocultar a sessão \"Gerencie todo o histórico\"";
"HIDE_YOURDATAINYOUTUBE_SECTION" = "Ocultar a sessão \"Seus dados no YouTube\"";
"HIDE_PRIVACY_SECTION" = "Ocultar a sessão \"Privacidade\"";
"HIDE_LIVECHAT_SECTION" = "Ocultar a sessão \"Chat ao vivo\"";
// Theme
"THEME_OPTIONS" = "Opções de Temas";
"OLED_DARK_THEME" = "Modo escuro OLED";
"OLED_DARK_THEME_2" = "Modo escuro OLED";
"OLED_DARK_THEME_DESC" = "Verdadeiro tema escuro. Pode não funcionar corretamente em alguns casos. App restart is required after you enable/disable this option.";
"OLD_DARK_THEME" = "Antigo tema escuro";
"OLD_DARK_THEME_DESC" = "Tema escuro do YouTube antigo (tema cinza). A reinicialização do app é necessária.";
"DEFAULT_THEME" = "Padrão";
"DEFAULT_THEME_DESC" = "Tema escuro padrão do YouTube. A reinicialização do app é necessária.";
"OLED_KEYBOARD" = "Teclado OLED";
"OLED_KEYBOARD_DESC" = "Pode não funcionar corretamente em alguns casos. A reinicialização do app é necessária.";
"LOW_CONTRAST_MODE" = "Modo de Baixo Contraste";
"LOW_CONTRAST_MODE_DESC" = "Esta opção terá baixo contraste dos textos e botões, assim como era a antiga interface do YouTube. A reinicialização do app é necessária.";
"LCM_SELECTOR" = "Seleção do modo de baixo contraste";
"DEFAULT_LOWCONTRASTMODE" = "(Padrão) LowContrastMode";
"CUSTOM_LOWCONTRASTMODE" = "(Cor Personalizada) LowContrastMode";
// Miscellaneous
"MISCELLANEOUS" = "Diversos";
"PLAYBACK_IN_FEEDS" = "Reprodução nos feeds";
"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Sempre ativada";
"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Somente Wi-Fi";
"PLAYBACK_IN_FEEDS_OFF" = "Desativada";
"NEW_SETTINGS_UI" = "Nova Interface de Configurações";
"NEW_SETTINGS_UI_DESC" = "Usa a nova Interface de configurações agrupadas. Pode ocultar algumas configurações";
"ENABLE_YT_STARTUP_ANIMATION" = "Ative a animação de inicialização do YouTube";
"ENABLE_YT_STARTUP_ANIMATION_DESC" = "";
"HIDE_MODERN_INTERFACE" = "Ocultar Interface Moderna (YTNoModernUI)";
"HIDE_MODERN_INTERFACE_DESC" = "Ative esta opção para ocultar qualquer elemento moderno adicionado pelo YouTube. Remove a iluminação cinematogrática, design arredondado e muito mais. A reinicialização do app é necessária.";
"IPAD_LAYOUT" = "Layout do iPad";
"IPAD_LAYOUT_DESC" = "Use isso apenas se quiser ter o layout do iPad no seu iPhone/iPod atual. A reinicialização do app é necessária.";
"IPHONE_LAYOUT" = "Layout do iPhone";
"IPHONE_LAYOUT_DESC" = "Use isso apenas se quiser ter o layout do iPhone no seu iPad atual. A reinicialização do app é necessária.";
"CAST_CONFIRM" = "Alerta de confirmação antes de transmitir (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Mostra um alerta de confirmação antes da transmissão para evitar o sequestro acidental da TV.";
"CASTING" = "Transmissão";
"MSG_ARE_YOU_SURE" = "Tem certeza de que deseja começar a transmitir?";
"MSG_YES" = "Sim";
"MSG_CANCEL" = "Cancelar";
"NEW_MINIPLAYER_STYLE" = "Novo estilo de barra de miniplayer (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "A reinicialização do app é necessária.";
"HIDE_CAST_BUTTON" = "Ocultar o botão Transmitir";
"HIDE_CAST_BUTTON_DESC" = "A reinicialização do app é necessária.";
"VIDEO_PLAYER_BUTTON" = "Botão do Reprodutor de Vídeo";
"VIDEO_PLAYER_BUTTON_DESC" = "Mostra um botão na barra de navegação para abrir vídeos baixados no Reprodutor de video da Apple";
"HIDE_SPONSORBLOCK_BUTTON" = "Ocultar o botão iSponsorBlock na barra de navegação";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
"HIDE_HOME_TAB" = "Ocultar guia Início";
"HIDE_HOME_TAB_DESC" = "Tenha cuidado ao ocultar todas as guias";
"FIX_CASTING" = "Corrigir Transmissão";
"FIX_CASTING_DESC" = "Altera alguns sinalizadores AB para corrigir a transmissão";
"ENABLE_FLEX" = "Ativar FLEX";
"ENABLE_FLEX_DESC" = "Ativa o FLEX para depuração (não recomendado). Deixe isso desligado, a menos que você saiba o que está fazendo.";
// Version Spoofer
"APP_VERSION_SPOOFER_LITE" = "Ativar Falsificação da Versão do App (Lite)";
"APP_VERSION_SPOOFER_LITE_DESC" = "Ative isto para usar a Falsificação de Versão (Lite) e selecione sua versão preferida abaixo. A reinicialização do app é necessária.";
"VERSION_SPOOFER_TITLE" = "Selecionar Versão Falsa";
// Other Localization
"APP_RESTART_DESC" = "A reinicialização do app é necessária.";
"CHANGE_APP_ICON" = "Mudar o Ícone do Aplicativo";

View file

@ -6,6 +6,7 @@
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
"PASTE_SETTINGS" = "Paste Settings";
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
"EXPORT_SETTINGS" = "Export Settings";
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
"IMPORT_SETTINGS" = "Import Settings";
@ -13,6 +14,26 @@
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
"VIDEO_PLAYER" = "Video Player (Beta)";
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
"VOLUME" = "Volume";
"BRIGHTNESS" = "Brightness";
"SEEK" = "Seek";
"DISABLED" = "Disabled";
"DEADZONE" = "Deadzone";
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
"SENSITIVITY" = "Sensitivity";
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
"PLAYER_GESTURES_TITLE" = "Player Gestures";
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
"TOP_SECTION" = "Top Section";
"MIDDLE_SECTION" = "Middle Section";
"BOTTOM_SECTION" = "Bottom Section";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opțiuni Overlay Controale Video";
@ -144,6 +165,9 @@
"HIDE_CAST_BUTTON" = "Ascundere buton Proiectare";
"HIDE_CAST_BUTTON_DESC" = "Este necesară repornirea aplicației.";
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
"HIDE_SPONSORBLOCK_BUTTON" = "Ascundere buton iSponsorBlock în bara de navigație";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";

View file

@ -6,6 +6,7 @@
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
"PASTE_SETTINGS" = "Paste Settings";
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
"EXPORT_SETTINGS" = "Export Settings";
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
"IMPORT_SETTINGS" = "Import Settings";
@ -13,6 +14,26 @@
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
"VIDEO_PLAYER" = "Video Player (Beta)";
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
"VOLUME" = "Volume";
"BRIGHTNESS" = "Brightness";
"SEEK" = "Seek";
"DISABLED" = "Disabled";
"DEADZONE" = "Deadzone";
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
"SENSITIVITY" = "Sensitivity";
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
"PLAYER_GESTURES_TITLE" = "Player Gestures";
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
"TOP_SECTION" = "Top Section";
"MIDDLE_SECTION" = "Middle Section";
"BOTTOM_SECTION" = "Bottom Section";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options";
@ -144,6 +165,9 @@
"HIDE_CAST_BUTTON" = "Скрыть кнопку «Транслировать»";
"HIDE_CAST_BUTTON_DESC" = "Потребуется перезагрузка.";
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
"HIDE_SPONSORBLOCK_BUTTON" = "Hide iSponsorBlock button in the Navigation bar";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";

View file

@ -17,16 +17,37 @@ https://github.com/PoomSmart/Return-YouTube-Dislikes/tree/main/layout/Library/Ap
"VERSION" = "YTLitePlus's version: %@";
"VERSION_CHECK" = "Tap to check for update!";
"COPY_SETTINGS" = "Copy Settings";
"COPY_SETTINGS" = "Copy settings";
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
"PASTE_SETTINGS" = "Paste Settings";
"PASTE_SETTINGS" = "Paste settings";
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
"EXPORT_SETTINGS" = "Export Settings";
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
"EXPORT_SETTINGS" = "Export settings";
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
"IMPORT_SETTINGS" = "Import Settings";
"IMPORT_SETTINGS" = "Import settings";
"IMPORT_SETTINGS_DESC" = "Press to import settings (.txt)";
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy settings' & 'Paste settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export settings' and 'Import settings'";
"VIDEO_PLAYER" = "Video Player (Beta)";
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
"VOLUME" = "Volume";
"BRIGHTNESS" = "Brightness";
"SEEK" = "Seek";
"DISABLED" = "Disabled";
"DEADZONE" = "Deadzone";
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
"SENSITIVITY" = "Sensitivity";
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
"PLAYER_GESTURES_TITLE" = "Player Gestures";
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
"TOP_SECTION" = "Top Section";
"MIDDLE_SECTION" = "Middle Section";
"BOTTOM_SECTION" = "Bottom Section";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options";
@ -137,8 +158,8 @@ https://github.com/PoomSmart/Return-YouTube-Dislikes/tree/main/layout/Library/Ap
"ENABLE_YT_STARTUP_ANIMATION" = "Enable YouTube startup animation";
"ENABLE_YT_STARTUP_ANIMATION_DESC" = "";
"HIDE_MODERN_INTERFACE" = "Hide Modern Interface (YTNoModernUI)";
"HIDE_MODERN_INTERFACE_DESC" = "Toggle this on to hide any Modern Element added by YouTube. Removes Ambient Mode, Rounded Design & More. App restart is required.";
"HIDE_MODERN_INTERFACE" = "Disable Modern YouTube Interface (YTNoModernUI)";
"HIDE_MODERN_INTERFACE_DESC" = "This reverts the YouTube app to go back to a more traditional design from v17.38.10. This also removes some rounded elements, ambient mode, and other modern features. App restart is required.";
"IPAD_LAYOUT" = "iPad Layout";
"IPAD_LAYOUT_DESC" = "only use this if you want to have the iPad Layout on your current iPhone/iPod. App restart is required.";
@ -159,6 +180,9 @@ https://github.com/PoomSmart/Return-YouTube-Dislikes/tree/main/layout/Library/Ap
"HIDE_CAST_BUTTON" = "Hide Cast button";
"HIDE_CAST_BUTTON_DESC" = "App restart is required.";
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
"HIDE_SPONSORBLOCK_BUTTON" = "Hide iSponsorBlock button in the Navigation bar";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";

View file

@ -6,6 +6,7 @@
"COPY_SETTINGS_DESC" = "Tüm mevcut ayarları panoya kopyala";
"PASTE_SETTINGS" = "Ayarları Yapıştır";
"PASTE_SETTINGS_DESC" = "Panodaki ayarları yapıştır ve uygula";
"PASTE_SETTINGS_ALERT" = "Panodan ayarları uygulamak istiyor musun?";
"EXPORT_SETTINGS" = "Ayarları Dışa Aktar";
"EXPORT_SETTINGS_DESC" = "Tüm mevcut ayarları bir .txt dosyasına dışa aktarır";
"IMPORT_SETTINGS" = "Ayarları İçe Aktar";
@ -13,6 +14,26 @@
"REPLACE_COPY_AND_PASTE_BUTTONS" = "'Ayarları Kopyala' ve 'Ayarları Yapıştır' Düğmelerini Değiştir";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Düğmeleri 'Ayarları Dışa Aktar' ve 'Ayarları İçe Aktar' ile değiştirir";
"VIDEO_PLAYER" = "Video Oynatıcı (Beta)";
"VIDEO_PLAYER_DESC" = "İndirilen bir videoyu Apple oynatıcısında aç";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Oynatıcı Hareketlerini Etkinleştir";
"VOLUME" = "Ses";
"BRIGHTNESS" = "Parlaklık";
"SEEK" = "Arama";
"DISABLED" = "Devre Dışı";
"DEADZONE" = "Ölü Bölge";
"DEADZONE_DESC" = "Bir hareketin tanınması için minimum mesafe";
"SENSITIVITY" = "Hassasiyet";
"SENSITIVITY_DESC" = "Ses ve parlaklık hareketleri için çarpan";
"PLAYER_GESTURES_TITLE" = "Oynatıcı Hareketleri";
"PLAYER_GESTURES_DESC" = "Oynatıcı için yatay kaydırma hareketlerini yapılandır";
"TOP_SECTION" = "Üst Bölüm";
"MIDDLE_SECTION" = "Orta Bölüm";
"BOTTOM_SECTION" = "Alt Bölüm";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Haptik(titreşim) Geri Bildirimi Etkinleştir";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Kontrol Seç.";
@ -144,6 +165,9 @@
"HIDE_CAST_BUTTON" = "Yayınla düğmesini gizle";
"HIDE_CAST_BUTTON_DESC" = "Yeniden başlatılmalı.";
"VIDEO_PLAYER_BUTTON" = "Video Oynatıcı Butonu";
"VIDEO_PLAYER_BUTTON_DESC" = "İndirilen videoları Apple oynatıcısında açmak için gezinme çubuğunda bir buton göster";
"HIDE_SPONSORBLOCK_BUTTON" = "Gezinme çubuğunda iSponsorBlock düğmesini gizle";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";

View file

@ -1,275 +1,190 @@
// Settings
"VERSION" = "Phiên bản của CercubePlus: %@";
"VERSION" = "Phiên bản YTLitePlus: %@";
"VERSION_CHECK" = "Nhấn để kiểm tra cập nhật!";
"COPY_SETTINGS" = "Copy Settings";
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
"PASTE_SETTINGS" = "Paste Settings";
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
"EXPORT_SETTINGS" = "Export Settings";
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
"IMPORT_SETTINGS" = "Import Settings";
"IMPORT_SETTINGS_DESC" = "Press to import settings (.txt)";
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
"COPY_SETTINGS" = "Sao chép cài đặt";
"COPY_SETTINGS_DESC" = "Sao chép cài đặt hiện tại vào bảng nhớ tạm";
"PASTE_SETTINGS" = "Dán cài đặt";
"PASTE_SETTINGS_DESC" = "Dán cài đặt từ bảng nhớ tạm và áp dụng";
"PASTE_SETTINGS_ALERT" = "Áp dụng các cài đặt?";
"EXPORT_SETTINGS" = "Xuất cài đặt";
"EXPORT_SETTINGS_DESC" = "Xuất tất cài đặt hiện tại vào tệp .txt";
"IMPORT_SETTINGS" = "Nhập cài đặt";
"IMPORT_SETTINGS_DESC" = "Nhấn để nhập cài đặt (.txt)";
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Thay thế nút 'Sao chép cài đặt' và 'Dán cài đặt'";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Thay thế các nút thành 'Xuất cài đặt' và 'Nhập cài đặt'";
// Video player options
"VIDEO_PLAYER_OPTIONS" = "Tùy chọn trình phát video";
"VIDEO_PLAYER" = "Trình phát video (Beta)";
"VIDEO_PLAYER_DESC" = "Mở video đã tải xuống trong trình phát Apple";
"SNAP_TO_CHAPTER" = "Vô hiệu hóa đính vào chương";
"SNAP_TO_CHAPTER_DESC" = "Tắt tính năng tự động chuyển sang chương khi tìm kiếm trong video. Khởi động lại ứng dụng là bắt buộc.";
"PINCH_TO_ZOOM" = "Vô hiệu hóa chụm để thu phóng";
"PINCH_TO_ZOOM_DESC" = "Khởi động lại ứng dụng là bắt buộc.";
"YT_MINIPLAYER" = "Bật trình phát mini cho tất cả các video trên YouTube";
"YT_MINIPLAYER_DESC" = "Ví dụ: video dành cho trẻ em";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Bật cử chỉ trình phát";
"VOLUME" = "Âm lượng";
"BRIGHTNESS" = "Độ sáng";
"SEEK" = "Tua";
"DISABLED" = "Vô hiệu hóa";
"DEADZONE" = "Vùng chết";
"DEADZONE_DESC" = "Khoảng cách tối thiểu để nhận diện cử chỉ";
"SENSITIVITY" = "Độ nhạy";
"SENSITIVITY_DESC" = "Hệ số nhân cho cử chỉ âm lượng và độ sáng";
"PLAYER_GESTURES_TITLE" = "Cử chỉ trình phát";
"PLAYER_GESTURES_DESC" = "Cấu hình cử chỉ vuốt ngang cho trình phát";
"TOP_SECTION" = "Phần trên";
"MIDDLE_SECTION" = "Phần giữa";
"BOTTOM_SECTION" = "Phần dưới";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Bật phản hồi xúc giác";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Tùy chọn lớp phủ điều khiển video";
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Lớp phủ video";
"HIDE_CHANNEL_WATERMARK" = "Ẩn hình mờ kênh";
"HIDE_CHANNEL_WATERMARK_DESC" = "Ẩn hình mờ của kênh trong lớp phủ điều khiển video. Khởi động lại ứng dụng là bắt buộc.";
"ENABLE_SHARE_BUTTON" = "Bật nút chia sẻ";
"ENABLE_SHARE_BUTTON_DESC" = "Thêm nút chia sẻ trong trình phát video.";
"RED_PROGRESS_BAR" = "Thanh tiến trình màu đỏ";
"RED_PROGRESS_BAR_DESC" = "Mang lại thanh tiến trình màu đỏ. Khởi động lại ứng dụng là bắt buộc.";
"ENABLE_SAVE_TO_PLAYLIST_BUTTON" = "Bật nút 'Lưu vào danh sách phát'";
"ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC" = "Thêm nút 'Lưu vào danh sách phát' trong trình phát video.";
"DONT_EAT_MY_CONTENT" = "Ngăn Notch/Đảo trên nội dung video 2:1 (DontEatMyContent)";
"DONT_EAT_MY_CONTENT_DESC" = "Ngăn notch/Dynamic Island nghiền ngẫm nội dung video 2:1 trên YouTube. Khởi động lại ứng dụng là bắt buộc.";
"HIDE_SHADOW_OVERLAY_BUTTONS" = "Ẩn bóng các nút";
"HIDE_SHADOW_OVERLAY_BUTTONS_DESC" = "Ẩn bóng các nút Phát/Tạm dừng, Trước/Tiếp theo, Tua tới/Tua lại.";
"HIDE_RIGHT_PANEL" = "Ẩn bảng bên phải ở chế độ toàn màn hình";
"HIDE_RIGHT_PANEL_DESC" = "Điều nãy sẽ khiến bạn không thể xem nội dung mô tả, bình luận, v.v ở chế độ toàn màn hình. Cần khởi động lại ứng dụng.";
"HIDE_HEATWAVES" = "Ẩn sóng nhiệt";
"HIDE_HEATWAVES_DESC" = "Ẩn Sóng nhiệt trong trình phát video. Khởi động lại ứng dụng là bắt buộc.";
"HIDE_HEATWAVES_DESC" = "Ẩn sóng nhiệt khỏi trình phát video. Cần khởi động lại ứng dụng.";
"DISABLE_AMBIENT_PORTRAIT" = "Disable Ambient Mode (Portrait)";
"DISABLE_AMBIENT_PORTRAIT_DESC" = "Disable lighting surrounding video title";
"DISABLE_AMBIENT_PORTRAIT" = "Tắt chế độ môi trường (Chân dung)";
"DISABLE_AMBIENT_PORTRAIT_DESC" = "Tắt ánh sáng xung quanh tiêu đề video";
"DISABLE_AMBIENT_FULLSCREEN" = "Disable Ambient Mode (Fullscreen)";
"DISABLE_AMBIENT_FULLSCREEN_DESC" = "Disable lighting surrouding video player";
"DISABLE_AMBIENT_FULLSCREEN" = "Tắt chế độ môi trường (Toàn màn hình)";
"DISABLE_AMBIENT_FULLSCREEN_DESC" = "Tắt ánh sáng xung quanh trình phát video";
"FULLSCREEN_TO_THE_RIGHT" = "Fullscreen to the Right";
"FULLSCREEN_TO_THE_RIGHT_DESC" = "Always enter fullscreen with home button on the right side.";
"FULLSCREEN_TO_THE_RIGHT" = "Toàn màn hình bên phải";
"FULLSCREEN_TO_THE_RIGHT_DESC" = "Luôn vào chế độ toàn màn hình với nút home ở bên phải.";
"SEEK_ANYWHERE" = "Seek Anywhere Gesture";
"SEEK_ANYWHERE_DESC" = "Hold and drag on the video player to seek. You must disable YTLite - Hold to speed";
"SEEK_ANYWHERE" = "Tua ở mọi nơi";
"SEEK_ANYWHERE_DESC" = "Giữ và kéo bất kỳ đâu trên trình phát video để tua. Bạn phải tắt tùy chỉnh YTLite - Giữ để tua";
"ENABLE_TAP_TO_SEEK" = "Enable Tap To Seek";
"ENABLE_TAP_TO_SEEK_DESC" = "Jump to anywhere in a video by single-tapping the seek bar";
"ENABLE_TAP_TO_SEEK" = "Nhấn để tua";
"ENABLE_TAP_TO_SEEK_DESC" = "Nhấn một lần vào thanh tua để tua đến bất kỳ vị trí nào trong video";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE" = "Disable pull-to-fullscreen gesture";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE_DESC" = "Disable the drag gesture to enter vertical fullscreen. Only applies to landscape videos.";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE" = "Tắt cử chỉ kéo để vào toàn màn hình";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE_DESC" = "Tắt cử chỉ kéo để vào toàn màn hình dọc. Chỉ áp dụng cho video ngang.";
"ALWAYS_USE_REMAINING_TIME" = "Always use remaining time";
"ALWAYS_USE_REMAINING_TIME_DESC" = "Change the default to show time remaining in the player bar.";
"ALWAYS_USE_REMAINING_TIME" = "Hiển thị thời gian còn lại";
"ALWAYS_USE_REMAINING_TIME_DESC" = "Luôn hiển thị thời gian còn lại trên thanh trình phát video.";
"DISABLE_TOGGLE_TIME_REMAINING" = "Disable toggle time remaining";
"DISABLE_TOGGLE_TIME_REMAINING_DESC" = "Disables changing time elapsed to time remaining. Use with other setting to always show remaining time.";
"DISABLE_TOGGLE_TIME_REMAINING" = "Tắt chuyển đổi thời gian còn lại";
"DISABLE_TOGGLE_TIME_REMAINING_DESC" = "Tắt chức năng chuyển đổi từ thời gian đã phát sang thời gian còn lại. Sử dụng với cài đặt khác để luôn hiển thị thời gian còn lại.";
"DISABLE_ENGAGEMENT_OVERLAY" = "Disable fullscreen engagement overlay";
"DISABLE_ENGAGEMENT_OVERLAY_DESC" = "Disable the swipe-up gesture and suggested videos list in fullscreen";
"DISABLE_ENGAGEMENT_OVERLAY" = "Tắt lớp phủ tương tác toàn màn hình";
"DISABLE_ENGAGEMENT_OVERLAY_DESC" = "Tắt cử chỉ vuốt lên để xem video gợi ý ở chế độ toàn màn hình";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Hide Comment previews under player";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Hide comment spoiler in comments button";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Ẩn bản xem trước bình luận dưới trình phát";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Ngăn tiết lộ nội dung bình luận trong nút bình luận";
"HIDE_AUTOPLAY_MINI_PREVIEW" = "Hide autoplay mini preview";
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "Hide the small suggested video box near the title in fullscreen";
"HIDE_AUTOPLAY_MINI_PREVIEW" = "Ẩn bản xem trước tự động phát nhỏ";
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "Ẩn hộp gợi ý video nhỏ gần tiêu đề ở chế độ toàn màn hình";
"HIDE_HUD_MESSAGES" = "Ẩn thông báo HUD";
"HIDE_HUD_MESSAGES_DESC" = "Ví dụ: Đã bật/tắt phụ đề, Tính năng phát video lặp lại đang bật,...";
"HIDE_HUD_MESSAGES_DESC" = "Ẩn các thông báo xuất hiện khi thực hiện các hành động (ví dụ: bật/tắt CC)";
"HIDE_COLLAPSE_BUTTON" = "Hide Collapse Button";
"HIDE_COLLAPSE_BUTTON_DESC" = "Hides the Arrow Collapse Button that was shown in the Top Left of the Video Player.";
"HIDE_COLLAPSE_BUTTON" = "Ẩn nút thu gọn";
"HIDE_COLLAPSE_BUTTON_DESC" = "Ẩn nút thu gọn (mũi tên) xuất hiện ở góc trái trên của trình phát Video.";
"HIDE_SPEED_TOAST" = "Hide Speed Toast";
"HIDE_SPEED_TOAST_DESC" = "Hide the 2X Speed popup when holding the player";
"HIDE_SPEED_TOAST" = "Ẩn thông báo tốc độ";
"HIDE_SPEED_TOAST_DESC" = "Ẩn thông báo tốc độ 2X khi giữ trình phát video";
// Shorts controls overlay options
"SHORTS_CONTROLS_OVERLAY_OPTIONS" = "Tùy chọn lớp phủ điều khiển quần short";
// App settings overlay options
"APP_SETTINGS_OVERLAY_OPTIONS" = "Lớp phủ cài đặt";
"HIDE_SHORTS_CHANNEL_AVATAR" = "Ẩn hình đại diện của kênh Shorts";
"HIDE_SHORTS_CHANNEL_AVATAR_DESC" = "";
"HIDE_SHORTS_LIKE_BUTTON" = "Ẩn nút thích Shorts";
"HIDE_SHORTS_LIKE_BUTTON_DESC" = "";
"HIDE_SHORTS_DISLIKE_BUTTON" = "Ẩn nút không thích Shorts";
"HIDE_SHORTS_DISLIKE_BUTTON_DESC" = "";
"HIDE_SHORTS_COMMENT_BUTTON" = "Ẩn nút bình luận Shorts";
"HIDE_SHORTS_COMMENT_BUTTON_DESC" = "";
"HIDE_SHORTS_REMIX_BUTTON" = "Ẩn nút phối lại video ngắn";
"HIDE_SHORTS_REMIX_BUTTON_DESC" = "";
"HIDE_SHORTS_SHARE_BUTTON" = "Ẩn nút chia sẻ Shorts";
"HIDE_SHORTS_SHARE_BUTTON_DESC" = "";
"HIDE_SUBSCRIPTIONS" = "Hide Subscriptions button";
"HIDE_SUBSCRIPTIONS_DESC" = "Hide Subscriptions button which shows up when paused.";
"HIDE_SUPER_THANKS" = "Ẩn biểu ngữ Mua hàng Vô cùng cảm ơn";
"HIDE_SUPER_THANKS_DESC" = "Ẩn biểu ngữ Mua hàng Vô cùng cảm ơn trong Shorts.";
"DISABLE_RESUME_TO_SHORTS" = "Vô hiệu hóa sơ yếu lý lịch cho Shorts";
"DISABLE_RESUME_TO_SHORTS_DESC" = "Nếu bạn đóng YouTube khi đang xem các video ngắn, thì các video ngắn đó sẽ không tự động phát vào lần tới khi bạn mở YouTube.";
"HIDE_ACCOUNT_SECTION" = "Ẩn cài đặt \"Chuyển đổi tài khoản\"";
"HIDE_AUTOPLAY_SECTION" = "Ẩn cài đặt \"Tự động phát\"";
"HIDE_TRYNEWFEATURES_SECTION" = "Ẩn cài đặt \"Thử các tính năng mới\"";
"HIDE_VIDEOQUALITYPREFERENCES_SECTION" = "Ẩn cài đặt \"Lựa chọn ưu tiên về chất lượng video\"";
"HIDE_NOTIFICATIONS_SECTION" = "Ẩn cài đặt \"Thông báo\"";
"HIDE_MANAGEALLHISTORY_SECTION" = "Ẩn cài đặt \"Quản lý toàn bộ nhật ký hoạt động\"";
"HIDE_YOURDATAINYOUTUBE_SECTION" = "Ẩn cài đặt \"Dữ liệu của bạn trong YouTube\"";
"HIDE_PRIVACY_SECTION" = "Ẩn cài đặt \"Quyền riêng tư\"";
"HIDE_LIVECHAT_SECTION" = "Ẩn cài đặt \"Trò chuyện trực tiếp\"";
// Theme
"THEME_OPTIONS" = "Tùy chọn chủ đề";
"THEME_OPTIONS" = "Tùy chọn giao diện";
"OLED_DARK_THEME" = "Chủ đề tối OLED (Thử nghiệm)";
"OLED_DARK_THEME_2" = "chủ đề tối OLED";
"OLED_DARK_THEME_DESC" = "Chủ đề tối thực sự. Có thể không hoạt động chính xác trong một số trường hợp. Cần phải khởi động lại ứng dụng sau khi bạn bật/tắt tùy chọn này.";
"OLED_DARK_THEME" = "Giao diện tối OLED";
"OLED_DARK_THEME_2" = "Giao diện tối OLED";
"OLED_DARK_THEME_DESC" = "Giao diện tối thực sự. Có thể không hoạt động đúng trong một số trường hợp. Cần khởi động lại ứng dụng sau khi bạn bật/tắt tùy chọn này.";
"OLD_DARK_THEME" = "Chủ đề tối cũ";
"OLD_DARK_THEME_DESC" = "Chủ đề tối cũ của YouTube (chủ đề màu xám). Khởi động lại ứng dụng là bắt buộc.";
"OLD_DARK_THEME" = "Giao diện tối cũ";
"OLD_DARK_THEME_DESC" = "Giao diện tối cũ của YouTube (giao diện xám). Cần khởi động lại ứng dụng.";
"DEFAULT_THEME" = "Vỡ nợ";
"DEFAULT_THEME_DESC" = "Chủ đề (er) tối mặc định của YouTube. Khởi động lại ứng dụng là bắt buộc.";
"DEFAULT_THEME" = "Mặc định";
"DEFAULT_THEME_DESC" = "Giao diện mặc định của YouTube. Cần khởi động lại ứng dụng.";
"OLED_KEYBOARD" = "Bàn phím OLED (Thử nghiệm)";
"OLED_KEYBOARD_DESC" = "Có thể không hoạt động chính xác trong một số trường hợp. Khởi động lại ứng dụng là bắt buộc.";
// Customization Options
"CUSTOMIZATION_OPTIONS" = "Tùy chọn tùy chỉnh";
"HIDE_MODERN_INTERFACE" = "Ẩn giao diện hiện đại (YTNoModernUI)";
"HIDE_MODERN_INTERFACE_DESC" = "Bật tính năng này để ẩn mọi Thành phần hiện đại do YouTube thêm vào. Loại bỏ Chế độ môi trường xung quanh, Thiết kế bo tròn và hơn thế nữa. Khởi động lại ứng dụng là bắt buộc.";
"HIDE_YOUTUBE_LOGO" = "Ẩn biểu trưng YouTube";
"HIDE_YOUTUBE_LOGO_DESC" = "thao tác này sẽ Ẩn Logo YouTube ở trên cùng bên trái của Giao diện. Khởi động lại ứng dụng là bắt buộc.";
"HIDE_TAB_BAR_LABELS" = "Ẩn Nhãn trong Thanh Tab";
"HIDE_TAB_BAR_LABELS_DESC" = "điều này sẽ Ẩn tất cả các nhãn trong Thanh tab. Khởi động lại ứng dụng là bắt buộc.";
"OLED_KEYBOARD" = "Bàn phím OLED";
"OLED_KEYBOARD_DESC" = "Có thể hoạt động không đúng trong một số trường hợp. Cần khởi động lại ứng dụng.";
"LOW_CONTRAST_MODE" = "Chế độ tương phản thấp";
"LOW_CONTRAST_MODE_DESC" = "điều này sẽ tạo ra các văn bản và nút có độ tương phản thấp giống như Giao diện YouTube cũ. Khởi động lại ứng dụng là bắt buộc.";
"RED_UI" = "Màu đỏ";
"RED_UI_DESC" = "Giao diện người dùng màu đỏ (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
"BLUE_UI" = "Giao diện người dùng màu xanh lam";
"BLUE_UI_DESC" = "Giao diện người dùng màu xanh lam (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
"GREEN_UI" = "Giao diện xanh";
"GREEN_UI_DESC" = "Giao diện người dùng xanh (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
"YELLOW_UI" = "Giao diện người dùng màu vàng";
"YELLOW_UI_DESC" = "Giao diện người dùng màu vàng (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
"ORANGE_UI" = "Giao diện người dùng màu cam";
"ORANGE_UI_DESC" = "Giao diện người dùng màu cam (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
"PURPLE_UI" = "Giao diện người dùng màu tím";
"PURPLE_UI_DESC" = "Giao diện người dùng màu tím (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
"PINK_UI" = "Giao diện người dùng màu hồng";
"PINK_UI_DESC" = "Giao diện người dùng màu hồng (tắt mọi màu giao diện người dùng khác) Khởi động lại ứng dụng là bắt buộc.";
"LOW_CONTRAST_MODE_DESC" = "Tùy chọn này sẽ giảm tương phản của văn bản và nút giống như giao diện YouTube cũ. Cần khởi động lại ứng dụng.";
"LCM_SELECTOR" = "Chọn chế độ tương phản thấp";
"DEFAULT_LOWCONTRASTMODE" = "(Mặc định) Chế độ tương phản thấp";
"CUSTOM_LOWCONTRASTMODE" = "(Màu tùy chỉnh) Chế độ tương phản thấp";
// Miscellaneous
"MISCELLANEOUS" = "Điều khoản khác";
"MISCELLANEOUS" = "Tùy chọn khác";
"CAST_CONFIRM" = "Xác nhận cảnh báo trước khi truyền (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Hiển thị cảnh báo xác nhận trước khi truyền để tránh vô tình chiếm quyền điều khiển TV.";
"CASTING" = "Đúc";
"MSG_ARE_YOU_SURE" = "Bạn có chắc chắn muốn bắt đầu truyền không?";
"MSG_YES" = "Đúng";
"MSG_CANCEL" = "Hủy bỏ";
"PLAYBACK_IN_FEEDS" = "Phát trong các trang danh sách video";
"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Luôn bật";
"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Chỉ Wi-Fi";
"PLAYBACK_IN_FEEDS_OFF" = "Tắt";
"DISABLE_HINTS" = "Tắt gợi ý";
"DISABLE_HINTS_DESC" = "Tắt gợi ý tính năng từ YouTube thường hiển thị khi ứng dụng mới được cài đặt.";
"NEW_SETTINGS_UI" = "Giao diện cài đặt mới";
"NEW_SETTINGS_UI_DESC" = "Nhóm các giao diện cài đặt. Một số cài đặt có thể bị ẩn";
"ENABLE_FLEX" = "Kích hoạt FLEX";
"ENABLE_FLEX_DESC" = "Bật FLEX để gỡ lỗi (không khuyến nghị). Bỏ qua điều này trừ khi bạn biết những gì bạn đang làm.";
"ENABLE_YT_STARTUP_ANIMATION" = "Hoạt ảnh khởi động YouTube";
"ENABLE_YT_STARTUP_ANIMATION_DESC" = "Hiển thị hoạt ảnh khi mở YouTube";
"FIX_GOOGLE_SIGNIN" = "Sửa lỗi Đăng nhập bằng Google (chỉ dành cho người dùng TrollStore)";
"FIX_GOOGLE_SIGNIN_DESC" = "Chỉ bật tùy chọn này khi bạn không thể đăng nhập bằng tài khoản Google của mình và ứng dụng đã được cài đặt qua TrollStore. Nếu bạn có thể đăng nhập bình thường, hãy tắt nó đi. Khởi động lại ứng dụng là bắt buộc.";
"HIDE_CHIP_BAR" = "Ẩn thanh trên";
"HIDE_CHIP_BAR_DESC" = "Ẩn thanh trên trong nguồn cấp dữ liệu Trang chủ (Xu hướng, Âm nhạc, Trò chơi...) và nguồn cấp dữ liệu Đăng ký (Tất cả video, Tiếp tục xem...).";
"NEW_MINIPLAYER_STYLE" = "Phong cách thanh người chơi mini mới (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "";
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Thay nút Previous và Next";
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Thay thế nút Trước và Tiếp theo bằng nút Tua đi và Tua lại. Khởi động lại ứng dụng là bắt buộc.";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Ẩn nút Trước và Tiếp theo";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Ẩn nút Trước đó và Tiếp theo trong lớp phủ điều khiển video.";
"HIDE_SHORTS_VIDEOS" = "Ẩn video ngắn";
"HIDE_SHORTS_VIDEOS_DESC" = "Ẩn video ngắn trong Trang chủ, được đề xuất...";
"HIDE_CERCUBE_BUTTON" = "Ẩn nút Cercube trong thanh Điều hướng";
"HIDE_CERCUBE_BUTTON_DESC" = "";
"HIDE_CERCUBE_PIP_BUTTON" = "Ẩn nút PiP của Cercube";
"HIDE_CERCUBE_PIP_BUTTON_DESC" = "Ẩn nút PiP của Cercube trong lớp phủ điều khiển video.";
"HIDE_CERCUBE_DOWNLOAD_BUTTON" = "Ẩn nút Tải xuống của Cercube";
"HIDE_CERCUBE_DOWNLOAD_BUTTON_DESC" = "Tùy chọn ẩn nút Tải xuống của Cercube đã được bật theo mặc định. bởi vì hiện tại bạn không thể tải xuống bất kỳ thứ gì vì Máy chủ tải xuống của Cercube đã biến mất.";
"HIDE_CAST_BUTTON" = "Ẩn nút Truyền";
"HIDE_CAST_BUTTON_DESC" = "Khởi động lại ứng dụng là bắt buộc.";
"HIDE_HOVER_CARD" = "Ẩn thẻ di chuột trên Màn hình kết thúc (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Ẩn màn hình kết thúc (hình thu nhỏ) của người tạo ở cuối video.";
"HIDE_RIGHT_PANEL" = "Ẩn bảng điều khiển bên phải ở chế độ toàn màn hình";
"HIDE_RIGHT_PANEL_DESC" = "Khởi động lại ứng dụng là bắt buộc.";
"HIDE_SUBTITLES_BUTTON" = "Ẩn nút phụ đề";
"HIDE_SUBTITLES_BUTTON_DESC" = "Ẩn nút Phụ đề trong lớp phủ điều khiển video.";
"HIDE_AUTOPLAY_SWITCH" = "Ẩn công tắc Tự động phát";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Ẩn công tắc Tự động phát trong lớp phủ điều khiển video.";
"AUTO_FULLSCREEN" = "Tự động toàn màn hình(YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Tự động phát video ở chế độ toàn màn hình.";
"HIDE_HUD_MESSAGES" = "Ẩn tin nhắn HUD";
"HIDE_HUD_MESSAGES_DESC" = "Ví dụ: Bật/tắt CC, Bật vòng lặp video,...";
"HIDE_PAID_PROMOTION_CARDS" = "Ẩn thẻ Khuyến mại trả phí";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Ẩn thẻ Bao gồm quảng cáo trả phí trong một số video.";
"HIDE_NOTIFICATION_BUTTON" = "Ẩn nút Thông báo trong thanh Điều hướng";
"HIDE_NOTIFICATION_BUTTON_DESC" = "";
"YT_RE_EXPLORE" = "Thay thế tab Shorts bằng tab Khám phá (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "Khởi động lại ứng dụng là bắt buộc.";
"HIDE_MODERN_INTERFACE" = "Giao diện YouTube cũ";
"HIDE_MODERN_INTERFACE_DESC" = "Đưa giao diện cũ của YouTube trở lại từ phiên bản v17.38.10. Loại bỏ một số yếu tố bo tròn, chế độ môi trường, và các tính năng hiện đại khác. Cần khởi động lại ứng dụng.";
"IPAD_LAYOUT" = "Bố cục iPad";
"IPAD_LAYOUT_DESC" = "Chỉ sử dụng tùy chọn này nếu bạn muốn tải Bố cục iPad trên iPhone/iPod hiện tại của mình. Khởi động lại ứng dụng là bắt buộc.";
"IPAD_LAYOUT_DESC" = "Chỉ sử dụng nếu muốn có bố cục iPad trên iPhone/iPod của mình. Cần khởi động lại ứng dụng.";
"IPHONE_LAYOUT" = "Bố cục iPhone";
"IPHONE_LAYOUT_DESC" = "Chỉ sử dụng tùy chọn này nếu bạn muốn tải Bố cục iPhone trên iPad hiện tại của mình. Khởi động lại ứng dụng là bắt buộc.";
"IPHONE_LAYOUT_DESC" = "Chỉ sử dụng nếu muốn có bố cục iPhone trên iPad của mình. Cần khởi động lại ứng dụng.";
"CHANGE_APP_ICON" = "Change App Icon";
"CAST_CONFIRM" = "Xác nhận trước khi truyền";
"CAST_CONFIRM_DESC" = "Hiển thị thông báo xác nhận trước khi truyền.";
"CASTING" = "Truyền";
"MSG_ARE_YOU_SURE" = "Bạn có chắc chắn muốn bắt đầu truyền không?";
"MSG_YES" = "Có";
"MSG_CANCEL" = "Không";
// Newly added strings
"APP_RESTART_DESC": "Mô tả khi khởi động lại ứng dụng",
"CUSTOM_LOWCONTRASTMODE": "Chế độ độ tương phản thấp tùy chỉnh",
"APP_VERSION_SPOOFER_LITE": "Phiên bản giả lập ứng dụng nhẹ",
"PLAYBACK_IN_FEEDS_OFF": "Tắt phát trong các trang danh sách video",
"PLAYBACK_IN_FEEDS": "Phát trong các trang danh sách video",
"ENABLE_SHARE_BUTTON_DESC": "Mô tả nút chia sẻ",
"ENABLE_SAVE_TO_PLAYLIST_BUTTON": "Bật nút lưu vào danh sách phát",
"LCM_SELECTOR": "Trình chọn chế độ độ tương phản thấp",
"NEW_SETTINGS_UI_DESC": "Mô tả giao diện cài đặt mới",
"VERSION_SPOOFER_TITLE": "Tiêu đề giả lập phiên bản",
"HIDE_SPONSORBLOCK_BUTTON": "Ẩn nút SponsorBlock",
"ENABLE_SHARE_BUTTON": "Bật nút chia sẻ",
"ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC": "Mô tả nút lưu vào danh sách phát",
"HIDE_SHADOW_OVERLAY_BUTTONS": "Ẩn các nút lớp phủ bóng",
"APP_VERSION_SPOOFER_LITE_DESC": "Mô tả phiên bản giả lập ứng dụng nhẹ",
"DEFAULT_LOWCONTRASTMODE": "Chế độ độ tương phản thấp mặc định",
"APP_SETTINGS_OVERLAY_OPTIONS": "Tùy chọn lớp phủ cài đặt ứng dụng",
"HIDE_HOME_TAB_DESC": "Mô tả ẩn tab Trang chủ",
"PLAYBACK_IN_FEEDS_ALWAYS_ON": "Luôn bật phát trong các trang danh sách video",
"FIX_CASTING": "Sửa lỗi truyền phát",
"FIX_CASTING_DESC": "Mô tả sửa lỗi truyền phát",
"PLAYBACK_IN_FEEDS_WIFI_ONLY": "Phát trong các trang danh sách video chỉ qua WiFi",
"NEW_MINIPLAYER_STYLE_DESC": "Mô tả kiểu trình phát nhỏ mới",
"NEW_SETTINGS_UI": "Giao diện cài đặt mới",
"HIDE_HOME_TAB": "Ẩn tab Trang chủ",
"HIDE_SHADOW_OVERLAY_BUTTONS_DESC": "Mô tả ẩn các nút lớp phủ bóng",
"ENABLE_YT_STARTUP_ANIMATION": "Bật hoạt ảnh khởi động YouTube"
"NEW_MINIPLAYER_STYLE" = Trình phát thu nhỏ kiểu mới";
"NEW_MINIPLAYER_STYLE_DESC" = "Thay thế trình phát thu nhỏ mặc định thành (BigYTMiniPlayer). Cần khởi động lại ứng dụng.";
"HIDE_CAST_BUTTON" = "Ẩn nút truyền";
"HIDE_CAST_BUTTON_DESC" = "Cần khởi động lại ứng dụng.";
"VIDEO_PLAYER_BUTTON" = "Nút Trình phát video";
"VIDEO_PLAYER_BUTTON_DESC" = "Hiển thị nút trong thanh điều hướng để mở video đã tải xuống trong trình phát Apple";
"HIDE_SPONSORBLOCK_BUTTON" = "Ẩn nút iSponsorBlock";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "Ẩn cài đặt iSponsorBlock trên thanh điều hướng";
"HIDE_HOME_TAB" = "Ẩn tab Trang chủ";
"HIDE_HOME_TAB_DESC" = "Hãy cẩn thận khi ẩn tất cả các tab";
"FIX_CASTING" = "Sửa truyền";
"FIX_CASTING_DESC" = "Thay đổi một số cờ AB để sửa truyền";
"ENABLE_FLEX" = "Bật FLEX";
"ENABLE_FLEX_DESC" = "Bật FLEX để gỡ lỗi (không khuyến khích). Để tùy chọn này tắt trừ khi bạn biết rõ bạn đang làm gì.";
// Version Spoofer
"APP_VERSION_SPOOFER_LITE" = "Giả mạo phiên bản ứng dụng (Lite)";
"APP_VERSION_SPOOFER_LITE_DESC" = "Bật tính năng này để làm giả phiên bản YouTube (Lite). Chọn phiên bản bạn ưa thích bên dưới. Cần khởi động lại ứng dụng.";
"VERSION_SPOOFER_TITLE" = "Chọn phiên bản giả mạo";
// Other Localization
"APP_RESTART_DESC" = "Cần khởi động lại ứng dụng.";
"CHANGE_APP_ICON" = "Đổi biểu tượng ứng dụng";

View file

@ -0,0 +1,194 @@
// Settings
"VERSION" = "YTLitePlus版本: %@";
"VERSION_CHECK" = "点击检查更新!";
"COPY_SETTINGS" = "复制设置";
"COPY_SETTINGS_DESC" = "将当前所有设置复制到剪贴板";
"PASTE_SETTINGS" = "粘贴设置";
"PASTE_SETTINGS_DESC" = "从剪贴板粘贴设置并应用";
"PASTE_SETTINGS_ALERT" = "应用剪贴板中的设置?";
"EXPORT_SETTINGS" = "导出设置";
"EXPORT_SETTINGS_DESC" = "将当前所有设置导出为txt文件";
"IMPORT_SETTINGS" = "导入设置";
"IMPORT_SETTINGS_DESC" = "从txt文件导入设置";
"REPLACE_COPY_AND_PASTE_BUTTONS" = "替换「复制设置」和「粘贴设置」按钮";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "将按钮替换为「导出设置」和「导入设置」";
"VIDEO_PLAYER" = "视频播放器(测试版)";
"VIDEO_PLAYER_DESC" = "使用系统自带播放器打开下载的视频";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "启用播放器手势";
"VOLUME" = "音量";
"BRIGHTNESS" = "亮度";
"SEEK" = "快进";
"DISABLED" = "禁用";
"DEADZONE" = "盲区";
"DEADZONE_DESC" = "识别手势前需要移动的最小距离";
"SENSITIVITY" = "灵敏度";
"SENSITIVITY_DESC" = "对音量和亮度手势的倍数";
"PLAYER_GESTURES_TITLE" = "播放器手势";
"PLAYER_GESTURES_DESC" = "配置播放器的水平滑动手势";
"TOP_SECTION" = "顶部区域";
"MIDDLE_SECTION" = "中间区域";
"BOTTOM_SECTION" = "底部区域";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "启用触觉反馈";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "视频控件覆盖选项";
"ENABLE_SHARE_BUTTON" = "启用分享按钮";
"ENABLE_SHARE_BUTTON_DESC" = "在播放器覆盖按钮区域中启用分享按钮";
"ENABLE_SAVE_TO_PLAYLIST_BUTTON" = "启用「保存到播放列表」按钮";
"ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC" = "在播放器覆盖按钮区域中启用「保存到播放列表」按钮";
"HIDE_SHADOW_OVERLAY_BUTTONS" = "隐藏按钮阴影效果";
"HIDE_SHADOW_OVERLAY_BUTTONS_DESC" = "隐藏播放/暂停、上一个、下一个、前进和后退按钮上的阴影效果";
"HIDE_RIGHT_PANEL" = "隐藏全屏模式中的右侧面板";
"HIDE_RIGHT_PANEL_DESC" = "需要重启应用";
"HIDE_HEATWAVES" = "隐藏Heatwaves";
"HIDE_HEATWAVES_DESC" = "隐藏视频播放器中的Heatwaves需要重启应用";
"DISABLE_AMBIENT_PORTRAIT" = "禁用环境模式(纵向)";
"DISABLE_AMBIENT_PORTRAIT_DESC" = "禁用视频标题周围的光效";
"DISABLE_AMBIENT_FULLSCREEN" = "禁用环境模式(全屏)";
"DISABLE_AMBIENT_FULLSCREEN_DESC" = "禁用视频播放器周围的光效";
"FULLSCREEN_TO_THE_RIGHT" = "全屏向右";
"FULLSCREEN_TO_THE_RIGHT_DESC" = "进入全屏时始终使主页按钮在右侧";
"SEEK_ANYWHERE" = "任意位置快进手势";
"SEEK_ANYWHERE_DESC" = "按住并拖动视频播放器以快进您必须禁用YTLite的「Hold to speed按住加速」功能";
"ENABLE_TAP_TO_SEEK" = "启用点击快进";
"ENABLE_TAP_TO_SEEK_DESC" = "通过单击进度条跳转到视频的任意位置";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE" = "禁用拉动全屏手势";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE_DESC" = "禁用拖动手势进入垂直全屏,仅适用于横向视频";
"ALWAYS_USE_REMAINING_TIME" = "始终使用剩余时间";
"ALWAYS_USE_REMAINING_TIME_DESC" = "将默认设置为在播放器栏中显示剩余时间";
"DISABLE_TOGGLE_TIME_REMAINING" = "禁用切换剩余时间";
"DISABLE_TOGGLE_TIME_REMAINING_DESC" = "禁用将已用时间更改为剩余时间,与其他设置一起使用以始终显示剩余时间";
"DISABLE_ENGAGEMENT_OVERLAY" = "禁用全屏参与覆盖";
"DISABLE_ENGAGEMENT_OVERLAY_DESC" = "禁用上滑手势和全屏模式中的建议视频列表";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "隐藏播放器下方的评论预览";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "隐藏评论按钮中的评论预览";
"HIDE_AUTOPLAY_MINI_PREVIEW" = "隐藏自动播放迷你预览";
"HIDE_AUTOPLAY_MINI_PREVIEW_DESC" = "隐藏全屏模式下标题附近的小型建议视频框";
"HIDE_HUD_MESSAGES" = "隐藏HUD消息";
"HIDE_HUD_MESSAGES_DESC" = "隐藏某些操作(如开启/关闭字幕)时显示的通知";
"HIDE_COLLAPSE_BUTTON" = "隐藏折叠按钮";
"HIDE_COLLAPSE_BUTTON_DESC" = "隐藏显示在视频播放器左上角的箭头折叠按钮";
"HIDE_SPEED_TOAST" = "隐藏速度提示";
"HIDE_SPEED_TOAST_DESC" = "隐藏按住播放器时显示的2X速度弹窗";
// App settings overlay options
"APP_SETTINGS_OVERLAY_OPTIONS" = "隐藏设置中的选项";
"HIDE_ACCOUNT_SECTION" = "隐藏「帐户」";
"HIDE_AUTOPLAY_SECTION" = "隐藏「自动播放」";
"HIDE_TRYNEWFEATURES_SECTION" = "隐藏「试用新功能」";
"HIDE_VIDEOQUALITYPREFERENCES_SECTION" = "隐藏「视频画质偏好」";
"HIDE_NOTIFICATIONS_SECTION" = "隐藏「通知」";
"HIDE_MANAGEALLHISTORY_SECTION" = "隐藏「管理所有历史记录」";
"HIDE_YOURDATAINYOUTUBE_SECTION" = "隐藏「YouTube个人数据管理」";
"HIDE_PRIVACY_SECTION" = "隐藏「隐私设置」";
"HIDE_LIVECHAT_SECTION" = "隐藏「实时聊天」";
// Theme
"THEME_OPTIONS" = "主题选项";
"OLED_DARK_THEME" = "OLED暗色主题";
"OLED_DARK_THEME_2" = "OLED暗色主题";
"OLED_DARK_THEME_DESC" = "真正的暗色主题,在某些情况下可能无法正常工作,启用/禁用此选项后需要重启应用";
"OLD_DARK_THEME" = "旧暗色主题";
"OLD_DARK_THEME_DESC" = "旧版YouTube的暗色主题(灰色主题),启用后需要重启应用";
"DEFAULT_THEME" = "默认";
"DEFAULT_THEME_DESC" = "YouTube的默认深色主题启用后需要重启应用";
"OLED_KEYBOARD" = "OLED键盘";
"OLED_KEYBOARD_DESC" = "在某些情况下可能无法正常工作,启用后需要重启应用";
"LOW_CONTRAST_MODE" = "低对比度模式";
"LOW_CONTRAST_MODE_DESC" = "此选项将降低文本和按钮的对比度就像旧的YouTube界面一样启用后需要重启应用";
"LCM_SELECTOR" = "低对比度模式选择";
"DEFAULT_LOWCONTRASTMODE" = "(默认) 低对比度模式";
"CUSTOM_LOWCONTRASTMODE" = "(自定义颜色) 低对比度模式";
// Miscellaneous
"MISCELLANEOUS" = "其它";
"PLAYBACK_IN_FEEDS" = "Feeds后台播放";
"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "始终开启";
"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "仅限Wi-Fi";
"PLAYBACK_IN_FEEDS_OFF" = "关闭";
"NEW_SETTINGS_UI" = "新的设置界面";
"NEW_SETTINGS_UI_DESC" = "使用新的分组设置界面,可能会隐藏某些设置";
"ENABLE_YT_STARTUP_ANIMATION" = "启用YouTube启动动画";
"ENABLE_YT_STARTUP_ANIMATION_DESC" = "";
"HIDE_MODERN_INTERFACE" = "禁用现代YouTube界面(YTNoModernUI)";
"HIDE_MODERN_INTERFACE_DESC" = "这会将YouTube应用恢复到v17.38.10之前的传统设计,此操作还会移除某些圆角元素、环境模式和其他现代功能,启用后需要重启应用";
"IPAD_LAYOUT" = "iPad 布局";
"IPAD_LAYOUT_DESC" = "仅当您希望在当前的 iPhone/iPod 上使用 iPad 布局时使用,需要重新启动应用程序";
"IPHONE_LAYOUT" = "iPhone 布局";
"IPHONE_LAYOUT_DESC" = "仅当您希望在当前的 iPad 上使用 iPhone 布局时使用,需要重新启动应用程序";
"CAST_CONFIRM" = "投屏前确认警告 (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "投屏前显示确认警告,以防止意外劫持电视";
"CASTING" = "投屏";
"MSG_ARE_YOU_SURE" = "您确定要开始投屏吗?";
"MSG_YES" = "确定";
"MSG_CANCEL" = "取消";
"NEW_MINIPLAYER_STYLE" = "新的迷你播放器样式 (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "需要重新启动应用程序";
"HIDE_CAST_BUTTON" = "隐藏投屏按钮";
"HIDE_CAST_BUTTON_DESC" = "需要重新启动应用程序";
"VIDEO_PLAYER_BUTTON" = "视频播放器按钮";
"VIDEO_PLAYER_BUTTON_DESC" = "在导航栏中显示按钮,以便在系统自带播放器中打开已下载的视频";
"HIDE_SPONSORBLOCK_BUTTON" = "隐藏导航栏中的 iSponsorBlock 按钮";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";
"HIDE_HOME_TAB" = "隐藏首页标签栏";
"HIDE_HOME_TAB_DESC" = "隐藏所有标签栏时请小心";
"FIX_CASTING" = "修复投屏";
"FIX_CASTING_DESC" = "更改一些 AB 标志以修复投屏功能";
"ENABLE_FLEX" = "启用 FLEX";
"ENABLE_FLEX_DESC" = "启用 FLEX 进行调试(不推荐),除非您了解操作,否则请保持关闭状态";
// Version Spoofer
"APP_VERSION_SPOOFER_LITE" = "修改应用程序版本";
"APP_VERSION_SPOOFER_LITE_DESC" = "要修改YouTube版本请在下方选择您偏好的版本号重新启动应用程序生效";
"VERSION_SPOOFER_TITLE" = "版本选择器";
// Other Localization
"APP_RESTART_DESC" = "需要重新启动应用程序";
"CHANGE_APP_ICON" = "更改应用程序图标";

View file

@ -7,6 +7,7 @@
"COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
"PASTE_SETTINGS" = "Paste Settings";
"PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
"PASTE_SETTINGS_ALERT" = "Apply settings from clipboard?";
"EXPORT_SETTINGS" = "Export Settings";
"EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
"IMPORT_SETTINGS" = "Import Settings";
@ -14,6 +15,26 @@
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
"VIDEO_PLAYER" = "Video Player (Beta)";
"VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player";
// Player Gestures
"PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures";
"VOLUME" = "Volume";
"BRIGHTNESS" = "Brightness";
"SEEK" = "Seek";
"DISABLED" = "Disabled";
"DEADZONE" = "Deadzone";
"DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized";
"SENSITIVITY" = "Sensitivity";
"SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures";
"PLAYER_GESTURES_TITLE" = "Player Gestures";
"PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player";
"TOP_SECTION" = "Top Section";
"MIDDLE_SECTION" = "Middle Section";
"BOTTOM_SECTION" = "Bottom Section";
"PLAYER_GESTURES_HAPTIC_FEEDBACK" = "Enable Haptic Feedback";
// Video controls overlay options
"VIDEO_CONTROLS_OVERLAY_OPTIONS" = "影片區覆蓋按鈕設定";
@ -145,6 +166,9 @@
"HIDE_CAST_BUTTON" = "隱藏投放按鈕";
"HIDE_CAST_BUTTON_DESC" = "重新啟動應用程式以套用變更。";
"VIDEO_PLAYER_BUTTON" = "Video Player Button";
"VIDEO_PLAYER_BUTTON_DESC" = "Show a button in the navigation bar to open downloaded videos in the Apple player";
"HIDE_SPONSORBLOCK_BUTTON" = "隱藏 iSponsorBlock 按鈕";
"HIDE_SPONSORBLOCK_BUTTON_DESC" = "";