add: ReZygisk WebUI (#73)
This commit adds the ReZygisk WebUI to ReZygisk. Signed-off-by: Emulond Argent <108662981+Emulond@users.noreply.github.com> Signed-off-by: WinCS <94188592+Meltartica@users.noreply.github.com> Signed-off-by: Pedro.js <pedroolimpioguerra@gmail.com> Signed-off-by: unexpected unresolved <minh15052008@gmail.com> Signed-off-by: SheepChef <50871867+SheepChef@users.noreply.github.com> Signed-off-by: AJleKcAHgP68 <78802768+AJleKcAHgP68@users.noreply.github.com> Signed-off-by: Blazzycrafter <39300111+Blazzycrafter@users.noreply.github.com> Signed-off-by: Igor <sorocean.igor@gmail.com> Signed-off-by: unexpected unresolved <xeondev@xeondex.onmicrosoft.com> Signed-off-by: Kirill Kuznetsov <kdevlab@yandex.ru> Signed-off-by: Lucky Kiddos <95188840+GuitarHeroStyles@users.noreply.github.com> Signed-off-by: Kitty <73357005+Kittyskj@users.noreply.github.com> Signed-off-by: GhostFRR <ghost.game.fr@gmail.com> Signed-off-by: Alice w/🌧️ <rainyxeon@gmail.com> Signed-off-by: ZGX089ッ <159061718+ZG089@users.noreply.github.com> Signed-off-by: thasave14 <93542339+thasave14@users.noreply.github.com> Co-authored-by: ThePedroo <pedroolimpioguerra@gmail.com> Co-authored-by: ExtremeXT <75576145+ExtremeXT@users.noreply.github.com> Co-authored-by: Emulond Argent <108662981+Emulond@users.noreply.github.com> Co-authored-by: RainyXeon <xeondev@xeondex.onmicrosoft.com> Co-authored-by: Fyphen <fyphensub@gmail.com> Co-authored-by: WinCS <94188592+Meltartica@users.noreply.github.com> Co-authored-by: CaptainThrowback <captainthrowback@hotmail.com> Co-authored-by: Kirill Kuznetsov <kdevlab@yandex.ru> Co-authored-by: SheepChef <50871867+SheepChef@users.noreply.github.com> Co-authored-by: AJleKcAHgP68 <78802768+AJleKcAHgP68@users.noreply.github.com> Co-authored-by: Blazzycrafter <39300111+Blazzycrafter@users.noreply.github.com> Co-authored-by: Igor <sorocean.igor@gmail.com> Co-authored-by: Berlian Panca <53902591+bpanca05@users.noreply.github.com> Co-authored-by: Willow Hayley Lovelace <65596971+dyingwillow@users.noreply.github.com> Co-authored-by: witch <witch@dyingwillow.dev> Co-authored-by: Lucky Kiddos <95188840+GuitarHeroStyles@users.noreply.github.com> Co-authored-by: Kitty <73357005+Kittyskj@users.noreply.github.com> Co-authored-by: GhostFRR <ghost.game.fr@gmail.com> Co-authored-by: ZGX089ッ <159061718+ZG089@users.noreply.github.com> Co-authored-by: thasave14 <93542339+thasave14@users.noreply.github.com> Co-authored-by: Flopster101 <nahuelgomez329@gmail.com> Co-authored-by: Lxchoooo <155797099+Lxchoooo@users.noreply.github.com>
22
TRANSLATOR.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# 🌎 Translators
|
||||
- **ar_EG** by [@ZG089](https://github.com/ZG089)
|
||||
- **de_DE** by [@Blazzycrafer](https://github.com/Blazzycrafter)
|
||||
- **en_US** by [@PerformanC (The PerformanC Organization)](https://github.com/PerformanC)
|
||||
- **es_AR** by [@Flopster101](https://github.com/Flopster101)
|
||||
- **es_ES** by [@LuchoModzzz](https://github.com/Lxchoooo)
|
||||
- **es_MX** by [@LuchoModzzz](https://github.com/Lxchoooo)
|
||||
- **fr_FR** by [@GhostFRR](https://github.com/GhostFRR)
|
||||
- **ja_JP** by [@Fyphen1223](https://github.com/Fyphen1223)
|
||||
- **id_ID** by [@bpanca05](https://github.com/bpanca05) & [@LuckyKiddos](https://github.com/GuitarHeroStyles)
|
||||
- **it_IT** by [@thasave14](https://github.com/thasave14)
|
||||
- **pt_BR** by [@ThePedroo](https://github.com/ThePedroo)
|
||||
- **ro_RO** by [@ExtremeXT](https://github.com/ExtremeXT)
|
||||
- **ru_RU** by [@Emulond](https://github.com/Emulond) & [@AJleKcAHgP68](https://github.com/AJleKcAHgP68)
|
||||
- **tr_TR** by [@dyingwillow](https://github.com/dyingwillow)
|
||||
- **uk_UA** by [@Kittyskj](https://github.com/Kittyskj)
|
||||
- **vi_VN** by [@RainyXeon](https://github.com/RainyXeon)
|
||||
- **zh_CN** by [@Meltartica](https://github.com/Meltartica) & [@SheepChef](https://github.com/SheepChef)
|
||||
- **zh_TW** by [@Meltartica](https://github.com/Meltartica)
|
||||
|
||||
> [!NOTE]
|
||||
> Want to add your translation? Go to [Crowdin](https://crowdin.com/project/rezygisk) and translate!
|
||||
@@ -85,6 +85,9 @@ androidComponents.onVariants { variant ->
|
||||
into("lib") {
|
||||
from(project(":loader").layout.buildDirectory.file("intermediates/stripped_native_libs/$variantLowered/out/lib"))
|
||||
}
|
||||
into("webroot") {
|
||||
from("${rootProject.projectDir}/webroot")
|
||||
}
|
||||
|
||||
val root = moduleDir.get()
|
||||
|
||||
@@ -143,6 +146,7 @@ androidComponents.onVariants { variant ->
|
||||
root.file("bin/$abi/zygiskd").asFile
|
||||
)
|
||||
)
|
||||
|
||||
sig.initSign(privKey)
|
||||
set.forEach { it.first.sha(it.second) }
|
||||
val signFile = root.file(name).asFile
|
||||
|
||||
@@ -107,6 +107,10 @@ extract "$ZIPFILE" 'uninstall.sh' "$MODPATH"
|
||||
mv "$TMPDIR/sepolicy.rule" "$MODPATH"
|
||||
|
||||
mkdir "$MODPATH/bin"
|
||||
mkdir "$MODPATH/webroot"
|
||||
|
||||
ui_print "- Extracting webroot"
|
||||
unzip -o "$ZIPFILE" "webroot/*" -x "*.sha256" -d "$MODPATH"
|
||||
|
||||
CPU_ABIS=$(getprop ro.product.cpu.abilist)
|
||||
|
||||
|
||||
661
webroot/LICENSE
Normal file
@@ -0,0 +1,661 @@
|
||||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 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 Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are 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.
|
||||
|
||||
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.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
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 Affero 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. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
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 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 work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU Affero 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 Affero 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 Affero 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 Affero 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 Affero 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 Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero 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 your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
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 AGPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
1
webroot/assets/action.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M240-160q-33 0-56.5-23.5T160-240q0-33 23.5-56.5T240-320q33 0 56.5 23.5T320-240q0 33-23.5 56.5T240-160Zm240 0q-33 0-56.5-23.5T400-240q0-33 23.5-56.5T480-320q33 0 56.5 23.5T560-240q0 33-23.5 56.5T480-160Zm240 0q-33 0-56.5-23.5T640-240q0-33 23.5-56.5T720-320q33 0 56.5 23.5T800-240q0 33-23.5 56.5T720-160ZM240-400q-33 0-56.5-23.5T160-480q0-33 23.5-56.5T240-560q33 0 56.5 23.5T320-480q0 33-23.5 56.5T240-400Zm240 0q-33 0-56.5-23.5T400-480q0-33 23.5-56.5T480-560q33 0 56.5 23.5T560-480q0 33-23.5 56.5T480-400Zm240 0q-33 0-56.5-23.5T640-480q0-33 23.5-56.5T720-560q33 0 56.5 23.5T800-480q0 33-23.5 56.5T720-400ZM240-640q-33 0-56.5-23.5T160-720q0-33 23.5-56.5T240-800q33 0 56.5 23.5T320-720q0 33-23.5 56.5T240-640Zm240 0q-33 0-56.5-23.5T400-720q0-33 23.5-56.5T480-800q33 0 56.5 23.5T560-720q0 33-23.5 56.5T480-640Zm240 0q-33 0-56.5-23.5T640-720q0-33 23.5-56.5T720-800q33 0 56.5 23.5T800-720q0 33-23.5 56.5T720-640Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
1
webroot/assets/back.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="36px" viewBox="0 -960 960 960" width="36px" fill="#e8eaed"><path d="m287-446.67 240 240L480-160 160-480l320-320 47 46.67-240 240h513v66.66H287Z"/></svg>
|
||||
|
After Width: | Height: | Size: 200 B |
1
webroot/assets/close.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="40px" viewBox="0 -960 960 960" width="40px" fill="#e8eaed"><path d="m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z"/></svg>
|
||||
|
After Width: | Height: | Size: 222 B |
1
webroot/assets/content.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="40px" viewBox="0 -960 960 960" width="40px" fill="#e8eaed"><path d="M320-213.33q-27 0-46.83-19.84Q253.33-253 253.33-280v-533.33q0-27 19.84-46.84Q293-880 320-880h413.33q27 0 46.84 19.83Q800-840.33 800-813.33V-280q0 27-19.83 46.83-19.84 19.84-46.84 19.84H320Zm0-66.67h413.33v-533.33H320V-280ZM186.67-80q-27 0-46.84-19.83Q120-119.67 120-146.67v-600h66.67v600h480V-80h-480ZM320-280v-533.33V-280Z"/></svg>
|
||||
|
After Width: | Height: | Size: 448 B |
1
webroot/assets/delete.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="40px" viewBox="0 -960 960 960" width="40px" fill="#e8eaed"><path d="M267.33-120q-27.5 0-47.08-19.58-19.58-19.59-19.58-47.09V-740H160v-66.67h192V-840h256v33.33h192V-740h-40.67v553.33q0 27-19.83 46.84Q719.67-120 692.67-120H267.33Zm425.34-620H267.33v553.33h425.34V-740Zm-328 469.33h66.66v-386h-66.66v386Zm164 0h66.66v-386h-66.66v386ZM267.33-740v553.33V-740Z"/></svg>
|
||||
|
After Width: | Height: | Size: 411 B |
1
webroot/assets/ec-icon.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="60px" viewBox="0 -960 960 960" width="60px" fill="#ba1a1a"><path d="M92-120q-9 0-15.65-4.13Q69.7-128.25 66-135q-4.17-6.6-4.58-14.3Q61-157 66-165l388-670q5-8 11.5-11.5T480-850q8 0 14.5 3.5T506-835l388 670q5 8 4.58 15.7-.41 7.7-4.58 14.3-3.7 6.75-10.35 10.87Q877-120 868-120H92Zm392.18-117q12.82 0 21.32-8.68 8.5-8.67 8.5-21.5 0-12.82-8.68-21.32-8.67-8.5-21.5-8.5-12.82 0-21.32 8.68-8.5 8.67-8.5 21.5 0 12.82 8.68 21.32 8.67 8.5 21.5 8.5Zm0-111q12.82 0 21.32-8.63 8.5-8.62 8.5-21.37v-164q0-12.75-8.68-21.38-8.67-8.62-21.5-8.62-12.82 0-21.32 8.62-8.5 8.63-8.5 21.38v164q0 12.75 8.68 21.37 8.67 8.63 21.5 8.63Z"/></svg>
|
||||
|
After Width: | Height: | Size: 663 B |
1
webroot/assets/error.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm-40-160h80v-240h-80v240Zm40 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>
|
||||
|
After Width: | Height: | Size: 537 B |
1
webroot/assets/expand.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="m480-340 180-180-57-56-123 123-123-123-57 56 180 180Zm0 260q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>
|
||||
|
After Width: | Height: | Size: 462 B |
1
webroot/assets/home.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M240-200h120v-240h240v240h120v-360L480-740 240-560v360Zm-80 80v-480l320-240 320 240v480H520v-240h-80v240H160Zm320-350Z"/></svg>
|
||||
|
After Width: | Height: | Size: 243 B |
1
webroot/assets/mark.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q54 0 104-17.5t92-50.5L228-676q-33 42-50.5 92T160-480q0 134 93 227t227 93Zm252-124q33-42 50.5-92T800-480q0-134-93-227t-227-93q-54 0-104 17.5T284-732l448 448Z"/></svg>
|
||||
|
After Width: | Height: | Size: 476 B |
1
webroot/assets/module.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M627-520h133v-160H627v160Zm-214 0h133v-160H413v160Zm-213 0h133v-160H200v160Zm0 240h133v-160H200v160Zm213 0h133v-160H413v160Zm214 0h133v-160H627v160Zm-507 0v-400q0-33 23.5-56.5T200-760h560q33 0 56.5 23.5T840-680v400q0 33-23.5 56.5T760-200H200q-33 0-56.5-23.5T120-280Z"/></svg>
|
||||
|
After Width: | Height: | Size: 391 B |
1
webroot/assets/settings.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="m370-80-16-128q-13-5-24.5-12T307-235l-119 50L78-375l103-78q-1-7-1-13.5v-27q0-6.5 1-13.5L78-585l110-190 119 50q11-8 23-15t24-12l16-128h220l16 128q13 5 24.5 12t22.5 15l119-50 110 190-103 78q1 7 1 13.5v27q0 6.5-2 13.5l103 78-110 190-118-50q-11 8-23 15t-24 12L590-80H370Zm70-80h79l14-106q31-8 57.5-23.5T639-327l99 41 39-68-86-65q5-14 7-29.5t2-31.5q0-16-2-31.5t-7-29.5l86-65-39-68-99 42q-22-23-48.5-38.5T533-694l-13-106h-79l-14 106q-31 8-57.5 23.5T321-633l-99-41-39 68 86 64q-5 15-7 30t-2 32q0 16 2 31t7 30l-86 65 39 68 99-42q22 23 48.5 38.5T427-266l13 106Zm42-180q58 0 99-41t41-99q0-58-41-99t-99-41q-59 0-99.5 41T342-480q0 58 40.5 99t99.5 41Zm-2-140Z"/></svg>
|
||||
|
After Width: | Height: | Size: 771 B |
3
webroot/assets/tick.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg class="brightc" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed">
|
||||
<path d="m424-296 282-282-56-56-226 226-114-114-56 56 170 170Zm56 216q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 483 B |
1
webroot/assets/warn.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm-40-160h80v-240h-80v240Zm40 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>
|
||||
|
After Width: | Height: | Size: 537 B |
3
webroot/assets_light/action.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#2c2c2c">
|
||||
<path d="M240-160q-33 0-56.5-23.5T160-240q0-33 23.5-56.5T240-320q33 0 56.5 23.5T320-240q0 33-23.5 56.5T240-160Zm240 0q-33 0-56.5-23.5T400-240q0-33 23.5-56.5T480-320q33 0 56.5 23.5T560-240q0 33-23.5 56.5T480-160Zm240 0q-33 0-56.5-23.5T640-240q0-33 23.5-56.5T720-320q33 0 56.5 23.5T800-240q0 33-23.5 56.5T720-160ZM240-400q-33 0-56.5-23.5T160-480q0-33 23.5-56.5T240-560q33 0 56.5 23.5T320-480q0 33-23.5 56.5T240-400Zm240 0q-33 0-56.5-23.5T400-480q0-33 23.5-56.5T480-560q33 0 56.5 23.5T560-480q0 33-23.5 56.5T480-400Zm240 0q-33 0-56.5-23.5T640-480q0-33 23.5-56.5T720-560q33 0 56.5 23.5T800-480q0 33-23.5 56.5T720-400ZM240-640q-33 0-56.5-23.5T160-720q0-33 23.5-56.5T240-800q33 0 56.5 23.5T320-720q0 33-23.5 56.5T240-640Zm240 0q-33 0-56.5-23.5T400-720q0-33 23.5-56.5T480-800q33 0 56.5 23.5T560-720q0 33-23.5 56.5T480-640Zm240 0q-33 0-56.5-23.5T640-720q0-33 23.5-56.5T720-800q33 0 56.5 23.5T800-720q0 33-23.5 56.5T720-640Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
3
webroot/assets_light/home.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#2c2c2c">
|
||||
<path d="M240-200h120v-240h240v240h120v-360L480-740 240-560v360Zm-80 80v-480l320-240 320 240v480H520v-240h-80v240H160Zm320-350Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 247 B |
3
webroot/assets_light/module.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#2c2c2c">
|
||||
<path d="M627-520h133v-160H627v160Zm-214 0h133v-160H413v160Zm-213 0h133v-160H200v160Zm0 240h133v-160H200v160Zm213 0h133v-160H413v160Zm214 0h133v-160H627v160Zm-507 0v-400q0-33 23.5-56.5T200-760h560q33 0 56.5 23.5T840-680v400q0 33-23.5 56.5T760-200H200q-33 0-56.5-23.5T120-280Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 395 B |
3
webroot/assets_light/settings.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#2c2c2c">
|
||||
<path d="m370-80-16-128q-13-5-24.5-12T307-235l-119 50L78-375l103-78q-1-7-1-13.5v-27q0-6.5 1-13.5L78-585l110-190 119 50q11-8 23-15t24-12l16-128h220l16 128q13 5 24.5 12t22.5 15l119-50 110 190-103 78q1 7 1 13.5v27q0 6.5-2 13.5l103 78-110 190-118-50q-11 8-23 15t-24 12L590-80H370Zm70-80h79l14-106q31-8 57.5-23.5T639-327l99 41 39-68-86-65q5-14 7-29.5t2-31.5q0-16-2-31.5t-7-29.5l86-65-39-68-99 42q-22-23-48.5-38.5T533-694l-13-106h-79l-14 106q-31 8-57.5 23.5T321-633l-99-41-39 68 86 64q-5 15-7 30t-2 32q0 16 2 31t7 30l-86 65 39 68 99-42q22 23 48.5 38.5T427-266l13 106Zm42-180q58 0 99-41t41-99q0-58-41-99t-99-41q-59 0-99.5 41T342-480q0 58 40.5 99t99.5 41Zm-2-140Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 775 B |
56
webroot/css/error.css
Normal file
@@ -0,0 +1,56 @@
|
||||
.e-container {
|
||||
background-color: black;
|
||||
z-index: 30;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.e-main {
|
||||
background-color: black;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.e-wrap {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
overflow: auto;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.e-bg {
|
||||
background-color: black;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.e-card {
|
||||
margin: 30px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.e-font {
|
||||
color: #ba1a1a;
|
||||
}
|
||||
|
||||
.e-button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 120px;
|
||||
height: 40px;
|
||||
border-radius: 30px;
|
||||
background-color: #ba1a1a;
|
||||
color: black;
|
||||
transition: transform 0.1s ease-in-out;
|
||||
}
|
||||
|
||||
.e-button:active {
|
||||
transform: scale(90%)
|
||||
}
|
||||
62
webroot/css/icons.css
Normal file
@@ -0,0 +1,62 @@
|
||||
/* Dark */
|
||||
#ni_home {
|
||||
background: url(../assets/home.svg);
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
#ni_modules {
|
||||
background: url(../assets/module.svg);
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
#ni_actions {
|
||||
background: url(../assets/action.svg);
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
#ni_settings {
|
||||
background: url(../assets/settings.svg);
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
#ec_icon {
|
||||
background: url(../assets/ec-icon.svg);
|
||||
z-index: 40;
|
||||
}
|
||||
|
||||
/* Light */
|
||||
#ni_home.light {
|
||||
background: url(../assets_light/home.svg);
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
#ni_modules.light {
|
||||
background: url(../assets_light/module.svg);
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
#ni_actions.light {
|
||||
background: url(../assets_light/action.svg);
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
#ni_settings.light {
|
||||
background: url(../assets_light/settings.svg);
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
z-index: 10;
|
||||
}
|
||||
514
webroot/css/index.css
Normal file
@@ -0,0 +1,514 @@
|
||||
:root {
|
||||
--background: #181c20;
|
||||
--font: #fff;
|
||||
--desc: #c9c9c9;
|
||||
--bright: #8d1d19;
|
||||
--dim: #1d2327;
|
||||
--error: #8d1d19;
|
||||
--icon: #48565e;
|
||||
--icon-bc: #2b3338;
|
||||
--small-card: var(--icon-bc);
|
||||
--button: var(--background);
|
||||
--desktop-navbar: #252b31;
|
||||
--desktop-navicon: #333d42;
|
||||
/* Locked Color */
|
||||
--lock-desc: #c9c9c9;
|
||||
--lock: #fff;
|
||||
--font-family: 'Poppins', sans-serif;
|
||||
}
|
||||
|
||||
* {
|
||||
background-color: var(--background);
|
||||
color: var(--font);
|
||||
font-family: var(--font-family)
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
/* Components */
|
||||
.radios input[type=radio] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.radio input[type=radio] {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.not_avaliable {
|
||||
position: fixed;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 1.2em;
|
||||
text-align: center;
|
||||
top: 0; left: 30px; right: 30px; bottom: 0;
|
||||
}
|
||||
|
||||
.load_screen {
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
background: var(--background);
|
||||
z-index: 10;
|
||||
justify-content: center;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.full_screen {
|
||||
position: fixed;
|
||||
overflow-y: scroll;
|
||||
z-index: 10;
|
||||
top: 0; bottom: 0; left: 0; right: 0;
|
||||
transition: top 0.35s ease-in-out;
|
||||
}
|
||||
|
||||
.loader {
|
||||
border: 6px solid var(--icon-bc);
|
||||
border-top: 6px solid var(--icon);
|
||||
border-radius: 50%;
|
||||
width: 3em;
|
||||
height: 3em;
|
||||
animation: spin 0.8s linear infinite;
|
||||
}
|
||||
|
||||
.header {
|
||||
display: flex;
|
||||
position: fixed;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
left: 0;
|
||||
right: 0;
|
||||
padding: 20px 25px;
|
||||
font-size: 20px;
|
||||
border-bottom: #585b5d solid 1px;
|
||||
z-index: 5;
|
||||
}
|
||||
|
||||
.panel {
|
||||
display: none;
|
||||
animation: fade-out 0.2s;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
display: flex;
|
||||
position: fixed;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
background-color: var(--dim);
|
||||
left: 0; right: 0; bottom: 0;
|
||||
padding: 25px 25px;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.navtitle {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: small;
|
||||
margin-top: 8px;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.navhidden {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.navicon {
|
||||
background: var(--small-card);
|
||||
display: flex;
|
||||
width: 0;
|
||||
height: 30px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 50px;
|
||||
animation: closeNav 0.15s;
|
||||
}
|
||||
|
||||
.card {
|
||||
margin: 0 15px 10px 15px;
|
||||
padding: 15px 15px;
|
||||
border-radius: 15px;
|
||||
color: var(--lock);
|
||||
}
|
||||
|
||||
.content {
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.desc {
|
||||
color: var(--desc);
|
||||
}
|
||||
|
||||
.liste {
|
||||
justify-content: space-between;
|
||||
align-self: center;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.center {
|
||||
justify-content: center;
|
||||
align-self: center;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.list {
|
||||
max-height: 25px;
|
||||
overflow-y: hidden;
|
||||
transition: max-height 0.25s ease;
|
||||
}
|
||||
|
||||
.full {
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
.expander {
|
||||
transform: rotate(0deg);
|
||||
transition: 0.2s ease-out;
|
||||
}
|
||||
|
||||
.button_list {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
column-gap: 20px;
|
||||
}
|
||||
|
||||
.button {
|
||||
padding: 1em 0 1em 0;
|
||||
border-radius: 30px;
|
||||
transition: transform 0.1s ease-in-out;
|
||||
background-color: var(--button);
|
||||
}
|
||||
|
||||
.button:active {
|
||||
transform: scale(90%)
|
||||
}
|
||||
|
||||
.small_card {
|
||||
background: var(--small-card);
|
||||
border-radius: 15px;
|
||||
padding: 5px 15px 0 15px;
|
||||
margin: 15px 15px 0 15px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.small_card_bg {
|
||||
background: var(--small-card);
|
||||
}
|
||||
|
||||
.icon_animation {
|
||||
transition: transform 0.05s ease-in-out;
|
||||
}
|
||||
|
||||
.icon_animation:active {
|
||||
transform: scale(80%)
|
||||
}
|
||||
|
||||
.element_animation {
|
||||
transition: transform 0.15s ease-in-out;
|
||||
}
|
||||
|
||||
.element_animation:active {
|
||||
transform: scale(95%)
|
||||
}
|
||||
|
||||
.card_animation {
|
||||
transition: transform 0.05s ease-in-out;
|
||||
}
|
||||
|
||||
.card_animation:active {
|
||||
transform: scale(95%)
|
||||
}
|
||||
|
||||
.errorh_textarea {
|
||||
resize: none;
|
||||
border: none;
|
||||
outline: none;
|
||||
font-size: 14px;
|
||||
padding-bottom: 25px;
|
||||
font-family: monospace, monospace;
|
||||
position: fixed;
|
||||
bottom: 7em;
|
||||
top: 15.2em;
|
||||
left: 1em;
|
||||
right: 1em;
|
||||
}
|
||||
|
||||
.errorh_button_container {
|
||||
position: fixed;
|
||||
top: 5.75em;
|
||||
left: 1em;
|
||||
right: 1em;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
column-gap: 1em;
|
||||
}
|
||||
|
||||
.errorh_button {
|
||||
border-radius: 25px;
|
||||
background: var(--small-card);
|
||||
display: flex;
|
||||
padding: 0.7em;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 1em;
|
||||
cursor: pointer;
|
||||
transition: transform 0.05s ease-in-out;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
#errorh_small_panel_header {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.errorh_button:active {
|
||||
transform: scale(80%)
|
||||
}
|
||||
|
||||
/* Card type */
|
||||
.bright {
|
||||
border: 5px solid var(--bright);
|
||||
background: var(--bright);
|
||||
}
|
||||
|
||||
.brightc {
|
||||
background: var(--bright);
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.dim {
|
||||
border: 5px solid var(--dim);
|
||||
background: var(--dim);
|
||||
}
|
||||
|
||||
.dimc {
|
||||
background: var(--dim);
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.nav_dimc {
|
||||
background: var(--dim);
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
/* Locked */
|
||||
.lock {
|
||||
color: var(--lock);
|
||||
}
|
||||
|
||||
.lockd {
|
||||
color: var(--lock-desc);
|
||||
}
|
||||
|
||||
/* Switch */
|
||||
.switch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 60px;
|
||||
height: 34px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.switch input {
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.slider {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-color: var(--button);
|
||||
-webkit-transition: .4s;
|
||||
transition: .4s;
|
||||
}
|
||||
|
||||
.slider:before {
|
||||
position: absolute;
|
||||
content: "";
|
||||
height: 23px;
|
||||
width: 23px;
|
||||
left: 6px;
|
||||
bottom: 6px;
|
||||
background-color: var(--desc);
|
||||
-webkit-transition: .4s;
|
||||
transition: .4s;
|
||||
}
|
||||
|
||||
input:checked + .slider:before {
|
||||
-webkit-transform: translateX(26px);
|
||||
-ms-transform: translateX(26px);
|
||||
transform: translateX(26px);
|
||||
}
|
||||
|
||||
/* Rounded sliders */
|
||||
.slider.round {
|
||||
border-radius: 34px;
|
||||
}
|
||||
|
||||
.slider.round:before {
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
/* Responsive CSS */
|
||||
@media only screen and (max-width: 600px) {
|
||||
.button_list {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
column-gap: 20px;
|
||||
}
|
||||
.button {
|
||||
padding: 1em 0 1em 0;
|
||||
border-radius: 30px;
|
||||
margin: 0.6em 0 0.6em;
|
||||
transition: transform 0.15s ease-in-out;
|
||||
background-color: var(--button);
|
||||
}
|
||||
}
|
||||
|
||||
/* Show set */
|
||||
.panel.show {
|
||||
margin-bottom: 119px;
|
||||
display: block;
|
||||
animation: fade-in 0.2s;
|
||||
}
|
||||
|
||||
.panel.showback {
|
||||
margin-bottom: 119px;
|
||||
display: block;
|
||||
animation: fade-in 0.2s;
|
||||
z-index: 30;
|
||||
}
|
||||
|
||||
.navicon.show {
|
||||
width: 65px;
|
||||
animation: openNav 0.15s;
|
||||
}
|
||||
|
||||
@media (min-width:961px) {
|
||||
.navbar {
|
||||
background-color: var(--desktop-navbar);
|
||||
transform: scale(0.85);
|
||||
left: auto;
|
||||
right: auto;
|
||||
margin-bottom: 15px;
|
||||
border-radius: 60px;
|
||||
padding: 10px 10px;
|
||||
}
|
||||
.navtitle {
|
||||
display: none;
|
||||
}
|
||||
.navicon_support {
|
||||
border-radius: 60px;
|
||||
}
|
||||
#navbar_support_div {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.navicon {
|
||||
background: var(--desktop-navicon);
|
||||
height: 65px;
|
||||
animation: closeNavDesktop 0.15s;
|
||||
}
|
||||
.navicon.show {
|
||||
animation: openNavDesktop 0.15s;
|
||||
}
|
||||
.nav_dimc {
|
||||
background: var(--desktop-navbar);
|
||||
}
|
||||
.errorh_button_container {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
}
|
||||
.errorh_textarea {
|
||||
top: 11em;
|
||||
}
|
||||
.errorh_button {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Animation KeyFrames */
|
||||
@keyframes fade-in {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fade-out {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% { transform: rotate(0deg); }
|
||||
100% { transform: rotate(360deg); }
|
||||
}
|
||||
|
||||
@keyframes closeNav {
|
||||
0% {
|
||||
width: 65px;
|
||||
}
|
||||
75% {
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
width: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes openNav {
|
||||
0% {
|
||||
width: 0px;
|
||||
}
|
||||
75% {
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
width: 65px;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes closeNavDesktop {
|
||||
0% {
|
||||
transform: scale(1);
|
||||
}
|
||||
75% {
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
transform: scale(0);
|
||||
}
|
||||
}
|
||||
@keyframes openNavDesktop {
|
||||
0% {
|
||||
transform: scale(0);
|
||||
}
|
||||
75% {
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
4
webroot/fonts/header.css
Normal file
@@ -0,0 +1,4 @@
|
||||
@font-face {
|
||||
font-family: "Poppins";
|
||||
src: url("./poppins.ttf");
|
||||
}
|
||||
BIN
webroot/fonts/poppins.ttf
Normal file
381
webroot/index.html
Normal file
@@ -0,0 +1,381 @@
|
||||
<!DOCTYPE html>
|
||||
<html id="main_html" lang="en" dir="none">
|
||||
<head>
|
||||
<meta name="viewport" content="initial-scale=1, width=device-width" />
|
||||
<meta name="viewport" content="viewport-fit=cover" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
|
||||
<meta id="cache-navbar-previous" />
|
||||
<meta id="cache-page-small-previous" />
|
||||
<meta id="cache-fallback-open" />
|
||||
|
||||
<link rel="stylesheet" href="fonts/header.css">
|
||||
<link rel="stylesheet" href="css/index.css">
|
||||
<link rel="stylesheet" href="css/error.css">
|
||||
<link rel="stylesheet" href="css/icons.css">
|
||||
|
||||
<script>
|
||||
localStorage.setItem('/system/boot-time', String(Date.now()))
|
||||
</script>
|
||||
<script src="js/errorCatcher.js" type="module"></script>
|
||||
<script src="js/errorScreen.js" type="module"></script>
|
||||
<script src="js/browserRedirect.js" type="module"></script>
|
||||
<script src="js/smallPage/theme.js" type="module"></script>
|
||||
<script src="js/smallPage/language.js" type="module"></script>
|
||||
<script src="js/smallPage/errorHistory.js" type="module"></script>
|
||||
<script src="js/restoreError.js" type="module"></script>
|
||||
<script src="js/navbar.js" type="module"></script>
|
||||
<script src="js/monitorActions.js" type="module"></script>
|
||||
<script src="js/switcher/fontChanger.js" type="module"></script>
|
||||
<script src="js/main.js" type="module"></script>
|
||||
</head>
|
||||
<body id="main_body">
|
||||
<!-- INFO: Error screen -->
|
||||
<div id="fatal-error-screen" class="e-container" style="display: none;">
|
||||
<div class="e-bg e-wrap">
|
||||
<div class="e-bg e-card e-main">
|
||||
<img class="e-bg" src="./assets/ec-icon.svg" style="margin-bottom: 10px;"/>
|
||||
<div class="e-bg">
|
||||
Your WebUI is corrupt. It can't be trusted and may not work properly.
|
||||
</div>
|
||||
|
||||
<div class="e-bg" style="margin-top: 15px;">
|
||||
Please click the copy log button below and visit
|
||||
<div class="e-bg e-font" credit-link="t.me/performancorg">t.me/performancorg</div>
|
||||
for support.
|
||||
</div>
|
||||
|
||||
<div id="esc-copy-button" class="e-button" style="margin-top: 25px;">COPY LOG</div>
|
||||
<textarea id="esc-log" style="display: none;"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INFO: Loading screen -->
|
||||
<div id="loading_screen" class="load_screen">
|
||||
<div id="backport_errorh" class="loader"></div>
|
||||
</div>
|
||||
|
||||
<!-- INFO: Home page -->
|
||||
<div id="panel_home" class="panel">
|
||||
<div class="header">ReZygisk</div>
|
||||
<div style="padding: 45px 0px;"></div>
|
||||
|
||||
<!-- INFO: Status card -->
|
||||
<div id="info_card" class="bright card list">
|
||||
<div class="brightc" style="display: flex; align-items: center;">
|
||||
<div id="rezygisk_icon_state" class="brightc" style="margin-bottom: 1px;">
|
||||
<img class="brightc" src="assets/mark.svg">
|
||||
</div>
|
||||
<div id="rezygisk_state" class="brightc content lock" style="font-size: 1.2em; padding-bottom: 4px; padding-left: 5px;">
|
||||
Unknown
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INFO: Info card -->
|
||||
<div class="dim card">
|
||||
<div class="dimc" style="margin-bottom: 14px;">
|
||||
<div class="dimc" style="font-size: 0.8em">ROM / Kernel</div>
|
||||
</div>
|
||||
|
||||
<div id="android_version" class="dimc">
|
||||
<div class="dimc" style="font-size: 1.1em;">Android</div>
|
||||
<div class="dimc desc" id="android_version_div" style="font-size: 0.9em; line-height: 1.05em;">Unknown</div>
|
||||
</div>
|
||||
<div id="kernel_version" class="dimc" style="margin-top: 4px;">
|
||||
<div class="dimc" style="font-size: 1.1em;">Kernel</div>
|
||||
<div class="dimc desc" id="kernel_version_div" style="font-size: 0.9em; line-height: 1.05em;">Unknown</div>
|
||||
</div>
|
||||
|
||||
<div class="dimc" style="margin-top: 18px; margin-bottom: 14px;">
|
||||
<div class="dimc" style="font-size: 0.8em;">Root / ReZygisk</div>
|
||||
</div>
|
||||
|
||||
<div class="dimc content">
|
||||
<div id="version_info_title" class="dimc" style="font-size: 1.1em;">Version</div>
|
||||
<div class="dimc desc" id="version" style="font-size: 0.9em; line-height: 1.05em;">Unknown</div>
|
||||
</div>
|
||||
<div class="dimc content">
|
||||
<div id="root_info_title" class="dimc" style="font-size: 1.1em;">Root Implementation</div>
|
||||
<div class="dimc desc" id="root_impl" style="font-size: 0.9em; line-height: 1.05em;">Unknown</div>
|
||||
</div>
|
||||
|
||||
<div class="dimc" style="margin-top: 12px; margin-bottom: 14px;">
|
||||
<div class="dimc" style="font-size: 0.8em">Zygotes</div>
|
||||
</div>
|
||||
|
||||
<div id="zygote32" class="dimc content">
|
||||
<div class="dimc" style="font-size: 1.1em;">Zygote32</div>
|
||||
<div class="dimc desc" id="zygote32_status" style="font-size: 0.9em; line-height: 1.05em;">Unknown</div>
|
||||
</div>
|
||||
<div id="zygote64" class="dimc">
|
||||
<div class="dimc" style="font-size: 1.1em;">Zygote64</div>
|
||||
<div class="dimc desc" id="zygote64_status" style="font-size: 0.9em; line-height: 1.05em;">Unknown</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INFO: Module page -->
|
||||
<div id="panel_modules" class="panel">
|
||||
<div id="panel_modules_header" class="header">Modules</div>
|
||||
<div style="padding: 45px 0px;"></div>
|
||||
<div id="modules_list" style="width: 100%; height: fit-content; display: grid;">
|
||||
<div id="modules_list_not_avaliable" class="not_avaliable">
|
||||
No modules using Zygisk here.
|
||||
</div>
|
||||
<!-- N/A -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INFO: Action page -->
|
||||
<div id="panel_actions" class="panel">
|
||||
<div id="panel_actions_header" class="header">Actions</div>
|
||||
<div style="padding: 45px 0px;"></div>
|
||||
<!-- INFO: Settings card body (monitor) -->
|
||||
<div id="monitor" class="dimc" style="display: block; margin: 0 15px 0 15px; border-radius: 20px;">
|
||||
<div class="dimc liste" style="padding: 30px 22px 30px; border-radius: 20px;">
|
||||
<div id="monitor_title" class="dimc" style="font-size: 1.22em;">Monitor</div>
|
||||
<div id="monitor_status" class="dimc" style="font-size: 1.1em;">Unknown</div>
|
||||
</div>
|
||||
|
||||
<div class="small_card_bg" style="padding: 25px 20px 25px 20px; border-radius: 20px;">
|
||||
<div class="small_card_bg button_list">
|
||||
<div id="monitor_stop_button" class="center button">Stop</div>
|
||||
<div id="monitor_start_button" class="center button">Start</div>
|
||||
<div id="monitor_pause_button" class="center button">Pause</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INFO: Settings page -->
|
||||
<div id="panel_settings" class="panel">
|
||||
<div id="panel_settings_header" class="header">Settings</div>
|
||||
<div style="padding: 40px 0px;"></div>
|
||||
<!-- INFO: Enable system font option -->
|
||||
<div class="small_card dimc" style="margin-top: 15px; justify-content: space-between; display: flex; align-items: center;">
|
||||
<div class="dimc" style="display: inline-block; width: 80%;">
|
||||
<div id="sys_font_option_title" class="dimc content" style="font-size: 1.1em; padding-left: 5px; padding-top: 6px; padding-bottom: 2px;">
|
||||
Enable system font
|
||||
</div>
|
||||
<div id="sys_font_option_desc" class="dimc desc" style="font-size: 0.9em; padding-left: 5px; padding-bottom: 6px;">
|
||||
This option will enable system font in current WebUI. NOTE: May not be compatible with FlipFont
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label class="switch dimc">
|
||||
<input id="font_switcher" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- INFO: Enable light theme option -->
|
||||
<div id="theme_page_toggle" class="small_card dimc card_animation" style="margin-top: 15px; justify-content: space-between; display: flex; align-items: center;">
|
||||
<div class="dimc" style="display: inline-block;">
|
||||
<div id="sys_theme_option_title" class="dimc content" style="font-size: 1.1em; padding-left: 5px; padding-top: 6px; padding-bottom: 2px;">
|
||||
System theme
|
||||
</div>
|
||||
<div id="sys_theme_option_desc" class="dimc desc" style="font-size: 0.9em; padding-left: 5px; padding-bottom: 6px;">
|
||||
Choose your system theme for current WebUI
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INFO: Change language -->
|
||||
<div id="lang_page_toggle" class="small_card dimc card_animation" style="margin-top: 15px; justify-content: space-between; display: flex; align-items: center;">
|
||||
<div class="dimc" style="display: inline-block;">
|
||||
<div id="sys_lang_option_title" class="dimc content" style="font-size: 1.1em; padding-left: 5px; padding-top: 6px; padding-bottom: 2px;">
|
||||
Change language
|
||||
</div>
|
||||
<div id="sys_lang_option_desc" class="dimc desc" style="font-size: 0.9em; padding-left: 5px; padding-bottom: 6px;">
|
||||
Change to your new language
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INFO: Error history -->
|
||||
<div id="errorh_page_toggle" class="small_card dimc card_animation" style="margin-top: 15px; justify-content: space-between; display: flex; align-items: center;">
|
||||
<div class="dimc" style="display: inline-block;">
|
||||
<div id="sys_errorh_title" class="dimc content" style="font-size: 1.1em; padding-left: 5px; padding-top: 6px; padding-bottom: 2px;">
|
||||
Error History
|
||||
</div>
|
||||
<div id="sys_errorh_desc" class="dimc desc" style="font-size: 0.9em; padding-left: 5px; padding-bottom: 6px;">
|
||||
View all of your error log
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INFO: Credit card -->
|
||||
<div class="dim card" style="margin-top: 15px;">
|
||||
<div class="dimc content">
|
||||
<div id="mcre_title" class="dimc" style="font-size: 1.1em">Module Developer</div>
|
||||
<div credit-link="github.com/PerformanC" class="dimc desc" style="font-size: 0.9em; margin-top: 3px; cursor: pointer;">
|
||||
The PerformanC Organization
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="dimc content" style="margin-top: 6px;">
|
||||
<div id="omcre_title" class="dimc" style="font-size: 1.1em">Original Module Developer</div>
|
||||
<div class="dimc" style="font-size: 0.9em; margin-top: 3px; align-items: center; display: flex;">
|
||||
<div credit-link="github.com/Dr-TSNG" class="dimc desc" style="cursor: pointer;">
|
||||
Nullptr
|
||||
</div>
|
||||
<div class="dimc desc">,</div>
|
||||
<div credit-link="github.com/5ec1cff" class="dimc desc" style="margin-left: 2px; cursor: pointer;">
|
||||
5ec1cff
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="dimc" style="margin-top: 6px;">
|
||||
<div id="webcre_title" class="dimc" style="font-size: 1.1em">WebUI Developer</div>
|
||||
<div credit-link="github.com/RainyXeon" class="dimc desc" style="font-size: 0.9em; margin-top: 3px; cursor: pointer;">
|
||||
RainyXeon
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INFO: License card -->
|
||||
<div class="dim card" style="margin-top: 15px;">
|
||||
<div class="dimc content">
|
||||
<div id="mlic_title" class="dimc" style="font-size: 1.1em">Module License</div>
|
||||
<div class="dimc desc" style="font-size: 0.9em; margin-top: 3px;">GPL (Nullptr), BSD 2-Clause</div>
|
||||
</div>
|
||||
|
||||
<div class="dimc" style="margin-top: 6px;">
|
||||
<div id="mweb_title" class="dimc" style="font-size: 1.1em">WebUI License</div>
|
||||
<div class="dimc desc" style="font-size: 0.9em; margin-top: 3px;">BSD 2-Clause</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- INFO: System theme small page -->
|
||||
<div id="small_panel_theme" class="panel">
|
||||
<div class="header" style="padding-left: 20px; display: flex; align-items: center; justify-content: initial;">
|
||||
<div id="sp_theme_close" style="width: 36px; height: 36px; margin-right: 6px;">
|
||||
<img src="./assets/back.svg"/>
|
||||
</div>
|
||||
<div id="small_panel_theme_title">Theme</div>
|
||||
</div>
|
||||
<div style="padding: 47px 0px;"></div>
|
||||
<div style="width: 100%; height: fit-content;">
|
||||
<div theme-data="amoled" class="dim card card_animation" style="padding: 25px 15px; cursor: pointer;">
|
||||
<div theme-data="amoled" id="small_panel_theme_amoled_option" class="dimc" style="font-size: 1.1em;">Amoled</div>
|
||||
</div>
|
||||
<div theme-data="dark" class="dim card card_animation" style="padding: 25px 15px; cursor: pointer;">
|
||||
<div theme-data="dark" id="small_panel_theme_dark_option" class="dimc" style="font-size: 1.1em;">Dark</div>
|
||||
</div>
|
||||
<div theme-data="light" class="dim card card_animation" style="padding: 25px 15px; cursor: pointer;">
|
||||
<div theme-data="light" id="small_panel_theme_light_option" class="dimc" style="font-size: 1.1em;">Light</div>
|
||||
</div>
|
||||
<div theme-data="monochrome" class="dim card card_animation" style="padding: 25px 15px; cursor: pointer;">
|
||||
<div theme-data="monochrome" id="small_panel_theme_monochrome_option" class="dimc" style="font-size: 1.1em;">Monochrome</div>
|
||||
</div>
|
||||
<div theme-data="system" class="dim card card_animation" style="padding: 25px 15px; cursor: pointer;">
|
||||
<div theme-data="system" id="small_panel_theme_system_option" class="dimc" style="font-size: 1.1em;">System Based</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INFO: Language small page -->
|
||||
<div id="small_panel_language" class="panel">
|
||||
<div class="header" style="padding-left: 20px; display: flex; align-items: center; justify-content: initial;">
|
||||
<div id="sp_lang_close" style="width: 36px; height: 36px; margin-right: 6px;">
|
||||
<img src="./assets/back.svg"/>
|
||||
</div>
|
||||
<div id="small_panel_lang_title">Choose your new language</div>
|
||||
</div>
|
||||
<div style="padding: 47px 0px;"></div>
|
||||
<div id="lang_modal_list" style="width: 100%; height: fit-content;">
|
||||
<!-- N/A -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INFO: Error small page -->
|
||||
<div id="small_panel_errorh" class="panel">
|
||||
<div id="errorh_small_panel_header" class="header" style="padding-left: 20px; display: flex; align-items: center; justify-content: initial;">
|
||||
<div id="sp_errorh_close" style="width: 36px; height: 36px; margin-right: 6px;">
|
||||
<img src="./assets/back.svg"/>
|
||||
</div>
|
||||
<div id="small_panel_errorh_title">Error History</div>
|
||||
</div>
|
||||
<div style="display: block; height: 100%;">
|
||||
<div class="errorh_button_container">
|
||||
<div id="errorh_copy" class="errorh_button">COPY</div>
|
||||
<div id="errorh_clear_all" class="errorh_button">CLEAR ALL LOG</div>
|
||||
</div>
|
||||
<textarea id="errorh_panel" class="errorh_textarea" placeholder="No error log recorded here!" disabled></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- INFO: Bottom navbar -->
|
||||
<div id="navbar_support_div" style="display: none;">
|
||||
<div id="navbar" class="navbar radios">
|
||||
<div class="navicon_support nav_dimc">
|
||||
<input id="n_home" type="radio" name="navbutton" value="home" checked/>
|
||||
<label class="navicon_support radio nav_dimc" for="n_home">
|
||||
|
||||
<div class="navicon_support nav_dimc" style="display: grid; place-items: center;">
|
||||
<div class="navicon_support nav_dimc" style="display: grid; place-items: center; width: 65px;">
|
||||
<div style="grid-area: 1 / 1;" id="ni_home"></div>
|
||||
<div style="grid-area: 1 / 1;" id="nibg_home" class="navicon"></div>
|
||||
</div>
|
||||
<div id="nav_home_title" class="navtitle nav_dimc">Home</div>
|
||||
</div>
|
||||
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="nav_dimc">
|
||||
<input id="n_modules" type="radio" name="navbutton" value="modules"/>
|
||||
<label class="radio nav_dimc" for="n_modules">
|
||||
|
||||
<div class="nav_dimc" style="display: grid; place-items: center;">
|
||||
<div class="nav_dimc" style="display: grid; place-items: center; width: 65px;">
|
||||
<div style="grid-area: 1 / 1;" id="ni_modules"></div>
|
||||
<div style="grid-area: 1 / 1;" id="nibg_modules" class="navicon"></div>
|
||||
</div>
|
||||
<div id="nav_modules_title" class="navtitle nav_dimc">Modules</div>
|
||||
</div>
|
||||
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="nav_dimc">
|
||||
<input id="n_actions" type="radio" name="navbutton" value="actions"/>
|
||||
<label class="radio nav_dimc" for="n_actions">
|
||||
|
||||
<div class="nav_dimc" style="display: grid; place-items: center;">
|
||||
<div class="nav_dimc" style="display: grid; place-items: center; width: 65px;">
|
||||
<div style="grid-area: 1 / 1;" id="ni_actions"></div>
|
||||
<div style="grid-area: 1 / 1;" id="nibg_actions" class="navicon"></div>
|
||||
</div>
|
||||
<div id="nav_actions_title" class="navtitle nav_dimc">Actions</div>
|
||||
</div>
|
||||
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="navicon_support nav_dimc">
|
||||
<input id="n_settings" type="radio" name="navbutton" value="settings"/>
|
||||
<label class="navicon_support radio nav_dimc" for="n_settings">
|
||||
|
||||
<div class="navicon_support nav_dimc" style="display: grid; place-items: center;">
|
||||
<div class="navicon_support nav_dimc" style="display: grid; place-items: center; width: 65px;">
|
||||
<div style="grid-area: 1 / 1;" id="ni_settings"></div>
|
||||
<div style="grid-area: 1 / 1;" id="nibg_settings" class="navicon"></div>
|
||||
</div>
|
||||
<div id="nav_settings_title" class="navtitle nav_dimc">Settings</div>
|
||||
</div>
|
||||
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
11
webroot/js/browserRedirect.js
Normal file
@@ -0,0 +1,11 @@
|
||||
import { exec } from './kernelsu.js'
|
||||
|
||||
document.addEventListener('click', async (event) => {
|
||||
const getLink = event.target.getAttribute('credit-link')
|
||||
if (!getLink || typeof getLink !== 'string') return;
|
||||
|
||||
const ptrace64Cmd = await exec(`am start -a android.intent.action.VIEW -d https://${getLink}`).catch(() => {
|
||||
return window.open(`https://${getLink}`, "_blank", 'toolbar=0,location=0,menubar=0')
|
||||
})
|
||||
if (ptrace64Cmd.errno !== 0) return window.open(`https://${getLink}`, "_blank", 'toolbar=0,location=0,menubar=0')
|
||||
}, false)
|
||||
16
webroot/js/errorCatcher.js
Normal file
@@ -0,0 +1,16 @@
|
||||
function setError(place, issue) {
|
||||
const fullErrorLog = setErrorData(`${place}: ${issue}`)
|
||||
document.getElementById('errorh_panel').innerHTML = fullErrorLog
|
||||
}
|
||||
|
||||
function setErrorData(errorLog) {
|
||||
const getPrevious = localStorage.getItem('/system/error')
|
||||
const finalLog = getPrevious && getPrevious.length !== 0 ? getPrevious + `\n` + errorLog : errorLog
|
||||
|
||||
localStorage.setItem('/system/error', finalLog)
|
||||
return finalLog
|
||||
}
|
||||
|
||||
if (window.onerror) window.onerror = (err) => {
|
||||
setError('WebUI', err.stack ? err.stack : err.message)
|
||||
}
|
||||
6
webroot/js/errorScreen.js
Normal file
@@ -0,0 +1,6 @@
|
||||
const button = document.getElementById('esc-copy-button')
|
||||
const log = document.getElementById('esc-log')
|
||||
|
||||
button.addEventListener('click', () => {
|
||||
navigator.clipboard.writeText(log.innerHTML)
|
||||
})
|
||||
117
webroot/js/kernelsu.js
Normal file
@@ -0,0 +1,117 @@
|
||||
/* https://github.com/tiann/KernelSU/tree/main/js / https://www.npmjs.com/package/kernelsu */
|
||||
|
||||
let callbackCounter = 0;
|
||||
function getUniqueCallbackName(prefix) {
|
||||
return `${prefix}_callback_${Date.now()}_${callbackCounter++}`;
|
||||
}
|
||||
|
||||
export function exec(command, options) {
|
||||
if (typeof options === "undefined") {
|
||||
options = {};
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
// Generate a unique callback function name
|
||||
const callbackFuncName = getUniqueCallbackName("exec");
|
||||
|
||||
// Define the success callback function
|
||||
window[callbackFuncName] = (errno, stdout, stderr) => {
|
||||
resolve({ errno, stdout, stderr });
|
||||
cleanup(callbackFuncName);
|
||||
};
|
||||
|
||||
function cleanup(successName) {
|
||||
delete window[successName];
|
||||
}
|
||||
|
||||
try {
|
||||
ksu.exec(command, JSON.stringify(options), callbackFuncName);
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
cleanup(callbackFuncName);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function Stdio() {
|
||||
this.listeners = {};
|
||||
}
|
||||
|
||||
Stdio.prototype.on = function (event, listener) {
|
||||
if (!this.listeners[event]) {
|
||||
this.listeners[event] = [];
|
||||
}
|
||||
this.listeners[event].push(listener);
|
||||
};
|
||||
|
||||
Stdio.prototype.emit = function (event, ...args) {
|
||||
if (this.listeners[event]) {
|
||||
this.listeners[event].forEach((listener) => listener(...args));
|
||||
}
|
||||
};
|
||||
|
||||
function ChildProcess() {
|
||||
this.listeners = {};
|
||||
this.stdin = new Stdio();
|
||||
this.stdout = new Stdio();
|
||||
this.stderr = new Stdio();
|
||||
}
|
||||
|
||||
ChildProcess.prototype.on = function (event, listener) {
|
||||
if (!this.listeners[event]) {
|
||||
this.listeners[event] = [];
|
||||
}
|
||||
this.listeners[event].push(listener);
|
||||
};
|
||||
|
||||
ChildProcess.prototype.emit = function (event, ...args) {
|
||||
if (this.listeners[event]) {
|
||||
this.listeners[event].forEach((listener) => listener(...args));
|
||||
}
|
||||
};
|
||||
|
||||
export function spawn(command, args, options) {
|
||||
if (typeof args === "undefined") {
|
||||
args = [];
|
||||
} else if (!(args instanceof Array)) {
|
||||
// allow for (command, options) signature
|
||||
options = args;
|
||||
}
|
||||
|
||||
if (typeof options === "undefined") {
|
||||
options = {};
|
||||
}
|
||||
|
||||
const child = new ChildProcess();
|
||||
const childCallbackName = getUniqueCallbackName("spawn");
|
||||
window[childCallbackName] = child;
|
||||
|
||||
function cleanup(name) {
|
||||
delete window[name];
|
||||
}
|
||||
|
||||
child.on("exit", code => {
|
||||
cleanup(childCallbackName);
|
||||
});
|
||||
|
||||
try {
|
||||
ksu.spawn(
|
||||
command,
|
||||
JSON.stringify(args),
|
||||
JSON.stringify(options),
|
||||
childCallbackName
|
||||
);
|
||||
} catch (error) {
|
||||
child.emit("error", error);
|
||||
cleanup(childCallbackName);
|
||||
}
|
||||
return child;
|
||||
}
|
||||
|
||||
export function fullScreen(isFullScreen) {
|
||||
ksu.fullScreen(isFullScreen);
|
||||
}
|
||||
|
||||
export function toast(message) {
|
||||
ksu.toast(message);
|
||||
}
|
||||
63
webroot/js/language.js
Normal file
@@ -0,0 +1,63 @@
|
||||
import { exec } from './kernelsu.js'
|
||||
|
||||
import { setError } from './main.js'
|
||||
import { translateActionsPage } from './translate/actions.js'
|
||||
import { translateHomePage } from './translate/home.js'
|
||||
import { translateModulesPage } from './translate/modules.js'
|
||||
import { translateSettingsPage } from './translate/settings.js'
|
||||
|
||||
export async function setNewLanguage(locate, initialize) {
|
||||
const main_html = document.getElementById('main_html')
|
||||
const old_translations = await getTranslations(initialize ? 'en_US' : localStorage.getItem('/system/language'))
|
||||
const new_translations = await getTranslations(locate)
|
||||
|
||||
if (locate.includes('ar_')) main_html.setAttribute("dir", "rtl");
|
||||
else main_html.setAttribute("dir", "none");
|
||||
|
||||
translateHomePage(old_translations, new_translations)
|
||||
translateModulesPage(new_translations)
|
||||
translateActionsPage(old_translations, new_translations)
|
||||
translateSettingsPage(new_translations)
|
||||
|
||||
/* INFO: navbar info */
|
||||
document.getElementById('nav_home_title').innerHTML = new_translations.page.home.header
|
||||
document.getElementById('nav_modules_title').innerHTML = new_translations.page.modules.header
|
||||
document.getElementById('nav_actions_title').innerHTML = new_translations.page.actions.header
|
||||
document.getElementById('nav_settings_title').innerHTML = new_translations.page.settings.header
|
||||
|
||||
/* INFO: Language small page */
|
||||
document.getElementById('small_panel_lang_title').innerHTML = new_translations.smallPage.language.header
|
||||
|
||||
/* INFO: Theme small page */
|
||||
document.getElementById('small_panel_theme_title').innerHTML = new_translations.smallPage.theme.header
|
||||
document.getElementById('small_panel_theme_dark_option').innerHTML = new_translations.smallPage.theme.dark
|
||||
document.getElementById('small_panel_theme_light_option').innerHTML = new_translations.smallPage.theme.light
|
||||
document.getElementById('small_panel_theme_system_option').innerHTML = new_translations.smallPage.theme.system
|
||||
|
||||
/* INFO: Error history small page */
|
||||
document.getElementById('errorh_copy').innerHTML = new_translations.smallPage.errorh.buttons.copy
|
||||
document.getElementById('errorh_clear_all').innerHTML = new_translations.smallPage.errorh.buttons.clear
|
||||
document.getElementById('small_panel_errorh_title').innerHTML = new_translations.smallPage.errorh.header
|
||||
document.getElementById('errorh_panel').placeholder = new_translations.smallPage.errorh.placeholder
|
||||
}
|
||||
|
||||
export async function getTranslations(locate) {
|
||||
const translateData = await fetch(`./lang/${locate}.json`)
|
||||
.catch((err) => setError('WebUI', err.stack ? err.stack : err.message))
|
||||
|
||||
return translateData.json()
|
||||
}
|
||||
|
||||
export async function getAvailableLanguages() {
|
||||
const lsCmd = await exec('ls /data/adb/modules/zygisksu/webroot/lang')
|
||||
|
||||
if (lsCmd.errno !== 0) return setError('WebUI', lsCmd.stderr)
|
||||
|
||||
const languages = []
|
||||
lsCmd.stdout.split('\n').forEach((lang) => {
|
||||
if (lang.length !== 0)
|
||||
languages.push(lang.replace('.json', ''))
|
||||
})
|
||||
|
||||
return languages
|
||||
}
|
||||
258
webroot/js/main.js
Normal file
@@ -0,0 +1,258 @@
|
||||
import { fullScreen, exec, toast } from './kernelsu.js'
|
||||
|
||||
import { setNewLanguage, getTranslations } from './language.js'
|
||||
|
||||
export function setError(place, issue) {
|
||||
const fullErrorLog = setErrorData(`${place}: ${issue}`)
|
||||
document.getElementById('errorh_panel').innerHTML = fullErrorLog
|
||||
|
||||
toast(`${place}: ${issue}`)
|
||||
}
|
||||
|
||||
export function setLangData(mode) {
|
||||
localStorage.setItem('/system/language', mode)
|
||||
|
||||
return localStorage.getItem('/system/language')
|
||||
}
|
||||
|
||||
export function setErrorData(errorLog) {
|
||||
const getPrevious = localStorage.getItem('/system/error')
|
||||
const finalLog = getPrevious && getPrevious.length !== 0 ? getPrevious + `\n` + errorLog : errorLog
|
||||
|
||||
localStorage.setItem('/system/error', finalLog)
|
||||
|
||||
return finalLog
|
||||
}
|
||||
|
||||
async function getModuleNames(modules) {
|
||||
const fullCommand = modules.map((mod) => {
|
||||
let propPath = `/data/adb/modules/${mod.id}/module.prop`
|
||||
|
||||
return `printf % ; if test -f "${propPath}"; then /system/bin/grep '^name=' "${propPath}" | /system/bin/cut -d '=' -f 2- 2>/dev/null || true; else true; fi ; printf "\\n"`
|
||||
}).join(' ; ')
|
||||
|
||||
const result = await exec(fullCommand)
|
||||
if (result.errno !== 0) {
|
||||
setError('getModuleNames', 'Failed to execute command to retrieve module list names')
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
return result.stdout.split('\n\n')
|
||||
}
|
||||
|
||||
(async () => {
|
||||
/* INFO: Test ksu module availability */
|
||||
exec('echo "Hello world!"')
|
||||
.then(() => console.log('[kernelsu.js] Package is ready!'))
|
||||
.catch(err => {
|
||||
console.log('[kernelsu.js] Package is not ready! Below is error:')
|
||||
console.error(err)
|
||||
})
|
||||
|
||||
fullScreen(true)
|
||||
|
||||
let sys_lang = localStorage.getItem('/system/language')
|
||||
|
||||
if (!sys_lang) sys_lang = setLangData('en_US')
|
||||
if (sys_lang !== 'en_US') await setNewLanguage(sys_lang, true)
|
||||
|
||||
const translations = await getTranslations(sys_lang)
|
||||
|
||||
const loading_screen = document.getElementById('loading_screen')
|
||||
const bottom_nav = document.getElementById('navbar_support_div')
|
||||
|
||||
const rootCss = document.querySelector(':root')
|
||||
|
||||
const rezygisk_state = document.getElementById('rezygisk_state')
|
||||
const rezygisk_icon_state = document.getElementById('rezygisk_icon_state')
|
||||
|
||||
const version = document.getElementById('version')
|
||||
const root_impl = document.getElementById('root_impl')
|
||||
|
||||
const monitor_status = document.getElementById('monitor_status')
|
||||
|
||||
const zygote_divs = [
|
||||
document.getElementById('zygote64'),
|
||||
document.getElementById('zygote32')
|
||||
]
|
||||
|
||||
const zygote_status_divs = [
|
||||
document.getElementById('zygote64_status'),
|
||||
document.getElementById('zygote32_status')
|
||||
]
|
||||
|
||||
const androidVersionCmd = await exec('/system/bin/getprop ro.build.version.release')
|
||||
if (androidVersionCmd.errno !== 0) return setError('WebUI', androidVersionCmd.stderr)
|
||||
|
||||
document.getElementById('android_version_div').innerHTML = androidVersionCmd.stdout
|
||||
console.log('[rezygisk.js] Android version: ', androidVersionCmd.stdout)
|
||||
|
||||
const unameCmd = await exec('/system/bin/uname -r')
|
||||
if (unameCmd.errno !== 0) return setError('WebUI', unameCmd.stderr)
|
||||
|
||||
document.getElementById('kernel_version_div').innerHTML = unameCmd.stdout
|
||||
console.log('[rezygisk.js] Kernel version: ', unameCmd.stdout)
|
||||
|
||||
const catCmd = await exec('/system/bin/cat /data/adb/rezygisk/module.prop')
|
||||
console.log(`[rezygisk.js] ReZygisk module infomation:\n${catCmd.stdout}`)
|
||||
|
||||
let expectedWorking = 0
|
||||
let actuallyWorking = 0
|
||||
|
||||
const ReZygiskInfo = {
|
||||
rootImpl: null,
|
||||
monitor: null,
|
||||
zygotes: [],
|
||||
daemons: []
|
||||
}
|
||||
|
||||
if (catCmd.errno === 0) {
|
||||
/* INFO: Just ensure that they won't appear unless there's info */
|
||||
zygote_divs.forEach((zygote_div) => {
|
||||
zygote_div.style.display = 'none'
|
||||
})
|
||||
|
||||
version.innerHTML = catCmd.stdout.split('\n').find((line) => line.startsWith('version=')).substring('version='.length).trim()
|
||||
|
||||
let moduleInfo = catCmd.stdout.split('\n').find((line) => line.startsWith('description=')).substring('description='.length).split('[')[1].split(']')[0]
|
||||
|
||||
const daemonModules = []
|
||||
moduleInfo.match(/\(([^)]+)\)/g).forEach((area) => {
|
||||
moduleInfo = moduleInfo.replace(area, ',')
|
||||
|
||||
const info = area.substring(1, area.length - 1).split(', ')
|
||||
if (info.length === 1) return; /* INFO: undefined as object */
|
||||
|
||||
const rootImpl = info[0].substring('Root: '.length)
|
||||
|
||||
info[1] = info[1].substring('Modules: '.length)
|
||||
const modules = info.slice(1, info.length)
|
||||
|
||||
ReZygiskInfo.rootImpl = rootImpl
|
||||
if (modules[0] !== 'None') daemonModules.push(modules)
|
||||
})
|
||||
|
||||
const infoArea = moduleInfo.split(', ')
|
||||
infoArea.forEach((info) => {
|
||||
if (info.startsWith('monitor:')) {
|
||||
ReZygiskInfo.monitor = info.substring('monitor: X '.length).trim()
|
||||
}
|
||||
|
||||
if (info.startsWith('zygote')) {
|
||||
ReZygiskInfo.zygotes.push({
|
||||
bits: info.substring('zygote'.length, 'zygote'.length + 'XX'.length),
|
||||
state: info.substring('zygoteXX: X '.length).trim()
|
||||
})
|
||||
}
|
||||
|
||||
if (info.startsWith('daemon')) {
|
||||
ReZygiskInfo.daemons.push({
|
||||
bits: info.substring('daemon'.length, 'daemon'.length + 'XX'.length),
|
||||
state: info.substring('daemonXX: X '.length).trim(),
|
||||
modules: daemonModules[ReZygiskInfo.daemons.length] || []
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
switch (ReZygiskInfo.monitor) {
|
||||
case 'tracing': monitor_status.innerHTML = translations.page.actions.status.tracing; break;
|
||||
case 'stopping': monitor_status.innerHTML = translations.page.actions.status.stopping; break;
|
||||
case 'stopped': monitor_status.innerHTML = translations.page.actions.status.stopped; break;
|
||||
case 'exiting': monitor_status.innerHTML = translations.page.actions.status.exiting; break;
|
||||
default: monitor_status.innerHTML = translations.page.actions.status.unknown;
|
||||
}
|
||||
|
||||
expectedWorking = ReZygiskInfo.zygotes.length
|
||||
|
||||
for (let i = 0; i < ReZygiskInfo.zygotes.length; i++) {
|
||||
const zygote = ReZygiskInfo.zygotes[i]
|
||||
/* INFO: Not used ATM */
|
||||
/* const daemon = ReZygiskInfo.daemons[i] */
|
||||
|
||||
const zygoteDiv = zygote_divs[zygote.bits === '64' ? 0 : 1]
|
||||
const zygoteStatusDiv = zygote_status_divs[zygote.bits === '64' ? 0 : 1]
|
||||
|
||||
zygoteDiv.style.display = 'block'
|
||||
|
||||
switch (zygote.state) {
|
||||
case 'injected': {
|
||||
zygoteStatusDiv.innerHTML = translations.page.home.info.zygote.injected;
|
||||
|
||||
actuallyWorking++
|
||||
|
||||
break;
|
||||
}
|
||||
case 'not injected': zygoteStatusDiv.innerHTML = translations.page.home.info.zygote.notInjected; break;
|
||||
default: zygoteStatusDiv.innerHTML = translations.page.home.info.zygote.unknown;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (expectedWorking === 0 || actuallyWorking === 0) {
|
||||
rezygisk_state.innerHTML = translations.page.home.status.notWorking
|
||||
} else if (expectedWorking === actuallyWorking) {
|
||||
rezygisk_state.innerHTML = translations.page.home.status.ok
|
||||
|
||||
rootCss.style.setProperty('--bright', '#3a4857')
|
||||
rezygisk_icon_state.innerHTML = '<img class="brightc" src="assets/tick.svg">'
|
||||
} else {
|
||||
rezygisk_state.innerHTML = translations.page.home.status.partially
|
||||
|
||||
rootCss.style.setProperty('--bright', '#766000')
|
||||
rezygisk_icon_state.innerHTML = '<img class="brightc" src="assets/warn.svg">'
|
||||
}
|
||||
|
||||
if (ReZygiskInfo.rootImpl)
|
||||
root_impl.innerHTML = ReZygiskInfo.rootImpl
|
||||
|
||||
const all_modules = []
|
||||
ReZygiskInfo.daemons.forEach((daemon) => {
|
||||
daemon.modules.forEach((module_id) => {
|
||||
const module = all_modules.find((mod) => mod.id === module_id)
|
||||
|
||||
if (module) {
|
||||
module.bitsUsed.push(daemon.bits)
|
||||
} else {
|
||||
all_modules.push({
|
||||
id: module_id,
|
||||
name: null,
|
||||
bitsUsed: [ daemon.bits ]
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
if (all_modules.length !== 0) {
|
||||
document.getElementById('modules_list_not_avaliable').style.display = 'none'
|
||||
|
||||
const module_names = await getModuleNames(all_modules)
|
||||
module_names.forEach((module_name, i) => all_modules[i].name = module_name)
|
||||
|
||||
console.log(`[rezygisk.js] Module list:`)
|
||||
console.log(all_modules)
|
||||
|
||||
const modules_list = document.getElementById('modules_list')
|
||||
|
||||
all_modules.forEach((module) => {
|
||||
modules_list.innerHTML +=
|
||||
`<div class="dim card" style="padding: 25px 15px; cursor: pointer;">
|
||||
<div class="dimc" style="font-size: 1.1em;">${module.name}</div>
|
||||
<div class="dimc desc" style="font-size: 0.9em; margin-top: 3px; white-space: nowrap; align-items: center; display: flex;">
|
||||
<div class="dimc arch_desc">${translations.page.modules.arch}</div>
|
||||
<div class="dimc" style="margin-left: 5px;">${module.bitsUsed.join(' / ')}</div>
|
||||
</div>
|
||||
</div>`
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
/* INFO: This hides the throbber screen */
|
||||
loading_screen.style.display = 'none'
|
||||
bottom_nav.style.display = 'flex'
|
||||
|
||||
|
||||
const start_time = Number(localStorage.getItem('/system/boot-time'))
|
||||
console.log('[rezygisk.js] boot time: ', Date.now() - start_time, 'ms')
|
||||
localStorage.removeItem('/system/boot_time')
|
||||
})().catch((err) => setError('WebUI', err.stack ? err.stack : err.message))
|
||||
38
webroot/js/monitorActions.js
Normal file
@@ -0,0 +1,38 @@
|
||||
import { exec, toast } from './kernelsu.js'
|
||||
|
||||
import { getTranslations } from './language.js'
|
||||
|
||||
const monitor_start = document.getElementById('monitor_start_button')
|
||||
const monitor_stop = document.getElementById('monitor_stop_button')
|
||||
const monitor_pause = document.getElementById('monitor_pause_button')
|
||||
|
||||
const monitor_status = document.getElementById('monitor_status');
|
||||
|
||||
(async () => {
|
||||
const sys_lang = localStorage.getItem('/system/language')
|
||||
const translations = await getTranslations(sys_lang || 'en_US')
|
||||
|
||||
if (monitor_start) {
|
||||
monitor_start.addEventListener('click', () => {
|
||||
if (![ translations.page.actions.status.tracing, translations.page.actions.status.stopping, translations.page.actions.status.stopped ].includes(monitor_status.innerHTML)) return;
|
||||
|
||||
monitor_status.innerHTML = translations.page.actions.status.tracing
|
||||
|
||||
exec('/data/adb/modules/zygisksu/bin/zygisk-ptrace64 ctl start')
|
||||
})
|
||||
|
||||
monitor_stop.addEventListener('click', () => {
|
||||
monitor_status.innerHTML = translations.page.actions.status.exiting
|
||||
|
||||
exec('/data/adb/modules/zygisksu/bin/zygisk-ptrace64 ctl exit')
|
||||
})
|
||||
|
||||
monitor_pause.addEventListener('click', () => {
|
||||
if (![ translations.page.actions.status.tracing, translations.page.actions.status.stopping, translations.page.actions.status.stopped ].includes(monitor_status.innerHTML)) return;
|
||||
|
||||
monitor_status.innerHTML = translations.page.actions.status.stopped
|
||||
|
||||
exec('/data/adb/modules/zygisksu/bin/zygisk-ptrace64 ctl stop')
|
||||
})
|
||||
}
|
||||
})()
|
||||
52
webroot/js/navbar.js
Normal file
@@ -0,0 +1,52 @@
|
||||
const navbar_data_tag = document.getElementById('cache-navbar-previous')
|
||||
const small_panel_data_tag = document.getElementById('cache-page-small-previous')
|
||||
|
||||
setData('home', navbar_data_tag)
|
||||
|
||||
document.getElementById('panel_home').classList.toggle('show')
|
||||
document.getElementById(`nibg_home`).classList.toggle('show')
|
||||
|
||||
document.querySelectorAll('[name=navbutton]').forEach((element) => {
|
||||
element.addEventListener('click', (event) => {
|
||||
let smallPagePass = false
|
||||
|
||||
const value = event.target.value
|
||||
const previous = !navbar_data_tag.getAttribute('content')
|
||||
? setData('home', navbar_data_tag)
|
||||
: navbar_data_tag.getAttribute('content')
|
||||
|
||||
const small_panel = small_panel_data_tag.getAttribute('content')
|
||||
|
||||
if (small_panel && small_panel.length !== 0) {
|
||||
document.getElementById(`small_panel_${small_panel}`).classList.remove('show')
|
||||
small_panel_data_tag.removeAttribute('content')
|
||||
smallPagePass = true
|
||||
}
|
||||
|
||||
if (previous === value && !smallPagePass) return;
|
||||
|
||||
/* INFO: Disable icon on old state */
|
||||
const pre_input = document.getElementById(`n_${previous}`)
|
||||
const pre_background = document.getElementById(`nibg_${previous}`)
|
||||
|
||||
document.getElementById(`panel_${previous}`).classList.remove('show')
|
||||
pre_input.removeAttribute('checked')
|
||||
pre_background.classList.remove('show')
|
||||
|
||||
/* INFO: Enable icon on new state */
|
||||
const curr_input = document.getElementById(`n_${value}`)
|
||||
const i_background = document.getElementById(`nibg_${value}`)
|
||||
|
||||
document.getElementById(`panel_${value}`).classList.toggle('show')
|
||||
curr_input.setAttribute('checked', '')
|
||||
i_background.classList.toggle('show')
|
||||
|
||||
setData(value, navbar_data_tag)
|
||||
})
|
||||
})
|
||||
|
||||
function setData(data, tag) {
|
||||
tag.setAttribute('content', data)
|
||||
|
||||
return data
|
||||
}
|
||||
10
webroot/js/restoreError.js
Normal file
@@ -0,0 +1,10 @@
|
||||
const errorh_panel = document.getElementById('errorh_panel')
|
||||
let sys_error = localStorage.getItem('/system/error')
|
||||
|
||||
if (!sys_error) {
|
||||
localStorage.setItem('/system/error', '')
|
||||
|
||||
sys_error = localStorage.getItem('/system/error')
|
||||
}
|
||||
|
||||
if (sys_error.length !== 0) errorh_panel.innerHTML = sys_error
|
||||
47
webroot/js/smallPage/errorHistory.js
Normal file
@@ -0,0 +1,47 @@
|
||||
import { smallPageDisabler } from '../smallPageDesabler.js'
|
||||
const panel = document.getElementById('errorh_panel')
|
||||
|
||||
/* INFO: Event setup */
|
||||
const navbar_data_tag = document.getElementById('cache-navbar-previous')
|
||||
const small_panel_data_tag = document.getElementById('cache-page-small-previous')
|
||||
const fallback_open = document.getElementById('cache-fallback-open')
|
||||
|
||||
document.getElementById('errorh_page_toggle').addEventListener('click', () => {
|
||||
const previous = !navbar_data_tag.getAttribute('content') ? setData('home', small_panel_data_tag) : navbar_data_tag.getAttribute('content')
|
||||
document.getElementById(`panel_${previous}`).classList.remove('show')
|
||||
document.getElementById('small_panel_errorh').classList.toggle('show')
|
||||
small_panel_data_tag.setAttribute('content', 'errorh')
|
||||
})
|
||||
|
||||
document.getElementById('backport_errorh').addEventListener('click', () => {
|
||||
const previous = !navbar_data_tag.getAttribute('content') ? setData('home', small_panel_data_tag) : navbar_data_tag.getAttribute('content')
|
||||
document.getElementById(`panel_${previous}`).classList.remove('show')
|
||||
document.getElementById('loading_screen').style.display = 'none'
|
||||
document.getElementById('small_panel_errorh').classList.toggle('show')
|
||||
document.getElementById('errorh_panel').style.bottom = '1em'
|
||||
fallback_open.setAttribute('content', 'opened')
|
||||
small_panel_data_tag.setAttribute('content', 'errorh')
|
||||
})
|
||||
|
||||
document.getElementById('sp_errorh_close').addEventListener('click', () => {
|
||||
const is_fallback = fallback_open.getAttribute('content')
|
||||
if (is_fallback) {
|
||||
document.getElementById('errorh_panel').style.bottom = '1em'
|
||||
document.getElementById('loading_screen').style.display = 'flex'
|
||||
}
|
||||
smallPageDisabler('errorh', is_fallback ? 'home' : 'settings', is_fallback ? 'home' : null)
|
||||
})
|
||||
document.getElementById('errorh_copy').addEventListener('click', () => {
|
||||
navigator.clipboard.writeText(panel.innerHTML)
|
||||
})
|
||||
|
||||
document.getElementById('errorh_clear_all').addEventListener('click', () => {
|
||||
panel.innerHTML = ''
|
||||
localStorage.setItem('/system/error', '')
|
||||
})
|
||||
|
||||
function setData(mode, tag) {
|
||||
tag.setAttribute('content', mode)
|
||||
|
||||
return mode
|
||||
}
|
||||
54
webroot/js/smallPage/language.js
Normal file
@@ -0,0 +1,54 @@
|
||||
import {
|
||||
getTranslations,
|
||||
setNewLanguage,
|
||||
getAvailableLanguages
|
||||
} from '../language.js'
|
||||
import { smallPageDisabler } from '../smallPageDesabler.js'
|
||||
|
||||
/* INFO: Initial setup */
|
||||
let index = 0
|
||||
|
||||
async function setAvailableLanguage() {
|
||||
const availableLanguages = await getAvailableLanguages()
|
||||
|
||||
for (index; index < availableLanguages.length; index++) {
|
||||
const langCode = availableLanguages[index]
|
||||
const langData = await getTranslations(langCode)
|
||||
|
||||
document.getElementById('lang_modal_list').innerHTML += `
|
||||
<div lang-data="${langCode}" class="dim card card_animation" style="padding: 25px 15px; cursor: pointer;">
|
||||
<div lang-data="${langCode}" class="dimc" style="font-size: 1.1em;">${langData.langName}</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
}
|
||||
setAvailableLanguage()
|
||||
|
||||
/* INFO: Event setup */
|
||||
const navbar_data_tag = document.getElementById('cache-navbar-previous')
|
||||
const small_panel_data_tag = document.getElementById('cache-page-small-previous')
|
||||
|
||||
document.getElementById('lang_page_toggle').addEventListener('click', () => {
|
||||
const previous = !navbar_data_tag.getAttribute('content') ? setData('home', small_panel_data_tag) : navbar_data_tag.getAttribute('content')
|
||||
document.getElementById(`panel_${previous}`).classList.remove('show')
|
||||
document.getElementById('small_panel_language').classList.toggle('show')
|
||||
small_panel_data_tag.setAttribute('content', 'language')
|
||||
})
|
||||
|
||||
document.getElementById('sp_lang_close').addEventListener('click', () => smallPageDisabler('language', 'settings'))
|
||||
|
||||
document.addEventListener('click', async (event) => {
|
||||
const getLangLocate = event.target.getAttribute('lang-data')
|
||||
if (!getLangLocate || typeof getLangLocate !== 'string') return
|
||||
|
||||
smallPageDisabler('language', 'settings')
|
||||
await setNewLanguage(getLangLocate)
|
||||
|
||||
localStorage.setItem('/system/language', getLangLocate)
|
||||
}, false)
|
||||
|
||||
function setData(data, tag) {
|
||||
tag.setAttribute('content', data)
|
||||
|
||||
return data
|
||||
}
|
||||
75
webroot/js/smallPage/theme.js
Normal file
@@ -0,0 +1,75 @@
|
||||
import { smallPageDisabler } from '../smallPageDesabler.js'
|
||||
import { setAmoled } from '../themes/amoled.js'
|
||||
import { setDark } from '../themes/dark.js'
|
||||
import { setLight } from '../themes/light.js'
|
||||
import { setMonochrome } from '../themes/monochrome.js'
|
||||
|
||||
// INFO: requirement variables
|
||||
let sys_theme
|
||||
const page_toggle = document.getElementById('theme_page_toggle')
|
||||
const themeList = {
|
||||
amoled: () => setAmoled(true),
|
||||
dark: () => setDark(true),
|
||||
light: () => setLight(true),
|
||||
monochrome: () => setMonochrome(true),
|
||||
system: (unavaliable) => {
|
||||
const isDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||
if (isDark && unavaliable) setDark()
|
||||
else setLight()
|
||||
},
|
||||
}
|
||||
const setData = (mode) => {
|
||||
localStorage.setItem('/system/theme', mode)
|
||||
return mode
|
||||
}
|
||||
|
||||
// INFO: Initial open logic
|
||||
sys_theme = localStorage.getItem('/system/theme')
|
||||
if (!sys_theme) sys_theme = setData('dark')
|
||||
themeList[sys_theme](true)
|
||||
|
||||
// INFO: Event logic
|
||||
const navbar_data_tag = document.getElementById('cache-navbar-previous')
|
||||
const small_panel_data_tag = document.getElementById('cache-page-small-previous')
|
||||
|
||||
document.getElementById('sp_theme_close').addEventListener('click', () => smallPageDisabler('theme', 'settings'))
|
||||
|
||||
document.addEventListener('click', async (event) => {
|
||||
const themeListKey = Object.keys(themeList)
|
||||
const getThemeMode = event.target.getAttribute('theme-data')
|
||||
|
||||
if (!getThemeMode || typeof getThemeMode !== 'string' || !themeListKey.includes(getThemeMode)) return
|
||||
|
||||
themeList[getThemeMode](true)
|
||||
|
||||
smallPageDisabler('theme', 'settings')
|
||||
|
||||
sys_theme = setData(getThemeMode)
|
||||
}, false)
|
||||
|
||||
page_toggle.addEventListener('click', () => {
|
||||
const previous = !navbar_data_tag.getAttribute('content') ? setTagData('home', small_panel_data_tag) : navbar_data_tag.getAttribute('content')
|
||||
document.getElementById(`panel_${previous}`).classList.remove('show')
|
||||
document.getElementById('small_panel_theme').classList.toggle('show')
|
||||
small_panel_data_tag.setAttribute('content', 'theme')
|
||||
})
|
||||
|
||||
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
|
||||
if (sys_theme !== "system") return
|
||||
const newColorScheme = event.matches ? "dark" : "light";
|
||||
|
||||
switch (newColorScheme) {
|
||||
case 'dark':
|
||||
setDark()
|
||||
break
|
||||
case 'light':
|
||||
setLight()
|
||||
break
|
||||
}
|
||||
});
|
||||
|
||||
function setTagData(data, tag) {
|
||||
tag.setAttribute('content', data)
|
||||
|
||||
return data
|
||||
}
|
||||
26
webroot/js/smallPageDesabler.js
Normal file
@@ -0,0 +1,26 @@
|
||||
export function smallPageDisabler(page_name, new_page, custom_page) {
|
||||
const navbar_data_tag = document.getElementById('cache-navbar-previous')
|
||||
const small_panel_data_tag = document.getElementById('cache-page-small-previous')
|
||||
|
||||
document.getElementById(`small_panel_${page_name}`).classList.remove('show')
|
||||
small_panel_data_tag.removeAttribute('content')
|
||||
|
||||
const previous = navbar_data_tag.getAttribute('content')
|
||||
|
||||
/* INFO: Disable icon on old state */
|
||||
const pre_input = document.getElementById(`n_${previous}`)
|
||||
const pre_background = document.getElementById(`nibg_${previous}`)
|
||||
|
||||
pre_input.removeAttribute('checked')
|
||||
pre_background.classList.remove('show')
|
||||
|
||||
/* INFO: Enable icon on new state */
|
||||
const curr_input = document.getElementById(`n_${new_page}`)
|
||||
const i_background = document.getElementById(`nibg_${new_page}`)
|
||||
|
||||
document.getElementById(`panel_${new_page}`).classList.toggle('show')
|
||||
curr_input.setAttribute('checked', '')
|
||||
i_background.classList.toggle('show')
|
||||
|
||||
navbar_data_tag.setAttribute('content', custom_page ? custom_page : 'settings')
|
||||
}
|
||||
34
webroot/js/switcher/fontChanger.js
Normal file
@@ -0,0 +1,34 @@
|
||||
const switcher = document.getElementById('font_switcher')
|
||||
const rootCss = document.querySelector(':root')
|
||||
|
||||
let sys_font = localStorage.getItem('/system/font')
|
||||
if (!sys_font) sys_font = setData('false')
|
||||
if (sys_font === 'true') {
|
||||
switcher.setAttribute('checked', '')
|
||||
|
||||
setSystemFont()
|
||||
}
|
||||
|
||||
switcher.addEventListener('click', () => {
|
||||
sys_font = setData(String(switcher.checked))
|
||||
|
||||
switcher.checked ? setSystemFont() : document.getElementById('font-tag').remove()
|
||||
})
|
||||
|
||||
function setSystemFont() {
|
||||
const headTag = document.getElementsByTagName('head')[0]
|
||||
const styleTag = document.createElement('style')
|
||||
|
||||
styleTag.id = 'font-tag'
|
||||
headTag.appendChild(styleTag)
|
||||
styleTag.innerHTML = `
|
||||
:root {
|
||||
--font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif
|
||||
}`
|
||||
}
|
||||
|
||||
function setData(mode) {
|
||||
localStorage.setItem('/system/font', mode)
|
||||
|
||||
return mode
|
||||
}
|
||||
41
webroot/js/themes/amoled.js
Normal file
@@ -0,0 +1,41 @@
|
||||
import { setDarkNav } from './darkNavbar.js'
|
||||
|
||||
const rootCss = document.querySelector(':root')
|
||||
|
||||
/* INFO: Changes the icons to match the theme */
|
||||
const close_icons = document.getElementsByClassName('close_icon')
|
||||
const expand_icons = document.getElementsByClassName('expander')
|
||||
const sp_lang_close = document.getElementById('sp_lang_close')
|
||||
const sp_theme_close = document.getElementById('sp_theme_close')
|
||||
|
||||
export function setAmoled(chooseSet) {
|
||||
rootCss.style.setProperty('--background', '#000000')
|
||||
rootCss.style.setProperty('--font', '#d9d9d9')
|
||||
rootCss.style.setProperty('--desc', '#a9a9a9')
|
||||
rootCss.style.setProperty('--dim', '#0b0d0f')
|
||||
rootCss.style.setProperty('--icon', '#22292d')
|
||||
rootCss.style.setProperty('--icon-bc', '#171b1d')
|
||||
rootCss.style.setProperty('--desktop-navbar', '#111417')
|
||||
rootCss.style.setProperty('--desktop-navicon', '#1c2225')
|
||||
rootCss.style.setProperty('--button', 'var(--background)')
|
||||
|
||||
if (chooseSet) setData('amoled')
|
||||
|
||||
for (const close_icon of close_icons) {
|
||||
close_icon.innerHTML = '<img src="assets/close.svg">'
|
||||
}
|
||||
|
||||
for (const expand_icon of expand_icons) {
|
||||
expand_icon.innerHTML = '<img class="dimc" src="assets/expand.svg">'
|
||||
}
|
||||
|
||||
sp_lang_close.innerHTML = '<img src="./assets/back.svg"/>'
|
||||
sp_theme_close.innerHTML = '<img src="./assets/back.svg"/>'
|
||||
setDarkNav()
|
||||
}
|
||||
|
||||
function setData(mode) {
|
||||
localStorage.setItem('/system/theme', mode)
|
||||
|
||||
return mode
|
||||
}
|
||||
43
webroot/js/themes/dark.js
Normal file
@@ -0,0 +1,43 @@
|
||||
import { setDarkNav } from './darkNavbar.js'
|
||||
|
||||
const rootCss = document.querySelector(':root')
|
||||
|
||||
/* INFO: Changes the icons to match the theme */
|
||||
const close_icons = document.getElementsByClassName('close_icon')
|
||||
const expand_icons = document.getElementsByClassName('expander')
|
||||
const sp_lang_close = document.getElementById('sp_lang_close')
|
||||
const sp_theme_close = document.getElementById('sp_theme_close')
|
||||
const sp_errorh_close = document.getElementById('sp_errorh_close')
|
||||
|
||||
export function setDark(chooseSet) {
|
||||
rootCss.style.setProperty('--background', '#181c20')
|
||||
rootCss.style.setProperty('--font', '#ffffff')
|
||||
rootCss.style.setProperty('--desc', '#c9c9c9')
|
||||
rootCss.style.setProperty('--dim', '#1d2327')
|
||||
rootCss.style.setProperty('--icon', '#48565e')
|
||||
rootCss.style.setProperty('--icon-bc', '#313a3f')
|
||||
rootCss.style.setProperty('--desktop-navbar', '#252b31')
|
||||
rootCss.style.setProperty('--desktop-navicon', '#333d42')
|
||||
rootCss.style.setProperty('--button', 'var(--background)')
|
||||
|
||||
if (chooseSet) setData('dark')
|
||||
|
||||
for (const close_icon of close_icons) {
|
||||
close_icon.innerHTML = '<img src="assets/close.svg">'
|
||||
}
|
||||
|
||||
for (const expand_icon of expand_icons) {
|
||||
expand_icon.innerHTML = '<img class="dimc" src="assets/expand.svg">'
|
||||
}
|
||||
|
||||
sp_lang_close.innerHTML = '<img src="./assets/back.svg"/>'
|
||||
sp_theme_close.innerHTML = '<img src="./assets/back.svg"/>'
|
||||
sp_errorh_close.innerHTML = '<img src="./assets/back.svg"/>'
|
||||
setDarkNav()
|
||||
}
|
||||
|
||||
function setData(mode) {
|
||||
localStorage.setItem('/system/theme', mode)
|
||||
|
||||
return mode
|
||||
}
|
||||
6
webroot/js/themes/darkNavbar.js
Normal file
@@ -0,0 +1,6 @@
|
||||
export function setDarkNav() {
|
||||
document.getElementById('ni_home').classList.remove('light')
|
||||
document.getElementById('ni_modules').classList.remove('light')
|
||||
document.getElementById('ni_actions').classList.remove('light')
|
||||
document.getElementById('ni_settings').classList.remove('light')
|
||||
}
|
||||
48
webroot/js/themes/light.js
Normal file
@@ -0,0 +1,48 @@
|
||||
import {
|
||||
light_close_icon,
|
||||
light_expand_icon,
|
||||
light_page_exit_icon,
|
||||
} from './lightIcon.js'
|
||||
import { setLightNav } from './lightNavbar.js'
|
||||
|
||||
const rootCss = document.querySelector(':root')
|
||||
|
||||
/* INFO: Changes the icons to match the theme */
|
||||
const close_icons = document.getElementsByClassName('close_icon')
|
||||
const expand_icons = document.getElementsByClassName('expander')
|
||||
const sp_lang_close = document.getElementById('sp_lang_close')
|
||||
const sp_theme_close = document.getElementById('sp_theme_close')
|
||||
const sp_errorh_close = document.getElementById('sp_errorh_close')
|
||||
|
||||
export function setLight(chooseSet) {
|
||||
rootCss.style.setProperty('--background', '#f2f2f2')
|
||||
rootCss.style.setProperty('--font', '#181c20')
|
||||
rootCss.style.setProperty('--desc', '#484d53')
|
||||
rootCss.style.setProperty('--dim', '#e0e0e0')
|
||||
rootCss.style.setProperty('--icon', '#acacac')
|
||||
rootCss.style.setProperty('--desktop-navbar', '#fefefe')
|
||||
rootCss.style.setProperty('--desktop-navicon', '#eeeeee')
|
||||
rootCss.style.setProperty('--icon-bc', '#c9c9c9')
|
||||
rootCss.style.setProperty('--button', '#b3b3b3')
|
||||
|
||||
if (chooseSet) setData('light')
|
||||
|
||||
for (const close_icon of close_icons) {
|
||||
close_icon.innerHTML = light_close_icon
|
||||
}
|
||||
|
||||
for (const expand_icon of expand_icons) {
|
||||
expand_icon.innerHTML = light_expand_icon
|
||||
}
|
||||
|
||||
sp_lang_close.innerHTML = light_page_exit_icon
|
||||
sp_theme_close.innerHTML = light_page_exit_icon
|
||||
sp_errorh_close.innerHTML = light_page_exit_icon
|
||||
setLightNav()
|
||||
}
|
||||
|
||||
function setData(mode) {
|
||||
localStorage.setItem('/system/theme', mode)
|
||||
|
||||
return mode
|
||||
}
|
||||
20
webroot/js/themes/lightIcon.js
Normal file
@@ -0,0 +1,20 @@
|
||||
export const light_expand_icon = `
|
||||
<svg class="dimc" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#2c2c2c">
|
||||
<path d="m480-340 180-180-57-56-123 123-123-123-57 56 180 180Zm0 260q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/>
|
||||
</svg>
|
||||
`
|
||||
export const light_close_icon = `
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="40px" viewBox="0 -960 960 960" width="40px" fill="#2c2c2c">
|
||||
<path d="m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z"/>
|
||||
</svg>
|
||||
`
|
||||
export const light_logs_icon = `
|
||||
<svg class="dimc" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#2c2c2c">
|
||||
<path d="M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm-40-160h80v-240h-80v240Zm40 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/>
|
||||
</svg>
|
||||
`
|
||||
export const light_page_exit_icon = `
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="36px" viewBox="0 -960 960 960" width="36px" fill="#2c2c2c">
|
||||
<path d="m287-446.67 240 240L480-160 160-480l320-320 47 46.67-240 240h513v66.66H287Z"/>
|
||||
</svg>
|
||||
`
|
||||
6
webroot/js/themes/lightNavbar.js
Normal file
@@ -0,0 +1,6 @@
|
||||
export function setLightNav() {
|
||||
document.getElementById('ni_home').classList.add('light')
|
||||
document.getElementById('ni_modules').classList.add('light')
|
||||
document.getElementById('ni_actions').classList.add('light')
|
||||
document.getElementById('ni_settings').classList.add('light')
|
||||
}
|
||||
41
webroot/js/themes/monochrome.js
Normal file
@@ -0,0 +1,41 @@
|
||||
import { setDarkNav } from './darkNavbar.js'
|
||||
|
||||
const rootCss = document.querySelector(':root')
|
||||
|
||||
/* INFO: Changes the icons to match the theme */
|
||||
const close_icons = document.getElementsByClassName('close_icon')
|
||||
const expand_icons = document.getElementsByClassName('expander')
|
||||
const sp_lang_close = document.getElementById('sp_lang_close')
|
||||
const sp_theme_close = document.getElementById('sp_theme_close')
|
||||
|
||||
export function setMonochrome(chooseSet) {
|
||||
rootCss.style.setProperty('--background', '#141414')
|
||||
rootCss.style.setProperty('--font', '#ffffff')
|
||||
rootCss.style.setProperty('--desc', '#c9c9c9')
|
||||
rootCss.style.setProperty('--dim', '#1c1c1c')
|
||||
rootCss.style.setProperty('--icon', '#494949')
|
||||
rootCss.style.setProperty('--icon-bc', '#292929')
|
||||
rootCss.style.setProperty('--desktop-navbar', '#252525')
|
||||
rootCss.style.setProperty('--desktop-navicon', '#3a3a3a')
|
||||
rootCss.style.setProperty('--button', 'var(--background)')
|
||||
|
||||
if (chooseSet) setData('monochrome')
|
||||
|
||||
for (const close_icon of close_icons) {
|
||||
close_icon.innerHTML = '<img src="assets/close.svg">'
|
||||
}
|
||||
|
||||
for (const expand_icon of expand_icons) {
|
||||
expand_icon.innerHTML = '<img class="dimc" src="assets/expand.svg">'
|
||||
}
|
||||
|
||||
sp_lang_close.innerHTML = '<img src="./assets/back.svg"/>'
|
||||
sp_theme_close.innerHTML = '<img src="./assets/back.svg"/>'
|
||||
setDarkNav()
|
||||
}
|
||||
|
||||
function setData(mode) {
|
||||
localStorage.setItem('/system/theme', mode)
|
||||
|
||||
return mode
|
||||
}
|
||||
38
webroot/js/translate/actions.js
Normal file
@@ -0,0 +1,38 @@
|
||||
export function translateActionsPage(old_translations, new_translations) {
|
||||
/* INFO: actions card */
|
||||
document.getElementById('panel_actions_header').innerHTML = new_translations.page.actions.header
|
||||
|
||||
/* INFO: monitor small card */
|
||||
document.getElementById('monitor_title').innerHTML = new_translations.page.actions.monitor
|
||||
if (document.getElementById('monitor_stop_button')) { /* INFO: Not all devices have 32-bit support */
|
||||
document.getElementById('monitor_stop_button').innerHTML = new_translations.page.actions.monitorButton.stop
|
||||
document.getElementById('monitor_start_button').innerHTML = new_translations.page.actions.monitorButton.start
|
||||
document.getElementById('monitor_pause_button').innerHTML = new_translations.page.actions.monitorButton.pause
|
||||
}
|
||||
|
||||
/* INFO: monitor status card */
|
||||
const monitor_status = document.getElementById('monitor_status')
|
||||
switch (monitor_status.innerHTML.replace(/(\r\n|\n|\r)/gm, '').trim()) {
|
||||
case old_translations.page.actions.status.tracing: {
|
||||
monitor_status.innerHTML = new_translations.page.actions.status.tracing
|
||||
|
||||
break
|
||||
}
|
||||
case old_translations.page.actions.status.stopping: {
|
||||
monitor_status.innerHTML = new_translations.page.actions.status.stopping
|
||||
|
||||
break
|
||||
}
|
||||
case old_translations.page.actions.status.stopped: {
|
||||
monitor_status.innerHTML = new_translations.page.actions.status.stopped
|
||||
|
||||
break
|
||||
}
|
||||
case old_translations.page.actions.status.exiting: {
|
||||
monitor_status.innerHTML = new_translations.page.actions.status.exiting
|
||||
|
||||
break
|
||||
}
|
||||
default: monitor_status.innerHTML = new_translations.page.actions.status.unknown
|
||||
}
|
||||
}
|
||||
90
webroot/js/translate/home.js
Normal file
@@ -0,0 +1,90 @@
|
||||
export function translateHomePage(old_translations, new_translations) {
|
||||
/* INFO: Translate variables */
|
||||
const rezygisk_state = document.getElementById('rezygisk_state')
|
||||
const zygote32_status_div = document.getElementById('zygote32_status')
|
||||
const zygote64_status_div = document.getElementById('zygote64_status')
|
||||
|
||||
switch (rezygisk_state.innerHTML.replace(/(\r\n|\n|\r)/gm, '').trim()) {
|
||||
case old_translations.page.home.status.ok: {
|
||||
rezygisk_state.innerHTML = new_translations.page.home.status.ok
|
||||
|
||||
break
|
||||
}
|
||||
case old_translations.page.home.status.partially: {
|
||||
rezygisk_state.innerHTML = new_translations.page.home.status.partially
|
||||
|
||||
break
|
||||
}
|
||||
case old_translations.page.home.status.notWorking: {
|
||||
rezygisk_state.innerHTML = new_translations.page.home.status.notWorking
|
||||
|
||||
break
|
||||
}
|
||||
case old_translations.page.home.status.unknown: {
|
||||
rezygisk_state.innerHTML = new_translations.global.unknown
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (zygote32_status_div) {
|
||||
switch (zygote32_status_div.innerHTML.replace(/(\r\n|\n|\r)/gm, '').trim()) {
|
||||
case old_translations.page.home.info.zygote.injected: {
|
||||
zygote32_status_div.innerHTML = new_translations.page.home.info.zygote.injected
|
||||
|
||||
break
|
||||
}
|
||||
case old_translations.page.home.info.zygote.notInjected: {
|
||||
zygote32_status_div.innerHTML = new_translations.page.home.info.zygote.notInjected
|
||||
|
||||
break
|
||||
}
|
||||
case old_translations.page.home.info.zygote.unknown: {
|
||||
zygote32_status_div.innerHTML = new_translations.global.unknown
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (zygote64_status_div) {
|
||||
switch (zygote64_status_div.innerHTML.replace(/(\r\n|\n|\r)/gm, '').trim()) {
|
||||
case old_translations.page.home.info.zygote.injected: {
|
||||
zygote64_status_div.innerHTML = new_translations.page.home.info.zygote.injected
|
||||
|
||||
break
|
||||
}
|
||||
case old_translations.page.home.info.zygote.notInjected: {
|
||||
zygote64_status_div.innerHTML = new_translations.page.home.info.zygote.notInjected
|
||||
|
||||
break
|
||||
}
|
||||
case old_translations.page.home.info.zygote.unknown: {
|
||||
zygote64_status_div.innerHTML = new_translations.global.unknown
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const android_version_div = document.getElementById('android_version_div')
|
||||
if (android_version_div.innerHTML === old_translations.global.unknown)
|
||||
android_version_div.innerHTML = new_translations.global.unknown
|
||||
|
||||
const kernel_version_div = document.getElementById('kernel_version_div')
|
||||
if (kernel_version_div.innerHTML === old_translations.global.unknown)
|
||||
kernel_version_div.innerHTML = new_translations.global.unknown
|
||||
|
||||
/* INFO: info card */
|
||||
document.getElementById('version_info_title').innerHTML = new_translations.page.home.info.version
|
||||
document.getElementById('root_info_title').innerHTML = new_translations.page.home.info.root
|
||||
|
||||
// const version_code = document.getElementById('version_code')
|
||||
// const root_impl = document.getElementById('root_impl')
|
||||
|
||||
// if (version_code.innerHTML.replace(/(\r\n|\n|\r)/gm, '').trim() === old_translations.global.unknown)
|
||||
// version_code.innerHTML = new_translations.global.unknown
|
||||
|
||||
// if (root_impl.innerHTML.replace(/(\r\n|\n|\r)/gm, '').trim() === old_translations.global.unknown)
|
||||
// root_impl.innerHTML = new_translations.global.unknown
|
||||
}
|
||||
10
webroot/js/translate/modules.js
Normal file
@@ -0,0 +1,10 @@
|
||||
export function translateModulesPage(new_translations) {
|
||||
document.getElementById('panel_modules_header').innerHTML = new_translations.page.modules.header
|
||||
document.getElementById('modules_list_not_avaliable').innerHTML = new_translations.page.modules.notAvaliable
|
||||
|
||||
/* INFO: arch type */
|
||||
const module_element_arch = document.getElementsByClassName('arch_desc')
|
||||
for (const module of module_element_arch) {
|
||||
module.innerHTML = new_translations.page.modules.arch
|
||||
}
|
||||
}
|
||||
27
webroot/js/translate/settings.js
Normal file
@@ -0,0 +1,27 @@
|
||||
export function translateSettingsPage(new_translations) {
|
||||
document.getElementById('panel_settings_header').innerHTML = new_translations.page.settings.header
|
||||
|
||||
/* INFO: Change font option */
|
||||
document.getElementById('sys_font_option_title').innerHTML = new_translations.page.settings.font.header
|
||||
document.getElementById('sys_font_option_desc').innerHTML = new_translations.page.settings.font.description
|
||||
|
||||
/* INFO: Change font option */
|
||||
document.getElementById('sys_theme_option_title').innerHTML = new_translations.page.settings.theme.header
|
||||
document.getElementById('sys_theme_option_desc').innerHTML = new_translations.page.settings.theme.description
|
||||
|
||||
/* INFO: Change font option */
|
||||
document.getElementById('sys_lang_option_title').innerHTML = new_translations.page.settings.language.header
|
||||
document.getElementById('sys_lang_option_desc').innerHTML = new_translations.page.settings.language.description
|
||||
|
||||
/* INFO: Change font option */
|
||||
document.getElementById('sys_errorh_title').innerHTML = new_translations.page.settings.logs.header
|
||||
document.getElementById('sys_errorh_desc').innerHTML = new_translations.page.settings.logs.description
|
||||
|
||||
/* INFO: Credit card */
|
||||
document.getElementById('mcre_title').innerHTML = new_translations.page.settings.credits.module
|
||||
document.getElementById('omcre_title').innerHTML = new_translations.page.settings.credits.original
|
||||
document.getElementById('webcre_title').innerHTML = new_translations.page.settings.credits.web
|
||||
/* INFO: License card */
|
||||
document.getElementById('mlic_title').innerHTML = new_translations.page.settings.license.module
|
||||
document.getElementById('mweb_title').innerHTML = new_translations.page.settings.license.web
|
||||
}
|
||||
93
webroot/lang/ar_EG.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "العربية",
|
||||
"global": {
|
||||
"unknown": "غير معروف"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "اختر اللغة"
|
||||
},
|
||||
"theme": {
|
||||
"header": "اختر السمة",
|
||||
"dark": "مظلم",
|
||||
"light": "مضئ",
|
||||
"system": "تلقائي"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "نسخ",
|
||||
"clear": "حذف كل السجلات"
|
||||
},
|
||||
"header": "سجلات الأخطاء",
|
||||
"placeholder": "لا توجد أخطاء!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "الصفحة الرئيسية",
|
||||
"status": {
|
||||
"notWorking": "لا يعمل",
|
||||
"ok": "يعمل",
|
||||
"partially": "يعمل بشكل جزئي"
|
||||
},
|
||||
"info": {
|
||||
"version": "الإصدار",
|
||||
"root": "مدير الروت",
|
||||
"zygote": {
|
||||
"injected": "محقن",
|
||||
"notInjected": "غير محقن",
|
||||
"unknown": "غير معروف"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "الإضافات",
|
||||
"notAvaliable": "لا توجد إضافات تستخدم zygisk.",
|
||||
"arch": "النواة: "
|
||||
},
|
||||
"actions": {
|
||||
"header": "زر الإجراء",
|
||||
"monitorButton": {
|
||||
"start": "تشغيل",
|
||||
"stop": "تعطيل",
|
||||
"pause": "إيقاف مؤقت"
|
||||
},
|
||||
"monitor": "المراقبة",
|
||||
"status": {
|
||||
"tracing": "يتم التتبع",
|
||||
"stopping": "يتم الإيقاف",
|
||||
"stopped": "متوقف",
|
||||
"exiting": "يتم الخروج",
|
||||
"unknown": "غير معروف"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"header": "الإعدادات",
|
||||
"font": {
|
||||
"header": "تشغيل خط النظام",
|
||||
"description": "هذا الخيار يقوم بعرض النص بخط النظام بدلا من خط WebUI. قد لا يتوافق مع FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "الثيمات",
|
||||
"description": "اختر الثيم المناسب"
|
||||
},
|
||||
"language": {
|
||||
"header": "تغيير اللغة",
|
||||
"description": "غير إلى لغة أخرى"
|
||||
},
|
||||
"logs": {
|
||||
"header": "سجل الأخطاء",
|
||||
"description": "إعرض كل سجلات الأخطاء"
|
||||
},
|
||||
"credits": {
|
||||
"module": "مطور الإضافة",
|
||||
"original": "المطورون الأصليون",
|
||||
"web": "مطور واجهة الويب"
|
||||
},
|
||||
"license": {
|
||||
"module": "ترخيص الإضافة",
|
||||
"web": "ترخيص واجهة الويب"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/de_DE.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Deutsch",
|
||||
"global": {
|
||||
"unknown": "Unbekannt"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Neue Sprache wählen"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Neues Theme wählen",
|
||||
"dark": "Dunkel",
|
||||
"light": "Hell",
|
||||
"system": "System Basiert"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "Kopieren",
|
||||
"clear": "ALLE LOGS LÖSCHEN"
|
||||
},
|
||||
"header": "Fehler Verlauf",
|
||||
"placeholder": "Es wurde kein Fehlerprotokoll aufgezeichnet!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Startseite",
|
||||
"status": {
|
||||
"notWorking": "Funktioniert nicht",
|
||||
"ok": "Funktioniert",
|
||||
"partially": "Funktioniert zum Teil"
|
||||
},
|
||||
"info": {
|
||||
"version": "Version",
|
||||
"root": "Root Implementierung",
|
||||
"zygote": {
|
||||
"injected": "Injiziert",
|
||||
"notInjected": "Nicht Injiziert",
|
||||
"unknown": "Unbekannt"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Module",
|
||||
"notAvaliable": "Kein Modul nutzt Zygisk.",
|
||||
"arch": "Architektur: "
|
||||
},
|
||||
"settings": {
|
||||
"header": "Einstellungen",
|
||||
"font": {
|
||||
"header": "Systemschriftart aktivieren",
|
||||
"description": "Diese Option aktiviert die Systemschriftart in der aktuellen WebUI. HINWEIS: Möglicherweise nicht kompatibel mit FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "System Theme",
|
||||
"description": "Wählen Sie Ihr System-Theme für die aktuelle WebUI"
|
||||
},
|
||||
"language": {
|
||||
"header": "Sprache auswählen",
|
||||
"description": "Wechsel zu deiner neuen Sprache"
|
||||
},
|
||||
"logs": {
|
||||
"header": "Fehler Verlauf",
|
||||
"description": "Zeige den Fehler Verlauf"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Modul Entwickler",
|
||||
"original": "Original Modul Entwickler",
|
||||
"web": "WebUI Entwickler"
|
||||
},
|
||||
"license": {
|
||||
"module": "Modul Lizenz",
|
||||
"web": "WebUI Lizenz"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"header": "Aktionen",
|
||||
"monitorButton": {
|
||||
"pause": "Pause",
|
||||
"stop": "Stopp",
|
||||
"start": "Start"
|
||||
},
|
||||
"monitor": "Überwachen",
|
||||
"status": {
|
||||
"tracing": "Nachverfolgung",
|
||||
"stopping": "Beenden",
|
||||
"stopped": "Beendet",
|
||||
"exiting": "Wird Beendet",
|
||||
"unknown": "Unbekannt"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/en_US.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "English (United States)",
|
||||
"global": {
|
||||
"unknown": "Unknown"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Choose your new language"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Choose your new theme",
|
||||
"dark": "Dark",
|
||||
"light": "Light",
|
||||
"system": "System Based"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "COPY",
|
||||
"clear": "CLEAR ALL LOGS"
|
||||
},
|
||||
"header": "Error History",
|
||||
"placeholder": "No error log recorded here!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Home",
|
||||
"status": {
|
||||
"notWorking": "Not Working",
|
||||
"ok": "Working",
|
||||
"partially": "Partially Working"
|
||||
},
|
||||
"info": {
|
||||
"version": "Version",
|
||||
"root": "Root Implementation",
|
||||
"zygote": {
|
||||
"injected": "Injected",
|
||||
"notInjected": "Not Injected",
|
||||
"unknown": "Unknown"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Modules",
|
||||
"notAvaliable": "No modules using Zygisk here.",
|
||||
"arch": "Architecture: "
|
||||
},
|
||||
"actions": {
|
||||
"header": "Action",
|
||||
"monitorButton": {
|
||||
"start": "Start",
|
||||
"stop": "Stop",
|
||||
"pause": "Pause"
|
||||
},
|
||||
"monitor": "Monitor",
|
||||
"status": {
|
||||
"tracing": "Tracing",
|
||||
"stopping": "Stopping",
|
||||
"stopped": "Stopped",
|
||||
"exiting": "Exiting",
|
||||
"unknown": "Unknown"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"header": "Settings",
|
||||
"font": {
|
||||
"header": "Enable system font",
|
||||
"description": "This option will enable system font in current WebUI. NOTE: May not be compatible with FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "System theme",
|
||||
"description": "Choose your system theme for current WebUI"
|
||||
},
|
||||
"language": {
|
||||
"header": "Change language",
|
||||
"description": "Change to your new language"
|
||||
},
|
||||
"logs": {
|
||||
"header": "Error History",
|
||||
"description": "View all of your error log"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Module Developer",
|
||||
"original": "Original Module Developer",
|
||||
"web": "WebUI Developer"
|
||||
},
|
||||
"license": {
|
||||
"module": "Module License",
|
||||
"web": "WebUI License"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/es_AR.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Español",
|
||||
"global": {
|
||||
"unknown": "Desconocido"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Selecciona tu nuevo idioma"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Elige tu nuevo tema",
|
||||
"dark": "Oscuro",
|
||||
"light": "Claro",
|
||||
"system": "Basado en el sistema"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "COPIAR",
|
||||
"clear": "BORRAR TODOS LOS REGISTROS"
|
||||
},
|
||||
"header": "Historial de errores",
|
||||
"placeholder": "¡No se registró ningún error aquí!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Inicio",
|
||||
"status": {
|
||||
"notWorking": "No funciona",
|
||||
"ok": "Funcionando",
|
||||
"partially": "Funciona parcialmente"
|
||||
},
|
||||
"info": {
|
||||
"version": "Versión",
|
||||
"root": "Implementación de root",
|
||||
"zygote": {
|
||||
"injected": "Inyectado",
|
||||
"notInjected": "No inyectado",
|
||||
"unknown": "Desconocido"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Módulos",
|
||||
"notAvaliable": "No hay módulos que usen Zygisk aquí.",
|
||||
"arch": "Arquitectura: "
|
||||
},
|
||||
"settings": {
|
||||
"header": "Ajustes",
|
||||
"font": {
|
||||
"header": "Activar fuente del sistema",
|
||||
"description": "Esta opción habilitará la fuente del sistema en el WebUI actual. NOTA: Puede no ser compatible con FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Tema del sistema",
|
||||
"description": "Elija el tema del sistema para el WebUI actual"
|
||||
},
|
||||
"language": {
|
||||
"header": "Cambiar idioma",
|
||||
"description": "Selecciona tu nuevo idioma"
|
||||
},
|
||||
"logs": {
|
||||
"header": "Historial de errores",
|
||||
"description": "Ver todos tus registros de errores"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Desarrollador del módulo",
|
||||
"original": "Desarrollador original del módulo",
|
||||
"web": "Desarrollador de la WebUI"
|
||||
},
|
||||
"license": {
|
||||
"module": "Licencia del módulo",
|
||||
"web": "Licencia de la WebUI"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"header": "Acciones",
|
||||
"monitorButton": {
|
||||
"pause": "Pausar",
|
||||
"stop": "Detener",
|
||||
"start": "Iniciar"
|
||||
},
|
||||
"monitor": "Monitor",
|
||||
"status": {
|
||||
"tracing": "Trazando",
|
||||
"stopping": "Deteniendo",
|
||||
"stopped": "Detenido",
|
||||
"exiting": "Saliendo",
|
||||
"unknown": "Desconocido"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/es_ES.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Español",
|
||||
"global": {
|
||||
"unknown": "Desconocido"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Selecciona tu nuevo idioma"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Elige tu nuevo tema",
|
||||
"dark": "Oscuro",
|
||||
"light": "Claro",
|
||||
"system": "Basado en el sistema"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "COPIAR",
|
||||
"clear": "BORRAR TODOS LOS REGISTROS"
|
||||
},
|
||||
"header": "Historial de errores",
|
||||
"placeholder": "¡No se registró ningún error aquí!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Inicio",
|
||||
"status": {
|
||||
"notWorking": "No funciona",
|
||||
"ok": "Funcionando",
|
||||
"partially": "Funciona parcialmente"
|
||||
},
|
||||
"info": {
|
||||
"version": "Versión",
|
||||
"root": "Implementación de root",
|
||||
"zygote": {
|
||||
"injected": "Inyectado",
|
||||
"notInjected": "No inyectado",
|
||||
"unknown": "Desconocido"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Módulos",
|
||||
"notAvaliable": "No hay módulos que usen Zygisk aquí.",
|
||||
"arch": "Arquitectura: "
|
||||
},
|
||||
"settings": {
|
||||
"header": "Ajustes",
|
||||
"font": {
|
||||
"header": "Activar fuente del sistema",
|
||||
"description": "Esta opción habilitará la fuente del sistema en el WebUI actual. NOTA: Puede no ser compatible con FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Tema del sistema",
|
||||
"description": "Elija el tema del sistema para el WebUI actual"
|
||||
},
|
||||
"language": {
|
||||
"header": "Cambiar idioma",
|
||||
"description": "Selecciona tu nuevo idioma"
|
||||
},
|
||||
"logs": {
|
||||
"header": "Historial de errores",
|
||||
"description": "Ver todos tus registros de errores"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Desarrollador del módulo",
|
||||
"original": "Desarrollador original del módulo",
|
||||
"web": "Desarrollador de la WebUI"
|
||||
},
|
||||
"license": {
|
||||
"module": "Licencia del módulo",
|
||||
"web": "Licencia de la WebUI"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"header": "Acciones",
|
||||
"monitorButton": {
|
||||
"pause": "Pausar",
|
||||
"stop": "Detener",
|
||||
"start": "Iniciar"
|
||||
},
|
||||
"monitor": "Monitor",
|
||||
"status": {
|
||||
"tracing": "Trazando",
|
||||
"stopping": "Deteniendo",
|
||||
"stopped": "Detenido",
|
||||
"exiting": "Saliendo",
|
||||
"unknown": "Desconocido"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/es_MX.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Español (México)",
|
||||
"global": {
|
||||
"unknown": "Desconocido"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Elige tu nuevo tema"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Elige tu nuevo tema",
|
||||
"dark": "Oscuro",
|
||||
"light": "Claro",
|
||||
"system": "Basado en el sistema"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "COPIAR",
|
||||
"clear": "BORRAR TODOS LOS REGISTROS"
|
||||
},
|
||||
"header": "Historial de errores",
|
||||
"placeholder": "¡No se registró ningún error aquí!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Inicio",
|
||||
"status": {
|
||||
"notWorking": "No funcionando",
|
||||
"ok": "Funcionando",
|
||||
"partially": "Funcionando parcialmente"
|
||||
},
|
||||
"info": {
|
||||
"version": "Versión",
|
||||
"root": "Implementación de root",
|
||||
"zygote": {
|
||||
"injected": "Inyectado",
|
||||
"notInjected": "No inyectado",
|
||||
"unknown": "Desconocido"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Módulos",
|
||||
"notAvaliable": "No hay módulos que usen Zygisk aquí.",
|
||||
"arch": "Arquitectura: "
|
||||
},
|
||||
"settings": {
|
||||
"header": "Ajustes",
|
||||
"font": {
|
||||
"header": "Activar fuente del sistema",
|
||||
"description": "Esta opción habilitará la fuente del sistema en el WebUI actual. NOTA: Puede no ser compatible con FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Tema del sistema",
|
||||
"description": "Elige el tema del sistema para el WebUI actual"
|
||||
},
|
||||
"language": {
|
||||
"header": "Cambiar idioma",
|
||||
"description": "Cambia a tu nuevo idioma."
|
||||
},
|
||||
"logs": {
|
||||
"header": "Historial de errores",
|
||||
"description": "Ver todos tus registros de errores"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Desarrollador del módulo",
|
||||
"original": "Desarrollador original del módulo",
|
||||
"web": "Desarrollador de la WebUI"
|
||||
},
|
||||
"license": {
|
||||
"module": "Licencia del módulo",
|
||||
"web": "Licencia de la WebUI"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"header": "Acciones",
|
||||
"monitorButton": {
|
||||
"pause": "Pausar",
|
||||
"stop": "Detener",
|
||||
"start": "Iniciar"
|
||||
},
|
||||
"monitor": "Monitor",
|
||||
"status": {
|
||||
"tracing": "Trazando",
|
||||
"stopping": "Deteniendo",
|
||||
"stopped": "Detenido",
|
||||
"exiting": "Saliendo",
|
||||
"unknown": "Desconocido"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/fr_FR.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Français (France)",
|
||||
"global": {
|
||||
"unknown": "Inconnu"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Choisissez votre nouvelle langue"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Choisissez votre nouveau thème",
|
||||
"dark": "Sombre",
|
||||
"light": "Clair",
|
||||
"system": "Basé sur le système"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "COPIER",
|
||||
"clear": "EFFACER TOUS LES JOURNEAUX"
|
||||
},
|
||||
"header": "Historique d'erreurs",
|
||||
"placeholder": "Pas de journal d'erreur enregistré ici !"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Page d'accueil",
|
||||
"status": {
|
||||
"notWorking": "Inactif",
|
||||
"ok": "Actif",
|
||||
"partially": "Fonctionnement partiel"
|
||||
},
|
||||
"info": {
|
||||
"version": "Version",
|
||||
"root": "Implémentation root",
|
||||
"zygote": {
|
||||
"injected": "Injecté",
|
||||
"notInjected": "Non injecté",
|
||||
"unknown": "Inconnu"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Modules",
|
||||
"notAvaliable": "Aucuns modules n'utilisent Zygisk actuellement.",
|
||||
"arch": " Architecture: "
|
||||
},
|
||||
"settings": {
|
||||
"header": "Paramètres",
|
||||
"font": {
|
||||
"header": "Activer la police du système",
|
||||
"description": "Cette option activera la police de caractère du système d'interface WebUI. NOTE: N'est peut-être pas compatible avec FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Thème système",
|
||||
"description": "Choisissez votre thème système pour le WebUI"
|
||||
},
|
||||
"language": {
|
||||
"header": "Changez de langue",
|
||||
"description": "Changez vers votre nouvelle langue"
|
||||
},
|
||||
"logs": {
|
||||
"header": "Historique d'erreur",
|
||||
"description": "Voir le détail du journal d'erreur"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Module développeur",
|
||||
"original": "Module Original du Développeur",
|
||||
"web": "WebUI Développeur"
|
||||
},
|
||||
"license": {
|
||||
"module": "Module de licence",
|
||||
"web": "Licence WebUI"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"header": "Actions",
|
||||
"monitorButton": {
|
||||
"pause": "Mettre en Pause",
|
||||
"stop": "Arrêter",
|
||||
"start": "Démarrer"
|
||||
},
|
||||
"monitor": "Surveillance",
|
||||
"status": {
|
||||
"tracing": "Tracer",
|
||||
"stopping": "Stopper immédiatement",
|
||||
"stopped": "Arrêté",
|
||||
"exiting": "Sortir d'ici",
|
||||
"unknown": "Inconnu"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/id_ID.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Bahasa Indonesia (Indonesia)",
|
||||
"global": {
|
||||
"unknown": "Tidak diketahui"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Pilih bahasa baru Anda"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Pilih tema baru Anda",
|
||||
"dark": "Gelap",
|
||||
"light": "Terang",
|
||||
"system": "Bawaan Sistem"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "SALIN",
|
||||
"clear": "BERSIHKAN SEMUA LOG"
|
||||
},
|
||||
"header": "Log Error",
|
||||
"placeholder": "Tidak ada log error tercatat disini!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Beranda",
|
||||
"status": {
|
||||
"notWorking": "Tidak Bekerja",
|
||||
"ok": "Bekerja",
|
||||
"partially": "Bekerja Sebagian"
|
||||
},
|
||||
"info": {
|
||||
"version": "Versi",
|
||||
"root": "Implementasi Root",
|
||||
"zygote": {
|
||||
"injected": "Terinjeksi",
|
||||
"notInjected": "Tidak Terinjeksi",
|
||||
"unknown": "Tidak diketahui"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Modul",
|
||||
"notAvaliable": "Tidak ada modul yang menggunakan Zygisk disini.",
|
||||
"arch": "Arsitektur: "
|
||||
},
|
||||
"settings": {
|
||||
"header": "Pengaturan",
|
||||
"font": {
|
||||
"header": "Gunakan Font Sistem",
|
||||
"description": "Opsi ini akan mengaktifkan font sistem pada WebUI saat ini. (Mungkin tidak kompatibel dengan FlipFont)"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Tema Sistem",
|
||||
"description": "Pilih tema untuk tampilan WebUI Anda saat ini"
|
||||
},
|
||||
"language": {
|
||||
"header": "Ubah Bahasa",
|
||||
"description": "Ubah ke bahasa baru Anda"
|
||||
},
|
||||
"logs": {
|
||||
"header": "Log Error",
|
||||
"description": "Lihat semua log Error Anda"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Developer Modul",
|
||||
"original": "Developer Modul Asli",
|
||||
"web": "Developer WebUI"
|
||||
},
|
||||
"license": {
|
||||
"module": "Lisensi Modul",
|
||||
"web": "Lisensi WebUI"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"header": "Tindakan",
|
||||
"monitorButton": {
|
||||
"pause": "Jeda",
|
||||
"stop": "Berhenti",
|
||||
"start": "Mulai"
|
||||
},
|
||||
"monitor": "Monitor",
|
||||
"status": {
|
||||
"tracing": "Melacak",
|
||||
"stopping": "Menghentikan",
|
||||
"stopped": "Terhenti",
|
||||
"exiting": "Terkeluar",
|
||||
"unknown": "Tidak diketahui"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/it_IT.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Italiano (Italia)",
|
||||
"global": {
|
||||
"unknown": "Sconosciuto"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Scegli la tua nuova lingua"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Scegli il tuo nuovo tema",
|
||||
"dark": "Scuro",
|
||||
"light": "Chiaro",
|
||||
"system": "Sistema"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "COPIA",
|
||||
"clear": "CANCELLA TUTTI I LOGS"
|
||||
},
|
||||
"header": "Storico degli Errori",
|
||||
"placeholder": "Nessun errore è stato registrato qui!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Home",
|
||||
"status": {
|
||||
"notWorking": "Non funzionante",
|
||||
"ok": "Funzionante",
|
||||
"partially": "Funzionante Parzialmente"
|
||||
},
|
||||
"info": {
|
||||
"version": "Versione",
|
||||
"root": "Implementazione root",
|
||||
"zygote": {
|
||||
"injected": "Iniettato",
|
||||
"notInjected": "Non Iniettato",
|
||||
"unknown": "Sconosciuto"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Moduli",
|
||||
"notAvaliable": "Nessun modulo che utilizza Zygisk qui.",
|
||||
"arch": "Architettura: "
|
||||
},
|
||||
"settings": {
|
||||
"header": "Impostazioni",
|
||||
"font": {
|
||||
"header": "Abilita font di sistema",
|
||||
"description": "Questa opzione abiliterà il font di sistema nella WebUI. NOTA: Potrebbe non funzionare bene con FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Tema di sistema",
|
||||
"description": "Scegli il tuo tema di sistema per la WebUI"
|
||||
},
|
||||
"language": {
|
||||
"header": "Cambia lingua",
|
||||
"description": "Cambia alla tua nuova lingua"
|
||||
},
|
||||
"logs": {
|
||||
"header": "Storico degli errori",
|
||||
"description": "Visualizza tutto il log dell'errore"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Programmatore del Modulo",
|
||||
"original": "Programmatore del Modulo Originale",
|
||||
"web": "Programmatore della WebUI"
|
||||
},
|
||||
"license": {
|
||||
"module": "Licenza del modulo",
|
||||
"web": "Licenza della WebUI"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"header": "Azioni",
|
||||
"monitorButton": {
|
||||
"pause": "Pausa",
|
||||
"stop": "Ferma",
|
||||
"start": "Avvia"
|
||||
},
|
||||
"monitor": "Controlla",
|
||||
"status": {
|
||||
"tracing": "Tracing",
|
||||
"stopping": "Fermando",
|
||||
"stopped": "Fermato",
|
||||
"exiting": "Uscendo",
|
||||
"unknown": "Sconosciuto"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/ms_MS.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Malay (Malaysia)",
|
||||
"global": {
|
||||
"unknown": "Tidak diketahui"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Pilih bahasa anda"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Pilih tema anda",
|
||||
"dark": "Gelap",
|
||||
"light": "Cerah",
|
||||
"system": "Berasaskan Sistem"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "Salin",
|
||||
"clear": "KOSONGKAN SEMUA LOG"
|
||||
},
|
||||
"header": "Sejarah Ralat",
|
||||
"placeholder": "Tiada log ralat direkodkan di sini!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Home",
|
||||
"status": {
|
||||
"notWorking": "Tidak Berfungsi",
|
||||
"ok": "Berfungsi",
|
||||
"partially": "Separa Berfungsi"
|
||||
},
|
||||
"info": {
|
||||
"version": "Versi",
|
||||
"root": "Pelaksanaan Root",
|
||||
"zygote": {
|
||||
"injected": "Disuntik",
|
||||
"notInjected": "Tidak Disuntik",
|
||||
"unknown": "Tidak diketahui"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Modul",
|
||||
"notAvaliable": "Tiada modul menggunakan Zygisk di sini.",
|
||||
"arch": "Arkitektur: "
|
||||
},
|
||||
"settings": {
|
||||
"header": "Tetapan",
|
||||
"font": {
|
||||
"header": "Hidupkan fon sistem",
|
||||
"description": "Pilihan ini akan menghidupkan fon sistem dalam WebUI semasa. NOTA: Mungkin tidak serasi dengan FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Tema sistem",
|
||||
"description": "Pilih tema sistem anda untuk WebUI semasa"
|
||||
},
|
||||
"language": {
|
||||
"header": "Tukar bahasa",
|
||||
"description": "Tukar kepada bahasa baharu anda"
|
||||
},
|
||||
"logs": {
|
||||
"header": "Sejarah Ralat",
|
||||
"description": "Lihat semua log ralat anda"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Pembangun Modul",
|
||||
"original": "Pembangun Modul Asal",
|
||||
"web": "Pembangun WebUI"
|
||||
},
|
||||
"license": {
|
||||
"module": "Lesen Modul",
|
||||
"web": "Lesen WebUI"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"header": "Tindakan",
|
||||
"monitorButton": {
|
||||
"pause": "Berhenti sebentar",
|
||||
"stop": "Berhenti",
|
||||
"start": "Mula"
|
||||
},
|
||||
"monitor": "Pantau",
|
||||
"status": {
|
||||
"tracing": "Menjejak",
|
||||
"stopping": "Berhenti",
|
||||
"stopped": "Telah Berhenti",
|
||||
"exiting": "Keluar",
|
||||
"unknown": "Tidak diketahui"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/nl_NL.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Nederlands",
|
||||
"global": {
|
||||
"unknown": "Onbekend"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Kies uw nieuwe taal"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Kies uw nieuwe thema",
|
||||
"dark": "Donker",
|
||||
"light": "Licht",
|
||||
"system": "Systeem Gebaseerd"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "KOPIËREN",
|
||||
"clear": "VERWIJDER ALLE LOGS"
|
||||
},
|
||||
"header": "Foutmelding Geschiedenis",
|
||||
"placeholder": "Er is hier geen foutlogboek geregistreerd!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Thuis",
|
||||
"status": {
|
||||
"notWorking": "Werkt Niet",
|
||||
"ok": "Werkt",
|
||||
"partially": "Werkt Gedeeltelijk"
|
||||
},
|
||||
"info": {
|
||||
"version": "Versie",
|
||||
"root": "Root Implementatie",
|
||||
"zygote": {
|
||||
"injected": "Geïnjecteerd",
|
||||
"notInjected": "Niet Geïnjecteerd",
|
||||
"unknown": "Onbekend"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Modules",
|
||||
"notAvaliable": "Geen modules die Zygisk gebruiken.",
|
||||
"arch": "Architectuur: "
|
||||
},
|
||||
"settings": {
|
||||
"header": "Instellingen",
|
||||
"font": {
|
||||
"header": "Systeem lettertype inschakelen",
|
||||
"description": "Deze optie zal het systeemlettertype inschakelen in huidige WebUI. Opmerking: Kan niet compatibel zijn met FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Systeem thema",
|
||||
"description": "Kies uw systeemthema voor huidige WebUI"
|
||||
},
|
||||
"language": {
|
||||
"header": "Taal wijzigen",
|
||||
"description": "Verander naar nieuwe taal"
|
||||
},
|
||||
"logs": {
|
||||
"header": "Foutmelding Geschiedenis",
|
||||
"description": "Al uw foutenlogboek weergeven"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Module Ontwikkelaar",
|
||||
"original": "Originele Module Ontwikkelaar",
|
||||
"web": "WebUI Ontwikkelaar"
|
||||
},
|
||||
"license": {
|
||||
"module": "Module Licentie",
|
||||
"web": "WebUI Licentie"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"header": "Acties",
|
||||
"monitorButton": {
|
||||
"pause": "Pauzeren",
|
||||
"stop": "Stoppen",
|
||||
"start": "Starten"
|
||||
},
|
||||
"monitor": "Bewaken",
|
||||
"status": {
|
||||
"tracing": "Traceren",
|
||||
"stopping": "Bezig met Stoppen",
|
||||
"stopped": "Gestopt",
|
||||
"exiting": "Wordt Beëindigd",
|
||||
"unknown": "Onbekend"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/pt_BR.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Português (Brasil)",
|
||||
"global": {
|
||||
"unknown": "Desconhecido"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Escolha o seu novo idioma"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Escolha o seu novo tema",
|
||||
"dark": "Escuro",
|
||||
"light": "Claro",
|
||||
"system": "Baseado no do sistema"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "COPIAR",
|
||||
"clear": "LIMPAR TODOS OS REGISTROS"
|
||||
},
|
||||
"header": "Histórico de Erros",
|
||||
"placeholder": "Nenhum registro de erros aqui!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Início",
|
||||
"status": {
|
||||
"notWorking": "Não funcionando",
|
||||
"ok": "Funcionando",
|
||||
"partially": "Funcionando parcialmente"
|
||||
},
|
||||
"info": {
|
||||
"version": "Versão",
|
||||
"root": "Implementação de Root",
|
||||
"zygote": {
|
||||
"injected": "Injetado",
|
||||
"notInjected": "Não Injetado",
|
||||
"unknown": "Desconhecido"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Módulos",
|
||||
"notAvaliable": "Nenhum módulo está usando Zygisk aqui.",
|
||||
"arch": "Arquitetura: "
|
||||
},
|
||||
"actions": {
|
||||
"header": "Ações",
|
||||
"monitorButton": {
|
||||
"start": "Iniciar",
|
||||
"stop": "Parar",
|
||||
"pause": "Pausar"
|
||||
},
|
||||
"monitor": "Monitor",
|
||||
"status": {
|
||||
"tracing": "Rastreando",
|
||||
"stopping": "Parando",
|
||||
"stopped": "Parado",
|
||||
"exiting": "Desligando",
|
||||
"unknown": "Desconhecido"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"header": "Configurações",
|
||||
"font": {
|
||||
"header": "Usar a fonte do sistema",
|
||||
"description": "Esta opção irá usar a fonte do sistema no WebUI atual. Observação: Talvez não seja compatível com o FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Tema do sistema",
|
||||
"description": "Escolha o tema do seu sistema para o WebUI atual"
|
||||
},
|
||||
"language": {
|
||||
"header": "Alterar a língua",
|
||||
"description": "Mude para sua nova língua"
|
||||
},
|
||||
"logs": {
|
||||
"header": "Histórico de Erros",
|
||||
"description": "Ver o histórico de erros inteiro"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Desenvolvedora do módulo",
|
||||
"original": "Desenvolvedores do módulo original",
|
||||
"web": "Desenvolvedor do WebUI"
|
||||
},
|
||||
"license": {
|
||||
"module": "Licença do Módulo",
|
||||
"web": "Licença do WebUI"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/ru_RU.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Русский (Россия)",
|
||||
"global": {
|
||||
"unknown": "Неизвестно"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Выберите ваш новый язык"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Выберите свою новую тему",
|
||||
"dark": "Темная",
|
||||
"light": "Светлая",
|
||||
"system": "На основе системной темы"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "Копировать",
|
||||
"clear": "Очистить все логи"
|
||||
},
|
||||
"header": "Журнал ошибок",
|
||||
"placeholder": "Журнал ошибок здесь не ведется!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Главная",
|
||||
"status": {
|
||||
"notWorking": "Не работает",
|
||||
"ok": "Работает",
|
||||
"partially": "Частично работает"
|
||||
},
|
||||
"info": {
|
||||
"version": "Версия",
|
||||
"root": "Root реализация",
|
||||
"zygote": {
|
||||
"injected": "Инъецировано",
|
||||
"notInjected": "Не инъецировано",
|
||||
"unknown": "Неизвестно"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Модули",
|
||||
"notAvaliable": "Здесь нет модулей, использующих Zygisk.",
|
||||
"arch": "Архитектура: "
|
||||
},
|
||||
"settings": {
|
||||
"header": "Настройки",
|
||||
"font": {
|
||||
"header": "Включить системный шрифт",
|
||||
"description": "Эта опция включит системный шрифт в текущем WebUI. ПРИМЕЧАНИЕ: Может быть несовместимо с FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Системная тема",
|
||||
"description": "Выберите вашу системную тему для текущего WebUI"
|
||||
},
|
||||
"language": {
|
||||
"header": "Сменить язык",
|
||||
"description": "Измените на ваш новый язык"
|
||||
},
|
||||
"logs": {
|
||||
"header": "История ошибок",
|
||||
"description": "Просмотреть весь журнал ваших ошибок"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Разработчик модуля",
|
||||
"original": "Разработчик оригинального модуля",
|
||||
"web": "Разработчик WebUI"
|
||||
},
|
||||
"license": {
|
||||
"module": "Лицензия модуля",
|
||||
"web": "Лицензия WebUI"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"header": "Действия",
|
||||
"monitorButton": {
|
||||
"pause": "Пауза",
|
||||
"stop": "Стоп",
|
||||
"start": "Начать"
|
||||
},
|
||||
"monitor": "Обзор",
|
||||
"status": {
|
||||
"tracing": "Состояние",
|
||||
"stopping": "Остановка",
|
||||
"stopped": "Остановлено",
|
||||
"exiting": "Выход",
|
||||
"unknown": "Неизвестно"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/tr_TR.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Türkçe (Türkiye)",
|
||||
"global": {
|
||||
"unknown": "Bilinmiyor"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Yeni dilinizi seçin"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Yeni temanızı seçin",
|
||||
"dark": "Koyu",
|
||||
"light": "Açık",
|
||||
"system": "Sistem Tabanlı"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "KOPYALA",
|
||||
"clear": "BÜTÜN KAYITLARI SİL"
|
||||
},
|
||||
"header": "Hata Geçmişi",
|
||||
"placeholder": "Burada kaydedilmiş hata yok!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Anasayfa",
|
||||
"status": {
|
||||
"notWorking": "Aktif Değil",
|
||||
"ok": "Aktif",
|
||||
"partially": "Yarı-Aktif"
|
||||
},
|
||||
"info": {
|
||||
"version": "Versiyon",
|
||||
"root": "Root İmplementasyonu",
|
||||
"zygote": {
|
||||
"injected": "Enjekte",
|
||||
"notInjected": "Enjekte Değil",
|
||||
"unknown": "Bilinmiyor"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Modüller",
|
||||
"notAvaliable": "Burada Zygisk kullanan modül yok.",
|
||||
"arch": "Mimari: "
|
||||
},
|
||||
"actions": {
|
||||
"header": "Hareketler",
|
||||
"monitorButton": {
|
||||
"start": "Başlat",
|
||||
"stop": "Bitir",
|
||||
"pause": "Durdur"
|
||||
},
|
||||
"monitor": "Monitör",
|
||||
"status": {
|
||||
"tracing": "İzleniyor",
|
||||
"stopping": "Durduluyor",
|
||||
"stopped": "Durdu",
|
||||
"exiting": "Çıkılıyor",
|
||||
"unknown": "Bilinmiyor"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"header": "Ayarlar",
|
||||
"font": {
|
||||
"header": "Sistem yazı tipini aktifleştir",
|
||||
"description": "Bu seçenek anlık WebUI (Web Arayüzü) için sistem yazıt tipini aktifleştirir. NOT: FlipFont ile uyumlu olmayabilir!"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Sistem Teması",
|
||||
"description": "Anlık WebUI için sistem temanı seç"
|
||||
},
|
||||
"language": {
|
||||
"header": "Dil değiştir",
|
||||
"description": "Yeni dilini seç"
|
||||
},
|
||||
"logs": {
|
||||
"header": "Hata Geçmişi",
|
||||
"description": "Bütün hata kayıtlarını görüntüle"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Modül Geliştiricisi",
|
||||
"original": "Orijinal Modül Geliştiricisi",
|
||||
"web": "WebUI Geliştiricisi"
|
||||
},
|
||||
"license": {
|
||||
"module": "Modül Lisansı",
|
||||
"web": "WebUI Lisansı"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/uk_UA.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Українська (Україна)",
|
||||
"global": {
|
||||
"unknown": "Невідомо"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Оберіть нову мову"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Оберіть нову тему",
|
||||
"dark": "Темна",
|
||||
"light": "Світла",
|
||||
"system": "За системною"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "Копіювати",
|
||||
"clear": "Очистити всі записи"
|
||||
},
|
||||
"header": "Історія помилок",
|
||||
"placeholder": "Жодної помилки не було записано тут!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Головна",
|
||||
"status": {
|
||||
"notWorking": "Не працює",
|
||||
"ok": "Працює",
|
||||
"partially": "Частково працює"
|
||||
},
|
||||
"info": {
|
||||
"version": "Версія",
|
||||
"root": "Root реалізація",
|
||||
"zygote": {
|
||||
"injected": "Ін'єктовано",
|
||||
"notInjected": "Не ін'єктовано",
|
||||
"unknown": "Невідомо"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Модулі",
|
||||
"notAvaliable": "Немає модулів, які б використовували Zygisk.",
|
||||
"arch": "Архітектура: "
|
||||
},
|
||||
"actions": {
|
||||
"header": "Дії",
|
||||
"monitorButton": {
|
||||
"start": "Почати",
|
||||
"stop": "Зупинити",
|
||||
"pause": "Пауза"
|
||||
},
|
||||
"monitor": "Моніторинг",
|
||||
"status": {
|
||||
"tracing": "Відстежується",
|
||||
"stopping": "Зупиняється",
|
||||
"stopped": "Зупинено",
|
||||
"exiting": "Виходить",
|
||||
"unknown": "Невідомий"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"header": "Налаштування",
|
||||
"font": {
|
||||
"header": "Увімкнути системний шрифт",
|
||||
"description": "Ця опція увімкне системний шрифт у поточному WebUI. Примітка: Може бути несумісною з FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Системна тема",
|
||||
"description": "Виберіть системну тему для поточного WebUI"
|
||||
},
|
||||
"language": {
|
||||
"header": "Змінити мову",
|
||||
"description": "Змінити на вашу нову мову"
|
||||
},
|
||||
"logs": {
|
||||
"header": "Журнал помилок",
|
||||
"description": "Переглянути весь журнал помилок"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Розробники модуля",
|
||||
"original": "Оригінальний розробник модуля",
|
||||
"web": "Розробник WebUI"
|
||||
},
|
||||
"license": {
|
||||
"module": "Ліцензія модуля",
|
||||
"web": "Ліцензія WebUI"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/vi_VN.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "Tiếng Việt",
|
||||
"global": {
|
||||
"unknown": "Không xác định"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "Chọn ngôn ngữ mới của bạn"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Chọn giao diện mới của bạn",
|
||||
"dark": "Tối",
|
||||
"light": "Sáng",
|
||||
"system": "Theo hệ thống"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "SAO CHÉP",
|
||||
"clear": "XOÁ TOÀN BỘ LOGS"
|
||||
},
|
||||
"header": "Lịch Sử Lỗi",
|
||||
"placeholder": "Không có lỗi nào được ghi ở đây!"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "Trang Chủ",
|
||||
"status": {
|
||||
"notWorking": "Không hoạt động",
|
||||
"ok": "Đang hoạt động",
|
||||
"partially": "Đang hoạt động một phần"
|
||||
},
|
||||
"info": {
|
||||
"version": "Phiên bản",
|
||||
"root": "Hệ thống root",
|
||||
"zygote": {
|
||||
"injected": "Đã can thiệp",
|
||||
"notInjected": "Chưa can thiệp",
|
||||
"unknown": "Không xác định"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "Mô Đun",
|
||||
"notAvaliable": "Không có mô-đun nào sử dụng Zygisk ở đây!",
|
||||
"arch": "Cấu trúc: "
|
||||
},
|
||||
"actions": {
|
||||
"header": "Trình điều khiển",
|
||||
"monitorButton": {
|
||||
"start": "Chạy",
|
||||
"stop": "Dừng",
|
||||
"pause": "Tạm Dừng"
|
||||
},
|
||||
"monitor": "Trình theo dõi",
|
||||
"status": {
|
||||
"tracing": "Đang chạy",
|
||||
"stopping": "Đang Dừng",
|
||||
"stopped": "Đã Dừng",
|
||||
"exiting": "Đã Thoát",
|
||||
"unknown": "Không Xác Định"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"header": "Cài đặt",
|
||||
"font": {
|
||||
"header": "Sử dụng phông chữ hệ thống",
|
||||
"description": "Tuỳ chọn này sẽ cho phép người dùng sử dụng phông chữ của hệ thống. LƯU Ý: Có thể sẽ không tương thích với FlipFont"
|
||||
},
|
||||
"theme": {
|
||||
"header": "Giao diện hệ thống",
|
||||
"description": "Chọn giao diện cho WebUI hiện tại của bạn"
|
||||
},
|
||||
"language": {
|
||||
"header": "Thay đổi ngôn ngữ",
|
||||
"description": "Thay đổi sang ngôn ngữ mới"
|
||||
},
|
||||
"logs": {
|
||||
"header": "Lịch sử lỗi",
|
||||
"description": "Xem tất cả các lỗi"
|
||||
},
|
||||
"credits": {
|
||||
"module": "Nhà phát triển mô-đun",
|
||||
"original": "Nhà phát triển mô-đun gốc",
|
||||
"web": "Nhà phát triển WebUI"
|
||||
},
|
||||
"license": {
|
||||
"module": "Giấy phép bản quyền mô-đun",
|
||||
"web": "Giấy phép bản quyền WebUI"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
93
webroot/lang/zh_CN.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"langName": "简体中文 (中国)",
|
||||
"global": {
|
||||
"unknown": "未知"
|
||||
},
|
||||
"smallPage": {
|
||||
"language": {
|
||||
"header": "选择语言"
|
||||
},
|
||||
"theme": {
|
||||
"header": "选择主题风格",
|
||||
"dark": "暗色",
|
||||
"light": "浅色",
|
||||
"system": "跟随系统"
|
||||
},
|
||||
"errorh": {
|
||||
"buttons": {
|
||||
"copy": "复制",
|
||||
"clear": "清空日志"
|
||||
},
|
||||
"header": "错误日志",
|
||||
"placeholder": "暂时没有错误日志"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"home": {
|
||||
"header": "主页",
|
||||
"status": {
|
||||
"notWorking": "未运行",
|
||||
"ok": "运行中",
|
||||
"partially": "部分运行"
|
||||
},
|
||||
"info": {
|
||||
"version": "版本",
|
||||
"root": "Root实现",
|
||||
"zygote": {
|
||||
"injected": "已注入",
|
||||
"notInjected": "未注入",
|
||||
"unknown": "未知"
|
||||
}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"header": "模块",
|
||||
"notAvaliable": "目前没有模块使用Zygisk",
|
||||
"arch": "架构: "
|
||||
},
|
||||
"actions": {
|
||||
"header": "操作",
|
||||
"monitorButton": {
|
||||
"start": "启动",
|
||||
"stop": "停止",
|
||||
"pause": "暂停"
|
||||
},
|
||||
"monitor": "监视器",
|
||||
"status": {
|
||||
"tracing": "追踪中",
|
||||
"stopping": "正在停止",
|
||||
"stopped": "已停止",
|
||||
"exiting": "正在退出",
|
||||
"unknown": "未知"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"header": "设置",
|
||||
"font": {
|
||||
"header": "启用系统字体",
|
||||
"description": "此选项会在Web界面启用系统字体。可能与FlipFont不兼容。"
|
||||
},
|
||||
"theme": {
|
||||
"header": "主题",
|
||||
"description": "选择Web界面的主题风格"
|
||||
},
|
||||
"language": {
|
||||
"header": "语言",
|
||||
"description": "切换不同的语言"
|
||||
},
|
||||
"logs": {
|
||||
"header": "错误日志",
|
||||
"description": "浏览所有错误日志"
|
||||
},
|
||||
"credits": {
|
||||
"module": "模块开发者",
|
||||
"original": "源模块开发者",
|
||||
"web": "Web界面开发者"
|
||||
},
|
||||
"license": {
|
||||
"module": "模块开源许可",
|
||||
"web": "Web界面开源许可"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||